Commit Graph

147 Commits

Author SHA1 Message Date
Daeng Deni Mardaeni
eff951c600 feat(webstatement): implementasi perbaikan duplikasi data dan optimasi GenerateClosingBalanceReportJob
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.
2025-07-31 10:19:50 +07:00
Daeng Deni Mardaeni
6ad5aff358 refactor(webstatement): Sederhanakan pengecekan duplicate pada GenerateClosingBalanceReportJobrefactor(webstatement): Sederhanakan pengecekan duplicate pada GenerateClosingBalanceReportJob
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
2025-07-31 10:08:23 +07:00
Daeng Deni Mardaeni
bd72eb7dfa fix(webstatement): perbaiki eliminasi duplicate pada GenerateClosingBalanceReportJob
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
2025-07-31 09:32:14 +07:00
Daeng Deni Mardaeni
8eb7e69b21 fix(jobs): eliminasi duplicate trans_reference dengan amount_lcy yang sama pada GenerateClosingBalanceReportJob
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
2025-07-31 09:07:28 +07:00
Daeng Deni Mardaeni
4ee5c2e419 perf(jobs): optimasi performa GenerateClosingBalanceReportJob untuk mengurangi waktu eksekusi
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
2025-07-31 08:42:23 +07:00
Daeng Deni Mardaeni
e1740c0850 refactor(webstatement): ubah ordering pada GenerateClosingBalanceReportJob
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
2025-07-30 17:35:34 +07:00
Daeng Deni Mardaeni
c0e5ddd37a 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)
2025-07-30 17:15:14 +07:00
Daeng Deni Mardaeni
aff6039b33 feat(console): tambah parameter group pada GenerateClosingBalanceReportCommand
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
2025-07-29 16:59:29 +07:00
Daeng Deni Mardaeni
51e432c74f refactor(jobs): optimasi query GenerateClosingBalanceReportJob dengan distinct trans_reference dan amount_lcy
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.
2025-07-29 16:29:27 +07:00
Daeng Deni Mardaeni
9cdc7f9487 refactor(webstatement): Migrasi ke StagingController dan ubah storage disk ke local 'staging'
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)
2025-07-28 16:00:45 +07:00
Daeng Deni Mardaeni
5752427297 refactor(report): konversi query raw SQL ke pure Eloquent ORM
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
2025-07-26 08:42:42 +07:00
Daeng Deni Mardaeni
eb89916b1c refactor(webstatement): split generateReportData dan dukung closing balance per group akun
- 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
2025-07-24 09:30:13 +07:00
Daeng Deni Mardaeni
80c866f646 feat(webstatement): fallback stmt_entry_id menggunakan field id pada CSV
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
2025-07-23 14:45:08 +07:00
Daeng Deni Mardaeni
ad9780ccd6 feat(webstatement): tambah stmt_entry_detail migrasi, model, dan job processing
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
2025-07-21 11:21:42 +07:00
Daeng Deni Mardaeni
3c01c1728c feat(webstatement): tambah console command dan perbaikan field required untuk laporan closing balance
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
2025-07-18 07:36:02 +07:00
Daeng Deni Mardaeni
3beaf78872 feat(webstatement): implementasi job processing untuk laporan closing balance
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
2025-07-17 19:49:22 +07:00
Daeng Deni Mardaeni
23a0679f74 feat(jobs): exclude field terakhir dari proses CSV pada company dan data capture
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.
2025-07-15 17:25:00 +07:00
Daeng Deni Mardaeni
1564ce2efa fix(jobs): perbaikan masalah file tidak ditemukan pada proses export statement
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.
2025-07-15 17:02:23 +07:00
Daeng Deni Mardaeni
e6c46701ce refactor(jobs): hapus manajemen izin file (chmod, chown, chgrp)
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.
2025-07-15 16:40:04 +07:00
Daeng Deni Mardaeni
7818d1677b feat(webstatement): tambah field no_receipt pada processed_statements
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.
2025-07-14 09:24:38 +07:00
Daeng Deni Mardaeni
92afe58e66 feat(webstatement): tambah konfigurasi permission direktori dan perbaikan error chown
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.
2025-07-12 13:41:46 +07:00
Daeng Deni Mardaeni
efabba4c39 feat(webstatement): tambah opsi Browsershot untuk stabilitas PDF generation
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.
2025-07-11 08:28:04 +07:00
Daeng Deni Mardaeni
9c5f8b1de4 feat(webstatement): tambah proteksi password untuk ZIP file multi-account
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.
2025-07-10 20:05:50 +07:00
Daeng Deni Mardaeni
5469045b5a feat(webstatement): tambah AutoSendStatementEmailCommand dan job auto pengiriman email statement
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.
2025-07-10 19:49:31 +07:00
Daeng Deni Mardaeni
593a4f0d9c feat(webstatement): tambah enkripsi password pada PDF statement
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.
2025-07-10 14:13:16 +07:00
Daeng Deni Mardaeni
0aa7d22094 feat(webstatement): tambah fungsi generatePdf ke ExportStatementPeriodJob
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.
2025-07-10 13:15:47 +07:00
Daeng Deni Mardaeni
4b7e6c983b feat(webstatement): tambah ProcessProvinceDataJob untuk import data provinsi
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.
2025-07-10 10:03:27 +07:00
Daeng Deni Mardaeni
c1a173c8f7 feat(webstatement): tambah optimasi pemrosesan multi_account dan validasi statement
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>
2025-07-10 09:12:16 +07:00
Daeng Deni Mardaeni
8ee0dd2218 feat(webstatement): implementasi pemrosesan multi account statement berdasarkan stmt_sent_type
- 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
2025-07-09 17:51:57 +07:00
Daeng Deni Mardaeni
51697f017e feat(webstatement): tambahkan fitur pembuatan, penyimpanan, dan pengunduhan PDF statement
- **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>
2025-07-09 14:54:48 +07:00
Daeng Deni Mardaeni
40f552cb66 Merge branch 'new'
# Conflicts:
#	app/Http/Controllers/PrintStatementController.php
#	app/Jobs/GenerateBiayaKartuCsvJob.php
#	app/Jobs/SendStatementEmailJob.php
#	app/Mail/StatementEmail.php
#	resources/views/statements/email.blade.php
#	resources/views/statements/index.blade.php
2025-07-08 21:46:55 +07:00
Daeng Deni Mardaeni
65b846f0c7 feat(webstatement): tambahkan pengaturan ekspor dan optimasi fungsionalitas print statement
- **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>
2025-07-08 17:40:11 +07:00
Daeng Deni Mardaeni
428792ed1b feat(webstatement): ubah filter product_code 6021 berdasarkan ctdesc
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
2025-07-08 14:12:51 +07:00
Daeng Deni Mardaeni
6035c61cc4 feat(webstatement): tingkatkan validasi dan logging pada ProcessStmtEntryDataJob
- **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>
2025-06-17 09:54:26 +07:00
Daeng Deni Mardaeni
2c8f49af20 feat(webstatement): optimalkan saveBatch pada ProcessStmtEntryDataJob
- **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>
2025-06-17 09:45:41 +07:00
Daeng Deni Mardaeni
4bfd937490 feat(webstatement): tambahkan pengelolaan kartu ATM dengan fitur batch processing dan CSV tunggal
- **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>
2025-06-16 22:51:26 +07:00
Daeng Deni Mardaeni
7b32cb8d39 feat(webstatement): tambah filter product_code dan branch pada GenerateBiayaKartuCsvJob
- 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>
2025-06-13 15:11:25 +07:00
Daeng Deni Mardaeni
4b889da5a5 feat(webstatement): tambahkan pengelolaan product_code pada ATM Card
- **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>
2025-06-13 15:06:37 +07:00
Daeng Deni Mardaeni
dbdeceb4c0 feat(webstatement): optimalkan pengambilan informasi account untuk UpdateAtmCardBranchCurrencyJob
- **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>
2025-06-13 14:33:47 +07:00
Daeng Deni Mardaeni
d5482fb824 refactor(webstatement): restrukturisasi kode pada SendStatementEmailJob
- **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>
2025-06-12 09:18:16 +07:00
Daeng Deni Mardaeni
fabc35e729 feat(webstatement): tingkatkan proses pengiriman email dengan PHPMailer
- **Migrasi ke PHPMailer:**
  - Mengganti penggunaan `Illuminate\Support\Facades\Mail` ke PHPMailer untuk pengiriman email.
  - Menambahkan service baru `PHPMailerService` dengan dukungan autentikasi NTLM/GSSAPI.
  - Mengintegrasikan logika pengiriman email ke dalam `StatementEmail` menggunakan PHPMailer.
  - Memindahkan logika attachment dan body email ke helper method pada kelas `StatementEmail`.

