Skip to content

ADR-0001. Hai lớp provider-adapter: @nx/iiapi@nx/t-van

TrườngGiá trị
StatusAccepted
Date2026-04-01
Decidersinvoice-team
Supersedes

Bối cảnh

  • Hoá đơn điện tử Việt Nam đến cơ quan thuế qua các kênh khác nhau: provider HĐĐT trực tiếp (VNIS, VNPAY) và gateway transaction-VAN (T-VAN).
  • Hai kênh có hình dạng SDK, mô hình auth và lưu trữ credential khác nhau (theo từng merchant vs một kết nối platform duy nhất).
  • DB mã hoá enum provider riêng (InvoiceProviders), không được để enum iiapi (IIAPIProviders) lọt vào tầng lưu trữ.
  • Credential khác nhau theo từng kênh: VNIS dùng một hàng Configuration platform; VNPAY dùng các hàng InvoiceProvider theo từng merchant; T-VAN dùng một hàng Configuration platform.

Quyết định

Chúng ta sẽ bọc mỗi kênh trong package adapter riêng và đăng ký chúng bằng các component riêng:

  • @nx/iiapi (VNIS + VNPAY) đăng ký bởi InvoiceProviderConnectionComponent.
  • @nx/t-van (gateway T-VAN, provider VNPAY) đăng ký bởi TVanConnectionComponent.

Enum provider DB↔iiapi được bắc cầu bởi InvoiceProviderMapper (src/common/providers.ts), vốn ném lỗi với provider lạ. Tầng lưu trữ chỉ bao giờ lưu giá trị InvoiceProviders.

Hệ quả

ƯuNhược
Mỗi kênh tiến hoá độc lậpHai component đăng ký + đường boot phải bảo trì
Tầng lưu trữ tách khỏi enum vendorMapper phải cập nhật khi thêm provider mới
Mô hình credential theo merchant vs platform tách bạch sạch sẽHiện chỉ map VNPAY — các provider khác ném lỗi cho tới khi thêm
Thêm provider = mở rộng mapper + adapter, không đổi schemaHai đường nạp credential (hàng Configuration vs hàng provider)

Phương án đã cân nhắc

Phương ánƯuNhượcVì sao loại
Một adapter cho mọi kênhÍt component hơnÉp một hình dạng SDK lên các API không tương thíchCác kênh quá khác nhau (trực tiếp vs VAN)
Lưu enum iiapi trực tiếp trong DBKhông cần mapperEnum vendor lọt vào lưu trữ; biến động migrationRàng schema vào package bên thứ ba
Config T-VAN theo từng merchantĐối xứng với VNPAYT-VAN hiện là một gateway platform duy nhấtQuá kỹ so với nhu cầu hiện tại

Tham chiếu

  • src/common/providers.ts (InvoiceProviderMapper)
  • src/components/invoice-provider-connection/component.ts
  • src/components/tvan-connection/component.ts
  • src/migrations/data/configuration.ts (VNIS_DEFAULT_CONNECTION, TVAN_DEFAULT_CONNECTION)

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