Test Cases: Kho
| Module | CORE-06 | URD | URD Kho |
|---|
1. Tóm tắt Độ phủ
| Lĩnh vực | Yêu cầu URD | Test case | Đã phủ |
|---|---|---|---|
Địa điểm (LOC) | 10 | 20 | ✅ |
Mục (ITM) | 6 | 10 | ✅ |
Tồn (STK) | 7 | 11 | ✅ |
Tracking (TRK) | 10 | 13 | ✅ |
Vendor (VEN) | 5 | 7 | ✅ |
Đơn mua hàng (PO) | 12 | 26 | ✅ |
Mục PO (POI) | 5 | 12 | ✅ |
Nguyên vật liệu (MAT) | 13 | 13 | ✅ |
Công thức / BOM (REC) | 24 | 21 | ⚠️ |
Ràng buộc (CON) | 4 | 8 | ✅ |
Mức ưu tiên bên dưới = P1 (nghiêm trọng / Must) · P2 (lớn / Should) · P3 (nhỏ / Could). Một khoảng trống đang mở:
TC-REC-206(địa điểm bếp không-mặc-định) bị chặn bởi một code TODO.
2. Test Cases
TC-<AREA>-NNNkhớp vớiURD-<AREA>-NNN.
Địa điểm (LOC)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-LOC-001 | URD-LOC-001, 007, 010 | Tạo địa điểm với tên i18n | Merchant đã xác thực tạo một địa điểm với tên hợp lệ | Địa điểm được tạo; LOC_YYYYMMDD_id được gán; liên kết với đúng một merchant | P1 |
| TC-LOC-002 | URD-LOC-001 | Tạo không tên | Thử tạo một địa điểm không tên | Bị từ chối; lỗi "bắt buộc tên" | P1 |
| TC-LOC-003 | URD-LOC-001 | Tên đa ngôn ngữ | Cung cấp tên bằng en + vi | Được tạo với mọi locale được lưu và lấy lại được | P1 |
| TC-LOC-004 | URD-LOC-007 | Định dạng định danh | Tạo bất kỳ địa điểm nào | Định danh khớp LOC_YYYYMMDD_id; duy nhất; không sửa được | P1 |
| TC-LOC-005 | URD-LOC-007 | Duy nhất cùng-ngày | Tạo hai địa điểm cùng một ngày | Cùng đoạn ngày, id đuôi khác nhau; cả hai duy nhất toàn cục | P1 |
| TC-LOC-006 | URD-LOC-002 | Tự-tạo mặc định | Hoàn tất commerce initialization | Đúng một địa điểm mặc định tự tạo và dùng được | P1 |
| TC-LOC-007 | URD-LOC-003 | Đổi mặc định | Đánh dấu một địa điểm thứ hai là mặc định | Địa điểm mới thành mặc định; mặc định trước bị xóa | P1 |
| TC-LOC-008 | URD-LOC-003 | Xóa mặc định duy nhất | Xóa/vô hiệu hóa mặc định duy nhất mà không thay thế | Bị từ chối; merchant luôn phải có một mặc định | P1 |
| TC-LOC-009 | URD-LOC-004 | Địa điểm con | Tạo một con dưới một cha | Con tham chiếu cha; cha liệt kê con | P2 |
| TC-LOC-010 | URD-LOC-004 | Xóa cha có con | Xóa một cha có con | Bị từ chối hoặc cascade; không có orphan; toàn vẹn được giữ | P2 |
| TC-LOC-011 | URD-LOC-005 | Lưu dữ liệu địa lý | Cập nhật địa điểm với địa chỉ + GPS | Dữ liệu địa lý được lưu và lấy lại được | P2 |
| TC-LOC-012 | URD-LOC-005 | Thiếu dữ liệu địa lý | Tạo địa điểm không có địa chỉ/tọa độ | Được tạo; trường địa lý null; không lỗi validation | P2 |
| TC-LOC-013 | URD-LOC-006 | Kích hoạt | Kích hoạt một địa điểm NEW | Trạng thái NEW → ACTIVATED; dùng được cho tồn | P1 |
| TC-LOC-014 | URD-LOC-006 | Vô hiệu hóa | Vô hiệu hóa một địa điểm ACTIVATED | Trạng thái → DEACTIVATED; không gán mới; tồn được giữ | P1 |
| TC-LOC-015 | URD-LOC-006 | Lưu trữ | Lưu trữ một địa điểm DEACTIVATED | Trạng thái → ARCHIVED; dữ liệu được giữ; gỡ khỏi list hoạt động | P1 |
| TC-LOC-016 | URD-LOC-006 | Nhảy không hợp lệ | NEW → ARCHIVED trực tiếp | Bị từ chối; chuyển không hợp lệ | P1 |
| TC-LOC-017 | URD-LOC-006 | Kích hoạt lại đã lưu trữ | Kích hoạt lại một địa điểm ARCHIVED | Bị từ chối; ARCHIVED là cuối | P1 |
| TC-LOC-018 | URD-LOC-008 | Soft delete | Soft-delete một địa điểm | Gắn cờ đã xóa; vắng khỏi list hoạt động; dữ liệu được giữ; admin lấy được | P1 |
| TC-LOC-019 | URD-LOC-009 | Lọc theo trạng thái | List lọc theo ACTIVATED (3 hoạt động, 2 không) | Chỉ 3 cái ACTIVATED được trả về | P2 |
| TC-LOC-020 | URD-LOC-009, 010 | Cô lập merchant | Merchant A liệt kê địa điểm | Chỉ địa điểm của A trả về; của B bị ẩn | P2 |
Mục kho (ITM)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-ITM-001 | URD-ITM-001, 006 | Tự-tạo theo biến thể | Tạo một biến thể sản phẩm | Mục tự tạo, liên kết với địa điểm mặc định, định danh hệ thống | P1 |
| TC-ITM-002 | URD-ITM-002 | Duy nhất | Tạo mục thứ 2 cho cùng (biến thể, địa điểm, đơn vị) | Bị từ chối; duy nhất được áp; mục có sẵn không đổi | P1 |
| TC-ITM-003 | URD-ITM-002 | Đơn vị khác cùng tồn tại | Tạo mục cho cùng biến thể+địa điểm, đơn vị BOX vs PCS | Mục mới được tạo; cả hai cùng tồn tại; duy nhất là theo (biến thể, địa điểm, đơn vị) | P1 |
| TC-ITM-004 | URD-ITM-004 | Định dạng định danh | Tạo bất kỳ mục nào | Định danh SKU_YYYYMMDD_id; duy nhất; không sửa được | P1 |
| TC-ITM-005 | URD-ITM-005 | Vô hiệu hóa | Vô hiệu hóa một mục ACTIVATED | Trạng thái → DEACTIVATED; loại khỏi query tồn hoạt động | P1 |
| TC-ITM-006 | URD-ITM-005 | Lưu trữ | Lưu trữ một mục DEACTIVATED | Trạng thái → ARCHIVED; dữ liệu được giữ; gỡ khỏi listing | P1 |
| TC-ITM-007 | URD-ITM-005 | Kích hoạt lại đã lưu trữ | Kích hoạt lại một mục ARCHIVED | Bị từ chối; ARCHIVED là cuối | P1 |
| TC-ITM-008 | URD-ITM-003 | Đặt ngưỡng | Đặt min=10, max=500 | Cả hai ngưỡng được lưu và lấy lại được | P2 |
| TC-ITM-009 | URD-ITM-003 | Kích tồn thấp | On-hand rớt xuống 9 (dưới min 10) | Điều kiện tồn thấp được phát hiện; event được kích/log | P2 |
| TC-ITM-010 | URD-ITM-003 | Ngưỡng không hợp lệ | Đặt min > max | Bị từ chối; min phải ≤ max | P2 |
Tồn (STK)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-STK-001 | URD-STK-001, 002 | Công thức available | Query tồn với on-hand 100, reserved 30 | Available = 70 (on-hand − reserved) | P1 |
| TC-STK-002 | URD-STK-002 | Available bằng không | Reserved bằng on-hand | Available = 0; không phải lỗi | P1 |
| TC-STK-003 | URD-STK-003 | Độ chính xác thập phân | Lưu số lượng 10.12345 | Làm tròn/cắt về 4 chữ số thập phân | P1 |
| TC-STK-004 | URD-STK-003 | Biên tối đa | Lưu 999999999999999.9999 | Lưu không tràn | P1 |
| TC-STK-005 | URD-STK-004 | Nhận hàng đầu tiên | Nhận tồn đầu tiên cho một mục mới | Bản ghi tồn được tạo; on-hand = đã nhận; reserved 0; available = on-hand | P1 |
| TC-STK-006 | URD-STK-004 | Trừ trước khi nhận | Trừ từ một mục không có tồn | Hoặc bị từ chối (không đủ) hoặc âm được dung thứ theo URD-CON-003; hành vi nhất quán | P1 |
| TC-STK-007 | URD-STK-005 | Timestamp đã đếm | Hoàn tất một lần đếm vật lý | lastCountedAt cập nhật về now | P2 |
| TC-STK-008 | URD-STK-005 | Timestamp đã nhập tồn | Hoàn tất một lần nhận tồn | lastStockedAt cập nhật về now | P2 |
| TC-STK-009 | URD-STK-006 | Trừ đồng thời | Hai lần bán đồng thời trừ 5 mỗi cái từ on-hand 10 | Tổng trừ đúng 10; không đếm đôi; on-hand cuối 0 | P1 |
| TC-STK-010 | URD-STK-006 | Rollback nguyên tử | Cập nhật tồn thất bại giữa chừng | Toàn bộ cập nhật rollback; tracking orphan không lưu | P1 |
| TC-STK-011 | URD-CON-003 | Available âm | Bán 8 từ on-hand 5 | Available thành −3; không bị từ chối; lưu và hiển thị; warning được log | P1 |
Phát hiện QE (TC-STK-011): service cố tình dung thứ
quantityAvailableâm ("refactor khi business logic rõ hơn"). Đây là một ràng buộc nghiệp vụ có ghi tài liệu (URD-CON-003), không phải bug — nhưng checkout POS downstream phải ngăn hoặc bộc lộ nó, hoặc nó trở thành rủi ro toàn vẹn dữ liệu.
Tracking (TRK)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-TRK-001 | URD-TRK-001, 002 | Mục vào | PO nhận 20 đơn vị | Mục bất biến: before/change (+20)/after; không sửa hoặc xóa được | P1 |
| TC-TRK-002 | URD-TRK-001, 002 | Mục ra | Trừ bán 3 đơn vị | Mục: before/change (−3)/after; hướng OUT; được lưu | P1 |
| TC-TRK-003 | URD-TRK-002 | Biên từ không | PURCHASE_IN 50 từ on-hand 0 | before 0, change +50, after 50 | P1 |
| TC-TRK-004 | URD-TRK-003 | Tham chiếu PO | Biến động kích bởi một PO | Mục lưu referenceType=PURCHASE_ORDER + PO id; truy vết được | P1 |
| TC-TRK-005 | URD-TRK-003 | Tham chiếu bán | Biến động kích bởi thanh toán bán | Mục lưu referenceType=SALE_ORDER + order id | P1 |
| TC-TRK-006 | URD-TRK-003 | Thiếu tham chiếu | Biến động không có tham chiếu hợp lệ | Bị từ chối, hoặc mục gắn cờ; truy vết audit không mất âm thầm | P1 |
| TC-TRK-007 | URD-TRK-004 | Replay idempotent | Replay một event payment-success đã xử lý | Không trừ lần hai; on-hand không đổi; không mục trùng; trả về success | P1 |
| TC-TRK-008 | URD-TRK-004 | Đồng thời khác biệt | Hai sale order khác nhau trừ cùng mục gần như đồng thời | Mỗi cái xử lý đúng một lần; không bỏ qua cũng không nhân đôi | P1 |
| TC-TRK-009 | URD-TRK-005 | Hướng IN | Xử lý một PURCHASE_IN | Hướng IN; on-hand tăng | P1 |
| TC-TRK-010 | URD-TRK-005 | Hướng OUT | Xử lý một SALE_OUT | Hướng OUT; on-hand giảm | P1 |
| TC-TRK-011 | URD-TRK-005 | Hướng NEUTRAL | Xử lý ADJUSTMENT_NEUTRAL | Hướng NEUTRAL; không thay đổi ròng; mục được lưu để audit | P1 |
| TC-TRK-012 | URD-TRK-005 | Loại không hợp lệ | Tạo mục với loại không nhận dạng | Bị từ chối; "không phải loại tracking hợp lệ" (19 + tùy chỉnh được liệt kê) | P1 |
| TC-TRK-013 | URD-TRK-006 | Trường audit | Người dùng kích một biến động | Mục lưu createdBy/modifiedBy của người dùng đã xác thực | P2 |
Lưu ý (TC-TRK-007): đường sync và queue payment-success nhân đôi logic trừ với thông báo lỗi khác nhau. Cả hai phải pass idempotency độc lập; một refactor tương lai nên hợp nhất chúng.
Vendor (VEN)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-VEN-001 | URD-VEN-001, 002, 005 | Tạo vendor | Tạo một vendor với tên + liên hệ | Được tạo; VEN_YYYYMMDD_id được gán; liên kết với một merchant | P1 |
| TC-VEN-002 | URD-VEN-001 | Tạo không tên | Tạo một vendor không tên | Bị từ chối; "bắt buộc tên" | P1 |
| TC-VEN-003 | URD-VEN-003 | Mã số thuế | Cung cấp một mã số thuế | Được lưu và lấy lại được | P2 |
| TC-VEN-004 | URD-VEN-002 | Định dạng định danh | Tạo bất kỳ vendor nào | Định danh VEN_YYYYMMDD_id; duy nhất | P1 |
| TC-VEN-005 | URD-VEN-004 | Soft delete (chưa dùng) | Soft-delete một vendor không có PO hoạt động | Gắn cờ đã xóa; vắng khỏi list hoạt động; dữ liệu được giữ | P1 |
| TC-VEN-006 | URD-VEN-004 | Soft delete (đang dùng) | Xóa một vendor được tham chiếu bởi PO hoạt động | Bị từ chối (đang dùng) hoặc tiến hành giữ tham chiếu PO; không có orphan | P1 |
| TC-VEN-007 | URD-VEN-005 | Cô lập merchant | Merchant A liệt kê vendor | Chỉ vendor của A trả về; của B bị ẩn | P1 |
Đơn mua hàng (PO)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-PO-001 | URD-PO-001, 012 | Tạo với mục | Tạo PO với vendor + mục trong một call | DRAFT; số PO được gán; mục + merchant liên kết | P1 |
| TC-PO-002 | URD-PO-001 | Tạo không vendor | Tạo một PO không vendor | Bị từ chối; "bắt buộc vendor" | P1 |
| TC-PO-003 | URD-PO-009 | Địa điểm mặc định | Tạo PO không có địa điểm | Gán cho địa điểm mặc định của merchant | P1 |
| TC-PO-004 | URD-PO-009 | Địa điểm rõ ràng | Tạo PO với một địa điểm không-mặc-định | Gán cho địa điểm chỉ định; mặc định không bị ghi đè | P1 |
| TC-PO-005 | URD-PO-002 | Xác nhận | Xác nhận một PO DRAFT với ≥1 mục | DRAFT → PROCESSING | P1 |
| TC-PO-006 | URD-PO-002, 004 | Revert | Revert một PO PROCESSING | PROCESSING → DRAFT; mục nguyên vẹn | P1 |
| TC-PO-007 | URD-PO-002, 007 | Nhận hàng | Nhận một PO PROCESSING | PROCESSING → RECEIVED; tồn cập nhật qua tracking | P1 |
| TC-PO-008 | URD-PO-002 | Hoàn tất | Hoàn tất một PO RECEIVED | RECEIVED → COMPLETED | P1 |
| TC-PO-009 | URD-PO-002 | Đóng | Đóng một PO COMPLETED | COMPLETED → CLOSED | P1 |
| TC-PO-010 | URD-PO-003 | Cancel DRAFT | Cancel một PO DRAFT | → CANCELLED; dữ liệu được giữ; không biến động tồn | P1 |
| TC-PO-011 | URD-PO-003 | Cancel PROCESSING | Cancel một PO PROCESSING | → CANCELLED; không biến động tồn | P1 |
| TC-PO-012 | URD-PO-003 | Cancel RECEIVED | Cancel một PO RECEIVED | → CANCELLED; tồn đã nhận KHÔNG tự đảo ngược | P1 |
| TC-PO-013 | URD-PO-003 | Cancel CLOSED | Cancel một PO CLOSED | Bị từ chối; CLOSED là cuối | P1 |
| TC-PO-014 | URD-PO-003 | Cancel lại | Cancel một PO CANCELLED | Bị từ chối; đã cancel | P1 |
| TC-PO-015 | URD-PO-002 | Nhảy không hợp lệ | DRAFT → RECEIVED trực tiếp | Bị từ chối; chuyển không hợp lệ | P1 |
| TC-PO-016 | URD-PO-002 | Từ cuối | CLOSED → bất kỳ không-cuối | Bị từ chối; CLOSED là cuối | P1 |
| TC-PO-017 | URD-PO-002 | Lùi | COMPLETED → RECEIVED | Bị từ chối; chuyển lùi không cho phép | P1 |
| TC-PO-018 | URD-PO-002 | Endpoint hoàn tất | Gọi complete trên một PO RECEIVED | → COMPLETED, không lỗi | P1 |
| TC-PO-019 | URD-PO-006 | Xác nhận PO rỗng | Xác nhận một PO DRAFT với zero mục | Bị từ chối; "phải có ít nhất một mục" | P1 |
| TC-PO-020 | URD-PO-008 | Nhận OVERRIDE | Nhận 50 ở OVERRIDE trên on-hand 20 | On-hand đặt thành 50; số dư trước bỏ; PURCHASE_IN được tracking | P1 |
| TC-PO-021 | URD-PO-008 | Nhận ACCUMULATIVE | Nhận 50 ở ACCUMULATIVE trên on-hand 20 | On-hand 70; số dư trước được giữ; change +50 | P1 |
| TC-PO-022 | URD-PO-008 | Chế độ từ không | Nhận 50 cả hai chế độ trên on-hand 0 | Cả hai cho ra 50 | P1 |
| TC-PO-023 | URD-PO-010 | Tính tổng | subtotal 1,000,000; discount 50,000; tax 50,000 | total = 1,000,000; mọi trường tóm tắt nhất quán | P1 |
| TC-PO-024 | URD-PO-010 | Discount/tax bằng không | subtotal 100,000; discount 0; tax 0 | total = 100,000 | P1 |
| TC-PO-025 | URD-PO-011 | Cờ discount thủ công | Nhập discount thủ công | Metadata gắn cờ discount là thủ công | P2 |
| TC-PO-026 | URD-PO-011 | Cờ tax tự động | Hệ thống tính tax | Metadata gắn cờ tax là tự-tính | P2 |
Phát hiện QE (TC-PO-018):
completePurchaseOrdercó một guard bị đảo — nó hiện throw khi PO ĐANG ở RECEIVED/COMPLETED, ngược với chủ ý. Như đang viết, chỉ PO ở trạng thái khác mới "complete" được. TC-PO-018 fail với implementation hiện tại — một defect chặn flow complete.
Mục Đơn mua hàng (POI)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-POI-001 | URD-POI-001 | Cộng dồn | Thêm lại cùng (type, id, uom), qty +5 | Line có sẵn tăng lên 15; không hàng trùng | P1 |
| TC-POI-002 | URD-POI-001 | Mục khác biệt | Thêm biến thể V1 và V2 | Hai line riêng; theo dõi độc lập | P1 |
| TC-POI-003 | URD-POI-001 | uom khác | Thêm cùng biến thể, uom BOX vs PCS | Line mới; không cộng dồn xuyên uom khác nhau | P1 |
| TC-POI-004 | URD-POI-002 | Tổng line | unitPrice 10,000 × qty 5 × mult 1 + tax 500 − disc 200 | itemTotal = 50,300; tính bởi DB | P1 |
| TC-POI-005 | URD-POI-002 | Giá bằng không | unitPrice 0, qty 1 | itemTotal = 0; không lỗi | P1 |
| TC-POI-006 | URD-POI-003 | Số lượng không gỡ bỏ | Đặt qty mục DRAFT thành 0 | Soft-delete; vắng khỏi list; tổng PO tính lại | P1 |
| TC-POI-007 | URD-POI-003 | Âm gỡ bỏ | Đặt qty mục DRAFT thành −1 | Soft-delete (qty ≤ 0 kích xóa) | P1 |
| TC-POI-008 | URD-POI-003, PO-005 | Sửa sau xác nhận | Đặt qty mục 0 trên một PO PROCESSING | Bị từ chối; mục chỉ sửa được ở DRAFT | P1 |
| TC-POI-009 | URD-PO-005 | Thêm sau nhận | Thêm một mục mới vào một PO RECEIVED | Bị từ chối; mục chỉ sửa được ở DRAFT | P1 |
| TC-POI-010 | URD-PO-005 | Sửa ở DRAFT | Thêm/cập nhật/gỡ mục trên một PO DRAFT | Tất cả thành công; tóm tắt tính lại mỗi thay đổi | P1 |
| TC-POI-011 | URD-POI-004 | Giá mặc định | Thêm mục không có đơn giá (giá vốn biến thể 8,000) | unitPrice mặc định về 8,000 | P2 |
| TC-POI-012 | URD-POI-005 | UOM mặc định | Thêm mục không có uom (đơn vị cơ sở PCS) | uom mặc định về PCS | P2 |
Nguyên vật liệu (MAT)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-MAT-001 | URD-MAT-001, 002 | Tạo nguyên vật liệu | Tạo nguyên vật liệu với tên i18n | Được lưu; MAT_YYYYMMDD_id; trạng thái ACTIVATED | P1 |
| TC-MAT-002 | URD-MAT-002 | Định danh duy nhất | Tạo nhanh nhiều nguyên vật liệu | Mỗi cái có một MAT_YYYYMMDD_id duy nhất | P1 |
| TC-MAT-003 | URD-MAT-003 | Tên đa ngôn ngữ | Cung cấp tên bằng en + vi | Mọi locale được lưu và lấy lại được | P1 |
| TC-MAT-004 | URD-MAT-004 | Cập nhật mô tả | Cập nhật mô tả của một nguyên vật liệu | Được lưu; modifiedAt cập nhật | P1 |
| TC-MAT-005 | URD-MAT-005 | Vô hiệu hóa | Vô hiệu hóa một nguyên vật liệu đã kích hoạt | Trạng thái DEACTIVATED; vẫn đọc được; không thêm vào công thức mới | P1 |
| TC-MAT-006 | URD-MAT-006 | Lưu trữ | Lưu trữ một nguyên vật liệu | Trạng thái ARCHIVED; chỉ đọc vĩnh viễn | P1 |
| TC-MAT-007 | URD-MAT-007 | Định danh trùng | Tạo nguyên vật liệu với định danh trùng | Ràng buộc duy nhất từ chối insert | P1 |
| TC-MAT-101 | URD-MAT-101 | Đính barcode | Đính một định danh BARCODE | Hàng định danh được lưu với scheme BARCODE | P1 |
| TC-MAT-102 | URD-MAT-102 | Mọi lược đồ | Đính SYSTEM, SLUG, SKU, BARCODE, QRCODE | Cả năm lưu và lấy lại được | P1 |
| TC-MAT-103 | URD-MAT-103 | Trùng (scheme, code) | Đăng ký một (BARCODE, code) có sẵn trên nguyên vật liệu khác | Bị từ chối bởi unique index | P1 |
| TC-MAT-104 | URD-MAT-104 | Scheme mặc định | Tạo định danh không có scheme | Scheme mặc định về SYSTEM | P1 |
| TC-MAT-105 | URD-MAT-105 | Nhiều lược đồ | Thêm một định danh thứ 2 của một scheme khác | Cả hai cùng tồn tại; không cái nào thay cái kia | P2 |
| TC-MAT-106 | URD-MAT-106 | Tìm theo barcode | Tìm theo một barcode đã đăng ký | Nguyên vật liệu trả về như match duy nhất | P2 |
Công thức / BOM (REC)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-REC-001 | URD-REC-001, 002 | Tạo công thức | Tạo một công thức cho PV_X với 3 mục | Được lưu với version 1.0; 3 mục liên kết | P1 |
| TC-REC-002 | URD-REC-002 | Version mặc định | Tạo một công thức không version | Version mặc định về 1.0 | P1 |
| TC-REC-003 | URD-REC-003 | Trùng (principal, version) | Tạo một công thức thứ 2 với cùng triple | Bị từ chối bởi ràng buộc duy nhất | P1 |
| TC-REC-004 | URD-REC-004, 005 | Thêm mục | Thêm một mục công thức (nguyên vật liệu, qty, đơn vị) | Hàng mới được lưu với mọi trường | P1 |
| TC-REC-005 | URD-REC-006 | Nguyên vật liệu trùng | Thêm một nguyên vật liệu đã có trong công thức | Bị từ chối bởi ràng buộc duy nhất | P1 |
| TC-REC-006 | URD-REC-007 | Kích hoạt | Kích hoạt một công thức DRAFT | Trạng thái ACTIVATED | P1 |
| TC-REC-007 | URD-REC-008 | Vô hiệu hóa | Vô hiệu hóa một công thức ACTIVATED | Trạng thái DEACTIVATED | P1 |
| TC-REC-008 | URD-REC-009 | Version mới | Thêm một hàng mới cùng principal version 1.1 | Bản gốc được giữ; hàng mới được insert | P2 |
| TC-REC-009 | URD-REC-010 | List version | Query công thức theo principal (1.0, 1.1, 2.0) | Cả ba version trả về | P2 |
| TC-REC-010 | URD-REC-011 | Runtime giải quyết đã kích hoạt | Query theo (principal, status=ACTIVATED) với chỉ 2.0 hoạt động | Chỉ công thức 2.0 trả về | P1 |
| TC-REC-101 | URD-REC-101 | FK nguyên vật liệu hợp lệ | Tạo một mục công thức | FK giải quyết về một nguyên vật liệu có sẵn | P1 |
| TC-REC-102 | URD-REC-102 | Độ chính xác số lượng | Tạo mục với qty 0.0125 | Được lưu ở độ chính xác 4 chữ số | P1 |
| TC-REC-103 | URD-REC-103 | Đơn vị được lưu | Tạo mục với đơn vị 'ml' | Đơn vị được lưu là ml | P1 |
| TC-REC-104 | URD-REC-104 | Sửa số lượng | Cập nhật qty mục 200 → 250 | Số lượng được cập nhật; modifiedAt nhảy | P1 |
| TC-REC-105 | URD-REC-105 | Soft-delete thêm lại | Gỡ một mục rồi thêm lại cùng nguyên vật liệu | Hàng soft-delete; thêm lại được phép | P1 |
| TC-REC-201 | URD-REC-201, 204 | Kích explosion | Mục phiếu bếp đổi trạng thái cho PV_X với công thức đã kích hoạt | Worker tra cứu công thức, tìm địa điểm mặc định, chuẩn bị giảm | P1 |
| TC-REC-202 | URD-REC-202, 203 | Giảm thành phần | Cho mỗi mục công thức khi explosion | Tồn nguyên vật liệu tại địa điểm mặc định được giảm; tracking USED_AS_MATERIAL được tạo | P1 |
| TC-REC-203 | URD-REC-205 | Phát event | Explosion hoàn tất | Event material.stock-changed được phát | P1 |
| TC-REC-204 | URD-REC-206 | Không địa điểm mặc định | Đổi trạng thái bếp, merchant không có địa điểm mặc định | Warning được log, giảm bị bỏ qua, không lỗi cứng | P2 |
| TC-REC-205 | URD-REC-207 | Không công thức đã kích hoạt | Đổi trạng thái bếp, biến thể không có công thức đã kích hoạt | "Recipe Not Found" được log; không giảm | P2 |
| TC-REC-206 | URD-REC-208 | Địa điểm bếp không-mặc-định | Explosion chạy cho một bếp ở địa điểm không-mặc-định | GAP — code dùng địa điểm mặc định của merchant (TODO); chặn tới khi giải quyết | P3 |
Ràng buộc (CON)
| TC ID | URD ref | Kịch bản | Các bước | Kỳ vọng | P |
|---|---|---|---|---|---|
| TC-CON-001 | URD-CON-001 | Không token | Gọi bất kỳ endpoint nào không auth | HTTP 401; không dữ liệu | P1 |
| TC-CON-002 | URD-CON-001 | Token hết hạn | Gọi bất kỳ endpoint nào với một JWT hết hạn | HTTP 401; không dữ liệu | P1 |
| TC-CON-003 | URD-CON-001 | JWT hợp lệ | Gọi bất kỳ endpoint nào với một JWT hợp lệ | Đã xác thực; phản hồi với dữ liệu | P1 |
| TC-CON-004 | URD-CON-001 | Basic auth | Gọi bất kỳ endpoint nào với basic auth hợp lệ | Đã xác thực; phản hồi bình thường | P1 |
| TC-CON-005 | URD-CON-002 | Admin lấy đã xóa | Admin query bao gồm bản ghi soft-delete | Bản ghi lấy được; trường nguyên vẹn; cờ xóa được đặt; loại khỏi list chuẩn | P1 |
| TC-CON-006 | URD-CON-002 | List chuẩn loại đã xóa | List chuẩn của một địa điểm soft-delete | Loại trừ; không lỗi | P1 |
| TC-CON-007 | URD-CON-004 | Replay idempotent | Replay payment-success cho SO-001 | Không trừ lần hai; on-hand không đổi; trùng được xác nhận âm thầm | P1 |
| TC-CON-008 | URD-CON-004 | Idempotency đồng thời | Kiểm tra idempotency trong khi trừ đang chạy cho cùng order | Đúng một lần trừ; lần hai bỏ qua; không trừ đôi do race | P1 |
3. Truy vết
Mỗi yêu cầu Must ánh xạ tới ≥1 test case. Một khoảng trống được gắn cờ bên dưới.
| Yêu cầu URD | Test case | Trạng thái |
|---|---|---|
| URD-LOC-001…010 | TC-LOC-001…020 | ✅ Đã phủ |
| URD-ITM-001…006 | TC-ITM-001…010 | ✅ Đã phủ |
| URD-STK-001…006 | TC-STK-001…010 | ✅ Đã phủ |
| URD-STK-007 | — | ⚠️ Chưa phủ (Could — xem tồn lịch sử) |
| URD-TRK-001…010 | TC-TRK-001…013 | ✅ Đã phủ |
| URD-VEN-001…005 | TC-VEN-001…007 | ✅ Đã phủ |
| URD-TKT-001…006 | — | ⚠️ Chưa phủ (flow phiếu đang chờ xây) |
| URD-PO-001…012 | TC-PO-001…026 | ✅ Đã phủ |
| URD-POI-001…005 | TC-POI-001…012 | ✅ Đã phủ |
| URD-MAT-001…106 | TC-MAT-001…106 | ✅ Đã phủ |
| URD-REC-001…207 | TC-REC-001…205 | ✅ Đã phủ |
| URD-REC-208 | TC-REC-206 | ⚠️ Gap — đang chờ code TODO trong MaterialWorkerService |
| URD-CON-001…004 | TC-CON-001…008, TC-STK-011, TC-TRK-007 | ✅ Đã phủ |
Tóm tắt: ~96 yêu cầu URD → 131 test case · 1 gap đã biết (TC-REC-206) · độ phủ mức-Must hoàn chỉnh trừ phiếu kho (TKT), vốn chưa được xây (xem URD §5.5).
4. Tài liệu Tham khảo
| Tài liệu | Mô tả |
|---|---|
| URD Kho | Nguồn yêu cầu cho mọi truy vết TC |
| Tổng quan Kho | Định danh module, năng lực, luồng |
Tài liệu lập trình viên — @nx/inventory | Chi tiết triển khai và hành vi đã xác minh |