- **Perbaikan Logging dan Penanganan Error:**
  - Menambah logging lebih mendetail pada proses pengiriman email, termasuk informasi seperti penerima, subjek, dan status pengiriman.
  - Menambahkan fallback untuk pembuatan konten HTML jika terjadi kegagalan rendering pada template Blade.
  - Menambahkan pengecekan dan logging untuk kegagalan pengiriman email dengan mekanisme exception handling.

- **Peningkatan Template Email:**
  - Memperbaiki elemen ulasan pada template email untuk mendukung tampilan yang lebih bersih menggunakan `list-style-type: none`.
  - Memodifikasi markup footer untuk memberikan batas terformat lebih baik.

- **Optimasi Proses Backend:**
  - Menambahkan delay antar pengiriman email untuk menghindari rate limiting pada koneksi NTLM/GSSAPI.
  - Menyediakan format nama attachment dinamis berdasarkan rekening dan periode laporan.
  - Memanfaatkan konfigurasi enkripsi dinamis, dengan fallback untuk pengujian/development.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-11 11:41:57 +07:00
Daeng Deni Mardaeni
9199a4d748 feat(webstatement): tambahkan fitur monitoring dan peningkatan pengiriman email statement
- **Perbaikan dan Penambahan Komando:**
  - Memberikan komando baru `webstatement:check-progress` untuk memantau progres pengiriman email statement.
    - Menampilkan informasi seperti `Log ID`, `Batch ID`, `Request Type`, status, hingga persentase progress.
    - Menangani secara detail jumlah akun yang diproses, sukses, gagal, dan kalkulasi tingkat keberhasilan.
    - Menyediakan penanganan error jika log tidak ditemukan atau terjadi kegagalan lainnya.
  - Memperluas komando `webstatement:send-email`:
    - Mendukung pengiriman berdasarkan `single account`, `branch`, atau `all branches`.
    - Menambahkan validasi parameter `type` (`single`, `branch`, `all`) dan input spesifik seperti `--account` atau `--branch` untuk mode tertentu.
    - Melakukan pencatatan log awal dengan metadata lengkap seperti `request_type`, `batch_id`, dan status.

