diff --git a/app/Exports/LaporanAdminKreditExport.php b/app/Exports/LaporanAdminKreditExport.php new file mode 100644 index 0000000..b537e9c --- /dev/null +++ b/app/Exports/LaporanAdminKreditExport.php @@ -0,0 +1,70 @@ +get(); + } + + public function map($row): array + { + return [ + $row->id, + $row->debiture->cif, + $row->debiture->name, + $row->debiture->branch->name, + $row->kode_register_t24, + $row->jenis_agunan, + $row->bukti_kepemilikan, + $row->alamat_agunan, + $row->nama_pemilik, + $row->tanggal_kunjungan, + $row->nilai_pasar_wajar, + $row->nilai_likuidasi, + $row->nama_penilai, + $row->created_at + ]; + } + + public function headings(): array + { + return [ + 'ID', + 'CIF', + 'Nama Debitur', + 'Cabang', + 'Kode Register T24', + 'Jenis Agunan', + 'Bukti Kepemilikan', + 'Alamat Agunan', + 'Nama Pemilik', + 'Tanggal Kunjungan', + 'Nilai Pasar Wajar', + 'Nilai Likuidasi', + 'Nama Penilai', + 'Created At' + ]; + } + + public function columnFormats(): array + { + return [ + 'A' => NumberFormat::FORMAT_NUMBER, + 'B' => NumberFormat::FORMAT_NUMBER, + 'J' => NumberFormat::FORMAT_DATE_DDMMYYYY, + 'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, + 'M' => NumberFormat::FORMAT_DATE_DATETIME, + ]; + } +} diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index d00270c..dc66a26 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -32,10 +32,10 @@ function formatTanggalIndonesia($date, $time = false) } -function formatRupiah($number) +function formatRupiah($number,$decimals = 0) { $number = (float) $number; - return 'Rp ' . number_format($number, 0, ',', '.'); + return 'Rp ' . number_format($number, $decimals, ',', '.'); } diff --git a/app/Http/Controllers/LaporanAdminKreditController.php b/app/Http/Controllers/LaporanAdminKreditController.php new file mode 100644 index 0000000..7656461 --- /dev/null +++ b/app/Http/Controllers/LaporanAdminKreditController.php @@ -0,0 +1,137 @@ +where(['status'=>'done'])->get(); + foreach($permohonan as $_permohonan){ + if(isset($_permohonan->penilai->lpj)){ + $npw = json_decode($_permohonan->penilai->lpj, true); + $npw = $npw['total_nilai_pasar_wajar'] ?? 0; + } + + $dataAdk = [ + 'jenis_agunan' => $_permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), + 'alamat_agunan' => $_permohonan->documents->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + 'nama_pemilik' => $_permohonan->documents->pluck('pemilik.name')->unique()->implode(', '), + 'tanggal_kunjungan' => $_permohonan->penilaian->tanggal_kunjungan, + 'nama_penilai' => $_permohonan->penilaian->_user_penilai->userPenilaiTeam->name, + 'nilai_likuidasi' => $_permohonan->nilai_liquidasi, + 'nilai_pasar_wajar' => str_replace('.', '', $npw), + 'bukti_kepemilikan' => $_permohonan->documents->flatMap(function ($document) { + return $document->detail->map(function ($detail) { + return $detail->jenisLegalitasJaminan->name ?? null; + }); + })->filter()->unique()->implode(', '), + ]; + + LaporanAdminKredit::updateOrCreate([ + 'debiture_id' => $_permohonan->debiture_id, + ],$dataAdk); + } + + + $laporans = LaporanAdminKredit::with('debiture')->paginate(10); + return view('lpj::laporan_admin_kredit.index', compact('laporans')); + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) { + //abort(403, 'Sorry! You are not allowed to view laporan admin kredit.'); + } + + // Retrieve data from the database + $query = LaporanAdminKredit::query(); + + if ($request->has('tanggal_awal') && $request->has('tanggal_akhir')) { + $query->whereBetween('tanggal_kunjungan', [$request->tanggal_awal, $request->tanggal_akhir]); + } + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $search_ = json_decode($search); + + if (isset($search_->search)) { + $query->where(function ($q) use ($search_) { + $q->where('kode_register_t24', 'LIKE', '%' . $search_->search . '%') + ->orWhere('jenis_agunan', 'LIKE', '%' . $search_->search . '%') + ->orWhere('nama_pemilik', 'LIKE', '%' . $search_->search . '%') + ->orWhereHas('debiture', function ($query) use ($search_) { + $query->where('name', 'LIKE', '%' . $search_->search . '%'); + }); + }); + } + + if (isset($search_->tanggal_awal) && isset($search_->tanggal_akhir)) { + $query->whereBetween('tanggal_kunjungan', [$search_->tanggal_awal, $search_->tanggal_akhir]); + } + } + + // 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->with(['debiture.branch'])->get(); + + // 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' => $data, + ]); + } + + public function export() + { + return Excel::download(new LaporanAdminKreditExport, 'laporan_admin_kredit.xlsx'); + } + } diff --git a/app/Http/Controllers/PembatalanController.php b/app/Http/Controllers/PembatalanController.php index af65cde..7e735df 100644 --- a/app/Http/Controllers/PembatalanController.php +++ b/app/Http/Controllers/PembatalanController.php @@ -61,12 +61,18 @@ // Update Permohonan Pembatalan if($request->status=='approved'){ $pembatalan->status = 'approved'; + $pembatalan->authorized_at = now(); + $pembatalan->authorized_by = auth()->user()->id; + $pembatalan->authorized_status = 1; $pembatalan->save(); $permohonan->status = 'batal'; $permohonan->save(); } else{ $pembatalan->status = 'rejected'; + $pembatalan->authorized_at = now(); + $pembatalan->authorized_by = auth()->user()->id; + $pembatalan->authorized_status = 3; $pembatalan->save(); } diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index 5aeb88b..ab5897b 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\DB; use Modules\Lpj\Http\Requests\PenilaianRequest; use Modules\Lpj\Models\Authorization; use Modules\Lpj\Models\JenisPenilaian; +use Modules\Lpj\Models\LaporanAdminKredit; use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\PenilaianTeam; use Modules\Lpj\Models\Permohonan; @@ -473,6 +474,7 @@ class PenilaianController extends Controller } else { $permohonan = Permohonan::find($id); } + if (!$permohonan) { return response()->json([ 'message' => 'Data permohonan tidak ditemukan.', @@ -512,6 +514,35 @@ class PenilaianController extends Controller $status = 'done'; } + if($status=='done'){ + $_permohonan = Permohonan::with(['documents.jenisJaminan','penilaian._user_penilai','penilai','documents.detail.jenisLegalitasJaminan'])->find(6); + + if(isset($_permohonan->penilai->lpj)){ + $npw = json_decode($_permohonan->penilai->lpj, true); + $npw = $npw['total_nilai_pasar_wajar'] ?? 0; + } + + $dataAdk = [ + 'debiture_id' => $_permohonan->debiture_id, + 'jenis_agunan' => $_permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), + 'alamat_agunan' => $_permohonan->documents->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + 'nama_pemilik' => $_permohonan->documents->pluck('pemilik.name')->unique()->implode(', '), + 'tanggal_kunjungan' => $_permohonan->penilaian->tanggal_kunjungan, + 'nama_penilai' => $_permohonan->penilaian->_user_penilai->userPenilaiTeam->name, + 'nilai_likuidasi' => $_permohonan->nilai_liquidasi, + 'nilai_pasar_wajar' => str_replace('.', '', $npw), + 'bukti_kepemilikan' => $_permohonan->documents->flatMap(function ($document) { + return $document->detail->map(function ($detail) { + return $detail->jenisLegalitasJaminan->name ?? null; + }); + })->filter()->unique()->implode(', '), + + ]; + LaporanAdminKredit::create($dataAdk); + } + if ($approvalField) { $this->updatePermohonan($permohonan, $status, $approvalField, $request->keterangan); } diff --git a/app/Models/Debiture.php b/app/Models/Debiture.php index 3080ecb..abe9e8a 100644 --- a/app/Models/Debiture.php +++ b/app/Models/Debiture.php @@ -64,4 +64,9 @@ return $this->hasOne(Permohonan::class, 'debiture_id', 'id' ); } + public function laporanAdminKredit(): HasMany + { + return $this->hasMany(LaporanAdminKredit::class); + } + } diff --git a/app/Models/LaporanAdminKredit.php b/app/Models/LaporanAdminKredit.php new file mode 100644 index 0000000..41f6b9d --- /dev/null +++ b/app/Models/LaporanAdminKredit.php @@ -0,0 +1,37 @@ + 'date', + 'nilai_pasar_wajar' => 'decimal:2', + 'nilai_likuidasi' => 'decimal:2', + ]; + + /** + * Get the debiture that owns the laporan admin kredit. + */ + public function debiture(): BelongsTo + { + return $this->belongsTo(Debiture::class); + } +} diff --git a/app/Models/Penilaian.php b/app/Models/Penilaian.php index 7383245..88679b7 100644 --- a/app/Models/Penilaian.php +++ b/app/Models/Penilaian.php @@ -37,6 +37,12 @@ class Penilaian extends Model return $this->hasMany(PenilaianTeam::class, 'penilaian_id', 'id'); } + public function _user_penilai() + { + return $this->hasOne(PenilaianTeam::class, 'penilaian_id', 'id') + ->where('role', 'penilai') + ->with('userPenilaiTeam'); + } public function permohonan() { diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index dc08b61..0759b17 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -114,7 +114,15 @@ $status = $permohonan->status; $beforeRequest = $action === 'updated' ? $permohonan->getOriginal() : []; $afterRequest = $permohonan->toArray(); - $file = $permohonan->dokumen ?? null; + + $file = null; + if (request()->hasFile('attachment')) { + $file = request()->file('attachment'); + $fileName = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); + + $file = $filePath; + } $historyService->createHistory( $permohonan, diff --git a/database/migrations/2025_03_17_024200_create_laporan_admin_kredit_table.php b/database/migrations/2025_03_17_024200_create_laporan_admin_kredit_table.php new file mode 100644 index 0000000..e5217dc --- /dev/null +++ b/database/migrations/2025_03_17_024200_create_laporan_admin_kredit_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignIdFor(Debiture::class)->constrained()->cascadeOnDelete(); + $table->string('kode_register_t24')->nullable(); + $table->string('jenis_agunan')->nullable(); + $table->string('bukti_kepemilikan')->nullable(); + $table->text('alamat_agunan')->nullable(); + $table->string('nama_pemilik')->nullable(); + $table->date('tanggal_kunjungan')->nullable(); + $table->decimal('nilai_pasar_wajar', 15, 2)->nullable(); + $table->decimal('nilai_likuidasi', 15, 2)->nullable(); + $table->string('nama_penilai')->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('laporan_admin_kredit'); + } +}; diff --git a/module.json b/module.json index 694f353..c0302e9 100644 --- a/module.json +++ b/module.json @@ -27,7 +27,7 @@ }, { "title": "Otorisasi Pembatalan Permohonan", - "path": "otorisator.pembatalan", + "path": "pembatalan", "icon": "ki-filled ki-file-deleted text-lg text-info", "classes": "", "attributes": [], @@ -349,6 +349,23 @@ "EO Appraisal", "senior-officer" ] + }, + { + "title": "Laporan Admin Kredit", + "path": "laporan-admin-kredit", + "icon": "ki-filled ki-filter-tablet text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "pemohon-ao", + "pemohon-eo", + "admin", + "DD Appraisal", + "EO Appraisal", + "senior-officer" + ] } ], "master": [ diff --git a/resources/views/laporan_admin_kredit/index.blade.php b/resources/views/laporan_admin_kredit/index.blade.php new file mode 100644 index 0000000..f54455a --- /dev/null +++ b/resources/views/laporan_admin_kredit/index.blade.php @@ -0,0 +1,227 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('laporan-admin-kredit') }} +@endsection + +@section('content') +
+
+
+

