# Fix: Support Batch Webhook dari Accurate

## Masalah yang Ditemukan

**Accurate mengirim webhook dalam format batch** (beberapa payload dalam satu request), contoh:

```json
[
  {"type": "SALES_INVOICE", "databaseId": 1293289, "data": [...]},
  {"type": "SALES_RECEIPT", "databaseId": 1293289, "data": [...]}
]
```

**Masalah:** Handler Golang hanya memproses **payload pertama** (`payloads[0]`), sehingga:
- ✅ SALES_INVOICE masuk queue
- ❌ SALES_RECEIPT diabaikan (tidak masuk queue)

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

---

## Perbaikan yang Dilakukan

**File:** `handlers/webhook.go`

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

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

---

## Format Batch yang Didukung

### Format 1: Array langsung
```json
[
  {"type": "SALES_INVOICE", "data": [...]},
  {"type": "SALES_RECEIPT", "data": [...]}
]
```

### Format 2: Single object (masih didukung)
```json
{"type": "SALES_RECEIPT", "data": [...]}
```

### Format 3: Batch dengan wrapper (dari Golang relay ke shared hosting)
```json
{
  "payload": [
    {"type": "SALES_INVOICE", "data": [...]},
    {"type": "SALES_RECEIPT", "data": [...]}
  ],
  "timestamp": "2026-02-02T17:03:19Z"
}
```

**Catatan:** Format 3 digunakan saat Golang relay forward ke shared hosting. Receiver.php sudah support batch (loop semua payload).

---

## Cara Deploy Fix

**1. Build ulang binary:**

```powershell
cd c:\Users\MSahrul\Documents\PROJECT\lims\golang-webhook-service
$env:GOOS = "linux"; $env:GOARCH = "amd64"; go build -o webhook-service .
```

**2. Upload ke VPS:**

```powershell
scp webhook-service root@202.155.95.172:/tmp/
```

**3. Di VPS - ganti binary dan restart:**

```bash
sudo systemctl stop webhook-service
sudo cp /tmp/webhook-service /opt/webhook-service/
sudo chmod +x /opt/webhook-service/webhook-service
sudo chown www-data:www-data /opt/webhook-service/webhook-service
sudo systemctl start webhook-service
sudo systemctl status webhook-service
```

**4. Test:**

Setelah Accurate kirim batch lagi, cek log:

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

Harusnya muncul log: `✅ [Webhook] Queued 2 payload(s): [123, 124]` (atau lebih jika batch besar).

**5. Verifikasi 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', '-1 hour')
ORDER BY id DESC
LIMIT 20;
"
```

Harusnya **SALES_INVOICE dan SALES_RECEIPT** dengan timestamp yang sama (dari batch yang sama) **keduanya masuk queue**.

---

## Response Format

**Sebelum (single payload):**
```json
{
  "status": "success",
  "id": 123
}
```

**Sesudah (batch support):**
```json
{
  "status": "success",
  "count": 2,
  "ids": [123, 124]
}
```

---

## Verifikasi

Setelah deploy, cek:

1. ✅ Log menunjukkan `Queued X payload(s)` dengan X > 1 jika batch
2. ✅ Di SQLite, SALES_INVOICE dan SALES_RECEIPT dengan timestamp sama **keduanya ada**
3. ✅ Di database MySQL, SALES_RECEIPT mulai masuk (tidak hanya SALES_INVOICE)

---

## Catatan

- **Receiver.php** sudah support batch dari awal (loop semua payload)
- Masalahnya hanya di **handler Golang** yang hanya ambil payload pertama
- Setelah fix ini, semua payload dalam batch akan diproses dengan benar

---

**Ini adalah penyebab utama kenapa SALES_RECEIPT "tidak masuk"** - karena dikirim dalam batch yang sama dengan SALES_INVOICE, tapi hanya SALES_INVOICE yang diproses!
