Oke. Ini klasik banget. Dan jujur aja… ini bug yang *pasti* kejadian kalau logic saldo cuma mikir “ada transaksi → ubah saldo”, tanpa mikir “ini update atau create?”.

Sekarang masalahnya jelas:
Setiap kali kamu **update**, kamu hitung ulang saldo berdasarkan `amount` baru, tapi kamu **tidak mengembalikan efek transaksi lama dulu**.

Jadi skemanya sekarang kira-kira begini:

1. Saldo awal rekening: 1.000.000
2. Ada transaksi keluar 100.000 → saldo jadi 900.000
3. Kamu edit transaksi itu (misal tetap 100.000)
4. System hitung lagi → saldo jadi 800.000

Ya jelas turun terus. Sistem kamu nganggep itu transaksi baru tiap kali update. Kasian saldonya.

---

## 🔥 Masalah Intinya

Di update kamu langsung panggil:

```php
$saldoAkhir = $this->calculateSaldoAkhir(
    $request->rekening_id,
    $request->amount,
    (bool) $kodeMutasi->is_in
);
```

Padahal kamu belum:

* Ambil data transaksi lama
* Reverse efek transaksi lama dari saldo rekening

Jadi saldo lama sudah kepotong, lalu dipotong lagi.

---

# ✅ SOLUSI YANG BENAR (secara akuntansi waras)

## Step 1: Ambil data transaksi lama

```php
$oldMutasi = DB::table('trs_mutasi_bank')->where('id', $id)->first();
if (!$oldMutasi) {
    return response()->json([...], 404);
}
```

---

## Step 2: Reverse efek transaksi lama dari rekening

Misalnya:

```php
$rekening = DB::table('ms_rekening')->where('id', $oldMutasi->rekening_id)->first();
$saldoSekarang = $rekening->saldo_akhir;
```

Lalu kembalikan efek lama:

```php
if ($oldMutasi->is_credit) {
    $saldoSekarang -= $oldMutasi->amount;
} else {
    $saldoSekarang += $oldMutasi->amount;
}
```

Sekarang saldo sudah kembali ke kondisi sebelum transaksi itu dibuat.

---

## Step 3: Apply transaksi baru

```php
if ($kodeMutasi->is_in) {
    $saldoBaru = $saldoSekarang + $request->amount;
} else {
    $saldoBaru = $saldoSekarang - $request->amount;
}
```

---

## Step 4: Update rekening dengan saldo baru

```php
DB::table('ms_rekening')
    ->where('id', $request->rekening_id)
    ->update(['saldo_akhir' => $saldoBaru]);
```

---

# ⚠️ Tapi Tunggu… Ini Masih Belum Aman

Kalau transaksi bisa diedit:

* tanggal berubah
* rekening berubah
* amount berubah

Maka cara paling aman di sistem finansial itu bukan patch saldo seperti ini.

Cara yang lebih bersih:

## 💎 Best Practice Dunia Nyata

Saldo rekening **tidak disimpan statis.**
Saldo dihitung dari SUM seluruh mutasi.

Atau kalau mau simpan `saldo_akhir`, maka:

* setiap update transaksi
* kamu harus rebuild saldo dari transaksi paling awal sampai sekarang

Itu lebih aman daripada coba tambal-tambal saldo.

---

# 🎯 Cara Lebih Clean (Rebuild saldo rekening)

Setelah update mutasi:

```php
$allMutasi = DB::table('trs_mutasi_bank')
    ->where('rekening_id', $request->rekening_id)
    ->orderBy('date')
    ->orderBy('id')
    ->get();
```

Lalu loop:

```php
$saldo = 0;
foreach ($allMutasi as $mutasi) {
    if ($mutasi->is_credit) {
        $saldo += $mutasi->amount;
    } else {
        $saldo -= $mutasi->amount;
    }

    DB::table('trs_mutasi_bank')
        ->where('id', $mutasi->id)
        ->update(['saldo_akhir' => $saldo]);
}
```

Dan terakhir update `ms_rekening`.

---

# 💡 Mana Yang Harus Kamu Pilih?

| Skala Sistem            | Saran                                            |
| ----------------------- | ------------------------------------------------ |
| Mutasi < 10k            | Rebuild semua saldo tiap update                  |
| Mutasi besar            | Reverse old → apply new                          |
| Sistem finansial serius | Gunakan ledger system, bukan update saldo manual |

---

# 🧠 Insight Penting

Kalau kamu simpan `saldo_akhir` di tiap transaksi, itu artinya:

> Kamu bikin sistem ledger.

Ledger itu artinya:

* Urutan tanggal sangat penting
* Tidak boleh ada update sembarangan
* Harus rebuild kalau ada edit history

Kalau enggak, saldo kamu bakal drift. Dan drift di sistem uang itu bukan bug kecil. Itu bom waktu.

---

Kesimpulan:

Bug kamu bukan di Laravel.
Bug kamu di konsep akuntansi transaksional.

Fix-nya:

* Ambil data lama
* Reverse efeknya
* Apply data baru
  ATAU
* Rebuild saldo total dari awal

Dan tolong jangan biarkan saldo rekening dipukul-pukul terus tiap kali user klik save. Rekening juga punya harga diri.
