ADR-0002. DiscriminationType là phân loại thuế authoritative (dual-write taxTypeId)
| Field | Value |
|---|---|
| Status | Accepted |
| Date | 2026-04-15 |
| Deciders | taxation-team |
| Supersedes | — |
Bối cảnh
- Hệ thống có một classifier
DiscriminationTypegeneric (scope cho inventory, finance, license, vàtax_classification). - Entity
TaxTypelegacy trong schemapricingcũng phân loại thuế (000_VAT,400_PIT, ...), trùng concept đó. TaxGroupItemvàTaxcần một nguồn phân loại; code pricing/calculation hiện vẫn đọcTax.taxTypeId.- Chúng tôi muốn một catalogue đơn, phân vùng theo scope mà không phá vỡ pricing ngay.
Quyết định
TaxGroupItem.discriminationTypeId và Tax.discriminationTypeId (cả hai notNull) là phân loại thuế authoritative. Trong lúc provision chúng tôi dual-write: mỗi Tax giữ discriminationTypeId mới và taxTypeId legacy (nullable) để các read pricing hiện tại tiếp tục hoạt động. Discrimination type dưới scope tax_classification được seed bởi taxation-0001-seed-discrimination-types.ts.
Hệ quả
| Ưu | Nhược |
|---|---|
| Một catalogue classifier xuyên domain | Hai cột phải giữ đồng bộ trong giai đoạn chuyển tiếp |
Tax.taxTypeId giữ nullable — không phá vỡ cứng cho pricing | Cần logic reconcile để map DiscriminationType → TaxType |
| Tax class mới thêm qua discrimination seed, không phải schema | Bảng TaxType còn lại đến khi pricing migrate 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 migration | Concept classifier trùng; không tái dùng cross-domain | Phân kỳ với chiến lược DiscriminationType |
Drop taxTypeId ngay | Schema sạch | Phá vỡ read pricing đang chạy | Quá rủi ro nếu không thay đổi pricing phối hợp |
| Bảng classifier riêng cho thuế | Tập trung | Lại thêm một classifier; cùng vấn đề trùng | Tái dùng thắng 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 dual-write)packages/taxation/src/migrations/processes/taxation-0001-seed-discrimination-types.ts