18

Audit Modul Pusat Administrasi & Keabsahan Digital

Updated: Sep 2026Oleh: SystemSistem ERP & Teknologi Inti

Laporan Audit Komprehensif: Modul Pusat Administrasi & Legalitas 🏛️📋

Tanggal Dokumen: 14 September 2026 Klasifikasi: Audit Sistem, Keamanan RBAC/RLS, & Standar Keabsahan Digital Modul Terkait:

  • Pusat Administrasi (/dashboard/administrasi)
  • Manajemen Template Dokumen (/dashboard/administrasi/templates)
  • Master Mitra Administrasi (/dashboard/administrasi/mitra/dashboard/master-data/mitra)
  • Action Handlers (lib/actions/official-docs.ts, lib/actions/units.ts, lib/actions/site.ts)
  • Komponen Cetak & Barcode (components/docs/OfficialDocPrint.tsx, components/docs/DigitalAuditTrail.tsx)
  • Basis Data (official_documents, document_sequences, Stored Procedures, & RLS Policies)

1. Ringkasan Eksekutif (Executive Summary)#

Modul Pusat Administrasi & Legalitas dirancang sebagai tulang punggung tata kelola dokumen formal, legalitas SK/Surat Tugas/Kontrak, serta desentralisasi identitas fisik dokumen (Kop, Syarat & Ketentuan PO/DO/Invoice, Rekening Bank) ke seluruh unit usaha BUMDes Bolulango.

Berdasarkan hasil audit mendalam terhadap kode sumber (source code review), arsitektur basis data (schema & triggers), otorisasi (RBAC & RLS), dan alur verifikasi publik, disimpulkan bahwa arsitektur modul ini memiliki fondasi konseptual yang kokoh (desentralisasi metadata JSONB dan penomoran otomatis PostgreSQL). Namun, modul ini memiliki kerentanan keamanan kritikal (P0), bug fatal pada query Supabase (P0), dan putusnya tautan verifikasi QR Code (P1) yang wajib diselesaikan sebelum sistem dinyatakan layak produksi (production-ready).

📊 Matriks Penilaian Kematangan Modul

Dimensi AuditSkorStatusRingkasan Temuan
Keamanan & Otorisasi (RBAC)45 / 100🔴 KRITISHalaman Template tidak memiliki proteksi role sama sekali. Server Action mutasi data tidak memvalidasi hak akses eksekutor.
Integritas Basis Data & Skema65 / 100🔴 KRITISString kosong "" pada UUID dan Date memicu crash PostgreSQL saat menerbitkan SK Holding BUMDes.
Keabsahan Digital & Audit Trail60 / 100🟠 PERHATIANQR Code mengarah ke rute /verify/[id] yang belum ada di aplikasi (Error 404 saat dipindai).
Engine Penomoran Dokumen80 / 100🟢 BAIKConcurrency-safe menggunakan Stored Procedure PL/pgSQL, namun belum memiliki mekanisme reset tahunan (annual reset).
Keandalan Cetak (Print Reliability)70 / 100🟡 CUKUPHardcoded timeout 500ms rentan menyebabkan halaman cetak kosong; belum ada dialog pratinjau (preview modal).
UI/UX & Aksesibilitas Tema65 / 100🟡 CUKUPTemplateManager.tsx masih mengandalkan warna latar putih statis (belum mendukung Dark Mode).

2. Arsitektur & Alur Kerja Modul#

Memuat diagram alur...

3. Bedah Temuan Mendalam per Pilar#

3.1. Pilar 1: Keamanan & Otorisasi Akses (RBAC & RLS)

🔴 Temuan SEC-01: Halaman Template Dokumen Terbuka Bebas (Bypass Otorisasi)

  • File: app/dashboard/administrasi/templates/page.tsx
  • Deskripsi Masalah: Halaman ini memuat daftar unit dan identitas situs tanpa memanggil getCurrentUser() maupun memverifikasi role pengguna.
  • Dampak Risiko: Pengguna dengan level staf apa pun (kasir toko, anak kandang peternakan, staf lapangan) yang mengetahui URL dapat membuka halaman ini dan mengubah:
  • Rekening Bank tujuan transfer pembayaran invoice unit.
  • Syarat & Ketentuan kontrak dan Purchase Order.
  • Alamat dan tagline resmi unit usaha.
  • Rekomendasi Perbaikan: Terapkan role guard pada Server Component:
typescript
const user = await getCurrentUser();
const allowedRoles = ['super_admin', 'direktur', 'sekretaris', 'manajer_unit'];
if (!user || !allowedRoles.includes(user.profile?.role)) {
redirect('/dashboard');
}

🔴 Temuan SEC-02: Server Actions Mutasi Data Tanpa Verifikasi Hak Akses

  • File:
  • Deskripsi Masalah: Fungsi-fungsi mutasi data di atas diekspos sebagai Server Action tanpa verifikasi identitas pemanggil. Siapa pun dapat memanggil fungsi deleteOfficialDocument(id) melalui RPC client dan menghapus dokumen legal berharga milik unit lain.
  • Rekomendasi Perbaikan: Validasi sesi dan kepemilikan unit (assigned_unit_id atau hak istimewa holding) sebelum menjalankan operasi update/delete.

