fix(master-land): fix store function

This commit is contained in:
arieeefajar 2025-03-06 18:55:10 +07:00
parent d1624a4c6d
commit fa9a30b9f0
7 changed files with 116 additions and 140 deletions

View File

@ -4,8 +4,10 @@
use App\Http\Controllers\Controller;
use App\Models\Land;
use App\Models\LandDetails;
use App\Models\Province;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class LandController extends Controller
@ -30,26 +32,6 @@ public function store(Request $request)
'owner.max' => 'Nama pemilik maksimal 25 karakter',
'owner.string' => 'Nama pemilik harus berupa string',
'nohp.required' => 'Nomor HP wajib diisi',
'nohp.min' => 'Nomor HP minimal 10 karakter',
'nohp.max' => 'Nomor HP maksimal 13 karakter',
'nohp.string' => 'Nomor HP harus berupa string',
'rental_price.required' => 'Harga sewa wajib diisi',
'rental_price.numeric' => 'Harga sewa harus berupa angka',
'rental_start.required' => 'Tanggal mulai sewa wajib diisi',
'rental_start.date' => 'Tanggal mulai sewa harus berupa tanggal',
'rental_start.after_or_equal' => 'Tanggal mulai sewa harus hari ini atau setelahnya',
'rental_until.required' => 'Tanggal sampai sewa wajib diisi',
'rental_until.date' => 'Tanggal sampai sewa harus berupa tanggal',
'rental_until.after_or_equal' => 'Tanggal sampai sewa harus sama atau lebih besar dari tanggal mulai sewa',
'land_name.required' => 'Nama lahan wajib diisi',
'land_name.max' => 'Nama lahan maksimal 25 karakter',
'land_name.string' => 'Nama lahan harus berupa string',
'province_id.required' => 'Provinsi wajib diisi',
'province_id.exists' => 'Provinsi tidak ditemukan',
@ -68,51 +50,52 @@ public function store(Request $request)
'lng.required' => 'Longitude wajib diisi',
'lng.numeric' => 'Longitude harus berupa angka',
];
$request->merge([
'rental_price' => str_replace('.', '', $request->rental_price),
]);
'polygon.required' => 'Petak lahan wajib digambar',
];
$validator = Validator::make($request->all(), [
'owner' => 'required|string|max:25',
'nohp' => 'required|string|min:10|max:13',
'rental_price' => 'required|numeric',
'rental_start' => 'required|date|after_or_equal:today',
'rental_until' => 'required|date|after_or_equal:rental_start',
'land_name' => 'required|string|max:25',
'province_id' => 'required|exists:provinces,id',
'regency_id' => 'required|exists:regencies,id',
'district_id' => 'required|exists:districts,id',
'address' => 'required|string|max:100',
'lat' => 'required|numeric',
'lng' => 'required|numeric',
'polygon' => 'required',
], $customMessage);
$polygon = json_decode($request->polygon, true);
if ($validator->fails()) {
toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000);
return redirect()->back()->withInput();
}
$land = new Land();
$land->owner = $request->owner;
$land->no_hp = $request->nohp;
$land->rental_price = $request->rental_price;
$land->rental_start = $request->rental_start;
$land->rental_until = $request->rental_until;
$land->land_name = $request->land_name;
$land->province_code = $request->province_id;
$land->regency_code = $request->regency_id;
$land->district_code = $request->district_id;
$land->address = $request->address;
$land->latitude = $request->lat;
$land->longitude = $request->lng;
DB::beginTransaction();
try {
$land = new Land();
$land->owner = $request->owner;
$land->province_code = $request->province_id;
$land->regency_code = $request->regency_id;
$land->district_code = $request->district_id;
$land->address = $request->address;
$land->latitude = $request->lat;
$land->longitude = $request->lng;
$land->save();
foreach ($polygon as $point) {
$landDetails = new LandDetails();
$landDetails->land_id = $land->id;
$landDetails->lat = $point['lat'];
$landDetails->lng = $point['lng'];
$landDetails->save();
}
DB::commit();
toast('Data berhasil disimpan', 'success')->position('top-right')->autoclose(3000);
return redirect()->back();
} catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage());
toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000);
return redirect()->back();

View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class LandDetails extends Model
{
use HasFactory;
protected $table = 'land_details';
protected $guarded = [];
}

View File

