Sau khi nhận đơn hàng có sản phẩm Gearment (SKU Gearment tồn tại), hệ thống tự routing vào luồng Dropship. Wizard Báo giá gọi API Gearment v3 draft → price → confirm. Mỗi lần có webhook từ Gearment (hoàn thành, hủy, cập nhật tracking), Odoo cập nhật trạng thái order + đẩy tracking lên Etsy. UAT 2026-05-28 confirm HMAC-SHA256 webhook signature, idempotency nonce + UNIQUE partial index, 9 webhook topic + 4 mục xử lý, tracking refresh từ GKE Excel.
Luồng Gearment Dropship liên kết 5 vai trò + hệ thống Gearment API + webhook. BA Lead khởi tạo, hệ thống gọi API, Gearment webhook báo tiến độ, Odoo đẩy tracking sang Etsy. Bảng dưới đọc từ trái qua phải: mỗi cột là vai trò, mỗi hàng là mốc chính.
| Sản phẩm | Số lượng | Mã SKU | Mã Gearment | Giá đơn |
|---|---|---|---|---|
| Custom Coffee Mug 11oz | 1 | MUG-CR-F11 | GM-MUG-001 | 14.50 USD |
| Gift Box Kraft 4x4x4 | 1 | BOX-KR-S | GM-BOX-001 | 2.00 USD |
sale.view_order_form @ addons/sale/views/sale_order_views.xml); chỗ khác biệt: tab "Fulfillment" mở rộng + nút "Request Gearment Quote" trong multichannel_hub_fulfillment/views/sale_order_views.xml.multichannel_hub_fulfillment (cộng đồng "Gearment adapter" trong graphify); không có view chuẩn Odoo cho wizard báo giá nhà cung cấp dropship.| Thời gian | Order | Endpoint | Source | HTTP Status | Thời gian (ms) | Lỗi |
|---|---|---|---|---|---|---|
| 2026-05-28 10:38 | #2854 | /price | quote | 200 | 847 | — |
| 2026-05-28 10:38 | #2854 | /draft | draft | 200 | 1123 | — |
| 2026-05-28 10:42 | #2854 | /draft/labeled | confirm | 200 | 756 | — |
| 2026-05-28 14:15 | #2851 | /draft | draft | 500 | 5042 | Server error · retry queued |
| 2026-05-28 14:20 | #2851 | /draft | draft_retry_1 | 200 | 892 | — |
| 2026-05-28 15:01 | #2852 | /price | quote | 400 | 234 | Invalid address · BA to verify |
gearment.api.log trong multichannel_hub_fulfillment; không có view chuẩn Odoo cho nhật ký API vendor.| Thời gian | Topic | Order Ref | Nonce | Nonce Dup? | Signature OK? | Status | Action |
|---|---|---|---|---|---|---|---|
| 2026-05-28 11:15 | order_completed | GEA-2854-001 | no-2854-… | New | ✓ SHA256 | Processed | tracking saved |
| 2026-05-28 11:16 | order_completed | GEA-2854-001 | no-2854-… | Dup (OK) | ✓ SHA256 | Idempotent | 200 OK |
| 2026-05-28 12:30 | tracking_order_updated | GEA-2854-001 | tu-2854-… | New | ✓ SHA256 | Processed | status=in_transit |
| 2026-05-28 13:00 | batch_dispatched | GEA-2854-001 | bd-2854-… | New | ✓ SHA256 | Log only | archived |
| 2026-05-28 16:45 | tracking_order_updated | GEA-2854-001 | tu-2854-b | New | ✓ SHA256 | Processed | status=delivered |
gearment.webhook.log trong multichannel_hub_fulfillment (cộng đồng "Gearment adapter" + dispatcher trong graphify); không có view chuẩn Odoo cho nhật ký webhook.sale.view_order_form) + view tuỳ biến @ multichannel_hub_fulfillment/views/logistics_partner_views.xml và tracking_import_views.xml cho chi tiết Fulfillment.Story 4.7 bulk-send: Nếu cron P1-TRK-PUSH-ETSY tắt hoặc bị backlog, BA dùng bulk action Resync Tracking from Gearment trên Fulfillment list để manual resync. Mỗi resync log vào gearment_api_log (source='manual_sync'), không ghi đè nếu Etsy đã có tracking.
Dual-use GEARMENT_API_SECRET: Cả 2 API call (/draft, /price) và webhook HMAC verify dùng chung 1 key từ environment. Thay đổi key trên Gearment dashboard cần cập nhật .env và restart container (P1-11-SHOPID-BOOTSTRAP xử lý on-the-fly reload).
9 webhook topic + 4 xử lý + 5 log-only: Gearment hỗ trợ: order_completed, order_cancelled, order_on_hold (active); tracking_order_updated (active); tracking_exception, order_delayed, carrier_changed, batch_assigned, batch_dispatched (log-only). Cấu hình topic via webhook_topic field trên environment model. Thêm topic mới không cần code, chỉ cần cấu hình.
Custom shipping.carrier model: Gearment trả carrier_code (USPS, DHL, VietnamPost, …). Script map sang shipping.carrier với field etsy_carrier_code pre-defined. Nếu không match → log warning, dùng mặc định 'Other'. Thêm carrier mới vào setup data (P1-SETUP-CARRIERS).
tracking_order_updated refresh behavior: Webhook này không đẩy lại Etsy (vì Etsy tự fetch từ carrier link tracking_number). Chỉ cập nhật fulfillment_status trên Odoo. Ngoại lệ: nếu tracking_order_updated chứa tracking_status='returned' → auto-gọi API Etsy create return request (P1-TRK-AUTO-RETURN).
Webhook retry: Nếu Odoo không 200 OK webhook, Gearment retry (exponential backoff, max 3 attempts). Nếu Odoo 500 Server Error, log vào gearment_api_log (source='webhook_failed'), tech support có thể manual replay qua button Resend trên log record.
GEARMENT_WEBHOOK_SECRET từ ADR-009: Bây giờ không còn dùng (bị gộp vào GEARMENT_API_SECRET). Nếu có cấu hình cũ .env, hệ thống ignore + log warning.