# สรุปแผนส่งต่อทีม — Conversion Attribution (เฟส 1 PoC)

**วันที่:** 2026-07-21  
**สถานะ:** พร้อม UAT ร่วม — ทั้ง Chat และ Laravel ลงเฟส 1 แล้ว  
**เอกสารฉบับเต็ม:** [`pharmacy-conversion-attribution-plan.md`](./pharmacy-conversion-attribution-plan.md)

---

## 1) เป้าหมาย

วัด funnel จาก LINE AI แนะนำสินค้า → คลิก PDP → ใส่ตะกร้า → ชำระเงิน โดย**ไม่ย้ายระบบ order มาที่ Chat**

| ขั้น | เจ้าของข้อมูล |
|------|----------------|
| A — Recommend | Chat |
| B — Click PDP | Laravel |
| C — Add to cart | Laravel |
| D — Paid | Laravel |

**เกณฑ์ PoC ผ่าน:** มีอย่างน้อย **1 ออเดอร์** ที่ join `chat_sid` + `rec_id` ได้ครบ และทดสอบบน **LINE in-app browser** อย่างน้อย 1 รอบ

---

## 2) สถานะงาน

| ฝั่ง | สถานะ | รายละเอียด |
|------|--------|------------|
| **chat-v2** | ✅ เสร็จ | ติด query บนลิงก์, สร้าง `rec_id`, เก็บ `v2_recommendation_events` |
| **Laravel** | ✅ เสร็จ | รับ query, cookie, login redirect, stamp `ai_attribution` ลง order |
| **รายงาน** | ⏳ PoC | join DB สองฝั่งด้วย `chat_sid` / `rec_id` + webhook `paid` กลับ chat-v2 |
| **UAT ร่วม** | 🔜 ถัดไป | T1–T7 (ดู §7) |

---

## 3) สิ่งที่แต่ละฝั่งทำแล้ว

### ฝั่ง Chat (chat-v2 + Admin)

| # | งาน |
|---|-----|
| C1.1 | ติด query attribution บน `product_url` ทุก card |
| C1.2 | สร้าง `rec_id` ใหม่ต่อเทิร์นแนะนำ (card หลายใบในเทิร์นเดียวกันใช้ค่าเดียวกัน) |
| C1.3 | เก็บ `v2_recommendation_events` (`rec_id`, `conversation_id`, product, url, issue, token, เวลา) |
| C1.4 | กรอง `visible` + stock เหมือนเดิม (attribution หลัง filter) |
| — | หน้า Admin: `/admin/chat-v2/recommendations` — ดูรายการแนะนำ + คัดลอกลิงก์ |

**จุดโค้ดหลัก (chat-v2 repo):**

- `apps/chat-v2/src/chat/product-attribution.util.ts`
- `apps/chat-v2/src/chat/recommendation-events.service.ts`
- `apps/chat-v2/src/chat/chat.pipeline.ts`

### ฝั่ง Laravel (The Medicine web)

| # | งาน |
|---|-----|
| L1.1 | Login redirect แบบ B — `/เข้าสู่ระบบ?redirect={fullUrl}` ไม่ทิ้ง query |
| L1.2 | อ่าน `utm_*`, `chat_sid`, `rec_id`, `pid` ที่ PDP |
| L1.3 | Cookie `tm_ai_attr` (30 วัน, last-touch) |
| L1.4 | หลัง login กลับ PDP พร้อม param → cookie set อีกครั้ง |
| L1.5 | Stamp `order_orders.ai_attribution` (JSON) ตอนสร้างออเดอร์ + checkout |
| L1.6 | Log `product_view_ai` (PoC) |
| L2.w | Webhook `paid` → chat-v2 เมื่อ `payment_status = COMPLETED` (มี `ai_attribution`) |

**ทดสอบอัตโนมัติ:** `tests/Feature/Frontend/AiAttributionTest.php` — 5/5 ผ่าน; `tests/Feature/Order/SendChatV2ConversionWebhookTest.php`

**เอกสาร webhook:** [`pharmacy-conversion-webhook.md`](./pharmacy-conversion-webhook.md)

**จุดโค้ดหลัก (Laravel repo):**

- `app/Services/AiAttributionService.php`
- `app/Http/Middleware/CaptureAiAttribution.php`
- `Modules/Frontend/app/Http/Controllers/FrontendController.php`
- `Modules/Order/app/Http/Controllers/OrderController.php`

---

## 4) สัญญา URL (ล็อกแล้ว — ใช้ชื่อเดียวกันทั้งสองฝั่ง)

```text
{product_url}
  ?utm_source=line_ai
  &utm_medium=chat
  &utm_campaign=pharmacy_recommend
  &chat_sid={v2_conversations.conversation_id}
  &rec_id={uuid ต่อเทิร์น}
  &pid={product_products.id}
```

