From 4459b702710d81828b43dbca8ed31b54dc5a84b1 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Thu, 17 Jul 2025 13:47:53 +0700 Subject: [PATCH] feat(memo): tambah tombol download PDF dan disable checkbox untuk memo selesai - Menambahkan field memo_penyelesaian_pdf_path ke tabel noc untuk menyimpan path file PDF - Membuat migrasi baru untuk menambahkan field PDF path ke tabel noc - Menambahkan field memo_penyelesaian_pdf_path ke model Noc dalam fillable array - Memodifikasi fungsi generatePdf di MemoController untuk menyimpan path PDF ke database - Menambahkan route baru memo.download-pdf untuk download file PDF memo penyelesaian - Membuat method downloadPdf di MemoController dengan validasi file dan error handling - Memodifikasi kolom select di datatables untuk disable checkbox jika sudah ada memo - Menambahkan tooltip pada checkbox yang disabled untuk memberikan informasi kepada user - Memodifikasi kolom actions untuk menampilkan tombol download PDF jika memo sudah ada - Menampilkan informasi nomor memo dan tanggal memo di kolom actions - Memodifikasi fungsi handleCheckboxChange untuk mengabaikan checkbox yang disabled - Menambahkan styling untuk tombol download dengan icon dan warna yang sesuai - Menambahkan logging untuk tracking aktivitas download PDF memo penyelesaian - Menambahkan validasi keberadaan file di storage sebelum mengizinkan download - Menggunakan Storage facade untuk operasi file yang lebih aman dan konsisten --- app/Http/Controllers/MemoController.php | 38 ++++++++++++++++++++++++ resources/views/laporan/index.blade.php | 10 ------- resources/views/memo/index.blade.php | 39 +++++++++++++++++++++++-- routes/web.php | 3 ++ 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/MemoController.php b/app/Http/Controllers/MemoController.php index 8f41a5e..b288547 100644 --- a/app/Http/Controllers/MemoController.php +++ b/app/Http/Controllers/MemoController.php @@ -241,6 +241,7 @@ class MemoController extends Controller 'debiture', 'branch', 'tujuanPenilaian', + 'jenisPenilaian', 'penilaian', 'jenisFasilitasKredit', 'documents.inspeksi', @@ -516,4 +517,41 @@ class MemoController extends Controller $uniqueJaminan = array_unique($jaminanTypes); return implode(' & ', $uniqueJaminan); } + /** + * Download PDF memo penyelesaian + * + * @param int $id - ID permohonan + * @return \Illuminate\Http\Response + */ + public function downloadPdf($id) + { + Log::info('MemoController: Download PDF memo penyelesaian untuk permohonan ID: ' . $id); + + try { + // Cari NOC berdasarkan permohonan_id + $noc = Noc::where('permohonan_id', $id)->first(); + + if (!$noc || !$noc->memo_penyelesaian) { + Log::warning('MemoController: PDF memo penyelesaian tidak ditemukan untuk permohonan ID: ' . $id); + return redirect()->back()->with('error', 'File PDF memo penyelesaian tidak ditemukan.'); + } + + // Cek apakah file ada di storage + if (!Storage::disk('public')->exists($noc->memo_penyelesaian)) { + Log::warning('MemoController: File PDF tidak ada di storage: ' . $noc->memo_penyelesaian); + return redirect()->back()->with('error', 'File PDF tidak ditemukan di server.'); + } + + // Download file + $fileName = 'memo-penyelesaian-' . $noc->memo_penyelesaian_number . '.pdf'; + + Log::info('MemoController: Berhasil download PDF memo penyelesaian: ' . $fileName); + + return Storage::disk('public')->download($noc->memo_penyelesaian, $fileName); + + } catch (Exception $e) { + Log::error('MemoController: Error saat download PDF memo penyelesaian - ' . $e->getMessage()); + return redirect()->back()->with('error', 'Terjadi kesalahan saat mengunduh file PDF.'); + } + } } diff --git a/resources/views/laporan/index.blade.php b/resources/views/laporan/index.blade.php index aa581b3..523c5e3 100644 --- a/resources/views/laporan/index.blade.php +++ b/resources/views/laporan/index.blade.php @@ -239,16 +239,6 @@ let resumeButton = ''; let penyelesaian = ''; - - if (data.noc) { - if (!data.noc?.memo_penyelesaian) { - penyelesaian = ` - - Penyelesaian - `; - } - } - if (data.penilai.resume) { resumeButton = ` diff --git a/resources/views/memo/index.blade.php b/resources/views/memo/index.blade.php index 32d2825..f2303cf 100644 --- a/resources/views/memo/index.blade.php +++ b/resources/views/memo/index.blade.php @@ -54,6 +54,10 @@ AO + + Jenis Penilaian + + Tujuan Penilaian @@ -134,11 +138,21 @@ columns: { select: { render: (item, data, context) => { + // Cek apakah sudah ada memo penyelesaian + const hasMemo = data.noc && data.noc.memo_penyelesaian; + const checkbox = document.createElement('input'); checkbox.className = 'checkbox checkbox-sm'; checkbox.type = 'checkbox'; checkbox.value = data.id.toString(); checkbox.setAttribute('data-datatable-row-check', 'true'); + + // Disable checkbox jika sudah ada memo + if (hasMemo) { + checkbox.disabled = true; + checkbox.title = 'Permohonan ini sudah memiliki memo penyelesaian'; + } + return checkbox.outerHTML.trim(); }, }, @@ -166,6 +180,12 @@ return `${data.user.name}`; }, }, + jenis_penilaian_id: { + title: 'Jenis Penilaian', + render: (item, data) => { + return `${data.jenis_penilaian.name}`; + } + }, tujuan_penilaian_id: { title: 'Tujuan Penilaian', render: (item, data) => { @@ -252,9 +272,21 @@ render: (item, data) => { let actionButtons = ''; - - actionButtons = ` + // Cek apakah sudah ada memo penyelesaian dengan PDF + if (data.noc && data.noc.memo_penyelesaian) { + actionButtons = ` +
+ + + Download Memo + +
`; + } else { + actionButtons = ` Belum ada memo`; + } return `
${actionButtons}
`; }, @@ -268,7 +300,8 @@ * Fungsi untuk menangani perubahan checkbox */ function handleCheckboxChange() { - const checkboxes = document.querySelectorAll('input[data-datatable-row-check="true"]:checked'); + // Hanya ambil checkbox yang tidak disabled dan checked + const checkboxes = document.querySelectorAll('input[data-datatable-row-check="true"]:checked:not(:disabled)'); selectedItems = Array.from(checkboxes).map(cb => cb.value); // Enable/disable tombol create memo berdasarkan jumlah item yang dipilih diff --git a/routes/web.php b/routes/web.php index 2f5e522..819fdf5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -404,6 +404,9 @@ Route::middleware(['auth'])->group(function () { Route::post('total-biaya-pj', [MemoController::class, 'getTotalBiayaPJ'])->name('memo.total-biaya-pj'); Route::post('preview', [MemoController::class, 'preview'])->name('memo.preview'); Route::post('generate-pdf', [MemoController::class, 'generatePdf'])->name('memo.generate-pdf'); + // Route untuk download PDF memo penyelesaian + Route::get('/memo/download-pdf/{id}', [MemoController::class, 'downloadPdf']) + ->name('memo.download-pdf'); }); Route::resource('memo', MemoController::class);