From f227093c95d52b9fd270f84b0c139814c8a33e82 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 14 Apr 2025 09:15:27 +0700 Subject: [PATCH 1/4] refactor(permohonan-pembatalan): perbaiki relasi dan nama metode - Menghapus import yang tidak digunakan untuk model Permohonan. - Mengganti nama metode 'creator' menjadi 'user' untuk konsistensi. - Menambahkan metode 'authorizedUser' untuk relasi dengan pengguna yang mengotorisasi. --- app/Models/PermohonanPembatalan.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Models/PermohonanPembatalan.php b/app/Models/PermohonanPembatalan.php index 1197b2f..6626d08 100644 --- a/app/Models/PermohonanPembatalan.php +++ b/app/Models/PermohonanPembatalan.php @@ -5,7 +5,6 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; - use Modules\Lpj\Models\Permohonan; use Modules\Usermanagement\Models\User; class PermohonanPembatalan extends Base @@ -44,7 +43,11 @@ return $this->belongsTo(Permohonan::class, 'permohonan_id'); } - public function creator(){ + public function user(){ return $this->belongsTo(User::class, 'created_by'); } + + public function authorizedUser(){ + return $this->belongsTo(User::class, 'authorized_by'); + } } From 15e75c286c5572338ad297a0c51cb662ea017677 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 14 Apr 2025 09:16:07 +0700 Subject: [PATCH 2/4] feat(laporan-pembatalan): tambahkan fitur laporan pembatalan - Menambahkan controller LaporanPembatalanController untuk mengelola laporan pembatalan. - Menyediakan metode untuk menampilkan halaman laporan dan mengekspor data ke Excel. - Mengimplementasikan filter pencarian berdasarkan tanggal, cabang, dan status. - Menyediakan pagination dan sorting untuk data laporan. - Menambahkan tampilan blade untuk laporan pembatalan dengan elemen UI yang diperlukan. --- .../LaporanPembatalanController.php | 140 +++++++++ .../views/laporan_pembatalan/index.blade.php | 283 ++++++++++++++++++ 2 files changed, 423 insertions(+) create mode 100644 app/Http/Controllers/LaporanPembatalanController.php create mode 100644 resources/views/laporan_pembatalan/index.blade.php diff --git a/app/Http/Controllers/LaporanPembatalanController.php b/app/Http/Controllers/LaporanPembatalanController.php new file mode 100644 index 0000000..3f8fc5f --- /dev/null +++ b/app/Http/Controllers/LaporanPembatalanController.php @@ -0,0 +1,140 @@ +user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = PermohonanPembatalan::query(); + + + if (!Auth::user()->hasAnyRole(['administrator'])) { + $query = $query->whereHas('permohonan', function ($q) { + $q->where('branch_id', Auth::user()->branch_id); + }); + } + + $query = $query->orderBy('created_at', 'desc'); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = json_decode($request->get('search')); + + if (isset($search->start_date) || isset($search->end_date)) { + $query->whereBetween('created_at', [ + $search->start_date ?? '1900-01-01', + $search->end_date ?? now()->toDateString() + ]); + } + + // Filter by branch if provided + if (isset($search->branch_id) && !empty($search->branch_id)) { + $query->whereHas('permohonan', function ($q) use ($search) { + $q->where('branch_id', $search->branch_id); + }); + } + + if (isset($search->search)) { + $query->where(function ($q) use ($search) { + $q->whereHas('permohonan', function ($subq) use ($search) { + $subq->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%'); + $subq->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); + $subq->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); + }); + $q->orWhere('alasan_pembatalan', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search->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(); + $size = $request->get('size', 10); + if ($size == 0) { + $size = 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 + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + $data = $data->map(function ($item) { + return [ + 'id' => $item->id, + 'nomor_registrasi' => $item->permohonan->nomor_registrasi ?? '-', + 'tanggal_permohonan' => $item->permohonan->tanggal_permohonan ? date('d-m-Y', strtotime($item->permohonan->tanggal_permohonan)) : '-', + 'tanggal_pembatalan' => date('d-m-Y', strtotime($item->created_at)), + 'cabang' => $item->permohonan->branch->name ?? '-', + 'pemohon' => $item->permohonan->user->name ?? '-', + 'debitur' => $item->permohonan->debiture->name ?? '-', + 'alasan_pembatalan' => $item->alasan_pembatalan, + 'status' => $item->status, + 'diajukan_oleh' => $item->user->name ?? '-', + 'disetujui_oleh' => $item->authorized_by ? $item->authorizedUser->name : '-', + 'tanggal_disetujui' => $item->authorized_at ? formatTanggalIndonesia(strtotime($item->authorized_at),1) : '-' + ]; + }); + + + // Calculate the page count + $pageCount = ceil($totalRecords / $size); + + // Calculate the current page number + $currentPage = max(1, $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, + ]); + } + } diff --git a/resources/views/laporan_pembatalan/index.blade.php b/resources/views/laporan_pembatalan/index.blade.php new file mode 100644 index 0000000..60f9dad --- /dev/null +++ b/resources/views/laporan_pembatalan/index.blade.php @@ -0,0 +1,283 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render('laporan-pembatalan') }}--}} +@endsection + +@section('content') +
+
+
+

+ Laporan Pembatalan +

