18

Arsitektur Teknis USP

Updated: Sep 2026Oleh: SystemModul Simpan Pinjam Konvensional (USP)

Arsitektur Teknis Sistem & Basis Data: Unit Simpan Pinjam (UNT-USP)

Dokumen ini mendokumentasikan spesifikasi arsitektur data relasional, prosedur atomik keuangan, protokol keamanan baris data, dan integrasi server actions untuk Unit Simpan Pinjam Konvensional BUMDes Bolulango (UNT-USP).

Rujukan model bisnis dan alur operasional diatur dalam Blueprint Operasional Unit USP dan Pedoman Akuntansi SAK EP.


1. Diagram Relasi Entitas Data (Entity Relationship)#

text
┌─────────────────────────┐
│ business_units │ <-- Kode: 'USP-01', Suffix: '.05'
│ (Unit Usaha BUMDes) │
└────────────┬────────────┘
 │ unit_id
 ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ usp_members │ │ usp_member_savings │
│ (Nasabah / Anggota) │───────►│ (Mutasi Simpanan Kas) │
│ │ │ │
│ • member_number (KTP) │ │ • savings_type │
│ • full_name │ │ • amount (SafeMoney) │
│ • phone_number │ │ • balance_after │
│ • credit_score │ └─────────────────────────┘
└────────────┬────────────┘
 │ member_id
 ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ usp_loans │ │ usp_loan_repayments │
│ (Kontrak Pinjaman) │───────►│ (Angsuran Bulanan) │
│ │ │ │
│ • loan_number │ │ • installment_number │
│ • principal_amount │ │ • principal_paid │
│ • interest_rate │ │ • interest_paid │
│ • collectibility (1-5) │ │ • penalty_paid │
│ • loan_status │ │ • payment_method │
└────────────┬────────────┘ └─────────────────────────┘
 │ loan_id
 ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│usp_inter_unit_collateral│ │ journal_entries │
│ (Agunan Lintas Unit) │ │ (Buku Jurnal SAK EP) │
│ │ │ │
│ • source_unit_id │ │ • entry_number │
│ • asset_reference_no │ │ • debit/kredit lines │
│ • lock_status │ │ • coa_id (Suffix .05) │
└─────────────────────────┘ └─────────────────────────┘

2. Struktur Tabel Basis Data Inti#

2.1 Tabel usp_members (Data Induk Nasabah)

  • id (UUID, Primary Key): Identifikator unik nasabah.
  • unit_id (UUID, Foreign Key ke business_units.id): Penguncian data pada unit USP-01.
  • member_number (VARCHAR(30), Unique): Nomor Induk Anggota (Format: USP/MBR/YYYY/XXXX).
  • nik (VARCHAR(16), Terenkripsi): Nomor Induk Kependudukan sesuai KTP.
  • full_name (VARCHAR(100)): Nama lengkap nasabah.
  • address (TEXT): Alamat domisili RT/RW di desa.
  • latitude / longitude (NUMERIC(10,7)): Titik koordinat GPS domisili nasabah.
  • credit_score (INTEGER): Skor kelayakan pinjaman (0 - 100).
  • status (VARCHAR(20)): Status keanggotaan (active, suspended, closed).

2.2 Tabel usp_loans (Data Kontrak Pinjaman)

  • id (UUID, Primary Key): Identifikator unik pinjaman.
  • loan_number (VARCHAR(50), Unique): Nomor kontrak kredit (Format: USP/LN/YYYY/XXXX).
  • member_id (UUID, Foreign Key ke usp_members.id): Pemilik pinjaman.
  • principal_amount (NUMERIC(15,2)): Plafon pokok pinjaman yang disetujui.
  • interest_rate (NUMERIC(5,2)): Suku bunga tahunan/bulanan.
  • tenor_months (INTEGER): Jangka waktu pinjaman dalam bulan.
  • outstanding_balance (NUMERIC(15,2)): Sisa pokok pinjaman yang belum terbayar (Baki Debet).
  • collectibility (INTEGER): Tingkat kelancaran pembayaran (1=Lancar, 2=DPK, 3=KL, 4=Diragukan, 5=Macet).
  • status (VARCHAR(20)): Status pinjaman (draft, approved, active, repaid, defaulted).

2.3 Tabel usp_loan_repayments (Mutasi Angsuran)

  • id (UUID, Primary Key): Identifikator unik pembayaran.
  • loan_id (UUID, Foreign Key ke usp_loans.id): Tautan ke kontrak pinjaman.
  • installment_number (INTEGER): Nomor urut angsuran (misal: angsuran ke-3 dari 12).
  • principal_paid (NUMERIC(15,2)): Porsi pembayaran pokok.
  • interest_paid (NUMERIC(15,2)): Porsi pembayaran bunga jasa.
  • penalty_paid (NUMERIC(15,2)): Denda keterlambatan jika ada.
  • collector_id (UUID, Foreign Key ke profiles.id): Petugas kolektor penagih.
  • collector_latitude / collector_longitude (NUMERIC(10,7)): Koordinat GPS saat pembayaran diterima.

3. Transaksi Atomik & Prosedur Transaksional Finansial (Atomic RPC)#

Untuk mencegah terjadinya race condition, saldo gantung, atau selisih pembukuan saat penarikan/penyetoran simultan, sistem mengandalkan fungsi basis data atomik:

sql
-- Prosedur Atomik Penyetoran/Penarikan Tabungan Anggota
CREATE OR REPLACE FUNCTION increment_member_savings_balance(
 p_member_id UUID,
 p_amount NUMERIC(15,2),
 p_savings_type VARCHAR(20),
 p_operator_id UUID
) RETURNS NUMERIC(15,2) AS **DECLARE v_new_balance NUMERIC(15,2); BEGIN -- Kunci baris data anggota untuk mencegah operasi konkuren simultan PERFORM 1 FROM usp_members WHERE id = p_member_id FOR UPDATE; -- Update saldo tabungan sukarela UPDATE usp_members SET vol_savings_balance = vol_savings_balance + p_amount, updated_at = NOW() WHERE id = p_member_id RETURNING vol_savings_balance INTO v_new_balance; -- Validasi saldo tidak boleh negatif IF v_new_balance < 0 THEN RAISE EXCEPTION 'Saldo tidak mencukupi untuk melakukan penarikan!'; END IF; -- Catat riwayat mutasi INSERT INTO usp_member_savings ( member_id, amount, savings_type, balance_after, created_by ) VALUES ( p_member_id, p_amount, p_savings_type, v_new_balance, p_operator_id ); RETURN v_new_balance; END;** LANGUAGE plpgsql SECURITY DEFINER;

4. Keamanan Baris Data (Row-Level Security / RLS)#

  1. Akses Data Staf Loket (staff / operator):
  • Hanya dapat membaca dan menginput transaksi nasabah di unit USP-01. Dilarang mengubah data kontrak kredit yang telah berstatus approved.
  1. Akses Petugas Kolektor (kolektor):
  • Hanya dapat melihat daftar tagihan nasabah yang ditugaskan di wilayah/dusun kerjanya dan menginput setoran angsuran dengan validasi lokasi GPS.
  1. Akses Super Admin & Direktur (super_admin / direktur):
  • Akses menyeluruh untuk otorisasi plafon pinjaman di atas Rp 10.000.000, restrukturisasi kredit, dan persetujuan penghapusbukuan kredit macet (write-off).

Apakah panduan ini membantu Anda?