From 6d137ad51caa0e3447ee2d70c171902c71a4297b Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Wed, 17 Sep 2025 15:24:27 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20refactor(laporan-slik):=20Perbai?= =?UTF-8?q?kan=20controller=20dan=20routing=20untuk=20laporan=20SLIK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Mengubah nama method datatables menjadi dataForDatatables untuk konsistensi penamaan - Menambahkan method show untuk menampilkan detail laporan SLIK individual - Memperbaiki struktur response datatables dengan format yang lebih lengkap dan konsisten - Menambahkan filter tambahan untuk sandi_bank dan kolektibilitas pada datatables - Mengimplementasikan sorting dan pagination yang lebih robust - Menambahkan error handling yang komprehensif dengan logging - Memperbaiki transformasi data dengan penambahan field kolektibilitas_badge dan created_by - Mengupdate routing untuk menambahkan route show laporan SLIK - Menambahkan breadcrumb untuk halaman laporan SLIK dan detail - Mengubah role akses dari 'noc' menjadi 'adk' pada module.json - Memperbaiki format tanggal menggunakan helper dateFormat - Menambahkan penanganan exception dengan fallback response yang proper - Mengoptimalkan query dengan penambahan filter yang lebih spesifik - Memperbaiki struktur response JSON untuk kompatibilitas dengan frontend datatables --- .../Controllers/LaporanSlikController.php | 169 ++++++++++++------ module.json | 2 +- routes/breadcrumbs.php | 11 ++ routes/web.php | 3 +- 4 files changed, 126 insertions(+), 59 deletions(-) diff --git a/app/Http/Controllers/LaporanSlikController.php b/app/Http/Controllers/LaporanSlikController.php index 8d6af2c..cdcbe4e 100644 --- a/app/Http/Controllers/LaporanSlikController.php +++ b/app/Http/Controllers/LaporanSlikController.php @@ -116,97 +116,152 @@ class LaporanSlikController extends Controller } /** - * Get data for DataTables + * Data untuk datatables dengan server-side processing + * + * @param Request $request + * @return \Illuminate\Http\JsonResponse */ - public function datatables(Request $request) + public function dataForDatatables(Request $request) { try { - $query = LaporanSlik::query() - ->select([ - 'id', - 'sandi_bank', - 'tahun', - 'bulan', - 'no_rekening', - 'cif', - 'nama_debitur', - 'kolektibilitas', - 'fasilitas', - 'nilai_agunan', - 'status_agunan', - 'created_at' - ]); + // Retrieve data from the database + $query = LaporanSlik::query(); - // Apply filters - if ($request->has('search') && $request->search['value']) { - $search = $request->search['value']; - $query->where(function($q) use ($search) { - $q->where('nama_debitur', 'like', "%{$search}%") - ->orWhere('no_rekening', 'like', "%{$search}%") - ->orWhere('cif', 'like', "%{$search}%") - ->orWhere('fasilitas', 'like', "%{$search}%"); + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('sandi_bank', 'LIKE', "%$search%") + ->orWhere('no_rekening', 'LIKE', "%$search%") + ->orWhere('cif', 'LIKE', "%$search%") + ->orWhere('nama_debitur', 'LIKE', "%$search%") + ->orWhere('fasilitas', 'LIKE', "%$search%") + ->orWhere('status_agunan', 'LIKE', "%$search%"); }); } - if ($request->has('year') && $request->year) { - $query->where('tahun', $request->year); + // Apply year filter + if ($request->has('year') && !empty($request->get('year'))) { + $query->where('tahun', $request->get('year')); } - if ($request->has('month') && $request->month) { - $query->where('bulan', $request->month); + // Apply month filter + if ($request->has('month') && !empty($request->get('month'))) { + $query->where('bulan', $request->get('month')); } - if ($request->has('status') && $request->status) { - $query->where('status', $request->status); + // Apply sandi bank filter + if ($request->has('sandi_bank') && !empty($request->get('sandi_bank'))) { + $query->where('sandi_bank', $request->get('sandi_bank')); } + // Apply kolektibilitas filter + if ($request->has('kolektibilitas') && !empty($request->get('kolektibilitas'))) { + $query->where('kolektibilitas', $request->get('kolektibilitas')); + } + + // Apply status filter + if ($request->has('status') && !empty($request->get('status'))) { + $query->where('status', $request->get('status')); + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField', 'created_at'); + $query->orderBy($column, $order); + } else { + $query->orderBy('created_at', 'desc'); + } + + // Get the total count of records $totalRecords = $query->count(); - $filteredRecords = $totalRecords; - // Apply pagination - $start = $request->input('start', 0); - $length = $request->input('length', 10); + // 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 - $data = $query->offset($start)->limit($length)->get(); + $query->skip($offset)->take($size); + } - // Format data - $formattedData = $data->map(function($item) { + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + // Transform data untuk datatables + $transformedData = $data->map(function ($item) { return [ - 'id' => $item->id, - 'sandi_bank' => $item->sandi_bank, - 'tahun' => $item->tahun, - 'bulan' => $item->bulan, - 'no_rekening' => $item->no_rekening, - 'cif' => $item->cif, - 'nama_debitur' => $item->nama_debitur, - 'kolektibilitas' => $item->kolektibilitas, - 'fasilitas' => $item->fasilitas, - 'nilai_agunan_formatted' => $item->nilai_agunan_formatted, - 'status_agunan' => $item->status_agunan, - 'status_badge' => $item->status_badge, - 'created_at' => $item->created_at->format('d/m/Y H:i'), + 'id' => $item->id, + 'sandi_bank' => $item->sandi_bank, + 'tahun' => $item->tahun, + 'bulan' => $item->bulan, + 'no_rekening' => $item->no_rekening, + 'cif' => $item->cif, + 'nama_debitur' => $item->nama_debitur, + 'kolektibilitas' => $item->kolektibilitas, + 'kolektibilitas_badge' => $item->kolektibilitas_badge ?? '', + 'fasilitas' => $item->fasilitas, + 'nilai_agunan' => $item->nilai_agunan_formatted ?? '', + 'status_agunan' => $item->status_agunan, + 'status_badge' => $item->status_badge ?? '', + 'created_by' => $item->creator?->name ?? '-', + 'created_at' => dateFormat($item->created_at, true) ?? $item->created_at->format('d/m/Y H:i') ]; }); + // Calculate the page count + $pageCount = ceil($totalRecords / ($request->get('size', 10))); + + // Calculate the current page number + $currentPage = $request->get('page', 1); + + // Return the response data as a JSON object return response()->json([ - 'draw' => intval($request->input('draw', 1)), - 'recordsTotal' => $totalRecords, + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, - 'data' => $formattedData + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $transformedData, ]); } catch (\Exception $e) { Log::error('Error in laporan slik datatables: ' . $e->getMessage()); return response()->json([ - 'draw' => intval($request->input('draw', 1)), - 'recordsTotal' => 0, + 'draw' => $request->get('draw'), + 'recordsTotal' => 0, 'recordsFiltered' => 0, - 'data' => [] + 'pageCount' => 0, + 'page' => 1, + 'totalCount' => 0, + 'data' => [], ]); } } + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\View\View + */ + public function show($id) + { + try { + $laporanSlik = LaporanSlik::findOrFail($id); + return view('lpj::laporan-slik.show', compact('laporanSlik')); + } catch (\Exception $e) { + Log::error('Error showing laporan slik: ' . $e->getMessage()); + return back()->with('error', 'Data tidak ditemukan'); + } + } + /** * Export laporan SLIK to Excel */ diff --git a/module.json b/module.json index f40e5d3..2e92a12 100644 --- a/module.json +++ b/module.json @@ -418,7 +418,7 @@ "roles": [ "administrator", "admin", - "noc" + "adk" ], "sub": [{ "title": "SLIK", diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 5d59fb1..9a36a8e 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -731,6 +731,12 @@ Breadcrumbs::for('laporan-admin-kredit', function ($trail) { $trail->push('Laporan Admin Kredit', route('admin-kredit.laporan.index')); }); +// Laporan Admin Kredit Laporan SLIK +Breadcrumbs::for('admin-kredit.laporan-slik', function (BreadcrumbTrail $trail) { + $trail->parent('laporan-admin-kredit'); + $trail->push('Laporan SLIK', route('admin-kredit.laporan-slik.index')); +}); + // Laporan Admin Kredit Edit Breadcrumbs::for('laporan-admin-kredit-edit', function (BreadcrumbTrail $trail, $laporanAdminKredit) { $trail->parent('laporan-admin-kredit'); @@ -836,5 +842,10 @@ Breadcrumbs::for('admin-kredit.slik.import-form', function (BreadcrumbTrail $tra $trail->push('Import Data SLIK', route('admin-kredit.slik.import-form')); }); +Breadcrumbs::for('admin-kredit.laporan-slik.show', function (BreadcrumbTrail $trail, $slik) { + $trail->parent('admin-kredit.laporan-slik'); + $trail->push('Detail SLIK #' . $slik->id, route('admin-kredit.laporan-slik.show', $slik)); +}); + // add andy require __DIR__ . '/breadcrumbs_registrasi.php'; diff --git a/routes/web.php b/routes/web.php index 8b48efd..a4eacc1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -809,7 +809,8 @@ Route::middleware(['auth'])->group(function () { // Route Laporan SLIK Route::prefix('laporan-slik')->name('laporan-slik.')->group(function () { Route::get('/', [LaporanSlikController::class, 'index'])->name('index'); - Route::get('datatables', [LaporanSlikController::class, 'datatables'])->name('datatables'); + Route::get('datatables', [LaporanSlikController::class, 'dataForDatatables'])->name('datatables'); + Route::get('{id}', [LaporanSlikController::class, 'show'])->name('show'); Route::post('store', [LaporanSlikController::class, 'store'])->name('store'); Route::get('export', [LaporanSlikController::class, 'export'])->name('export'); });