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