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\Http\Controllers\Controller;
use App\Models\Land; use App\Models\Land;
use App\Models\LandDetails;
use App\Models\Province; use App\Models\Province;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
class LandController extends Controller class LandController extends Controller
@ -30,26 +32,6 @@ public function store(Request $request)
'owner.max' => 'Nama pemilik maksimal 25 karakter', 'owner.max' => 'Nama pemilik maksimal 25 karakter',
'owner.string' => 'Nama pemilik harus berupa string', '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.required' => 'Provinsi wajib diisi',
'province_id.exists' => 'Provinsi tidak ditemukan', 'province_id.exists' => 'Provinsi tidak ditemukan',
@ -68,51 +50,52 @@ public function store(Request $request)
'lng.required' => 'Longitude wajib diisi', 'lng.required' => 'Longitude wajib diisi',
'lng.numeric' => 'Longitude harus berupa angka', 'lng.numeric' => 'Longitude harus berupa angka',
];
$request->merge([ 'polygon.required' => 'Petak lahan wajib digambar',
'rental_price' => str_replace('.', '', $request->rental_price), ];
]);
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'owner' => 'required|string|max:25', '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', 'province_id' => 'required|exists:provinces,id',
'regency_id' => 'required|exists:regencies,id', 'regency_id' => 'required|exists:regencies,id',
'district_id' => 'required|exists:districts,id', 'district_id' => 'required|exists:districts,id',
'address' => 'required|string|max:100', 'address' => 'required|string|max:100',
'lat' => 'required|numeric', 'lat' => 'required|numeric',
'lng' => 'required|numeric', 'lng' => 'required|numeric',
'polygon' => 'required',
], $customMessage); ], $customMessage);
$polygon = json_decode($request->polygon, true);
if ($validator->fails()) { if ($validator->fails()) {
toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000); toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000);
return redirect()->back()->withInput(); return redirect()->back()->withInput();
} }
$land = new Land(); DB::beginTransaction();
$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;
try { 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(); $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); toast('Data berhasil disimpan', 'success')->position('top-right')->autoclose(3000);
return redirect()->back(); return redirect()->back();
} catch (\Throwable $th) { } catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage()); dd($th->getMessage());
toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000); toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000);
return redirect()->back(); 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) { Schema::create('land', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('land_name');
$table->string('owner'); $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('province_code');
$table->string('regency_code'); $table->string('regency_code');
$table->string('district_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; var currentMarker = null;
document.addEventListener("DOMContentLoaded", function () { function initMap() {
map = L.map("map", { map = L.map("map", {
attributionControl: false, attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16); }).setView([-8.157416852745705, 113.72281580436439], 16);
@ -14,7 +14,7 @@ document.addEventListener("DOMContentLoaded", function () {
} }
).addTo(map); ).addTo(map);
var iconMarker = L.icon({ iconMarker = L.icon({
iconUrl: "/assets/images/marker.png", iconUrl: "/assets/images/marker.png",
iconSize: [50, 50], iconSize: [50, 50],
iconAnchor: [25, 50], iconAnchor: [25, 50],
@ -27,13 +27,13 @@ document.addEventListener("DOMContentLoaded", function () {
}) })
.addTo(map) .addTo(map)
.bindPopup( .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); map.addLayer(drawnItems);
var drawControl = new L.Control.Draw({ drawControl = new L.Control.Draw({
draw: { draw: {
polygon: true, // Izinkan user menggambar polygon polygon: true, // Izinkan user menggambar polygon
polyline: false, polyline: false,
@ -49,36 +49,15 @@ document.addEventListener("DOMContentLoaded", function () {
}); });
map.addControl(drawControl); map.addControl(drawControl);
// 4⃣ Event saat user menggambar polygon map.on("draw:created", handleDrawCreated);
map.on("draw:created", function (event) { map.on("draw:edited", handleDrawEdited);
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!");
});
$("#showModal").on("shown.bs.modal", function () { $("#showModal").on("shown.bs.modal", function () {
map.invalidateSize(); map.invalidateSize();
}); });
}
map.on("click", onMapClick); document.addEventListener("DOMContentLoaded", initMap);
});
var form = document.getElementById("add-form"); var form = document.getElementById("add-form");
var provinceField = form.querySelector("#province-field"); var provinceField = form.querySelector("#province-field");
@ -103,19 +82,17 @@ var mapContainer = form.querySelector("#map-container");
var latField = form.querySelector("#lat"); var latField = form.querySelector("#lat");
var lngField = form.querySelector("#lng"); var lngField = form.querySelector("#lng");
var polygonField = form.querySelector("#polygon");
var loading = form.querySelector("#loading");
var btnContainer = form.querySelector("#add-footer"); var btnContainer = form.querySelector("#add-footer");
function getRegencies(provinceId) { function getRegencies(provinceId) {
regencyContainer.style.display = "none"; regencyContainer.style.display = "none";
// regencyEditContainer.style.display = "none";
districtContainer.style.display = "none"; districtContainer.style.display = "none";
// districtEditContainer.style.display = "none";
addressContainer.style.display = "none"; addressContainer.style.display = "none";
// addressEditContainer.style.display = "none";
loading.style.display = "block"; loading.style.display = "block";
// loadingEdit.style.display = "block";
mapContainer.style.display = "none"; mapContainer.style.display = "none";
// mapEditConatiner.style.display = "none";
const url = "/location/get-regency/" + provinceId; const url = "/location/get-regency/" + provinceId;
$.ajax({ $.ajax({
@ -124,15 +101,11 @@ function getRegencies(provinceId) {
success: function (response) { success: function (response) {
if (response.success) { if (response.success) {
loading.style.display = "none"; loading.style.display = "none";
// loadingEdit.style.display = "none";
const data = response.data; const data = response.data;
regencyVal.clearStore(); regencyVal.clearStore();
regencyVal.clearChoices(); regencyVal.clearChoices();
// regencyEditVal.clearStore();
// regencyEditVal.clearChoices();
regencyVal.value = ""; regencyVal.value = "";
regencyVal.setChoices([ 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)) { if (Array.isArray(data)) {
regencyVal.setChoices( regencyVal.setChoices(
data.map((regency) => ({ 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"; regencyContainer.style.display = "block";
// regencyEditContainer.style.display = "block";
} else { } else {
mapContainer.style.display = "block"; mapContainer.style.display = "block";
mapContainer.innerHTML = mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>"; "<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.style.display = "block";
mapContainer.innerHTML = mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>"; "<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"; addressContainer.style.display = "block";
btnContainer.style.display = "block";
var lat = position.coords.latitude; var lat = position.coords.latitude;
var lng = position.coords.longitude; var lng = position.coords.longitude;
@ -296,7 +240,7 @@ function showmap(districtId) {
currentMarker currentMarker
.bindPopup( .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(); .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() { function onPointerDragend() {
if (!currentMarker) return; if (!currentMarker) return;
var coordinates = currentMarker.getLatLng(); var coordinates = currentMarker.getLatLng();
@ -345,3 +267,25 @@ function onPointerDragend() {
latField.value = coordinates.lat; latField.value = coordinates.lat;
lngField.value = coordinates.lng; 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 --> <!-- App js -->
<script src="{{ asset('assets/js/app.js') }}"></script> <script src="{{ asset('assets/js/app.js') }}"></script>
<script src="{{ asset('assets/libs/jquery/jquery.min.js') }}"></script> <script src="{{ asset('assets/libs/jquery/jquery.min.js') }}"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</body> </body>
</html> </html>

View File

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