# Debug: Webhook Terhenti Setelah Jam 10 & Hanya 1 Masuk Database

## Masalah

1. **Webhook terhenti setelah jam 10** (padahal transaksi sampai jam 17)
2. **Di database MySQL hanya 1 terinput** (padahal di `webhook_queue` banyak)

---

## Langkah Debugging

### 1. Cek Apakah Service Masih Running Setelah Jam 10

```bash
# Cek status service
sudo systemctl status webhook-service

# Cek log setelah jam 10
sudo journalctl -u webhook-service --since "2026-02-02 10:00:00" --until "2026-02-02 18:00:00"
```

**Yang dicari:**
- Apakah service masih **active (running)**?
- Apakah ada log **error** atau **crash** setelah jam 10?
- Apakah masih ada log **"Incoming POST"** setelah jam 10?

**Jika service crash/stop:** Cek log error dan restart service.

---

### 2. Cek Apakah Accurate Masih Mengirim Webhook Setelah Jam 10

**Di Accurate IRIS dashboard:**
- Login → Webhook Log
- Filter tanggal **2 Februari 2026**, jam **10:00–17:00**
- Cek apakah ada webhook **SALES_RECEIPT** yang dikirim setelah jam 10

**Jika Accurate tidak mengirim:** Masalah di sisi Accurate (konfigurasi webhook, subscription expired, dll).

**Jika Accurate masih mengirim tapi tidak masuk queue:** Masalah di VPS (service down, network, firewall).

---

### 3. Cek Payload yang Masuk (Apakah Semua DFT?)

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT 
    id, 
    type, 
    status,
    substr(payload, instr(payload, '\"salesReceiptNo\"') + 18, 30) AS receipt_no_preview,
    datetime(created_at) as created
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT' 
    AND datetime(created_at) >= '2026-02-02 10:00:00'
ORDER BY id DESC;
"
```

**Yang dicari:**
- Apakah semua `salesReceiptNo` dimulai dengan **"DFT"** (draft)?
- Jika semua DFT → receiver.php akan **skip** semua → tidak ada yang masuk database MySQL.

**Solusi jika semua DFT:**
- Ini normal: Accurate hanya kirim webhook saat **buat draft** (DFT), bukan saat **validasi** (BKB).
- Lihat dokumen `ACCURATE-BKB-vs-DFT.md` untuk penjelasan lengkap.

---

### 4. Cek Error Saat Forward ke Shared Hosting

```bash
# Cek log untuk error forward
sudo journalctl -u webhook-service --since "2026-02-02 10:00:00" | grep -i "error\|failed\|retry\|shared hosting"
```

**Yang dicari:**
- `⚠️ [Queue X] Retry` → forward ke shared hosting gagal
- `shared hosting status 500` atau `timeout` → shared hosting error atau lambat
- `💀 [Queue X] Failed` → sudah retry maksimal, tetap gagal

**Jika ada error forward:**
- Cek apakah **SHARED_HOSTING_URL** benar dan bisa diakses dari VPS
- Cek apakah shared hosting **receiver.php** masih jalan
- Cek log error di shared hosting (cPanel error log atau PHP error log)

---

### 5. Cek Status Queue di SQLite

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT 
    status, 
    COUNT(*) as count,
    MIN(datetime(created_at)) as first,
    MAX(datetime(created_at)) as last
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT'
    AND datetime(created_at) >= '2026-02-02 00:00:00'
GROUP BY status;
"
```

**Yang dicari:**
- Berapa yang **pending** (belum diproses)?
- Berapa yang **failed** (gagal)?
- Berapa yang **completed** (berhasil relay)?

**Jika banyak pending:** Worker pool mungkin penuh atau service crash sebelum selesai.

**Jika banyak failed:** Cek error message di kolom `error`:

```bash
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT id, error, attempts, datetime(created_at)
FROM webhook_queue 
WHERE status = 'failed' 
    AND datetime(created_at) >= '2026-02-02 10:00:00'
LIMIT 10;
"
```

---

### 6. Cek Log Shared Hosting (receiver.php)

**Di shared hosting (cPanel / File Manager):**
- Buka **error log** atau **PHP error log**
- Cari log dengan keyword: `[Receipt]`, `[Webhook]`, `Skipping Draft`

**Atau jika receiver.php menulis ke file log:**