🟠 Temuan SEC-03: RLS Policy Mengunci Dokumen Tingkat Holding BUMDes

sql
CREATE POLICY "unit_hierarchy_access" ON public.official_documents FOR ALL TO authenticated
USING (unit_id = ANY(public.get_my_accessible_unit_ids()) OR public.is_global_admin())

Pada dokumen tingkat Holding (SK Pengangkatan, Surat Edaran Direktur, AD/ART), kolom unit_id bernilai NULL. Dalam standar SQL, NULL = ANY(...) menghasilkan FALSE. Akibatnya, staf dan manajer unit tidak dapat melihat dokumen resmi yang diterbitkan holding, kecuali pengguna adalah super_admin/direktur.

  • Rekomendasi Perbaikan: Perbarui klausa RLS agar mengizinkan pembacaan dokumen ber-unit_id IS NULL:
sql
USING (unit_id IS NULL OR unit_id = ANY(public.get_my_accessible_unit_ids()) OR public.is_global_admin())

3.2. Pilar 2: Integritas Basis Data & Engine Penomoran

🔴 Temuan BUG-01: Runtime Crash PostgreSQL Akibat String Kosong ""

  • File:
  • Deskripsi Masalah: Formulir pembuatan dokumen menginisialisasi unitId: '' dan expiryDate: ''. Jika pengguna memilih unit "Seluruh Unit BUMDes" atau dokumen tanpa masa berlaku habis, nilai string kosong "" dikirim ke PostgreSQL. PostgreSQL menolak query dengan error:
  • invalid input syntax for type uuid: ""
  • invalid input syntax for type date: ""
  • Rekomendasi Perbaikan: Lakukan sanitasi input sebelum insert:
typescript
unit_id: formData.unitId ? formData.unitId : null,
expiry_date: formData.expiryDate ? formData.expiryDate : null,
created_by: user.id

🟢 Temuan ARCH-01: Penomoran Dokumen Atomic Namun Belum Reset Tahunan

  • File:
  • Deskripsi Masalah: Stored procedure get_next_doc_sequence berjalan concurrency-safe melalui klausa INSERT ... ON CONFLICT DO UPDATE. Namun, tabel document_sequences tidak menyimpan konteks tahun year. Saat berganti tahun dari 2026 ke 2027, nomor urut surat tidak mereset ke 001, melainkan terus bertambah secara kumulatif. Menurut tata naskah dinas standar, nomor urut surat resmi harus di-reset setiap pergantian tahun kalender.

3.3. Pilar 3: Keabsahan Digital & Portal Verifikasi Publik

