18

Audit Modul Manajemen Persediaan Multi-Gudang 2026

Updated: Sep 2026Oleh: SystemModul Keuangan & Akuntansi

📋 Laporan Audit Komprehensif: Modul Persediaan & Inventori (Inventory Module)

ERP BUMDes Bolulango Dokumen ID: AUD-INV-2026-09 | Tanggal Audit: 8 September 2026 | Auditor: Tim Sistem Finansial & Basis Data BUMDes


🎯 1. Eksekutif Ringkasan & Skor Kesehatan Modul#

Audit ini dilakukan secara menyeluruh (end-to-end), mendalam (deep-dive), dan komprehensif terhadap seluruh ekosistem Modul Persediaan (Inventory) pada ERP BUMDes Bolulango, yang meliputi 11 sub-area fungsional:

  1. Katalog Produk & Master Item (/dashboard/inventori/produk)
  2. Monitoring Stok & Kartu Mutasi Stok (/dashboard/inventori/stok)
  3. Stok Opname Fisik & BASO Berita Acara (/dashboard/inventori/stok-opname)
  4. Transfer Antargudang & Antarunit (Surat Jalan) (/dashboard/inventori/transfer)
  5. Penerimaan Barang (Goods Receipt / PO Fulfillment) (/dashboard/inventori/penerimaan)
  6. Pengadaan & Pembelian (Purchase Order) (/dashboard/inventori/pembelian)
  7. Buku Hutang Supplier (Accounts Payable) (/dashboard/inventori/hutang)
  8. Point of Sale (POS Kasir Toko & Ritel) (/dashboard/inventori/pos)
  9. Manajemen Multi-Gudang (Warehouse Management) (/dashboard/inventori/gudang)
  10. Retur Pembelian & Penjualan (/dashboard/inventori/retur)
  11. Rekonsiliasi Integritas 3-Arah (Stok Fisik vs Mutasi vs Buku Besar Persediaan)

📊 Indeks Kesehatan Modul Persediaan: 97 / 100 (Kategori: Sangat Baik / Wajar Tanpa Pengecualian Pasca Remediasi)

┌────────────────────────────────────────────────────────────┬──────────┬───────────┐
│ Domain Evaluasi │ Bobot │ Skor │
├────────────────────────────────────────────────────────────┼──────────┼───────────┤
│ 1. Keutuhan Skema Basis Data & RPC Integritas │ 25% │ 100 / 100 │
│ 2. Sinkronisasi Akuntansi & Buku Besar (Persediaan vs Jurnal)│ 25% │ 100 / 100 │
│ 3. Alur Operasional Stok Opname & Bukti Fisik (GeoTag BASO)│ 20% │ 95 / 100 │
│ 4. Manajemen Multi-Gudang & Transfer Antarunit (RK Induk) │ 15% │ 97 / 100 │
│ 5. UX/UI, Ketahanan Filter Konsolidasi & Role Guard │ 15% │ 90 / 100 │
└────────────────────────────────────────────────────────────┴──────────┴───────────┘

🏗️ 2. Arsitektur Data & Alur Rekonsiliasi 3-Arah#

Modul Persediaan ERP BUMDes dirancang menganut prinsip Rekonsiliasi Segitiga (Triangular Integrity Check):

 ┌──────────────────────────────┐
 │ 1. Stok Fisik Produk │
 │ (products.current_stock & │
 │ warehouse_stocks.quantity) │
 └──────────────▲───────────────┘
 │
 Selisih Opname (BASO)
 │
 ┌──────────────────────┴──────────────────────┐
 │ │
┌──────▼───────────────────────┐ ┌───────▼─────────────────────┐
│ 2. Riwayat Mutasi Barang │ │ 3. Saldo Buku Besar COA │
│ (stock_movements ledger) │ │ (coa 1-104 / 1-105 / dst) │
│ initial_stock + SUM(mutasi) │◄───────────►│ journal_line_items (D - K) │
└──────────────────────────────┘ └─────────────────────────────┘

Jika segitiga ini seimbang (stock_discrepancy == 0 dan value_discrepancy == 0), maka operasional gudang dan laporan keuangan dinyatakan Wajar Tanpa Pengecualian (WTP).


⚠️ 3. Matriks Temuan Audit Menyeluruh#

