Skip to content

ADR-0001. Một thực thể SaleOrder duy nhất cho cart và order đã commit

TrườngGiá trị
Trạng tháiAccepted
Ngày2026-01-10
Người quyết địnhsale-team
Thay thế

Bối cảnh

  • Workflow POS coi "cart" và "order" như cùng một thực thể được commit dần: barista xây bản nháp, nhấn checkout, rồi thanh toán.
  • Tách thành hai thực thể (Cart + Order) yêu cầu copy state khi checkout, làm phức tạp merge/split, và nhân đôi số rooms WebSocket phải quản lý.
  • Cần một nguồn sự thật duy nhất cho thứ user đang làm việc, với một vòng đời rõ ràng.

Quyết định

Dùng một thực thể SaleOrder duy nhất với trường status. DRAFT = cart (item có thể đổi). PROCESSING / PARTIAL / COMPLETED = đã commit. CANCELLED = terminal.

Các transition trạng thái được kiểm soát bởi canModifyItems() (chỉ DRAFT), canCheckout() (chỉ DRAFT), canRevertToCart() (chỉ PROCESSING), canCancel() (bất kỳ active).

Hệ quả

ƯuNhược
Một thực thể = một nguồn sự thậtStatus enum mã hóa logic state-machine — dễ sai khớp
Merge / split hoạt động đồng nhất qua các statusTruy vấn DB muốn "chỉ orders" phải lọc status != DRAFT
WebSocket subscriber thấy một vòng đời thực thểBáo cáo audit phải cẩn thận với draft đã hủy
UI mobile/POS không cần copy stateAdd-item đồng thời cần lock rõ ràng (ADR-0002)

Phương án thay thế đã cân nhắc

Phương ánƯuNhượcLý do từ chối
Tách Cart + Order thành thực thể riêngMỗi thực thể có schema sạch hơnCopy khi checkout; nhân đôi rooms WS; logic merge/split nhân đôiChi phí triển khai vượt trội so với độ sạch của schema
SaleOrder + view CartView DRAFT vật chất hóaPhức tạp view; vẫn vấn đề lockLợi ích không đáng kể

Tham chiếu

  • core/src/models/schemas/sale/sale-order/schema.ts
  • sale/src/services/sale.service.ts:createDraftOrder
  • core/src/models/schemas/sale/sale-order/constants.ts:SaleOrderStatuses

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.