perf(webstatement): optimasi performa GenerateClosingBalanceReportJob dengan database staging
Perubahan yang dilakukan: - Menambahkan model `ProcessedClosingBalance` untuk menyimpan data sementara laporan closing balance - Membuat migration `processed_closing_balances` dengan 26 kolom dan index komposit untuk query optimal - Mengganti proses langsung ekspor ke CSV menjadi dua tahap: * Tahap 1: Proses dan simpan data ke DB secara bertahap melalui `processAndSaveClosingBalanceData()` * Tahap 2: Ekspor data dari DB ke CSV via `exportFromDatabaseToCsv()` - Menambahkan method: * `deleteExistingProcessedData()` untuk membersihkan data lama * `prepareProcessedClosingBalanceData()` untuk batch insert ke DB * `getProcessedRecordCount()` untuk monitoring progres - Mengoptimalkan memori dengan menghindari akumulasi data dalam array - Menambahkan DB transaction untuk menjamin konsistensi data selama proses - Logging diperluas agar progres lebih mudah dipantau - Menambahkan error handling untuk menangani kegagalan proses dengan aman Keuntungan: - Waktu proses menurun drastis dari 1+ jam menjadi beberapa menit - Skalabilitas meningkat — mampu menangani jutaan record tanpa memory overload - Data hasil olahan dapat diekspor ulang tanpa harus re-process - Pola kerja selaras dengan `ExportStatementJob` untuk konsistensi antar modul - Monitoring dan debugging lebih mudah melalui database dan log Catatan tambahan: - Tabel `processed_closing_balances` mendukung kolom `group_name` untuk segmentasi (QRIS/NON_QRIS) - Menggunakan tipe data numerik dengan presisi untuk nilai keuangan (`amount_lcy`, `balance`, dsb)
This commit is contained in:
47
app/Models/ProcessedClosingBalance.php
Normal file
47
app/Models/ProcessedClosingBalance.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Webstatement\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ProcessedClosingBalance extends Model
|
||||||
|
{
|
||||||
|
protected $fillable = [
|
||||||
|
'account_number',
|
||||||
|
'period',
|
||||||
|
'group_name',
|
||||||
|
'sequence_no',
|
||||||
|
'trans_reference',
|
||||||
|
'booking_date',
|
||||||
|
'transaction_date',
|
||||||
|
'amount_lcy',
|
||||||
|
'debit_acct_no',
|
||||||
|
'debit_value_date',
|
||||||
|
'debit_amount',
|
||||||
|
'credit_acct_no',
|
||||||
|
'bif_rcv_acct',
|
||||||
|
'bif_rcv_name',
|
||||||
|
'credit_value_date',
|
||||||
|
'credit_amount',
|
||||||
|
'at_unique_id',
|
||||||
|
'bif_ref_no',
|
||||||
|
'atm_order_id',
|
||||||
|
'recipt_no',
|
||||||
|
'api_iss_acct',
|
||||||
|
'api_benff_acct',
|
||||||
|
'authoriser',
|
||||||
|
'remarks',
|
||||||
|
'payment_details',
|
||||||
|
'ref_no',
|
||||||
|
'merchant_id',
|
||||||
|
'term_id',
|
||||||
|
'closing_balance'
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'amount_lcy' => 'decimal:2',
|
||||||
|
'debit_amount' => 'decimal:2',
|
||||||
|
'credit_amount' => 'decimal:2',
|
||||||
|
'closing_balance' => 'decimal:2'
|
||||||
|
];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user