- 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
- Memberikan akses penuh fitur multi-branch untuk role `administrator` dan `sentra_operasi`.
- Menambahkan akun untuk client **SILOT** dalam daftar monitoring.
- Menonaktifkan validasi duplikasi statement di `PrintStatementRequest`.
- Memindahkan struktur penyimpanan file dari `statements/{client}` menjadi `partners/{client}`.
- Menambahkan pengurutan hasil berdasarkan `branch_code` dan `account_number` untuk laporan.
- Memperbaiki tampilan dropdown branch dan menyembunyikan field `end_date` yang tidak relevan.
- Menghapus opsi `NO.PRINT` dari dropdown `stmt_sent_type` untuk penyederhanaan UI.
- Peningkatan UI dan struktur direktori untuk mempermudah pembacaan dan pengelolaan statement.
- **WebstatementController.php**:
- Menyederhanakan fungsi `index()` dengan mengubah parameter menjadi langsung `string $queueName='default'`.
- Menghapus pengambilan parameter `$queueName` dari objek `Request`.
- **ExportStatementPeriodJob.php**:
- Memperbaiki perhitungan saldo berjalan (`running balance`) dengan mempertimbangkan mata uang.
- Menambahkan logika penggunaan `amount_fcy` jika mata uang bukan IDR.
- Menyesuaikan tipe transaksi (D/C) menggunakan nilai `amount` yang telah disesuaikan.
- **GenerateBiayaKartuCsvJob.php**:
- Mengubah daftar produk yang dikecualikan menjadi `['6031','6021','6042']`.
- Memperbaiki filter khusus dengan mengecualikan `product_code` 6004 jika `ctdesc` = CLASSIC.
- Menambahkan kolom hash unik 16 digit pada data CSV untuk identifikasi setiap record.
- **ProcessCustomerDataJob.php**:
- Menambahkan mapping baru `name_1` → `name` pada `getHeaderMapping`.
- Menambahkan logging untuk field `fillable` agar debugging lebih mudah.
- Tambah 13 field alamat KTP & domisili di tabel customers (nullable, aman untuk rollback)
- Update model Customer: fillable & casting tanggal
- ProcessCustomerDataJob: header CSV dinamis, mapping otomatis, trim value
- Batch save pakai DB::transaction(), logging detail, error handling lengkap
- Fleksibel untuk CSV dengan header bervariasi & backward-compatible
- Hapus transaksi bersarang:
- Pindahkan DB::beginTransaction() & DB::commit() dari processAndSaveClosingBalanceData() ke handle() menggunakan DB::transaction()
- Cegah error max_lock_per_transaction pada PostgreSQL
- Implementasi batch processing:
- Tambah metode batchUpdateOrCreate()
- Ambil data existing dalam satu query via whereIn()
- Pisahkan data menjadi toInsert & toUpdate
- Gunakan DB::table()->insert() untuk batch insert
- Lakukan update individual untuk data yang sudah ada
- Penyederhanaan error handling:
- Hapus try-catch di processAndSaveClosingBalanceData() karena sudah ditangani di handle()
- Penambahan logging:
- Tambah log informasi untuk monitoring batch insert/update
- Optimasi performa:
- Kurangi beban database & mencegah duplikasi data
- Gunakan pendekatan "delete-first, then insert" seperti ExportStatementJob
- Menambahkan method `updateOrCreate` untuk penanganan duplikasi yang lebih efisien
- Menghapus method `deleteExistingProcessedDataWithVerification` dengan verifikasi kompleks
- Menghapus method `verifyNoDuplicatesAfterInsert` yang tidak diperlukan lagi
- Menghapus method `generateReportData` yang sudah tidak digunakan
- Menghapus method `buildReportDataRow` yang menjadi bagian dari method di atas
- Menghapus method `exportToCsv` yang sudah tidak relevan
- Menyederhanakan query penghapusan data dengan menghapus kondisi `group_name`
- Mengubah pendekatan dari insertOrIgnore menjadi updateOrCreate untuk penanganan duplikasi
- Menghapus kode yang tidak digunakan untuk mengurangi kompleksitas
- Menghapus logika duplikasi yang kompleks dengan unique_hash dan pengecekan duplikasi
- Menyederhanakan proses delete data existing seperti pada ExportStatementJob
- Menghapus lock table dan verifikasi duplikasi yang rumit
- Menggunakan pendekatan langsung: hapus data lama -> proses ulang -> insert baru
- Menghapus field unique_hash yang tidak diperlukan lagi
- Menyederhanakan query builder tanpa eliminasi duplicate yang kompleks
Perubahan ini mengikuti pola yang sudah terbukti berhasil pada ExportStatementJob,
yang tidak memiliki masalah duplikasi dengan pendekatan yang lebih sederhana.
Memperbaiki logika ekspor CSV laporan penutupan saldo untuk memastikan konsistensi data dan urutan sequence yang benar.
Perubahan yang dilakukan:
• Menambahkan pengecekan unique_hash untuk mencegah duplikasi data dalam file CSV
• Mengimplementasikan array $processedHashes untuk melacak unique_hash yang sudah diproses
• Mengganti sequence_no dari database dengan counter yang bertambah ($sequenceCounter++)
• Menghapus groupBy('unique_hash') dari query untuk kontrol duplikasi yang lebih baik
• Menambahkan logging untuk record yang di-skip karena duplikasi unique_hash
• Menambahkan logging untuk tracking jumlah record yang diproses per chunk
• Menggunakan reference (&$sequenceCounter, &$processedHashes) untuk konsistensi data antar chunk
• Memastikan sequence number berurutan tanpa gap dimulai dari 1
Perbaikan masalah duplikasi pada laporan penutupan saldo dengan pendekatan hash unik dan query insert yang toleran terhadap duplikasi.
Perubahan:
- Tambah kolom `unique_hash` pada tabel `processed_closing_balances` (via migrasi `2025_07_31_035159_add_unique_hash_field_to_processed_closing_balances_table.php`)
- Tambah field `unique_hash` ke `$fillable` pada model `ProcessedClosingBalance`
- Update logika generate unique key di `prepareProcessedClosingBalanceData()` menggunakan `md5(trans_reference + '_' + amount_lcy)`
- Query pencarian duplikasi berdasarkan `unique_hash`, bukan `trans_reference` saja
- Ganti `insert()` dengan `insertOrIgnore()` untuk mencegah error saat insert duplikat data
Dampak:
- Duplikasi data dihindari secara efektif lewat hash unik
- Tidak ada error meski data duplicate ditemukan, karena query otomatis mengabaikannya
- `trans_reference` yang sama tetap valid selama nilai `amount_lcy` berbeda
- Data laporan lebih konsisten dan terhindar dari konflik constraint
- Mengubah kriteria pengecekan duplikasi dari hanya trans_reference menjadi kombinasi trans_reference + amount_lcy
- Memperbarui query existingReferences untuk memeriksa kombinasi trans_reference dan amount_lcy
- Memperbolehkan trans_reference yang sama selama amount_lcy berbeda value
- Menambahkan validasi yang lebih presisi untuk mencegah duplikasi data yang sebenarnya
- Mengurangi false positive pada pengecekan duplikasi
Perubahan komprehensif pada GenerateClosingBalanceReportJob.php untuk mengatasi masalah duplikasi data dan meningkatkan performa:
**Perbaikan Duplikasi Data:**
- Menambahkan metode deleteExistingProcessedDataWithVerification() untuk penghapusan data yang lebih aman dengan verifikasi lengkap
- Implementasi verifyNoDuplicatesAfterInsert() untuk memastikan tidak ada duplikasi setelah insert data
- Penyederhanaan logika pengecekan duplikasi berdasarkan trans_reference dan amount_lcy saja, mengingat trans_reference bersifat unik secara global
- Perbaikan buildTransactionQuery() dengan eliminasi duplikasi yang lebih efektif menggunakan subquery
**Fitur Export CSV:**
- Menambahkan metode exportFromDatabaseToCsv() untuk export data langsung dari database ke CSV dengan performa tinggi
- Implementasi chunking untuk menangani dataset besar secara efisien
- Pengurutan data berdasarkan booking_date dan transaction_date untuk konsistensi output
- Struktur header CSV yang lengkap dengan 26 kolom sesuai kebutuhan laporan
**Utilitas Tambahan:**
- Menambahkan getProcessedRecordCount() untuk monitoring jumlah record yang diproses
- Implementasi getOpeningBalance() dengan logika penanganan periode sebelumnya
- Perbaikan handling untuk periode khusus (20250512) dengan pengurangan 2 hari
- Fallback ke saldo 0 jika account balance tidak ditemukan
**Optimasi Query:**
- Perbaikan eager loading pada relasi 'ft' dan 'dc' dengan select kolom spesifik
- Implementasi subquery untuk mendapatkan ID unik berdasarkan kombinasi trans_reference dan amount_lcy
- Penggunaan MIN(id) dan MIN(date_time) untuk konsistensi data
**Logging dan Monitoring:**
- Penambahan logging komprehensif di setiap tahap proses
- Monitoring ukuran file dan verifikasi keberhasilan export
- Warning log untuk kasus account balance tidak ditemukan
- Info log untuk tracking opening balance dan processed record count
**Perbaikan Teknis:**
- Fix syntax error pada import ShouldQueue (menambahkan semicolon yang hilang)
- Perbaikan indentasi dan formatting kode untuk konsistensi
- Penambahan spacing yang tepat antar metode
**Dampak:**
- Eliminasi duplikasi data pada tabel processed_closing_balances
- Peningkatan performa export dengan chunking dan direct database access
- Konsistensi data yang lebih baik dengan verifikasi berlapis
- Monitoring dan debugging yang lebih mudah dengan logging yang komprehensif
- Kemudahan maintenance dengan struktur kode yang lebih terorganisir
Perubahan ini memastikan integritas data, meningkatkan performa, dan memberikan monitoring yang lebih baik untuk proses generate closing balance report.
Menyederhanakan logika pengecekan duplicate berdasarkan karakteristik trans_reference yang sudah unique secara global, sehingga cukup menggunakan kombinasi trans_reference + amount_lcy tanpa perlu filter berdasarkan account_number dan period.
Perubahan:
- Simplifikasi verifyNoDuplicatesAfterInsert dengan pengecekan trans_reference + amount_lcy saja
- Perbaikan buildTransactionQuery dengan groupBy yang disederhanakan
- Menghapus groupBy booking_date karena trans_reference sudah unique
- Optimasi performa query dengan grouping yang lebih efisien
- Penyesuaian logging untuk mencerminkan logika yang disederhanakan
- Mempertahankan pengecekan sequence_no duplicate dalam scope yang tepat
Logika Bisnis:
- Trans_reference adalah unique identifier global
- Trans_reference hanya bisa duplicate jika amount_lcy berbeda
- Tidak perlu filter berdasarkan account_number/period untuk pengecekan duplicate
- Fokus pada kombinasi trans_reference + amount_lcy sebagai key uniqueness
Dampak:
- Query yang lebih efisien dan cepat
- Logika yang lebih sesuai dengan karakteristik data
- Maintenance code yang lebih mudah
- Performa duplicate detection yang lebih baik
Rekomendasi:
- Tambahkan unique constraint (trans_reference, amount_lcy) di database
- Monitor performa setelah simplifikasi
- Validasi hasil dengan data production
Menyederhanakan logika pengecekan duplicate berdasarkan karakteristik trans_reference yang sudah unique secara global, sehingga cukup menggunakan kombinasi trans_reference + amount_lcy tanpa perlu filter berdasarkan account_number dan period.
Perubahan:
- Simplifikasi verifyNoDuplicatesAfterInsert dengan pengecekan trans_reference + amount_lcy saja
- Perbaikan buildTransactionQuery dengan groupBy yang disederhanakan
- Menghapus groupBy booking_date karena trans_reference sudah unique
- Optimasi performa query dengan grouping yang lebih efisien
- Penyesuaian logging untuk mencerminkan logika yang disederhanakan
- Mempertahankan pengecekan sequence_no duplicate dalam scope yang tepat
Logika Bisnis:
- Trans_reference adalah unique identifier global
- Trans_reference hanya bisa duplicate jika amount_lcy berbeda
- Tidak perlu filter berdasarkan account_number/period untuk pengecekan duplicate
- Fokus pada kombinasi trans_reference + amount_lcy sebagai key uniqueness
Dampak:
- Query yang lebih efisien dan cepat
- Logika yang lebih sesuai dengan karakteristik data
- Maintenance code yang lebih mudah
- Performa duplicate detection yang lebih baik
Rekomendasi:
- Tambahkan unique constraint (trans_reference, amount_lcy) di database
- Monitor performa setelah simplifikasi
- Validasi hasil dengan data production
Mengganti pendekatan eliminasi duplicate dari validasi di level aplikasi menjadi di level database untuk menangani kasus duplikat dengan sequence yang tidak berdekatan.
Perubahan yang dilakukan:
- Mengimplementasikan subquery untuk mendapatkan ID unik berdasarkan kombinasi `trans_reference`, `amount_lcy`, dan `booking_date`
- Menghapus validasi duplicate berbasis array `$seenTransactions` di level aplikasi
- Menggunakan `whereIn` untuk filter transaksi berdasarkan hasil subquery ID unik
- Menyederhanakan method `prepareProcessedClosingBalanceData` karena data sudah bersih dari duplicate
- Menambahkan logging jumlah transaksi unik untuk monitoring
- Mengurangi beban proses sejak awal untuk meningkatkan performa
Memperbaiki bug yang menyebabkan data duplikat pada hasil closing balance report karena penggunaan `distinct` yang tidak efektif.
Perubahan utama:
• Query Optimization untuk Duplicate Elimination:
- Mengganti subquery `whereRaw` dengan pendekatan `groupBy` untuk performa dan akurasi yang lebih baik
- Menggunakan `MIN(id)` dan `MIN(date_time)` untuk menjaga konsistensi data terpilih
- Menambahkan `groupBy` pada `trans_reference`, `amount_lcy`, dan `booking_date` untuk filter duplikat yang akurat
• Double Layer Validation:
- Validasi di level database: eliminasi duplikat menggunakan `groupBy`
- Validasi di level aplikasi: menggunakan array `$seenTransactions` untuk deteksi duplikat saat iterasi
- Transaksi yang terdeteksi sebagai duplikat akan dilewati (skip processing)
• Enhanced Logging:
- Menambahkan log saat duplicate transaction terdeteksi dan dilewati
- Log jumlah total duplikat yang ditemukan untuk audit dan monitoring
- Menambahkan log jumlah record yang dihapus saat `deleteExistingProcessedData()`
• Database Index Recommendations:
- Menambahkan saran index untuk mendukung operasi `groupBy`:
- `(account_number, booking_date, trans_reference, amount_lcy)`
- Index ini akan membantu efisiensi dalam filtering dan deduplikasi data
• Compatibility:
- Eager loading tetap dipertahankan untuk efisiensi query
- Skema output CSV tidak berubah (tidak ada breaking changes)
- Proses chunk tetap digunakan untuk efisiensi memory
Testing:
- Validasi output CSV tidak mengandung duplikat `trans_reference` dengan `amount_lcy` sama
- Performa tetap cepat (±5–10 menit)
- Validasi hasil closing balance tetap akurat dan konsisten
Breaking Changes: Tidak ada
Performa: Terjaga dengan eliminasi duplikat yang efektif
Melakukan refactor besar-besaran untuk meningkatkan efisiensi proses GenerateClosingBalanceReportJob yang sebelumnya memakan waktu hingga 1 jam per hari mutasi.
Perubahan utama:
• Eager Loading Implementation:
- Menambahkan eager loading pada relasi `ft` dan `dc` di `buildTransactionQuery()`
- Menggunakan `select` spesifik untuk mengambil hanya kolom yang diperlukan
- Menghindari N+1 query problem yang memperlambat proses signifikan
• Query Optimization:
- Mengganti `distinct()` dengan raw SQL berbasis subquery untuk kinerja lebih baik
- Menyederhanakan `orderBy` hanya pada `booking_date` dan `date_time`
- Memperkuat WHERE clause dengan subquery untuk filtering `trans_reference` dan `amount_lcy`
• Logging Optimization:
- Menghapus logging per transaksi pada `processTransactionData()`
- Menyisakan logging hanya per chunk untuk efisiensi monitoring
- Mengurangi overhead I/O log hingga 50%
• Chunk Size & Memory:
- Meningkatkan `chunk size` dari 1.000 → 5.000 record per iterasi
- Mengurangi overhead koneksi database dan iterasi array
- Menambahkan timeout 3600 detik dan memory limit yang lebih longgar
- Mengaktifkan mekanisme retry untuk job berat
• Indexing Recommendations:
- Menambahkan rekomendasi index:
- `(account_number, booking_date)` untuk filtering awal
- `(trans_reference, amount_lcy)` untuk deduplikasi
- Index FK `ref_no`, `id` untuk relasi antar tabel
• Code Structure & Error Handling:
- Dokumentasi fungsi diperjelas
- Menambahkan penggunaan DB transaction pada critical section
- Flow processing data dirapikan dan lebih modular
Mengubah ordering pada proses generate closing balance report agar hanya menggunakan booking_date dan date_time:
- Menghapus ordering berdasarkan trans_reference dan amount_lcy pada buildTransactionQuery()
- Menggunakan ordering booking_date dan date_time pada query transaksi
- Mengubah ordering pada exportFromDatabaseToCsv() dari sequence_no menjadi booking_date dan transaction_date
- Menambahkan komentar untuk menjelaskan perubahan ordering
- Mempertahankan distinct pada kombinasi trans_reference dan amount_lcy untuk menghindari duplikasi
- Memastikan konsistensi ordering antara proses penyimpanan dan export CSV
- Meningkatkan performa dengan ordering yang lebih sederhana dan relevan
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)
Perubahan yang dilakukan:
- Menambahkan parameter `group` sebagai argument wajib pada signature command
- Memperbarui deskripsi command untuk mencantumkan informasi tentang parameter `group`
- Menambahkan validasi `group` agar hanya menerima nilai yang diizinkan: `QRIS` dan `DEFAULT`
- Memperbarui method `validateParameters()` untuk mendukung validasi nilai `group`
- Memperbarui method `createReportLog()` agar menyimpan `group_name` ke database
- Menambahkan `group` ke semua entri log untuk keperluan tracking dan debugging
- Menyesuaikan pemanggilan `GenerateClosingBalanceReportJob` dengan menyertakan parameter `group`
- Menambahkan informasi `group` pada pesan output console untuk feedback pengguna
- Menjamin konsistensi dengan implementasi `GenerateClosingBalanceReportJob` yang telah mendukung parameter `group`
- Meningkatkan fleksibilitas command untuk mendukung multiple jenis transaksi
Manfaat:
- Memungkinkan generate laporan closing balance berdasarkan tipe transaksi
- Logging lebih informatif dan terstruktur berdasarkan kelompok transaksi
- Command lebih fleksibel dan extensible untuk kebutuhan selanjutnya
- Validasi ketat memastikan data yang diproses sesuai spesifikasi sistem
Refs: #closing-balance-refactor
Melakukan refactoring pada GenerateClosingBalanceReportJob untuk meningkatkan performa dan akurasi:
- Menghapus eager loading yang kompleks pada relasi 'ft' dan 'dc' untuk menyederhanakan query
- Menambahkan distinct(['trans_reference', 'amount_lcy']) pada level query untuk mencegah duplikasi data langsung dari database
- Menambahkan orderBy untuk trans_reference dan amount_lcy sebelum orderBy existing untuk konsistensi hasil
- Memperbaiki kondisi pada getTableNameByGroup() dari '===' menjadi '!==' untuk logika yang benar
- Menghapus method getSelectFields() yang tidak lagi digunakan setelah simplifikasi query
- Memperbarui log message untuk mencerminkan penggunaan distinct pada kombinasi trans_reference dan amount_lcy
- Meningkatkan efisiensi dengan mengurangi kompleksitas query dan menghindari pemrosesan data duplikat di level aplikasi
- Memastikan akurasi perhitungan running balance dengan mengeliminasi entri duplikat sejak awal
Perubahan ini menggantikan pendekatan sebelumnya yang menggunakan array $processedTransactions untuk skip duplikat di level aplikasi dengan solusi yang lebih efisien di level database.
Perubahan yang dilakukan:
- Hapus file `MigrasiController.php` yang tidak lagi digunakan
- Ganti referensi controller dari `MigrasiController` menjadi `StagingController` di `ProcessDailyMigration.php`
- Update semua Job class untuk menggunakan disk `staging` menggantikan `sftpStatement`
- Ganti konstanta `DISK_NAME` di class berikut:
* `ProcessAccountDataJob`
* `ProcessArrangementDataJob`
* `ProcessAtmTransactionJob`
* `ProcessBillDetailDataJob`
* `ProcessCategoryDataJob`
* `ProcessCompanyDataJob`
* `ProcessCustomerDataJob`
* `ProcessDataCaptureDataJob`
* `ProcessFtTxnTypeConditionJob`
* `ProcessFundsTransferDataJob`
* `ProcessProvinceDataJob`
- Komentari sementara `array_pop()` di `ProcessDataCaptureDataJob` untuk debugging
- Rapikan whitespace dan formatting di `GenerateClosingBalanceReportCommand`
- Sesuaikan konfigurasi storage agar menggunakan local filesystem (`disk: staging`)
- Konsolidasikan penamaan dan penggunaan disk untuk environment `staging`
- Hilangkan ketergantungan terhadap koneksi SFTP dalam proses development/staging
Manfaat:
- Mempercepat proses development dan debugging dengan akses file lokal
- Menyederhanakan konfigurasi untuk staging environment
- Meningkatkan konsistensi dan maintainability kode
- Mengurangi potensi error akibat koneksi eksternal (SFTP)
Melakukan refactor besar pada job GenerateClosingBalanceReport untuk mengganti penggunaan raw SQL dan left join dengan implementasi Eloquent ORM penuh, guna meningkatkan maintainability, akurasi data, dan performa sistem.
🧱 Refactor Arsitektur Query:
- Menghilangkan semua penggunaan `leftJoin` yang menyebabkan duplikasi data
- Mengganti query menjadi pure Eloquent dengan relasi dan `with()` (eager loading)
- Menghindari N+1 problem melalui optimasi relasi `ft` (TempFundsTransfer) dan `dc` (DataCapture)
🧩 Integrasi Model:
- Menggunakan model: `StmtEntry`, `StmtEntryDetail`, `TempFundsTransfer`, `DataCapture`
- Seleksi model berdasarkan `groupName`:
- `QRIS` → `StmtEntry`
- selainnya → `StmtEntryDetail`
- Relasi dimanfaatkan langsung via properti model, dengan fallback logic
⚙️ Peningkatan Proses Data:
- Menyederhanakan metode `processTransactionData()` untuk memanfaatkan relasi langsung
- Tambahan null safety menggunakan null coalescing operator (`??`)
- Tetap mempertahankan chunk processing untuk efisiensi memori
🔒 Konsistensi & Logging:
- Tambahan DB transaction (`beginTransaction`, `commit`, `rollback`) untuk data integrity
- Logging komprehensif di tiap tahap proses: pemilihan model, query, pemrosesan, fallback
- Error handling dengan informasi error yang lebih informatif
🚀 Optimasi Performa:
- Selective field loading untuk minimalisasi beban memori
- Chunking data untuk skala besar
- Eager loading efisien tanpa join kompleks
✅ Tujuan & Manfaat:
- Meningkatkan maintainability & keterbacaan kode
- Menghilangkan duplikasi data akibat `leftJoin`
- Meningkatkan akurasi dan konsistensi data laporan
- Mengikuti Laravel best practices dalam penulisan query & relasi
- Refactor generateReportData jadi fungsi kecil (query builder, selector, row builder)
- Tambah dukungan multi group akun (DEFAULT, QRIS) pada closing balance job
- Pisahkan akun QRIS dan sesuaikan struktur dispatch dan account list
- Tingkatkan maintainability, scalability, dan clarity proses
Menambahkan dukungan fallback untuk nilai `stmt_entry_id` yang kosong/null dengan menggunakan field `id` dari CSV (jika tersedia di akhir file).
Perubahan yang dilakukan:
- Menambahkan 'id' sebagai bagian dari expected CSV headers
- Mengimplementasikan handleStmtEntryIdFallback() untuk logika pengganti
- Menggunakan field 'id' sebagai stmt_entry_id jika nilainya kosong atau null
- Menyesuaikan validasi jumlah kolom terhadap struktur CSV terbaru
- Melakukan pembersihan field 'id' sebelum data disimpan ke database
- Memperkuat validasi di addToBatch() agar stmt_entry_id selalu valid
- Menambahkan logging untuk proses fallback dan debugging
- Meningkatkan error handling untuk kasus data tidak valid
- Menjamin kompatibilitas dengan struktur model StmtEntryDetail
- Optimasi batch insert melalui pengecekan dan pembersihan data lebih ketat
Menambahkan fitur pengelolaan data stmt_entry_detail untuk integrasi transaksi dengan detail yang lebih lengkap.
Perubahan yang dilakukan:
- Membuat migrasi create_stmt_entry_detail_table dengan struktur field sesuai kebutuhan bisnis
- Menambahkan index pada kolom penting untuk meningkatkan performa query
- Membuat model StmtEntryDetail dengan relasi ke:
- Account
- TempFundsTransfer
- TempTransaction
- Teller
- DataCapture
- TempArrangement
- Mengimplementasikan $fillable dan $casts sesuai struktur tabel
- Menambahkan relasi untuk memudahkan integrasi antar modul
- Membuat job ProcessStmtEntryDetailDataJob untuk memproses file CSV dengan batch processing
- Mengimplementasikan chunking untuk menangani file besar secara efisien
- Membersihkan trans_reference dari karakter tidak valid sebelum penyimpanan
- Menggunakan updateOrCreate untuk mencegah duplikasi primary key
- Menggunakan database transaction untuk menjaga konsistensi data
- Menambahkan logging komprehensif untuk monitoring dan debugging
- Mengimplementasikan error handling yang robust untuk menghindari job failure tanpa informasi
- Memastikan penggunaan resource memory tetap optimal saat memproses data besar
- Menambahkan case baru di MigrasiController untuk memproses stmt_entry_detail
- Konsisten dengan pattern migrasi data yang sudah ada di sistem
Tujuan perubahan:
- Menyediakan sistem import dan pengolahan data stmt_entry_detail dengan proses yang aman dan efisien
- Memudahkan integrasi transaksi dengan detail tambahan di modul Webstatement
- Menjamin integritas data dengan penggunaan transaction, logging, dan error handling yang komprehensif
Menambahkan fitur command line untuk generate laporan closing balance sekaligus memperbaiki pengisian field yang required di database.
Perubahan yang dilakukan:
- Membuat command `webstatement:generate-closing-balance-report` dengan parameter:
- `account_number`: nomor rekening (required)
- `period`: format tanggal YYYYMMDD (required)
- `--user_id=`: ID user (optional, default 1)
- Menambahkan field `report_date` dengan konversi dari parameter `period` menggunakan Carbon
- Menambahkan field `created_by` dan `updated_by` untuk kebutuhan audit trail
- Menambahkan field `ip_address` dan `user_agent` dengan default 'console' untuk identifikasi proses non-web
- Memperbaiki validasi parameter dengan regex dan proper escaping
- Menghindari error SQLSTATE[23502] terkait field not null di database schema
- Menggunakan database transaction untuk menjaga konsistensi data
- Mengupdate fungsi `closing_balance_report_logs` untuk menyimpan semua field yang dibutuhkan
- Integrasi dengan `GenerateClosingBalanceReportJob` untuk pemrosesan laporan secara background
- Menambahkan logging komprehensif untuk monitoring `report_date` dan proses lainnya
- Mendukung eksekusi manual dan penjadwalan via Laravel scheduler
- Kompatibel dengan proses laporan closing balance via web dan CLI
Tujuan perubahan:
- Mempermudah proses generate laporan closing balance melalui CLI secara manual atau terjadwal
- Memastikan seluruh field wajib di `closing_balance_report_logs` terisi dengan benar
- Menyediakan audit trail lengkap dan logging yang detail untuk proses via console
- Meningkatkan keandalan sistem dengan validasi dan error handling yang lebih baik
Menambahkan fitur job processing untuk memproses laporan closing balance secara asynchronous dengan dukungan data besar.
Perubahan yang dilakukan:
- Membuat model `ClosingBalanceReportLog` untuk mencatat permintaan laporan dan status proses
- Membuat job `GenerateClosingBalanceReportJob` untuk memproses laporan closing balance di background queue
- Memodifikasi `LaporanClosingBalanceController` untuk mengintegrasikan job processing saat generate laporan
- Menambahkan migration `closing_balance_report_logs` untuk menyimpan log permintaan, path file, dan status
- Menggunakan query custom dari input user untuk pengambilan data transaksi
- Menambahkan field `closing_balance` yang dihitung otomatis (saldo awal + amount_lcy)
- Mengimplementasikan chunking data untuk memproses transaksi dalam jumlah besar secara efisien
- Menambahkan logging detail untuk memudahkan monitoring, debugging, dan audit trail
- Menggunakan database transaction untuk menjaga konsistensi data selama proses job
- Menambahkan fitur retry otomatis pada job jika terjadi kegagalan atau timeout
- Mengekspor hasil laporan ke file CSV dengan delimiter pipe `|` untuk kebutuhan integrasi sistem lain
- Menambahkan workflow approval untuk validasi laporan sebelum download
- Implementasi download tracking dan manajemen file untuk memudahkan kontrol akses
Tujuan perubahan:
- Memungkinkan pemrosesan laporan closing balance dengan jumlah data besar secara efisien dan aman
- Mengurangi beban proses synchronous pada server dengan pemanfaatan queue
- Menyediakan audit trail lengkap untuk setiap proses generate laporan
- Meningkatkan pengalaman pengguna dengan proses generate yang lebih responsif dan terkontrol
Perubahan yang dilakukan:
- ProcessCompanyDataJob:
- Memodifikasi method processRow dengan menambahkan logika array_pop($row) untuk menghapus elemen terakhir dari array CSV.
- Menambahkan validasi count($row) > 0 untuk memastikan array tidak kosong sebelum diproses.
- Mempertahankan validasi jumlah kolom sesuai FIELD_MAP untuk menjaga konsistensi data.
- Menambahkan log informasi saat field terakhir berhasil dihapus dari setiap baris.
- Mencatat jumlah kolom baru setelah penghapusan untuk keperluan debugging dan monitoring.
- Mengurangi overhead processing dengan mengabaikan kolom tambahan yang tidak diperlukan.
- Memastikan integritas data tetap terjaga saat mapping ke model Branch.
- Tidak mengubah struktur FIELD_MAP yang sudah ada untuk menjaga kompatibilitas.
- Mempertahankan fungsi validasi dan error handling yang sudah berjalan.
- ProcessDataCaptureDataJob:
- Memodifikasi method processRow dengan logika array_pop($row) untuk menghapus kolom terakhir dari array CSV.
- Menambahkan pengecekan count($row) > 0 untuk validasi array.
- Mempertahankan validasi jumlah kolom sesuai CSV_HEADERS untuk memastikan kesesuaian data.
- Menambahkan log saat kolom terakhir berhasil dihapus untuk setiap baris yang diproses.
- Mencatat jumlah kolom baru setelah penghapusan sebagai bagian dari monitoring.
- Memastikan hanya kolom yang didefinisikan dalam CSV_HEADERS yang diproses untuk efisiensi.
- Mengurangi beban proses dengan mengabaikan field yang tidak relevan pada CSV input.
- Mempertahankan integritas data dan mapping ke model DataCapture.
- Tidak mengubah sistem batch processing yang ada, tetap menggunakan CHUNK_SIZE = 1000.
- Mempertahankan performa dengan bulk insert dan upsert untuk data besar.
- Memastikan efisiensi memory dengan chunk processing.
- Menjaga struktur CSV_HEADERS dan proses validasi agar tetap kompatibel dengan sistem yang sudah berjalan.
Tujuan perubahan:
- Memungkinkan sistem untuk mengabaikan kolom tambahan di akhir file CSV baik untuk data company maupun data capture tanpa mengganggu proses import.
- Menghindari error atau kegagalan parsing saat terdapat tambahan kolom dari sistem eksternal.
- Meningkatkan fleksibilitas sistem dalam menghadapi input CSV yang tidak selalu konsisten secara jumlah kolom.
- Menjaga performa dan efisiensi proses dengan tetap mempertahankan proses batch dan chunking.
- Memastikan seluruh perubahan tetap backward compatible dengan proses yang sudah ada.
Perubahan yang dilakukan:
- Penambahan Debugging dan Verifikasi Storage:
- Menambahkan log detail untuk tracking proses export CSV, termasuk informasi disk, client, account number, period, dan path penyimpanan.
- Mengimplementasikan pembuatan file dummy untuk memverifikasi fungsi storage disk sebelum proses export dijalankan.
- Menambahkan verifikasi keberadaan file setelah proses export selesai untuk memastikan file benar-benar tersimpan di storage.
- Perbaikan Manajemen Path:
- Memastikan seluruh proses pembuatan direktori menggunakan Laravel Storage facade secara konsisten.
- Menghapus dependency pada proses sistem chmod, chown, dan chgrp yang berpotensi menimbulkan masalah portabilitas.
- Menggunakan path absolut dan konsisten untuk menghindari konflik direktori atau kesalahan path relatif.
- Peningkatan Error Handling:
- Menambahkan log error khusus jika storage disk tidak berfungsi dengan baik atau tidak dapat diakses.
- Mengimplementasikan cleanup file dummy setelah proses verifikasi storage selesai.
- Menambahkan informasi log tambahan untuk kebutuhan debugging dan troubleshooting di lingkungan production.
- Optimasi Performa:
- Menggunakan Laravel Storage facade sebagai standar pembuatan direktori dan file untuk efisiensi dan konsistensi.
- Mengurangi overhead dari pemanggilan fungsi sistem operasi yang tidak diperlukan.
- Memastikan fungsionalitas utama tetap berjalan dengan lebih andal tanpa perubahan pada logika bisnis utama.
Tujuan perubahan:
- Memastikan file export statement benar-benar tersimpan dan dapat diakses, tidak hanya tercatat sukses di log.
- Mengatasi masalah di mana proses log mencatat keberhasilan export tetapi file tidak ditemukan di sistem file.
- Meningkatkan reliabilitas sistem export dengan verifikasi berlapis pada proses penyimpanan.
- Menyederhanakan proses penulisan file agar lebih portable, aman, dan mudah di-maintain di berbagai environment.
Perubahan yang dilakukan:
- ExportStatementJob.php:
- Menghapus kode chmod(0777), chown, dan chgrp pada direktori basePath dan accountPath.
- Menyederhanakan fungsi exportToCsv() dengan hanya menggunakan Storage::makeDirectory() tanpa pengaturan izin manual.
- ExportStatementPeriodJob.php:
- Menghapus proses chmod(0777), chown, dan chgrp dari generatePdf() dan exportToCsv().
- Mempertahankan mkdir() dengan parameter 0777 untuk kompatibilitas permission default, tanpa manipulasi ownership.
- Menghapus pengecekan posix_getuid() dan function_exists() yang sebelumnya digunakan untuk memvalidasi chown.
- GenerateMultiAccountPdfJob.php:
- Menghapus semua proses chmod(0777), chown, dan chgrp pada direktori penyimpanan.
- Menyederhanakan fungsi generateAccountPdf() dengan menghilangkan pengaturan ownership manual.
Tujuan perubahan:
- Menyederhanakan kode dan menghilangkan proses manajemen izin file yang tidak perlu.
- Menghilangkan ketergantungan pada fungsi sistem operasi terkait chmod, chown, dan chgrp.
- Mengurangi kompleksitas dan meminimalkan potensi error saat runtime.
- Meningkatkan portabilitas aplikasi agar dapat berjalan di berbagai environment seperti Linux, Windows, dan Docker tanpa kendala perizinan file.
- Menghilangkan risiko keamanan akibat perubahan ownership file secara manual.
- Mempermudah deployment dan maintenance dengan kode yang lebih clean dan aman.
Catatan:
- Pembuatan direktori tetap menggunakan Laravel Storage facade atau mkdir() untuk kebutuhan tertentu.
- Tidak ada perubahan pada logika bisnis utama dari proses export PDF dan CSV.
- Semua fitur export tetap berjalan seperti sebelumnya tanpa pengaturan file permission manual.
Perubahan yang dilakukan:
- Menambahkan field no_receipt pada tabel processed_statements melalui migrasi baru.
- Menambahkan no_receipt ke dalam fillable array di model ProcessedStatement.
- Mengintegrasikan field recipt_no dari relasi ft ke dalam data yang disimpan di processed_statements.
- Menambahkan kolom NO.RECEIPT pada header CSV export statement.
- Menyertakan data recipt_no ke dalam output CSV export statement.
- Mengomentari kode yang sebelumnya menambahkan receipt number ke narrative description untuk menghindari duplikasi.
- Menggunakan nilai default '-' jika recipt_no tidak tersedia.
File yang dimodifikasi:
- app/Jobs/ExportStatementJob.php: Menambahkan mapping recipt_no ke no_receipt, update header CSV, dan menyertakan data dalam export.
- app/Models/ProcessedStatement.php: Menambahkan no_receipt ke fillable fields.
- Modules/Webstatement/database/migrations/2025_07_14_022029_add_no_receipt_to_processed_statements_table.php: Menambahkan kolom no_receipt di database.
Tujuan perubahan:
- Memisahkan nomor receipt transaksi dari narrative description untuk kemudahan pelaporan dan audit.
- Memberikan fleksibilitas lebih dalam pengolahan data statement, khususnya untuk kebutuhan export dan compliance.
Perubahan yang dilakukan:
- Menambahkan set permission 0777, chown, dan chgrp pada direktori temp dan storage di berbagai job dan controller.
- Diterapkan di PrintStatementController, ExportStatementJob, ExportStatementPeriodJob, dan GenerateMultiAccountPdfJob.
- Semua direktori yang dibuat memiliki permission 777 untuk akses penuh dan ownership user www-data.
- Menambahkan pengecekan function_exists('chown') dan posix_getuid() === 0 sebelum menjalankan chown/chgrp.
- Menggunakan @ operator untuk suppress error jika operasi chown gagal.
- Menambahkan fallback mechanism agar aplikasi tetap berjalan meskipun tidak memiliki privilege root.
- Mengubah target ownership dari root ke www-data untuk menghindari error "Operation not permitted".
- Menambahkan pengecekan keberadaan direktori sebelum mengatur permission dan ownership.
- Menambahkan error handling yang konsisten dan robust untuk semua operasi file system terkait direktori.
- Memastikan perubahan bekerja untuk local disk maupun storage disk lainnya.
Tujuan perubahan:
- Menjamin direktori yang digunakan oleh sistem memiliki akses dan kepemilikan yang tepat di environment production.
- Mencegah error `chown(): Operation not permitted` saat aplikasi berjalan tanpa akses root.
- Meningkatkan stabilitas proses PDF generation dan file storage, serta kompatibilitas dengan environment server yang terbatas.
Perubahan yang dilakukan:
- Menambahkan setOption('headless', true) untuk menjalankan Chrome dalam mode headless.
- Menambahkan opsi noSandbox() untuk menghindari masalah permission di environment server.
- Menggunakan waitUntilNetworkIdle() agar memastikan seluruh resource dimuat sebelum proses render.
- Menerapkan konfigurasi ini pada ExportStatementPeriodJob, GenerateMultiAccountPdfJob, dan PrintStatementController.
- Meningkatkan stabilitas dan performa proses PDF generation di environment production.
- Mengurangi potensi error dan timeout saat melakukan rendering PDF.
- Memastikan semua asset dan resource termuat sempurna sebelum PDF dihasilkan.
Tujuan perubahan:
- Menjamin proses PDF generation berjalan lebih andal di berbagai environment server.
- Mengurangi risiko kegagalan akibat resource belum termuat saat rendering.
- Menyelaraskan konfigurasi Browsershot dengan best practice untuk environment production.
Perubahan yang dilakukan:
- Memodifikasi fungsi createZipFile() di GenerateMultiAccountPdfJob untuk menambahkan proteksi password.
- Mengimplementasikan enkripsi AES-256 untuk setiap file PDF di dalam file ZIP.
- Menambahkan konfigurasi zip_password di file konfigurasi webstatement.
- Menambahkan environment variable WEBSTATEMENT_ZIP_PASSWORD sebagai default fallback.
- Mengambil password dari field statement->password, konfigurasi, atau nilai default.
- Menambahkan logging untuk mencatat aktivitas proteksi file ZIP.
- Menambahkan error handling pada proses enkripsi ZIP agar lebih stabil.
- Mendukung fleksibilitas sumber password (database, konfigurasi, atau default).
- Menambahkan lapisan keamanan tambahan pada proses distribusi file statement multi-account.
- Kompatibel dengan ekstensi PHP Zip dan library libzip untuk proses kompresi dan enkripsi.
Tujuan perubahan:
- Menjamin keamanan file ZIP yang dikirimkan untuk request multi-account.
- Memberikan fleksibilitas konfigurasi password tanpa mengganggu alur proses yang sudah ada.
- Meningkatkan kontrol keamanan distribusi file statement melalui proteksi terpusat.
Perubahan yang dilakukan:
- Menambahkan command AutoSendStatementEmailCommand untuk otomatisasi pengiriman email statement.
- Menambahkan job AutoSendStatementEmailJob untuk menangani proses pengiriman email secara asynchronous.
- Menambahkan opsi --force dan --dry-run pada command untuk fleksibilitas eksekusi dan pengujian.
- Mengintegrasikan command baru ke dalam WebstatementServiceProvider dan Console Kernel.
- Mengimplementasikan scheduler untuk menjalankan job setiap menit secara otomatis.
- Menambahkan kondisi auto send: is_available dan is_generated = true, email_sent_at = null.
- Mendukung pengiriman statement multi-period dalam bentuk ZIP attachment.
- Mengoptimalkan proses download dan integrasi file PDF dengan logging yang lebih detail.
- Menambahkan logika prioritas local disk dibandingkan SFTP untuk pengambilan file secara efisien.
- Menambahkan validasi tambahan untuk flow pengiriman email single dan multi period.
- Mengimplementasikan error handling dan logging yang komprehensif.
- Menggunakan database transaction untuk menjamin konsistensi data selama proses kirim email.
- Menambahkan mekanisme prevent overlap dan timeout protection saat job berjalan.
- Menghapus file sementara secara otomatis setelah email berhasil dikirim.
- Membatasi proses pengiriman maksimal 50 statement per run untuk menjaga performa.
Tujuan perubahan:
- Mengotomatiskan pengiriman email statement pelanggan secara periodik dan aman.
- Menyediakan fleksibilitas eksekusi manual dan simulasi pengujian sebelum produksi.
- Menjamin efisiensi, stabilitas, dan monitoring penuh selama proses pengiriman.
Perubahan yang dilakukan:
- Menambahkan PDFPasswordProtect::encrypt di dalam ExportStatementPeriodJob.
- Mengikuti pola implementasi yang telah digunakan pada CombinePdfJob.
- PDF statement kini otomatis diproteksi menggunakan password.
- Password diambil dari konfigurasi: webstatement.pdf_password.
- Menambahkan logging untuk memantau proses proteksi PDF.
- Menjamin pengelolaan file sementara berjalan aman dan rapi.
- Menjaga kompatibilitas ke belakang (backward compatible) dengan sistem PDF yang sudah ada.
Tujuan perubahan:
- Meningkatkan keamanan file PDF dengan proteksi password standar perusahaan.
- Memastikan proses enkripsi berjalan otomatis tanpa mengubah alur penggunaan yang ada.
- Memberikan visibilitas terhadap proses proteksi melalui log sistem.
Perubahan yang dilakukan:
- Menambahkan fungsi generatePdf() untuk proses generate PDF dalam job ExportStatementPeriodJob.
- Mengintegrasikan logika PDF generation dari PrintStatementController ke dalam job.
- Menggunakan data ProcessedStatement yang telah diproses sebagai sumber untuk pembuatan PDF.
- Menambahkan import statement untuk Browsershot, Account, Customer, dan Branch.
- Mengimplementasikan fungsi prepareHeaderTableBackground() untuk mengonversi gambar header menjadi base64.
- Menggunakan database transaction untuk menjaga konsistensi saat generate dan menyimpan PDF.
- Menyimpan PDF ke storage dengan struktur direktori yang terorganisir berdasarkan parameter tertentu.
- Memperbarui PrintStatementLog dengan status akhir dan path file PDF yang dihasilkan.
- Menambahkan error handling dan logging secara menyeluruh untuk memantau proses.
- Menghapus file sementara (temporary) setelah PDF berhasil disimpan ke storage.
- Menambahkan dukungan timeout dan konfigurasi Browsershot yang optimal.
- Melakukan validasi terhadap data account, customer, dan branch sebelum proses generate PDF dilakukan.
Tujuan perubahan:
- Memindahkan logika generate PDF ke dalam background job agar lebih efisien dan terstruktur.
- Menjamin integritas data dan hasil PDF yang valid melalui proses terstandarisasi.
- Mengurangi beban proses di controller serta mendukung proses batch secara asynchronous.
Perubahan yang dilakukan:
- Membuat job baru ProcessProvinceDataJob dengan referensi dari ProcessSectorDataJob.
- Menggunakan model ProvinceCore untuk menyimpan data provinsi.
- Mendukung format file ST.PROVINCE.csv dengan delimiter khusus tilde (~).
- Menambahkan validasi untuk kolom: id, date_time, province, dan province_name.
- Mengabaikan baris header pada file saat proses import.
- Menggunakan database transaction untuk menjaga konsistensi data.
- Menambahkan counter untuk memantau jumlah record yang dilewati (skipped).
- Mengimplementasikan error handling dan logging yang detail.
- Menggunakan updateOrCreate untuk mencegah duplikasi data.
- Menambahkan method failed() untuk menangani kasus job failure.
- Melakukan mapping field province ke code dan province_name ke name.
- Melakukan validasi data wajib sebelum menyimpan ke database.
Tujuan perubahan:
- Memfasilitasi proses import data provinsi dari file eksternal secara otomatis dan aman.
- Menjamin data yang masuk telah tervalidasi dan bebas duplikasi.
- Menyediakan log dan feedback yang cukup saat terjadi kegagalan.
Perubahan yang dilakukan:
- Memodifikasi PrintStatementController untuk mendukung request_type baru: multi_account.
- Menambahkan validasi stmt_sent_type dan branch_code khusus pada request multi_account.
- Menambahkan pengecekan branch_id: ID0019999 dengan penanganan error yang lebih spesifik.
- Menambahkan metode processMultiAccountStatement untuk pemrosesan berdasarkan branch_code dan stmt_sent_type.
Optimasi PDF:
- Melakukan refaktor pada GenerateMultiAccountPdfJob agar mendukung kalkulasi tanggal dinamis (startDate dan endDate).
- Mengimplementasikan Browsershot untuk opsi tambahan background dan optimasi waktu proses.
- Menambahkan validasi status dan update log pada PrintStatementLog setelah PDF berhasil dibuat.
- Menambahkan penanganan penggunaan memori secara granular untuk proses batch PDF dan pembersihan resource otomatis.
Logging dan Validasi:
- Menambahkan logging pada proses kalkulasi tanggal multi_account.
- Logging tambahan dan rollback untuk error yang terjadi saat proses statement atau PDF.
- Mengubah penggunaan Auth:: untuk konsistensi role checking.
- Mengubah validasi stmt_sent_type dari JSON menjadi array dengan implode().
UI dan Output:
- Memodifikasi blade template agar mendukung tampilan stmt_sent_type untuk kasus multi_account.
- Menambahkan logika kolom dinamis berdasarkan account_number atau stmt_sent_type.
Refaktor umum:
- Memisahkan logika antara single dan multi account di PrintStatementController.
- Perbaikan minor pada query SQL untuk entri ProcessedStatement.
Tujuan perubahan:
- Mendukung pemrosesan batch statement multi account secara lebih efisien dan terstruktur.
- Menjamin validasi dan logging yang lebih kuat.
- Meningkatkan performa pembuatan PDF dan kontrol terhadap penggunaan resource.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- Modifikasi method printStatementRekening untuk mendukung request_type multi_account
- Tambah method processMultiAccountStatement untuk mengambil data account berdasarkan branch_code dan stmt_sent_type
- Tambah method processSingleAccountStatement untuk memisahkan logika single account
- Implementasi GenerateMultiAccountPdfJob untuk generate PDF multiple account secara parallel
- Tambah fungsi generateAccountPdf untuk generate PDF per account dengan Browsershot
- Tambah fungsi createZipFile untuk mengompres multiple PDF menjadi satu ZIP file
- Tambah method downloadMultiAccountZip untuk download ZIP file hasil pemrosesan
- Implementasi validasi stmt_sent_type dengan support JSON array format
- Tambah logging komprehensif untuk monitoring proses multi account
- Tambah error handling dengan database transaction rollback
- Update PrintStatementLog dengan informasi target_accounts dan status pemrosesan
- Tambah rute baru untuk download ZIP file multi account
- Support untuk pemrosesan chunk account untuk optimasi memory usage
- Implementasi status tracking untuk success_count dan failed_count
- Tambah validasi keberadaan account berdasarkan kriteria yang ditentukan
- **Fitur Baru:**
- Menambahkan kemampuan untuk membuat PDF statement secara dinamis menggunakan Browsershot.
- Fitur penyimpanan otomatis PDF ke dalam local storage dengan struktur direktori berdasarkan periode dan account number.
- Menyediakan fitur unduhan langsung dari storage atau melalui preview di browser.
- Mendukung penghapusan PDF dari storage dengan log terintegrasi.
- **Perubahan pada Controller:**
- Ditambah method baru `generated` untuk membangun PDF atau tampilan HTML statement.
- Integrasi penghitungan periode saldo (`calculateSaldoPeriod`) untuk menghasilkan data laporan yang lebih akurat.
- Perubahan pada `printStatementRekening` untuk mendukung pengiriman objek statement secara penuh.
- Menambahkan method tambahan untuk preview, download, dan delete PDF langsung dari storage.
- **Validasi Permintaan:**
- Menambah validasi wajib pada `branch_code` untuk memastikan data cabang sesuai.
- Menyesuaikan logika validasi di `PrintStatementRequest` untuk mendukung input cabang dan parameter lain.
- **Cakupan Logging:**
- Meningkatkan logging pada setiap proses penting:
- Mulai dari validasi data, proses pembuatan PDF, hingga penyimpanan.
- Deteksi error secara spesifik pada setiap tahapan proses.
- Menambah log debugging untuk nama file, ukuran file, dan path penyimpanan.
- **Peningkatan pada UI:**
- Penyesuaian field `branch_code` pada form UI untuk menggantikan `branch_id` dengan validasi error yang lebih eksplisit.
- Membuat halaman baru untuk tampilan preview PDF di interface.
- **Optimisasi dan Refaktor:**
- Grouping import library untuk meningkatkan keterbacaan.
- Manajemen direktori penyimpanan PDF dipastikan berjalan dinamis dan fleksibel.
- Penghilangan redundansi logika pada proses pencarian saldo awal bulan.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Pembaruan pada `ExportStatementPeriodJob`:**
- Menambahkan atribut baru `toCsv` untuk mendukung validasi sebelum proses ekspor CSV.
- Menyesuaikan method `__construct` untuk menerima parameter tambahan `toCsv`.
- Menambahkan validasi ekspor CSV dengan conditional check pada `toCsv` sebelum menjalankan `exportToCsv`.
- Memperbaiki logika di `getTotalEntryCount` menggunakan `booking_date` untuk query lebih akurat.
- Menambahkan logging terperinci pada proses penghitungan jumlah entri untuk meningkatkan debugging.
- **Integrasi Log Print Statement:**
- Mengupdate status kolom `is_generated` pada model `PrintStatementLog` setelah entri diproses.
- Menambahkan mekanisme pembaruan data log print statement melalui validasi entry statement.
- **Peningkatan pada Controller `PrintStatementController`:**
- Memampukan proses ekspor otomatis jika statement tidak tersedia dengan metode baru `printStatementRekening`.
- Menambahkan parameter `stmt_sent_type` untuk log print pada proses pencatatan data.
- Mengimplementasikan pemrosesan period statement melalui job `ExportStatementPeriodJob`.
- **Perubahan pada UI/Blade `statements/index`:**
- Menambahkan opsi pemilihan multiple untuk tipe laporan `stmt_sent_type`.
- Mengupdate dan merapikan komponen form untuk input branch, akun, email, dan periode laporan.
- Menambahkan kolom baru `is_generated` pada tabel untuk menampilkan status log hasil pembuatan laporan.
- **Pembaruan pada Datatable dan Skrip Frontend:**
- Menambahkan render visual dengan badge untuk status `is_generated`.
- Memperbaiki dan mengoptimalkan element HTML untuk datatable termasuk pagination dan search.
- Menambahkan konfirmasi aksi dengan Ajax untuk retry pembuatan laporan jika diperlukan.
- **Optimisasi dan Refactor:**
- Menggunakan group import pada controller untuk meningkatkan keterbacaan.
- Memperbaiki alignment dan indentasi pada beberapa file blade.
- Menghapus kode yang tidak digunakan atau redundan seperti conditional unprocessed data.
Dengan perubahan ini, sistem print statement lebih fleksibel, mencatat log lebih baik, dan mendukung fitur tracking pengeluaran laporan.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
Mengubah logika filter untuk product_code 6021 agar hanya mengecualikan yang memiliki ctdesc 'gold',
sementara product_code 6021 dengan ctdesc lainnya tetap diproses.
Perubahan yang dilakukan:
- Menghapus '6021' dari array whereNotIn product_code yang mengecualikan semua
- Menambahkan filter kondisional kompleks menggunakan nested where clause
- Implementasi logika: (product_code != '6021') OR (product_code = '6021' AND ctdesc != 'gold')
- Menambahkan logging detail untuk tracking filter khusus yang diterapkan
- Memperbarui dokumentasi function untuk menjelaskan logika bisnis baru
- Menambahkan informasi filter khusus dalam log hasil pengambilan data
Dengan perubahan ini:
- Product_code 6021 dengan ctdesc 'gold' akan dikecualikan dari biaya admin
- Product_code 6021 dengan ctdesc selain 'gold' tetap dikenakan biaya admin
- Product_code lainnya (6002, 6004, 6042, 6031) tetap dikecualikan sepenuhnya
- Meningkatkan fleksibilitas dalam pengelolaan biaya berdasarkan jenis kartu
- **Validasi Data:**
- Menambahkan validasi untuk memastikan bahwa setiap `entryData` adalah array dan memiliki properti `stmt_entry_id`.
- Log peringatan ditambahkan untuk mendeteksi struktur data yang tidak valid.
- **Perbaikan Logging:**
- Logging ditingkatkan untuk mencatat data invalid yang ditemukan selama proses.
- Menambahkan log peringatan dengan struktur data detail saat validasi gagal.
- **Penghapusan Nested Loop:**
- Memperbaiki logika iterasi dengan menghapus nested loop dan langsung memproses tiap elemen `entryBatch`.
- **Penghitungan Kesalahan:**
- Menambahkan penghitungan `errorCount` untuk melacak jumlah data yang mengalami validasi gagal.
Perubahan ini meningkatkan keandalan proses dengan validasi tambahan, mencegah error akibat struktur data tidak valid, serta memberikan informasi log yang lebih rinci.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Perubahan Mekanisme Simpan Data:**
- Mengganti pendekatan `delete` dan `insert` dengan `updateOrCreate` untuk mencegah duplicate key error.
- Menambahkan transaksi database (`DB::beginTransaction()` dan `DB::commit()`) untuk memastikan konsistensi data.
- Menambahkan logging pada awal dan akhir proses untuk memantau jumlah record yang berhasil diproses.
- **Penanganan Error:**
- Menambahkan rollback transaksi (`DB::rollback()`) pada exception untuk menghindari data korup.
- Logging eror ditingkatkan dengan menampilkan pesan dan trace exception secara rinci.
- **Optimasi Loop:**
- Refinement looping pada `entryBatch` dengan menerapkan chunking untuk efisiensi memori.
- Proses setiap record menggunakan `updateOrCreate` guna mengurangi overhead penghapusan data secara manual.
- **Peningkatan Logging:**
- Menambahkan informasi log yang mencakup:
- Proses awal dan akhir dari `saveBatch`.
- Jumlah record yang diproses secara sukses.
- Error yang terjadi selama proses berlangsung.
- **Dokumentasi dan Komentar:**
- Menambahkan penjelasan detil pada method `saveBatch` untuk memperjelas logika baru.
- Penyempurnaan komentar agar mencerminkan proses terkini dengan jelas.
Perubahan ini meningkatkan efisiensi dan keandalan proses penyimpanan data batch dengan mengurangi risiko konflik pada database serta memastikan rollback pada situasi error.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Penambahan Fitur**:
- Menambahkan metode baru `generateSingleAtmCardCsv` untuk membuat file CSV tunggal tanpa pemisahan cabang:
- Mencakup seluruh data kartu ATM yang memenuhi syarat.
- File diunggah ke SFTP tanpa direktori spesifik cabang.
- Implementasi command `UpdateAllAtmCardsCommand` untuk batch update:
- Dukungan konfigurasi parameter seperti batch size, ID log sinkronisasi, queue, filter, dan dry-run.
- **Optimasi Logging**:
- Logging rinci ditambahkan pada semua proses, termasuk:
- Generasi CSV tunggal.
- Proses upload CSV ke SFTP.
- Pembaruan atau pembuatan `KartuSyncLog` dalam batch processing.
- Progress dan status tiap batch.
- Error handling dengan detail informasi pada setiap exception.
- **Perbaikan dan Penyesuaian Job**:
- Penambahan `UpdateAllAtmCardsBatchJob` yang mengatur proses batch update:
- Mendukung operasi batch dengan pengaturan ukuran dan parameter filtering kartu.
- Pencatatan log progres secara dinamis dengan kalkulasi batch dan persentase.
- Menyusun delay antar job untuk performa yang lebih baik.
- Menyertakan validasi untuk sinkronisasi dan pembaruan data kartu ATM.
- **Refaktor Provider**:
- Pendaftaran command baru:
- `UpdateAllAtmCardsCommand` untuk batch update seluruh kartu ATM.
- Command disertakan dalam provider `WebstatementServiceProvider`.
- **Error Handling**:
- Peningkatan mekanisme rollback pada database saat error.
- Menambahkan notifikasi log `failure` apabila job gagal dijalankan.
- **Dokumentasi dan Komentar**:
- Menambahkan komentar mendetail pada setiap fungsi baru untuk penjelasan lebih baik.
- Mendokumentasikan seluruh proses dan perubahan pada job serta command baru terkait kartu ATM.
Perubahan ini meningkatkan efisiensi pengelolaan data kartu ATM, termasuk generasi CSV, proses batch, dan pengunggahan data ke SFTP.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- Menambahkan filter baru:
- Memastikan `product_code` tidak termasuk dalam daftar `6002`, `6004`, `6042`, dan `6031`.
- Menyaring data dengan kondisi branch tidak sama dengan `ID0019999`.
- Optimasi query:
- Filter tambahan bertujuan untuk mempersempit data hasil pengambilan sehingga lebih relevan dan efisien dalam pembuatan file CSV.
- Peningkatan validasi:
- Memastikan data yang diekspor sesuai dengan ketentuan baru guna meningkatkan akurasi laporan biaya kartu.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Penambahan Field Baru:**
- Menambahkan field baru `product_code` pada tabel `atmcards` melalui migrasi database.
- Field bersifat nullable dan memiliki komentar deskriptif untuk dokumentasi skema database.
- **Refaktor Logika pada UpdateAtmCardBranchCurrencyJob:**
- Menambahkan assignment data `product_code` untuk update kartu ATM berdasarkan informasi account.
- Mengoptimalkan proses query dengan memperbaiki penggunaan namespace model `Account`.
- **Peningkatan Model Atmcard:**
- Menambahkan relasi baru `biaya` untuk mendapatkan informasi terkait jenis kartu (`JenisKartu`).
- Menambah **scope** baru:
- `active` untuk memfilter kartu ATM yang aktif.
- `byProductCode` untuk memfilter berdasarkan kode produk (`product_code`).
- Memperkenalkan accessor dan mutator untuk memastikan format `product_code` konsisten (uppercase, trimmed).
- Menambahkan logging pada setiap akses relasi atau perubahan terkait field `product_code`.
- **Penyesuaian Logging:**
- Memperbanyak log untuk monitoring aktivitas, termasuk:
- Akses dan perubahan data `product_code`.
- Scope query pada model `Atmcard`.
- **Migrasi Database:**
- Menambahkan proses safe migration dengan transaksi pada operasi `up` dan `down`.
- Mencatat log saat migrasi berhasil atau rollback diperlukan jika terjadi kesalahan.
- **Optimisasi dan Perbaikan Format:**
- Mengorganisasi ulang import pada file `UpdateAtmCardBranchCurrencyJob` sesuai standar PSR-12.
- Membenahi key output response dari `openCategory` menjadi `acctType` untuk dukungan data baru `product_code`.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Penambahan Logika Pengambilan Data:**
- Menambahkan proses pengambilan data account dari model `Account` sebelum memanggil API Fiorano.
- Melakukan pencarian data berdasarkan nomor rekening (`account_number`) melalui query pada model.
- Jika data ditemukan, mengembalikan informasi account berupa response format yang menyerupai hasil dari API.
- **Optimisasi Response:**
- Menyusun data response lengkap dari model `Account`, seperti kode cabang (`branch_code`), mata uang (`currency`), kategori pembukaan (`open_category`), dan properti lain yang relevan.
- Field response menyertakan nilai default atau diisi dengan data lain yang ada dalam model.
- **Fallback API Fiorano:**
- Jika data dari database tidak ditemukan, tetap menggunakan mekanisme existing untuk melakukan request ke API Fiorano.
- Tidak ada perubahan lain pada struktur permintaan atau penanganan response Fiorano.
- **Komentar dan Dokumentasi:**
- Memperbarui komentar pada fungsi `getAccountInfo` untuk mencerminkan logika terbaru.
- Menjelaskan fallback ke API jika data model tidak tersedia melalui komentar inline agar lebih mudah dipahami.
- **Peningkatan Efisiensi:**
- Mengurangi frekuensi panggilan API Fiorano dengan memanfaatkan data lokal terlebih dahulu, sehingga mempercepat proses eksekusi job.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
- **Perbaikan Struktural:**
- Melakukan perapihan kode dengan konsistensi indentasi dan penyusunan namespace seluruh file.
- Menambahkan dan mengimpor namespace baru seperti `Throwable`, `InvalidArgumentException`, dan `Exception`.
- **Peningkatan Readability:**
- Menambahkan format dan penyesuaian pada komentar, khususnya penjelasan method dan atribut.
- Menggunakan alignment untuk parameter pada log dan constructor untuk meningkatkan keterbacaan.
- **Pengelolaan Job:**
- Menambahkan logging detail saat memulai, menjalankan, hingga menyelesaikan job.
- Menambahkan penanganan proses tiap akun dalam batch, termasuk logging sukses/gagal dan pembaruan status log.
- **Penanganan Error:**
- Menambahkan rollback database jika terjadi exception pada saat proses pengiriman email.
- Melakukan logging error dengan detail tambahan termasuk pesan dan trace.
- **Penambahan Utility:**
- Menambahkan metode reusable seperti `updateLogStatus` untuk update status log dengan parameter dinamis.
- Menambahkan validasi seperti pengecekan eksistensi file PDF dan email terkait sebelum pengiriman.
- **Peningkatan Proses Batch:**
- Menambahkan pengelolaan batch berbasis properti `batchId` untuk tracking.
- Memperbaiki handle retries dan status akhir batch secara komprehensif (completed, failed).
- Menambahkan logging agregat untuk jumlah akun yang diproses dan tingkat keberhasilan.
- **Peningkatan Validasi Email:**
- Menambahkan skenario untuk pengambilan email dari `stmt_email` atau fallback ke data customer jika tersedia.
- Menambahkan peringatan saat akun tertentu tidak memiliki email yang valid.
- **Pemeliharaan File PDF:**
- Mengecek keberadaan file PDF terkait sebelum proses pengiriman.
- Menampilkan log error jika file tidak ditemukan.
- **Peningkatan Retry dan Logging Gagal:**
- Implementasi metode `failed()` untuk logging pada job yang gagal permanen.
- Menangani detail error dan rollback pada level tiap akun dan batch.
Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>