# Sistem Nomor Bukti Otomatis - TTebar

## 📋 Format Nomor Bukti
```
BB + YYMMDD + XXX
```

**Contoh**: `BB260424001`
- `BB` - Kode fixed untuk "Bukti Benur"
- `260424` - Tanggal (YYMMDD) = 24 April 2026
- `001` - Nomor urut (3 digit)

## ⚙️ Cara Kerja

### 1. Database Trigger
Trigger `ttebar_before_insert` otomatis generate no_bukti saat INSERT:

```sql
CREATE TRIGGER ttebar_before_insert
BEFORE INSERT ON ttebar
FOR EACH ROW
BEGIN
    DECLARE tanggal_part VARCHAR(6);
    DECLARE nomor_urut INT;

    -- Generate tanggal part (YYMMDD)
    SET tanggal_part = DATE_FORMAT(NEW.tanggal_tebar, '%y%m%d');

    -- Cari nomor urut terakhir untuk tanggal yang sama
    SELECT COALESCE(MAX(CAST(SUBSTRING(no_bukti, -3) AS UNSIGNED)), 0) + 1
    INTO nomor_urut
    FROM ttebar
    WHERE no_bukti LIKE CONCAT('BB', tanggal_part, '%')
    AND deleted_at IS NULL;

    -- Generate no_bukti
    SET NEW.no_bukti = CONCAT('BB', tanggal_part, LPAD(nomor_urut, 3, '0'));
END
```

### 2. Logic Nomor Urut
- ✅ Reset setiap ganti tanggal
- ✅ Auto-increment per tanggal
- ✅ Hanya hitung record yang tidak dihapus (deleted_at IS NULL)
- ✅ Support input manual (jika no_bukti diisi manual, trigger tidak akan mengganti)

### 3. Contoh Sequence
```
Tanggal 2026-04-24:
- BB260424001 (Record pertama)
- BB260424002 (Record kedua)
- BB260424003 (Record ketiga)

Tanggal 2026-04-25:
- BB260425001 (Reset ke 001 karena tanggal berubah)
- BB260425002 (Record kedua tanggal 25)
```

## 💻 Penggunaan di Code

### Controller (TebarController.php)
```php
public function store(Request $request)
{
    $validated = $request->validate([
        'tanggal_tebar' => 'required|date',
        'kolam_id' => 'required|integer|exists:tkolam,id',
        'supplier_id' => 'nullable|integer|exists:tsupplier,id',
        'no_bukti' => 'nullable|string', // Opsional - di-generate otomatis
        // ... field lain
    ]);

    // No bukti akan di-generate otomatis oleh trigger database
    $tebar = TTebar::create([
        'tanggal_tebar' => $validated['tanggal_tebar'],
        'kolam_id' => $validated['kolam_id'],
        // ... field lain (tanpa no_bukti)
        'created_by' => Auth::id(),
    ]);

    // $tebar->no_bukti sudah terisi otomatis
    return "Tebar Benur {$tebar->no_bukti} berhasil disimpan!";
}
```

### Model (TTebar.php)
```php
protected $fillable = [
    'no_bukti', // Bisa NULL, akan di-generate otomatis oleh trigger database
    'tanggal_tebar',
    'kolam_id',
    // ... field lain
];
```

## 🔍 Validasi & Query

### Cek No Bukti Terakhir untuk Tanggal Tertentu
```php
$tebar = TTebar::where('tanggal_tebar', '2026-04-24')
    ->orderBy('no_bukti', 'desc')
    ->first();

echo $tebar->no_bukti; // BB260424001
```

### Cari Berapa Record Hari Ini
```php
$count = TTebar::whereDate('tanggal_tebar', today())
    ->count();

echo "Hari ini sudah ada {$count} record tebar";
```

## ⚠️ Catatan Penting

1. **Jangan isi no_bukti manual** kecuali ada alasan khusus
2. **Tanggal menentukan prefix no_bukti** - pastikan tanggal_tebar sudah benar sebelum insert
3. **Soft delete tidak mempengaruhi nomor urut** - trigger hanya menghitung record yang tidak dihapus
4. **Manual input masih didukung** - jika no_bukti diisi manual, trigger akan menggunakan nilai tersebut

## 🛠️ Troubleshooting

### No Bukti Tidak Ter-generate
```php
// Cek trigger ada
$triggers = DB::select("SHOW TRIGGERS LIKE 'ttebar%'");

// Cek trigger aktif
DB::select("SHOW TRIGGERS WHERE Trigger = 'ttebar_before_insert'");
```

### Reset Nomor Urut
```sql
-- Hapus semua record untuk tanggal tertentu
DELETE FROM ttebar WHERE DATE(tanggal_tebar) = '2026-04-24';

-- Nomor urut akan otomatis reset ke 001 untuk tanggal tersebut
```

### Lihat Trigger Detail
```sql
SHOW CREATE TRIGGER ttebar_before_insert;
```

## 📊 Monitoring

### Query untuk Dashboard
```sql
-- Total tebar hari ini
SELECT COUNT(*) as total_today
FROM ttebar
WHERE DATE(tanggal_tebar) = CURDATE();

-- No bukti terakhir hari ini
SELECT no_bukti
FROM ttebar
WHERE DATE(tanggal_tebar) = CURDATE()
ORDER BY no_bukti DESC
LIMIT 1;
```

## 🔄 Migration

### Install
```bash
php artisan migrate
```

### Rollback
```bash
php artisan migrate:rollback --step=1
```

### Status
```bash
php artisan migrate:status
```

---

**Dibuat**: 24 April 2026  
**Versi**: 1.0  
**Migration**: 2026_04_24_043249_create_auto_no_bukti_system_for_ttebar
