Skip to content

Taxation Service

@nx/taxation owns TaxGroup/TaxGroupItem tax-rule templates and provisions them onto products as TaxSet + Tax rows, reacting to product changes via Debezium CDC. It also serves read-only Vietnamese administrative units, provinces, and wards. Pricing consumes the provisioned TaxSet; invoice is the downstream tax consumer.

1. Quick Reference

PropertyValue
Package@nx/taxation
CodeSVC-00130-TAXATION
TypeMicroservice
RuntimeBun
Base ClassVerifierApplication
Locationpackages/taxation
Base Path/v1/api/taxation
Dev Port31130
Container Port3000 (external 31130)
Snowflake ID13
DB Schematax (TaxGroup, TaxGroupItem, Vn* refs) + pricing (TaxSet, Tax, TaxType) — all owned by @nx/core
Binding Namespace@nx/taxation
Ownertaxation-team

2. Purpose & Scope

IncludedExcluded
TaxGroup/TaxGroupItem template CRUDTax-rate calculation at sale time (@nx/pricing)
Provision/deprovision TaxSet + Tax onto productsSeller/buyer tax identity TaxInfo (commerce → invoice)
CDC reconcile on product create/update/deleteVariant-level tax overrides (created manually, sourceType unset)
Merchant taxMethod ↔ group compatibility validationVN reference-data seeding (loaded externally)
Read-only VN provinces / wards / administrative unitsInvoice issuance (@nx/invoice)

3. Tech Stack

External:

LibraryPurpose
@venizia/ignisIoC container, DI, BaseService, BaseRestController, ControllerFactory
honoHTTP server framework (via IGNIS)
drizzle-ormDB access via PostgresCoreDataSource
@platformatic/kafkaKafka consumer + key/value (de)serializers
@venizia/ignis-helpersKafkaConsumerHelper, env access, getError/HTTP, dayjs
zodRequest schema validation (provisioning controller)

Internal:

PackagePurpose
@nx/coreALL Drizzle schemas, repositories, VerifierApplication, CDC topic constants, TProductPgRow/TDebeziumMessage

Sole internal dependency is @nx/core. This package declares no schemas of its own.

4. Project Structure

packages/taxation/
├── src/
│   ├── application.ts          # Application class (VerifierApplication)
│   ├── index.ts                # Entry → bootstrapApplication()
│   ├── migrate.ts              # Migration entry → bootstrapMigration()
│   ├── common/                 # BindingKeys, RestPaths
│   ├── components/kafka/        # CDC consumer on CDCKafkaTopics.PRODUCT
│   ├── controllers/            # 6 REST controllers + permission defs
│   ├── datasources/            # PostgresCoreDataSource binding
│   ├── migrations/processes/   # Seeds (discrimination types, groups, perms, role-perms)
│   ├── repositories/           # Repository subclasses over @nx/core schemas
│   ├── resources/              # app-info.json, banner
│   └── services/               # TaxGroup, TaxProvisioning, TaxationWorker
├── package.json
└── tsconfig.json

5. Architecture

Detail: see Architecture.

6. Domain Snapshot

Full ERD + per-entity tables: see Domain Model.

7. Surface Summary

REST controllers (full reference rendered live from /v1/api/taxation/doc/openapi.json):

ControllerBase pathStyleEndpoints
TaxGroupController/tax-groupsControllerFactory CRUD8
TaxGroupItemController/tax-group-itemsControllerFactory CRUD8
TaxProvisioningController/tax-provisioningCustom (provision/deprovision)2
VnProvinceController/vn-provincesRead-only
VnWardController/vn-wardsRead-only
VnAdministrativeUnitController/vn-administrative-unitsRead-only

Async topics (full reference in API Events):

DirectionCount
Inbound (Kafka CDC)1 (public.Product)
Outbound (Kafka)0
WebSocket out0
BullMQ jobs in/out0

8. Components

ComponentFilePurpose
ApplicationKafkaComponentsrc/components/kafka/component.tsSubscribes to CDCKafkaTopics.PRODUCT (Debezium), fallbackMode: latest, routes payload to TaxationWorkerService.handleProductCDC

9. Services

ServiceFileOne-liner
TaxGroupServicesrc/services/tax-group.service.tsValidates TaxGroup.taxMethod against merchant taxMethod; finds groups by method
TaxProvisioningServicesrc/services/tax-provisioning.service.tsIdempotent provision/deprovision of TaxSet + Tax from a TaxGroup template
TaxationWorkerServicesrc/services/taxation-worker.service.tsCDC consumer logic: c/u/r → reconcile, d → deprovision

10. Repositories

Registered in application.ts. All extend @nx/core repositories over core-owned schemas.

RepositoryTableSourceCustom Methods
TaxGroupRepositorytax.TaxGroup@nx/core
TaxGroupItemRepositorytax.TaxGroupItem@nx/core
TaxTypeRepositorypricing.TaxType@nx/core
TaxSetRepositorypricing.TaxSet@nx/corefindActiveTaxSetByPrincipal
TaxRepositorypricing.Tax@nx/core
VnProvinceRepositorytax.VnProvince@nx/core
VnWardRepositorytax.VnWard@nx/core
VnAdministrativeUnitRepositorytax.VnAdministrativeUnit@nx/core
DiscriminationTypeRepositoryDiscriminationType@nx/core
MigrationRepository, PermissionRepository, PolicyDefinitionRepository, RoleRepositoryinfra@nx/core

11. Entry Points

FilePurpose
src/index.tsService entry → bootstrapApplication()
src/migrate.tsMigration entry → bootstrapMigration()
src/application.tsApplication class extending VerifierApplication

12. Configuration

Env vars + feature flags + seeded data: see Configuration.

13. Operations

Deployment + observability + security + runbook: see Operations.

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