URD: Đơn hàng
| Module | CORE-07 | Phiên bản | v0.3 |
|---|---|---|---|
| Trạng thái | In-progress | Ngày | 2026-04-16 |
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ỏ tới checkout tới 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 hóa đơ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) | Flow hoàn / trả hàng (Dự kiến) |
| Mục đơn hàng (sản phẩm, fan-out combo, tùy chỉnh) | Biến đổi tồn (Kho) |
| Checkout và revert | Tích hợp nhà cung cấp thanh toán (Thanh toán) |
| Tách và gộp đơn | Engine thuế & phát hành hóa đơn điện tử |
| Tách hóa đơn (chia bill) | 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 | App hiển thị bếp chuyên biệt (Dự kiến) |
| Đặt bàn | Template đơ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 real-time 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) và đơn đã cam kết. |
| Order Item | Một line item — một biến thể sản phẩm (chế độ PRODUCT) hoặc một mục thủ công (chế độ CUSTOM). |
| Combo | Một sản phẩm fan-out 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 bill. |
| Phiếu bếp (Kitchen Ticket) | Một phiếu gửi tới bếp để chuẩn bị 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ụ grill, bar) 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) | 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 cuối — chỉ một mỗi phiên. |
| Đặt bàn (Reservation) | Một lượt đặt của khách cho ngày / giờ tương lai với số khách. |
4. Mô hình Khái niệm
Chỉ là khái niệm — schema đầy đủ nằm trong mô hình miền lập trình viên.
5. Yêu cầu Chức năng
Mỗi bảng cho một lĩnh vực chức năng. Mã
<AREA>khớp với ID test-case. Mức ưu tiên = MoSCoW (Must / Should / Could / Won't).
5.1 Sale Order (ORD)
| ID | P | Yêu cầu |
|---|---|---|
| URD-ORD-001 | M | Tạo đơn nháp (giỏ) với mục |
| URD-ORD-002 | M | Thêm, cập nhật, gỡ mục chỉ khi đang ở DRAFT |
| URD-ORD-003 | M | Thêm cùng sản phẩm gộp số lượng vào line có sẵn |
| URD-ORD-004 | M | Đặt số lượng mục về không gỡ bỏ line |
| URD-ORD-005 | M | Thêm một mục combo fan-out thành các dòng con có giá |
| URD-ORD-006 | M | Checkout: DRAFT → PROCESSING (validate mục, khóa giá) |
| URD-ORD-007 | M | Checkout validate: giỏ không rỗng, giá ≥ 0, số lượng ≥ 1 |
| URD-ORD-008 | M | Revert: PROCESSING → DRAFT |
| URD-ORD-009 | M | Cancel từ DRAFT, PROCESSING, hoặc PARTIAL (với lý do tùy 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 (chỉ DRAFT) |
| URD-ORD-013 | S | Gộp nhiều đơn (chỉ DRAFT) |
| URD-ORD-014 | S | Đính 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 một số lượng mục tối đa mỗi đơn |
5.2 Tách hóa đơn (CHK)
| 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 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 | Rollback một lần tách khi chưa check nào được trả |
5.3 Phiếu bếp (KIT)
| 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 cùng 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ự-tiến từ trạng thái các mục của nó |
| URD-KIT-006 | M | Thay đổi dùng void-và-gửi-lại (mục đã gửi không sửa tại chỗ) |
| URD-KIT-007 | S | Cờ rush và thứ tự theo từng đơn cho việc sắp phiếu |
| URD-KIT-008 | M | Cập nhật real-time tới màn hình bếp và dashboard |
| URD-KIT-009 | S | Đánh dấu một mục đã phục vụ kích tiêu thụ tồn |
5.4 Trạm bếp (STA)
| 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 với auto-print |
5.5 Phiên POS (POS)
| 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 mở 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) — một 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 đính vào phiên |
| URD-POS-007 | S | Theo dõi kỳ vọng vs. thực tế cho phương thức phi-tiền-mặt |
| URD-POS-008 | C | Hỗ trợ đếm lại khi đóng |
5.6 Đặt bàn (RSV)
| 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ố 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, walk-in, online, 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 |
5.7 Điểm Loyalty (PNT)
| 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 mỗi đơn |
| URD-PNT-003 | S | Số dư điểm theo dõi theo từng khách hàng theo từng merchant |
6. Tiêu chí Chấp nhận
AC-ORD-01: Vòng đời đơn hàng
| Cho trước | Khi | Thì |
|---|---|---|
| Đơn DRAFT | Checkout | PROCESSING (giá đã khóa) |
| PROCESSING | Thanh toán đủ | COMPLETED |
| PROCESSING | Thanh toán một phần | PARTIAL |
| Bất kỳ trạng thái không-cuối | Cancel | CANCELLED |
| Giỏ rỗng | Checkout | Bị từ chối |
AC-ORD-02: Fan-out combo
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm combo | Thêm vào giỏ | Một dòng lead + các dòng con giá-không được tạo |
| Cùng combo đã trong đơn | Thêm lại | Bị từ chối (đã trong đơn) |
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 key idempotency | Gửi trùng | Không phiếu trùng |
| Mọi mục READY/SERVED | — | Phiếu tự-tiến |
| Mục đánh dấu đã phục vụ | — | Tiêu thụ tồn được kích |
AC-POS-01: Phiên
| Cho trước | Khi | Thì |
|---|---|---|
| Không có phiên mở trên thiết bị | Mở | Phiên được tạo |
| Có phiên mở trên thiết bị | Mở | Bị từ chối |
| Phiên mở | Đóng với đếm tiền | Chênh lệch được tính, báo cáo Z sinh |
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 sinh & liên kết |
7. Ràng buộc & Không-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ỉ ở DRAFT |
| C-03 | Tối đa một phiên POS mở mỗi thiết bị |
| C-04 | Đúng một báo cáo Z mỗi phiên |
| C-05 | Gửi phiếu bếp là idempotent 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-mục-tiêu
- Flow hoàn / trả hàng
- Theo dõi đơn giao hàng
- Quản lý sơ đồ bàn / chỗ ngồi
- App hiển thị bếp chuyên biệt
- Template đơ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 lĩnh vực chức năng; thêm các lĩnh vực combo, tách hóa đơn, trạm, đặt bàn, điểm | v0.3 |