# Cara Kerja Auto Tutup Buku (Tanpa Cron Job)

## 🎯 Konsep

Sistem menggunakan **Middleware** untuk otomatis tutup buku bulanan, menggantikan cron job yang bermasalah di hosting.

## 🔄 Alur Kerja

```
User Login & Akses Aplikasi
         ↓
Middleware AutoTutupBukuBulanan Aktif
         ↓
Cek: Apakah sekarang tanggal 1-5?
         ↓ Ya
Cek: Apakah sudah dicek hari ini? (Cache)
         ↓ Belum
Cek: Apakah bulan lalu sudah ditutup? (Database)
         ↓ Belum
Jalankan Command: php artisan buku:tutup-bulan
         ↓
Simpan ke Cache (24 jam)
         ↓
Lanjutkan Request User
```

## 📋 Detail Implementasi

### 1. Middleware: AutoTutupBukuBulanan.php

**Lokasi:** `app/Http/Middleware/AutoTutupBukuBulanan.php`

**Fungsi:**
- Berjalan di setiap request web (setelah user login)
- Hanya aktif di tanggal 1-5 setiap bulan
- Menggunakan cache untuk mencegah pengecekan berulang

**Logika:**
```php
// Hanya jalankan untuk user yang sudah login
if (auth()->check()) {
    // Cek cache - sudah dicek hari ini?
    if (!Cache::has('auto_tutup_buku_checked_' . $currentMonth)) {
        // Hanya di tanggal 1-5
        if ($dayOfMonth <= 5) {
            // Cek apakah bulan lalu sudah ditutup
            if (!$alreadyClosed) {
                // Jalankan tutup buku
                Artisan::call('buku:tutup-bulan', [...]);
            }
        }
        // Tandai sudah dicek (cache 24 jam)
        Cache::put('auto_tutup_buku_checked_' . $currentMonth, true, 24h);
    }
}
```

### 2. Registrasi di Kernel.php

**Lokasi:** `app/Http/Kernel.php`

Middleware didaftarkan di group `web`:
```php
protected $middlewareGroups = [
    'web' => [
        // ... middleware lain
        \App\Http\Middleware\AutoTutupBukuBulanan::class,
    ],
];
```

## ⚙️ Konfigurasi

### Toleransi Tanggal

Default: **Tanggal 1-5**

Jika ingin ubah, edit file `AutoTutupBukuBulanan.php`:
```php
// Ubah angka 5 sesuai kebutuhan
if ($dayOfMonth > 5) {
    return;
}
```

### Durasi Cache

Default: **24 jam**

Jika ingin ubah, edit file `AutoTutupBukuBulanan.php`:
```php
// Ubah durasi cache
Cache::put($cacheKey, true, now()->addHours(24)); // Ganti 24 dengan angka lain
```

## 🔍 Monitoring

### Cek Log

Sistem mencatat aktivitas di log Laravel:

**Lokasi Log:** `storage/logs/laravel.log`

**Contoh Log Sukses:**
```
[2025-08-01 08:15:23] local.INFO: Auto Tutup Buku: Menutup buku bulan 7/2025
[2025-08-01 08:15:45] local.INFO: Auto Tutup Buku: Berhasil menutup buku bulan 7/2025
```

**Contoh Log Error:**
```
[2025-08-01 08:15:23] local.ERROR: Auto Tutup Buku Error: [pesan error]
```

### Cek Cache

Untuk melihat apakah sudah dicek hari ini:
```php
// Di tinker atau controller
$currentMonth = now()->format('Y-m');
$cacheKey = 'auto_tutup_buku_checked_' . $currentMonth;
$checked = Cache::has($cacheKey); // true = sudah dicek
```

### Cek Database

Untuk melihat apakah bulan sudah ditutup:
```sql
SELECT * FROM riwayat_saldo 
WHERE deskripsi LIKE 'Saldo Akhir Bulan%'
ORDER BY created_at DESC;
```

## 🛠️ Troubleshooting

### Masalah: Tidak Otomatis Tutup Buku

**Penyebab 1:** Tidak ada user yang login di tanggal 1-5
- **Solusi:** Jalankan manual `php artisan buku:tutup-bulan`

**Penyebab 2:** Cache masih aktif
- **Solusi:** Clear cache `php artisan cache:clear`

**Penyebab 3:** Middleware tidak terdaftar
- **Solusi:** Cek `app/Http/Kernel.php`, pastikan middleware ada di group `web`

### Masalah: Tutup Buku Berjalan Berulang Kali

**Penyebab:** Cache tidak berfungsi
- **Solusi:** 
  1. Pastikan cache driver berfungsi (cek `.env` → `CACHE_DRIVER`)
  2. Jika `CACHE_DRIVER=file`, pastikan folder `storage/framework/cache` writable

### Masalah: Error di Log

**Solusi:**
1. Cek detail error di `storage/logs/laravel.log`
2. Pastikan command `buku:tutup-bulan` bisa dijalankan manual
3. Cek permission database dan storage

## ✅ Keuntungan Metode Ini

| Aspek | Cron Job | Middleware |
|-------|----------|------------|
| **Setup** | Perlu akses server | Tidak perlu |
| **Hosting** | Sering bermasalah di shared hosting | Berfungsi di semua hosting |
| **Waktu Eksekusi** | Tepat waktu (00:01) | Saat user pertama login |
| **Maintenance** | Perlu monitoring cron | Otomatis |
| **Toleransi** | Tidak ada | Sampai tanggal 5 |
| **Performance** | Tidak bergantung traffic | Bergantung ada user login |

## 📝 Catatan Penting

1. **Minimal 1 user harus login** di tanggal 1-5 agar tutup buku berjalan
2. **Jika tidak ada yang login**, jalankan manual di akhir bulan
3. **Cache mencegah beban server** - hanya cek 1x per hari
4. **Log mencatat semua aktivitas** - mudah untuk debugging
5. **Aman untuk production** - tidak akan crash aplikasi jika error

## 🔄 Alternatif Manual

Jika ingin kontrol penuh, tetap bisa jalankan manual:

```bash
# Tutup buku bulan lalu
php artisan buku:tutup-bulan

# Tutup buku bulan tertentu
php artisan buku:tutup-bulan 7 2025

# Tutup buku untuk unit tertentu
php artisan buku:tutup-bulan 7 2025 --unit_id=1
```

---

**File Terkait:**
- Middleware: `app/Http/Middleware/AutoTutupBukuBulanan.php`
- Kernel: `app/Http/Kernel.php`
- Command: `app/Console/Commands/TutupBukuBulanan.php`
