URD: Sản phẩm
| Module | CORE-05 | Phiên bản | v0.7 |
|---|---|---|---|
| Trạng thái | Built | Ngày | 2026-06-04 |
Tài liệu nghiệp vụ. URD này là danh sách tính năng của Sản phẩm - mỗi tính năng bên dưới là một Lĩnh vực Chức năng (
<AREA>). Cùng<AREA>đó làm khóa 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 các yêu cầu hướng người dùng cho quản lý danh mục sản phẩm: cách chủ cửa hàng tạo và duy trì sản phẩm, các biến thể họ thực sự bán, giá (fares) mà các biến thể đó mang, nhóm hàng tổ chức chúng, và định danh dùng để tra cứu. Danh mục là nền tảng mà mọi kênh bán đọc từ đó.
2. Phạm vi
| Bao gồm | Loại trừ |
|---|---|
| Tạo / cập nhật / quản lý trạng thái sản phẩm | Định mức nguyên vật liệu & công thức → Kho |
| Nhóm hàng (với cờ add-on) | Mức tồn theo địa điểm → Kho |
| Biến thể và các thao tác biến thể aggregate | Xử lý đơn hàng & thanh toán → Đơn hàng |
| Fares và bộ fare (đầu vào định giá) | Tính chiết khấu khuyến mãi (Đang thực hiện) |
| Định danh đa lược đồ (SYSTEM, SLUG, SKU, BARCODE, QRCODE) | Engine quy đổi đơn vị (Dự kiến) |
| Khả dụng theo kênh bán | Nhập hàng loạt / CSV (Dự kiến) |
| Loại biến thể & đơn vị đo lường | Đặc tả API kỹ thuật → tài liệu lập trình viên |
| Lọc dữ liệu theo vai trò |
Chỉ là định nghĩa khái niệm - schema và hành vi cụ thể nằm trong mô hình miền commerce và fares của pricing.
3. Định nghĩa
| Thuật ngữ | Định nghĩa |
|---|---|
| Sản phẩm (Product) | Một mục cơ sở trong danh mục của merchant. |
| Biến thể (Variant) | Một đơn vị bán được của sản phẩm (ví dụ kích cỡ hoặc hương vị). Thứ thực sự được bán và định giá. |
| Loại biến thể (Variant type) | Phân loại điều khiển việc quản lý tồn & bundle: STORABLE, CONSUMABLE, SERVICE, KIT, COMBO, MANUFACTURED. |
| Tùy chọn (Option) | Một cách một sản phẩm biến đổi (Size, Mức đá…), thuộc về một sản phẩm; mỗi biến thể chọn một trong các giá trị của nó. |
| Giá trị tùy chọn (Option value) | Một lựa chọn trên một tùy chọn (S / M / L); duy nhất trong tùy chọn của nó. |
| Tổ hợp (Combination) | Tập giá trị một biến thể chọn - danh tính của nó trong sản phẩm. |
| Bộ fare (Fare set) | Container định giá liên kết 1-1 với một biến thể. |
| Fare | Một mục giá bên trong bộ fare; có thể là giá cơ bản, override, hoặc bậc theo số lượng/thời gian/kênh. |
| Nhóm hàng (Category) | Một nhóm sản phẩm trong một merchant; có thể đánh cờ add-on. |
| Định danh (Identifier) | Một mã theo lược đồ (SYSTEM, SLUG, SKU, BARCODE, QRCODE) dùng để tra cứu. |
| Bundle | Quan hệ combo, add-on, hoặc thường-mua-cùng giữa các biến thể. |
| Sản phẩm theo kênh bán (Sale-channel product) | Một ánh xạ kiểm soát sản phẩm nào hiển thị ở kênh nào. |
4. Mô hình Khái niệm
Chỉ là khái niệm - schema đầy đủ nằm trong mô hình miền commerce và fares của pricing.
5. Danh mục Tính năng
Danh sách tính năng của module này. Mỗi dòng là một tính năng (một Lĩnh vực 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 |
|---|---|---|---|---|
PRD | Danh mục Sản phẩm | P1 | Built | High |
CAT | Nhóm hàng | P1 | Built | High |
VAR | Biến thể | P2 | Built | High |
BND | Combo & Gói bán kèm | P2 | Built | High |
OPT | Tùy chọn Sản phẩm | P2 | Built | High |
FAR | Fares / Định giá | P2 | Built | High |
PID | Định danh | P1 | Built | High |
CMP | Khuyến mãi | P3 | In-progress | Medium |
ACC | Kiểm soát Truy cập | P1 | Built | High |
SCH | Kênh bán hàng | P2 | 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ỗi mục con cho một tính năng, theo thứ tự danh mục. Mỗi tính năng giữ mô tả, yêu cầu, và tiêu chí chấp nhận cùng nhau. Mức ưu tiên = MoSCoW (Must / Should / Could / Won't).
PRD - Danh mục Sản phẩm Built
Feature ID: products/PRD · Phase: P1 · PRDs: - · Dev: @nx/commerce
Tính năng cho người dùng: chủ tạo sản phẩm trong một merchant - mỗi sản phẩm có tên/mô tả đa ngôn ngữ, một định danh hệ thống và slug, một biến thể mặc định, hình ảnh, gán kênh bán, và vòng đời đầy đủ (vô hiệu hóa / kích hoạt lại / lưu trữ). Sản phẩm có thể tìm kiếm và liệt kê, lọc theo vai trò.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-PRD-001 | M | Chủ có thể tạo một sản phẩm trong một merchant | Built |
| URD-PRD-002 | M | Mỗi sản phẩm nhận một định danh do hệ thống sinh và slug | Built |
| URD-PRD-003 | M | Tên & mô tả sản phẩm hỗ trợ nhiều ngôn ngữ | Built |
| URD-PRD-004 | M | Một biến thể mặc định được tạo cùng mỗi sản phẩm mới | Built |
| URD-PRD-005 | M | Chủ có thể cập nhật thông tin sản phẩm | Built |
| URD-PRD-006 | M | Chủ có thể vô hiệu hóa / kích hoạt lại / lưu trữ một sản phẩm | Built |
| URD-PRD-007 | M | Slug sản phẩm là duy nhất trong cùng một merchant | Built |
| URD-PRD-008 | M | Người dùng có thể tìm sản phẩm theo ID hoặc slug | Built |
| URD-PRD-009 | M | Người dùng có thể xem danh sách sản phẩm (lọc theo vai trò) | Built |
| URD-PRD-013 | S | Chủ có thể đính kèm hình ảnh / media cho sản phẩm | Built |
| URD-PRD-014 | S | Chủ có thể gán sản phẩm cho các kênh bán cụ thể | Built |
| URD-PRD-015 | S | Sản phẩm đã lưu trữ là chỉ đọc (trạng thái cuối) | Built |
| URD-PRD-016 | S | Sản phẩm hỗ trợ phân cấp cha-con | Built |
| URD-PRD-017 | S | Người dùng có thể tìm sản phẩm theo tên (một phần, nhận biết i18n) | Built |
| URD-PRD-018 | S | Người dùng có thể lọc danh sách sản phẩm theo nhóm hàng | Built |
| URD-PRD-019 | C | Chủ có thể nhập danh mục từ CSV / bảng tính | Planned |
Chấp nhận
AC-PRD-01: Tạo sản phẩm
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ với một merchant đang hoạt động | Tạo một sản phẩm với tên + nhóm hàng | Sản phẩm được tạo với định danh đã sinh; biến thể mặc định được tạo; sản phẩm liên kết với merchant |
| Slug sẽ trùng | Hệ thống đảm bảo một slug duy nhất trong merchant |
CAT - Nhóm hàng Built
Feature ID: products/CAT · Phase: P1 · PRDs: - · Dev: @nx/commerce
Tính năng cho người dùng: chủ gom sản phẩm vào nhóm hàng với tên đa ngôn ngữ; nhóm hàng có thể đánh cờ add-on để thúc đẩy bán kèm tại điểm bán.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-CAT-001 | M | Chủ có thể tạo nhóm hàng trong một merchant | Built |
| URD-CAT-002 | M | Tên nhóm hàng hỗ trợ nhiều ngôn ngữ | Built |
| URD-CAT-003 | M | Chủ có thể cập nhật và xóa nhóm hàng | Built |
| URD-CAT-004 | S | Một nhóm hàng có thể được đánh cờ add-on | Built |
Chấp nhận
AC-CAT-01: Quản lý nhóm hàng
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ với một merchant đang hoạt động | Tạo một nhóm hàng với tên đa ngôn ngữ | Nhóm hàng được tạo và giới hạn theo merchant |
| Nhóm hàng được đánh cờ add-on | Lưu | Cờ add-on được lưu trên nhóm hàng |
VAR - Biến thể Built
Feature ID: products/VAR · Phase: P2 · PRDs: - · Dev: @nx/commerce
Tính năng cho người dùng: chủ thêm nhiều biến thể bán được cho mỗi sản phẩm, mỗi biến thể có loại (STORABLE/CONSUMABLE/SERVICE/KIT/COMBO/MANUFACTURED), đơn vị đo lường, định danh, khoảng thời gian hiệu lực, và quan hệ bundle - được tạo hoặc cập nhật trong một thao tác liền mạch cùng với thông tin, bộ fare, fares, và định danh.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-VAR-001 | M | Mỗi sản phẩm có ít nhất một biến thể; trạng thái có thể thay đổi | Built |
| URD-VAR-002 | M | Chủ có thể tạo thêm biến thể | Built |
| URD-VAR-003 | M | Tạo aggregate: biến thể + thông tin + bộ fare + fares + định danh trong một thao tác liền mạch | Built |
| URD-VAR-004 | M | Cập nhật aggregate: cập nhật một biến thể cùng mọi dữ liệu liên quan trong một thao tác liền mạch | Built |
| URD-VAR-005 | M | Mỗi biến thể có một định danh do hệ thống sinh | Built |
| URD-VAR-006 | M | Loại biến thể (STORABLE / CONSUMABLE / SERVICE / KIT / COMBO / MANUFACTURED) có thể chọn | Built |
| URD-VAR-007 | S | Biến thể có thể có khoảng thời gian hiệu lực | Built |
| URD-VAR-008 | S | Chủ có thể gán định danh SKU / BARCODE / QRCODE | Built |
| URD-VAR-009 | S | Biến thể lưu đơn vị đo lường cơ sở / mua / bán | Built |
| URD-VAR-010 | S | Bundle liên hệ các biến thể như combo / add-on / thường-mua-cùng | Built |
| URD-VAR-011 | C | Giá đã giải quyết của một biến thể có thể đọc qua một endpoint chuyên biệt | Planned |
| URD-VAR-012 | C | Quy đổi đơn vị giữa đơn vị mua và đơn vị bán | Planned |
Chấp nhận
AC-VAR-01: Biến thể aggregate
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm có sẵn | Chủ tạo một biến thể với thông tin, fares, và định danh trong một bước | Biến thể + thông tin + bộ fare + fares + định danh được tạo trong một thao tác liền mạch |
| Bất kỳ bước con nào thất bại | Toàn bộ thao tác rollback; không có gì được lưu |
BND - Combo & Gói bán kèm Built
Feature ID: products/BND · Phase: P2 · PRDs: PRD-BND-001 · Dev: @nx/commerce · @nx/sale
Tính năng làm gì cho người dùng: chủ liên kết hai biến thể bằng một gói có kiểu - một combo (định giá một lần, cấu thành từ các biến thể thành phần), một add-on (một biến thể liên quan miễn phí gắn vào một dòng chủ), hoặc một gợi ý mua-kèm-thường-xuyên (có hướng, với giá ghi-đè tùy chọn riêng). Tại điểm bán một combo được bung phía máy chủ thành một dòng dẫn có giá cùng các dòng thành phần giá-không, số lượng thành phần nhân theo số lượng combo, và add-on / FBT gắn vào một dòng dẫn cấp-cao nhất hiện có. Việc bung được rào chắn khỏi độ sâu vượt mức, chu trình và combo rỗng, và toàn bộ đồ thị gói được tạo liền mạch cùng biến thể. (Đây là chi tiết tính năng đằng sau đề cập gói ở URD-VAR-010.)
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-BND-001 | M | Một gói liên kết một biến thể dẫn với một biến thể liên quan theo một trong ba kiểu: COMBO, ADDON, FBT | Built |
| URD-BND-002 | M | Một combo cấu thành từ các biến thể thành phần mỗi cái có số lượng riêng; combo được định giá, thành phần về không | Built |
| URD-BND-003 | M | Một add-on liên kết một biến thể liên quan luôn-miễn-phí với một biến thể chủ | Built |
| URD-BND-004 | S | Một mục FBT gợi ý một biến thể liên quan, có hướng, và có thể mang giá ghi-đè riêng (cố định / phần trăm / theo-đơn-vị / bậc thang) hoặc lùi về fare của biến thể được gợi ý | Built |
| URD-BND-005 | M | Cùng một quan hệ (kiểu, dẫn, liên quan) không thể trùng lặp | Built |
| URD-BND-006 | S | Các gói của một biến thể dẫn và một kiểu mang thứ tự hiển thị | Built |
| URD-BND-007 | M | Các gói được tạo liền mạch cùng biến thể; mọi lỗi quay lui toàn bộ thao tác tạo | Built |
| URD-BND-008 | M | Thêm một combo vào giỏ bung nó phía máy chủ thành một dòng dẫn có giá cùng các dòng con thành phần giá-không liên kết với dòng dẫn | Built |
| URD-BND-009 | M | Số lượng mỗi thành phần là số-lượng-mỗi-combo × số lượng combo; một thành phần đến từ nhiều nhánh được gộp vào một dòng với số lượng cộng dồn | Built |
| URD-BND-010 | S | Combo có thể lồng nhau; việc bung đệ quy đến tối đa năm cấp độ sâu | Built |
| URD-BND-011 | M | Một combo vượt giới hạn độ sâu, tạo chu trình, hoặc không có thành phần bị từ chối kèm lý do cụ thể | Built |
| URD-BND-012 | M | Dòng thành phần combo không thể sửa trực tiếp; chủ sửa dòng dẫn combo và các con tự nhân theo | Built |
| URD-BND-013 | M | Một biến thể sản phẩm combo phải khai báo ít nhất một thành phần combo khi tạo | Built |
| URD-BND-014 | S | Một mục add-on hoặc FBT gắn tại điểm bán vào một dòng dẫn cấp-cao nhất hiện có, được kiểm khớp với quan hệ đã cấu hình; combo không thể gắn theo cách này | Built |
| URD-BND-015 | S | Một add-on vẫn giữ chỗ tồn cho thành phần của nó dù miễn phí | Built |
| URD-BND-016 | S | Mỗi dòng dẫn combo và dòng thành phần ghi lại combo cùng các dòng gói đã sinh ra nó cho bếp / hoàn tiền / kiểm toán về sau | Built |
Tiêu chí Chấp nhận
AC-BND-01: Combo bung khi thêm vào giỏ
| Cho trước | Khi | Thì |
|---|---|---|
| Một combo định giá một lần, gồm 1 burger + 1 khoai + 1 nước | Thu ngân thêm combo vào giỏ | Một dòng dẫn có giá cùng ba dòng thành phần giá-không liên kết với dòng dẫn được tạo |
| Cùng combo đó, số lượng hai | Thu ngân thêm vào | Mỗi dòng thành phần được nhân lên gấp đôi số-lượng-mỗi-combo |
AC-BND-02: Rào chắn bung combo
| Cho trước | Khi | Thì |
|---|---|---|
| Một combo lồng quá năm cấp | Thu ngân thêm vào | Từ chối - combo lồng quá sâu |
| Một combo gián tiếp tham chiếu chính nó | Thu ngân thêm vào | Từ chối - phát hiện chu trình combo |
| Một biến thể combo không có thành phần | Thu ngân thêm vào | Từ chối - combo không có thành phần |
AC-BND-03: Gắn add-on / FBT
| Cho trước | Khi | Thì |
|---|---|---|
| Một dòng dẫn cấp-cao nhất và một quan hệ add-on đã cấu hình | Thu ngân gắn add-on | Một dòng add-on miễn phí được tạo dưới dòng dẫn và tồn của nó được giữ chỗ |
| Một quan hệ FBT đã cấu hình | Thu ngân gắn mục FBT | Một dòng mang giá riêng (có thể ghi-đè) được tạo dưới dòng dẫn |
| Một quan hệ combo | Thu ngân thử gắn | Từ chối - combo được máy chủ bung, không gắn được |
| Mục không khớp biến thể dẫn / liên quan đã cấu hình của gói | Thu ngân gắn | Từ chối - quan hệ gói không khớp |
AC-BND-04: Dòng combo giữ nhất quán
| Cho trước | Khi | Thì |
|---|---|---|
| Một combo trên đơn | Chủ thử sửa trực tiếp một dòng thành phần | Từ chối - thành phần không sửa trực tiếp được |
| Cùng combo đó | Chủ sửa số lượng dòng dẫn combo | Mọi dòng thành phần tự nhân theo |
AC-BND-05: Tạo gói
| Cho trước | Khi | Thì |
|---|---|---|
| Một biến thể sản phẩm combo khai báo không có thành phần combo | Chủ tạo nó | Từ chối - một biến thể combo phải khai báo ít nhất một thành phần |
| Một biến thể có gói combo / add-on / FBT | Chủ tạo nó; bất kỳ bước con nào thất bại | Toàn bộ thao tác tạo biến thể quay lui; không dòng gói nào được lưu |
OPT - Tùy chọn Sản phẩm Built
Feature ID: products/OPT · Phase: P2 · PRDs: PRD-OPT-001 · PRD-OPT-002 · Dev: @nx/commerce
Tính năng cho người dùng: chủ cửa hàng định nghĩa các tùy chọn mà sản phẩm biến đổi theo (Size, Mức đá, Màu sắc…) với giá trị có thứ tự, và mỗi biến thể chọn một giá trị mỗi tùy chọn - nhờ đó mỗi biến thể được nhận diện duy nhất bằng tổ hợp lựa chọn của nó. Khi tạo sản phẩm, chủ khai báo các trục tùy chọn cùng với đúng những biến thể cần sinh, và hệ thống tạo toàn bộ sản phẩm - tùy chọn, giá trị, biến thể, liên kết, định danh và thuộc tính kho - một cách liền mạch, giải quyết một biến thể mặc định, và làm mỗi biến thể tra được theo tùy chọn của nó trong tìm kiếm.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-OPT-001 | M | Chủ định nghĩa các tùy chọn của sản phẩm, mỗi tùy chọn có một tên và một thứ tự hiển thị | Built |
| URD-OPT-002 | M | Mỗi tùy chọn mang một danh sách giá trị được sắp thứ tự | Built |
| URD-OPT-003 | M | Một tùy chọn và các giá trị của nó được tạo hoặc đổi cùng nhau trong một bước | Built |
| URD-OPT-004 | M | Biến thể khai báo giá trị của nó trên mỗi tùy chọn nó dùng; tùy chọn hoặc giá trị lạ bị từ chối | Built |
| URD-OPT-005 | M | Một biến thể chọn tối đa một giá trị mỗi tùy chọn | Built |
| URD-OPT-006 | M | Mọi giá trị một biến thể dùng phải thuộc về sản phẩm và về tùy chọn của nó | Built |
| URD-OPT-007 | M | Không có hai biến thể nào của một sản phẩm dùng chung một tổ hợp; biến thể không tùy chọn được miễn | Built |
| URD-OPT-008 | M | Một cài đặt merchant có thể buộc mọi biến thể dùng tùy chọn, từ chối biến thể không tùy chọn | Built |
| URD-OPT-009 | S | Chủ có thể đổi các tùy chọn mà một biến thể dùng | Built |
| URD-OPT-010 | S | Một tùy chọn không có giá trị nào, hoặc một lựa chọn trùng, bị từ chối | Built |
| URD-OPT-011 | M | Khi tạo sản phẩm, chủ cung cấp cả các trục tùy chọn và đúng những biến thể cần sinh, mỗi biến thể khai báo lựa chọn của nó trên từng trục | Built |
| URD-OPT-012 | M | Chỉ những biến thể đã khai báo được sinh - hệ thống không bao giờ tự bung trọn ma trận tùy chọn | Built |
| URD-OPT-013 | M | Trục tùy chọn, giá trị của chúng, và mọi biến thể đã khai báo được sinh cùng sản phẩm trong một thao tác liền mạch | Built |
| URD-OPT-014 | M | Đúng một biến thể được sinh là mặc định: cái được đánh dấu tường minh, nếu không thì cái khai báo đầu tiên được nâng | Built |
| URD-OPT-015 | M | Khai báo nhiều hơn một mặc định tường minh trong cùng yêu cầu tạo bị từ chối | Built |
| URD-OPT-016 | S | Chủ có thể đổi biến thể nào là mặc định sau khi tạo | Built |
| URD-OPT-017 | S | Mỗi biến thể được sinh có thể mang SKU / barcode riêng; một barcode lặp trong-yêu-cầu hoặc đã dùng trong merchant bị từ chối | Built |
| URD-OPT-018 | S | Thuộc tính quản lý tồn chỉ sinh cho loại biến thể quản lý tồn; combo và loại không quản lý tồn được tạo không theo dõi | Built |
| URD-OPT-019 | S | Biến thể được sinh và lựa chọn tùy chọn của chúng được phản chiếu vào tìm kiếm, giữ tươi mới khi trục, giá trị, hoặc liên kết đổi | Built |
Nghiệm thu
AC-OPT-01: Định nghĩa tùy chọn và khai báo biến thể
| Cho trước | Khi | Thì |
|---|---|---|
| Sản phẩm có tùy chọn Size (S/M/L) và Mức đá (100/50/0) | Chủ khai báo một biến thể cho Lớn, 50% đá | Biến thể được lưu với hai giá trị đã chọn |
| Cùng sản phẩm đó | Chủ khai báo một biến thể dùng một size không tồn tại | Bị từ chối - giá trị không thuộc sản phẩm |
AC-OPT-02: Tổ hợp trùng bị từ chối
| Cho trước | Khi | Thì |
|---|---|---|
| Một biến thể cho Lớn, 50% đá đã tồn tại | Chủ khai báo một biến thể khác cho cùng Lớn, 50% đá | Bị từ chối - tổ hợp là như nhau bất kể thứ tự chọn |
AC-OPT-03: Cài đặt bắt buộc tùy chọn
| Cho trước | Khi | Thì |
|---|---|---|
| Cài đặt bắt buộc tùy chọn đang bật | Chủ tạo một biến thể không dùng tùy chọn nào | Bị từ chối - mọi biến thể phải dùng tùy chọn |
| Cài đặt tắt | Cùng yêu cầu đó | Biến thể được lưu; biến thể không tùy chọn có thể cùng tồn tại |
AC-OPT-04: Lựa chọn nằm trong sản phẩm
| Cho trước | Khi | Thì |
|---|---|---|
| Một tùy chọn thuộc sản phẩm A | Một biến thể của sản phẩm B thử dùng nó | Bị từ chối - tùy chọn không thuộc sản phẩm đó |
| Một giá trị thuộc tùy chọn Size | Một biến thể ghép nó với tùy chọn Mức đá | Bị từ chối - giá trị không thuộc tùy chọn đó |
AC-OPT-05: Sinh biến thể tường minh
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm có trục Size (S/M/L) và Đá (100/50/0) | Chủ tạo nó khai báo năm biến thể cụ thể | Đúng năm biến thể đó được sinh - không bao giờ là ma trận chín ô đầy đủ |
| Cùng thao tác tạo đó | Bất kỳ bước con nào thất bại (tùy chọn sai, barcode trùng, hai mặc định) | Toàn bộ đồ thị sản phẩm rollback; không lưu gì |
AC-OPT-06: Biến thể mặc định khi sinh
| Cho trước | Khi | Thì |
|---|---|---|
| Nhiều biến thể khai báo, một cái đánh dấu mặc định | Sản phẩm được tạo | Biến thể được đánh dấu là mặc định |
| Nhiều biến thể khai báo, không cái nào đánh dấu | Sản phẩm được tạo | Biến thể khai báo đầu tiên được nâng thành mặc định |
| Hai biến thể khai báo đánh dấu mặc định | Sản phẩm được tạo | Bị từ chối - chỉ cho phép một mặc định |
AC-OPT-07: Đổi mặc định sau khi tạo
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm có mặc định là biến thể A | Chủ nâng biến thể B thành mặc định | B trở thành mặc định và A không còn là mặc định |
AC-OPT-08: Tính duy nhất barcode theo từng biến thể
| Cho trước | Khi | Thì |
|---|---|---|
| Hai biến thể khai báo mang cùng một barcode | Sản phẩm được tạo | Bị từ chối - barcode trùng trong yêu cầu |
| Barcode của một biến thể khai báo đã tồn tại trong merchant | Sản phẩm được tạo | Bị từ chối - barcode đã được dùng |
AC-OPT-09: Thuộc tính kho theo loại biến thể
| Cho trước | Khi | Thì |
|---|---|---|
| Một loại biến thể quản lý tồn | Biến thể được sinh | Thuộc tính quản lý tồn được sinh cho mỗi biến thể |
| Một loại combo hoặc không quản lý tồn | Biến thể được sinh | Biến thể được tạo không theo dõi |
AC-OPT-10: Biến thể tra được theo tùy chọn
| Cho trước | Khi | Thì |
|---|---|---|
| Một biến thể được sinh liên kết Size=M, Đá=50 | Tìm kiếm được truy vấn/lọc theo giá trị tùy chọn của nó | Biến thể được trả về và lọc được theo size và ice |
| Trục, giá trị, hoặc liên kết của nó đổi sau đó | Thay đổi được áp dụng | Facet tùy chọn của biến thể trong tìm kiếm được làm tươi tương ứng |
FAR - Fares / Định giá Built
Feature ID: products/FAR · Phase: P2 · PRDs: - · Dev: @nx/pricing
Tính năng cho người dùng: mỗi biến thể mang đúng một bộ fare với ít nhất một fare mặc định; fares có thể phân bậc theo khoảng ngày, cửa sổ số lượng, và ngữ cảnh (kênh, thời gian), và hệ thống giải quyết giá áp dụng tại thời điểm bán (override → discount → mặc định).
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-FAR-001 | M | Mỗi biến thể có đúng một bộ fare | Built |
| URD-FAR-002 | M | Mỗi bộ fare chứa ít nhất một fare (mặc định) | Built |
| URD-FAR-003 | M | Số tiền fare phải bằng không hoặc dương | Built |
| URD-FAR-004 | M | Tại thời điểm bán hệ thống giải quyết fare áp dụng: override → discount → mặc định | Built |
| URD-FAR-005 | S | Fares có thể có khoảng thời gian hiệu lực | Built |
| URD-FAR-006 | S | Fares có thể có cửa sổ số lượng tối thiểu / tối đa | Built |
| URD-FAR-007 | S | Fares hỗ trợ nhóm cha-con với rule ngữ cảnh (kênh, thời gian, số lượng) | Built |
Mô hình fare hiện tại dùng loại nhóm OVERRIDE và DISCOUNT (một bản nháp trước đó gọi chúng là SALE/OVERRIDE). Xem fares của pricing.
Chấp nhận
AC-FAR-01: Giải quyết fare
| Cho trước | Khi | Thì |
|---|---|---|
| Một biến thể với nhiều fares đang hoạt động | Thêm vào giỏ | Nhóm override thắng; nếu không thì discount đủ điều kiện thấp nhất; nếu không thì fare mặc định; cửa sổ ngày & số lượng lọc ứng viên trước |
| Không có fare đủ điều kiện | Fare mặc định (cơ bản) được dùng |
PID - Định danh Built
Feature ID: products/PID · Phase: P1 · PRDs: - · Dev: @nx/commerce
Tính năng cho người dùng: sản phẩm và biến thể được tra cứu bằng mã theo lược đồ - SYSTEM và SLUG được tự sinh, trong khi chủ có thể gắn định danh SKU, BARCODE, và QRCODE, mỗi mã duy nhất theo từng lược đồ trong một merchant.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-PID-001 | M | Mỗi định danh là duy nhất theo từng lược đồ trong một merchant | Built |
| URD-PID-002 | M | Một sản phẩm / biến thể có thể giữ nhiều định danh trên các lược đồ | Built |
| URD-PID-003 | M | Định danh SYSTEM và SLUG được tự sinh khi tạo | Built |
| URD-PID-004 | S | Chủ có thể gán định danh SKU, BARCODE, QRCODE | Built |
Chấp nhận
AC-PID-01: Tra cứu định danh
| Cho trước | Khi | Thì |
|---|---|---|
| Một sản phẩm được tạo | Khi tạo | Định danh SYSTEM và SLUG được tự sinh |
| Chủ gán một SKU/BARCODE/QRCODE | Lưu | Định danh duy nhất theo từng lược đồ trong merchant |
CMP - Khuyến mãi In-progress
Feature ID: products/CMP · Phase: P3 · PRDs: - · Dev: @nx/pricing
Tính năng cho người dùng: chủ tạo và quản lý các chiến dịch khuyến mãi giới hạn theo merchant với khoảng ngày và giới hạn sử dụng; việc áp dụng chiết khấu tự động tại thời điểm định giá chưa được bật.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-CMP-001 | S | Chủ có thể tạo và quản lý chiến dịch khuyến mãi (với khoảng ngày, giới hạn sử dụng) | In-progress |
| URD-CMP-002 | S | Khuyến mãi được giới hạn theo một merchant | In-progress |
| URD-CMP-003 | C | Chiết khấu khuyến mãi được áp dụng tự động tại thời điểm định giá | Planned |
CRUD khuyến mãi đã hoạt động; engine tính chiết khấu đang bị tắt, nên chiết khấu chưa được áp dụng tự động. Xem khuyến mãi của pricing.
Chấp nhận
AC-CMP-01: Chiến dịch khuyến mãi
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ với một merchant đang hoạt động | Tạo một chiến dịch khuyến mãi với khoảng ngày và giới hạn sử dụng | Chiến dịch được tạo và giới hạn theo merchant |
ACC - Kiểm soát Truy cập Built
Feature ID: products/ACC · Phase: P1 · PRDs: - · Dev: @nx/commerce
Tính năng cho người dùng: mọi thao tác sản phẩm được lọc theo vai trò của người dùng yêu cầu - chủ và nhân viên chỉ thấy sản phẩm trong các merchant của mình/được phân công, trong khi admin bỏ qua lọc theo vai trò.
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-ACC-001 | M | Mọi thao tác sản phẩm được lọc theo vai trò của người dùng yêu cầu | Built |
| URD-ACC-002 | M | Chủ chỉ thấy sản phẩm dưới các merchant của mình | Built |
| URD-ACC-003 | M | Nhân viên chỉ thấy sản phẩm trong các merchant được phân công | Built |
| URD-ACC-004 | M | Admin / Super Admin bỏ qua lọc theo vai trò | Built |
Chấp nhận
AC-ACC-01: Truy cập theo vai trò
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ với merchant X, Y | Xem sản phẩm | Chỉ sản phẩm dưới X và Y được trả về |
| Nhân viên phân công cho X | Xem sản phẩm | Chỉ sản phẩm dưới X được trả về |
| Admin | Xem sản phẩm | Mọi sản phẩm được trả về; bỏ qua lọc |
SCH - Kênh bán hàng (Tổ chức thực đơn & hiển thị theo kênh) Built
Feature ID: products/SCH · Phase: P2 · PRDs: PRD-SCH-001 · Dev: @nx/commerce
Tính năng cho người dùng: chủ tổ chức những gì mình bán thành các kênh bán hàng - bề mặt thực đơn có tên, đa ngôn ngữ, phân cấp (tại quầy, mang đi, giao hàng, ki-ốt). Một sản phẩm chỉ hiển thị trong một kênh khi được gán vào đó, nên hiển thị là một công tắc duy nhất bật khi tạo sản phẩm. Mỗi kênh mang một chuỗi vị trí kho theo thứ tự ưu tiên (ưu tiên thấp nhất là nguồn kho mặc định tự chọn), có trạng thái vòng đời (kích hoạt / ngừng / lưu trữ), và không thể bị ngừng khi vẫn còn đơn đang hoạt động. Mọi danh sách kênh và sản phẩm được phục vụ đã lọc theo quyền của người gọi - một chủ chỉ thấy kênh của các merchant của mình, admin thấy tất cả - nên thực đơn một thiết bị nhận được luôn được giới hạn theo người đang hỏi. (Đây là tính năng chi tiết đằng sau nhắc đến kênh bán hàng tại URD-PRD-014.)
Yêu cầu
| ID | P | Yêu cầu | Trạng thái |
|---|---|---|---|
| URD-SCH-001 | M | Chủ có thể tạo kênh bán hàng trong một merchant, mỗi kênh có tên/mô tả đa ngôn ngữ và một định danh hệ thống tự sinh | Built |
| URD-SCH-002 | M | Slug kênh là duy nhất giữa các kênh đang hoạt động trong cùng một merchant | Built |
| URD-SCH-003 | M | Một kênh có trạng thái vòng đời: kích hoạt, ngừng, lưu trữ | Built |
| URD-SCH-004 | M | Chủ có thể cập nhật một kênh; một cập nhật không có trường nào bị từ chối | Built |
| URD-SCH-005 | M | Việc ngừng một kênh bị từ chối khi nó còn đơn bán đang hoạt động | Built |
| URD-SCH-006 | S | Kênh hỗ trợ phân cấp cha-con | Built |
| URD-SCH-007 | M | Một sản phẩm được gán vào một hoặc nhiều kênh; việc gán quyết định sản phẩm có hiển thị trong kênh đó không | Built |
| URD-SCH-008 | M | Các gán sản phẩm-vào-kênh được ghi như một phần của bước tạo sản phẩm toàn vẹn | Built |
| URD-SCH-009 | S | Một kênh mang một chuỗi vị trí kho theo thứ tự ưu tiên; vị trí ưu tiên thấp nhất là mặc định tự chọn; chuỗi được diff-sync khi cập nhật | Built |
| URD-SCH-010 | M | Xóa một kênh sẽ bỏ gán các sản phẩm của nó và soft-delete kênh | Built |
| URD-SCH-011 | M | Danh sách/đếm kênh và sản phẩm được phục vụ đã lọc theo quyền của người gọi; admin bỏ qua bộ lọc | Built |
| URD-SCH-012 | S | Kênh và sản phẩm có thể tìm kiếm, giới hạn theo các merchant của người gọi | Built |
| URD-SCH-013 | S | Tạo kênh đầu tiên của một merchant hoàn tất bước onboarding kênh của merchant | Built |
Chấp nhận
AC-SCH-01: Tạo một kênh
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ với một merchant đang hoạt động | Tạo một kênh với tên đa ngôn ngữ và một slug | Kênh được tạo, giới hạn theo merchant, với một định danh hệ thống tự sinh |
| Một kênh đang hoạt động trong merchant đã dùng slug đó | Chủ tạo kênh khác cùng slug | Bị từ chối - slug đã được dùng trong merchant này |
AC-SCH-02: Hiển thị theo kênh qua gán sản phẩm
| Cho trước | Khi | Thì |
|---|---|---|
| Một kênh Tại quầy và một kênh Giao hàng | Chủ tạo một sản phẩm chỉ gán cho Tại quầy | Sản phẩm hiển thị trong Tại quầy và không trong Giao hàng |
| Cùng sản phẩm đó | Chủ gán thêm vào Giao hàng | Sản phẩm giờ hiển thị trong cả hai kênh |
AC-SCH-03: Chốt chặn khi ngừng
| Cho trước | Khi | Thì |
|---|---|---|
| Một kênh còn đơn (đang hoạt động) đang mở | Chủ ngừng kênh | Bị từ chối - kênh còn đơn đang hoạt động |
| Cùng kênh sau khi đơn được đóng / hủy | Chủ ngừng nó | Kênh được ngừng |
AC-SCH-04: Chuỗi vị trí kho
| Cho trước | Khi | Thì |
|---|---|---|
| Một kênh tạo với các vị trí [A, B, C] | Kênh được lưu | Vị trí A (ưu tiên thấp nhất) là nguồn kho mặc định tự chọn |
| Chuỗi được cập nhật thành [B, A] | Cập nhật được áp dụng | B trở thành mặc định; vị trí bị loại được bỏ gán; vị trí còn lại giữ hàng của nó |
| Đầu vào liệt kê một vị trí hai lần | Kênh được lưu | Bản trùng gộp về lần xuất hiện đầu |
AC-SCH-05: Phục vụ đã giới hạn theo quyền
| Cho trước | Khi | Thì |
|---|---|---|
| Chủ được grant merchant X và Y | Liệt kê kênh / sản phẩm | Chỉ kênh / sản phẩm của X và Y được trả về |
| Nhân viên phân công cho X | Liệt kê kênh / sản phẩm | Chỉ của X được trả về |
| Admin / Super Admin | Liệt kê kênh / sản phẩm | Tất cả được trả về; bỏ qua lọc |
AC-SCH-06: Xóa bỏ gán sản phẩm
| Cho trước | Khi | Thì |
|---|---|---|
| Một kênh có sản phẩm được gán | Chủ xóa kênh | Các gán sản phẩm của kênh được bỏ gán và kênh được soft-delete |
7. Ràng buộc & Không-mục-tiêu
Ràng buộc
| ID | Ràng buộc |
|---|---|
| C-01 | Một sản phẩm thuộc đúng một merchant |
| C-02 | Slug sản phẩm là duy nhất trong cùng một merchant |
| C-03 | Mỗi sản phẩm có ít nhất một biến thể |
| C-04 | Mỗi biến thể có đúng một bộ fare với ít nhất một fare |
| C-05 | Thao tác tạo / cập nhật aggregate là toàn vẹn: hoặc thành công trọn vẹn, hoặc không lưu gì cả |
| C-06 | Mọi bản ghi dùng soft-delete; không có gì bị xóa vật lý |
| C-07 | Lọc theo vai trò áp dụng cho mọi thao tác liệt kê và đếm |
Không-mục-tiêu
- Định mức nguyên vật liệu / quản lý công thức (→ Kho)
- Nhập hàng loạt CSV / Excel
- Engine quy đổi đơn vị
- Tính chiết khấu khuyến mãi (chỉ CRUD hiện tại)
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 & yêu cầu ban đầu | v0.1 |
| 2026-04-16 | P. Do - Product Owner | Mở rộng yêu cầu biến thể & fare | v0.3 |
| 2026-05-29 | Di chuyển tài liệu | Tái cấu trúc theo quy ước module-docs; trung thực trạng thái Built/In-progress/Planned theo tài liệu dev; tách khuyến mãi khỏi kho (chuyển sang module Kho) | v0.4 |
| 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 + tiêu chí chấp nhận riêng | v0.5 |
| 2026-06-15 | Product squad | Thêm tính năng BND Combo & Gói bán kèm (URD-BND-001..016) kèm tiêu chí chấp nhận; liên kết PRD-BND-001 | v0.6 |
| 2026-06-15 | Product squad | Thêm tính năng SCH Kênh bán hàng (tổ chức thực đơn & hiển thị theo kênh) (URD-SCH-001..013) kèm tiêu chí chấp nhận; liên kết PRD-SCH-001 | v0.7 |