# Checklist: Shared Hosting (receiver.php)

## Status Receiver.php

✅ **Sudah support batch** - Loop semua payload dalam array  
✅ **Sudah skip DFT** - Safety net (walaupun Golang sudah skip)  
✅ **Sudah ada idempotency** - Prevent duplicate insert ke MySQL  
✅ **Sudah ada error handling** - Log error dengan jelas  

**Tidak perlu perubahan di receiver.php!** ✅

---

## Yang Perlu Dipastikan

### 1. Receiver.php Sudah di Upload ke Shared Hosting

**Lokasi file:** `receiver.php` harus ada di shared hosting

**Path yang umum:**
- `public_html/webhook/receiver.php`
- `public_html/receiver.php`
- Atau sesuai konfigurasi Anda

**Cek apakah file ada:**
- Via cPanel File Manager
- Atau via SSH: `ls -la /path/to/receiver.php`

---

### 2. URL di Golang (.env) Sudah Benar

**Di VPS, cek `.env`:**

```bash
cat /opt/webhook-service/.env | grep SHARED_HOSTING
```

**Pastikan:**
- `SHARED_HOSTING_URL` = URL lengkap ke receiver.php
  - Contoh: `https://po.persadalab.com/webhook/receiver.php`
- `SHARED_HOSTING_SECRET` = Secret yang sama dengan di receiver.php

---

### 3. Secret di Receiver.php Sudah Sesuai

**Di receiver.php, cek:**

```php
$config = [
    'relay' => [
        'secret' => '8f7b2c5e4d1a9b0c3f5e9d8a7b6c5a4b3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a',
    ],
    // ...
];
```

**Pastikan:** Secret di receiver.php **sama** dengan `SHARED_HOSTING_SECRET` di `.env` Golang.

---

### 4. Test Manual Receiver.php

**Dari VPS atau komputer Anda:**

```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" \
  -H "X-Webhook-Source: VPS-GOLANG-RELAY" \
  -d '{
    "payload": {
      "type": "SALES_RECEIPT",
      "databaseId": 1293289,
      "uuid": "test-manual-001",
      "data": [{"salesReceiptNo": "BKB-01.26-000691"}]
    },
    "timestamp": "2026-02-02T10:00:00Z"
  }'
```

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

**Jika error:**
- `401 Unauthorized` → Secret tidak sesuai
- `500 Internal Server Error` → Cek error log di shared hosting
- `404 Not Found` → URL salah atau file tidak ada

---

### 5. Cek Error Log di Shared Hosting

**Di cPanel → Error Log atau PHP Error Log:**

Cari log dengan keyword:
- `[Webhook]`
- `[Receipt]`
- `[Invoice]`
- `CRITICAL ERROR`

**Yang dicari:**
- Apakah webhook sampai ke receiver.php?
- Apakah ada error saat proses?
- Apakah semua di-skip karena DFT? (seharusnya tidak, karena Golang sudah skip)

---

## Alur Lengkap Setelah Deploy

### 1. Accurate Kirim Webhook
```
POST /webhook/accurate
Body: [SALES_INVOICE, SALES_RECEIPT] (batch)
```

### 2. Golang Handler
```
✅ Detect batch: 2 payload(s)
✅ Check UUID (idempotency)
✅ Insert ke queue (jika UUID belum ada)
✅ Skip DFT sebelum forward
✅ Forward hanya yang bukan DFT ke shared hosting
```

### 3. Shared Hosting (receiver.php)
```
✅ Receive webhook dari Golang
✅ Check secret (security)
✅ Parse payload (support batch)
✅ Process SALES_INVOICE → Insert ke t_log_accurate
✅ Process SALES_RECEIPT → Insert ke t_po_pembayaran + Update PO
✅ Return success response
```

---

## Verifikasi Setelah Semua Deploy

### 1. Cek Log Golang

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

**Yang harus muncul:**
- `📥 [Webhook] Incoming POST ...`
- `📦 [Webhook] Batch detected: X payload(s)`
- `⏭️ [Queue X] Skipping draft` (untuk DFT)
- `🔄 [Queue X] Forwarding ...` (untuk yang bukan DFT)
- `✅ [Forward] Shared hosting responded OK`
- `✅ [Queue X] Relay Success`

### 2. Cek Queue di SQLite

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

**Expected:**
- Banyak `DFT (Skipped)` → Filter bekerja ✅
- Beberapa `Forwarded` → Yang valid di-forward ✅

### 3. Cek Database MySQL

```sql
SELECT 
    type,
    COUNT(*) as count,
    DATE(created_at) as date
FROM t_log_accurate 
WHERE DATE(created_at) = CURDATE()
GROUP BY type, DATE(created_at);
```

**Expected:**
- SALES_INVOICE masuk ✅
- SALES_RECEIPT masuk (yang bukan DFT) ✅

---

## Checklist Final

- [ ] Receiver.php sudah di-upload ke shared hosting
- [ ] URL di `.env` Golang sudah benar
- [ ] Secret di receiver.php sama dengan `.env` Golang
- [ ] Test manual receiver.php berhasil
- [ ] Error log di shared hosting tidak ada error
- [ ] Monitor log Golang setelah deploy
- [ ] Verifikasi webhook masuk ke database MySQL

---

## Kesimpulan

**Receiver.php sudah siap!** Tidak perlu perubahan.

**Yang perlu dipastikan:**
1. ✅ File sudah di-upload
2. ✅ URL dan Secret sudah benar
3. ✅ Test manual berhasil

**Setelah itu, sistem akan jalan otomatis!** 🎉
