feat(webstatement): optimalkan proses PDF statement dan hapus fitur tidak terpakai

- **Optimalisasi Pembuatan dan Pengunduhan PDF:**
  - Tambahkan validasi untuk mengecek keberadaan file sebelum pembuatan ulang PDF.
  - Tambahkan mekanisme pengunduhan langsung file PDF jika sudah tersedia di storage.
  - Mengelompokkan path penyimpanan dan nama file PDF secara dinamis berdasarkan periode dan nomor rekening.
  - Integrasi update status `is_available` pada tabel `PrintStatementLog` setelah file berhasil dibuat.

- **Refaktor dan Perbaikan Logika Pembuatan PDF:**
  - Perbarui fungsi `generateStatementPdf` untuk mendukung parameter tambahan terkait penyimpanan file.
  - Hapus duplikasi logika terkait pembuatan path storage dan file PDF.
  - Tambahkan handling error untuk memastikan file PDF berhasil dibuat.

- **Hapus Fitur Preview PDF:**
  - Menghapus fungsi `previewPdf()` dan rute terkait karena sudah tidak digunakan.
  - Membersihkan bagian UI yang merujuk pada fitur ini.

- **Peningkatan UI dan Tampilan:**
  - Menghapus kolom `authorization_status` pada tabel karena tidak relevan.
  - Penyesuaian styling pada kolom `is_available` untuk menampilkan status ketersediaan file.

- **Perubahan pada Rute:**
  - Membersihkan rute tidak terpakai terkait preview dan generate PDF langsung.

- **Refaktor Umum:**
  - Menghapus kode redundan yang berhubungan dengan penyimpanan file sementara.
  - Penyesuaian struktur fungsi untuk meningkatkan keterbacaan dan efisiensi.

Perubahan ini memastikan proses PDF statement lebih efisien dengan validasi ketat, pengelolaan file yang lebih baik, serta penyederhanaan sistem dengan menghapus fitur yang tidak relevan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
Daeng Deni Mardaeni
2025-07-09 20:23:52 +07:00
parent 062bac2138
commit 34571483eb
3 changed files with 41 additions and 93 deletions

View File

@@ -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