diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index dc66a26..569f067 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -41,7 +41,7 @@ function formatRupiah($number,$decimals = 0) function formatAlamat($alamat) { - return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->postal_code ?? ''); + return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->village->postal_code ?? ''); } // andy add diff --git a/app/Http/Controllers/BankDataController.php b/app/Http/Controllers/BankDataController.php new file mode 100644 index 0000000..ac94545 --- /dev/null +++ b/app/Http/Controllers/BankDataController.php @@ -0,0 +1,173 @@ +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, + 'address' => formatAlamat($item) + // 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/app/Http/Controllers/LaporanAdminKreditController.php b/app/Http/Controllers/LaporanAdminKreditController.php index 7656461..d62ce28 100644 --- a/app/Http/Controllers/LaporanAdminKreditController.php +++ b/app/Http/Controllers/LaporanAdminKreditController.php @@ -21,6 +21,7 @@ { $permohonan = Permohonan::with(['documents.jenisJaminan','penilaian._user_penilai','penilai','documents.detail.jenisLegalitasJaminan'])->where(['status'=>'done'])->get(); foreach($permohonan as $_permohonan){ + $npw = 0; if(isset($_permohonan->penilai->lpj)){ $npw = json_decode($_permohonan->penilai->lpj, true); $npw = $npw['total_nilai_pasar_wajar'] ?? 0; @@ -38,7 +39,9 @@ 'nilai_pasar_wajar' => str_replace('.', '', $npw), 'bukti_kepemilikan' => $_permohonan->documents->flatMap(function ($document) { return $document->detail->map(function ($detail) { - return $detail->jenisLegalitasJaminan->name ?? null; + return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor)) + ? ($detail->jenisLegalitasJaminan->name ?? '') . "\n" . implode(', ', $detail->dokumen_nomor) + : null; }); })->filter()->unique()->implode(', '), ]; diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index b66021b..791de97 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -968,8 +968,8 @@ class PenilaiController extends Controller ] ); - $existingPhotos = isset($memo->memo) ? json_decode($memo->memo)->foto : []; - dd($existingPhotos); + // $existingPhotos = isset($memo->memo) ? json_decode($memo->memo) : []; + // dd($existingPhotos); // Simpan foto-foto if ($request->hasFile('foto_0')) { $photoUrls = []; @@ -982,15 +982,15 @@ class PenilaiController extends Controller $index++; } - $memoData['foto'] = array_merge($existingPhotos, $photoUrls); + // $memoData['foto'] = array_merge($existingPhotos, $photoUrls); - }else{ - $memoData['foto'] = $existingPhotos; - } + // }else{ + // $memoData['foto'] = $existingPhotos; // Tambahkan URL foto ke data memo $memoData['foto'] = $photoUrls; $memo->memo = json_encode($memoData); $memo->save(); + } return response()->json([ 'success' => true, 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', + ]; + } + } diff --git a/app/Models/BankData.php b/app/Models/BankData.php new file mode 100644 index 0000000..b7b992b --- /dev/null +++ b/app/Models/BankData.php @@ -0,0 +1,104 @@ + '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]); + } + + public function village() + { + return $this->belongsTo(Village::class, 'village_code', 'code'); + } + + public function district() + { + return $this->belongsTo(District::class, 'district_code', 'code'); + } + + public function city() + { + return $this->belongsTo(City::class, 'city_code', 'code'); + } + + public function province() + { + return $this->belongsTo(Province::class, 'province_code', 'code'); + } + + } 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); + } + } 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'); + } +}; 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..00b184f --- /dev/null +++ b/resources/views/bank-data/index.blade.php @@ -0,0 +1,469 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('bank-data') }} +@endsection + +@section('content') +
| + + | ++ Jenis Aset + + | ++ Tanggal + + | ++ Tahun + + | ++ Luas Tanah + + | ++ Luas Bangunan + + | ++ Harga + + | ++ Nilai Pasar + + | ++ Location + + | +
|---|
|
- Tanggal: {{ \Carbon\Carbon::parse($permohonan->penilaian->updated_at)->format('d-m-Y') }} + Tanggal: {{ \Carbon\Carbon::parse(date('Y-m-d'))->format('d-m-Y') }} - Waktu: {{ \Carbon\Carbon::parse($permohonan->penilaian->updated_at)->format('H:i') }} + Waktu: {{ \Carbon\Carbon::parse(date('H:i:s'))->format('H:i:s') }} -User: {{ $penilaiUser->name }} +User: {{ Auth::user()->name }} |
| - Menindak lanjuti permintann penilaian jaminan dari {{ $permohonan->user->name }} AO Cabang + Menindak lanjuti permintan penilaian jaminan dari {{ $permohonan->user->name }} AO Cabang {{ $permohonan->debiture->branch->name ?? '' }} - tanggal {{ formatTanggalIndonesia($memo['tanggal']) ?? '' }}, dapat di sampaikan sebagai berikut: + tanggal {{ formatTanggalIndonesia($permohonan->created_at) ?? '' }}, dapat di sampaikan sebagai berikut: |