+ Daftar Laporan Admin Kredit +

+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
+ + + CIF + + + Kode Register T24 + + + Nama Debitur + + + Cabang + + + Jenis Agunan + + + Bukti Kepemilikan + + + Alamat Agunan + + + Nama Pemilik + + + Tanggal Kunjungan + + + Nilai Pasar Wajar + + + Nilai Likuidasi + + + Nama Penilai + +
+
+ +
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/permohonan/authorization/show.blade.php b/resources/views/permohonan/authorization/show.blade.php index 193999a..e9830af 100644 --- a/resources/views/permohonan/authorization/show.blade.php +++ b/resources/views/permohonan/authorization/show.blade.php @@ -58,7 +58,7 @@ form.addEventListener('submit', function(event) { - if (event.submitter === revisiBtn && keterangan.value.trim() === '') { + if (event.submitter === revisiBtn && keterangan.value() === '') { event.preventDefault(); keteranganMessage.textContent = 'Catatan harus diisi.'; } else { diff --git a/resources/views/permohonan/index.blade.php b/resources/views/permohonan/index.blade.php index c11c62d..79d4548 100644 --- a/resources/views/permohonan/index.blade.php +++ b/resources/views/permohonan/index.blade.php @@ -255,11 +255,13 @@ title="Approve Jadwal Kunjungan No Reg ${data.nomor_registrasi}" `; } - actionHtml += ` + if (data.status !== 'done' && data.status !== 'batal') { + actionHtml += ` `; - if (data.status !== 'batal') { + } + if (data.status === 'order') { actionHtml += ` diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 7e554b8..a00b4e7 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -714,5 +714,10 @@ Breadcrumbs::for('noc', function (BreadcrumbTrail $trail) { $trail->push('Edit Jenis Lampiran', route('basicdata.jenis-lampiran.edit', $id)); }); + // Laporan Admin Kredit + Breadcrumbs::for('laporan-admin-kredit', function ($trail) { + $trail->push('Laporan Admin Kredit', route('laporan-admin-kredit.index')); + }); + // add andy require __DIR__ . '/breadcrumbs_registrasi.php'; diff --git a/routes/web.php b/routes/web.php index 676f125..5a67a4c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,6 +18,7 @@ use Modules\Lpj\Http\Controllers\JenisLegalitasJaminanController; use Modules\Lpj\Http\Controllers\JenisPenilaianController; use Modules\Lpj\Http\Controllers\KJPPController; use Modules\Lpj\Http\Controllers\LampiranDokumenController; + use Modules\Lpj\Http\Controllers\LaporanAdminKreditController; use Modules\Lpj\Http\Controllers\LaporanController; use Modules\Lpj\Http\Controllers\LaporanExternalController; use Modules\Lpj\Http\Controllers\NilaiPlafondController; @@ -658,6 +659,11 @@ Route::middleware(['auth'])->group(function () { Route::delete('lampiran/{lampiran}', [LampiranDokumenController::class, 'delete'])->name('lampiran.delete'); + Route::name('laporan-admin-kredit.')->prefix('laporan-admin-kredit')->group(function () { + Route::get('/', [LaporanAdminKreditController::class, 'index'])->name('index'); + Route::get('datatables', [LaporanAdminKreditController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [LaporanAdminKreditController::class, 'export'])->name('export'); + }); });