Compare commits

...

6 Commits

Author SHA1 Message Date
Daeng Deni Mardaeni
8ca526e4f2 refactor(webstatement): optimalkan pemrosesan batch data bill detail
- Mengubah mekanisme pemrosesan batch `billDetailBatch` menjadi pemrosesan per chunk untuk manajemen memori yang lebih baik.
- Menambahkan langkah penghapusan data eksisting berdasarkan `stmt_entry_ids` sebelum melakukan insert untuk menghindari konflik data.
- Mengganti metode `upsert` dengan kombinasi `delete` dan `insert` untuk tiap chunk data.
- Menyisipkan komentar untuk memberikan penjelasan yang lebih rinci terkait proses chunking.
- Memastikan batch `billDetailBatch` di-reset setelah selesai diproses.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 21:58:08 +07:00
Daeng Deni Mardaeni
e14ae2ef9c refactor(webstatement): optimize ATM transaction processing
- Ubah mekanisme pengolahan batch transaksi ATM agar lebih efisien dan hemat memori.
- Hapus proses `upsert` secara langsung dan ganti dengan pendekatan berikut:
  1. Iterasi data batch dalam chunk kecil untuk menghindari konsumsi memori berlebih.
  2. Hapus data yang sudah ada berdasarkan `transaction_id` untuk menghindari konflik saat insert ulang.
  3. Gunakan metode `insert` untuk memasukkan data sekaligus per chunk.
- Tambahkan logika reset batch setelah selesai pengolahan.
- Tingkatkan skalabilitas dan stabilitas alur pengolahan data dengan mengurangi beban memori saat pemrosesan data besar.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 21:57:53 +07:00
Daeng Deni Mardaeni
7498d14087 refactor(webstatement): optimize ProcessTellerDataJob batching
Ubah alur proses batch pada job untuk meningkatkan efisiensi dan manajemen memori.

- Mengganti metode `upsert` dengan pendekatan manual yang memecah data batch menjadi potongan lebih kecil.
- Menambahkan proses penghapusan record lama berdasarkan `id_teller` sebelum melakukan insert baru untuk menghindari konflik data.
- Menggunakan loop untuk memproses batch dalam potongan-potongan kecil, sehingga mengurangi beban memori.
- Memastikan batch direset setelah selesai diproses untuk menghindari kebocoran data atau konflik.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 21:57:39 +07:00
Daeng Deni Mardaeni
369f24a8e2 refactor(webstatement): optimalkan pemrosesan batch transfer dana
- Mengubah mekanisme pemrosesan `transferBatch` menjadi berbasis chunk untuk mengoptimalkan penggunaan memori.
- Menambahkan logika penghapusan data lama dengan `_id` terkait sebelum menyisipkan data baru untuk menghindari konflik.
- Mengganti metode `upsert` dengan kombinasi `delete` dan `insert` untuk lebih fleksibel dalam penanganan data.
- Memastikan batch transfer diatur ulang setelah selesai diproses.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 21:57:23 +07:00
Daeng Deni Mardaeni
d455707dbc refactor(webstatement): optimalkan proses penyimpanan batch dalam ProcessStmtEntryDataJob
- Menghapus logika `updateOrCreate` dan menggantinya dengan penghapusan (`delete`) berdasarkan `stmt_entry_id` sebelum melakukan operasi `insert`.
- Menambahkan pembagian proses ke dalam chunk yang lebih kecil untuk manajemen memori yang lebih baik.
- Memastikan semua `stmt_entry_ids` dalam chunk diekstrak dan digunakan untuk meminimalisir konflik data.
- Menambah logging yang lebih detail dengan `e.getTraceAsString()` untuk mempermudah debugging ketika terdapat error.
- Membersihkan `entryBatch` baik setelah proses sukses maupun ketika terjadi kesalahan untuk mencegah reprocessing pada data yang sama.

Perubahan ini bertujuan untuk meningkatkan efisiensi dan memastikan integritas data selama proses penyimpanan batch.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 20:59:49 +07:00
Daeng Deni Mardaeni
76ebdce2ea fix(webstatement): ubah metode upsert menjadi updateOrCreate pada ProcessStmtEntryDataJob
- Refactor proses penyimpanan data pada `ProcessStmtEntryDataJob`:
  - Mengganti metode `StmtEntry::upsert` dengan `StmtEntry::updateOrCreate` untuk setiap entri dalam batch.
  - Metode `updateOrCreate` memungkinkan pembaruan data atau penyisipan data baru berdasarkan `stmt_entry_id` sebagai kunci unik.
- Meningkatkan fleksibilitas pembaruan data dengan menggunakan loop per entry dibandingkan bulk operation, sehingga lebih kompatibel untuk kasus tertentu.

- Tambahkan file migrasi baru untuk penyesuaian tabel `stmt_entry`:
  - File migrasi telah dibuat sebagai dasar, namun implementasi detail dalam tabel masih kosong.
  - File ini akan digunakan untuk perubahan skema di masa mendatang sesuai kebutuhan pengembangan.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-29 19:40:35 +07:00
