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

@@ -288,8 +288,12 @@
@php
// Hitung tanggal periode berdasarkan $period
$periodDates = calculatePeriodDates($period);
// Jika endPeriod ada, gunakan endPeriod sebagai batas akhir, jika tidak, gunakan period
$endPeriodDate = $endPeriod ? calculatePeriodDates($endPeriod) : $periodDates;
$startDate = $periodDates['start'];
$endDate = $periodDates['end'];
$endDate = $endPeriodDate['end'] ?? $periodDates['end'];
// Log hasil perhitungan
\Log::info('Period dates calculated', [
@@ -366,13 +370,22 @@
<div class="column">
<p>{{ $branch->name }}</p>
<p style="text-transform: capitalize">Kepada</p>
<p>{{ $account->customer->name }}</p>
<p>{{ $account->customer->address }}</p>
<p>{{ $account->customer->district }}
{{ ($account->customer->ktp_rt ?: $account->customer->home_rt) ? 'RT ' . ($account->customer->ktp_rt ?: $account->customer->home_rt) : '' }}
{{ ($account->customer->ktp_rw ?: $account->customer->home_rw) ? 'RW ' . ($account->customer->ktp_rw ?: $account->customer->home_rw) : '' }}
</p>
<p>{{ trim($account->customer->city . ' ' . ($account->customer->province ? getProvinceCoreName($account->customer->province) . ' ' : '') . ($account->customer->postal_code ?? '')) }}
<p>{{ $customer->name }}</p>
@if ($account->stmt_sent_type == 'BY.MAIL.TO.DOM.ADDR')
<p>{{ $customer->l_dom_street ?? $customer->address }}</p>
<p>{{ $customer->district }}
{{ ($customer->ktp_rt ?: $customer->home_rt) ? 'RT ' . ($customer->ktp_rt ?: $customer->home_rt) : '' }}
{{ ($customer->ktp_rw ?: $customer->home_rw) ? 'RW ' . ($customer->ktp_rw ?: $customer->home_rw) : '' }}
</p>
<p>{{ trim($customer->city . ' ' . ($customer->province ? getProvinceCoreName($customer->province) . ' ' : '') . ($customer->postal_code ?? '')) }}
@else
<p>{{ $customer->address }}</p>
<p>{{ $customer->district }}
{{ ($customer->ktp_rt ?: $customer->home_rt) ? 'RT ' . ($customer->ktp_rt ?: $customer->home_rt) : '' }}
{{ ($customer->ktp_rw ?: $customer->home_rw) ? 'RW ' . ($customer->ktp_rw ?: $customer->home_rw) : '' }}
</p>
<p>{{ trim($customer->city . ' ' . ($customer->province ? getProvinceCoreName($customer->province) . ' ' : '') . ($customer->postal_code ?? '')) }}
@endif
</p>
</div>
<div style="text-transform: capitalize;" class="column">
@@ -408,7 +421,7 @@
<td class="text-right">&nbsp;</td>
<td class="text-right">&nbsp;</td>
<td class="text-right">
<strong>{{ number_format((float)$saldoAwalBulan->actual_balance, 2, ',', '.') }}</strong>
<strong>{{ number_format((float) $saldoAwalBulan->actual_balance, 2, ',', '.') }}</strong>
</td>
</tr>
@@ -443,10 +456,12 @@
<td class="text-center">{{ substr($row->actual_date, 0, 10) }}</td>
<td>{{ str_replace(['[', ']'], ' ', $narrativeLines[0] ?? '') }}</td>
<td>{{ $row->reference_number }}</td>
<td class="text-right">{{ $debit > 0 ? number_format((float)$debit, 2, ',', '.') : '' }}</td>
<td class="text-right">{{ $kredit > 0 ? number_format((float)$kredit, 2, ',', '.') : '' }}
<td class="text-right">
{{ $debit > 0 ? number_format((float) $debit, 2, ',', '.') : '' }}</td>
<td class="text-right">
{{ $kredit > 0 ? number_format((float) $kredit, 2, ',', '.') : '' }}
</td>
<td class="text-right">{{ number_format((float)$saldo, 2, ',', '.') }}</td>
<td class="text-right">{{ number_format((float) $saldo, 2, ',', '.') }}</td>
</tr>
@for ($i = 1; $i < count($narrativeLines); $i++)
<tr class="narrative-line">