Arsitektur Perdagangan (SSOT)
Arsitektur Database & Single Source of Truth: Modul Perdagangan
Dokumen ini menjelaskan rancangan arsitektur data (Data Architecture) pada modul Perdagangan (Trading) di dalam ERP BUMDes, yang juga mengadopsi prinsip Single Source of Truth (SSOT).
1. Single Source of Truth (SSOT) melalui Database Triggers#
Untuk mencegah terjadinya anomali data (seperti duplikasi pemotongan stok atau penjurnalan ganda), aplikasi web (Next.js / Server Actions) DILARANG KERAS melakukan operasi INSERT atau UPDATE secara langsung ke tabel accounting_journals atau inventory_stock setiap kali ada transaksi baru.
Satu-satunya tabel yang boleh di-insert oleh aplikasi saat ada aktivitas perdagangan adalah:
trading_transactions(Tabel Induk Transaksi)trading_transaction_items(Tabel Rincian Barang)
Automasi Jurnal & Stok
Setelah data masuk ke trading_transaction_items, PostgreSQL Database Triggers akan secara otomatis dan sinkron menjalankan efek samping (side-effects) berikut:
- Memotong/Menambah Stok Gudang
- Membuat Jurnal Akuntansi (Debit/Kredit)
Karena dilakukan di level database (Supabase/PostgreSQL), konsistensi data terjamin mutlak terlepas dari seberapa lambat koneksi internet pengguna atau jika server aplikasi Next.js mengalami crash di tengah-tengah proses.
2. Pemetaan Akun Dinamis (Account Mappings)#
Agar jurnal akuntansi otomatis dapat bekerja dengan benar, modul ini menggunakan tabel pemetaan dinamis: unit_account_mappings.
Setiap unit usaha (misalnya Unit Perdagangan Hasil Bumi) harus memetakan 6 jenis Chart of Accounts (COA) dasar:
- Akun Kas/Bank (Untuk penerimaan & pembayaran)
- Akun Piutang (Jika pelanggan berhutang)
- Akun Hutang (Jika BUMDes berhutang pada supplier)
- Akun Persediaan (Nilai aset barang di gudang)
- Akun HPP (Harga Pokok Penjualan) (Beban pokok saat barang terjual)
- Akun Penjualan (Pendapatan atas transaksi penjualan)
Catatan Penting untuk Developer: Trigger database (seperti
auto_journal_on_trading_purchasedanauto_journal_on_trading_sales) akan selalu look up ke tabelunit_account_mappingsberdasarkan ID Unit. Tidak ada lagi sistem hardcode nama akun teks (string matching) di dalam fungsi SQL.
3. Pencegahan Race Condition dengan Sequences#
Nomor referensi transaksi (contoh: TRX-IN-20260608-00001) tidak lagi di-generate menggunakan UNIX Timestamp (Date.now()) pada level Node.js/Browser, melainkan di-generate langsung oleh fungsi database menggunakan objek SEQUENCE PostgreSQL.
Ini menjamin bahwa meskipun ada 10 kasir yang menginput transaksi pada milidetik yang sama, nomor urut yang dihasilkan akan selalu unik (Aman dari Race Condition).