URD: Sản phẩm
| Module | CORE-05 | Phiên bản | v0.4 |
|---|---|---|---|
| Trạng thái | Built | Ngày | 2026-05-29 |
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. |
| 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. 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 Sản phẩm (PRD)
| 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 |
5.2 Nhóm hàng (CAT)
| 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 |
5.3 Biến thể (VAR)
| 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ể + info + bộ fare + fares + định danh trong một bước nguyên tử | Built |
| URD-VAR-004 | M | Cập nhật aggregate: cập nhật một biến thể với mọi dữ liệu liên quan một cách nguyên tử | 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 |
5.4 Fare / Định giá (FAR)
| 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.
5.5 Định danh (PID)
| 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 |
5.6 Khuyến mãi (CMP)
| 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.
5.7 Truy cập (ACC)
| 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 |
6. Tiêu chí 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 |
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 info, fares, và định danh trong một bước | Biến thể + info + bộ fare + fares + định danh được tạo nguyên tử |
| 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 |
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 |
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 |
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à tất-cả-hoặc-không |
| 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 |