Skip to content

Ledger Service

@nx/ledger tạo sổ kế toán HKD (Hộ Kinh Doanh) chính thức của Việt Nam. Một worker do Kafka điều khiển lấy dữ liệu kinh doanh, render PDF (Typst) + XLSX (ExcelJS), mã hoá bằng AES-256-GCM, và upload lên S3. Nó cũng sở hữu vòng đời sổ (DRAFT → FINALIZED → revise), chỉnh sửa draft dựa trên snapshot, và cấu hình hàng năm theo từng merchant. Dữ liệu thượng nguồn đến từ các repository @nx/core (finance/sale/merchant); file được lưu qua MetaLink của @nx/asset.

1. Tham chiếu nhanh

Thuộc tínhGiá trị
Package@nx/ledger
CodeSVC-00060-LEDGER
TypeMicroservice
RuntimeBun
Base ClassVerifierApplication
Locationpackages/ledger
Base Path/v1/api/ledger
Dev Port31060
Container Port3000 (ngoài 31060)
Snowflake ID6
DB Schemaledger (6 bảng)
Binding Namespace@nx/ledger
Application Rolesapi và/hoặc worker (APP_ENV_APPLICATION_ROLES, mặc định cả hai)

2. Mục đích & Phạm vi

Bao gồmLoại trừ
6 biểu mẫu sổ HKD (S1a, S2a–S2e)Engine tính/khai thuế
Pipeline tạo bất đồng bộ (fetch → render → encrypt → upload)Thanh toán / hoá đơn (sở hữu bởi @nx/payment, @nx/invoice)
Render PDF (Typst) + XLSX (ExcelJS)Zod schema + Drizzle model của ledger (nằm trong @nx/core)
Vòng đời sổ DRAFT → FINALIZED → revise (version mới)Vận chuyển lưu trữ file (uỷ thác cho MetaLink/S3 của @nx/asset)
Chỉnh sửa draft dựa trên snapshot + theo dõi stalenessNộp lên cơ quan thuế (status SUBMITTED đã dành chỗ, chưa xây)
Config hàng năm theo từng merchant + bậc khai thuế
Quét phục hồi job kẹt + retry/regenerate thủ công
Thông báo trạng thái job qua WebSocket thời gian thực (role worker)

3. Tech Stack

External:

LibraryMục đích
@venizia/ignisIoC container, DI, BaseService, BaseRestController, ControllerFactory
@venizia/ignis-helpersLogger, Kafka helpers, Redis, WebSocketEmitter, AES, BunS3Helper
@platformatic/kafkaKafka producer + consumer client
@myriaddreamin/typst-ts-node-compilerTypst NodeCompiler — render PDF
exceljsBuilder workbook XLSX
hono + @hono/zod-openapi + @scalar/hono-api-referenceHTTP server, OpenAPI, explorer /doc
drizzle-orm + pgTruy cập DB qua PostgresCoreDataSource
lodashTiện ích

Internal:

PackageMục đích
@nx/coreVerifierApplication, schema/model ledger, repository, KafkaTopics, LedgerStatuses/LedgerIdentifiers/PeriodTypes, LedgerErrors, channel/room WS
@nx/assetMetaLinkService / MetaLink — upload + download file đã tạo lên S3

4. Cấu trúc dự án

packages/ledger/
├── src/
│   ├── application.ts            # subclass VerifierApplication; wiring có cổng role
│   ├── index.ts                  # bootstrapApplication()
│   ├── migrate.ts                # bootstrapMigration()
│   ├── common/                   # constants, keys, rest-paths, roles, environments, types
│   ├── components/               # kafka (producer+consumer), recovery, websocket, stress-test*
│   ├── controllers/              # actions, crud, batch, merchant-ledger-config
│   ├── datasources/              # PostgresCoreDataSource
│   ├── helpers/                  # S3Helper (singleton BunS3Helper lazy)
│   ├── migrations/processes/     # 4 seed migration
│   ├── models/                   # zod request/response schema
│   ├── repositories/             # re-export từ @nx/core
│   ├── services/                 # business logic + fetchers/ + generators/
│   └── utilities/                # buildPeriodString, filename helper
├── resources/templates/          # 6 Typst .typ + common.typ + previews/
├── package.json
└── tsconfig.json

* stress-test/ tồn tại nhưng không được đăng ký trong application.ts.

5. Kiến trúc

Chi tiết: xem Architecture.

6. Ảnh chụp Domain

ERD đầy đủ + bảng theo từng entity: xem Domain Model.

7. Tổng quan bề mặt

REST controllers — tham chiếu đầy đủ render trực tiếp từ /v1/api/ledger/doc/openapi.json (Scalar viewer tại /doc, portal gateway). Chỉ đăng ký trong role api; thứ tự quan trọng (LedgerActionsController trước để tránh /:id che mất).

ControllerBase pathBề mặt
LedgerActionsController/ledgersgenerate, status, retry, download, check-exists, search, snapshot pull/get, acknowledge-change, finalize, regenerate, revise
LedgerController/ledgersCRUD (find/findById/findOne/count phạm vi merchant)
LedgerBatchController/ledgersstatus/batch, generate/batch, retry/batch
MerchantLedgerConfigController/merchant-ledger-configscreate, list (theo merchant+year), update, confirm