🟠 Temuan PUB-01: Tautan Verifikasi QR Code Berstatus 404 (Broken Route)

  • File:
  • Deskripsi Masalah: Komponen DigitalAuditTrail merender QR Code yang mengarah ke: {baseUrl}/verify/{id} (contoh: https://www.bumdesbolulango.site/verify/doc-[verification_token]). Namun, pada struktur direktori aplikasi Next.js (app/), rute /verify/[id] belum pernah dibuat. Ketika dokumen dicetak fisik dan barcode dipindai oleh pihak luar (dinas, bank, mitra), layar smartphone menampilkan halaman 404 Not Found. Ini menurunkan kredibilitas digital sistem BUMDes.
  • Rekomendasi Perbaikan: Buat rute publik app/verify/[id]/page.tsx yang:
  1. Bersifat publik (tanpa login).
  2. Memverifikasi keaslian nomor dokumen, judul, tanggal terbit, dan status keabsahan.
  3. Menampilkan status cap digital sah: "DOKUMEN ASLI TERDAFTAR DI ERP BUMDES BOLULANGO".

3.4. Pilar 4: Keandalan Cetak, UI/UX, & Aksesibilitas Tema

🟡 Temuan UX-01: Race Condition pada Handler Cetak & Ketiadaan Preview

  • File: app/dashboard/administrasi/AdminDashboardClient.tsx:37-47
  • Deskripsi Masalah: Fungsi triggerPrint mengeksekusi window.print() dalam setTimeout(..., 500) dan langsung menonaktifkan tampilan cetak (setIsPrinting(false)). Jika peramban memuat aset logo atau barcode lebih dari 500ms, hasil cetak berisiko kosong atau terpotong. Selain itu, pengguna tidak memiliki opsi pratinjau (preview modal) di layar sebelum mencetak.
  • Rekomendasi Perbaikan: Ganti mekanisme tombol cetak langsung dengan Modal Dialog Pratinjau Dokumen. Pengguna dapat melihat tampilan A4 di layar, memeriksa klausul surat, dan menekan tombol cetak dengan opsi pembatalan yang jelas.

🟡 Temuan UI-01: Ketiadaan Dukungan Dark Mode pada TemplateManager.tsx

  • File: components/administrasi/TemplateManager.tsx
  • Deskripsi Masalah: Elemen-elemen visual pada editor template dikodekan dengan warna latar keras (bg-white, border-slate-100, bg-slate-50). Saat pengguna memilih mode gelap (Dark Mode), komponen ini tetap putih terang dan tidak harmonis dengan palet tema sistem.
  • Rekomendasi Perbaikan: Lengkapi seluruh elemen card, input, dan sidebar dengan kelas padanan tema gelap Tailwind (dark:bg-slate-900, dark:border-white/10, dark:text-white).

4. Register Kerentanan & Matriks Tindakan#

IDPrioritasKomponen TerkaitDampak RisikoTindakan Perbaikan
SEC-01🔴 P0 (Kritis)app/dashboard/administrasi/templates/page.tsxBypass otorisasi; data perbankan unit dapat diubah staf tanpa wewenang.Pasang otentikasi role guard server-side.
SEC-02🔴 P0 (Kritis)lib/actions/units.ts & lib/actions/official-docs.tsEksekusi server action mutasi data tanpa otentikasi sesi.Tambahkan validasi sesi getCurrentUser() dan isolasi unit.
BUG-01🔴 P0 (Kritis)DocEditor.tsx & lib/actions/official-docs.tsGagal menerbitkan SK tingkat Holding BUMDes atau SK permanen.Sanitasi string kosong menjadi null sebelum query database.
DB-01🟠 P1 (Tinggi)006_row_level_security_policies.sqlRLS menyembunyikan SK Holding BUMDes dari manajer dan staf unit.Revisi klausa SQL RLS untuk mendukung unit_id IS NULL.
PUB-01🟠 P1 (Tinggi)DigitalAuditTrail.tsx & Direktori app/QR Code menghasilkan 404; dokumen cetak tidak dapat diverifikasi keasliannya.Bangun halaman publik verifikasi /verify/[id].
UX-01🟡 P2 (Sedang)AdminDashboardClient.tsxRisiko cetakan kosong dan hilangnya kontrol pratinjau pengguna.Rancang Modal Dialog Preview Dokumen Resmi sebelum cetak.
UI-01🟡 P2 (Sedang)TemplateManager.tsxKetidakkonsistenan tampilan saat tema gelap diaktifkan.Terapkan styling responsif Tailwind Dark Mode (dark:*).
ARCH-01🟢 P3 (Rendah)005_stored_procedures_and_triggers.sqlNomor urut dokumen tidak mereset di awal tahun kalender baru.Tambahkan skema tahunan pada document_sequences.

5. Rencana Aksi Perbaikan Bertahap (Remediation Roadmap)#

Memuat diagram alur...
  1. Fase 1 (P0 Kritis - Telah Selesai):
  • Menutup celah otorisasi pada /dashboard/administrasi/templates.
  • Mengamankan server actions updateUnitTemplates dan deleteOfficialDocument.
  • Menyelesaikan bug casting type UUID/Date pada createOfficialDocument dan menambahkan pencatatan created_by.
  1. Fase 2 (P1 Tinggi - Integritas Keabsahan - Telah Selesai):
  • Mengimplementasikan endpoint verifikasi publik /verify/[id] yang aman, informatif, dan responsif untuk pemindaian via smartphone.
  • Memperbaiki klausa RLS PostgreSQL agar dokumen holding dapat diakses secara transparan oleh seluruh personil BUMDes.
  • Mengganti print timeout 500ms dengan Modal Pratinjau Dokumen Cetak (OfficialDocPreviewModal.tsx).
  1. Fase 3 (P2/P3 - UI Polish & Standarisasi Dinas - Telah Selesai):
  • Menyelaraskan tema gelap (Dark Mode) pada TemplateManager.tsx.
  • Memperbarui stored procedure nomor sequence agar mencatat tahun dan mereset setiap tanggal 1 Januari (169_annual_reset_doc_sequences.sql).
  • Standarisasi nama entitas BUMDes menjadi BUMDes Bolulango di seluruh komponen cetak dan verifikasi.
  1. Fase 4 (Manajemen Stempel & Fitur Ekspor - Telah Selesai):
  • Tab "Stempel & Legalitas" pada Template Manager untuk upload cap basah dan TTD digital.
  • Fitur Ekspor CSV berstandar RFC-4180 dengan UTF-8 BOM pada tabel dokumen dinas.
  • 4 Quick Stats Cards (Total, Aktif, Segera Kedaluwarsa, Kedaluwarsa) dan filter multi-kriteria.
  1. Fase 5 (Pengesahan Laporan Keuangan SAK EP - Telah Selesai):
  • Penerapan stempel basah BUMDes Bolulango dan tanda tangan digital Direktur & Bendahara pada cetak Neraca, Laba Rugi, BKU, dll.
  • Validasi QR Code finansial publik (bs-, pl-, bku-, cf-, dsb.) pada /verify/[id] sesuai standar SAK EP dan PP No. 11/2021.

Dokumen ini merupakan catatan audit resmi dan telah diselesaikan seluruh rekomendasinya per September 2026.

Apakah panduan ini membantu Anda?