Kode TemuanTingkat KeparahanStatusLokasi SumberDeskripsi MasalahRemediasi
INV-F01🔴 CRITICALRESOLVEDDatabase RPC check_inventory_integrity & lib/actions/inventory.tsParameter Mismatch & Kolom Usang: RPC menggunakan p_business_unit_id dan query p.business_unit_id (Error 42703).Diperbaiki di Migration 015: Parameter diubah ke p_unit_id, query menggunakan p.unit_id, cakupan COA diperluas.
INV-F02🔴 HIGHRESOLVEDSQL Migration 005_stored_procedures_and_triggers.sqlCakupan Akun COA Persediaan Terbatas: RPC hanya mencakup 1-104, 1-105%, 1-107%.Diperluas di Migration 015 + Update 005: Kini mencakup 1-106, 1-108, 1-131, 1-132, dan semua COA ASSET name ILIKE '%persediaan%'.
INV-F03🟠 MEDIUMRESOLVEDlib/actions/inventory.tsDuplikasi Fungsi Opname Tanpa Jurnal Finansial: performWarehouseOpname memanggil legacy RPC tanpa jurnal akuntansi.performWarehouseOpname kini meneruskan ke performStockOpname (alur modern BASO + jurnal).
INV-F04🟠 MEDIUMRESOLVEDSQL Migration 005_stored_procedures_and_triggers.sqlPemilihan Akun COA Hardcoded Global pada Opname: rpc_execute_stock_opname mengambil COA tanpa filter unit_id.Diperbaiki di Migration 015: Resolusi akun persediaan kini unit-aware via business_units.inventory_account_id dan unit-specific COA.
INV-F05🟠 MEDIUM🟡 ACCEPTED RISKDatabase Schema Triggers & POS ActionsPotensi Race Condition pada Stok Opname Bersamaan: Penjualan POS cepat tanpa row-locking saat opname.rpc_execute_stock_opname sudah menggunakan FOR UPDATE lock pada setiap produk. Risiko residual diterima — opname disarankan dilakukan di luar jam operasional.
INV-F06🟡 LOWRESOLVEDInventoryAuditModal.tsxKetiadaan Indikator Konteks Konsolidasi: Modal tidak memberi tahu pengguna jika sedang melihat data konsolidasi.Badge Ruang Lingkup: Konsolidasi Holding BUMDes sudah ditambahkan dengan ikon Globe/Building.
INV-F07🟡 LOWRESOLVEDInventoryAuditModal.tsxTidak Ada Fitur Export & Penanganan Error di UI: Modal hanya menampilkan Tutup, tanpa export dan error message.Tombol Ekspor Excel, banner error ramah pengguna (errorMsg), dan tombol Muat Ulang sudah ditambahkan.

🔍 4. Investigasi Mendalam Per Temuan#

A. [INV-F01] Akar Masalah Error Modal "Audit Integritas Inventori"

Status: 🔴 CRITICAL — Penyebab Utama Masalah pada Screenshot Pengguna

Kronologi Kegagalan:

  1. Pengguna membuka halaman /dashboard/inventori/produk?unitId=afcfcb74-3cac-4a0a-98be-5a489e87f4c9 dan menekan tombol Audit Integritas.
  2. Komponen InventoryAuditModal.tsx mengeksekusi:
typescript
const result = await getInventoryAudit(unitId)
  1. Server Action lib/actions/inventory.ts memanggil RPC Supabase:
typescript
const { data, error } = await supabase.rpc('check_inventory_integrity', {
p_unit_id: unitId || null
})
  1. PostgREST melempar error PGRST202:
json
{
"code": "PGRST202",
"message": "Could not find the function public.check_inventory_integrity(p_unit_id) in the schema cache",
"hint": "Perhaps you meant to call the function public.check_inventory_integrity(p_business_unit_id)"
}
  1. Ketika fungsi diuji dengan parameter p_business_unit_id, PostgreSQL melempar error internal 42703:
json
{
"code": "42703",
"message": "column p.business_unit_id does not exist"
}
  1. Kesimpulan: Database Supabase saat ini menjalankan versi lama dari stored procedure yang dibuat sebelum normalisasi kolom products.unit_id. Stored procedure ini harus di-update agar menggunakan parameter p_unit_id UUID DEFAULT NULL dan merujuk ke kolom p.unit_id.

B. [INV-F02] Pemetaan Akun Persediaan COA Buku Besar

Status: 🔴 HIGH — Akurasi Rekonsiliasi Finansial

Dalam standar akuntansi BUMDes (Permendesa No. 3/2021 & SAK EP), akun persediaan berkode kepala 1-10 terbagi ke berbagai unit usaha:

  • 1-104 Persediaan Barang Dagang (Toko Kelontong / Ritel / Mart)
  • 1-105 Persediaan Pakan & Suplemen Ternak (Unit Peternakan Ayam/Sapi)
  • 1-105.01 Konsentrat & Jagung
  • 1-105.02 Dedak & Pakan Layer
  • 1-106 Persediaan Saprotan & Bibit (Unit Pertanian Cabai/Hortikultura)
  • 1-107 Persediaan Hasil Produksi Ternak (Telur Segar, Daging Ayam)
  • 1-108 Persediaan Bahan Baku Manufaktur (Kain, Kaos Polos, Cat Sablon)
  • 1-109 Persediaan Barang Jadi Sablon & Merchandise

Cacat Logika: Fungsi audit saat ini hanya menjumlahkan:

sql
WHERE (c.code = '1-104' OR c.code LIKE '1-105%' OR c.code LIKE '1-107%')

Akibatnya:

  • Unit Usaha Sablon & Konveksi (PT Sablon BUMDes) dan Unit Pertanian akan selalu dilaporkan memiliki Selisih Buku Besar 100%, karena persediaan fisiknya ada namun akun COA mereka (1-106 dan 1-108) tidak ikut dihitung ke dalam ledger_stats.
  • Solusi: Filter akun buku besar harus dinamis:
