Architecture Overview¶
Gambaran arsitektur target sistem ERP setelah peremajaan. Detail keputusan historis: 09-SEJARAH-DAN-FILOSOFI-SISTEM.md. Ringkasan eksekutif: 00-RINGKASAN-EKSEKUTIF.md.
Tujuan sistem¶
| Sasaran | Implementasi |
|---|---|
| ERP multi-tenant | Satu DB PostgreSQL erp, schema tenant_<kode> per unit bisnis |
| Logika bisnis terkontrol | Trigger-first di PostgreSQL (logika + trigger tenant) — stok, HPP FIFO, jurnal |
| API tipis | NestJS — auth, tenant context, validasi, penyajian data, relai FCM |
| Analitik & dashboard cepat | CDC → Kafka → ClickHouse (erp_clickhouse) |
| Cutover | Big-bang setelah rekonsiliasi 100% (06-STRATEGI-MIGRASI-BIGBANG.md) |
Diagram konteks¶
flowchart TB
subgraph clients [Klien]
FL[Flutter ERP ×4]
WEB[Web / migrasi-ui]
LEG[Delphi legacy - sunset]
end
subgraph edge [Edge]
FB[Firebase Auth]
API[NestJS erp-backend :3001]
end
subgraph core [Core - Source of Truth]
PG[(PostgreSQL erp)]
LOG[schema logika]
PUS[schema pusat]
TEN[schema tenant_*]
end
subgraph analytics [Analytics Pipeline]
DEB[Debezium Connect]
KF[Kafka :9092]
ETL[consumer_clickhouse PM2]
CH[(ClickHouse erp_clickhouse)]
end
subgraph ops [Operasional]
MON[migrasi-ui / cdc-monitor]
PM2[PM2 processes]
end
FL --> FB
FL --> API
WEB --> API
WEB --> MON
LEG -.->|referensi migrasi| PG
API --> PG
PG --> LOG
PG --> PUS
PG --> TEN
TEN -->|WAL pgoutput| DEB
DEB --> KF
KF --> ETL
ETL --> CH
API --> CH
MON --> PG
MON --> KF
MON --> CH
PM2 --> ETL
PM2 --> MON
Batas sistem (boundaries)¶
| Boundary | Di dalam | Di luar | Catatan |
|---|---|---|---|
| Transaksi operasional | PostgreSQL tenant | ClickHouse untuk read model laporan/dashboard | CH bukan sumber kebenaran saldo |
| Autentikasi | Firebase (authN) | — | Password tidak disimpan di DB |
| Otorisasi | pusat.pengguna, pengguna_tenant, hak modul |
Firebase tidak tahu tenant | JWT tenant setelah pilih |
| Legacy | MariaDB luckyjayagroup |
Produksi baru | Hanya ETL/migrasi; jangan feature baru |
| CDC | Tabel terpublikasi di debezium_erp_pub |
Tabel draft/kerja yang belum dipublish | Daftar tabel: kafka-topics.md |
Lapisan tanggung jawab¶
| Lapisan | Owner | Tanggung jawab |
|---|---|---|
Schema pusat |
Database team | Registry tenant, pengguna, wilayah, akun master |
Schema logika |
Database team | Fungsi bersama: nomor bukti, FIFO, posting jurnal |
Schema tenant_* |
Database team + domain | Tabel operasional, view tenant, trigger |
| Backend NestJS | Backend team | HTTP API, pool tenant, search_path, ClickHouse query |
| ETL legacy | Database team | MariaDB → PG (one-shot / fase E) |
| CDC consumer | Platform / DBA | Sink Kafka → CH, DLQ, tuning batch |
| Flutter | Mobile team | UX, auth flow, konsumsi API |
| migrasi-ui | Platform | Bootstrap tenant, rebuild, monitor lag |
Pola arsitektur kunci¶
1. Trigger-first (OLTP)¶
Aplikasi menulis ke transaksi / transaksi_detail; trigger menghitung stok, HPP, jurnal. Backend tidak mengganti logika ini untuk operasi standar.
Rujuk: 05-LOGIKA-BISNIS-FIFO-STOK-JURNAL.md, ../database/docs/00-ARSITEKTUR-SCHEMA-PER-TENANT.md.
2. Schema-per-tenant¶
search_path = tenant_<kode>, logika, pusat per request (pool koneksi per tenant atau DISCARD PLANS).
Rujuk: 04-ARSITEKTUR-MULTI-TENANT.md.
3. CQRS ringan (OLAP)¶
PostgreSQL = command + consistency. ClickHouse = query agregat (ReplacingMergeTree + MV).
Rujuk: event-flow.md, clickhouse-patterns.md.
4. Auth dua token¶
- JWT aplikasi (pasca Firebase)
- JWT tenant (pasca
POST /tenants/{kode}/pilih)
Rujuk: 10-ARSITEKTUR-KLIEN-AUTH-REALTIME.md.
Komunikasi antar layanan¶
| Dari | Ke | Protokol | Data |
|---|---|---|---|
| Flutter | Firebase | OAuth / FCM | ID token, push |
| Flutter | NestJS | HTTPS + JWT | REST JSON |
| NestJS | PostgreSQL | SQL | DML + EXECUTE fungsi |
| NestJS | ClickHouse | Native/HTTP | SELECT laporan |
| PostgreSQL | Debezium | Logical replication | WAL changes |
| Debezium | Kafka | JSON CDC | erp.tenant_*.<tabel> |
| Consumer | ClickHouse | Batch INSERT | erp_clickhouse.* |
| Trigger PG | NestJS | pg_notify |
Event → SSE/FCM (rencana) |
| migrasi-ui | PG/Kafka/CH | HTTP + subprocess | Job operasional |
Status implementasi (ringkas)¶
| Komponen | Status | Catatan |
|---|---|---|
| PostgreSQL fondasi A–G | ✅ | ETL sparepart, CDC aktif 2026-05-21 |
| Backend fondasi + domain | 🟠| ~75 endpoint; kontrak OpenAPI belum final |
| Flutter auth + tenant | ✅ | Screen operasional menunggu API |
| Cutover big-bang | 🔴 | Menunggu rekonsiliasi semua tenant |
| Control plane CDC API | 🟡 | Draft + sebagian implementasi ops-cdc |
Detail: migration-status.md.