From 5bcc3f7e53eb87fa1523924380325e57e19a2ef9 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 8 Apr 2025 09:36:57 +0700 Subject: [PATCH 1/4] feat(migration): tambahkan kolom kategori pada tabel bank_data - Menambahkan kolom 'kategori' dengan tipe enum pada tabel 'bank_data'. - Nilai yang diizinkan untuk kolom ini adalah 'data_pembanding', 'penilaian', dan 'input'. - Nilai default untuk kolom ini adalah 'data_pembanding'. --- ...25_04_08_080648_update_bank_data_table.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 database/migrations/2025_04_08_080648_update_bank_data_table.php diff --git a/database/migrations/2025_04_08_080648_update_bank_data_table.php b/database/migrations/2025_04_08_080648_update_bank_data_table.php new file mode 100644 index 0000000..f430197 --- /dev/null +++ b/database/migrations/2025_04_08_080648_update_bank_data_table.php @@ -0,0 +1,28 @@ +enum('kategori',['data_pembanding','penilaian','input'])->default('data_pembanding'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('bank_data', function (Blueprint $table) { + $table->dropColumn('kategori'); + }); + } +}; From 159dea65737518228faabeef8d3eb1cc15f36b55 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 8 Apr 2025 09:38:06 +0700 Subject: [PATCH 2/4] fix(migration): perbaiki fungsi down pada migrasi tabel permohonan - Memastikan bahwa perubahan pada enum 'status_bayar' di fungsi down dilakukan dalam konteks tabel 'permohonan'. - Menghindari kesalahan dengan menambahkan fungsi Schema::table di dalam fungsi down. --- .../migrations/2025_03_24_080648_update_permohonan_table.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/database/migrations/2025_03_24_080648_update_permohonan_table.php b/database/migrations/2025_03_24_080648_update_permohonan_table.php index 99352ad..7b8e484 100644 --- a/database/migrations/2025_03_24_080648_update_permohonan_table.php +++ b/database/migrations/2025_03_24_080648_update_permohonan_table.php @@ -21,6 +21,8 @@ return new class extends Migration */ public function down(): void { - $table->enum('status_bayar',['sudah_bayar','belum_bayar'])->default('sudah_bayar')->change(); + Schema::table('permohonan', function (Blueprint $table) { + $table->enum('status_bayar',['sudah_bayar','belum_bayar'])->default('sudah_bayar')->change(); + }); } }; From 548956d403c217d6b5c1f295e5bc1b35cd15bfe6 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 8 Apr 2025 09:38:51 +0700 Subject: [PATCH 3/4] feat(bank-data): tambahkan filter kategori dan sumber pada tabel bank data - Menambahkan dropdown untuk memilih kategori pada form filter. - Menambahkan kolom sumber pada tabel bank data. - Mengatur warna marker pada peta berdasarkan kategori. --- resources/views/bank-data/index.blade.php | 26 ++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/resources/views/bank-data/index.blade.php b/resources/views/bank-data/index.blade.php index 15d718b..39733c7 100644 --- a/resources/views/bank-data/index.blade.php +++ b/resources/views/bank-data/index.blade.php @@ -16,6 +16,16 @@
+ +
+ + +
+ + Sumber + + Jenis Aset @@ -236,11 +250,18 @@ [lat, lng] = item.location.map(coord => parseFloat(coord)); } + const markerColors = { + data_pembanding: 'http://maps.google.com/mapfiles/ms/icons/red-dot.png', + penilaian: 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png', + input_manual: 'http://maps.google.com/mapfiles/ms/icons/yellow-dot.png' + }; + if (lat && lng) { const marker = new google.maps.Marker({ position: {lat: lat, lng: lng}, map: map, - title: item.jenis_aset + title: item.jenis_aset, + icon: markerColors[item.kategori] || 'http://maps.google.com/mapfiles/ms/icons/red-dot.png' // Default to red if category is not recognized }); // Create info window content @@ -443,6 +464,9 @@ return checkbox.outerHTML.trim(); }, }, + sumber: { + title: 'Sumber' + }, jenis_aset: { title: 'Jenis Aset' }, From 4e9c4cea0f7744e1640dd20622bd199dbbac7864 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 8 Apr 2025 09:39:11 +0700 Subject: [PATCH 4/4] fix(bank-data): perbaiki logika penyimpanan data pembanding - Menambahkan kategori 'data_pembanding' saat menyimpan data ke BankData. - Memperbaiki penanganan koordinat yang tidak valid dengan logging. - Memastikan data yang diambil dari request diolah dengan benar sebelum disimpan. --- app/Http/Controllers/BankDataController.php | 427 ++++++++++---------- 1 file changed, 219 insertions(+), 208 deletions(-) diff --git a/app/Http/Controllers/BankDataController.php b/app/Http/Controllers/BankDataController.php index 98d9018..e0d3f23 100644 --- a/app/Http/Controllers/BankDataController.php +++ b/app/Http/Controllers/BankDataController.php @@ -1,236 +1,247 @@ bankDataService = $bankDataService; - } + protected $bankDataService; + protected $user; - public function index(Request $request) - { - $provinces = Province::all(); - $jenisJaminan = JenisJaminan::all(); + public function __construct(BankDataService $bankDataService) + { + $this->bankDataService = $bankDataService; + } - //insert data pembanding + public function index(Request $request) + { + $provinces = Province::all(); + $jenisJaminan = JenisJaminan::all(); - $inspeksi = Inspeksi::all(); + //insert data pembanding - foreach ($inspeksi as $item) { - if(isset($item->data_pembanding)){ - $data_pembanding = json_decode($item->data_pembanding); - foreach ($data_pembanding->data_pembanding as $dataPembanding) { - $lat = $dataPembanding->kordinat_lat; - $lng = $dataPembanding->kordinat_lng; + $inspeksi = Inspeksi::all(); - if (!empty($lat) && !empty($lng) && $lng !== null && $lat !== null && $lat !== '' && $lng !== '') { - $lat = floatval($lat); - $lng = floatval($lng); + foreach ($inspeksi as $item) { + if (isset($item->data_pembanding)) { + $data_pembanding = json_decode($item->data_pembanding); + foreach ($data_pembanding->data_pembanding as $dataPembanding) { + $lat = $dataPembanding->kordinat_lat; + $lng = $dataPembanding->kordinat_lng; - if ($lat >= -90 && $lat <= 90 && $lng >= -180 && $lng <= 180) { - $data = [ - 'address' => $dataPembanding->address, - 'village_code' => $dataPembanding->village_code, - 'district_code' => $dataPembanding->district_code, - 'city_code' => $dataPembanding->city_code, - 'province_code' => $dataPembanding->province_code, - 'tahun' => is_numeric($dataPembanding->tahun) ? $dataPembanding->tahun : 0, - 'luas_tanah' => is_numeric($dataPembanding->luas_tanah) ? $dataPembanding->luas_tanah : 0, - 'luas_bangunan' => is_numeric($dataPembanding->luas_bangunan) ? $dataPembanding->luas_bangunan : 0, - 'tahun_bangunan' => is_numeric($dataPembanding->tahun_bangunan) ? $dataPembanding->tahun_bangunan : 0, - 'harga' => is_numeric($dataPembanding->harga) ? $dataPembanding->harga : 0, - 'harga_diskon' => is_numeric($dataPembanding->harga_diskon) ? $dataPembanding->harga_diskon : 0, - 'diskon' => is_numeric(str_replace(',', '.', $dataPembanding->diskon)) ? str_replace(',', '.', $dataPembanding->diskon) : 0, - 'total' => is_numeric($dataPembanding->total) ? $dataPembanding->total : 0, - 'harga_penawaran' => is_numeric($dataPembanding->harga_penawaran) ? $dataPembanding->harga_penawaran : 0, - 'nama_nara_sumber' => $dataPembanding->nama_nara_sumber, - 'peruntukan' => $dataPembanding->peruntukan, - 'penawaran' => $dataPembanding->penawaran, - 'telepon' => $dataPembanding->telepon, - 'hak_properti' => $dataPembanding->hak_properti, - 'jenis_aset' => $dataPembanding->jenis_aset, - 'foto_objek' => $dataPembanding->foto_objek, - 'tanggal' => $dataPembanding->tanggal, - ]; + if (!empty($lat) && !empty($lng) && $lng !== null && $lat !== null && $lat !== '' && $lng !== '') { + $lat = floatval($lat); + $lng = floatval($lng); - BankData::updateOrCreate( - [ - 'kordinat_lat' => $lat, - 'kordinat_lng' => $lng - ], - $data - ); + if ($lat >= -90 && $lat <= 90 && $lng >= -180 && $lng <= 180) { + $data = [ + 'address' => $dataPembanding->address, + 'village_code' => $dataPembanding->village_code, + 'district_code' => $dataPembanding->district_code, + 'city_code' => $dataPembanding->city_code, + 'province_code' => $dataPembanding->province_code, + 'tahun' => is_numeric($dataPembanding->tahun) ? $dataPembanding->tahun : 0, + 'luas_tanah' => is_numeric($dataPembanding->luas_tanah) ? $dataPembanding->luas_tanah : 0, + 'luas_bangunan' => is_numeric($dataPembanding->luas_bangunan) ? $dataPembanding->luas_bangunan : 0, + 'tahun_bangunan' => is_numeric($dataPembanding->tahun_bangunan) ? $dataPembanding->tahun_bangunan : 0, + 'harga' => is_numeric($dataPembanding->harga) ? $dataPembanding->harga : 0, + 'harga_diskon' => is_numeric($dataPembanding->harga_diskon) ? $dataPembanding->harga_diskon : 0, + 'diskon' => is_numeric(str_replace(',', '.', $dataPembanding->diskon)) ? str_replace(',', '.', $dataPembanding->diskon) : 0, + 'total' => is_numeric($dataPembanding->total) ? $dataPembanding->total : 0, + 'harga_penawaran' => is_numeric($dataPembanding->harga_penawaran) ? $dataPembanding->harga_penawaran : 0, + 'nama_nara_sumber' => $dataPembanding->nama_nara_sumber, + 'peruntukan' => $dataPembanding->peruntukan, + 'penawaran' => $dataPembanding->penawaran, + 'telepon' => $dataPembanding->telepon, + 'hak_properti' => $dataPembanding->hak_properti, + 'jenis_aset' => $dataPembanding->jenis_aset, + 'foto_objek' => $dataPembanding->foto_objek, + 'tanggal' => $dataPembanding->tanggal, + 'kategori' => 'data_pembanding', + ]; + + BankData::updateOrCreate( + [ + 'kordinat_lat' => $lat, + 'kordinat_lng' => $lng + ], + $data + ); + } + } else { + // Invalid coordinates + Log::warning("Invalid coordinates: Lat: $lat, Lng: $lng");// Do something to handle this situation, such as logging an error or skipping the record } - }else{ - // Invalid coordinates - \Log::warning("Invalid coordinates: Lat: $lat, Lng: $lng");// Do something to handle this situation, such as logging an error or skipping the record } } } + + return view('lpj::bank-data.index', compact('provinces', 'jenisJaminan')); } - return view('lpj::bank-data.index', compact('provinces', 'jenisJaminan' )); - } - - public function create() - { - return view('lpj::bank-data.create'); - } - - public function store(BankDataRequest $request) - { - $data = $request->validated(); - $bankData = $this->bankDataService->createBankData($data); - return redirect()->route('lpj.bank-data.show', $bankData->id)->with('success', 'Bank data created successfully.'); - } - - public function show($id) - { - $bankData = $this->bankDataService->findBankData($id); - return view('lpj::bank-data.show', compact('bankData')); - } - - public function edit($id) - { - $bankData = $this->bankDataService->findBankData($id); - return view('lpj::bank-data.edit', compact('bankData')); - } - - public function update(BankDataRequest $request, $id) - { - $data = $request->validated(); - $bankData = $this->bankDataService->updateBankData($id, $data); - return redirect()->route('lpj.bank-data.show', $bankData->id)->with('success', 'Bank data updated successfully.'); - } - - public function destroy($id) - { - $this->bankDataService->deleteBankData($id); - return redirect()->route('lpj.bank-data.index')->with('success', 'Bank data deleted successfully.'); - } - - public function dataForDatatables(Request $request) - { - if (is_null($this->user) || !$this->user->can('bank-data.view')) { - //abort(403, 'Sorry! You are not allowed to view bank data.'); + public function create() + { + return view('lpj::bank-data.create'); } - // Retrieve data from the database - $query = BankData::query(); + public function store(BankDataRequest $request) + { + $data = $request->validated(); + $bankData = $this->bankDataService->createBankData($data); + return redirect() + ->route('lpj.bank-data.show', $bankData->id) + ->with('success', 'Bank data created successfully.'); + } - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $search = json_decode($search, true); - if (is_array($search)) { + public function show($id) + { + $bankData = $this->bankDataService->findBankData($id); + return view('lpj::bank-data.show', compact('bankData')); + } - if ($search['province_code']) { - $query->ofProvince($search['province_code']); - } + public function edit($id) + { + $bankData = $this->bankDataService->findBankData($id); + return view('lpj::bank-data.edit', compact('bankData')); + } - if ($search['city_code']) { - $query->ofCity($search['city_code']); - } + public function update(BankDataRequest $request, $id) + { + $data = $request->validated(); + $bankData = $this->bankDataService->updateBankData($id, $data); + return redirect() + ->route('lpj.bank-data.show', $bankData->id) + ->with('success', 'Bank data updated successfully.'); + } - if ($search['district_code']) { - $query->ofDistrict($search['district_code']); - } + public function destroy($id) + { + $this->bankDataService->deleteBankData($id); + return redirect()->route('lpj.bank-data.index')->with('success', 'Bank data deleted successfully.'); + } - if ($search['village_code']) { - $query->ofVillage($search['village_code']); - } - - if ($search['jenis_asset']) { - $query->ofAssetType($search['jenis_asset']); - } - - if ($search['start_date'] && $search['end_date']) { - $query->betweenDates($search['start_date'], $search['end_date']); - } - } else{ - $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->where('jenis_aset', 'LIKE', '%' . $search . '%'); - }); + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('bank-data.view')) { + //abort(403, 'Sorry! You are not allowed to view bank data.'); } + + // Retrieve data from the database + $query = BankData::query(); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $search = json_decode($search, true); + if (is_array($search)) { + + if ($search['province_code']) { + $query->ofProvince($search['province_code']); + } + + if ($search['kategori']) { + $query->where('kategori',$search['kategori']); + } + + if ($search['city_code']) { + $query->ofCity($search['city_code']); + } + + if ($search['district_code']) { + $query->ofDistrict($search['district_code']); + } + + if ($search['village_code']) { + $query->ofVillage($search['village_code']); + } + + if ($search['jenis_asset']) { + $query->ofAssetType($search['jenis_asset']); + } + + if ($search['start_date'] && $search['end_date']) { + $query->betweenDates($search['start_date'], $search['end_date']); + } + } else { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('jenis_aset', 'LIKE', '%' . $search . '%'); + }); + } + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + // Format the data as needed + $formattedData = $data->map(function ($item) { + return [ + 'id' => $item->id, + 'jenis_aset' => $item->jenis_aset, + 'tanggal' => $item->tanggal ? $item->tanggal->format('d-m-Y') : '-', + 'tahun' => $item->tahun, + 'luas_tanah' => $item->luas_tanah, + 'luas_bangunan' => $item->luas_bangunan, + 'harga' => $item->harga, + 'sumber' => $item->kategori ? ucwords(str_replace('_',' ',$item->kategori)) : '-', + 'nilai_pasar' => $item->nilai_pasar, + 'location' => $item->kordinat_lat . ', ' . $item->kordinat_lng, + 'address' => formatAlamat($item), + 'photos' => json_decode($item->foto_objek, true) ?: [$item->foto_objek], + // Add more fields as needed + ]; + }); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = $request->get('page', 1); + + // Ensure current page doesn't exceed page count + $currentPage = min($currentPage, $pageCount); + + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $formattedData, + ]); } - - // Apply sorting if provided - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - $query->orderBy($column, $order); - } - - // Get the total count of records - $totalRecords = $query->count(); - - // Apply pagination if provided - if ($request->has('page') && $request->has('size')) { - $page = $request->get('page'); - $size = $request->get('size'); - $offset = ($page - 1) * $size; // Calculate the offset - - $query->skip($offset)->take($size); - } - - // Get the filtered count of records - $filteredRecords = $query->count(); - - // Get the data for the current page - $data = $query->get(); - - // Format the data as needed - $formattedData = $data->map(function ($item) { - return [ - 'id' => $item->id, - 'jenis_aset' => $item->jenis_aset, - 'tanggal' => $item->tanggal ? $item->tanggal->format('d-m-Y') : '-', - 'tahun' => $item->tahun, - 'luas_tanah' => $item->luas_tanah, - 'luas_bangunan' => $item->luas_bangunan, - 'harga' => $item->harga, - 'nilai_pasar' => $item->nilai_pasar, - 'location' => $item->kordinat_lat . ', ' . $item->kordinat_lng, - 'address' => formatAlamat($item), - 'photos' => json_decode($item->foto_objek, true) ?: [$item->foto_objek], - // Add more fields as needed - ]; - }); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = $request->get('page', 1); - - // Ensure current page doesn't exceed page count - $currentPage = min($currentPage, $pageCount); - - - // Return the response data as a JSON object - return response()->json([ - 'draw' => $request->get('draw'), - 'recordsTotal' => $totalRecords, - 'recordsFiltered' => $filteredRecords, - 'pageCount' => $pageCount, - 'page' => $currentPage, - 'totalCount' => $totalRecords, - 'data' => $formattedData, - ]); } -}