# 🔍 Analisis Masalah Saldo Kas & Bank

## 📊 Masalah yang Ditemukan

**Saldo dari Dashboard (Tabel `akun`):** Rp 1.226.623.047.450,13  
**Saldo dari Jurnal Entry:** Rp 22.616.202.660,64  
**Selisih:** Rp 1.204.006.844.789,49 ❌

### Penyebab Masalah

Ada **transaksi yang membuat jurnal entry tetapi TIDAK mengupdate saldo di tabel `akun`**.

## 🔎 Sumber Data Dashboard

File: `app/Http/Controllers/DashboardController.php` (Baris 271-279)

```php
if ($user->role_id === 1) { // Untuk Yayasan
    $kasAkhir = DB::table('kas_unit')
        ->join('akun', 'kas_unit.kode_akun', '=', 'akun.kode_akun')
        ->sum('akun.saldo'); // ⚠️ Mengambil dari kolom saldo di tabel akun
}
```

**Masalah:**
- Query ini mengambil saldo dari **kolom `saldo` di tabel `akun`**
- Kolom ini seharusnya diupdate setiap kali ada transaksi
- Namun ternyata ada transaksi yang **tidak mengupdate kolom ini**

## 🔧 Solusi yang Sudah Dibuat

### 1. Command Recalculate Saldo

File: `app/Console/Commands/RecalculateSaldo.php`

**Fungsi:** Menghitung ulang saldo akun berdasarkan `jurnal_entry` dan memperbaiki ketidaksesuaian.

**Cara Penggunaan:**

```bash
# Preview (tidak mengubah database)
php artisan saldo:recalculate --dry-run

# Recalculate akun kas untuk periode aktif
php artisan saldo:recalculate

# Recalculate semua akun (termasuk non-kas)
php artisan saldo:recalculate --all

# Recalculate untuk periode tertentu
php artisan saldo:recalculate --periode=5
```

**Output:**
- Menampilkan akun mana saja yang saldonya tidak sesuai
- Menampilkan saldo lama, saldo baru, dan selisihnya
- Memberikan ringkasan total akun yang diupdate

### 2. Query SQL untuk Investigasi

File: `check_saldo_query.sql`

Berisi query untuk:
1. Cek total saldo dari tabel `akun`
2. Cek detail saldo per unit dan akun
3. Bandingkan dengan saldo dari `jurnal_entry`
4. Identifikasi akun yang tidak konsisten

## 📝 Rekomendasi

### A. Perbaikan Jangka Pendek

1. **Jalankan Recalculate Command:**
   ```bash
   # Preview dulu
   php artisan saldo:recalculate --dry-run
   
   # Jika sudah yakin, jalankan tanpa dry-run
   php artisan saldo:recalculate
   ```

2. **Verifikasi Hasil:**
   - Cek dashboard apakah saldo sudah sesuai
   - Bandingkan dengan laporan BKU
   - Pastikan tidak ada transaksi yang hilang

### B. Perbaikan Jangka Panjang

1. **Gunakan Saldo dari Jurnal Entry (Rekomendasi):**
   
   Ubah query di `DashboardController.php`:
   
   ```php
   // SEBELUM (menggunakan kolom saldo)
   $kasAkhir = DB::table('kas_unit')
       ->join('akun', 'kas_unit.kode_akun', '=', 'akun.kode_akun')
       ->sum('akun.saldo');
   
   // SESUDAH (menggunakan jurnal_entry) ✅
   $kasAkhir = DB::table('kas_unit')
       ->join('akun', 'kas_unit.kode_akun', '=', 'akun.kode_akun')
       ->join('jurnal_entry as je', 'akun.kode_akun', '=', 'je.akun_id')
       ->where('je.periode_id', $periodeId)
       ->selectRaw('SUM(je.debit - je.kredit) as total_saldo')
       ->value('total_saldo') ?? 0;
   ```

2. **Audit Semua Controller Transaksi:**
   
   Pastikan setiap controller yang membuat `JurnalEntry` juga mengupdate `akun.saldo`:
   
   - ✅ TransferDanaController - Sudah benar
   - ✅ NotaController - Sudah benar
   - ✅ PenyaluranDanaController - Sudah benar
   - ❓ PenerimaanKasController - Perlu dicek
   - ❓ PengeluaranKasController - Perlu dicek
   - ❓ RealisasiAnggaranController - Perlu dicek
   - ❓ RevisiAjuanController - Perlu dicek

3. **Buat Unit Test:**
   
   Buat test untuk memastikan setiap transaksi mengupdate saldo dengan benar:
   
   ```php
   public function test_transfer_dana_updates_saldo()
   {
       // Arrange
       $akunDari = Akun::factory()->create(['saldo' => 1000000]);
       $akunKe = Akun::factory()->create(['saldo' => 500000]);
       
       // Act
       $this->post('/transfer-dana', [
           'dari_akun_id' => $akunDari->kode_akun,
           'ke_akun_id' => $akunKe->kode_akun,
           'nominal' => 100000,
       ]);
       
       // Assert
       $this->assertEquals(900000, $akunDari->fresh()->saldo);
       $this->assertEquals(600000, $akunKe->fresh()->saldo);
   }
   ```

4. **Scheduled Task untuk Validasi:**
   
   Tambahkan task harian untuk mengecek konsistensi saldo:
   
   ```php
   // app/Console/Kernel.php
   protected function schedule(Schedule $schedule)
   {
       $schedule->command('saldo:recalculate --dry-run')
                ->daily()
                ->emailOutputOnFailure('admin@example.com');
   }
   ```

## 🎯 Langkah Selanjutnya

1. **Jalankan recalculate command** untuk memperbaiki saldo yang tidak sesuai
2. **Verifikasi** bahwa saldo dashboard sudah benar
3. **Investigasi** controller mana yang tidak mengupdate saldo
4. **Perbaiki** controller yang bermasalah
5. **Implementasi** monitoring untuk mencegah masalah serupa

## 📞 Bantuan Lebih Lanjut

Jika Anda ingin saya:
- Audit semua controller transaksi
- Implementasi solusi jangka panjang
- Membuat unit test
- Atau bantuan lainnya

Silakan beritahu saya! 😊
