URD: Đơn hàng
| Module | CORE-07 | Phiên bản | v0.6 |
|---|---|---|---|
| Trạng thái | In-progress | Ngày | 2026-06-04 |
Tài liệu nghiệp vụ. URD này chính là danh sách tính năng của Đơn hàng - mỗi tính năng bên dưới là một Vùng chức năng (
<AREA>). Cùng mã<AREA>đó định danh cho PRD (PRD-<AREA>-NNN) và test (TC-<AREA>-NNN) của tính năng, và mỗi tính năng được liệt kê trong danh mục tính năng Delivery. Xem quy ước Feature Spine.
1. Mục đích
Định nghĩa yêu cầu hướng người dùng cho quản lý đơn hàng - vòng đời sale order từ giỏ qua checkout đến thanh toán, cùng các phần mở rộng F&B mà một địa điểm phục vụ đầy đủ cần: tách hoá đơn, phiếu bếp, phiên ca POS, đặt bàn và tích điểm loyalty.
2. Phạm vi
| Bao gồm | Loại trừ |
|---|---|
| Vòng đời sale order (DRAFT → PROCESSING → PARTIAL → COMPLETED / CANCELLED) | Luồng hoàn / trả hàng (Dự kiến) |
| Mục đơn hàng (sản phẩm, tách combo, tuỳ chỉnh) | Thay đổi tồn kho (Kho) |
| Checkout và hoàn tác | Tích hợp nhà cung cấp thanh toán (Thanh toán) |
| Tách và gộp đơn | Bộ máy thuế & phát hành hoá đơn điện tử |
| Tách hoá đơn (chia hoá đơn) | Theo dõi đơn giao hàng (Dự kiến) |
| Phiếu bếp và trạm (F&B) | Quản lý sơ đồ bàn / chỗ ngồi (Dự kiến) |
| Phiên POS (ca) với báo cáo X/Z | Ứng dụng hiển thị bếp chuyên biệt (Dự kiến) |
| Đặt bàn | Mẫu đơn hàng (Dự kiến) |
| Tích điểm loyalty | Đặc tả API kỹ thuật (xem tài liệu lập trình viên) |
| Cập nhật thời gian thực tới bếp & dashboard |
3. Định nghĩa
| Thuật ngữ | Định nghĩa |
|---|---|
| Sale Order | Một giao dịch chứa các mục đang bán; một thực thể đóng cả vai trò giỏ (DRAFT) lẫn đơn đã chốt. |
| Order Item | Một dòng hàng - một biến thể sản phẩm (chế độ PRODUCT) hoặc một mục nhập thủ công (chế độ CUSTOM). |
| Combo | Một sản phẩm tách thành các dòng con có giá khi thêm vào giỏ. |
| Sale Check | Một nhóm trả độc lập trong một đơn, dùng để chia hoá đơn. |
| Phiếu bếp (Kitchen Ticket) | Một phiếu gửi tới bếp để chuẩn bị món F&B; chứa các mục từ một sale order. |
| Trạm bếp (Kitchen Station) | Một khu chuẩn bị có tên (ví dụ bếp nướng, quầy bar) tiếp nhận phiếu. |
| Phiên POS (POS Session) | Một ca của thu ngân trên một thiết bị cụ thể; theo dõi tiền mở / đóng ca và sinh báo cáo. |
| Báo cáo X (X Report) | Bản tóm tắt ca tạm thời - có thể sinh nhiều lần. |
| Báo cáo Z (Z Report) | Báo cáo đóng ca cuối cùng - chỉ một bản mỗi phiên. |
| Đặt bàn (Reservation) | Một lượt đặt của khách cho ngày / giờ trong tương lai kèm số lượng khách. |
4. Mô hình Khái niệm
Chỉ ở mức khái niệm - schema đầy đủ nằm trong mô hình miền của lập trình viên.
5. Danh mục tính năng
Danh sách tính năng của module. Mỗi dòng là một tính năng (một Vùng chức năng). Chi tiết ở §6. Được phản chiếu trong danh mục tính năng Delivery.
| Feature ID | Tính năng | Phase | Trạng thái | Ưu tiên |
|---|---|---|---|---|
ORD | Sale Order | P1 | Built | High |
CHK | Tách hóa đơn | P2 | Built | Medium |
KIT | Phiếu bếp | P2 | Built | High |
STA | Trạm bếp | P2 | Built | Medium |
POS | Phiên POS | P2 | Built | High |
RSV | Đặt bàn | P2 | Built | Medium |
PNT | Điểm loyalty | P2 | Built | Medium |
PCK | Màn chọn món | P2 | Planned | High |
SLF | QR Self-order | P2 | Planned | High |
SHF | Ca đa nhân viên | P2 | In-progress | High |
ENT | Quyền lợi (Entitlement) | P1 | Built | High |
Trạng thái: live từ Plane nếu có map, còn lại do registry khai báo. Vocabulary đồng nhất với Plane (state-group / phase).
6. Tính năng
Một mục con cho mỗi tính năng, theo thứ tự danh mục. Mỗi tính năng gói gọn mô tả, yêu cầu và nghiệm thu cùng nhau. Ưu tiên = MoSCoW (Must / Should / Could / Won't).
ORD - Sale Order Built
Mã tính năng: orders/ORD · Phase: P1 · PRDs: PRD-ORD-001 · PRD-ORD-002 · Dev: @nx/sale
Lợi ích cho người dùng: thu ngân dựng một đơn như một giỏ, thêm sản phẩm (gồm cả combo), rồi đưa nó qua checkout đến thanh toán - kèm tách / gộp và liên kết khách hàng khi còn ở nháp.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-ORD-001 | M | Tạo đơn nháp (giỏ) có mục |
| URD-ORD-002 | M | Thêm, cập nhật, xoá mục chỉ khi đang ở DRAFT |
| URD-ORD-003 | M | Thêm cùng một sản phẩm sẽ gộp số lượng vào dòng có sẵn |
| URD-ORD-004 | M | Đặt số lượng mục về 0 sẽ xoá dòng đó |
| URD-ORD-005 | M | Thêm một mục combo tách thành các dòng con có giá |
| URD-ORD-006 | M | Checkout: DRAFT → PROCESSING (kiểm tra mục, khoá giá) |
| URD-ORD-007 | M | Checkout kiểm tra: giỏ không rỗng, giá ≥ 0, số lượng ≥ 1 |
| URD-ORD-008 | M | Hoàn tác: PROCESSING → DRAFT |
| URD-ORD-009 | M | Huỷ từ DRAFT, PROCESSING hoặc PARTIAL (kèm lý do tuỳ chọn) |
| URD-ORD-010 | M | Thanh toán một phần → trạng thái PARTIAL |
| URD-ORD-011 | M | Thanh toán đủ → trạng thái COMPLETED |
| URD-ORD-012 | S | Tách một đơn thành nhiều đơn (chỉ DRAFT) |
| URD-ORD-013 | S | Gộp nhiều đơn (chỉ DRAFT) |
| URD-ORD-014 | S | Gắn một khách hàng vào đơn |
| URD-ORD-015 | S | Đa tiền tệ với tỉ giá (mặc định VND) |
| URD-ORD-016 | C | Áp số lượng mục tối đa cho mỗi đơn |
| URD-ORD-017 | M | Tách gán mục / số lượng cụ thể vào các đơn nháp mới (mỗi đơn tuỳ chọn tên / khách hàng); một dòng được gán hết sẽ di chuyển nguyên, một dòng một phần sẽ tách để lại phần dư trên nguồn; nguồn rỗng bị huỷ (FULL_SPLIT), nguồn một phần được re-price; số lượng không dương, mục không tồn tại, hoặc over-allocation bị từ chối |
| URD-ORD-018 | M | Dòng đầu của một combo và mọi dòng con phải di chuyển cùng nhau, đầy đủ số lượng, vào cùng một nhóm đích; di chuyển combo một phần hoặc bỏ rơi bị từ chối |
| URD-ORD-019 | M | Gộp di chuyển mọi mục của các đơn nháp nguồn vào đơn nháp đích và huỷ các nguồn (MERGED_INTO_<target>); chỉ các đơn cùng merchant và cùng sale channel mới gộp được |
| URD-ORD-020 | M | Mọi mục đã di chuyển ghi một transfer-history entry append-only (nguồn, đích, thời điểm, số lượng) tạo nên lineage tách / gộp |
| URD-ORD-021 | S | Một lần gộp có thể hoàn tác khi đơn đích vẫn nháp và đã được gộp; các mục trở về đơn nguồn ban đầu (khôi phục về nháp) qua lineage; số lượng thêm sau khi gộp ở lại đích |
| URD-ORD-022 | M | Tách, gộp và hoàn tác là nguyên tử; allocation usages clone (tách) / move (gộp) / cancel (hoàn tác) đồng bộ và các đơn bị ảnh hưởng được re-price |
| URD-ORD-023 | M | Một đơn có check hoạt động không thể tách, gộp, hay hoàn tác |
Nghiệm thu
AC-ORD-01: Vòng đời đơn hàng
| Cho trước | Khi | Thì |
|---|---|---|
| Đơn DRAFT | Checkout | PROCESSING (giá đã khoá) |
| PROCESSING | Thanh toán đủ | COMPLETED |
| PROCESSING | Thanh toán một phần | PARTIAL |
| Bất kỳ trạng thái chưa kết thúc nào | Huỷ | CANCELLED |
| Giỏ rỗng | Checkout | Bị từ chối |
AC-ORD-02: Tách combo
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm combo | Thêm vào giỏ | Một dòng đầu + các dòng con giá 0 được tạo |
| Cùng combo đã có trong đơn | Thêm lại | Bị từ chối (đã có trong đơn) |
AC-ORD-03: Tách một đơn nháp
| Cho trước | Khi | Thì |
|---|---|---|
| Một đơn DRAFT có mục | Tách thành các nhóm, lấy hết số lượng một dòng | Dòng di chuyển nguyên sang đơn nháp mới, đóng dấu một transfer entry |
| Một đơn DRAFT có dòng số lượng 5 | Tách gán 2 cho một đơn nháp mới | Dòng tách - 2 trên đơn nháp mới, 3 ở lại nguồn; cả hai được re-price |
| Một lần tách làm rỗng nguồn | - | Nguồn bị huỷ (FULL_SPLIT) và tồn kho đã giữ của nó bị huỷ |
| Một lần tách gán vượt số lượng khả dụng của một dòng | - | Bị từ chối (over-allocation) |
AC-ORD-04: Gộp & hoàn tác
| Cho trước | Khi | Thì |
|---|---|---|
| Hai đơn DRAFT cùng merchant + channel | Gộp vào một đích | Mọi mục di chuyển sang đích, các nguồn bị huỷ (MERGED_INTO_<target>), tồn kho đã giữ được move |
| Một đích đã gộp vẫn DRAFT | Hoàn tác | Mọi mục trở về đơn nguồn ban đầu qua lineage; các nguồn khôi phục về DRAFT |
| Một dòng có số lượng tăng sau khi gộp | Hoàn tác | Phần dư ở lại đích; chỉ số lượng đã di chuyển ban đầu trở về |
| Một đích chưa từng được gộp | Hoàn tác | Bị từ chối (chưa gộp) |
AC-ORD-05: Combo nguyên tử & check hoạt động
| Cho trước | Khi | Thì |
|---|---|---|
| Một combo (dòng đầu + con) trên một đơn nháp | Tách chỉ gán dòng đầu, hoặc một phần số lượng của một dòng con | Bị từ chối (combo phải di chuyển cùng nhau với đầy đủ số lượng) |
| Một đơn có check hoạt động | Tách, gộp, hoặc hoàn tác | Bị từ chối - hoàn tác các check trước |
CHK - Tách hóa đơn Built
Mã tính năng: orders/CHK · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: một bàn tách một đơn thành nhiều check trả độc lập, phân bổ mục và số lượng cụ thể (thậm chí khách hàng khác nhau) cho mỗi check, và đơn chỉ hoàn tất khi mọi check được trả.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-CHK-001 | S | Tách một đơn thành nhiều check thanh toán |
| URD-CHK-002 | S | Phân bổ mục và số lượng cụ thể cho mỗi check |
| URD-CHK-003 | S | Khách hàng khác nhau cho mỗi check |
| URD-CHK-004 | S | Đơn hoàn tất khi mọi check của nó hoàn tất |
| URD-CHK-005 | C | Hoàn tác một lần tách khi chưa check nào được trả |
Nghiệm thu
AC-CHK-01: Chia hoá đơn
| Cho trước | Khi | Thì |
|---|---|---|
| Một đơn có mục | Tách thành nhiều check với mục được phân bổ | Mỗi check trả được độc lập |
| Mọi check của đơn hoàn tất | - | Đơn hoàn tất |
KIT - Phiếu bếp Built
Mã tính năng: orders/KIT · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: mục đơn hàng được gửi tới bếp dưới dạng phiếu, chuyển qua các trạng thái nấu, cập nhật màn hình theo thời gian thực, và kích hoạt tiêu thụ tồn kho khi phục vụ.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-KIT-001 | M | Gửi mục đơn hàng tới bếp (tạo phiếu + mục) |
| URD-KIT-002 | M | Gửi idempotent - một lần gửi trùng sinh ra cùng một phiếu |
| URD-KIT-003 | M | Vòng đời phiếu: PENDING → PROCESSING → READY → COMPLETED / VOIDED |
| URD-KIT-004 | M | Vòng đời mục: PENDING → COOKING → READY → SERVED / VOIDED |
| URD-KIT-005 | M | Trạng thái phiếu tự chuyển theo trạng thái các mục của nó |
| URD-KIT-006 | M | Thay đổi theo cách huỷ-và-gửi-lại (mục đã gửi không sửa tại chỗ) |
| URD-KIT-007 | S | Cờ ưu tiên gấp và thứ tự theo từng đơn để sắp xếp phiếu |
| URD-KIT-008 | M | Cập nhật thời gian thực tới màn hình bếp và dashboard |
| URD-KIT-009 | S | Đánh dấu một mục đã phục vụ sẽ kích hoạt tiêu thụ tồn kho |
Nghiệm thu
AC-KIT-01: Bếp
| Cho trước | Khi | Thì |
|---|---|---|
| Mục đơn hàng | Gửi tới bếp | Phiếu được tạo |
| Cùng một key idempotency | Gửi trùng | Không tạo phiếu trùng |
| Mọi mục đều READY/SERVED | - | Phiếu tự chuyển trạng thái |
| Mục được đánh dấu đã phục vụ | - | Tiêu thụ tồn kho được kích hoạt |
STA - Trạm bếp Built
Mã tính năng: orders/STA · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: merchant định nghĩa các trạm chuẩn bị có tên và định tuyến nhóm hàng sản phẩm tới chúng, kèm cấu hình máy in theo từng trạm và tự động in.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-STA-001 | S | Tạo trạm có tên theo từng merchant (i18n) |
| URD-STA-002 | S | Định tuyến nhóm hàng sản phẩm tới trạm |
| URD-STA-003 | S | Cấu hình máy in theo từng trạm kèm tự động in |
Nghiệm thu
AC-STA-01: Định tuyến trạm
| Cho trước | Khi | Thì |
|---|---|---|
| Một trạm có nhóm hàng sản phẩm được định tuyến | Một mục trong nhóm đó được gửi tới bếp | Phiếu được định tuyến tới trạm đó |
POS - Phiên POS Built
Mã tính năng: orders/POS · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: một thu ngân mở một ca trên một thiết bị với tiền mở ca, gắn các đơn vào ca, rồi đóng ca bằng một lần đếm tiền sinh ra báo cáo Z và một bản tóm tắt X tạm thời.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-POS-001 | M | Mở một phiên trên một thiết bị với tiền mở ca |
| URD-POS-002 | M | Chỉ một phiên đang mở cho mỗi thiết bị |
| URD-POS-003 | M | Đóng một phiên: đếm tiền, ghi chênh lệch |
| URD-POS-004 | M | Báo cáo Z (đóng ca) - một bản mỗi phiên |
| URD-POS-005 | S | Báo cáo X (tạm thời) - lặp lại được |
| URD-POS-006 | S | Đơn tạo trong một ca được gắn vào phiên |
| URD-POS-007 | S | Theo dõi dự kiến so với thực tế cho các phương thức không dùng tiền mặt |
| URD-POS-008 | C | Hỗ trợ đếm lại khi đóng ca |
Nghiệm thu
AC-POS-01: Phiên
| Cho trước | Khi | Thì |
|---|---|---|
| Thiết bị chưa có phiên đang mở | Mở | Phiên được tạo |
| Thiết bị đã có phiên đang mở | Mở | Bị từ chối |
| Phiên đang mở | Đóng kèm đếm tiền | Chênh lệch được tính, báo cáo Z được sinh |
RSV - Đặt bàn Built
Mã tính năng: orders/RSV · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: lễ tân nhận lượt đặt bàn với thông tin khách, số lượng khách và nguồn, theo dõi chúng qua một vòng đời, rồi sinh một sale order liên kết khi check-in.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-RSV-001 | S | Tạo một đặt bàn: tên khách, điện thoại, số lượng khách, ngày / giờ |
| URD-RSV-002 | S | Vòng đời: PENDING → CONFIRMED → CHECKED_IN / CANCELLED |
| URD-RSV-003 | S | Theo dõi nguồn: điện thoại, khách vãng lai, trực tuyến, khác |
| URD-RSV-004 | S | Gắn thẻ dịp: sinh nhật, kỷ niệm, công việc, v.v. |
| URD-RSV-005 | S | Khi check-in, sinh và liên kết một sale order |
Nghiệm thu
AC-RSV-01: Đặt bàn
| Cho trước | Khi | Thì |
|---|---|---|
| Thông tin khách | Tạo | Trạng thái PENDING, bàn được giữ |
| Đặt bàn đã xác nhận | Check in | Trạng thái CHECKED_IN, sale order được sinh & liên kết |
PNT - Điểm loyalty Built
Mã tính năng: orders/PNT · Phase: P2 · PRDs: - · Dev: @nx/sale
Lợi ích cho người dùng: khách hàng tích điểm loyalty trên đơn hoàn tất, được cấp một lần cho mỗi đơn, với số dư theo dõi theo từng khách hàng cho từng merchant.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-PNT-001 | S | Tích điểm trên đơn hoàn tất |
| URD-PNT-002 | S | Cấp điểm là idempotent cho mỗi đơn |
| URD-PNT-003 | S | Số dư điểm theo dõi theo từng khách hàng cho từng merchant |
Nghiệm thu
AC-PNT-01: Tích điểm
| Cho trước | Khi | Thì |
|---|---|---|
| Một đơn có liên kết khách hàng | Đơn hoàn tất | Điểm được tích và cộng vào số dư của khách hàng |
| Cùng một đơn hoàn tất bị phát lại | - | Không cấp trùng (idempotent cho mỗi đơn) |
PCK - Màn chọn món Planned
Mã tính năng: sale/PCK · Phase: P2 (T6) · PRDs: PRD-PCK-001 · Dev: @nx/sale · @nx/commerce
Mang lại gì cho người dùng: thu ngân chọn bất kỳ món nào trong tối đa 3 chạm. Sản phẩm có Options resolve về đúng một Variant qua lựa chọn option; món 1-variant bỏ qua hẳn bước chọn.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-PCK-001 | M | Thu ngân chọn bất kỳ món nào trong ≤3 chạm |
| URD-PCK-002 | M | Sản phẩm có Options resolve về đúng một Variant qua lựa chọn option |
| URD-PCK-003 | M | Món 1-variant bỏ qua bước chọn (một chạm vào giỏ) |
| URD-PCK-004 | M | Giá cập nhật trực tiếp theo option đang chọn |
| URD-PCK-005 | S | Tổ hợp option không hợp lệ không thể chọn |
| URD-PCK-006 | S | Option mặc định được chọn sẵn cho đường đi nhanh nhất |
| URD-PCK-007 | S | Quét barcode bỏ qua picker (quét = vào giỏ) |
Nghiệm thu
AC-PCK-01: Resolve option
| Given | When | Then |
|---|---|---|
| Món có option size + đá | Thu ngân chọn size rồi đá | Đúng một variant vào giỏ, giá đúng - tổng ≤3 chạm |
| Món chỉ có 1 variant | Thu ngân chạm món | Vào giỏ ngay, không hiện chooser |
SLF - QR Self-order Planned
Mã tính năng: sale/SLF · Phase: P2 (T7-T8) · PRDs: PRD-SLF-001 · Dev: @nx/sale · @nx/commerce
Mang lại gì cho người dùng: khách ngồi bàn quét QR và tự gọi món bằng điện thoại - không cần cài app. Đơn rơi vào POS gắn đúng bàn; nhân viên xác nhận và đơn chạy xuống bếp như mọi đơn khác.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-SLF-001 | M | Khách quét QR của bàn và thấy menu trên điện thoại (không cần app) |
| URD-SLF-002 | M | Menu phục vụ theo policy (giờ/kênh) từ Menu của merchant |
| URD-SLF-003 | M | Khách tạo giỏ và gửi đơn cho bàn đó |
| URD-SLF-004 | M | Đơn rơi vào POS gắn đúng bàn; nhân viên xác nhận hoặc từ chối |
| URD-SLF-005 | M | Đơn đã xác nhận chạy xuống bếp như đơn nhân viên nhập |
| URD-SLF-006 | S | Khách thấy cập nhật trạng thái đơn |
| URD-SLF-007 | S | Món hết hàng bị ẩn / không gọi được |
| URD-SLF-008 | C | Khách gọi thêm trong cùng phiên |
Nghiệm thu
AC-SLF-01: Đơn của khách tới bếp
| Given | When | Then |
|---|---|---|
| Khách bàn 5 quét QR của bàn | Gửi đơn 2 món | POS hiện đơn ở bàn 5 chờ xác nhận; xác nhận xong bếp nhận phiếu |
| Một món hết hàng | Khách xem menu | Món đó không gọi được |
SHF - Ca Đa nhân viên In-progress
Mã tính năng: sale/SHF · Phase: P2 (T7) · PRDs: PRD-SHF-001 · Dev: @nx/sale
Mang lại gì cho người dùng: cửa hàng nhiều nhân viên vận hành ca bán hàng: mở/đóng ca trên thiết bị, nhiều nhân viên cùng tham gia một ca, báo cáo X/Z khi đóng, và đối soát két - tiền đếm thực vs kỳ vọng, ghi nhận chênh lệch. (Ghi chú as-built: backend đa nhân viên đã trên develop; POS vẫn chạy phiên 1 người cũ - increment này nối FE sang.)
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-SHF-001 | M | Nhân viên mở và đóng ca trên một thiết bị |
| URD-SHF-002 | M | Nhiều nhân viên tham gia một ca (đa nhân viên) |
| URD-SHF-003 | M | Báo cáo X giữa ca; báo cáo Z khi đóng ca |
| URD-SHF-004 | M | Đối soát tiền mặt khi đóng: đếm thực vs kỳ vọng, ghi chênh lệch |
| URD-SHF-005 | M | Đơn bán trong ca gắn đúng nhân viên thao tác |
| URD-SHF-006 | S | Biến động tiền mặt (thu/chi/nộp két) ghi theo ngăn kéo |
| URD-SHF-007 | S | Chủ xem doanh thu theo ca và theo kỳ |
| URD-SHF-008 | M | Đóng ca với chênh lệch khác 0 bắt buộc nhập ghi chú lý do |
| URD-SHF-009 | S | Quỹ đầu ca bị khoá sau khi ca đã mở |
Nghiệm thu
AC-SHF-01: Một ca trọn vẹn
| Given | When | Then |
|---|---|---|
| Hai nhân viên trong một ca đang mở | Bán cả ngày rồi đóng ca | Báo cáo Z đúng; tiền kỳ vọng = quỹ đầu ca + bán tiền mặt − hoàn + thu − chi; chênh lệch = đếm thực − kỳ vọng |
| Một ca đang mở trên thiết bị | Thiết bị thứ hai mở ca khác | Hành vi theo chính sách ca (dùng chung vs theo thiết bị) |
ENT - Quyền lợi Built
Mã tính năng: sale/ENT · Phase: P2 · PRDs: PRD-ENT-001 · Dev: @nx/sale · @nx/core
Mang lại gì cho người dùng: merchant bán thứ khách rút dần theo thời gian - combo đồ uống, vé lớp học, một kỳ membership, một khối phút tính theo lượng. Một policy định nghĩa thứ được bán (hạn mức + hiệu lực + phạm vi); bán variant của nó đúc một grant theo từng khách, đóng băng một bản chụp policy để sửa catalog sau này không bao giờ động tới vé đã bán; mỗi lần dùng ghi một redemption chỉ-thêm trừ dần số dư, kiểm món so với phạm vi đóng băng, và có thể đảo.
Yêu cầu
| ID | P | Yêu cầu |
|---|---|---|
| URD-ENT-001 | M | Một policy gắn 1:1 với một variant bán được (variant bán dưới dạng quyền lợi) |
| URD-ENT-002 | M | Một policy khai các chiều giới hạn: COUNT (lần dùng rời rạc), TIME_WINDOW (cửa sổ hiệu lực, không trần dùng), METERED (đơn vị liên tục); có thể kết hợp |
| URD-ENT-003 | M | Một policy mang hạn mức tuỳ chọn (lượng + đơn vị) và thời lượng hiệu lực tuỳ chọn; có thể vắng một trong hai trục |
| URD-ENT-004 | M | Một policy khai chế độ kích hoạt - khi mua, khi dùng lần đầu, hoặc theo lịch - chi phối khi nào hiệu lực bắt đầu |
| URD-ENT-005 | S | Một policy có thể yêu cầu gắn khách (quyền lợi định danh) hoặc cho phép quyền lợi vô danh |
| URD-ENT-006 | M | Phạm vi sử dụng của một policy được định bằng target; tập target rỗng nghĩa là truy cập mở |
| URD-ENT-007 | M | Một target gắn một policy vào một món cụ thể (mặc định variant) kèm thứ tự; duy nhất theo (policy, món) |
| URD-ENT-008 | M | Bán variant quyền lợi đúc một grant với mã duy nhất, số dư hạn mức, và cửa sổ hiệu lực giải từ policy + chế độ kích hoạt |
| URD-ENT-009 | M | Grant đóng băng một bản chụp policy và target của nó lúc bán, cô lập khỏi sửa catalog về sau |
| URD-ENT-010 | M | Grant theo dõi tổng hạn mức so với đã-dùng; bộ đếm đã-dùng là nguồn sự thật và khả dụng = tổng − đã-dùng |
| URD-ENT-011 | M | Grant chuyển qua PENDING → ACTIVE → EXHAUSTED / EXPIRED / SUSPENDED / CANCELLED |
| URD-ENT-012 | M | Một redemption trừ bộ đếm đã-dùng cho một số lượng, ghi theo đơn / mục tiêu thụ nó |
| URD-ENT-013 | S | Một redemption với số lượng đơn vị khác đơn vị hạn mức của grant được quy đổi qua tỉ lệ đơn vị |
| URD-ENT-014 | M | Một redemption kiểm món được dùng so với phạm vi target đóng băng của grant (mở khi không có target) |
| URD-ENT-015 | M | Một đảo trả lại hạn mức cho grant; sổ là chỉ-thêm (sửa lỗi là mục mới, không bao giờ sửa) |
| URD-ENT-016 | S | Redemption có thể liên kết đơn / mục đơn hàng tiêu thụ nó |
| URD-ENT-017 | S | Mọi policy, target, grant, và redemption đều giới hạn theo merchant và soft-delete |
Nghiệm thu
AC-ENT-01: Bán một grant
| Cho trước | Khi | Thì |
|---|---|---|
| Một policy đã cấu hình trên một variant | Variant được bán | Một grant được đúc với mã duy nhất, số dư hạn mức của policy, và cửa sổ hiệu lực; trạng thái ACTIVE (hoặc PENDING tuỳ chế độ kích hoạt) |
| Một grant đã bán | Policy bị sửa sau đó | Điều khoản của grant không đổi - đọc từ bản chụp đóng băng của nó |
AC-ENT-02: Trừ và cạn
| Cho trước | Khi | Thì |
|---|---|---|
| Một grant ACTIVE còn số dư | Một lần dùng được trừ cho một số lượng | Một redemption được thêm và bộ đếm đã-dùng tăng; khả dụng = tổng − đã-dùng |
| Bộ đếm đã-dùng chạm tổng hạn mức | - | Grant đọc EXHAUSTED; các lần trừ tiếp bị từ chối |
AC-ENT-03: Đảo trả lại hạn mức
| Cho trước | Khi | Thì |
|---|---|---|
| Một redeem trước đó trên một grant | Một đảo được ghi | Một mục đảo chỉ-thêm trả lại hạn mức; redeem gốc không bị sửa hay xoá |
AC-ENT-04: Phạm vi target
| Cho trước | Khi | Thì |
|---|---|---|
| Một grant khoanh vào các món cụ thể | Một redeem nhắm món ngoài phạm vi | Bị từ chối |
| Một grant mà bản chụp không có target | Một redeem nhắm món bất kỳ | Được phép (truy cập mở) |
7. Ràng buộc & Không thuộc mục tiêu
Ràng buộc
| ID | Ràng buộc |
|---|---|
| C-01 | Mục chỉ sửa được khi đơn đang ở DRAFT |
| C-02 | Tách / gộp đơn chỉ thực hiện ở DRAFT |
| C-03 | Tối đa một phiên POS đang mở cho mỗi thiết bị |
| C-04 | Đúng một báo cáo Z cho mỗi phiên |
| C-05 | Gửi phiếu bếp là idempotent thông qua key |
| C-06 | Mọi bản ghi dùng soft-delete |
| C-07 | Mọi thao tác yêu cầu xác thực và được giới hạn theo merchant |
Không thuộc mục tiêu
- Luồng hoàn / trả hàng
- Theo dõi đơn giao hàng
- Quản lý sơ đồ bàn / chỗ ngồi
- Ứng dụng hiển thị bếp chuyên biệt
- Mẫu đơn hàng
8. Lịch sử Phiên bản
| Ngày | Tác giả | Mô tả | Ver |
|---|---|---|---|
| 2026-02-26 | P. Do - Product Owner | User story ban đầu | v0.1 |
| 2026-04-16 | P. Do - Product Owner | Tái cấu trúc thành bảng yêu cầu theo vùng chức năng; thêm các vùng combo, tách hoá đơn, trạm, đặt bàn, điểm | v0.3 |
| 2026-06-04 | Claude (AI pair) | Tổ chức lại theo tính năng (Feature Spine); mỗi tính năng mang yêu cầu + nghiệm thu của riêng nó; CON chuyển vào Ràng buộc | v0.4 |
| 2026-06-15 | Nhóm Bán hàng | Thêm tính năng ENT Quyền lợi (policy / target / grant / redemption) kèm yêu cầu + nghiệm thu | v0.5 |
| 2026-06-15 | Nhóm Bán hàng | Mở rộng ORD với tách / gộp / hoàn tác + lineage transfer-history (URD-ORD-017..023, AC-ORD-03..05); liên kết PRD-ORD-002 | v0.6 |