ADR-0002. DiscriminationType làm phân loại thuế chính thức (ghi kép taxTypeId)
| Field | Value |
|---|---|
| Status | Accepted |
| Date | 2026-04-15 |
| Deciders | Phat Nguyen |
| Supersedes | - |
Bối cảnh
- Hệ thống đã có một bộ phân loại
DiscriminationTypedùng chung (scope cho inventory, finance, license, vàtax_classification). - Entity
TaxTypecũ trong schemapricingcũng phân loại thuế (000_VAT,400_PIT, ...), trùng lặp với khái niệm đó. TaxGroupItemvàTaxcần một nguồn phân loại duy nhất; code pricing/tính toán hiện vẫn đọcTax.taxTypeId.- Chúng tôi muốn một danh mục duy nhất, phân vùng theo scope mà không phá vỡ pricing ngay lập tức.
Quyết định
TaxGroupItem.discriminationTypeId và Tax.discriminationTypeId (cả hai đều notNull) là phân loại thuế chính thức. Trong lúc cấp phát, chúng tôi ghi kép: mỗi Tax giữ cả discriminationTypeId mới lẫn taxTypeId cũ (nullable) để các lệnh đọc pricing hiện tại vẫn hoạt động. Các discrimination type thuộc scope tax_classification được seed bởi taxation-0001-seed-discrimination-types.ts.
Hệ quả
| Ưu | Nhược |
|---|---|
| Một danh mục phân loại dùng chung xuyên domain | Hai cột phải giữ đồng bộ trong giai đoạn chuyển tiếp |
Tax.taxTypeId vẫn nullable - không phá vỡ đột ngột pricing | Cần logic đối soát để ánh xạ DiscriminationType → TaxType |
| Loại thuế mới thêm qua discrimination seed, không qua schema | Bảng TaxType vẫn tồn tại đến khi pricing chuyển đổi hoàn toàn |
Các phương án đã cân nhắc
| Phương án | Ưu | Nhược | Lý do loại bỏ |
|---|---|---|---|
Chỉ giữ TaxType | Không cần migration | Trùng lặp khái niệm phân loại; không tái dùng xuyên domain | Lệch khỏi chiến lược DiscriminationType |
Bỏ taxTypeId ngay | Schema gọn gàng | Phá vỡ các lệnh đọc pricing đang chạy | Quá rủi ro nếu không phối hợp thay đổi pricing |
| Bảng phân loại riêng chỉ cho thuế | Tập trung | Lại thêm một bộ phân loại; vẫn cùng vấn đề trùng lặp | Tái dùng tốt hơn là tạo bảng mới |
Tham chiếu
packages/core/src/models/schemas/tax/tax-group-item/schema.ts(discriminationTypeId)packages/core/src/models/schemas/pricing/tax/schema.ts(taxTypeIdnullable +discriminationTypeId)packages/core/src/models/schemas/public/discrimination-type/constants.ts:DiscriminationTypeScopes.TAX_CLASSIFICATIONpackages/taxation/src/services/tax-provisioning.service.ts(vòng lặp ghi kép)packages/taxation/src/migrations/processes/taxation-0001-seed-discrimination-types.ts