@ -13,12 +13,7 @@ public function up(): void
{
Schema::create('land', function (Blueprint $table) {
$table->id();
$table->string('land_name');
$table->string('owner');
$table->string('no_hp');
$table->string('rental_price');
$table->date('rental_start');
$table->date('rental_until');
$table->string('province_code');
$table->string('regency_code');
$table->string('district_code');

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('land_details', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('land_id');
$table->string('lat');
$table->string('lng');
$table->timestamps();
});
Schema::table('land_details', function (Blueprint $table) {
$table->foreign('land_id')->references('id')->on('land')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('land_details');
}
};

View File

@ -1,7 +1,7 @@
var map;
var map, drawnItems, drawControl, googleStreets, iconMarker;
var currentMarker = null;
document.addEventListener("DOMContentLoaded", function () {
function initMap() {
map = L.map("map", {
attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16);
@ -14,7 +14,7 @@ document.addEventListener("DOMContentLoaded", function () {
}
).addTo(map);
var iconMarker = L.icon({
iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
@ -27,13 +27,13 @@ document.addEventListener("DOMContentLoaded", function () {
})
.addTo(map)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
);
var drawnItems = new L.FeatureGroup();
drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);
var drawControl = new L.Control.Draw({
drawControl = new L.Control.Draw({
draw: {
polygon: true, // Izinkan user menggambar polygon
polyline: false,
@ -49,36 +49,15 @@ document.addEventListener("DOMContentLoaded", function () {
});
map.addControl(drawControl);
// 4⃣ Event saat user menggambar polygon
map.on("draw:created", function (event) {
var layer = event.layer;
drawnItems.addLayer(layer);
var coordinates = layer.getLatLngs();
console.log("Koordinat Polygon:", coordinates);
alert("Polygon berhasil dibuat! Cek console untuk koordinatnya.");
});
// 5⃣ Event saat user mengedit polygon
map.on("draw:edited", function (event) {
var layers = event.layers;
layers.eachLayer(function (layer) {
var coordinates = layer.getLatLngs();
console.log("Koordinat setelah diedit:", coordinates);
alert("Polygon berhasil diedit! Cek console untuk koordinatnya.");
});
});
// 6⃣ Event saat user menghapus polygon
map.on("draw:deleted", function (event) {
alert("Polygon telah dihapus!");
});
map.on("draw:created", handleDrawCreated);
map.on("draw:edited", handleDrawEdited);
$("#showModal").on("shown.bs.modal", function () {
map.invalidateSize();
});
}
map.on("click", onMapClick);
});
document.addEventListener("DOMContentLoaded", initMap);
var form = document.getElementById("add-form");
var provinceField = form.querySelector("#province-field");
@ -103,19 +82,17 @@ var mapContainer = form.querySelector("#map-container");
var latField = form.querySelector("#lat");
var lngField = form.querySelector("#lng");
var polygonField = form.querySelector("#polygon");
var loading = form.querySelector("#loading");
var btnContainer = form.querySelector("#add-footer");
function getRegencies(provinceId) {
regencyContainer.style.display = "none";
// regencyEditContainer.style.display = "none";
districtContainer.style.display = "none";
// districtEditContainer.style.display = "none";
addressContainer.style.display = "none";
// addressEditContainer.style.display = "none";
loading.style.display = "block";
// loadingEdit.style.display = "block";
mapContainer.style.display = "none";
// mapEditConatiner.style.display = "none";
const url = "/location/get-regency/" + provinceId;
$.ajax({
@ -124,15 +101,11 @@ function getRegencies(provinceId) {
success: function (response) {
if (response.success) {
loading.style.display = "none";
// loadingEdit.style.display = "none";
const data = response.data;
regencyVal.clearStore();
regencyVal.clearChoices();
// regencyEditVal.clearStore();
// regencyEditVal.clearChoices();
regencyVal.value = "";
regencyVal.setChoices([
{
@ -143,16 +116,6 @@ function getRegencies(provinceId) {
},
]);
// regencyEditVal.value = "";
// regencyEditVal.setChoices([
// {
// value: "",
// label: "Pilih Kabupaten",
// selected: true,
// disabled: true,
// },
// ]);
if (Array.isArray(data)) {
regencyVal.setChoices(
data.map((regency) => ({
@ -163,24 +126,11 @@ function getRegencies(provinceId) {
}))
);
// regencyEditVal.setChoices(
// data.map((regency) => ({
// value: regency.id,
// label: regency.name,
// selected: false,
// disabled: false,
// }))
// );
regencyContainer.style.display = "block";
// regencyEditContainer.style.display = "block";
} else {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
// mapEditConatiner.style.display = "block";
// mapEditConatiner.innerHTML =
// "<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
@ -188,10 +138,6 @@ function getRegencies(provinceId) {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
// mapEditConatiner.style.display = "block";
// mapEditConatiner.innerHTML =
// "<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
@ -266,8 +212,6 @@ function showmap(districtId) {
addressContainer.style.display = "block";
btnContainer.style.display = "block";
var lat = position.coords.latitude;
var lng = position.coords.longitude;
@ -296,7 +240,7 @@ function showmap(districtId) {
currentMarker
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
@ -309,28 +253,6 @@ function showmap(districtId) {
);
}
function onMapClick(e) {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (!currentMarker) {
currentMarker = L.marker(e.latlng).addTo(map);
} else {
currentMarker.setLatLng(e.latlng);
}
currentMarker.on("dragend", onPointerDragend);
currentMarker
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
latField.value = lat;
lngField.value = lng;
}
function onPointerDragend() {
if (!currentMarker) return;
var coordinates = currentMarker.getLatLng();
@ -345,3 +267,25 @@ function onPointerDragend() {
latField.value = coordinates.lat;
lngField.value = coordinates.lng;
}
function handleDrawCreated(e) {
var layer = e.layer;
drawnItems.addLayer(layer);
var coordinates = layer.getLatLngs()[0];
console.log("Koordinat Polygon:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Dibuat!</b>").openPopup();
btnContainer.style.display = "block";
}
function handleDrawEdited(e) {
var layers = e.layers;
layers.eachLayer(function (layer) {
var coordinates = layer.getLatLngs();
console.log("Koordinat setelah diedit:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Diedit!</b>").openPopup();
});
}

View File

@ -606,6 +606,7 @@ class="form-check-input">
<!-- App js -->
<script src="{{ asset('assets/js/app.js') }}"></script>
<script src="{{ asset('assets/libs/jquery/jquery.min.js') }}"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</body>
</html>

View File

@ -135,6 +135,11 @@
<input type="hidden" name="lng" id="lng" class="form-control"
readonly>
</div>
<div class="mt-3">
<input type="hidden" name="polygon" id="polygon" class="form-control"
readonly>
</div>
</div>
</div>
<div class="modal-footer" id="add-footer" style="display: none">