- **Peningkatan Logika Proses Backend:**
  - Menambahkan fungsi `createLogEntry` untuk mencatat log pengiriman email statement secara dinamis berdasarkan tipe request.
  - Menyediakan reusable method seperti `validateParameters` dan `determineRequestTypeAndTarget` untuk mempermudah pengelolaan parameter pengiriman.
  - Memberikan feedback dan panduan kepada pengguna mengenai ID log dan komando monitoring (`webstatement:check-progress`).

- **Penambahan Controller dan Fitur UI:**
  - Menambahkan controller baru `EmailStatementLogController`:
    - Mendukung pengelolaan log seperti list, detail, dan retry untuk pengiriman ulang email statement.
    - Menyediakan fitur pencarian, filter, dan halaman data log yang responsif menggunakan datatable.
    - Menambahkan kemampuan resend email untuk log dengan status `completed` atau `failed`.
  - Mengimplementasikan UI untuk log pengiriman:
    - Halaman daftar monitoring dengan filter berdasarkan branch, account number, request type, status, dan tanggal.
    - Menampilkan kemajuan, tingkat keberhasilan, serta tombol aksi seperti detail dan pengiriman ulang.

- **Peningkatan Model dan Validasi:**
  - Menyesuaikan model `PrintStatementLog` untuk mendukung lebih banyak atribut seperti `processed_accounts`, `success_count`, `failed_count`, `request_type`, serta metode utilitas seperti `getProgressPercentage()` dan `getSuccessRate()`.
  - Memvalidasi parameter input lebih mendalam agar kesalahan dapat diminimalisasi di awal proses.

