Skip to content

URD: Commerce

ModuleCORE-03Phiên bảnv0.8
Trạng tháiBuiltNgày2026-06-15

Tài liệu nghiệp vụ. URD này chính là danh sách tính năng của Commerce - mỗi tính năng bên dưới là một Vùng chức năng (<AREA>). Cùng mã <AREA> đó key 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

Commerce cho phép chủ doanh nghiệp dựng lên và vận hành cấu trúc doanh nghiệp: một Tổ chức duy nhất (thương hiệu) và một hoặc nhiều Merchant (các đơn vị điểm bán hợp pháp), mỗi đơn vị có kênh bán và danh mục sản phẩm riêng. Module cung cấp onboarding một bước tạo toàn bộ cấu trúc một cách liền mạch, cộng với quản lý vòng đời đầy đủ của từng thực thể sau đó.

2. Phạm vi

Bao gồmLoại trừ
Tạo tổ chức qua onboardingVòng đời & đăng nhập nhân viên (→ Quản lý Người dùng)
Hồ sơ tổ chức, phân cấp, cài đặt, đính kèmĐịnh nghĩa vai trò/quyền (→ Quyền hạn)
Tạo merchant (đơn, hàng loạt, aggregate)Nội dung catalog sản phẩm (→ Sản phẩm)
Phân loại loại hình kinh doanhMức tồn kho (→ Tồn kho)
Quản lý kênh bánXử lý đơn hàng / checkout (→ Đơn hàng)
Quản lý danh mục với cờ add-onXử lý thanh toán (→ Thanh toán)
Chính sách xóa theo từng merchantPhát hành hóa đơn điện tử (→ Thuế & Hóa đơn)
Cấu hình merchant mã hóaĐặc tả API kỹ thuật (→ tài liệu developer)
Lọc dữ liệu theo vai trò

3. Định nghĩa

Thuật ngữĐịnh nghĩa
OrganizationThực thể thương hiệu ảo cấp cao nhất. Container cha cho merchant, người dùng và thiết bị. Mang thương hiệu, không mang định danh pháp lý.
MerchantMột đơn vị điểm bán vật lý/pháp lý dưới một tổ chức nơi giao dịch diễn ra. Nắm thông tin thuế, hồ sơ hóa đơn và ví.
Sale ChannelMột kênh bán trong một merchant (vd ăn tại chỗ, mang đi, giao hàng). Hỗ trợ phân cấp.
CategoryMột nhóm sản phẩm trong một merchant. Có thể được đánh dấu là add-on.
Business TypePhân loại điều khiển giao diện POS: DEFAULT, TICKET, FNB, THEATER.
Aggregate OperationMột yêu cầu duy nhất tạo hoặc cập nhật một merchant cùng với danh mục và kênh bán của nó, một cách liền mạch.
Deletion PolicyCấu hình theo từng merchant điều khiển hành vi cascade khi xóa thực thể.
ConfigurationCài đặt khóa-giá trị mã hóa cho một merchant (nhà cung cấp thanh toán, tích hợp).
SlugĐịnh danh thân thiện URL. Duy nhất toàn cục cho tổ chức; duy nhất theo tổ chức cho merchant; duy nhất theo merchant cho kênh bán.

4. Mô hình Khái niệm

Chỉ mang tính khái niệm - schema đầy đủ nằm trong mô hình miền developer.

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. Đối chiếu với danh mục tính năng Delivery.

