๐งฎ ERP Schema V2 Overview
ERP Schema V2 adalah schema ERP generik yang menyederhanakan lebih dari 250 tabel menjadi sekitar 60 tabel terstruktur, dengan fokus pada:
- Universal Journal ala SAP S/4HANA
- Master data minimalis (material, business partner)
- Alur transaksi inti yang bersih (PRโPOโGRโAPโGL, SOโInvoiceโARโGL, dll.)
- Multi-tenant, multi-company, multi-branch untuk skala nasional/enterprise.
1. Executive Summary
1.1 Latar Belakang
Schema lama:-
250 tabel untuk POS, SCM, Manufacturing, Promo Engine, Wallet, Finance, dll.
- Banyak duplikasi:
- Kode seperti
merchant_code,branch_code,product_codetersebar di banyak tabel. - Banyak tabel log dan derived yang sebenarnya bisa dinormalisasi.
- Kode seperti
- Sulit dipakai sebagai ERP core karena:
- Tidak ada universal journal.
- Master data tersebar dan saling overlap.
- Konsolidasi menjadi sekitar 60 tabel.
- Pemisahan jelas antara:
- Master data (material, customer, vendor, COA).
- Dokumen bisnis (PO, SO, GR, invoice).
- Posting keuangan (GL).
- Logistik (stock, movement).
- Fokus ke ERP tanpa kehilangan kemampuan POS/retail.
1.2 Tujuan & Manfaat
- Sebagai core ERP generik yang bisa diadopsi berbagai bisnis.
- Memudahkan integrasi:
- Antar modul internal (inventory, finance, HR, CRM).
- Dengan sistem eksternal (billing, data warehouse, BI).
- Menurunkan kompleksitas:
- Lebih sedikit tabel.
- Struktur dan naming yang konsisten.
- Memperkuat kualitas data:
- Satu sumber kebenaran untuk master & journal.
- Mengurangi duplikasi dan inkonsistensi.
2. Architecture Overview
2.1 Prinsip Desain Inti
-
Universal Journal sebagai pusat
Semua transaksi keuangan berakhir digl_entry+gl_line. -
Master Data Minimalis
inv_matsebagai material master tunggal.so_customer&po_vendorsebagai business partner ringan.- Atribut turunan dipecah ke tabel kecil spesifik bila perlu.
-
Transaction Core yang Clean
- Procurement โ
po_*+inv_*+fi_ap_*+gl_*. - Sales/POS โ
so_*+fi_ar_*+gl_*. - Inventory โ selalu lewat
inv_move.
- Procurement โ
-
Multi-tenant, Multi-company, Multi-branch
- Tenant > Company > Branch sebagai hirarki standar.
-
Domain Prefix
- Prefix tabel per domain (
core_,fi_,gl_,inv_,po_,so_,hr_,crm_,cs_,au_,an_,ic_,rg_) untuk menjaga boundary dan memudahkan navigasi.
- Prefix tabel per domain (
2.2 Domain Prefixes
| Prefix | Domain | Contoh tabel |
|---|---|---|
core_ | Core, auth, RBAC, config | core_user, core_audit |
fi_ | Finance AR/AP/Cash | fi_ar_inv, fi_cash_tx |
gl_ | General Ledger / Universal Journal | gl_entry, gl_line |
inv_ | Inventory & stock | inv_mat, inv_move |
po_ | Procurement | po_order, po_gr |
so_ | Sales & POS | so_order, so_pos |
hr_ | Human Resources | hr_emp, hr_payroll |
crm_ | Customer Relationship Management | crm_contact, crm_lead |
cs_ | Customer Service / Ticketing | cs_ticket |
au_ | Audit & Segregation of Duties | au_sod |
an_ | Analytics & KPI | an_kpi, an_kpi_val |
ic_ | Intercompany / Holding | ic_entity, ic_tx |
rg_ | Region, Currency, Policy | rg_rate, rg_policy |
2.3 Multi-tenant โ Company โ Branch
-
core_tenant
Level SaaS / grup tertinggi. -
core_company
Entitas legal akuntansi (PT/CV). COA, GL, AR/AP terikat ke sini. -
core_branch
Unit operasional (toko, gudang, cabang). Stock dan POS terjadi di level ini.
2.4 Konvensi PK/FK & Penamaan
- PK:
id BIGINT UNSIGNED AUTO_INCREMENT. - FK umum:
tenant_idโcore_tenant.idcompany_idโcore_company.idbranch_idโcore_branch.idmat_idโinv_mat.idcust_idโso_customer.idvendor_idโpo_vendor.id
- Kode unik lokal:
codeunik per company (material, customer, vendor, COA) untuk memudahkan integrasi dan import dari sistem lain.
2.5 Alignment dengan SAP / S4HANA
ERP Schema V2 mengadopsi spirit SAP Universal Journal (ACDOCA) dan Material Master namun dengan eksekusi yang lebih ringan dan mudah dioperasikan di startup atau mid-size enterprise.
-
Universal Journal
- SAP ACDOCA โ V2:
gl_entry+gl_line. - Semua posting AR/AP/expense/cash dihantarkan ke GL.
- SAP ACDOCA โ V2:
-
Material & Stock
- SAP MARA/MBEW/MCHB โ V2:
inv_mat,inv_stock,inv_move.
- SAP MARA/MBEW/MCHB โ V2:
-
Document Flow
- SAP: PRโPOโGRโInvoiceโPayment.
V2:po_reqโpo_orderโpo_grโfi_ap_invโfi_ap_payโgl_entry.
- SAP: PRโPOโGRโInvoiceโPayment.
3. ERD Overview (Global)
4. Business Process Flows
- Procurement: PR โ PO โ GR โ AP โ GL
- Sales: SO โ Invoice โ AR โ GL
- POS Mini Flow
- Inventory: Stock โ Movement โ Adjustment
- Payroll Mini Flow
- CRM & Ticket
Flow Ringkas
- Purchase Request (PR)
- User cabang membuat kebutuhan di
po_req+po_req_line.
- User cabang membuat kebutuhan di
- Purchase Order (PO)
- Buyer meng-approve PR โ generate
po_order+po_order_line.
- Buyer meng-approve PR โ generate
- Goods Receipt (GR)
- Barang datang โ create
po_gr+po_gr_line. - GR men-trigger
inv_move(movement type =IN_PURCHASE) dan updateinv_stock.
- Barang datang โ create
- AP Invoice
- Finance menerima invoice supplier โ
fi_ap_inv+fi_ap_inv_line.
- Finance menerima invoice supplier โ
- AP Payment
- Pembayaran ke supplier โ
fi_ap_pay.
- Pembayaran ke supplier โ
- GL Posting
- AP invoice dan payment di-post ke
gl_entry+gl_line(debit/credit COA terkait).
- AP invoice dan payment di-post ke
Diagram
5. Design Rationale
5.1 Kenapa Universal Journal?
- Fakta:
- Schema lama memisahkan jurnal per modul (AR, AP, POS, dsb).
- Sulit membuat laporan konsolidasi & audit trail.
- Pendekatan V2:
- Semua posting keuangan selalu lewat
gl_entry+gl_line.
- Semua posting keuangan selalu lewat
- Manfaat:
- Laporan keuangan dan audit hanya perlu satu sumber data.
- Implementasi AR/AP/asset/cash hanyalah โ/viewโ domain di atas GL.
5.2 Kenapa Material Master Dinormalisasi?
- Fakta:
- Banyak duplikasi
productvsinventoryvsproduct_price.
- Banyak duplikasi
- Pendekatan V2:
- Satu tabel
inv_matuntuk material. - Harga, stock, movement dipisahkan ke tabel spesifik (
inv_stock,inv_move, dsb.).
- Satu tabel
- Manfaat:
- Satu ID material di seluruh sistem.
- Menyederhanakan integrasi dengan POS, e-commerce, dan sistem eksternal.
5.3 Kenapa POS Disederhanakan?
- Fakta:
- POS lama mencampur konsep GL dan inventory di banyak tabel.
- Pendekatan V2:
- POS cukup
so_pos+so_pos_line. - Posting GL & movement inventory dilakukan oleh service terpisah (terhadap
fi_cash_tx,inv_move,gl_entry).
- POS cukup
- Manfaat:
- Engine POS tetap ringan & offline-friendly.
- Akuntansi dan stock tetap terkendali dengan cara yang konsisten.
5.4 Kenapa Domain Prefix Penting?
- Memudahkan:
- Pengembang baru memahami batas domain.
- Query & migrasi berdasarkan modul.
- Pemetaan ke tim/domain (core, finance, inventory, dsb.).
- Mengurangi:
- Risiko konflik nama.
- Risiko mencampur domain (mis. tabel finance dipakai langsung oleh modul inventory).
6. Glossary
| Istilah | Definisi singkat |
|---|---|
| Tenant | Pemilik instance ERP (grup/holding/penyedia layanan) |
| Company | Entitas legal akuntansi (PT/CV) |
| Branch | Unit operasional (toko, gudang, cabang) |
| Material | Item/barang yang dikelola di inventory (inv_mat) |
| COA (Chart of Accounts) | Daftar akun buku besar untuk GL (gl_coa) |
| Universal Journal | Model di mana semua posting keuangan masuk ke satu struktur GL |
| PR (Purchase Request) | Permintaan pembelian awal (po_req) |
| PO (Purchase Order) | Pesanan pembelian ke vendor (po_order) |
| GR (Goods Receipt) | Pencatatan barang masuk (po_gr) |
| AR (Accounts Receivable) | Piutang usaha (fi_ar_*) |
| AP (Accounts Payable) | Hutang usaha (fi_ap_*) |
| POS (Point of Sale) | Transaksi penjualan kasir (so_pos) |
| Movement | Pergerakan stok yang mempengaruhi inv_stock (inv_move) |
| Adjustment | Penyesuaian stok akibat opname/selisih (inv_adj, inv_adj_line) |
| SoD (Segregation of Duties) | Pemisahan tugas untuk mencegah fraud (au_sod) |
| KPI | Key Performance Indicator (an_kpi, an_kpi_val) |
| Intercompany | Transaksi antar entitas dalam satu grup (ic_entity, ic_tx) |
| Region/Policy | Pengaturan regional, mata uang, dan kebijakan (rg_*) |
7. Navigasi ke Dokumentasi Modul
Gunakan file modul di folder40-database/erp-v2/:
- Satu file per modul (Core, Finance, GL, Inventory, Procurement, Sales, HR, CRM, CS, Audit, Analytics, Intercompany, Global) mencakup:
- List tabel & deskripsi pendek.
- Key fields & FK.
- Hubungan antar tabel per modul.
- Contoh flow minimal & snippet query
SELECTuntuk laporan.