From 7e027680ab548b5bda1df8a9751f4d5129379401 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:18:30 +0700 Subject: [PATCH 1/6] feat(bank-data): tambahkan model dan migrasi untuk tabel bank_data - Menambahkan model BankData untuk mengelola data bank. - Membuat migrasi untuk tabel bank_data dengan kolom yang diperlukan. - Menyediakan scope untuk memfilter data berdasarkan jenis aset, desa, distrik, kota, provinsi, dan tanggal. --- app/Models/BankData.php | 80 +++++++++++++++++++ ...25_03_17_130936_create_bank_data_table.php | 69 ++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 app/Models/BankData.php create mode 100644 database/migrations/2025_03_17_130936_create_bank_data_table.php diff --git a/app/Models/BankData.php b/app/Models/BankData.php new file mode 100644 index 0000000..437cdd1 --- /dev/null +++ b/app/Models/BankData.php @@ -0,0 +1,80 @@ + 'integer', + 'luas_tanah' => 'decimal:2', + 'luas_bangunan' => 'decimal:2', + 'tahun_bangunan' => 'integer', + 'harga' => 'decimal:2', + 'harga_diskon' => 'decimal:2', + 'diskon' => 'decimal:2', + 'total' => 'decimal:2', + 'kordinat_lat' => 'decimal:8', + 'kordinat_lng' => 'decimal:8', + 'harga_penawaran' => 'decimal:2', + 'tanggal' => 'date', + 'tgl_final_laporan' => 'date', + 'nilai_pasar' => 'decimal:2', + 'indikasi_nilai_likuidasi' => 'decimal:2', + 'indikasi_nilai_pasar_tanah' => 'decimal:2', + 'estimasi_harga_tanah' => 'decimal:2', + 'estimasi_harga_bangunan' => 'decimal:2', + 'indikasi_nilai_pasar_bangunan' => 'decimal:2', + 'indikasi_nilai_pasar_sarana_pelengkap' => 'decimal:2', + 'indikasi_nilai_pasar_mesin' => 'decimal:2', + 'indikasi_nilai_pasar_kendaraan_alat_berat' => 'decimal:2', + 'photos' => 'array' + ]; + + // Scope for filtering by asset type + public function scopeOfAssetType($query, $assetType) + { + return $query->where('jenis_aset', $assetType); + } + + // Scope for filtering by village + public function scopeOfVillage($query, $villageCode) + { + return $query->where('village_code', $villageCode); + } + + // Scope for filtering by district + public function scopeOfDistrict($query, $districtCode) + { + return $query->where('district_code', $districtCode); + } + + // Scope for filtering by city + public function scopeOfCity($query, $cityCode) + { + return $query->where('city_code', $cityCode); + } + + // Scope for filtering by province + public function scopeOfProvince($query, $provinceCode) + { + return $query->where('province_code', $provinceCode); + } + + // Scope for filtering by date + public function scopeOfDate($query, $date) + { + return $query->whereDate('tanggal', $date); + } + + // Scope for filtering by date range + public function scopeBetweenDates($query, $startDate, $endDate) + { + return $query->whereBetween('tanggal', [$startDate, $endDate]); + } + + } diff --git a/database/migrations/2025_03_17_130936_create_bank_data_table.php b/database/migrations/2025_03_17_130936_create_bank_data_table.php new file mode 100644 index 0000000..c3ad010 --- /dev/null +++ b/database/migrations/2025_03_17_130936_create_bank_data_table.php @@ -0,0 +1,69 @@ +id(); + $table->text('address')->nullable(); + $table->string('village_code')->nullable(); + $table->string('district_code')->nullable(); + $table->string('city_code')->nullable(); + $table->string('province_code')->nullable(); + $table->integer('tahun')->nullable(); + $table->decimal('luas_tanah', 15, 2)->nullable(); + $table->decimal('luas_bangunan', 15, 2)->nullable(); + $table->integer('tahun_bangunan')->nullable(); + $table->string('status_nara_sumber')->nullable(); + $table->decimal('harga', 15, 2)->nullable(); + $table->decimal('harga_diskon', 15, 2)->nullable(); + $table->decimal('diskon', 5, 2)->nullable(); + $table->decimal('total', 15, 2)->nullable(); + $table->string('nama_nara_sumber')->nullable(); + $table->string('peruntukan')->nullable(); + $table->string('penawaran')->nullable(); + $table->string('telepon')->nullable(); + $table->string('hak_properti')->nullable(); + $table->decimal('kordinat_lat', 10, 8)->nullable(); + $table->decimal('kordinat_lng', 11, 8)->nullable(); + $table->string('jenis_aset')->nullable(); + $table->string('foto_objek')->nullable(); + $table->date('tanggal')->nullable(); + $table->decimal('harga_penawaran', 15, 2)->nullable(); + $table->string('nomor_laporan')->nullable(); + $table->date('tgl_final_laporan')->nullable(); + $table->decimal('nilai_pasar', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_likuidasi', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_tanah', 15, 2)->nullable(); + $table->decimal('estimasi_harga_tanah', 15, 2)->nullable(); + $table->decimal('estimasi_harga_bangunan', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_bangunan', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_sarana_pelengkap', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_mesin', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_kendaraan_alat_berat', 15, 2)->nullable(); + $table->json('photos')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('bank_data'); + } +}; From 8a7dccc7844093d330787973a87f93a4c033f624 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:19:07 +0700 Subject: [PATCH 2/6] feat(bank-data): tambahkan request validasi untuk data bank - Menambahkan kelas BankDataRequest untuk menangani validasi input data bank. - Mengatur aturan validasi untuk berbagai field seperti alamat, kode desa, dan harga. - Memastikan bahwa semua field bersifat nullable dan memiliki batasan yang sesuai. --- app/Http/Requests/BankDataRequest.php | 57 +++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 app/Http/Requests/BankDataRequest.php diff --git a/app/Http/Requests/BankDataRequest.php b/app/Http/Requests/BankDataRequest.php new file mode 100644 index 0000000..e35c560 --- /dev/null +++ b/app/Http/Requests/BankDataRequest.php @@ -0,0 +1,57 @@ + 'nullable|string|max:255', + 'village_code' => 'nullable|string|max:20', + 'district_code' => 'nullable|string|max:20', + 'city_code' => 'nullable|string|max:20', + 'province_code' => 'nullable|string|max:20', + 'tahun' => 'nullable|integer', + 'luas_tanah' => 'nullable|numeric', + 'luas_bangunan' => 'nullable|numeric', + 'tahun_bangunan' => 'nullable|integer', + 'status_nara_sumber' => 'nullable|string|max:50', + 'harga' => 'nullable|numeric', + 'harga_diskon' => 'nullable|numeric', + 'diskon' => 'nullable|numeric', + 'total' => 'nullable|numeric', + 'nama_nara_sumber' => 'nullable|string|max:100', + 'peruntukan' => 'nullable|string|max:100', + 'penawaran' => 'nullable|string|max:50', + 'telepon' => 'nullable|string|max:20', + 'hak_properti' => 'nullable|string|max:50', + 'kordinat_lat' => 'nullable|numeric', + 'kordinat_lng' => 'nullable|numeric', + 'jenis_aset' => 'nullable|string|max:50', + 'foto_objek' => 'nullable|image|max:2048', + 'tanggal' => 'nullable|date', + 'harga_penawaran' => 'nullable|numeric', + 'nomor_laporan' => 'nullable|string|max:50', + 'tgl_final_laporan' => 'nullable|date', + 'nilai_pasar' => 'nullable|numeric', + 'indikasi_nilai_likuidasi' => 'nullable|numeric', + 'indikasi_nilai_pasar_tanah' => 'nullable|numeric', + 'estimasi_harga_tanah' => 'nullable|numeric', + 'estimasi_harga_bangunan' => 'nullable|numeric', + 'indikasi_nilai_pasar_bangunan' => 'nullable|numeric', + 'indikasi_nilai_pasar_sarana_pelengkap' => 'nullable|numeric', + 'indikasi_nilai_pasar_mesin' => 'nullable|numeric', + 'indikasi_nilai_pasar_kendaraan_alat_berat' => 'nullable|numeric', + 'photos' => 'nullable|array', + 'photos.*' => 'nullable|image|max:2048', + ]; + } + } From 14e94356844e8fa0c2d734a117b918a74a4359cb Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:19:16 +0700 Subject: [PATCH 3/6] feat(bank-data): tambahkan layanan untuk pengelolaan data bank - Menambahkan kelas BankDataService untuk mengelola data bank. - Menyediakan metode untuk mendapatkan, membuat, memperbarui, dan menghapus data bank. - Mengikat BankDataService di LpjServiceProvider untuk penggunaan di seluruh aplikasi. --- app/Providers/LpjServiceProvider.php | 5 ++ app/Services/BankDataService.php | 116 +++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 app/Services/BankDataService.php diff --git a/app/Providers/LpjServiceProvider.php b/app/Providers/LpjServiceProvider.php index 474ae18..a7f8df1 100644 --- a/app/Providers/LpjServiceProvider.php +++ b/app/Providers/LpjServiceProvider.php @@ -4,6 +4,8 @@ use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; + use Modules\Lpj\Models\BankData; + use Modules\Lpj\Services\BankDataService; class LpjServiceProvider extends ServiceProvider { @@ -118,6 +120,9 @@ { $this->app->register(EventServiceProvider::class); $this->app->register(RouteServiceProvider::class); + $this->app->bind(BankDataService::class, function ($app){ + return new BankDataService($app->make(BankData::class)); + }); } /** diff --git a/app/Services/BankDataService.php b/app/Services/BankDataService.php new file mode 100644 index 0000000..98ab6e0 --- /dev/null +++ b/app/Services/BankDataService.php @@ -0,0 +1,116 @@ +bankData = $bankData; + } + + /** + * Get all bank data with optional filtering and pagination + * + * @param array $filters + * @param int|null $perPage + * + * @return Collection|LengthAwarePaginator + */ + public function getAllBankData(array $filters = [], ?int $perPage = null) + { + $query = $this->bankData->newQuery(); + + // Apply filters + if (isset($filters['village_code'])) { + $query->ofVillage($filters['village_code']); + } + if (isset($filters['district_code'])) { + $query->ofDistrict($filters['district_code']); + } + if (isset($filters['city_code'])) { + $query->ofCity($filters['city_code']); + } + if (isset($filters['province_code'])) { + $query->ofProvince($filters['province_code']); + } + if (isset($filters['date'])) { + $query->ofDate($filters['date']); + } + if (isset($filters['start_date']) && isset($filters['end_date'])) { + $query->betweenDates($filters['start_date'], $filters['end_date']); + } + if (isset($filters['year'])) { + $query->ofYear($filters['year']); + } + if (isset($filters['asset_type'])) { + $query->ofAssetType($filters['asset_type']); + } + + // Add more filters as needed + + return $perPage ? $query->paginate($perPage) : $query->get(); + } + + /** + * Create a new bank data entry + * + * @param array $data + * + * @return BankData + */ + public function createBankData(array $data) + : BankData + { + return $this->bankData->create($data); + } + + /** + * Update an existing bank data entry + * + * @param int $id + * @param array $data + * + * @return BankData + */ + public function updateBankData(int $id, array $data) + : BankData + { + $bankData = $this->bankData->findOrFail($id); + $bankData->update($data); + return $bankData; + } + + /** + * Delete a bank data entry + * + * @param int $id + * + * @return bool + */ + public function deleteBankData(int $id) + : bool + { + $bankData = $this->bankData->findOrFail($id); + return $bankData->delete(); + } + + /** + * Find a bank data entry by ID + * + * @param int $id + * + * @return BankData|null + */ + public function findBankData(int $id) + : ?BankData + { + return $this->bankData->find($id); + } + } From 3a54b20f84144a93c462c8a34cda3e26c2b8c893 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:19:46 +0700 Subject: [PATCH 4/6] feat(bank-data): tambahkan controller dan route untuk pengelolaan data bank - Menambahkan BankDataController untuk mengelola operasi CRUD pada data bank. - Mengimplementasikan metode untuk menampilkan, membuat, memperbarui, dan menghapus data bank. - Menambahkan route untuk mengakses data bank dan mengintegrasikan dengan datatables. - Memperbarui breadcrumbs untuk menambahkan navigasi ke halaman data bank. --- app/Http/Controllers/BankDataController.php | 172 ++++++++++++++++++++ routes/breadcrumbs.php | 4 + routes/web.php | 9 +- 3 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/BankDataController.php diff --git a/app/Http/Controllers/BankDataController.php b/app/Http/Controllers/BankDataController.php new file mode 100644 index 0000000..f9d7fd9 --- /dev/null +++ b/app/Http/Controllers/BankDataController.php @@ -0,0 +1,172 @@ +bankDataService = $bankDataService; + } + + public function index(Request $request) + { + $provinces = Province::all(); + $jenisJaminan = JenisJaminan::all(); + + 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.'); + } + + // 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['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($request->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->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, + // 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); + + // 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, + ]); + } +} diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index a00b4e7..ef77526 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -719,5 +719,9 @@ Breadcrumbs::for('noc', function (BreadcrumbTrail $trail) { $trail->push('Laporan Admin Kredit', route('laporan-admin-kredit.index')); }); + Breadcrumbs::for('bank-data', function ($trail) { + $trail->push('Bank Data', route('bank-data.index')); + }); + // add andy require __DIR__ . '/breadcrumbs_registrasi.php'; diff --git a/routes/web.php b/routes/web.php index 5a67a4c..b6df375 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,7 +3,8 @@ use Illuminate\Support\Facades\Route; use Modules\Lpj\Http\Controllers\ActivityController; use Modules\Lpj\Http\Controllers\ArahMataAnginController; -use Modules\Lpj\Http\Controllers\CustomFieldController; + use Modules\Lpj\Http\Controllers\BankDataController; + use Modules\Lpj\Http\Controllers\CustomFieldController; use Modules\Lpj\Http\Controllers\DebitureController; use Modules\Lpj\Http\Controllers\DokumenJaminanController; use Modules\Lpj\Http\Controllers\HubunganPemilikJaminanController; @@ -665,6 +666,12 @@ Route::middleware(['auth'])->group(function () { Route::get('export', [LaporanAdminKreditController::class, 'export'])->name('export'); }); + Route::name('bank-data.')->prefix('bank-data')->group(function () { + Route::get('datatables', [BankDataController::class, 'dataForDatatables'])->name('datatables'); + }); + + Route::resource('bank-data', BankDataController::class); + }); require __DIR__ . '/registrasi.php'; From 6befc5faa76690ad75e559c5c137e0828cae75a8 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:19:58 +0700 Subject: [PATCH 5/6] feat(bank-data): tambahkan entri untuk data bank di module.json - Menambahkan entri baru untuk pengelolaan data bank. - Mengatur izin akses hanya untuk peran administrator. - Memperbarui struktur module.json untuk mencakup data bank. --- module.json | 11 + resources/views/bank-data/index.blade.php | 342 ++++++++++++++++++++++ 2 files changed, 353 insertions(+) create mode 100644 resources/views/bank-data/index.blade.php diff --git a/module.json b/module.json index c0302e9..bf2313a 100644 --- a/module.json +++ b/module.json @@ -109,6 +109,17 @@ } ], "main": [ + { + "title": "Bank Data", + "path": "bank-data", + "icon": "ki-filled ki-questionnaire-tablet text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator" + ] + }, { "title": "Permohonan", "path": "permohonan", diff --git a/resources/views/bank-data/index.blade.php b/resources/views/bank-data/index.blade.php new file mode 100644 index 0000000..992a893 --- /dev/null +++ b/resources/views/bank-data/index.blade.php @@ -0,0 +1,342 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('bank-data') }} +@endsection + +@section('content') +
+
+
+
+

+ Filter +

+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
+

+ Maps +

+
+
+
+
+
+
+
+
+
+
+

+ Daftar Bank Data +

+
+
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
+ + + Jenis Aset + + + Tanggal + + + Tahun + + + Luas Tanah + + + Luas Bangunan + + + Harga + + + Nilai Pasar + + + Location + +
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush From 047e543d8d09510769014a72d156116eedb6fbe8 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 18 Mar 2025 07:25:27 +0700 Subject: [PATCH 6/6] feat(bank-data): tambahkan info window untuk marker peta - Menambahkan array untuk menyimpan info window. - Membuat konten info window yang menampilkan detail aset. - Menambahkan event listener untuk marker agar info window terbuka saat marker diklik. - Menutup semua info window yang terbuka saat marker baru diklik. --- resources/views/bank-data/index.blade.php | 33 ++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/resources/views/bank-data/index.blade.php b/resources/views/bank-data/index.blade.php index 992a893..dc6b59b 100644 --- a/resources/views/bank-data/index.blade.php +++ b/resources/views/bank-data/index.blade.php @@ -173,6 +173,7 @@