Blueprint Sistem Audit Trail & Forensik
🛡️ BLUEPRINT SISTEM AUDIT TRAIL & LOG AKTIVITAS FORENSIK
Standar Tata Kelola, Jejak Digital, dan Pengawasan Mutasi Sistem ERP BUMDes#
BUMDes Bolulango — Kabupaten Boalemo, Gorontalo Standar Kepatuhan Permendesa PDTT No. 3/2021, SAK EP, & Standar Pengawasan BPKP / Inspektorat Daerah
🏛️ 1. Latar Belakang & Urgensi Tata Kelola#
Dalam tata kelola keuangan dan operasional badan usaha milik desa yang mengelola 25+ unit usaha produktif, transparansi dan non-repudiation (asas tidak dapat disangkal) merupakan prasyarat mutlak akuntabilitas publik.
Setiap mutasi data sensitif, seperti:
- Perubahan & Penghapusan Jurnal Keuangan: Risiko manipulasi saldo atau penghapusan transaksi mencurigakan.
- Pembatalan / Tutup Buku (Period Closing & Reopening): Tindakan membuka kembali periode yang sudah ditutup untuk memasukkan data historis atau perbaikan pembukuan.
- Pemberian & Perubahan Peran Pengguna (Privilege Escalation): Pengubahan wewenang kasir, admin gudang, atau bendahara.
- Restrukturisasi & Penghapusbukuan Piutang (USP): Tindakan write-off pinjaman macet yang rawan penyalahgunaan wewenang.
Untuk mencegah terjadinya kecurangan (fraud), sistem ERP BUMDes Bolulango mengimplementasikan Modul Audit Trail & Log Aktivitas Forensik berbasis tabel public.audit_logs dengan perlindungan ketat di tingkat basis data.
Memuat diagram alur...
🗄️ 2. Struktur Basis Data & Model Data (audit_logs)#
Tabel audit_logs didesain secara append-only (hanya bisa menambah record, tidak diizinkan pengeditan manual).
2.1. Skema Tabel PostgreSQL
sqlCREATE TABLE IF NOT EXISTS public.audit_logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), actor_id UUID REFERENCES public.profiles(id) ON DELETE SET NULL, action VARCHAR(64) NOT NULL, module VARCHAR(64) NOT NULL, details JSONB DEFAULT '{}'::jsonb, status VARCHAR(20) DEFAULT 'success', ip_address VARCHAR(45) NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Indeks Kinerja Kueri Forensik CREATE INDEX IF NOT EXISTS idx_audit_logs_actor ON public.audit_logs(actor_id); CREATE INDEX IF NOT EXISTS idx_audit_logs_module ON public.audit_logs(module); CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON public.audit_logs(created_at DESC); CREATE INDEX IF NOT EXISTS idx_audit_logs_action ON public.audit_logs(action);
2.2. Kamus Data Atribut
| Kolom | Tipe Data | Keterangan |
|---|---|---|
id | UUID | Kunci primer unik otomatis. |
actor_id | UUID | ID pengguna yang melakukan aksi (merujuk ke profiles.id). Bernilai NULL jika operasi dilakukan oleh CLI/Sistem latar belakang. |
action | VARCHAR(64) | Aksi operasional: CREATE, UPDATE, DELETE, LOGIN, LOGOUT, REVERT_CLOSING_PERIOD, MIGRATION_TOGGLE, dll. |
module | VARCHAR(64) | Modul asal: FINANCE, TREASURY, CLOSING, COA_MAPPING, USP, INVENTORY, RBAC, dll. |
details | JSONB | Metadata kaya yang memuat data sebelum/sesudah, nomor referensi, alasan perubahan, dan nominal. |
status | VARCHAR(20) | Status eksekusi: success, error, warning. |
ip_address | VARCHAR(45) | Alamat IP pengeksekusi untuk pelacakan lokasi akses. |
created_at | TIMESTAMPTZ | Waktu pencatatan presisi tinggi terkunci zona waktu UTC/WITA. |
🔐 3. Arsitektur Keamanan & Kebijakan Row-Level Security (RLS)#
3.1. Klasifikasi RLS Tier 5 (Admin-Only / Service-Role)
Tabel audit_logs digolongkan ke dalam Tier 5 RLS, di mana tidak ada kebijakan baris publik (no user row policies). Artinya:
- Pengguna biasa (koneksi anon / authenticated standar) secara mutlak tidak dapat membaca maupun memanipulasi tabel
audit_logs. - Kueri pembacaan dan penulisan hanya dapat dijalankan melalui
createAdminClient()yang diverifikasi di sisi server (Server Action) setelah melewati pengecekan peran pengguna.
3.2. Implementasi Server Action Terpusat (audit.ts)
typescriptimport { createAdminClient } from '@/lib/supabase/service' import { getCurrentUser } from '@/lib/auth' export async function getAuditLogs(limit = 100) { const user = await getCurrentUser() // Guard Otorisasi: Hanya peran pengawas/eksekutif yang diizinkan melihat log if (!user?.profile?.role || !['super_admin', 'admin_keuangan', 'direktur'].includes(user.profile.role)) { return [] } const supabase = createAdminClient() const { data, error } = await supabase .from('audit_logs') .select(` *, profiles (full_name, role) `) .order('created_at', { ascending: false }) .limit(limit) if (error) { console.error('Error fetching audit logs:', error) return [] } return data || [] }
🖥️ 4. Antarmuka Visualisasi Pengawasan (UI/UX)#
Sistem menyediakan 2 titik akses antarmuka untuk meninjau log aktivitas:
4.1. Visualizer Utama: /dashboard/pengguna (Tab: Log Aktivitas)
Komponen AuditLogVisualizer.tsx menyajikan antarmuka visual komprehensif:
- Kartu Ringkasan Eksekutif (4 KPI Cards):
- Total Aktivitas: Akumulasi seluruh log yang terekam.
- Tingkat Keberhasilan: Rasio aksi
status === 'success'dalam persentase dengan progress bar dinamis. - Tindakan Sensitif: Jumlah operasi kritis (
DELETEatauUPDATE) pada data master/keuangan. - Kegagalan Sistem: Jumlah aksi berstatus
erroryang tertangkap sistem.
- Visualisasi Analitik Recharts:
- Tren Aktivitas (7 Hari): Grafik area interaktif yang menunjukkan volume mutasi per hari dalam sepekan terakhir.
- Distribusi Modul: Donut chart persentase aktivitas per modul sistem (
FINANCE,COA_MAPPING,RBAC, dll).
- Penyaring Interaktif (Filter & Search):
- Pencarian real-time berdasarkan nama operator, modul, jenis aksi, atau teks di dalam JSON detail.
- Dropdown filter modul dinamis.
- Tabel Riwayat Rinci:
- Menampilkan ikon status (hijau/merah), tanggal, nama aktor & peran, badge aksi, dan tombol modal detail.
4.2. Panel Jejak Cepat: /dashboard/pengaturan (Tab: Database)
Komponen DatabaseSettingsTab.tsx menyediakan ringkasan 10 log aktivitas administratif terbaru untuk inspeksi berkala administrator sistem saat memantau status kesehatan database.
🗺️ 5. Peta Jalan Pengembangan (Evolution Roadmap)#
Untuk meningkatkan kepatuhan tata kelola BUMDes berstandar audit profesional, ditetapkan 5 Fase Pengembangan Modul Audit Trail:
Memuat diagram alur...
🚩 Fase 1: Otomasi Pencatatan Mutasi Sistem (System-Wide Auto-Hooking) - [SELESAI]
Menghubungkan fungsi createLog() ke setiap Server Action kritikal tanpa bergantung pada input manual:
- Modul Jurnal & Transaksi Kas:
- Hook saat pembuatan jurnal manual (
createManualJournalEntry). - Hook saat edit transaksi kas / BKK / BKM (
createTreasuryTransaction). - Hook saat konfirmasi setoran fisik kas (
confirmCashRemittance). - Modul Tutup Buku & Periode Akuntansi:
- Hook saat pembatalan tutup buku (
revert_sept_2025_closing). - Modul Mode Migrasi & Unit Usaha:
- Hook saat status
is_migration_modediaktifkan atau dimatikan oleh Super Admin (updateBusinessUnit). - Hook saat perubahan status operasional unit usaha.
- Modul Simpan Pinjam Syariah (USP):
- Hook persetujuan pinjaman, pencairan dana, restrukturisasi jadwal angsuran, dan write-off pinjaman macet.
- Modul Keamanan & Akun:
- Hook login berhasil dan login gagal (deteksi percobaan peretasan).
- Hook pergantian role pengguna dan pembuatan pengguna baru.
🚩 Fase 2: Pelaporan & Ekspor Kepatuhan Audit (Compliance Export) - [SELESAI]
Menyediakan dokumen formal fisik untuk diserahkan kepada auditor eksternal:
- Ekspor PDF Resmi Berita Acara Jejak Audit:
- Kop Resmi BUMDes Bolulango lengkap dengan identitas sistem & nomor dokumen dinamis (
BA-AUDIT/YYYY/MM/DD). - Tata letak Landscape A4 dengan tabel kronologis aktivitas audit ber-cap waktu terotentikasi.
- Lembar pengesahan Tiga Pilar Audit: Bendahara BUMDes, Ketua BPD / Dewan Pengawas, dan Direktur Utama BUMDes.
- Ekspor Berkas Excel / CSV:
- Unduhan instan seluruh log yang terfilter untuk analisis spreadsheet auditor BPKP (Excel
.xlsxmulti-sheet & CSV UTF-8).
🚩 Fase 3: Penyaring Rentang Waktu & Unit Usaha (Advanced Filtering) - [SELESAI]
Memudahkan auditor memeriksa kasus spesifik:
- Komponen Date Range Picker: Pemilihan
Tanggal Mulais/dTanggal Selesailengkap dengan preset kilat (Hari Ini, 7 Hari Terakhir, Bulan Ini). - Filter Multi-Pilihan Unit Usaha: Pemilahan mutasi per unit (
Holding Pusat,USP-01,KTPG-PTR, dll) berdasarkan metadata transaksi dan profil staf. - Filter Berdasarkan Tingkat Urgensi (Severity Level):
- 🔴 Kritis (Critical): Aksi
DELETE,MIGRATION_MODE_TOGGLE,REVERT, atau statuserror. - 🟡 Peringatan (Warning): Aksi
UPDATE,UNIT_STATUS_UPDATE, atau statuswarning. - 🔵 Informasi (Informational): Aksi
CREATE, entri jurnal baru, login, dan mutasi normal.
🚩 Fase 4: Modal Forensik Perbandingan Data (Diff Viewer) - [SELESAI]
Memperlihatkan apa saja yang diubah oleh pengguna:
- Modal Forensik Interaktif Layar Lebar: Dialog komprehensif (
max-w-4xl) dengan 3 tab navigasi: Komparasi Visual, Payload Mentah JSON, dan Forensik Jaringan. - Tampilan Komparasi Berdampingan (Side-by-Side Diff):
- Data Lama (Old Value): Penanda merah lembut (
rose-50/rose-900) untuk nilai sebelum mutasi. - Data Baru (New Value): Penanda hijau lembut (
emerald-50/emerald-900) untuk nilai setelah mutasi. - Kalkulator Deviasi Finansial Dinamis: Perhitungan otomatis selisih nominal (Δ rupiah) dan persentase perubahan pada transaksi finansial yang mengalami revisi saldo.
- Tombol Salin Cepat JSON: Mempermudah penarikan bukti forensik digital ke clipboard.
🚩 Fase 5: Deteksi Anomali Cerdas & Early Warning System (EWS Security)
Proteksi dini pencegahan penggelapan dana:
- Threshold Alert: Memberi bendera peringatan pada mutasi kas tunai di atas Rp 5.000.000 tanpa persetujuan berjenjang.
- Out-of-Hours Alert: Deteksi dan penandaan mutasi yang diinput di luar jam kerja operasional kantor desa (misal antara pukul 23:00 - 05:00 WITA).
- Rapid Deletion Watcher: Peringatan instan ke Direktur jika ada akun staf yang menghapus lebih dari 3 entri dalam kurun waktu 5 menit.
📝 6. Standar Penulisan Log Aktivitas (createLog)#
Setiap pengembang wajib mengikuti konvensi penulisan payload saat menambahkan hook audit baru:
typescriptimport { createLog } from '@/lib/actions/audit' // Contoh Standar Pencatatan Aksi Finansial: await createLog({ action: 'REVERT_CLOSING_PERIOD', // Gunakan huruf kapital baku module: 'FINANCE', // Nama modul sistem standar status: 'success', // 'success' | 'error' | 'warning' details: { reference_number: 'CLOSE-PUSAT-2025-09', period_month: 9, period_year: 2025, reason: 'Migrasi data historis 12 bulan lampau', affected_tables: ['financial_closings', 'journal_entries', 'depreciation_logs'] } })
Pusat Dokumentasi Sistem ERP BUMDes Bolulango — Blueprint Arsitektur Teknis Tata Kelola & Audit Trail v2026.1.