Sau khi nhận đơn hàng có sản phẩm Gearment, hệ thống tự routing vào luồng Dropship. BA khởi tạo báo giá, hệ thống gọi API xưởng, xưởng in và gửi tracking tự động, Odoo đẩy vào Etsy để khách hàng theo dõi.
Workflow hoàn tất10 bước chi tiết4 màn hình
AAi làm gì — sơ đồ vai trò
Luồng Dropship liên kết BA Lead, hệ thống Odoo, xưởng in đối tác Gearment, và 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 trong quy trình.
Khác với luồng in nội bộ (3a): đơn Gearment đi theo đường mua hàng — Odoo tự tạo Đơn mua hàng (Purchase Order) gửi xưởng, xưởng in và giao thẳng cho khách; không có Lệnh sản xuất hay xuất kho nội bộ như luồng 3a.
BA Lead
Odoo
Xưởng in (Gearment)
Etsy
1. Khởi tạo
Bấm nút "Yêu cầu báo giá"
Detect sản phẩm Gearment, chuẩn bị dữ liệu
—
—
2. Gửi báo giá
Xem giá, xác nhận recipient/address
Gọi API /draft → /price, mở wizard
—
—
3. Xác nhận
Bấm "Confirm Order"
Gọi /draft/labeled (confirm)
Nhận order, chuẩn bị in
—
4. In + vận chuyển
—
Chờ webhook cập nhật trạng thái
In xong, gửi webhook order_completed + tracking
—
5. Đẩy tracking
Xem order status = "Đã giao"
Nhận webhook, cập nhật order, gọi API Etsy
—
Khách hàng thấy tracking link
6. Hoàn tất
Order xong, khách hàng hài lòng
Status = "Delivered", fulfillment complete
—
—
BCác bước chi tiết (10 bước)
1
Hệ thống · tự động
Phát hiện sản phẩm Gearment trên order
Đơn hàng từ Etsy có ≥1 line item có sản phẩm mà mã Gearment không rỗng. Hệ thống tự phát hiện và gắn flag fulfillment_method = 'gearment_dropship' trên đơn. Không cần BA can thiệp. Order trạng thái vẫn "Confirmed" nhưng sẵn sàng gọi API Gearment.
Hệ thống: Cron tự chạy, kiểm tra tất cả product trên order, nếu tìm thấy sản phẩm có mã Gearment → đánh dấu fulfillment_method. Quy tắc: ≥1 line item = Gearment thì toàn order là Dropship (không mix MTO + Dropship).
2
BA Lead · ~1 phút
Mở order, xem tab Fulfillment
BA mở form đơn hàng, bấm tab "Fulfillment". Màn hình hiển thị: người nhận (read-only), địa chỉ giao (read-only), sản phẩm, mã Gearment, hình ảnh chính, kích thước gói (W×H×D). Dưới cùng là nút xanh "Yêu cầu báo giá Gearment". BA xem lại thông tin, nếu OK bấm nút.
Hệ thống: Tab Fulfillment chứa bản ghi liên kết với order, gồm 20 trường thiết kế: địa chỉ, kích thước, ảnh, cân nặng, nội dung cá nhân hoá (nếu có). Dữ liệu từ order + product variant lấy tự động.
3
BA Lead · ~30 giây
Bấm nút, wizard báo giá mở
Nút "Yêu cầu báo giá" mở wizard với form: người nhận (có thể sửa), address (tỉnh/huyện/xã), kích thước, hình ảnh, mô tả. BA xem lại, có thể sửa địa chỉ nếu cần. Dưới form là nút "Gửi draft sang xưởng".
Hệ thống: Wizard là TransientModel, dữ liệu pre-filled từ order + product variant. Nút Gửi draft → action gọi service API draft.
4
Hệ thống · ~3 giây
Gọi API xưởng: /draft → /price
Odoo gọi POST /draft với payload: reference_id, địa chỉ, kích thước, hình ảnh, mô tả cá nhân hoá. Xưởng trả sku_id + ready_for_price. Nếu thành, hệ thống tiếp tục POST /price trên reference_id đó. Kết quả: giá VND, currency, sẵn sàng xác nhận. Ghi nhật ký tất cả lời gọi (endpoint, status, thời gian).
Phía sau: 2 lời gọi tuần tự, cả 2 có header xác thực. Nếu /draft fail → skip /price, wizard hiển thị "Lỗi: xưởng không trả lại reference_id". Nếu cùng reference_id gọi 2 lần → xưởng trả 409 (trùng) → hệ thống detect và reuse reference_id cũ (idempotent).
5
Hệ thống · auto
Wizard auto-refresh hiển thị giá
Sau 3-5 giây, wizard tự cập nhật (không cần BA refresh tay): Giá xưởng (ví dụ 125,000 VND), Phí vận chuyển (+30,000 VND), Tổng thanh toán. Nút "Xác nhận order tại xưởng" được bật sáng. BA kiểm tra giá, nếu OK bấm Xác nhận; nếu cao quá có thể Cancel để edit order rồi retry.
6
BA Lead · ~10 giây
Bấm "Xác nhận order tại xưởng"
Wizard gọi POST /draft/labeled (endpoint xác nhận). Payload gồm tất cả dữ liệu từ /draft + địa chỉ formatted chuẩn. Xưởng trả success=true + reference_id (lưu để track sau). Hệ thống lưu reference_id vào bản ghi fulfillment, đánh dấu order status = "Chờ xưởng sản xuất".
Ghi nhật ký: endpoint, status HTTP, request/response (scrub PII). Nếu HTTP 400 (địa chỉ không hợp lệ) → hiển thị lỗi wizard, BA quay lại sửa. Nếu HTTP 500 (xưởng error) → setup cron retry tự động (5 phút/lần, max 3 lần).
7
Xưởng (Gearment) · 1–3 ngày
In sản phẩm, lấy tracking, gửi webhook
Xưởng in sản phẩm, dán label vận chuyển, lấy tracking_number từ carrier (USPS, DHL, …). Gửi webhook POST /callback/webhook với payload: topic='order_completed', reference_id, tracking_number, carrier_code. Webhook header kèm chữ ký xác thực. Odoo nhận, kiểm tra chữ ký, lưu tracking_number vào bản ghi fulfillment.
Webhook handler: Verify chữ ký xác thực (HMAC-SHA256), dedup qua nonce (nếu nhận 2 lần cùng nonce → idempotent 200 OK, không xử lý lại). Topic 'order_completed' trigger cập nhật fulfillment status = 'printing_completed', lưu tracking_number, carrier_code.
8
Hệ thống · tự động
Đẩy tracking lên Etsy
Ngay sau khi lưu tracking_number từ webhook, cron tự động (chạy ~10 phút) đẩy tracking lên Etsy API. Gửi: order_id, tracking_number, carrier (map từ carrier_code xưởng sang Etsy carrier). Etsy trả 200, đánh dấu shipment đã có tracking. Khách hàng trên Etsy thấy link tracking công khai tự động.
Carrier mapping: Xưởng trả carrier_code (USPS, DHL, VietnamPost, …). Script map sang tên carrier Etsy (pre-defined trong system). Nếu không match → log warning, dùng mặc định 'Other'. Nếu Etsy push fail (lỗi mạng) → cron thử lại (exponential backoff).
9
Xưởng · khi giao hàng
Webhook tracking_order_updated — tracking cập nhật
Xưởng gửi webhook topic='tracking_order_updated' khi status thay đổi: 'in_transit' (đang gửi), 'delivered' (đã giao), 'returned' (hoàn lại). Odoo nhận webhook, cập nhật fulfillment status tương ứng. Không đẩy lại Etsy (vì Etsy tự fetch tracking từ carrier công khai).
9 webhook topic tổng: 4 topic xử lý (order_completed, tracking_order_updated, order_cancelled, order_on_hold). 5 topic chỉ log (tracking_exception, order_delayed, carrier_changed, batch_assigned, batch_dispatched). Cấu hình qua field webhook_topic trên environment model.
10
BA Lead · theo dõi
Xem order hoàn tất trên Odoo + Etsy
Order status tự update qua webhook: "Chờ xưởng sản xuất" → "Đang giao" → "Đã giao". Tab Fulfillment hiển thị tracking_number, carrier, ngày dự giao. Khách hàng trên Etsy thấy tracking link, có thể click vào để theo dõi giao hàng trực tiếp từ carrier.
Manual resync (nếu cần): Nếu webhook cron bị delay hoặc BA cần manual sync tracking, có action Resync Tracking từ Gearment trên Fulfillment list (gọi API xưởng hoặc import từ file Excel). Mỗi resync đều ghi log riêng.
CMàn hình trong quy trình
4 màn hình chính
Dưới đây là các màn hình mô phỏng quy trình từ tab Fulfillment, wizard báo giá, nhật ký API, đến chi tiết tracking.
Màn hình 1 · Tab Fulfillment trên đơn hàng
Bán hàngThông tin chungFulfillmentba.lead@hatafa
Người nhận & Địa chỉ (read-only)
Người nhận
Jane Doe
Địa chỉ
123 Main St, District 1, Ho Chi Minh City
Điện thoại
+84 9xxxxxxxx
Sản phẩm Gearment
Sản phẩm
Mã Gearment
Số lượng
Giá
Custom Coffee Mug 11oz
GM-MUG-001
1
14.50 USD
Gift Box Kraft 4x4x4
GM-BOX-001
1
2.00 USD
Tab Fulfillment chứa thông tin người nhận (read-only) + danh sách sản phẩm Gearment. Nút Yêu cầu báo giá Gearment bên trên → mở wizard để gọi API xưởng.
Màn hình 2 · Wizard báo giá Gearment — sau khi gọi /draft + /price
Bán hàngGearment Quoteba.lead@hatafa
📋 Báo giá từ xưởng — Order #2854
Thông tin xác nhận:
Người nhận: Jane Doe · Địa chỉ: District 1, HCMC · Sản phẩm: Mug + Box
✓ Xưởng đã nhận draft + tính giá reference_id: GEA-2854-20260528-001 · sku_id: 54321
Wizard hiển thị giá xưởng sau khi gọi /draft + /price API. BA xem lại thông tin người nhận, kiểm tra giá, rồi bấm Xác nhận để gọi endpoint /draft/labeled confirm order.
Màn hình 3 · Nhật ký API Gearment — danh sách lời gọi
Bán hàngGearment › API Logstech.support@hatafa
Thời gian
Order
Endpoint
Status
Thời gian (ms)
Ghi chú
2026-05-28 10:38
#2854
/price
200
847
Quote OK
2026-05-28 10:38
#2854
/draft
200
1123
Draft OK
2026-05-28 10:42
#2854
/draft/labeled
200
756
Confirm OK
2026-05-28 14:15
#2851
/draft
500
5042
Server error · Retry queued
Nhật ký API ghi tất cả lời gọi tới xưởng: draft, price, confirm. Tech support dùng để debug. Mỗi log ghi: endpoint, HTTP status, thời gian phản hồi, lỗi (nếu có). Lưu ý: request/response được scrub PII (ẩn địa chỉ, email, SĐT).
Màn hình 4 · Chi tiết Fulfillment — tracking + Gearment status
Bán hàngFulfillment Detailba.lead@hatafa
Status: Đã giao
✓ Xưởng đã hoàn thành · Sản phẩm đã in, đang giao hoặc đã giao.
Mã Order xưởng
GEA-2854-001
Status xưởng
Delivered
Tracking Number
1Z999AA10123456784
Vận chuyển
USPS
Xác nhận tại xưởng
2026-05-28 10:45
In xong
2026-05-28 12:30
Đang giao
2026-05-28 12:45
Đã giao
2026-05-28 16:45
Etsy Tracking
Đã đẩy sang Etsy?
Có · 2026-05-28 16:50
Khách hàng thấy tracking?
Có (link công khai)
Chi tiết Fulfillment hiển thị toàn bộ quá trình xưởng: mã order, tracking_number, carrier, 4 mốc thời gian (xác nhận/in xong/đang giao/đã giao từ webhook). Etsy Tracking = Yes nghĩa là khách hàng trên Etsy có thể click link tracking. Button Resync dùng khi cron bị delay.
DLưu ý: nhật ký & kiểm tra
Mỗi lần gọi xưởng, mỗi webhook nhận được đều lưu nhật ký. Nhật ký API ghi: endpoint, HTTP status, request/response (scrub PII). Nhật ký webhook ghi: topic, nonce, chữ ký xác thực (pass/fail), action thực hiện. Dữ liệu này giúp tech support debug nhanh nếu có lỗi.
Nonce dedup qua UNIQUE index: Để tránh xử lý webhook 2 lần (nếu xưởng gửi lại), hệ thống dùng nonce (unique per webhook) + partial UNIQUE index trên (webhook_topic, nonce). Nếu nhận nonce cũ → 200 OK idempotent, không xử lý lại.