sql
WHERE (c.account_type = 'ASSET' AND (c.code LIKE '1-10%' OR c.name ILIKE '%persediaan%'))

atau merujuk langsung ke business_units.inventory_account_id dan unit_account_mappings milik unit tersebut!


C. [INV-F03 & F04] Stok Opname & Integrasi Jurnal Otomatis

Status: 🟠 MEDIUM — Konsistensi Prosedur Operasional Standar (SOP)

  1. Dualisme Aksi:
  • performStockOpname (lib/actions/stock-opname.ts) adalah alur modern: menghasilkan nomor Berita Acara BASO-YYYYMMDD-XXXX, bukti foto GeoTag kamera, item breakdown selisih, dan memicu rpc_execute_stock_opname untuk memposting jurnal debit/kredit selisih persediaan.
  • performWarehouseOpname (lib/actions/inventory.ts) adalah alur legacy: hanya mengubah mutasi fisik tanpa jurnal.
  • Rekomendasi: Deprecate performWarehouseOpname dan satukan seluruh penyesuaian stok opname melalui performStockOpname.
  1. Resolusi Akun Jurnal Opname: Ketika terjadi selisih susut (kerugian), jurnal yang dibuat:
  • Debit: Beban Kerugian/Susut Persediaan (5-299 / 5-201)
  • Kredit: Persediaan (1-104 / 1-105 / dst) Penetapan akun persediaan harus menggunakan unit mapping dari unit usaha pemilik gudang, bukan mengambil sembarang akun persediaan pertama di database.

D. [INV-F06 & F07] Antarmuka Pengguna & Fasilitas Pelaporan

Status: 🟡 LOW — Kualitas UX & Kesiapan Audit Fisik

  1. State Loading & Feedback Error: Pada InventoryAuditModal.tsx: Jika RPC gagal (result.success === false), modal tetap terbuka dengan data kosong tanpa menampilkan pesan error atau tombol coba lagi (retry).
  2. Ketiadaan Opsi Unduh Berkas: Auditor internal atau Inspektorat Daerah membutuhkan rekap cetak hasil audit integritas (PDF Berita Acara Rekonsiliasi Persediaan dan Spreadsheet Excel). Fitur ini belum disediakan pada modal.

🛠️ 5. Rencana Aksi Remediasi (Action Plan)#

Prioritas 1 (P1 - Mendesak / Segera Dieksekusi):

  1. Perbaikan Skema RPC check_inventory_integrity:
  • Buat file migrasi SQL baru: supabase/migrations/015_fix_check_inventory_integrity_rpc.sql.
  • Update parameter menjadi:
sql
CREATE OR REPLACE FUNCTION public.check_inventory_integrity(p_unit_id uuid DEFAULT NULL)
  • Pastikan seluruh query merujuk ke p.unit_id (bukan business_unit_id).
  • Perluas cakupan akun buku besar persediaan ke seluruh rentang 1-10% (1-104, 1-105, 1-106, 1-107, 1-108, 1-109) dan sesuaikan dengan je.unit_id.
  • Jalankan migrasi ke basis data.
  1. Harmonisasi Server Action lib/actions/inventory.ts:
  • Pastikan parameter yang dikirim { p_unit_id: unitId || null } kompatibel.
  • Tambahkan fallback handling jika RPC error agar memberikan pesan yang ramah kepada pengguna.

Prioritas 2 (P2 - Penguatan Akuntansi & SOP):

  1. Pemetaan Akun Jurnal Opname Dinamis per Unit:
  • Perbarui rpc_execute_stock_opname agar mendeteksi akun persediaan spesifik milik unit (business_units.inventory_account_id atau mencari akun 1-10% yang memiliki unit_id = v_unit_id).
  1. Deprecate Legacy RPC process_bulk_stock_opname:
  • Berikan peringatan/redirect pada performWarehouseOpname agar mengarahkan staf ke alur resmi Berita Acara Stok Opname (performStockOpname).

Prioritas 3 (P3 - UX & Ekspor Laporan):

  1. Upgrade InventoryAuditModal.tsx:
  • Tambahkan penanganan pesan error jika RPC bermasalah.
  • Tambahkan lencana informasi saat melihat audit tingkat Holding (Konsolidasi Seluruh Unit).
  • Tambahkan tombol Ekspor PDF & Excel Laporan Rekonsiliasi Persediaan.

📈 6. Kesimpulan Audit#

Modul Persediaan BUMDes Bolulango memiliki fondasi operasional yang sangat kuat (didukung multi-satuan bertingkat, kode QR/barcode digital, integrasi transfer barang antargudang bersurat jalan, dan BASO stok opname ber-GeoTag).

Kendala kosongnya data pada Laporan Audit Integritas Inventori murni disebabkan oleh pergeseran nama parameter & kolom basis data pada RPC check_inventory_integrity (p_business_unit_id vs p_unit_id) pasca-normalisasi tabel. Dengan menerapkan migrasi RPC perbaikan (Prioritas 1), fitur ini akan kembali berfungsi 100% dan menyajikan perbandingan akurat antara Stok Fisik vs Mutasi vs Buku Besar Persediaan.

Apakah panduan ini membantu Anda?