- **Peningkatan pada View dan Feedback Pengguna:**
  - Menambah daftar command berguna untuk user di interface log:
    - Status antrian dengan `php artisan queue:work`.
    - Monitoring menggunakan komando custom yang baru ditambahkan.

- **Perbaikan Logging dan Error Handling:**
  - Menambahkan logging komprehensif pada semua proses, termasuk batch pengiriman ulang.
  - Memastikan rollback pada database jika terjadi error melalui transaksi pada critical path.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-11 09:57:09 +07:00
Daeng Deni Mardaeni
f3c649572b feat(webstatement): tambahkan fitur pengiriman email statement PDF
- Menambahkan Command `SendStatementEmailCommand` untuk mengirim email statement PDF:
  - Mendukung parameter input seperti periode laporan (`YYYY-MM`), nomor rekening, ID batch, queue, dan delay waktu.
  - Menjalankan validasi parameter input, mencatat log eksekusi, dan mendispatch job pengiriman email.
  - Menyediakan feedback status eksekusi serta informasi job kepada user.

- Menambahkan Job `SendStatementEmailJob` untuk pengiriman statement dalam latar belakang:
  - Memfilter account yang memiliki email terkait, baik dari `stmt_email` atau email dari data customer.
  - Melakukan pengiriman email dengan attachment file PDF statement.
  - Mencatat log sukses atau kegagalan pengiriman untuk setiap account.

- Memperbarui Model dan Template Email:
  - Mengubah template email untuk mendukung pengisian nama rekening secara dinamis berdasarkan customer account.
  - Menambahkan pengisian dinamis untuk tahun copyright di footer.

- Memperbarui Provider `WebstatementServiceProvider`:
  - Mendaftarkan Command baru `SendStatementEmailCommand` ke dalam aplikasi.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-10 13:50:00 +07:00
Daeng Deni Mardaeni
903cbd1725 feat(webstatement): tambahkan job untuk menghasilkan laporan transaksi ATM
- Menambahkan class baru `GenerateAtmTransactionReportJob` untuk menghasilkan laporan transaksi ATM dalam format CSV.
  - Memproses transaksi ATM berdasarkan periode tertentu dengan pagination menggunakan `chunk`.
  - Mendukung inisialisasi log laporan menggunakan model `AtmTransactionReportLog`.
  - Menyertakan fitur untuk menulis header CSV dan data transaksi, termasuk handling escape karakter pada nilai CSV.

- Memperkenalkan direktori penyimpanan baru:
  - Path: `reports/atm_transactions/<period>.csv`.
  - Membuat direktori jika belum ada sebelum menyimpan laporan.

- Menambahkan logging:
  - Menyertakan informasi waktu mulai, lokasi file laporan CSV, dan jumlah transaksi yang diproses.
  - Menangani error dengan logging error message dan memperbarui status log laporan.

- Menambahkan logika pembaruan log laporan:
  - Field `status`, `file_path`, `file_size`, dan `record_count` akan diperbarui setelah proses selesai.
  - Handling error pada log laporan jika proses gagal.

- Fitur tambahan:
  - Handling escape untuk nilai CSV guna memastikan format tetap valid.
  - Menangani error dengan throwing exception jika terjadi masalah selama proses.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-08 23:40:52 +07:00
