Skip to content

Domain Model

Tất cả schema do @nx/core sở hữu. Taxation chỉ kế thừa repository. Thư mục gốc nguồn: packages/core/src/models/schemas/tax/.../pricing/.

1. ERD đầy đủ

2. Entities

TaxGroup

Thuộc tínhGiá trị
Bảngtax.TaxGroup
Nguồnpackages/core/src/models/schemas/tax/tax-group/schema.ts
Soft-delete
Cột Owner IDmerchantId (nullable - null = template hệ thống)

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
identifiertextSnowflakeMã ổn định, duy nhất (vd VN_DEDUCTION_VAT10)
namejsonb-i18n { default, en, vi }
descriptionjsonb-i18n
taxMethodtext-000_DIRECT / 100_DEDUCTION
statustextACTIVATEDXem enum bên dưới
merchantIdtext-Merchant sở hữu; null = system

Enum status: ACTIVATED · DEACTIVATED · ARCHIVED (Statuses).

Index: UQ_TaxGroup_identifier, IDX_TaxGroup_merchantId, IDX_TaxGroup_merchantId_status.

Quan hệ: merchant (M:1 → Merchant.id), items (1:M → TaxGroupItem, relationName là taxGroup).

TaxGroupItem

Thuộc tínhGiá trị
Bảngtax.TaxGroupItem
Nguồnpackages/core/src/models/schemas/tax/tax-group-item/schema.ts
Soft-delete
Cột Owner ID- (sở hữu qua parent taxGroupId)

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
taxGroupIdtext-Group cha
discriminationTypeIdtext-Phân loại thuế (VAT/PIT/...) thông qua DiscriminationType
typetext100_PERCENTAGETaxMode
valuedecimal(15,4)0Tỷ lệ hoặc số tiền
isInclusivebooleanfalseThuế nhúng trong giá
priorityinteger0Thứ tự áp dụng (tăng dần)
usagetext000_SALE000_SALE / 100_PURCHASE
chargeTargettext000_CUSTOMER000_CUSTOMER / 100_MERCHANT

Index: IDX_TaxGroupItem_discriminationTypeId, IDX_TaxGroupItem_taxGroupId.

Quan hệ: taxGroup (M:1 → TaxGroup.id), discriminationType (M:1 → DiscriminationType.id).

TaxSet

Thuộc tínhGiá trị
Bảngpricing.TaxSet
Nguồnpackages/core/src/models/schemas/pricing/tax-set/schema.ts
Soft-delete
Cột Owner ID- (đa hình qua principalId/principalType)

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
principalIdtext-id Product hoặc ProductVariant
principalTypetext-Product (mặc định) / ProductVariant (override)
namejsonb-i18n (sao chép từ TaxGroup)
statustextACTIVATEDXem enum bên dưới
sourceTypetext-TaxGroup (tự động) / null (thủ công)
sourceIdtext-TaxGroup.id khi provision tự động

Enum status: ACTIVATED · DEACTIVATED · ARCHIVED.

Index: partial unique UPI_TaxSet_principalId_principalType_status (where deletedAt IS NULL), IDX_TaxSet_sourceId, IDX_TaxSet_sourceType_sourceId, IDX_TaxSet_status.

Tax

Thuộc tínhGiá trị
Bảngpricing.Tax
Nguồnpackages/core/src/models/schemas/pricing/tax/schema.ts
Soft-delete
Cột Owner ID- (sở hữu qua taxSetId)

Trường (liên quan provisioning):

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
namejsonb-i18n (từ DiscriminationType / group)
typetext100_PERCENTAGETaxMode
valuedecimal(15,4)-Tỷ lệ hoặc số tiền
effectiveFromtimestamptzthời điểm provisionThời điểm thuế bắt đầu có hiệu lực
effectiveTotimestamptz-Thời điểm hết hạn (null = để mở)
priorityinteger0Thứ tự áp dụng
isInclusivebooleanfalseNhúng trong giá
shouldApplyOnDiscountedbooleantrueÁp trên phần giá đã giảm
isCompoundbooleantrueCộng dồn trên các thuế trước đó
usagetext000_SALEBán/mua
statustextACTIVATED-
chargeTargettext000_CUSTOMERKhách hàng/merchant
taxSetIdtext-Set cha
taxTypeIdtext-FK legacy tới TaxType (ghi kép, nullable)
discriminationTypeIdtext-Phân loại (có thẩm quyền)

Index: IDX_Tax_discriminationTypeId, IDX_Tax_status, IDX_Tax_taxSetId, IDX_Tax_taxTypeId.

TaxType

Thuộc tínhGiá trị
Bảngpricing.TaxType
Nguồnpackages/core/src/models/schemas/pricing/tax-type/schema.ts
Soft-delete
Cột Owner IDmerchantId (nullable)

Enum type (FixedTaxTypes): 000_VAT, 100_EXCISE, 200_ENVIRONMENTAL, 300_LUXURY, 400_PIT, 999_CUSTOM. chargeTarget: 000_CUSTOMER / 100_MERCHANT. Unique (type, merchantId). Phân loại legacy - DiscriminationType (scope tax_classification) nay là nguồn có thẩm quyền; Tax.taxTypeId giữ làm phương án dự phòng ghi kép (ADR-0002).

Bảng tham chiếu VN (read-only)

BảngCột keyFK
tax.VnAdministrativeUnitcodeName (UK), fullName, shortName (+ *_en)-
tax.VnProvincecode (UK), name, fullName, administrativeUnitCodeVnAdministrativeUnit.codeName
tax.VnWardcode (UK), name, provinceCode, administrativeUnitCodeVnProvince.code, VnAdministrativeUnit.codeName

Phục vụ chỉ đọc; không được seed bởi migration của package này (nạp từ bên ngoài).

3. Bất biến xuyên entity

Bất biếnCách thực thi
Nhiều nhất một TaxSet ACTIVATED cho mỗi (principalId, principalType)Partial unique index UPI_TaxSet_principalId_principalType_status (với dòng chưa xoá)
Provision idempotent cho cùng một source groupTaxProvisioningService bỏ qua khi TaxSet đang active có sourceType=TaxGroupsourceId khớp
Chỉ TaxSet có nguồn TaxGroup mới bị deactivate khi (de)provision_deactivateExistingTaxSet chỉ tác động khi sourceType === TaxGroup
Merchant taxMethod phải khớp TaxGroup.taxMethodTaxGroupService.validateTaxGroupForMerchant (DIRECT ≠ DEDUCTION)
Mỗi Tax được provision phản ánh một TaxGroupItemprovisionForProduct lặp qua các item của group

4. Hành vi Soft-delete

Hành viChi tiết
Đọc mặc địnhdeletedAt IS NULL (model defaultFilter)
DeprovisionChuyển status thành DEACTIVATED - không phải soft-delete (các dòng dồn lại)
Hard-deleteKhông bao giờ, theo mặc định
Khôi phụcProvision lại tạo một TaxSet ACTIVATED mới; các dòng DEACTIVATED trước đó vẫn còn

5. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.