PRD: Bộ máy định giá Fare & Thuế
| Module | Định giá | PRD ID | PRD-FARE-001 |
| Trạng thái | Sẵn sàng dev | FEAT | FARE |
| Epic | — | Plane | BANA-1513 |
| Ngày | 2026-06-05 | Phiên bản | v1.0 |
| Gói | @nx/pricing | URD | FARE |
| Surface | BackendClient · Chủ/QL | ||
| Phụ trách | Phát Nguyễn | ||
Bộ máy định giá Fare & Thuế là gì
Mỗi biến thể sản phẩm có một fare set (Fare Set) - nơi chứa giá gốc và các fare con có điều kiện; hệ thống tự tạo fare set + giá gốc ngay khi biến thể xuất hiện, nên biến thể nào cũng định giá được ngay. Chủ merchant đặt một fare cha theo một trong hai chiến lược - OVERRIDE (luôn ghi đè) hoặc SALE (cạnh tranh như một mức giảm) - rồi thêm các fare con mang giá riêng và quy tắc điều kiện (số lượng, khung giờ...). Bộ máy chọn fare thắng theo tầng ưu tiên cao nhất trước; trong tầng đó một fare OVERRIDE luôn thắng SALE, còn giữa các fare hợp lệ cùng loại thì giá thấp nhất thắng; không có fare con nào hợp lệ thì quay về giá gốc.
Song song đó, chủ merchant gắn thuế (Tax) phần trăm, cố định hoặc theo đơn vị vào một tax set (Tax Set) của biến thể, chọn inclusive (gộp trong giá) hay exclusive (cộng thêm), và thuế có thể lũy tiến chồng lên thuế trước theo thứ tự ưu tiên. Khi thanh toán, luồng bán hàng gọi một mô phỏng định giá duy nhất; kết quả là một pricing snapshot bất biến - phân rã fare và thuế theo từng dòng cộng tổng đơn hàng - để việc định giá luôn nhất quán và truy vết được. Một dòng không có cấu hình thuế vẫn định giá được, chỉ là thuế bằng 0 - không bao giờ bị chặn vì thiếu cấu hình.
Vì sao cần một bộ máy duy nhất
Trước đây giá bị gắn cứng trên sản phẩm hoặc tính tùy hứng khi thanh toán - không có chỗ thống nhất nào cho thuế, giá theo quy tắc, hay một bảng phân rã truy vết được. Chủ merchant cần một bộ máy duy nhất chọn đúng fare cho từng biến thể, tính thuế chính xác (inclusive/exclusive, lũy tiến, cấp dòng hàng), và trả về một kết quả định giá nhất quán mà luồng bán hàng dùng lại khi thanh toán thay vì tự viết lại logic định giá. Đó là nền tảng cho việc báo cáo giá vốn, thuế và biên lợi nhuận đáng tin cho bài toán sổ sách HKD/SME mà BANA hướng tới.
Bộ máy đặt việc chọn fare và tính thuế trên nền danh mục biến thể sản phẩm, giới hạn mọi bản ghi trong merchant của chính người dùng, và mở một mô phỏng định giá cho luồng bán hàng dùng.
Một ví dụ từ đầu tới cuối
Biến thể "Áo thun trắng" có giá gốc 100.000đ. Chủ merchant thêm một fare cha SALE với một fare con giá 80.000đ, mang quy tắc "số lượng mua từ 10 trở lên". Tax set của biến thể này gắn một thuế VAT 10%, chưa gộp.
| Bước | Việc xảy ra | Kết quả |
|---|---|---|
| Khách mua 12 áo | Bộ máy đánh giá quy tắc số lượng: 12 ≥ 10, fare con hợp lệ | Fare con 80.000đ thắng, không phải giá gốc 100.000đ |
| Tính thuế trên đơn giá đã chọn | VAT 10% chưa gộp, cộng thêm lên trên | Thuế một áo = 80.000 × 10% = 8.000đ |
| Mô phỏng định giá trả về ảnh chụp dòng | 12 áo, đơn giá 80.000đ | subtotal 960.000đ, thuế 96.000đ, total 1.056.000đ |
| Khách mua 5 áo (một đơn khác) | Quy tắc số lượng sai (5 < 10), fare con bị loại | Bộ máy quay về giá gốc 100.000đ/áo, không báo lỗi |
Chỗ dễ sai nhất
Giá gốc cũng cạnh tranh theo tầng ưu tiên của chính nó
Giá gốc không tự động thua một fare con nằm chung tầng ưu tiên. Giá gốc mặc định đứng ở mức ưu tiên 0; một fare con cũng đặt ưu tiên 0 phải so giá sòng phẳng với giá gốc như hai đối thủ ngang hàng, không phải cứ có fare con là fare con thắng.
Ngược lại, khi một fare OVERRIDE hợp lệ có mặt trong tầng ưu tiên đang thắng, nó thắng ngay lập tức, không so giá với bất kỳ ai trong tầng đó - kể cả một fare SALE rẻ hơn.