Daeng Deni Mardaeni
58a5db7303 refactor(webstatement): sederhanakan logika pemrosesan data transfer dana
- Menghapus penggunaan batching data (`transferBatch`) untuk penyederhanaan logika:
  - Menghapus konstanta `CHUNK_SIZE`.
  - Menghapus variabel dan metode terkait batching, seperti `transferBatch`, `addToBatch`, dan `saveBatch`.
  - Memproses dan menyimpan setiap baris data langsung melalui metode `saveRecord`.

- Memperbarui metode `processRow`:
  - Menggantikan logika penambahan batch dengan langsung memanggil `saveRecord`.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-06 21:00:12 +07:00
Daeng Deni Mardaeni
d85954bdf2 feat(webstatement): tambahkan pengaturan tujuan output dan unggah ke SFTP untuk combine PDF
- Memperbarui `CombinePdfJob`:
  - Menambahkan parameter baru `outputDestination`, `branchCode`, dan `period` pada constructor untuk pengaturan tujuan output.
  - Menambahkan opsi tujuan output ke `local` atau `sftp` pada proses combine PDF.
  - Menambahkan metode baru `uploadToSftp` untuk mengunggah file PDF hasil gabungan ke SFTP.
  - Mengatur jalur unggahan SFTP ke `combine/{period}/{branchCode}/{filename}`.
  - Menambahkan log informasi terkait jalur dan status unggahan file PDF ke SFTP.

- Memperbarui `CombinePdfController`:
  - Menambahkan konfigurasi `output_destination` untuk menentukan tujuan output (`local` atau `sftp`).
  - Memperbarui pemanggilan `CombinePdfJob::dispatch` dengan parameter baru untuk konfigurasi output dan SFTP.
  - Menyesuaikan log dan respons untuk mencerminkan tujuan output yang disetel.

- Tujuan pembaruan ini:
  - Memungkinkan pengaturan flexibel tujuan penyimpanan file PDF ke lokal atau SFTP.
  - Menyediakan log yang lebih informatif terkait proses combine PDF dan unggahan SFTP.
  - Mempermudah integrasi dan pengelolaan file PDF dengan pengaturan jalur dan periodisasi yang jelas.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-05 11:37:09 +07:00
Daeng Deni Mardaeni
dcb6d43026 feat(webstatement): perbaiki logika filter atribut fillable di Sector
- Memperbarui logika untuk memfilter atribut array `fillable` pada model `Sector`:
  - Menambahkan filter untuk mengabaikan atribut `id` agar tidak terikut dalam proses.
  - Mengoptimalkan proses pengambilan header CSV dengan hanya menggunakan atribut yang relevan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-05 10:44:47 +07:00
Daeng Deni Mardaeni
10fcdb5ea2 feat(webstatement): tambahkan job untuk ekspor data pernyataan periode ke CSV
- Menambahkan **`ExportStatementPeriodJob`** untuk mendukung ekspor data pernyataan periode ke file CSV:
  - Inisialisasi job dengan parameter `account_number`, `period`, `saldo`, `client`, dan `disk`.
  - Menghitung tanggal mulai (`startDate`) dan tanggal akhir (`endDate`) berdasarkan periode yang diberikan.
  - Log informasi eksekusi termasuk waktu mulai, rentang tanggal, dan hasil akhir.
  - Menangani error saat proses berjalan dengan logging terperinci.

- Memproses data pernyataan sebelum ekspor, termasuk:
  - Melakukan validasi jumlah data yang telah diproses sebelumnya.
  - Jika data belum sepenuhnya diproses, menghapus data lama pada tabel `processed_statements`.
  - Memproses data baru dengan mengolah entri dari tabel `StmtEntry`.
  - Membuat narrative dari data transaksi menggunakan model terkait `TempFundsTransfer`, `TempStmtNarrParam`, dan `TempStmtNarrFormat`.

