xforge · tài liệu FE

FE: module order — đơn hàng (ADR-0073) #

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.

Đơn tạo ra từ chốt giỏ ở storefront (module checkout, channel: "web") hoặc do nhân viên tạo ở CMS (createOrder, channel: "admin", xem "Tạo đơn").

Hai trục trạng thái #

status:         placed ──confirm──► confirmed ──fulfill──► fulfilled ──complete──► completed
                  │                     │
                  └──────cancel─────────┴──► cancelled

paymentStatus:  unpaid → paid → partially_refunded / refunded

Tiền là chuỗi (subtotal, discountTotal, taxTotal, shippingTotal, offsetTotal, grandTotal) kèm currency.

CMS / admin (XforgeClient) #

Menu: key order.orders (quyền order.read).

ViệcMethodQuyền
Danh sáchlistOrders({ query })order.read
Chi tiếtgetOrder({ params: { id } })order.read
Xác nhậnconfirmOrder({ params: { id } })order.manage
Giao (xuất kho)fulfillOrder({ params: { id } })order.manage
Hoàn tấtcompleteOrder({ params: { id } })order.manage
HuỷcancelOrder({ params: { id }, body: { reason? } })order.cancel
Xem trước tiềnquoteOrder({ body })order.create
Tạo đơncreateOrder({ body })order.create
Ghi nhận tiềnrecordOrderPayment({ params: { id }, body })order.record_payment

Tạo đơn #

Màn hình gọi quoteOrder mỗi khi đổi dòng / khách / mã / phí giao để hiện tổng tiền, rồi createOrder khi lưu. quoteOrder không giữ gì và KHÔNG kiểm tồn kho: thiếu hàng chỉ báo lúc createOrder.

FieldDùng choGhi chú
lines[{ variantId, uomId?, qty }]cả hai1–200 dòng; uomId vắng = đơn vị gốc
customerId?cả haikhách của ĐÚNG store hiện tại: chọn bằng listCustomers({ query: { store } }) vì admin cấp account thấy khách của mọi store (Core ≥ 1.30); vắng = khách lẻ
codes?cả haimã giảm giá / thẻ quà, nhập sai nhiều lần → 429
shippingFee?cả haido nhân viên nhập, vắng = 0 (KHÔNG tự lấy checkout.shipping)
contact?: { name?, email?, phone? }tạo đơncó khách: field vắng lấy của khách. Không khách: contact.name bắt buộc (400 order_contact_required)
shippingAddress?, note?, paymentMethod?tạo đơnpaymentMethod: prepaid (mặc định) / cod. email của đơn là nơi nhận hoá đơn; phone là nơi nhận SMS

Thu tiền đơn prepaid: đơn chờ tiền về qua ý định thanh toán, tiền về đủ thì đơn tự confirmed.

Đơn cod: không tự huỷ theo ý định; tiền về khi hãng nộp tiền thu hộ (remitShipmentCod, module shipment). Lệnh tạo đơn của nhân viên KHÔNG áp checkout.payment_methods (cấu hình đó là lựa chọn của người mua lúc chốt đơn); database chưa nâng cấp → 409 order_cod_unavailable.

Báo cáo #

Dùng màn báo cáo chung (listReports, runReport, exportReport; form dựng từ params), đều cần order.read.

nameTham sốCột
order.daily_revenuefrom, to, channel?day, currency, orders, subtotal, discount, tax, shipping, offset, total
order.status_summaryfrom, tostatus, paymentStatus, currency, orders, total (dashboard)
order.top_productsfrom, to, sort? (revenue / qty), limit? (50)variantId, sku, product, options, unit, currency, orders, qty, revenue

Định nghĩa doanh thu (một nghĩa cho cả ba báo cáo): đơn có placedAt nằm trong khoảng ngày THEO GIỜ STORE, không tính đơn cancelled, CHƯA trừ hoàn tiền, kể cả đơn chưa thu tiền. Đơn huỷ về sau tự rời báo cáo của ngày đặt; hoàn tiền thì không.

Xuất file #

Tập order.orders CHỈ xuất (listDatasets, exportDataset, startDatasetExport, quyền order.read): một dòng một đơn, sớm nhất trước, có tên / email / điện thoại khách; không có dòng hàng, địa chỉ, ghi chú. Không có file mẫu / nhập.

In + gửi hoá đơn #

Mẫu order.invoice: HOÁ ĐƠN BÁN HÀNG, KHÔNG phải hoá đơn VAT (hoá đơn VAT của cấu hình payments.einvoice). Xem: printDocument({ params: { name, id } }), quyền order.read. Gửi email: emailDocument, quyền order.send_invoice (canEmail ở listPrintables), luôn tới customerEmail của đơn, không nhập được địa chỉ khác; đơn không có email → 409 print_recipient_missing.

Thông báo, realtime, webhook #

Storefront (StorefrontClient) #

Chỉ đơn của CHÍNH khách đang đăng nhập (đơn của người khác → 404 order_not_found); không có kho / người tạo.

Lỗi cần xử lý #

codeStatusFE nên
order_not_found404đơn không có / không phải của khách → trang 404
order_invalid_transition409trạng thái đã đổi (người khác vừa xử lý / tự huỷ) → tải lại đơn
order_paid_cancel409đơn đã trả: CMS → hoàn tiền trước; storefront → mời liên hệ cửa hàng
order_no_warehouse409store chưa đặt kho mặc định (cấu hình của store)
order_customer_not_found404khách không chọn được cho store này → chọn lại khách
order_contact_required400đơn không khách thiếu tên liên hệ → tô ô tên (error.at: "contact")
order_cod_unavailable409database chưa nâng cấp → chọn trả trước
Nguồn: xforge-modules: modules/sales/order/FE.md