diff --git a/app/Http/Controllers/PrintStatementController.php b/app/Http/Controllers/PrintStatementController.php index 4722829..fd6769a 100644 --- a/app/Http/Controllers/PrintStatementController.php +++ b/app/Http/Controllers/PrintStatementController.php @@ -277,6 +277,10 @@ ini_set('max_execution_time', 300000); return back()->with('error', 'Statement is not available for download.'); } + if($statement->is_generated){ + return $this->generated($statement->id); + } + DB::beginTransaction(); try { @@ -796,16 +800,38 @@ ini_set('max_execution_time', 300000); * @param string|null $format Format output: 'html' atau 'pdf' * @return \Illuminate\View\View|\Illuminate\Http\Response */ - public function generated($norek, $period='202505', $format = 'html'){ + public function generated($id){ try { + $statement = PrintStatementLog::find($id); + DB::beginTransaction(); - Log::info('Generating statement', [ - 'account_number' => $norek, - 'period' => $period, - 'format' => $format, - 'user_id' => Auth::id() - ]); + $norek = $statement->account_number; + $period = $statement->period_from; + $format='pdf'; + + + + + // Generate nama file PDF + $filename = $this->generatePdfFileName($norek, $period); + + // Tentukan path storage + $storagePath = "statements/{$period}/{$norek}"; + $fullStoragePath = "{$storagePath}/{$filename}"; + + // Pastikan direktori storage ada + Storage::disk('local')->makeDirectory($storagePath); + + // Path temporary untuk Browsershot + $tempPath = storage_path("app/{$fullStoragePath}"); + + if(file_exists($tempPath)){ + return response()->download($tempPath, $filename, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'attachment; filename="' . $filename . '"' + ])->deleteFileAfterSend(false); // Keep file in storage + } $stmtEntries = ProcessedStatement::where(['account_number' => $norek, 'period' => $period])->orderBy('sequence_no')->get(); $account = Account::with('customer')->where('account_number', $norek)->first(); @@ -855,7 +881,7 @@ ini_set('max_execution_time', 300000); // Jika format adalah PDF, generate PDF if ($format === 'pdf') { - return $this->generateStatementPdf($norek, $period, $stmtEntries, $account, $customer, $headerTableBg, $branch, $saldoAwalBulan); + return $this->generateStatementPdf($norek, $period, $stmtEntries, $account, $customer, $headerTableBg, $branch, $saldoAwalBulan, $statement->id, $tempPath, $filename); } // Default return HTML view @@ -897,7 +923,7 @@ ini_set('max_execution_time', 300000); * @param object $saldoAwalBulan Data saldo awal * @return \Illuminate\Http\Response */ - protected function generateStatementPdf($norek, $period, $stmtEntries, $account, $customer, $headerTableBg, $branch, $saldoAwalBulan) + protected function generateStatementPdf($norek, $period, $stmtEntries, $account, $customer, $headerTableBg, $branch, $saldoAwalBulan, $statementId, $tempPath, $filename) { try { DB::beginTransaction(); @@ -918,20 +944,10 @@ ini_set('max_execution_time', 300000); 'period', 'saldoAwalBulan' ))->render(); - - // Generate nama file PDF - $filename = $this->generatePdfFileName($norek, $period); - // Tentukan path storage $storagePath = "statements/{$period}/{$norek}"; $fullStoragePath = "{$storagePath}/{$filename}"; - // Pastikan direktori storage ada - Storage::disk('local')->makeDirectory($storagePath); - - // Path temporary untuk Browsershot - $tempPath = storage_path("app/{$fullStoragePath}"); - // Generate PDF menggunakan Browsershot dan simpan langsung ke storage Browsershot::html($html) ->showBackground() @@ -945,6 +961,11 @@ ini_set('max_execution_time', 300000); // Verifikasi file berhasil dibuat if (!file_exists($tempPath)) { throw new Exception('PDF file was not created successfully'); + } else { + $printLog = PrintStatementLog::find($statementId); + if($printLog){ + $printLog->update(['is_available' => true]); + } } $fileSize = filesize($tempPath); @@ -1188,43 +1209,6 @@ ini_set('max_execution_time', 300000); } } - /** - * Generate PDF dan return sebagai stream untuk preview - * - * @param string $norek Nomor rekening - * @param string $period Periode - * @return \Illuminate\Http\Response - */ - public function previewPdf($norek, $period = '202505') - { - try { - Log::info('Generating PDF preview', [ - 'account_number' => $norek, - 'period' => $period, - 'user_id' => Auth::id() - ]); - - // Generate PDF dengan format parameter - $response = $this->generated($norek, $period, 'pdf'); - - // Ubah header untuk preview di browser - return $response->header('Content-Disposition', 'inline; filename="statement_preview.pdf"'); - - } catch (Exception $e) { - Log::error('Failed to generate PDF preview', [ - 'error' => $e->getMessage(), - 'account_number' => $norek, - 'period' => $period - ]); - - return response()->json([ - 'success' => false, - 'message' => 'Failed to generate PDF preview', - 'error' => $e->getMessage() - ], 500); - } - } - /** * Menghitung period untuk pengambilan saldo berdasarkan aturan bisnis * - Jika period = 202505, gunakan 20250510 diff --git a/resources/views/statements/index.blade.php b/resources/views/statements/index.blade.php index ef263cf..9e7d586 100644 --- a/resources/views/statements/index.blade.php +++ b/resources/views/statements/index.blade.php @@ -186,10 +186,6 @@ Period - - Status - - Available @@ -376,22 +372,6 @@ return fromPeriod + toPeriod; }, }, - authorization_status: { - title: 'Status', - render: (item, data) => { - let statusClass = 'badge badge-light-primary'; - - if (data.authorization_status === 'approved') { - statusClass = 'badge badge-light-success'; - } else if (data.authorization_status === 'rejected') { - statusClass = 'badge badge-light-danger'; - } else if (data.authorization_status === 'pending') { - statusClass = 'badge badge-light-warning'; - } - - return `${data.authorization_status}`; - }, - }, is_available: { title: 'Available', render: (item, data) => { diff --git a/routes/web.php b/routes/web.php index b9800fd..cd1833b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -91,7 +91,7 @@ Route::middleware(['auth'])->group(function () { }); Route::resource('statements', PrintStatementController::class); - + // ATM Transaction Report Routes Route::group(['prefix' => 'atm-reports', 'as' => 'atm-reports.', 'middleware' => ['auth']], function () { @@ -112,24 +112,8 @@ Route::middleware(['auth'])->group(function () { Route::resource('email-statement-logs', EmailStatementLogController::class)->only(['index', 'show']); }); -Route::get('migrasi', [MigrasiController::class, 'index'])->name('migrasi.index'); -Route::get('biaya-kartu', [SyncLogsController::class, 'index'])->name('biaya-kartu.index'); - -Route::get('/stmt-entries/{accountNumber}', [MigrasiController::class, 'getStmtEntryByAccount']); -Route::get('/stmt-entries/{accountNumber}', [PrintStatementController::class, 'generated']); Route::get('/stmt-export-csv', [WebstatementController::class, 'index'])->name('webstatement.index'); -// Route untuk generate PDF -Route::get('/statements/{norek}/pdf/{period?}', [PrintStatementController::class, 'generated']) - ->defaults('format', 'pdf') - ->name('statements.pdf'); - -// Route untuk preview PDF -Route::get('/statements/{norek}/preview/{period?}', [PrintStatementController::class, 'previewPdf']) - ->name('statements.preview'); - - - Route::prefix('debug')->group(function () { Route::get('/test-statement',[WebstatementController::class,'printStatementRekening'])->name('webstatement.test'); Route::post('/statement', [DebugStatementController::class, 'debugStatement'])->name('debug.statement');