Feature IDTính năngPhaseTrạng tháiƯu tiên
ORGTổ chứcP1BuiltHigh
MERMerchantP1BuiltHigh
SCKênh bánP1BuiltHigh
CATDanh mụcP2BuiltHigh
DELChính sách xóaP2BuiltMedium
CFGCấu hìnhP2BuiltMedium
ACCTruy cậpP1BuiltHigh
RCPMẫu biên laiP2BuiltMedium
FLRBố trí bàn & sơ đồ sànP2BuiltHigh
RTLLoại hình bán lẻP2PlannedHigh
BOPCổng BackofficeP2PlannedHigh

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ự catalog. Mỗi tính năng giữ mô tả, yêu cầu, và nghiệm thu cùng nhau. Ưu tiên = MoSCoW (Must / Should / Could / Won't).

ORG - Tổ chức Built

Mã tính năng: commerce/ORG · Phase: P1 · PRDs: PRD-ORG-001 · Dev: @nx/commerce

Làm gì cho người dùng: chủ tạo một thực thể thương hiệu duy nhất qua onboarding - container cha cho mọi merchant, người dùng và thiết bị - rồi quản lý hồ sơ, phân cấp, cài đặt và đính kèm của nó suốt vòng đời.

Yêu cầu

IDPYêu cầu
URD-ORG-001MNgười dùng có thể tạo một tổ chức qua onboarding
URD-ORG-002MOnboarding tạo liền mạch tổ chức + merchant mặc định + kênh bán + truy cập
URD-ORG-003MNgười dùng tạo được tự gán là Owner
URD-ORG-004MTên (đa ngôn ngữ) và slug là bắt buộc; mọi trường khác tùy chọn
URD-ORG-005MMột định danh hệ thống duy nhất được sinh khi tạo và không sửa được
URD-ORG-006MTổ chức tìm được theo ID hoặc theo slug (tra cứu cascade)
URD-ORG-007MOwner có thể cập nhật hồ sơ tổ chức
URD-ORG-008MTạo/cập nhật aggregate hỗ trợ tệp đính kèm
URD-ORG-009SList/count tổ chức được lọc theo vai trò của người dùng
URD-ORG-010STổ chức có thể bị vô hiệu hóa (dữ liệu được bảo toàn, đảo ngược được)
URD-ORG-011STổ chức có thể chỉ định một merchant trụ sở
URD-ORG-012STổ chức có thể được lưu trữ (chỉ đọc vĩnh viễn)
URD-ORG-013CTổ chức có thể có tổ chức con (phân cấp)
URD-ORG-014MOnboarding tự phục vụ chạy trong một transaction cục bộ và cấp quyền Owner cho người dùng gọi, không cấp license (PRD-ORG-001)
URD-ORG-015MOnboarding quản trị (aggregate) tạo một owner user mới và một license như một thao tác hai pha, bù trừ ngược lại đầy đủ khi pha 2 thất bại
URD-ORG-016MOnboarding quản trị có tính idempotent - một Idempotency-Key phát lại kết quả đã hoàn tất và từ chối lần thử đồng thời là đang-xử-lý
URD-ORG-017SOnboarding tự tạo một bộ mặc định cố định: một merchant trụ sở, hai kênh bán (Offline, Take away), và mẫu danh mục F&B (chỉ ngành F&B)
URD-ORG-018SĐổi merchant trụ sở phát ra một sự kiện organization-HQ-changed tới các consumer hạ nguồn

Nghiệm thu

AC-ORG-01: Onboarding là liền mạch
ChoKhiThì
Một người dùng đã xác thực, chưa có tổ chứcOnboarding hoàn tất với tên + slug hợp lệTổ chức (Activated) + merchant mặc định + (các) kênh mặc định được tạo; truy cập của chủ sở hữu được cấp; định danh hệ thống & slug tự sinh
Bất kỳ bước nào thất bạiTrong khi onboardingToàn bộ thao tác roll back - không có gì được lưu
AC-ORG-02: Tính duy nhất slug
ChoKhiThì
Một tổ chức đã dùng slug "my-business"Người dùng khác thử cùng slugTạo bị từ chối - slug đã được sử dụng
AC-ORG-03: Hai đường onboarding (PRD-ORG-001)
ChoKhiThì
Một người dùng đã xác thực chưa có tổ chứcHoàn tất onboarding tự phục vụOrg + merchant trụ sở + các mặc định được tạo trong một transaction cục bộ; người dùng gọi là Owner; không cấp license
Một operator back-office cấp phát cho khách hàngHoàn tất onboarding quản trị (aggregate)Một owner user mới và một license được cấp phát; khi pha 2 thất bại mọi thứ được bù trừ và không để lại gì
AC-ORG-04: Onboarding quản trị idempotent
ChoKhiThì
Một request onboarding quản trị có Idempotency-KeyGửi lại sau khi đã hoàn tấtKết quả đã lưu được phát lại - không cấp phát tổ chức thứ hai
Cùng Idempotency-KeyGửi lại khi vẫn đang chạyLần thử bị từ chối là đang-xử-lý

MER - Merchant Built

Mã tính năng: commerce/MER · Phase: P1 · PRDs: PRD-ORG-001 · Dev: @nx/commerce

Làm gì cho người dùng: chủ thêm các đơn vị điểm bán hợp pháp dưới tổ chức của mình - từng cái một, vài cái cùng lúc, hoặc cùng danh mục và kênh bán của chúng - và quản lý hồ sơ cùng vòng đời của từng merchant.

Yêu cầu

IDPYêu cầu
URD-MER-001MMerchant mặc định được tạo trong khi onboarding
URD-MER-002MOwner có thể tạo thêm merchant
URD-MER-003MOwner có thể tạo hàng loạt nhiều merchant
URD-MER-004MOwner có thể tạo aggregate một merchant với danh mục + kênh bán
URD-MER-005MSlug merchant duy nhất trong cùng một tổ chức
URD-MER-006MMerchant có thể được xem cùng kênh và danh mục của nó
URD-MER-007MOwner có thể cập nhật thông tin merchant
URD-MER-008MCập nhật aggregate: chỉ-ID = xóa, ID+dữ liệu = cập nhật, không ID = tạo
URD-MER-009MMerchant tìm được theo ID hoặc theo slug (tra cứu cascade)
URD-MER-010MList merchant được lọc theo vai trò của người dùng
URD-MER-011MCount merchant tôn trọng cùng cách lọc như list
URD-MER-012SMerchant có thể bị vô hiệu hóa (đảo ngược được)
URD-MER-013SMerchant có thể được lưu trữ (chỉ đọc vĩnh viễn)
URD-MER-014CPhân cấp merchant (cha-con)
URD-MER-015SCờ xóa rõ ràng phân biệt "xóa" với "giữ nguyên" trong cập nhật aggregate
URD-MER-016MMọi thuộc tính pháp lý & tài chính (loại hình kinh doanh, định danh thuế, thông tin HĐĐT, tài khoản tài chính và ví, tiền tệ) thuộc về merchant - không bao giờ về tổ chức
URD-MER-017MMỗi tổ chức có đúng một merchant trụ sở, tạo lúc onboarding và ghi nhận trên tổ chức
URD-MER-018MNgành của merchant phải là ngành hàng hợp lệ; onboarding tạo sẵn các kênh bán và mẫu danh mục mặc định cho những ngành đó
URD-MER-019SĐịnh danh thuế nhập trên merchant tự động được hồ sơ HĐĐT dùng lại, không nhập lại
URD-MER-020MMerchant trụ sở được tạo với slug suy ra, tên "Headquarter", cờ trụ sở, và phương pháp thuế trực tiếp
URD-MER-021MMặc định enum của merchant: loại hình kinh doanh Household (hoặc Business); ngành F&B (Retail / Ticket / Other); tiền tệ VND
URD-MER-022STiến trình onboarding là sáu bước có thứ tự trên merchant (thông tin merchant → kênh bán → tài khoản tài chính → thông tin thuế → sản phẩm → nhân viên), hiển thị dưới dạng đã-hoàn-thành/tổng trong launchpad
URD-MER-023STính duy nhất slug nhận biết soft-delete (một slug đã gỡ được giải phóng); onboarding aggregate tự thêm hậu tố một token duy nhất khi va chạm; không có giới hạn số merchant mỗi tổ chức

Nghiệm thu

AC-MER-01: Tạo aggregate
ChoKhiThì
Một chủ sở hữu có tổ chức hiện cóTạo một merchant với danh mục + kênhMerchant, danh mục, kênh đều được tạo liền mạch; định danh được sinh
Bất kỳ con nào không hợp lệTrong khi tạo aggregateToàn bộ thao tác roll back
AC-MER-02: Cập nhật aggregate thông minh
ChoKhiThì
Item con chỉ có IDCập nhật aggregateItem bị xóa
Item con có ID + dữ liệuCập nhật aggregateItem được cập nhật
Item con không có IDCập nhật aggregateItem được tạo
AC-MER-03: Trụ sở & thuộc tính pháp lý
ChoKhiThì
Một người dùng hoàn tất onboardingTổ chức được tạoMột merchant trụ sở tồn tại và được ghi nhận là trụ sở của tổ chức - trong cùng một bước
Một tổ chứcChủ tìm nơi nhập định danh thuế / HĐĐT / víKhông có chỗ - những thứ này nhập trên merchant, không trên tổ chức
Một merchant đã nhập MSTChủ phát hành một hóa đơnTự động dùng định danh thuế của merchant, không nhập lại
AC-MER-04: Các mặc định tự tạo (PRD-ORG-001)
ChoKhiThì
Bất kỳ onboarding nào hoàn tấtCấu trúc được tạoĐúng một merchant trụ sở (slug suy ra, "Headquarter", phương pháp thuế trực tiếp) và hai kênh bán (Offline, Take away) tồn tại
Ngành onboarding là F&BMerchant được tạoMẫu danh mục F&B được tạo sẵn
Ngành onboarding là retail / ticket / khácMerchant được tạoKhông tạo sẵn mẫu danh mục nào

SC - Kênh bán Built

Mã tính năng: commerce/SC · Phase: P1 · PRDs: - · Dev: @nx/commerce

Làm gì cho người dùng: mỗi merchant có một hoặc nhiều kênh bán (ăn tại chỗ, mang đi, giao hàng), được tạo lúc onboarding và quản lý qua aggregate merchant hoặc thêm hàng loạt vào một merchant hiện có.

Yêu cầu

IDPYêu cầu
URD-SC-001M(Các) kênh mặc định được tạo trong khi onboarding
URD-SC-002MKênh được quản lý như một phần của thao tác aggregate merchant
URD-SC-003MKênh có thể được tạo hàng loạt cho một merchant hiện có
URD-SC-004MSlug kênh duy nhất trong cùng một merchant
URD-SC-005MMột định danh hệ thống duy nhất được sinh khi tạo và không sửa được
URD-SC-006CPhân cấp kênh (cha-con)
URD-SC-007SKênh có thể bị vô hiệu hóa hoặc lưu trữ

Nghiệm thu

AC-SC-01: Kênh qua aggregate
ChoKhiThì
Một chủ có một merchant hiện cóQuản lý kênh qua aggregate merchant hoặc thêm hàng loạtKênh được tạo với một định danh hệ thống duy nhất; slug duy nhất trong merchant

CAT - Danh mục Built

Mã tính năng: commerce/CAT · Phase: P2 · PRDs: - · Dev: @nx/commerce

Làm gì cho người dùng: chủ nhóm sản phẩm thành danh mục theo từng merchant, quản lý qua aggregate merchant, với tùy chọn đánh dấu một danh mục là nhóm add-on.

Yêu cầu

IDPYêu cầu
URD-CAT-001MDanh mục được quản lý như một phần của thao tác aggregate merchant
URD-CAT-002MDanh mục có thể được đổi tên qua cập nhật aggregate mà không ảnh hưởng sản phẩm của nó
URD-CAT-003MDanh mục có thể được xóa qua cập nhật aggregate (soft-delete)
URD-CAT-004SDanh mục có thể được đánh dấu là add-on (và bỏ đánh dấu)

Nghiệm thu

AC-CAT-01: Danh mục qua aggregate
ChoKhiThì
Một danh mục có sản phẩm liên kếtĐổi tên qua cập nhật aggregateDanh mục được đổi tên; sản phẩm của nó không bị ảnh hưởng
Một danh mụcXóa qua cập nhật aggregateDanh mục bị soft-delete

DEL - Chính sách xóa Built

Mã tính năng: commerce/DEL · Phase: P2 · PRDs: - · Dev: @nx/commerce

Làm gì cho người dùng: mỗi merchant mang một chính sách cấu hình được điều khiển cách xóa cascade - liệu một danh mục có sản phẩm liên kết có thể bị xóa hay không, và liệu xóa một danh mục có xóa luôn sản phẩm của nó.

Yêu cầu

IDPYêu cầu
URD-DEL-001SMỗi merchant có một chính sách xóa cấu hình được
URD-DEL-002SstrictCategoryDeletion: khi true, bị chặn nếu danh mục có sản phẩm liên kết
URD-DEL-003ScascadeProductDeletion: khi true, xóa một danh mục cascade tới sản phẩm của nó
URD-DEL-004SOwner có thể xem và cập nhật chính sách xóa

Nghiệm thu

AC-DEL-01: Chính sách xóa
ChoKhiThì
strictCategoryDeletion = trueXóa một danh mục có sản phẩmBị chặn
cascadeProductDeletion = trueXóa một danh mụcSản phẩm của nó cũng bị xóa

CFG - Cấu hình Built

Mã tính năng: commerce/CFG · Phase: P2 · PRDs: - · Dev: @nx/commerce

Làm gì cho người dùng: merchant lưu thông tin xác thực nhà cung cấp thanh toán và cài đặt tích hợp dưới dạng cấu hình khóa-giá trị mã hóa, được tổ chức theo nhóm chức năng.

Yêu cầu

IDPYêu cầu
URD-CFG-001SMerchant có thể lưu thông tin xác thực nhà cung cấp thanh toán và cài đặt tích hợp
URD-CFG-002SThông tin xác thực nhạy cảm được mã hóa khi lưu
URD-CFG-003SCấu hình được tổ chức theo nhóm (system, table, integration)

Nghiệm thu

AC-CFG-01: Cấu hình mã hóa
ChoKhiThì
Một merchant lưu thông tin xác thực nhà cung cấp thanh toánLưuThông tin xác thực nhạy cảm được mã hóa khi lưu và tổ chức theo nhóm

ACC - Truy cập Built

Mã tính năng: commerce/ACC · Phase: P1 · PRDs: - · Dev: @nx/commerce

Làm gì cho người dùng: dữ liệu được cô lập theo vai trò - chủ chỉ thấy tổ chức và merchant của mình, nhân viên chỉ thấy merchant được gán, và mọi list/count được lọc tương ứng.

Yêu cầu

IDPYêu cầu
URD-ACC-001MTruy cập người dùng được quản lý qua chính sách theo vai trò (cấp org hoặc cấp merchant)
URD-ACC-002MNhân viên có thể được gán cho các merchant cụ thể
URD-ACC-003MMột người dùng có thể được cấp quyền truy cập nhiều tổ chức
URD-ACC-004MOwner chỉ thấy tổ chức và merchant của mình
URD-ACC-005MMọi thao tác list/count được lọc theo vai trò của người dùng (Admin bỏ qua)
URD-ACC-006MOwner có thể tạo, xem và cập nhật tổ chức của mình
URD-ACC-007MOwner có thể tạo, cập nhật và vô hiệu hóa merchant
URD-ACC-008MOwner có thể quản lý kênh và danh mục qua thao tác aggregate
URD-ACC-009MOwner có thể gán một nhân viên cho một merchant cụ thể
URD-ACC-010MNhân viên chỉ thấy merchant được gán
URD-ACC-011MNhân viên không thể truy cập merchant chưa được gán
URD-ACC-012MMột người dùng có vai trò không nhận diện được sẽ bị từ chối (không có kết quả rỗng âm thầm)
URD-ACC-013MLicense được cấp cho owner user mới; mã kích hoạt/hợp đồng của nó được trả lại, không bao giờ lưu
URD-ACC-014MViệc cấp quyền owner là ba dòng truy cập - join-domain tới org, join-domain tới merchant, assign-role Owner
URD-ACC-015MAggregate-create merchant quản trị rẽ nhánh theo người gọi - admin back-office scope Owner tới merchant; một owner tổ chức tự liên kết mình
URD-ACC-016SCác đường đọc list/count/find tổ chức/merchant được scope tại handler từ các grant của người gọi (engine chính sách trung tâm hiện không gác các đường đọc này)

Nghiệm thu

AC-ACC-01: Cô lập theo vai trò
ChoKhiThì
Owner A (Org X) và Owner B (Org Y)Owner A yêu cầu dữ liệu tổ chức/merchantChỉ trả dữ liệu Org X; Org Y không hiển thị
Nhân viên chỉ được gán Merchant XYêu cầu list merchantChỉ trả Merchant X

FLR - Bố trí bàn & sơ đồ sàn Built

Mã tính năng: commerce/FLR · Phase: P2 · PRDs: PRD-FLR-001 · Dev: @nx/commerce · @nx/sale

Tính năng làm gì cho người dùng: một merchant F&B thiết kế sàn vật lý thành một layout có tên chứa một cây zone (sàn → phòng → bàn) với các zone lá mang unit (bàn) có sức chứa, vị trí và style - dựng trong một aggregate nguyên tử - rồi tại POS chiếm dụng unit bằng đơn dine-in, thấy mỗi bàn trống hay bận trực tiếp, tìm bàn trống, chuyển khách giữa các vùng, và giải phóng bàn khi đơn của nó xong.

Yêu cầu

IDPYêu cầu
URD-FLR-001MMột merchant mô hình hóa sàn thành một layout có tên; mỗi layout thuộc một merchant
URD-FLR-002MMột layout chứa một cây zone (sàn / phòng / bàn), tự lồng tối đa hai cấp dưới gốc layout
URD-FLR-003MMột zone lá chứa unit (bàn); một unit khai báo sức chứa tùy chọn, một vị trí (canvas), và một style
URD-FLR-004MChủ có thể tạo một layout cùng cả cây zone lồng nhau trong một thao tác aggregate nguyên tử
URD-FLR-005MCập nhật aggregate layout theo quy ước id: chỉ-id = xóa (cascade sub-tree), id+data = cập nhật, không-id = tạo
URD-FLR-006MMột zone tự nó cũng create/update được như một aggregate với zone con và unit lồng nhau; zone cũng có thể tạo hàng loạt
URD-FLR-007MMột aggregate vượt giới hạn độ sâu hai cấp, hoặc tham chiếu một zone không thuộc layout đích, bị từ chối trước khi lưu gì
URD-FLR-008SChủ có thể đọc một aggregate layout (cây zone + unit) với độ sâu tối đa cấu hình được - cây đầy đủ cho back-office, nông cho POS
URD-FLR-009SLayout, zone và unit mỗi cái mang một trạng thái vòng đời (Activated / Deactivated / Archived) và được soft-delete
URD-FLR-010MLayout, zone và unit cũng được quản lý độc lập (CRUD), scope theo merchant
URD-FLR-011MMở một đơn dine-in trên một hoặc nhiều unit tạo một usage chiếm dụng đánh dấu các unit đó bận trên sơ đồ sàn
URD-FLR-012MMột usage mang một khung đặt chỗ (từ / đến); nếu không cho thời điểm kết thúc, một khung mặc định 90 phút áp dụng
URD-FLR-013MChiếm dụng theo reserved/active → success → completed (bàn được giải phóng), hoặc cancelled; một usage terminal không thể bị hủy lại
URD-FLR-014MMột unit hiện bận khi nó giữ một usage ở trạng thái reserved / active / success, và trống khi ngược lại
URD-FLR-015MPOS có thể truy vấn unit khả dụng trong một zone, và zone con mà mọi unit đều trống, ở độ sâu phân giải hiện tại
URD-FLR-016MNhân viên có thể chuyển một nhóm giữa các zone - usage nguồn bị hủy và unit của zone đích được chiếm cho mỗi đơn, nguyên tử
URD-FLR-017MTách một đơn nhân bản các usage đang hoạt động của nó sang mỗi đơn mới; gộp chuyển chúng sang đơn còn sống
URD-FLR-018MMỗi thay đổi chiếm dụng phát một sự kiện sơ đồ sàn thời gian thực để mọi máy POS đồng bộ
URD-FLR-019SMột usage có thể ghi thông tin khách (tên, điện thoại, email, số khách)
URD-FLR-020SĐơn / đặt chỗ giữ một snapshot phân bổ (unit và đường dẫn zone của nó, cùng khách) để phân bổ tồn tại trên tài liệu
URD-FLR-021MMọi thao tác phân bổ scope theo merchant (x-merchant-id) và được gác bởi quyền phân bổ

Tiêu chí chấp nhận

AC-FLR-01: Aggregate sàn nguyên tử (PRD-FLR-001)
GivenWhenThen
Một chủ đang thiết kế sànLưu một layout với zone và unit lồng nhau trong một aggregateLayout, zone và unit đều được tạo nguyên tử
Một item con chỉ-id / id + data / không-idMột cập nhật aggregate layoutCon chỉ-id bị xóa (cascade), con id+data được cập nhật, con không-id được tạo
Bất kỳ bước con nào lỗiTrong aggregateCả thao tác rollback - không cây dựng dở nào tồn tại
AC-FLR-02: Giới hạn độ sâu & guard thuộc-layout
GivenWhenThen
Một cây zone sâu hơn hai cấp dưới gốc layoutGửi như một aggregateViệc lưu bị từ chối trước khi lưu gì
Một cập nhật tham chiếu một zone thuộc layout khác (hoặc không phải zone gốc)GửiViệc lưu bị từ chối vì không thuộc layout
AC-FLR-03: Chiếm và giải phóng một bàn
GivenWhenThen
Một bàn trốngMột đơn dine-in mở trên nóUnit hiện bận trên sơ đồ sàn; một usage với khung đặt chỗ (mặc định 90 phút) được ghi
Một bàn có đơn đã trả (success)Bàn được hoàn thànhUsage trở thành completed và unit hiện trống trở lại
Một usage đã completed hoặc cancelledMột nỗ lực hủy nóBị từ chối - một usage terminal không thể bị hủy lại
AC-FLR-04: Khả dụng bàn trống
GivenWhenThen
Một zone có một số bàn đang bậnMột truy vấn "bàn trống"Chỉ các unit không có usage reserved/active/success được trả về
Một zone cha với vài zone conMột truy vấn zone khả dụngChỉ các zone con mà mọi unit đều trống được trả về
AC-FLR-05: Chuyển một nhóm giữa các zone
GivenWhenThen
Một nhóm ngồi ở phòng chínhChuyển sang zone sân vườnNguyên tử: usage nguồn bị hủy và unit của sân vườn được chiếm cho mỗi đơn liên quan; cả hai động tác được phát trực tiếp
Zone nguồn không có usage hoạt động, hoặc zone đích không có unitThử chuyểnBị từ chối với lý do rõ ràng; không gì thay đổi

RCP - Mẫu biên lai Built

Mã tính năng: commerce/RCP · Phase: P2 · PRDs: PRD-RCP-001 · Dev: @nx/commerce

Tính năng làm gì cho người dùng: chủ thiết kế biên lai in của mình trông ra sao - theo từng merchant hoặc từng kênh bán, và theo từng ngôn ngữ - bằng cách lắp một bố cục có tên từ một bộ khối cố định (text, đường phân tách, ảnh logo, một bảng dòng hàng, barcode, QR, và một grid cho các hàng cạnh nhau). Bố cục được kiểm tra khi lưu, một mẫu là mặc định cho mỗi ngôn ngữ, và khi thanh toán mẫu được chọn render thành một ảnh raster đơn sắc vừa khổ giấy in nhiệt 58mm hoặc 80mm.

Yêu cầu

IDPYêu cầu
URD-RCP-001MMột mẫu biên lai có tên gắn phạm vi merchant hoặc một kênh bán
URD-RCP-002MMỗi mẫu khai báo khổ giấy (58mm hoặc 80mm) và một cỡ chữ nền
URD-RCP-003MTên mẫu duy nhất theo (principal, locale) và nhận biết soft-delete
URD-RCP-004MMẫu theo từng locale; một merchant/kênh giữ một bộ mẫu cho mỗi ngôn ngữ
URD-RCP-005MĐúng một mẫu mặc định cho mỗi (principal, locale); đặt mặc định gỡ mặc định trước đó
URD-RCP-006MBố cục là một danh sách khối có thứ tự từ bộ cố định: text, line, image, bảng dòng hàng, barcode, QR, grid
URD-RCP-007MBố cục được kiểm tra theo bộ khối khi tạo và cập nhật; một bố cục không hợp lệ bị từ chối
URD-RCP-008MKhối text, dòng hàng, barcode, QR gắn với field đơn hàng động phân giải khi in
URD-RCP-009SBảng dòng hàng render các cột cấu hình được (field, header, width, align, format) với hàng tiêu đề tùy chọn
URD-RCP-010SMột khối grid đặt các con vào cột tỉ lệ với canh / phân bố (tối đa 5 hàng)
URD-RCP-011SCác khối mang style trình bày (canh, độ đậm, biến đổi chữ, gạch, viền, màu, padding)
URD-RCP-012SGiá trị số, tiền tệ, ngày định dạng theo format đã khai báo trên khối hoặc cột
URD-RCP-013MMột mẫu render thành ảnh raster đơn sắc vừa khổ giấy (58mm → 384px, 80mm → 576px)
URD-RCP-014SMẫu mang trạng thái vòng đời (Activated / Deactivated / Archived) và được soft-delete
URD-RCP-015MMọi thao tác theo phạm vi merchant (x-merchant-id) và được kiểm soát bởi quyền mẫu biên lai
URD-RCP-016SMẫu liệt kê/lọc được theo principal, locale, trạng thái, và cờ mặc định

Tiêu chí chấp nhận

AC-RCP-01: Bố cục được kiểm tra khi lưu (PRD-RCP-001)
GivenWhenThen
Một chủ đang sửa bố cục biên laiLưu một bố cục dựng từ bộ khối cố địnhMẫu được lưu; bố cục được chấp nhận
Một bố cục có cột thiếu field hoặc một loại khối lạLưuBị từ chối - nội dung mẫu biên lai không hợp lệ; không lưu gì
AC-RCP-02: Một mặc định cho mỗi phạm vi và ngôn ngữ
GivenWhenThen
Một merchant có mẫu A là mặc định tiếng ViệtMẫu B được đánh dấu mặc định cho tiếng ViệtB thành mặc định; A không còn mặc định - đúng một mặc định cho (principal, locale) đó
Mặc định tiếng Anh và mặc định tiếng Việt của một kênhXét cùng nhauMỗi ngôn ngữ có một mặc định riêng; chúng không ảnh hưởng nhau
AC-RCP-03: Phạm vi & render khi thanh toán
GivenWhenThen
Một merchant có mẫu mặc định 80mm và một lượt thanh toán hoàn tấtBiên lai in raMẫu mặc định của merchant theo ngôn ngữ của đơn được dùng, field và dòng hàng của đơn được gắn, và một raster đơn sắc rộng 576px được tạo
Một kênh bán có mẫu riêngMột lượt bán trên kênh đó in raMẫu của kênh được ưu tiên dùng thay vì của merchant

RTL - Loại hình Bán lẻ Planned

Mã tính năng: commerce/RTL · Phase: P2 · PRDs: PRD-RTL-001 · Dev: @nx/commerce

Mang lại gì cho người dùng: một cửa hàng bán lẻ tổng hợp (tạp hoá, thời trang, tiện lợi) chạy được trên KICKO theo kiểu bán lẻ - onboard với loại hình bán lẻ, nhận cấu trúc danh mục bán lẻ, và bán tại quầy scan-first không vướng bước phòng bàn/bếp. Bán lẻ là một mảng nghiệp vụ đầy đủ (quy tắc nghiệp vụ + giao diện riêng), không phải một biến thể của F&B.

Yêu cầu

IDPYêu cầu
URD-RTL-001MChủ quán onboard được merchant với loại hình Bán lẻ
URD-RTL-002MLoại hình kinh doanh là lựa chọn tường minh khi onboard - không bao giờ âm thầm mặc định F&B
URD-RTL-003MMerchant bán lẻ nhận mẫu danh mục bán lẻ khi onboard (như các sector F&B hiện nay)
URD-RTL-004MTại POS, merchant bán lẻ có luồng bán tại quầy: quét/tìm → giỏ → thanh toán - không bước phòng bàn
URD-RTL-005MThu ngân thêm hàng vào giỏ bằng cách quét barcode của variant
URD-RTL-006MHóa đơn và thuế chạy đúng cho merchant bán lẻ
URD-RTL-007SCác bề mặt chỉ-dành-cho-F&B (sơ đồ bàn, bếp, đặt chỗ) được ẩn với merchant bán lẻ
URD-RTL-008SMàn hình catalog xử lý hiệu quả hàng nhiều biến thể (size/màu)
URD-RTL-009SMerchant bán lẻ vận hành ca và đối soát tiền mặt giống hệt F&B
URD-RTL-010CTạp hoá: màn bán hiển thị thông tin lô/hạn sử dụng khi có theo dõi

Nghiệm thu

AC-RTL-01: Onboard bán lẻ
GivenWhenThen
Chủ quán mới chọn loại hình Bán lẻOnboard hoàn tấtMerchant được tạo với mẫu danh mục bán lẻ; không thiết lập artefact F&B (sơ đồ bàn, bếp)
Chủ quán mới bỏ qua bước chọn loại hìnhSubmit onboardBắt buộc chọn - không mặc định ngầm F&B
AC-RTL-02: Bán tại quầy
GivenWhenThen
Merchant bán lẻ tại POSThu ngân quét barcode variantHàng vào giỏ ngay lập tức; thanh toán hoàn tất không qua bước bàn/bếp

BOP - Cổng Backoffice Planned

Mã tính năng: commerce/BOP · Phase: P2 (T6-T8) · PRDs: PRD-BOP-001 · Dev: @nx/commerce · @nx/helpdesk

Mang lại gì cho người dùng: vận hành viên chạy một client end-to-end chỉ từ BO - onboard, cấu hình, import dữ liệu, hỗ trợ, và giám sát.

Yêu cầu

IDPYêu cầu
URD-BOP-001MVận hành onboard client end-to-end từ BO (org → merchant (MST) → kênh → loại hình)
URD-BOP-002MCấu hình gói & giấy phép, lĩnh vực & mẫu danh mục, nhóm thuế từ BO
URD-BOP-003MTra cứu giao dịch ở cấp quản trị (xuyên merchant)
URD-BOP-004MImport Excel hàng loạt: danh mục, sản phẩm/variant, giá, thuế - báo lỗi theo dòng, import lại không trùng
URD-BOP-005MSupport Center trong BO: danh sách + chi tiết phiếu xử lý end-to-end
URD-BOP-006SCấu hình SLA / danh mục / agent
URD-BOP-007SDashboard quản trị: cửa hàng theo ngành, giao dịch theo cửa hàng
URD-BOP-008SCấu hình phương thức thanh toán lên cấp quản trị

Nghiệm thu

AC-BOP-01: Vận hành client chỉ từ BO
GivenWhenThen
Một client mới kýVận hành onboard + cấu hình chỉ qua BOMerchant bán được - không đụng công cụ nào khác
Một file Excel catalogVận hành importCatalog sẵn dùng; dòng lỗi báo theo dòng; import lại không sinh trùng

7. Ràng buộc & Mục tiêu Loại trừ

Ràng buộc

IDRàng buộc
C-01Tổ chức phải tồn tại trước khi tạo merchant
C-02Thao tác aggregate là liền mạch - tất cả hoặc không
C-03Mọi thực thể dùng soft-delete; không có gì bị xóa vật lý
C-04Tính duy nhất slug: toàn cục cho tổ chức, theo org cho merchant, theo merchant cho kênh
C-05Mọi thao tác yêu cầu xác thực
C-06Thông tin xác thực thanh toán được mã hóa khi lưu

Mục tiêu Loại trừ

  • Truy cập liên-tổ-chức hoặc chia sẻ merchant giữa các tổ chức
  • Chuyển quyền sở hữu (Dự kiến)
  • Hard-delete bất kỳ thực thể nào
  • CRUD kênh bán / danh mục độc lập ngoài aggregate merchant (Dự kiến)

8. Lịch sử Phiên bản

NgàyTác giảMô tảVer
2026-06-15Commerce squadThêm tính năng FLR Bố trí bàn & sơ đồ sàn (URD-FLR-001..021) - mô hình sàn layout/zone/unit dựng dạng aggregate nguyên tử (giới hạn độ sâu, guard thuộc-layout) cùng chiếm dụng usage trực tiếp, khả dụng, chuyển bàn, snapshot và sơ đồ sàn thời gian thực; backlink tới PRD-FLR-001v0.8
2026-06-15Commerce squadThêm tính năng RCP Mẫu biên lai (URD-RCP-001..016) - theo phạm vi merchant/kênh, theo locale, bộ khối cố định, một mặc định cho mỗi locale, render raster in nhiệt; backlink tới PRD-RCP-001v0.7
2026-06-15Commerce squadNội bộ onboarding: hai đường onboarding, saga + bù trừ, idempotency, license, các mặc định, sáu bước, các dòng cấp quyền owner (URD-ORG-014..018, MER-020..023, ACC-013..016); backlink tới PRD-ORG-001v0.6
2026-06-04Claude (AI pair)Tổ chức lại theo tính năng (Feature Spine); mỗi tính năng tự mang yêu cầu + nghiệm thuv0.5
2026-05-30P. NguyenChuyển sang quy ước module-docs; hòa hợp ID/vùng yêu cầu với test casev0.4
2026-04-17P. NguyenGộp Organization + Merchant vào module Commercev0.3
2026-02-27QE AssessmentPhát hiện QEv0.2
2026-02-26P. Do - Product OwnerKhởi tạov0.1

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