+
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + Nomor Registrasi + + + Tanggal Permohonan + + + Tanggal Pembatalan + + + Cabang + + + Pemohon + + + Debitur + + + Alasan Pembatalan + + + Status + + + Diajukan Oleh + + + Disetujui Oleh + + + Tanggal Disetujui + +
+
+ +
+
+
+@endsection + +@push('scripts') + +@endpush From 8e081e69688962d8e61e3015f54c064e353422f6 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 14 Apr 2025 09:16:30 +0700 Subject: [PATCH 3/4] feat(laporan-pembatalan): tambahkan fitur ekspor laporan pembatalan - Menambahkan kelas LaporanPembatalanExport untuk mengelola ekspor data laporan pembatalan. - Mengimplementasikan filter pencarian berdasarkan nomor registrasi, nama pemohon, dan nama cabang. - Menyediakan opsi untuk memfilter berdasarkan rentang tanggal, status, dan cabang. - Menyusun data yang diekspor dengan format yang sesuai untuk laporan. --- app/Exports/LaporanPembatalanExport.php | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 app/Exports/LaporanPembatalanExport.php diff --git a/app/Exports/LaporanPembatalanExport.php b/app/Exports/LaporanPembatalanExport.php new file mode 100644 index 0000000..b44afe2 --- /dev/null +++ b/app/Exports/LaporanPembatalanExport.php @@ -0,0 +1,102 @@ +request = $request; + } + + public function collection() + { + $query = PermohonanPembatalan::where('status', 'batal'); + + if (!Auth::user()->hasAnyRole(['administrator'])) { + $query = $query->whereHas('permohonan', function ($q) { + $q->where('branch_id', Auth::user()->branch_id); + }); + } + + // Apply search filter if provided + if ($this->request->has('search') && !empty($this->request->get('search'))) { + $search = $this->request->get('search'); + $query->where(function ($q) use ($search) { + $q->whereHas('permohonan', function ($subq) use ($search) { + $subq->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $subq->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $subq->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + }); + $q->orWhere('alasan', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // Filter by date range if provided + if ($this->request->has('start_date') || $this->request->has('end_date')) { + $query->whereBetween('created_at', [ + $this->request->get('start_date') ?? '1900-01-01', + $this->request->get('end_date') ?? now()->toDateString() + ]); + } + + // Filter by status if provided + if ($this->request->has('status') && !empty($this->request->get('status'))) { + $query->where('status', $this->request->get('status')); + } + + // Filter by branch if provided + if ($this->request->has('branch_id') && !empty($this->request->get('branch_id'))) { + $query->whereHas('permohonan', function ($q) { + $q->where('branch_id', $this->request->get('branch_id')); + }); + } + + return $query->orderBy('created_at', 'desc') + ->get(); + } + + public function headings(): array + { + return [ + 'No. Registrasi', + 'Tanggal Permohonan', + 'Tanggal Pembatalan', + 'Cabang', + 'Pemohon', + 'Debitur', + 'Alasan Pembatalan', + 'Status', + 'Diajukan Oleh', + 'Disetujui Oleh', + 'Tanggal Disetujui' + ]; + } + + public function map($pembatalan): array + { + return [ + $pembatalan->permohonan->nomor_registrasi ?? '-', + $pembatalan->permohonan->tanggal_permohonan ? date('d-m-Y', strtotime($pembatalan->permohonan->tanggal_permohonan)) : '-', + date('d-m-Y', strtotime($pembatalan->created_at)), + $pembatalan->permohonan->branch->name ?? '-', + $pembatalan->permohonan->user->name ?? '-', + $pembatalan->permohonan->debiture->name ?? '-', + $pembatalan->alasan_pembatalan, + $pembatalan->status, + $pembatalan->user->name ?? '-', + $pembatalan->authorized_by ? $pembatalan->authorizedUser->name : '-', + $pembatalan->authorized_at ? formatTanggalIndonesia(strtotime($pembatalan->authorized_at),1) : '-' + ]; + } + } From 1c1eee8e3a1378e89edf79dbecea696b3f75e311 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 14 Apr 2025 09:16:47 +0700 Subject: [PATCH 4/4] feat(laporan-pembatalan): tambahkan fitur laporan pembatalan - Menambahkan entri menu untuk "Laporan Pembatalan" di module.json. - Menambahkan rute untuk laporan pembatalan di web.php. - Menghubungkan rute dengan LaporanPembatalanController untuk mengelola data laporan. --- module.json | 17 +++++++++++++++++ routes/web.php | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/module.json b/module.json index ee72503..a5e17be 100644 --- a/module.json +++ b/module.json @@ -30,6 +30,23 @@ "senior-officer" ] }, + { + "title": "Laporan Pembatalan", + "path": "laporan-pembatalan", + "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" + ] + }, { "title": "Laporan Admin Kredit", "path": "laporan-admin-kredit", diff --git a/routes/web.php b/routes/web.php index 8d079e5..cb892c2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,6 +22,7 @@ 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\LaporanPembatalanController; use Modules\Lpj\Http\Controllers\LaporanPermohonanController; use Modules\Lpj\Http\Controllers\NilaiPlafondController; use Modules\Lpj\Http\Controllers\NocController; @@ -692,6 +693,13 @@ Route::middleware(['auth'])->group(function () { Route::get('/', [LaporanPermohonanController::class, 'index'])->name('index'); }); + // Laporan Pembatalan routes + Route::prefix('laporan-pembatalan')->name('laporan-pembatalan.')->group(function () { + Route::get('/', [LaporanPembatalanController::class, 'index'])->name('index'); + Route::get('/data', [LaporanPembatalanController::class, 'dataForDatatables'])->name('data'); + Route::get('/export', [LaporanPembatalanController::class, 'export'])->name('export'); + }); + }); require __DIR__ . '/registrasi.php';