# Analisis: 83 Completed di Golang Tapi Hanya 1 Masuk Database MySQL

## Hasil Query

**Di SQLite (`webhook_queue`):**
- ✅ **83 SALES_RECEIPT** dengan status `completed`
- ✅ Semuanya dikategorikan sebagai **'OTHER'** (bukan DFT, bukan BKB yang dimulai dengan "BK")

**Di Database MySQL:**
- ❌ Hanya **1** yang masuk ke `t_po_pembayaran` atau `t_log_accurate`

**Kesimpulan:** Forward dari Golang ke shared hosting **berhasil** (83 completed), tapi **receiver.php** tidak memproses semua (hanya 1 yang masuk database).

---

## Kemungkinan Penyebab

### 1. Receiver.php Error Tapi Tidak Return Error Response

**Gejala:** Receiver.php error saat proses, tapi tetap return `200 OK` ke Golang.

**Cek:**
```bash
# Di shared hosting, cek error log
tail -f /path/to/error.log | grep -iE "receipt|webhook|error|exception"
```

**Solusi:** Pastikan receiver.php return error response yang benar jika ada error.

---

### 2. Semua Di-Skip Karena Kondisi Tertentu

**Kemungkinan:**
- Semua payload tidak punya `salesReceiptNo` yang valid
- Semua tidak punya PO Number di detail invoice
- Semua PO tidak ditemukan di database
- Semua di-skip karena idempotency (sudah pernah diproses)

**Cek di receiver.php:**
- Apakah ada log `[Receipt] Skipping Draft`?
- Apakah ada log `[Receipt] No PO Number found`?
- Apakah ada log `[Receipt] PO xxxxx not found in DB`?
- Apakah ada log `[Receipt] Skip: Duplicate`?

---

### 3. Format Payload Tidak Sesuai

**Kemungkinan:** Payload yang dikirim Golang tidak sesuai format yang diharapkan receiver.php.

**Cek:**
```bash
# Lihat contoh payload yang dikirim
sqlite3 /opt/webhook-service/data/webhook.db "
SELECT payload 
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT' 
    AND status = 'completed'
LIMIT 1;
" | jq .
```

**Pastikan:**
- Payload punya field `data[0].salesReceiptNo`
- Format sesuai dengan yang diharapkan receiver.php

---

### 4. Database Connection atau Transaction Error

**Kemungkinan:** Receiver.php error saat insert/update database, tapi tidak di-log dengan baik.

**Cek:**
- Apakah ada error di PHP error log?
- Apakah database connection OK?
- Apakah ada transaction rollback?

---

## Langkah Debugging

### 1. Cek Log Shared Hosting (Receiver.php)

**Di shared hosting (cPanel error log atau PHP error log):**

Cari semua log dengan keyword:
- `[Receipt]`
- `[Webhook]`
- `CRITICAL ERROR`
- `Exception`
- `Error`

**Yang dicari:**
- Berapa banyak log `[Receipt] Processing`?
- Berapa banyak log `[Receipt] Skipping Draft`?
- Berapa banyak log `[Receipt] No PO Number found`?
- Berapa banyak log `[Receipt] PO xxxxx not found`?
- Berapa banyak log `[Receipt] Success Recorded!`?

**Jika hanya 1 log `Success Recorded!`:** Receiver.php memang hanya proses 1, sisanya di-skip atau error.

---

### 2. Test Manual dengan Payload dari Queue

**Ambil payload dari queue yang completed:**

```bash
# Ambil payload
PAYLOAD=$(sqlite3 /opt/webhook-service/data/webhook.db "
SELECT payload 
FROM webhook_queue 
WHERE type = 'SALES_RECEIPT' 
    AND status = 'completed'
LIMIT 1;
")

# Test manual ke receiver.php
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" \
  -H "X-Webhook-Source: VPS-GOLANG-RELAY" \
  -d "{\"payload\": $PAYLOAD, \"timestamp\": \"2026-02-02T10:00:00Z\"}"
```

**Lihat response dan log di shared hosting.**

---

### 3. Cek Apakah Semua Sudah Pernah Diproses (Idempotency)

**Cek di database MySQL:**

```sql
SELECT 
    nomor,
    type,
    COUNT(*) as count
FROM t_log_accurate 
WHERE type = 'SALES_RECEIPT'
    AND DATE(created_at) = '2026-02-02'
GROUP BY nomor, type
HAVING count > 1;
```

**Jika banyak duplicate:** Idempotency check skip semua yang sudah pernah diproses.

---

### 4. Tambahkan Logging Lebih Detail di Receiver.php

**Tambahkan log di setiap step:**

```php
error_log("[Receipt] Step 1: Received webhook");
error_log("[Receipt] Step 2: Payload count: " . count($payloads));
error_log("[Receipt] Step 3: Processing receipt: " . $receiptNo);
error_log("[Receipt] Step 4: API response: " . json_encode($response));
error_log("[Receipt] Step 5: PO Number: " . $poNumber);
error_log("[Receipt] Step 6: PO Found: " . ($recordPo ? 'YES' : 'NO'));
error_log("[Receipt] Step 7: Idempotency check: " . ($chk->fetch() ? 'DUPLICATE' : 'NEW'));
error_log("[Receipt] Step 8: Insert result: " . ($ins ? 'SUCCESS' : 'FAILED'));
```

Ini akan membantu tahu di step mana yang di-skip atau error.

---

## Solusi Sementara

**Jika receiver.php error atau skip banyak:**

1. **Cek log error** di shared hosting untuk tahu penyebabnya
2. **Fix masalah** di receiver.php (DB error, API error, dll)
3. **Retry manual** untuk queue entries yang completed tapi tidak masuk database:

```bash
# Update status ke pending untuk retry
sqlite3 /opt/webhook-service/data/webhook.db "
UPDATE webhook_queue 
SET status = 'pending', attempts = 0, error = NULL
WHERE type = 'SALES_RECEIPT' 
    AND status = 'completed'
    AND date(created_at) = date('now');
"
```

Lalu restart service atau tunggu worker pickup pending jobs.

---

## Kesimpulan

**83 completed di Golang** = Forward berhasil ✅  
**Hanya 1 masuk database** = Masalah di receiver.php ❌

**Yang perlu dicek:**
1. ✅ Log error di shared hosting (receiver.php)
2. ✅ Apakah semua di-skip karena kondisi tertentu?
3. ✅ Apakah ada error yang tidak di-log?
4. ✅ Apakah format payload sesuai?

**Mulai dari cek log shared hosting** - itu yang paling penting untuk tahu penyebabnya!