Bề mặt async — tham chiếu đầy đủ trong API Events:

HướngKênhSố lượng
InboundKafka ledger.generate1 topic (role worker)
OutboundKafka ledger.generate1 topic (enqueue + recovery re-enqueue)
OutboundWebSocket1 topic (observation/ledger/job/status, role worker)
BullMQkhông

8. Components

Đăng ký trong configureComponents() (bỏ qua hoàn toàn khi RUN_MODE=migrate). WebSocket chỉ đăng ký trong role worker; Kafka consumer + recovery sweep đăng ký vô điều kiện nhưng tự bỏ qua trừ khi role worker active.

ComponentFileMục đích
KafkaProducerComponentsrc/components/kafka.component.tsKhởi tạo producer, bind APPLICATION_KAFKA_PRODUCER
KafkaConsumerComponentsrc/components/kafka.component.tsChỉ worker; N consumer trên ledger.generateLedgerWorkerService.handleGeneration()
RecoveryComponentsrc/components/recovery.component.tsChỉ worker; quét job kẹt định kỳ → reset PENDING + re-enqueue
LedgerWebSocketComponentsrc/components/websocket.component.tsChỉ worker; WebSocketEmitter qua Redis, đăng ký LedgerNotificationService

9. Services

Luôn đăng ký (api hoặc worker) trừ khi đánh dấu chỉ-worker.

ServiceFileMột dòng
LedgerServiceservices/ledger.service.tsCRUD/truy vấn bản ghi sổ (findExisting, findOrCreateDraft, saveSummary)
LedgerJobServiceservices/ledger-job.service.tsMáy trạng thái LedgerJob: setProcessing/Completed/Rejected, quét job kẹt
LedgerSnapshotServiceservices/ledger-snapshot.service.tsChỉnh sửa draft: pull, getSnapshot, acknowledgeChange, finalize, revise
MerchantLedgerConfigServiceservices/merchant-ledger-config.service.tsConfig theo merchant theo năm; giải loại bắt buộc, validate batch
MetaLinkServiceservices/meta-link.service.tsUpload S3/MetaLink + download đã giải mã (qua @nx/asset)
LedgerQueueServiceservices/ledger-queue.service.tsĐiều phối enqueue: enqueue, batch, retry, regenerate
LedgerDataFetcherServiceservices/ledger-data-fetcher.service.tsFacade fetcher theo loại (validate, fetch)
S1aHkdDataFetcherServiceservices/fetchers/S1a-HKD — dữ liệu thật (finance/sale/merchant/tax-info)
S2xHkdDataFetcherServiceservices/fetchers/S2a–S2e — dữ liệu fixture (placeholder)
LedgerDataFixtureServiceservices/ledger-data-fixture.service.tsĐọc JSON fixture đã tạo sẵn
StorageEncryptionServiceservices/storage-encryption.service.tsEncrypt/decrypt AES-256-GCM
LedgerWorkerService (worker)services/ledger-worker.service.tsĐiều phối pipeline; chỉ động LedgerJob.status
PdfGeneratorService (worker)services/generators/pdf-generator.service.tsRender PDF bằng Typst NodeCompiler (singleton lazy)
XlsxGeneratorService (worker)services/generators/xlsx-generator.service.tsBuilder workbook ExcelJS
LedgerNotificationService (worker)services/ledger-notification.service.tsEmitter WS job-status (đăng ký bởi component WS)

10. Repositories

Tất cả re-export từ @nx/core; bind trong configureRepositories(). Package không sở hữu schema nào.

RepositoryTable / SourceGhi chú
LedgerRepositoryledger.LedgerSở hữu
LedgerJobRepositoryledger.LedgerJob+ setProcessing, setCompletedIfProcessing, query job kẹt
LedgerSnapshotRepositoryledger.LedgerSnapshotSở hữu
LedgerSnapshotEntryRepositoryledger.LedgerSnapshotEntrySở hữu
MerchantLedgerConfigRepositoryledger.MerchantLedgerConfigSở hữu
TaxDeclarationLevelRepositoryledger.TaxDeclarationLevelSở hữu
MetaLinkRepository@nx/assetLink file đã tạo
MerchantRepository, TaxInfoRepository, VnProvinceRepository, VnWardRepository@nx/coreĐọc xuyên package (header S1a)
FinanceTransactionRepository, SaleOrderRepository@nx/coreĐọc xuyên package (entries S1a)
PermissionRepository, RoleRepository, PolicyDefinitionRepository@nx/coreSeed authorization

11. Entry Points

FileMục đích
src/index.tsEntry service → bootstrapApplication()
src/migrate.tsEntry migration → bootstrapMigration()
src/application.tsApplication extends VerifierApplication

12. Configuration

Env vars + roles + dữ liệu seed: xem Configuration.

13. Operations

Triển khai + observability + bảo mật + runbook: xem Operations.

14. Trang liên quan

Khái niệm — vì sao/như thế nào:

Tham chiếu — tra cứu:

Tính năng — đào sâu:

Decisions:

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