# Penjelasan: Batch Webhook dari Accurate

## Observasi

Dari log Accurate, terlihat bahwa **SALES_INVOICE** dan **SALES_RECEIPT** dikirim dengan **timestamp yang sama persis** (sampai detik), contoh:

```
02/02/2026 16:41:44 - SALES_RECEIPT
02/02/2026 16:41:44 - SALES_INVOICE  ← timestamp sama persis!
```

**Secara logika:** Tidak mungkin satu PIC mengirim 2 transaksi berbeda di waktu yang sama persis. Ini berarti Accurate mengirimnya sebagai **batch dalam satu request HTTP**.

---

## Format Batch dari Accurate

Accurate mengirim webhook dalam format **array JSON**:

```json
[
  {
    "databaseId": 1293289,
    "type": "SALES_INVOICE",
    "timestamp": "02/02/2026 16:41:44",
    "uuid": "abc-123",
    "data": [...]
  },
  {
    "databaseId": 1293289,
    "type": "SALES_RECEIPT",
    "timestamp": "02/02/2026 16:41:44",
    "uuid": "def-456",
    "data": [...]
  }
]
```

**Satu request HTTP** → **dua payload** dengan timestamp sama.

---

## Masalah Sebelumnya

**Handler Golang lama** hanya memproses **payload pertama**:

```go
payload := payloads[0]  // ❌ Hanya ambil yang pertama
// Insert hanya payload pertama ke queue
```

**Akibatnya:**
- ✅ SALES_INVOICE masuk queue → diproses → masuk database
- ❌ SALES_RECEIPT diabaikan → tidak masuk queue → tidak masuk database

**Ini menjelaskan kenapa SALES_RECEIPT "tidak masuk" padahal Accurate sudah kirim!**

---

## Fix yang Sudah Dilakukan

**Handler sekarang loop semua payload dalam batch:**

```go
// ✅ Loop semua payload
for i, payload := range payloads {
    // Insert setiap payload ke queue
    // Submit setiap queue ID ke worker
}
```

**Logging yang ditambahkan:**
- `📦 [Webhook] Batch detected: 2 payload(s) - types: [SALES_INVOICE, SALES_RECEIPT]`
- `  → [Webhook] Queued payload 1/2: type=SALES_INVOICE, queue_id=123`
- `  → [Webhook] Queued payload 2/2: type=SALES_RECEIPT, queue_id=124`
- `✅ [Webhook] Successfully queued 2 payload(s) - queue IDs: [123, 124]`

---

## Alur Setelah Fix

### 1. Accurate Kirim Batch
```
POST /webhook/accurate
Body: [SALES_INVOICE, SALES_RECEIPT]  ← 1 request, 2 payload
```

### 2. Handler Golang
```
✅ Detect batch: 2 payload(s)
✅ Insert payload 1 → queue ID 123
✅ Insert payload 2 → queue ID 124
✅ Submit both to worker pool
```

### 3. Worker Pool
```
Worker 1: Process queue ID 123 (SALES_INVOICE)
  → Forward ke shared hosting
  → Status: completed

Worker 2: Process queue ID 124 (SALES_RECEIPT)
  → Forward ke shared hosting
  → Status: completed
```

### 4. Shared Hosting (receiver.php)
```
✅ Receive SALES_INVOICE → Process → Insert ke database
✅ Receive SALES_RECEIPT → Process → Insert ke database
```

**Keduanya masuk database!** ✅

---

## Verifikasi Setelah Deploy

**1. Cek log saat batch datang:**

```bash
sudo journalctl -u webhook-service -f
```

Harusnya muncul:
```
📥 [Webhook] Incoming POST /webhook/accurate Content-Length:497
📦 [Webhook] Batch detected: 2 payload(s) - types: [SALES_INVOICE, SALES_RECEIPT]
  → [Webhook] Queued payload 1/2: type=SALES_INVOICE, queue_id=123
  → [Webhook] Queued payload 2/2: type=SALES_RECEIPT, queue_id=124
✅ [Webhook] Successfully queued 2 payload(s) - queue IDs: [123, 124]
```

**2. Cek di SQLite:**

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT id, type, datetime(created_at) 
FROM webhook_queue 
WHERE datetime(created_at) >= datetime('now', '-10 minutes')
ORDER BY id DESC
LIMIT 10;
"
```

Harusnya **SALES_INVOICE dan SALES_RECEIPT** dengan timestamp yang sama **keduanya ada**.

**3. Cek di database MySQL:**

```sql
SELECT nomor, type, created_at 
FROM t_log_accurate 
WHERE DATE(created_at) = '2026-02-02'
ORDER BY created_at DESC
LIMIT 20;
```

Harusnya **SALES_RECEIPT mulai masuk** (tidak hanya SALES_INVOICE).

---

## Kesimpulan

**Masalah utama:** Handler tidak support batch → hanya proses payload pertama → SALES_RECEIPT diabaikan.

**Solusi:** Handler sekarang loop semua payload → semua masuk queue → semua diproses → semua masuk database.

**Setelah deploy fix ini, SALES_RECEIPT akan mulai masuk ke database MySQL!** ✅
