BPO ERP là nền tảng ERP đa tenant được hậu thuẫn bởi PostgreSQL. Backend là một ứng dụng ASP.NET Core đơn lẻ expose REST API, với cô lập tenant được thực thi bằng Row-Level Security. Frontend React + TypeScript được đồng host trên cùng một origin. Xác thực sử dụng ASP.NET Core Identity với hai chế độ JWT/cookie.
---
config:
layout: elk
---
graph TD
subgraph Clients
WB["Web Browser"]
MOB["Mobile App"]
end
subgraph App["Application Tier (ASP.NET Core)"]
API["REST API / Auth"]
subgraph Modules["Domain Modules"]
direction LR
CORE[Core]
ACC[Accounting]
INV[Inventory]
PRO[Procurement]
SAL[Sales]
end
JOBS["Background Jobs"]
EINV["E-Invoice Adapter"]
end
DB[("PostgreSQL")]
GDT["GDT Provider"]
EXT["External Services"]
WB & MOB -->|HTTPS| API
API --> Modules
Modules --> EINV --> GDT
Modules --> DB
JOBS --> Modules
JOBS --> DB
JOBS --> EXT
Tất cả các module sống trong một ứng dụng ASP.NET Core đơn lẻ, được phân tách bằng namespace. Tất cả các cuộc gọi đều trong-process — không có giao tiếp inter-service.
| Module | Trách nhiệm |
|---|
| Core Platform | Cấp tenant, RBAC, quản lý người dùng, ghi nhật ký kiểm toán, quản trị hệ thống |
| Customization Engine | Trường tùy chỉnh, quy tắc xác thực, bước quy trình công việc theo từng tenant |
| Plugin Host | Mở rộng mã tenant sandboxed (Phase 2) |
| Accounting | Sổ cái chung, AP, AR, tích hợp hóa đơn điện tử |
| Inventory | Chủ sản phẩm, kho, chuyển động hàng tồn kho, định giá, kiểm kê |
| Procurement | Yêu cầu mua hàng, PO, nhập hàng, quản lý nhà cung cấp |
| Sales | Khách hàng, báo giá, đơn đặt hàng, phiếu giao hàng, hóa đơn AR |
| Reporting | Báo cáo tài chính, dashboard có thể cấu hình, báo cáo xuyên tenant |
| Manufacturing | BOM, lệnh sản xuất, MRP, theo dõi chi phí sản xuất (Phase 2) |
| HR & Payroll | Hồ sơ nhân viên, lương, phiếu lương (Phase 2) |
| Migration ETL | Trích xuất, chuyển đổi, tải, đối chiếu dữ liệu legacy (Phase 3) |
Triển khai chính là trên máy chủ của BPO. Cùng một binary chạy trên cơ sở hạ tầng cloud hoặc máy chủ on-premises của khách hàng — không cần thay đổi mã nguồn. Tất cả dữ liệu tenant vẫn ở Việt Nam.
| Quan ngắt | Cách tiếp cận |
|---|
| Multitenancy | Schema chia sẻ với cô lập row ở cấp database (tier Standard); database riêng (tier Dedicated). Xem multitenancy.md. |
| Auth & Authorization | Phiên browser sử dụng cookie được quản lý bảo mật bởi server; client API/mobile sử dụng bearer token. Permission-code RBAC được thực thi ở cả API và lớp dữ liệu. Xem Access control. |
| Audit Logging | Nhật ký kiểm toán chỉ thêm, không thay đổi cho tất cả các thay đổi dữ liệu thuộc tenant. |
| Encryption | TLS khi truyền; mã hóa ở cấp hạ tầng; mã hóa cấp cột cho dữ liệu cá nhân và lương. |
| Background Jobs | Công việc được lên lịch (đóng kỳ kế toán, báo cáo thuế, đồng bộ tỷ giá, polling hóa đơn điện tử) chạy như hosted services trong cùng một process. |
| Lớp | Lựa chọn | Lý do |
|---|
| Backend | ASP.NET Core (latest LTS) | Kỹ năng team; hệ sinh thái enterprise mạnh |
| Database | PostgreSQL | Mã nguồn mở; RLS native; không có licensing per-core |
| ORM | Entity Framework Core | Query filter toàn cục áp dụng cô lập tenant; migrations code-first |
| Frontend | React + TypeScript | Kỹ năng team; phù hợp cho UI doanh nghiệp dữ liệu lớn |
| API | REST | Đơn giản; tương thích rộng rãi client |
| Auth | ASP.NET Core Identity + JWT / OIDC | Cookie + Bearer dual-scheme; sẵn sàng OIDC cho SSO tương lai |
| Hosting | Server BPO (chính); cloud hoặc server khách (tùy chọn) | Nơi lưu trữ dữ liệu; không cần thay đổi mã để chuyển target triển khai |
| ADR | Quyết định |
|---|
| ADR-001 | Multitenancy: hybrid hai-tier (shared schema RLS + tùy chọn dedicated) |
| ADR-002 | Ứng dụng monolithic modular — không có microservices |
| ADR-003 | Backend: ASP.NET Core, Entity Framework Core, ASP.NET Core Identity |
| ADR-004 | Database: PostgreSQL |
| ADR-005 | Access control: permission-code RBAC với định nghĩa vai trò theo từng tenant |
| ADR-006 | Customization: trường tùy chỉnh JSON, quy tắc xác thực condition-tree, bước quy trình công việc |