6 changed files with 88 additions and 35 deletions

View File

@@ -223,14 +223,19 @@
{
try {
if (!empty($this->atmTransactionBatch)) {
// Bulk insert/update ATM transactions
AtmTransaction::upsert(
$this->atmTransactionBatch,
['transaction_id'], // Unique key
array_values(array_diff(self::HEADER_MAP, ['id'])) // Update columns (all except transaction_id)
);
// Process in smaller chunks for better memory management
foreach ($this->atmTransactionBatch as $entry) {
// Extract all stmt_entry_ids from the current chunk
$entryIds = array_column($entry, 'transaction_id');
// Reset batch after processing
// Delete existing records with these IDs to avoid conflicts
AtmTransaction::whereIn('transaction_id', $entryIds)->delete();
// Insert all records in the chunk at once
AtmTransaction::insert($entry);
}
// Reset entry batch after processing
$this->atmTransactionBatch = [];
}
} catch (Exception $e) {

View File

@@ -182,14 +182,19 @@
{
try {
if (!empty($this->billDetailBatch)) {
// Bulk insert/update bill details
TempBillDetail::upsert(
$this->billDetailBatch,
['_id'], // Unique key
array_diff((new TempBillDetail())->getFillable(), ['_id']) // Update columns
);
// Process in smaller chunks for better memory management
foreach ($this->billDetailBatch as $entry) {
// Extract all stmt_entry_ids from the current chunk
$entryIds = array_column($entry, '_id');
// Reset batch after processing
// Delete existing records with these IDs to avoid conflicts
TempBillDetail::whereIn('_id', $entryIds)->delete();
// Insert all records in the chunk at once
TempBillDetail::insert($entry);
}
// Reset entry batch after processing
$this->billDetailBatch = [];
}
} catch (Exception $e) {

View File

@@ -186,14 +186,19 @@
{
try {
if (!empty($this->transferBatch)) {
// Bulk insert/update funds transfers
TempFundsTransfer::upsert(
$this->transferBatch,
['_id'], // Unique key
array_diff((new TempFundsTransfer())->getFillable(), ['_id']) // Update columns
);
// Process in smaller chunks for better memory management
foreach ($this->transferBatch as $entry) {
// Extract all stmt_entry_ids from the current chunk
$entryIds = array_column($entry, '_id');
// Reset transfer batch after processing
// Delete existing records with these IDs to avoid conflicts
TempFundsTransfer::whereIn('_id', $entryIds)->delete();
// Insert all records in the chunk at once
TempFundsTransfer::insert($entry);
}
// Reset entry batch after processing
$this->transferBatch = [];
}
} catch (Exception $e) {

View File

@@ -191,18 +191,23 @@
{
try {
if (!empty($this->entryBatch)) {
// Bulk insert/update statement entries
StmtEntry::upsert(
$this->entryBatch,
['stmt_entry_id'], // Unique key
array_diff((new StmtEntry())->getFillable(), ['stmt_entry_id']) // Update columns
);
// Process in smaller chunks for better memory management
foreach ($this->entryBatch as $entry) {
// Extract all stmt_entry_ids from the current chunk
$entryIds = array_column($entry, 'stmt_entry_id');
// Delete existing records with these IDs to avoid conflicts
StmtEntry::whereIn('stmt_entry_id', $entryIds)->delete();
// Insert all records in the chunk at once
StmtEntry::insert($entry);
}
// Reset entry batch after processing
$this->entryBatch = [];
}
} catch (Exception $e) {
Log::error("Error in saveBatch: " . $e->getMessage());
Log::error("Error in saveBatch: " . $e->getMessage() . "\n" . $e->getTraceAsString());
$this->errorCount += count($this->entryBatch);
// Reset batch even if there's an error to prevent reprocessing the same failed records
$this->entryBatch = [];

View File

@@ -293,14 +293,19 @@
{
try {
if (!empty($this->tellerBatch)) {
// Bulk insert/update teller records
Teller::upsert(
$this->tellerBatch,
['id_teller'], // Unique key
array_diff(array_values(self::HEADER_MAP), ['id_teller']) // Update columns
);
// Process in smaller chunks for better memory management
foreach ($this->tellerBatch as $entry) {
// Extract all stmt_entry_ids from the current chunk
$entryIds = array_column($entry, 'id_teller');
// Reset batch after processing
// Delete existing records with these IDs to avoid conflicts
Teller::whereIn('id_teller', $entryIds)->delete();
// Insert all records in the chunk at once
Teller::insert($entry);
}
// Reset entry batch after processing
$this->tellerBatch = [];
}
} catch (Exception $e) {

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('stmt_entry', function (Blueprint $table) {
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('stmt_entry', function (Blueprint $table) {
});
}
};