# Filter DFT di Golang - Skip Sebelum Forward ke Shared Hosting

## Perubahan

**Sebelum:** Semua webhook di-forward ke shared hosting, lalu receiver.php skip yang DFT.

**Sesudah:** Golang check DFT dulu, skip forward ke shared hosting jika DFT.

---

## Manfaat

### ✅ 1. Menghemat Bandwidth & Waktu

- **Sebelum:** Forward 83 webhook → Shared hosting skip 82 DFT → Waste bandwidth
- **Sesudah:** Skip 82 DFT di Golang → Hanya forward 1 yang valid → Hemat bandwidth

### ✅ 2. Mengurangi Load di Shared Hosting

- Shared hosting tidak perlu terima dan proses webhook yang akan di-skip
- Mengurangi beban database connection, parsing, dll

### ✅ 3. Logging Lebih Jelas

- Status di queue: `completed` dengan error `skipped_draft`
- Log jelas: `⏭️ [Queue X] Skipping draft SALES_RECEIPT (DFT)`
- Mudah track berapa banyak DFT yang di-skip

### ✅ 4. Tetap Ada Audit Trail

- DFT tetap disimpan di `webhook_queue` dengan status `completed`
- Error field berisi `skipped_draft` untuk identifikasi
- Bisa query untuk analisis: berapa banyak DFT vs BKB

---

## Implementasi

### Fungsi `isDraftPayload()`

```go
func (p *Pool) isDraftPayload(payload interface{}, webhookType string) bool {
    // Check SALES_RECEIPT: salesReceiptNo dimulai dengan "DFT"
    // Check SALES_INVOICE: salesInvoiceNo dimulai dengan "DFT"
    // Return true jika draft, false jika bukan
}
```

### Alur Proses

```
1. Worker ambil job dari queue
2. Parse payload
3. Check apakah DFT:
   - Jika DFT → Skip forward, mark completed dengan error="skipped_draft"
   - Jika bukan DFT → Forward ke shared hosting seperti biasa
```

---

## Status Queue

**DFT yang di-skip:**
- Status: `completed`
- Error: `skipped_draft`
- Tidak di-forward ke shared hosting

**Bukan DFT:**
- Status: `completed` (jika forward berhasil)
- Error: `NULL` atau error message (jika forward gagal)
- Di-forward ke shared hosting

---

## Query untuk Analisis

**Hitung DFT vs BKB yang di-skip:**

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT 
    CASE 
        WHEN error = 'skipped_draft' THEN 'DFT (Skipped)'
        WHEN error IS NULL THEN 'BKB (Forwarded)'
        ELSE 'Error: ' || substr(error, 1, 30)
    END AS category,
    COUNT(*) as count
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT'
    AND date(created_at) = date('now')
GROUP BY category;
"
```

**Lihat detail DFT yang di-skip:**

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT 
    id,
    type,
    error,
    datetime(created_at) as created
FROM webhook_queue 
WHERE error = 'skipped_draft'
    AND date(created_at) = date('now')
ORDER BY id DESC
LIMIT 20;
"
```

---

## Log yang Akan Muncul

**DFT yang di-skip:**
```
⏭️ [Queue 123] Skipping draft SALES_RECEIPT (DFT) - not forwarding to shared hosting
✅ [Queue 123] Skipped draft SALES_RECEIPT (2ms)
```

**Bukan DFT (forward seperti biasa):**
```
🔄 [Queue 124] Forwarding SALES_RECEIPT to shared hosting...
✅ [Forward] Shared hosting responded OK (status 200, took 150ms)
✅ [Queue 124] Relay Success: SALES_RECEIPT (152ms)
```

---

## Apakah Menghambat Proses?

**Tidak, malah mempercepat!**

**Sebelum:**
- Forward 83 webhook → Shared hosting proses semua → Skip 82 DFT
- Total waktu: 83 × ~150ms = ~12.5 detik
- Bandwidth: 83 × ~500 bytes = ~41 KB

**Sesudah:**
- Skip 82 DFT di Golang (~2ms per skip) → Forward 1 webhook
- Total waktu: 82 × ~2ms + 1 × ~150ms = ~314ms
- Bandwidth: 1 × ~500 bytes = ~500 bytes

**Percepatan: ~40x lebih cepat!** ⚡

---

## Verifikasi Setelah Deploy

**1. Cek log untuk skip DFT:**

```bash
sudo journalctl -u webhook-service --since "today" | grep "Skipping draft"
```

Harusnya muncul banyak log `⏭️ [Queue X] Skipping draft`.

**2. Cek status queue:**

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT 
    error,
    COUNT(*) as count
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT'
    AND date(created_at) = date('now')
GROUP BY error;
"
```

Harusnya banyak yang `error = 'skipped_draft'`.

**3. Cek shared hosting log:**

Harusnya **tidak ada lagi** log `[Receipt] Skipping Draft` karena DFT sudah di-skip di Golang.

---

## Kesimpulan

✅ **Filter DFT di Golang** → Lebih efisien, tidak menghambat proses  
✅ **Menghemat bandwidth** → Hanya forward yang valid  
✅ **Mengurangi load** → Shared hosting tidak perlu proses DFT  
✅ **Tetap ada audit trail** → DFT tetap disimpan di queue dengan status jelas  

**Tidak ada downside** - ini adalah optimasi yang bagus! 🎉
