Giới hạn Số liệu Đầu vào
Yêu cầu (06/2026): mọi giá trị số gửi từ client (FE/POS/BO) vào backend API đều có giới hạn. Input vượt giới hạn bị từ chối với lỗi validate HTTP 422 rõ ràng — không bao giờ được chạm tới database (không có lỗi 500
numeric overflow).
1. Các giới hạn
| Loại | Áp dụng cho | Max | Số thập phân | Tương đương DB |
|---|---|---|---|---|
| Tiền tệ / giá trị | amount, price, total, fee, giá trị giảm giá, balance, doanh thu, cost | 99,999,999,999.9999 | 4 | numeric(15,4) |
| Số lượng / khối lượng | quantity, qty, volume, tồn kho, hệ số quy đổi uom | 9,999.9999 | 4 | numeric(8,4) |
Quy tắc:
| Quy tắc | Hành vi |
|---|---|
| Vượt max | 422 kèm thông báo lỗi theo field |
| Quá 4 chữ số thập phân | 422 (từ chối, không tự làm tròn) |
| Số âm | 422 — mọi input tiền/số lượng đều không âm, trừ khi field ghi rõ ngoại lệ |
NaN / Infinity / không phải số | 422 |
| Field tỷ giá (exchange rate) | Giữ precision riêng (numeric(12,6) / numeric(19,6)) nhưng vẫn chặn ở tầng validate theo cùng cách |
2. Phạm vi — chặn ở đâu
Giới hạn nằm ở tầng validate Zod, qua schema dùng chung trong @nx/core (nguồn duy nhất — không khai báo lại theo từng package). Precision cột DB không thay đổi trong yêu cầu này.
Hai bề mặt input phải quét trong mỗi package:
- Request schema khai báo tay — các field
z.number()trongmodels/requests/vàdefinitions.tscủa controller. - Schema sinh tự động từ CRUD — entity có cột
decimal/numeric(và field số trongjsonb) expose qua generic CRUD controller; schema insert/update sinh ra nhận giá trị không giới hạn nếu không override.
3. Triển khai theo package
| Package | Bề mặt | Trạng thái |
|---|---|---|
core | schema dùng chung + hằng số jsonb (giảm giá sale-item, schema sổ ledger) | WK25 |
commerce | 18 CRUD controllers, lowStockThreshold, hệ số quy đổi uom | WK25 |
sale | tiền mặt ca (shift), số lượng order, 14 CRUD controllers | WK25 |
inventory | số lượng & đơn giá phiếu nhập/xuất, purchase order (15 CRUD controllers) | WK25 |
pricing | amount & quantity của fare/cost/tax/promotion-method (9 CRUD controllers) | WK25 |
finance | amount/exchangeRate phiếu thu chi, 5 CRUD controllers | WK25 |
invoice | dòng hóa đơn quantity/price/amount/taxAmount | WK25 |
ledger | revenueMin/Max bậc thuế, declaredAnnualRevenue | WK25 |
taxation | value của tax-group-item (5 CRUD controllers) | WK25 |
helpdesk | compensation.amount | Chờ — build package đang hỏng; tạo item khi sửa xong |
identity / signal / search / outreach / payment / asset / licensing | chỉ có priority/phân trang/đếm — không có input tiền/số lượng từ FE (đã audit 06/2026) | Không cần làm |
4. Ma trận test biên (cho QA)
Chạy cho từng endpoint nhận field tiền hoặc số lượng:
| # | Input | Kỳ vọng |
|---|---|---|
| 1 | đúng 99999999999.9999 (tiền) / 9999.9999 (số lượng) | 202/200 chấp nhận |
| 2 | max + 0.0001 | 422, lỗi nêu tên field |
| 3 | giá trị 4 chữ số thập phân (vd 12.3456) | chấp nhận |
| 4 | giá trị 5 chữ số thập phân (vd 12.34567) | 422 |
| 5 | -1 | 422 (trừ khi field ghi rõ cho phép âm) |
| 6 | 0 | chấp nhận (trừ khi field yêu cầu dương, vd amount phiếu thu chi) |
| 7 | chuỗi "abc", null cho field bắt buộc, 1e30 | 422 |
Bất kỳ case nào trả lỗi DB / HTTP 500 = bug — thiếu giới hạn ở tầng validate.