- Menambahkan logika untuk format tanggal transaksi dan narrasi:
  - Format tanggal transaksi melalui fungsi `formatTransactionDate` dan `formatActualDate`.
  - Narasi dihasilkan dari berbagai sumber, termasuk data transaksi dan parameter lainnya.

- Ekspor data ke file CSV:
  - Mengatur struktur folder berdasarkan `client` dan `account_number`.
  - Menghapus file lama sebelum membuat file baru untuk menghindari duplikasi.
  - Membagi data menjadi chunks untuk mengurangi penggunaan memori.
  - Menambahkan header CSV dengan format kolom: `NO|TRANSACTION.DATE|REFERENCE.NUMBER|TRANSACTION.AMOUNT|TRANSACTION.TYPE|DESCRIPTION|END.BALANCE|ACTUAL.DATE`.

- Optimasi proses:
  - Proses data dalam batch menggunakan pagination (`chunk`) untuk efisiensi memori.
  - Simpan hasil processed statement ke database sementara (`processed_statements`).
  - Tambahkan log setiap entri data untuk memonitor keberhasilan proses.

- Tujuan penambahan ini:
  - Mendukung proses pengolahan dan pelaporan data rekening secara terstruktur.
  - Meningkatkan efisiensi penyimpanan dan akses data besar.
  - Menghasilkan file CSV yang dapat digunakan sebagai dokumen untuk laporan eksternal.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-04 14:47:14 +07:00
Daeng Deni Mardaeni
cc99883875 feat(webstatement): tambahkan fitur pemrosesan data sektor dan parameter pada migrasi harian
- Menambahkan opsi baru `--process_parameter` pada command `webstatement:process-daily-migration`.
  - Memungkinkan pengguna untuk menentukan parameter proses migrasi seperti tanggal (`date`) dan tipe (`type`).
  - Menambahkan logging tambahan untuk mencatat nilai parameter yang diproviding pengguna.
- Memperbarui logika command dan controller:
  - Mengirimkan parameter `date` dan `type` ke controller untuk mendukung proses migrasi dengan parameter yang lebih spesifik.
- Menambahkan proses migrasi baru untuk data sektor:
  - Membuat job `ProcessSectorDataJob` yang bertugas membaca file CSV terkait sektor dari SFTP.
  - Melakukan validasi keberadaan file, memproses tiap baris data, dan menyimpannya ke database jika valid.
  - Logging untuk setiap aktivitas proses sektor, termasuk error dan kesuksesan per baris.
- Membuat model `Sector` untuk mendukung operasi database data sektor:
  - Menambah atribut dapat diolah (`fillable`) seperti `sector_code`, `co_code`, `description`, dll.
  - Menambahkan cast `date_time` ke tipe datetime.
- Menambahkan migrasi baru untuk tabel `sectors`:
  - Tabel memiliki kolom seperti `id`, `date_time`, `description`, `curr_no`, `co_code`, dan `sector_code`.
  - Meningkatkan pendukung penyimpanan data sektor untuk migrasi masa depan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-03 11:58:16 +07:00
Daeng Deni Mardaeni
6b8f44db1d feat(webstatement): tambahkan logika penghapusan dan penggantian file PDF setelah dekripsi
- Menambahkan variabel `$finalPdfPath` untuk menyimpan lintasan file PDF akhir tanpa ekstensi `.dec`.
- Mengimplementasikan logika baru untuk:
  1. Menghapus file PDF terenkripsi setelah file berhasil didekripsi.
  2. Mengganti nama file dekripsi dengan menghilangkan ekstensi `.dec`.
- Menambahkan logging baru untuk mencatat aktivitas berikut:
  1. Penghapusan file PDF terenkripsi setelah berhasil didekripsi.
  2. Perubahan nama file dekripsi ke format final.
- Tujuan perubahan ini adalah untuk:
  1. Mengoptimalkan ruang penyimpanan dengan menghilangkan file terenkripsi setelah digunakan.
  2. Memastikan hasil dekripsi langsung dapat digunakan tanpa perlu pengolahan manual tambahan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-02 20:08:24 +07:00