```bash
# SSH ke shared hosting (jika ada akses)
tail -f /path/to/receiver.log | grep -E "Receipt|Skipping|Error"
```

**Yang dicari:**
- Apakah webhook **sampai** ke receiver.php setelah jam 10?
- Apakah semua di-skip karena **DFT**?
- Apakah ada **error** saat proses (DB error, API error, dll)?

---

### 7. Test Manual Forward ke Shared Hosting

**Dari VPS, test apakah shared hosting bisa diakses:**

```bash
curl -X POST https://po.persadalab.com/webhook/receiver.php \
  -H "Content-Type: application/json" \
  -H "X-Webhook-Secret: 8f7b2c5e4d1a9b0c3f5e9d8a7b6c5a4b3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a" \
  -H "X-Webhook-Type: SALES_RECEIPT" \
  -d '{"payload":{"databaseId":1293289,"type":"SALES_RECEIPT","data":[{"salesReceiptNo":"TEST-001"}]}}'
```

**Expected response:** `{"status":"success","message":"Processed"}`

**Jika error/timeout:** Masalah di shared hosting (receiver.php down, network, dll).

---

## Ringkasan Checklist

| No | Cek | Perintah / Lokasi |
|----|-----|-------------------|
| 1 | Service masih running? | `sudo systemctl status webhook-service` |
| 2 | Log setelah jam 10? | `sudo journalctl -u webhook-service --since "2026-02-02 10:00:00"` |
| 3 | Accurate masih kirim? | Dashboard Accurate → Webhook Log (filter jam 10–17) |
| 4 | Payload semua DFT? | Query SQLite: `SELECT ... WHERE salesReceiptNo LIKE 'DFT%'` |
| 5 | Error forward? | `journalctl ... | grep -i "error\|failed\|retry"` |
| 6 | Status queue? | `SELECT status, COUNT(*) FROM webhook_queue GROUP BY status` |
| 7 | Log shared hosting? | cPanel error log / PHP error log |
| 8 | Test manual forward? | `curl -X POST ...` ke receiver.php |

---

## Kemungkinan Penyebab & Solusi

### A. Semua Payload DFT (Draft)

**Gejala:** Semua `salesReceiptNo` dimulai dengan "DFT"

**Penyebab:** Accurate hanya kirim webhook saat **buat draft**, bukan saat **validasi** (BKB)

**Solusi:** 
- Ini **normal behavior** Accurate (lihat `ACCURATE-BKB-vs-DFT.md`)
- Receiver.php memang **skip DFT** (benar, karena belum nomor final)
- Untuk dapat BKB: tanya Accurate support apakah bisa kirim webhook saat **validasi**, atau push manual

---

### B. Service Crash/Stop Setelah Jam 10

**Gejala:** Log berhenti setelah jam 10, service status **inactive** atau **failed**

**Penyebab:** 
- Out of memory
- Panic/error yang tidak di-handle
- System restart

**Solusi:**
- Cek log error: `sudo journalctl -u webhook-service -p err`
- Restart service: `sudo systemctl restart webhook-service`
- Cek resource: `free -h`, `df -h` (memory/disk penuh?)

---

### C. Forward ke Shared Hosting Gagal

**Gejala:** Queue banyak **failed**, log ada "shared hosting status 500" atau "timeout"

**Penyebab:**
- Shared hosting **receiver.php** error atau down
- Network timeout (shared hosting lambat)
- URL salah atau SSL certificate issue

**Solusi:**
- Test manual dengan `curl` (langkah 7 di atas)
- Cek log error di shared hosting
- Pastikan **SHARED_HOSTING_URL** benar di `.env`
- Cek apakah shared hosting masih bisa diakses dari browser

---

### D. Accurate Tidak Mengirim Setelah Jam 10

**Gejala:** Di Accurate dashboard, tidak ada webhook log setelah jam 10

**Penyebab:**
- Subscription webhook Accurate **expired** (perlu renewal)
- Konfigurasi webhook di Accurate **berubah** atau **nonaktif**
- Accurate ada **maintenance** atau **issue**

**Solusi:**
- Cek di Accurate: Settings → Webhooks → Status subscription
- Manual renewal jika perlu (lihat `checkWebhookActivePeriod()` di worker/pool.go)
- Hubungi Accurate support jika subscription aktif tapi tidak kirim

---

Setelah debugging, Anda akan tahu penyebabnya dan bisa ambil tindakan yang tepat.
