feat(webstatement): dukung endPeriod dan format folder baru untuk statement

- Ubah konstruksi path SFTP dan storage lokal agar konsisten dengan format folder baru `YYYYMMDD.YYYYMMDD`
- Tambahkan dukungan periode akhir (`endPeriod`) pada alur cetak dan ekspor statement, lengkap dengan propagasi ke view dan log
- Perkuat logging di controller dan job untuk audit proses, serta sesuaikan penamaan file pada jalur PRINT

Rincian Perubahan
- PrintStatementController.php
  - Ganti path SFTP awal dari `{$period_from}/{$branch_code}/{$account_number}_{$period_from}.pdf` menjadi:
    - `{$periodPath}/PRINT/{$branch_code}/{$account_number}.1.pdf` pada cek file awal
    - Gunakan `$periodPath = formatPeriodForFolder($statement->period_from)` untuk semua referensi path
  - Iterasi ketersediaan periode:
    - Gunakan `formatPeriodForFolder($periodFormatted)` saat membentuk `periodPath` dalam loop bulan
  - Generate atau fetch statement:
    - Ubah path menjadi `{$periodPath}/{$branch_code}/{$account_number}_{$period}.pdf` untuk konsistensi
  - ZIP multi-periode:
    - Cari file ZIP pada `statements/{$periodPath}/multi_account/{$statementId}` sesuai format folder baru
  - Variabel periode:
    - Tambahkan `$endPeriod = $statement->period_to ?? $period` dan propagasikan ke:
      - Pemanggilan `generateStatementPdf($norek, $period, $endPeriod, ...)`
      - View `statements.stmt` melalui `compact(..., 'endPeriod')`
    - Perbarui logging untuk menampilkan `endPeriod`
  - Generate PDF:
    - Tandai storage path menjadi `statements/{$periodPath}/{$norek}`
    - Ubah signature: `generateStatementPdf($norek, $period, $endPeriod, ...)`
  - Akses file lokal/SFTP:
    - Ubah path storage menjadi `statements/{$periodPath}/{$account->branch_code}/{$filename}`
    - Penyesuaian delete path: `statements/{$periodPath}/{$norek}/{$filename}`

- ExportStatementPeriodJob.php
  - Tambah properti dan parameter konstruktor: `$endPeriod`
  - Ubah inisialisasi periode:
    - Ganti `calculatePeriodDates()` menjadi `formatPeriodForFolder()` (metode internal yang menetapkan `startDate` dan `endDate`)
    - Jika `$endPeriod` diisi, jadikan akhir bulan dari `endPeriod` sebagai `endDate` pemrosesan
  - Render view:
    - Tambahkan `endPeriod` ke `compact(...)` agar view mengetahui batas periode akhir
  - Storage path:
    - Gunakan `formatPeriodForFolder($this->period)` untuk path `statements/{$periodPath}/{$account->branch_code}`
  - Controller dispatch:
    - Ubah pemanggilan job menjadi `ExportStatementPeriodJob::dispatch($statementId, $accountNumber, $period, $endPeriod, $balance, $clientName)`

- resources/views/statements/stmt.blade.php
  - Periode:
    - Hitung `periodDates` via `calculatePeriodDates($period)`
    - Jika `endPeriod` ada, gunakan `calculatePeriodDates($endPeriod)` sebagai referensi `endDate`
  - Data customer:
    - Gunakan `$customer` langsung, bukan `$account->customer`
    - Kondisional alamat berdasarkan `stmt_sent_type == 'BY.MAIL.TO.DOM.ADDR'`:
      - Utamakan `l_dom_street` jika tersedia, fallback ke `address`
      - Susun RT/RW/kelurahan/kota/provinsi/kode pos sesuai preferensi pengiriman
  - Format angka:
    - Penyesuaian spasi dan casting `(float)` untuk konsistensi number_format
  - Logging:
    - Tambahkan informasi hasil perhitungan period dates untuk audit
This commit is contained in:
Daeng Deni Mardaeni
2025-11-27 18:15:33 +07:00
parent ea23401473
commit 9373325399
4 changed files with 85 additions and 41 deletions

View File

@@ -38,6 +38,7 @@ class ExportStatementPeriodJob implements ShouldQueue
protected $account_number;
protected $period; // Format: YYYYMM (e.g., 202505)
protected $endPeriod; // Format: YYYYMM (e.g., 202505)
protected $saldo;
protected $disk;
protected $client;
@@ -57,11 +58,12 @@ class ExportStatementPeriodJob implements ShouldQueue
* @param string $client
* @param string $disk
*/
public function __construct(int $statementId, string $account_number, string $period, string $saldo, string $client = '', string $disk = 'local', bool $toCsv = true)
public function __construct(int $statementId, string $account_number, string $period, string $endPeriod, string $saldo, string $client = '', string $disk = 'local', bool $toCsv = true)
{
$this->statementId = $statementId;
$this->account_number = $account_number;
$this->period = $period;
$this->endPeriod = $endPeriod;
$this->saldo = $saldo;
$this->disk = $disk;
$this->client = $client;
@@ -69,13 +71,13 @@ class ExportStatementPeriodJob implements ShouldQueue
$this->toCsv = $toCsv;
// Calculate start and end dates based on period
$this->calculatePeriodDates();
$this->formatPeriodForFolder();
}
/**
* Calculate start and end dates for the given period
*/
private function calculatePeriodDates(): void
private function formatPeriodForFolder(): void
{
$year = substr($this->period, 0, 4);
$month = substr($this->period, 4, 2);
@@ -90,6 +92,13 @@ class ExportStatementPeriodJob implements ShouldQueue
// End date is always the last day of the month
$this->endDate = Carbon::createFromDate($year, $month, 1)->endOfMonth()->endOfDay();
// If endPeriod is provided, use it instead of endDate
if($this->endPeriod){
$year = substr($this->endPeriod, 0, 4);
$month = substr($this->endPeriod, 4, 2);
$this->endDate = Carbon::createFromDate($year, $month, 1)->endOfMonth()->endOfDay();
}
}
/**
@@ -478,8 +487,9 @@ class ExportStatementPeriodJob implements ShouldQueue
// Generate filename
$filename = "{$this->account_number}_{$this->period}.pdf";
// Tentukan path storage
$storagePath = "statements/{$this->period}/{$account->branch_code}";
// Tentukan path storage dengan format folder baru
$periodPath = formatPeriodForFolder($this->period);
$storagePath = "statements/{$periodPath}/{$account->branch_code}";
$tempPath = storage_path("app/temp/{$filename}");
$fullStoragePath = "{$storagePath}/{$filename}";
@@ -492,6 +502,7 @@ class ExportStatementPeriodJob implements ShouldQueue
Storage::makeDirectory($storagePath);
$period = $this->period;
$endPeriod = $this->endPeriod;
// Render HTML view
$html = view('webstatement::statements.stmt', compact(
@@ -501,6 +512,7 @@ class ExportStatementPeriodJob implements ShouldQueue
'headerTableBg',
'branch',
'period',
'endPeriod',
'saldoAwalBulan'
))->render();
@@ -616,7 +628,8 @@ class ExportStatementPeriodJob implements ShouldQueue
// Determine the base path based on client
$account = Account::where('account_number', $this->account_number)->first();
$storagePath = "statements/{$this->period}/{$account->branch_code}";
$periodPath = formatPeriodForFolder($this->period);
$storagePath = "statements/{$periodPath}/{$account->branch_code}";
Storage::disk($this->disk)->makeDirectory($storagePath);
$filePath = "{$storagePath}/{$this->fileName}";