xforge · tài liệu FE

FE: module shipment — vận đơn, thu hộ (COD) #

Phần chung (khởi tạo client, lỗi, danh sách, ngôn ngữ) ở tài liệu FE của Core: docs/fe/common.md (bản đọc: xforge-documentation, ADR-0102 của xforge-core). Sửa file này CÙNG PR khi đổi hành vi FE thấy được của module.

Một đơn (module order) có tối đa 50 vận đơn. Vận đơn ghi hãng giao (carrier: mã tự do ghn, ghtk, self…), mã theo dõi, tiền thu hộ (codAmount, tiền tệ của đơn; null = không thu hộ).

Hai trục trạng thái #

Từ statusSang được
pendingin_transit, cancelled
in_transitout_for_delivery, delivered, failed, returned
out_for_deliverydelivered, failed, returned
failedin_transit (giao lại), returned
delivered / returned / cancelled— (kết thúc)

codStatus (trục tiền thu hộ, server đổi): none (không thu hộ) | pending → collected (giao xong, hãng đã thu) → remitted (hãng đã nộp tiền cho store). Vận đơn returned / cancelled khi còn pending → none.

CMS / admin (XforgeClient) #

Menu: key shipment.shipments (quyền shipment.read).

ViệcMethodQuyền
Danh sáchlistShipments({ query })shipment.read
Chi tiếtgetShipment({ params: { id } })shipment.read
Tạo cho một đơncreateShipment({ body: { orderId, carrier, trackingNumber?, codAmount?, note? } })shipment.manage
Sửa thông tin hãngupdateShipment({ params: { id }, body }) (chỉ khoá gửi lên)shipment.manage
Chuyển trạng tháisetShipmentStatus({ params: { id }, body: { status, reason? } })shipment.manage
Ghi nhận hãng nộp CODremitShipmentCod({ params: { id }, body: { reference } })shipment.reconcile
Tiền COD hãng đang giữgetShipmentCodSummary({ query: { carrier? } })shipment.read

Báo cáo shipment.cod_outstanding #

Công nợ thu hộ, quyền shipment.read, chạy qua runReport / exportReport (docs/fe/cms.md §9). Tham số bắt buộc from, to (YYYY-MM-DD, lọc theo NGÀY TẠO vận đơn, giờ store). Mỗi dòng là một tổ hợp hãng + trạng thái thu hộ + tiền tệ: carrier, codStatus, currency, shipments, amount (chuỗi), oldestCollectedAt (null khi chưa thu).

Chỉ gồm tiền CHƯA nộp về store: pending (vận đơn còn đi, chưa thu) và collected (hãng đang giữ); bỏ none, remitted, vận đơn returned / cancelled. summary là dòng tổng, null khi có nhiều tiền tệ. Khác getShipmentCodSummary: route đó chỉ tính collected, không lọc ngày.

Mẫu in shipment.delivery_note #

Phiếu giao hàng, quyền riêng shipment.print, xem qua printDocument (docs/fe/cms.md §11); không gửi email (canEmail: false). Gồm hãng, mã vận đơn, tên + số điện thoại + địa chỉ người nhận, tiền thu hộ, chỗ ký; KHÔNG có ghi chú nội bộ. Vận đơn chưa có dòng hàng riêng: phiếu liệt kê mọi dòng của đơn, kể cả khi đơn tách nhiều vận đơn. Có shipment.read mà không có shipment.print thì không in được, vì bản in lộ thông tin người nhận mà API vận đơn không trả.

Webhook gửi đi shipment.status_changed #

Đăng ký ở màn "Tích hợp" (docs/fe/cms.md §8), người đăng ký cần shipment.read. Phát cho từng vận đơn khi đổi trạng thái qua setShipmentStatus và khi huỷ đơn kéo vận đơn chờ sang cancelled. data là hợp đồng (thêm field được):

{ shipmentId, number, orderId, orderNumber, carrier, from, to, currency, codAmount, codStatus }

Không có ghi chú, lý do, mã theo dõi hay dữ liệu người nhận.

Storefront (StorefrontClient) #

Lỗi cần xử lý #

codeStatusFE nên
shipment_order_not_shippable409đơn chưa xác nhận / đã huỷ — chưa tạo vận đơn được
shipment_order_not_fulfilled409giao (xuất kho) đơn trước khi chuyển in_transit
shipment_invalid_transition409trạng thái đã đổi → tải lại vận đơn
shipment_closed409vận đơn đã kết thúc, không sửa được
shipment_limit_reached409đơn đã đủ 50 vận đơn
shipment_on_the_way409(ở cancelOrder) vận đơn đang đi — xử lý vận đơn trước
shipment_cod_not_collected409chưa thu được tiền (chưa giao xong) → chưa ghi nộp được
payment_intent_not_payable / payment_currency_mismatch / payment_intent_not_found409 / 404ý định thanh toán của đơn không nhận được tiền nộp — báo nhân viên đối soát ở module payments
Nguồn: xforge-modules: modules/sales/shipment/FE.md