| Param | ใครสร้าง | หมายเหตุ |
|-------|----------|----------|
| `chat_sid` | chat-v2 | = `conversation_id` ตรง ๆ |
| `rec_id` | chat-v2 | uuid ใหม่ต่อเทิร์น; card หลายใบใช้ค่าเดียวกัน |
| `pid` | chat-v2 | Laravel product id จาก availability |
| `utm_*` | chat-v2 | ค่าคงที่ตามด้านบน |

**ตัวอย่าง:**

```text
http://127.0.0.1:8000/acne-aid-foaming-cleanser-100ml-exea?utm_source=line_ai&utm_medium=chat&utm_campaign=pharmacy_recommend&chat_sid=conv-abc&rec_id=rec-xyz&pid=123
```

---

## 5) Flow ที่คาดหวัง

```
Chat recommend → ส่ง LINE card (URL + query)
       ↓
User คลิก → PDP (หรือ redirect login ถ้ายังไม่ login)
       ↓
Laravel อ่าน query → cookie tm_ai_attr (30 วัน)
       ↓
Login (ถ้าจำเป็น) → กลับ PDP พร้อม query
       ↓
Add to cart → Checkout → Paid
       ↓
order_orders.ai_attribution มี chat_sid + rec_id
```

**ข้อจำกัดสำคัญ:**

- ต้อง **login member** ก่อนซื้อ (ไม่มี guest checkout)
- นับ **paid** = `payment_status = COMPLETED` เท่านั้น

---

## 6) วิธี join ข้อมูล (PoC — ทางเลือก 1)

| chat-v2 (`v2_recommendation_events`) | Laravel (`order_orders.ai_attribution`) |
|--------------------------------------|----------------------------------------|
| `rec_id` | `rec_id` |
| `conversation_id` | `chat_sid` |
| `product_laravel_id` | `pid` |

```sql
-- Chat DB
SELECT rec_id, conversation_id, product_laravel_id, url_sent, created_at
FROM v2_recommendation_events
WHERE rec_id = '<rec_id>';

-- Laravel DB (MySQL 8+ / PostgreSQL)
SELECT id, no, payment_status, ai_attribution
FROM order_orders
WHERE JSON_UNQUOTE(JSON_EXTRACT(ai_attribution, '$.rec_id')) = '<rec_id>'
  AND payment_status = 'COMPLETED';
```

---

## 7) UAT ร่วม (checklist)

| # | เทส | คาดหวัง | ผู้รับผิดชอบ |
|---|-----|---------|--------------|
| T1 | ลิงก์จาก LINE มี query ครบ | เปิดได้; login redirect ไม่ทิ้ง param | Chat + Laravel |
| T2 | Laravel อ่าน attribution | cookie `tm_ai_attr` ถูก set | Laravel |
| T3 | ข้ามหน้าแล้ว cookie ยังอยู่ | ค่าไม่หาย | Laravel |
| T4 | ออเดอร์มี attribution | `order_orders.ai_attribution` มี JSON ครบ | Laravel |
| T5 | คลิกก่อน login → login → กลับ PDP | attribution ยังอยู่ | Laravel |
| T6 | จ่ายจน COMPLETED | join กับ `v2_recommendation_events` ได้ | ร่วม |
| T7 | ทำ T5+T6 บน LINE in-app จริง | ผ่านครบ | ร่วม |

**วิธีเริ่ม UAT:**

1. ส่ง recommend ใหม่ผ่าน LINE (หรือใช้ลิงก์จาก Admin → คัดลอก)
2. บันทึก `rec_id` + `chat_sid` จากหน้า Admin
3. ซื้อจนชำระเงินสำเร็จ
4. join ด้วย SQL ด้านบน

---

## 8) สิ่งที่ยังไม่ทำ (ไม่บล็อก PoC)

| รายการ | ทำเมื่อไหร่ |
|--------|-------------|
| Webhook กลับ chat-v2 (`paid`) | Laravel ยิงแล้ว — ดู [`pharmacy-conversion-webhook.md`](./pharmacy-conversion-webhook.md) |
| Click / cart / % conversion บน Admin | เฟส 2–3 |
| กติกาหลายสินค้าในตะกร้า (last-touch) | ก่อนเฟส 2 |
| SEO/CDN กับ query | ตรวจระหว่าง PoC |
| อัปเดตข้อความ PDPA | หลัง PoC ผ่าน |

---

## 9) Action ถัดไป

| ลำดับ | งาน | ใคร |
|-------|-----|-----|
| 1 | นัด UAT ร่วม T1–T7 | ทีม Chat + Laravel |
| 2 | ส่ง recommend ใหม่บน LINE หรือใช้ลิงก์จาก Admin | Chat |
| 3 | ซื้อจน `payment_status = COMPLETED` | QA / ทีม |
| 4 | join `rec_id` + `chat_sid` ยืนยัน PoC ผ่าน | ร่วม |
| 5 | สรุปผล PoC → ตัดสินใจเฟส 2 (funnel events / webhook) | ทีม |
