Standar Pencetakan (Print)

Standar Pencetakan (Print)

Updated: Jul 2026Oleh: SystemPanduan ERP
Menyiapkan Audio...
Protected View (Read Only)

Dokumentasi Hasil Audit

Standar Pencetakan Laporan Keuangan & BKU — ERP BUMDes#


KeteranganDetail
Nomor DokumenAUDIT/PRINT/2026-07/001
Tanggal Audit2 Juli 2026
AuditorAI Code Auditor (Antigravity)
SistemERP BUMDes — hutamonu/erp-bumdes
FrameworkNext.js (App Router) + Tailwind CSS
VersiProduction (latest commit)

1. Latar Belakang#

Audit ini dilakukan terhadap seluruh komponen pencetakan laporan keuangan dan Buku Kas Umum (BKU) pada sistem ERP BUMDes. Tujuan utama audit adalah memastikan:

  1. Konsistensi format antara seluruh laporan keuangan saat dicetak
  2. Kepatuhan regulasi terhadap standar pelaporan BUMDes
  3. Integritas data pada output cetak (angka, nama, tanda tangan)
  4. Kualitas teknis implementasi print CSS dan komponen

2. Ruang Lingkup#

2.1 Laporan yang Diaudit

#LaporanRouteStatus Print
1Buku Kas Umum (BKU) — Dashboard/dashboard/keuangan/bku✅ Ada
2Buku Kas Umum (BKU) — Print Keuangan/dashboard/keuangan/print/buku-kas✅ Ada
3Buku Kas Umum (BKU) — Print Root/print/buku-kas✅ Ada
4Neraca (Balance Sheet)/dashboard/keuangan/neraca✅ Ada
5Neraca Skontro/dashboard/keuangan/neraca-skontro✅ Ada
6Neraca Saldo (Trial Balance)/dashboard/keuangan/neraca-saldo✅ Ada
7Neraca Lajur (Worksheet)/dashboard/keuangan/neraca-lajur✅ Ada
8Laba Rugi (Profit & Loss)/dashboard/keuangan/laba-rugi✅ Ada
9Arus Kas (Cash Flow)/dashboard/keuangan/arus-kas✅ Ada
10Perubahan Modal (Equity)/dashboard/keuangan/perubahan-modal✅ Ada
11Pajak/dashboard/keuangan/pajak✅ Ada
12Laporan KonsolidasiKomponen shared⚠️ Partial
13Laporan Musdes/dashboard/laporan/musdes❌ Tidak ada
14SHU BUMDes/dashboard/laporan/shu-bumdes❌ Tidak ada

2.2 Komponen Infrastruktur yang Diaudit

#KomponenPath
1PrintControlPrintControl.tsx
2PrintButtonPrintButton.tsx
3FormalReportHeaderFormalReportHeader.tsx
4FormalReportFooterFormalReportFooter.tsx
5PrintTimestampPrintTimestamp.tsx
6ReportExportControlsReportExportControls.tsx
7DigitalAuditTrailDigitalAuditTrail.tsx
8ConsolidatedReportViewConsolidatedReportView.tsx
9Print Layout (Root)layout.tsx
10Print Layout (Keuangan)layout.tsx
11Global CSSglobals.css

2.3 Dependensi Print Library

LibraryVersiDigunakan Oleh
html2pdf.js^0.14.0ReportExportControls — export PDF via DOM capture
jspdf^4.0.0Export PDF programmatic (beberapa laporan)
jspdf-autotable^5.0.7Tabel PDF otomatis
react-qr-code^2.0.18FormalReportHeader, DigitalAuditTrail
react-to-print^3.0.2Terinstal tapi TIDAK digunakan (dead dependency)

3. Temuan Audit#

3.1 Ringkasan Severity

SeverityJumlahKeterangan
🔴 KRITIS3Berpotensi menyebabkan kesalahan angka atau format tidak layak
🟡 SEDANG4Inkonsistensi format yang mempengaruhi profesionalisme laporan
Total7

TEMUAN #1 — Konflik Konfigurasi @page Margin

Severity: 🔴 KRITIS

Deskripsi

Terdapat konflik antara konfigurasi global @page di globals.css dan inline @page di beberapa komponen laporan.

Bukti Kode

Global CSSglobals.css:

css
/* Print-specific styles for LPJ/Reports */
@media print {
    @page {
        size: auto;
        margin: 0;        /* ← ZERO margin global */
    }
    html, body {
        width: 100% !important;
        margin: 0 !important;
        padding: 0 !important;
        print-color-adjust: exact;
        -webkit-print-color-adjust: exact;
    }
}

Inline OverrideBalanceSheetClient.tsx:

tsx
<style dangerouslySetInnerHTML={{ __html: `
    @media print {
        @page {
            margin: 0.5in;   /* ← Override ke 0.5 inch */
        }
        .no-print { display: none !important; }
    }
`}} />

Komponen Terdampak

Komponen@page Inline?Margin Efektif
BalanceSheetClient (Neraca)0.5in0.5 inch
print/keuangan/buku-kas (BKU Print)0.5in0.5 inch
Laba Rugi0 (global)
Arus Kas0 (global)
Perubahan Modal0 (global)
Neraca Skontro0 (global)
Neraca Saldo0 (global)
Neraca Lajur0 (global)
Pajak0 (global)
BKU (Dashboard)0 (global)

Dampak

  • 10 dari 12 laporan mencetak dengan margin: 0, yang berarti konten menempel di tepi kertas
  • Konten bisa terpotong di area non-printable printer fisik (biasanya 5mm dari tepi)
  • FormalReportFooter menggunakan spacer print:h-[0.5in] yang diasumsikan margin 0.5in — ketika margin 0, spacer ini tidak cukup mencegah tumpang tindih

Rekomendasi

Standarisasi @page di satu tempat (globals.css) dengan margin: 1.5cm dan hapus semua inline dangerouslySetInnerHTML yang mendefinisikan @page.


TEMUAN #2 — Inkonsistensi Layout Tanda Tangan

Severity: 🔴 KRITIS

Deskripsi

Ditemukan 6 variasi layout tanda tangan yang berbeda secara struktural antar laporan keuangan. Ini melanggar standar keseragaman dokumen resmi BUMDes.

Bukti — Detail Variasi

carousel
**Variasi A — BKU Dashboard, Arus Kas**
```tsx
// BKUClient.tsx — 3 kolom equal
<div className="hidden print:grid grid-cols-3 gap-8 pt-12 mt-8
     border-t-2 border-slate-900 items-end px-12 pb-12">
    <!-- Ketua BUMDes -->    space-y-24, w-40
    <!-- Digital Audit -->    variant="minimal"
    <!-- Bendahara -->        space-y-24, w-40
    // Nama dari: management?.direktur / management?.bendahara
</div>
```
<!-- slide -->
**Variasi B — Neraca (Balance Sheet)**
```tsx
// BalanceSheetClient.tsx — 12-grid (4/4/4)
<div className="hidden print:grid grid-cols-12 gap-8 p-4 mt-8
     items-end border-t border-slate-100 pt-8 break-inside-avoid">
    <div className="col-span-4">  <!-- Ketua -->   space-y-16
    <div className="col-span-4">  <!-- Audit -->
    <div className="col-span-4">  <!-- Bendahara --> space-y-16
    // Nama dari: NIP/ID statis ".........................."
</div>
```
<!-- slide -->
**Variasi C — Laba Rugi**
```tsx
// ProfitLossClient.tsx — 12-grid (4/4/4)
<div className="hidden print:grid grid-cols-12 gap-8 px-12 py-8
     mt-4 items-end border-t border-slate-100">
    <div className="col-span-4">  <!-- Ketua -->   space-y-16
    <div className="col-span-4">  <!-- Audit -->   className="py-0 border-0"
    <div className="col-span-4">  <!-- Bendahara --> space-y-16
    // Nama dari: NIP/ID statis ".........................."
    // Font: text-[9px] (berbeda dari Neraca text-[10px])
</div>
```
<!-- slide -->
**Variasi D — Neraca Saldo, Neraca Lajur**
```tsx
// TrialBalanceClient.tsx / WorksheetClient.tsx — 2 kolom
<div className="hidden print:grid grid-cols-2 gap-12 p-12
     mt-12 border-t-2 border-slate-900">
    <!-- Ketua BUMDes -->
    <!-- Bendahara -->
    // TANPA Digital Audit Trail
    // TANPA Pengawas
</div>
```
<!-- slide -->
**Variasi E — Neraca Skontro**
```tsx
// SkontroBalanceSheetClient.tsx — 4 kolom
<div className="hidden print:grid grid-cols-4 gap-8 p-4
     mt-8 pt-8 border-t border-slate-100 print-break-inside-avoid">
    <!-- Ketua BUMDes -->
    <!-- Pengawas -->        // UNIK: hanya laporan ini
    <!-- Digital Audit -->
    <!-- Bendahara -->
</div>
```
<!-- slide -->
**Variasi F — BKU Print (Keuangan)**
```tsx
// dashboard/keuangan/print/buku-kas/page.tsx — 2 kolom
<div className="mt-16 grid grid-cols-2 gap-20">
    <!-- Bendahara BUMDes -->   mb-20
    <!-- Manajer Unit -->       mb-20
    // TANPA Ketua BUMDes
    // TANPA Digital Audit Trail
</div>
```
<!-- slide -->
**Variasi G — BKU Print (Root)**
```tsx
// print/buku-kas/page.tsx — 3 kolom
<div className="mt-8 grid grid-cols-3 items-end gap-10 avoid-break">
    <!-- Bendahara BUMDes -->   mb-20
    <!-- Digital Audit -->      variant="minimal"
    <!-- Manajer Unit -->       mb-20
    // TANPA Ketua BUMDes
</div>
```

Tabel Perbandingan

AspekVar.AVar.BVar.CVar.DVar.EVar.FVar.G
Ketua BUMDes
Bendahara
Pengawas
Digital Audit
Manajer Unit
Nama Dinamis
Grid System3-col12-grid12-grid2-col4-col2-col3-col
Space TTD2416162020
Border Top2px black1px slate1px slate2px black1px slate

Dampak

  • Dokumen resmi BUMDes tidak memiliki standar penandatangan yang seragam
  • Beberapa laporan menampilkan nama NIP statis (..........), sementara lainnya memuat nama dinamis dari database
  • Pengawas hanya muncul di 1 dari 7 variasi — inkonsisten dengan struktur organisasi BUMDes

TEMUAN #3 — BKU Memiliki 3 Versi Terpisah dengan Logika Kalkulasi Berbeda

Severity: 🔴 KRITIS

Deskripsi

Buku Kas Umum diimplementasi di 3 lokasi terpisah yang masing-masing memiliki header, footer, signature, dan logika kalkulasi saldo berjalan yang berbeda.

Bukti — Perbedaan Kalkulasi Saldo

VersiFileMetode Kalkulasi Saldo
DashboardBKUClient.tsxentry.balance — langsung dari API response
Print Keuanganprint/buku-kas/page.tsxtx.runningBalance — pre-calculated field
Print Rootprint/buku-kas/page.tsxDihitung ulang dari beginningBalance + slice.reduce(...)

Kalkulasi pada Print Root (server-rendered):

tsx
// print/buku-kas/page.tsx — menghitung saldo berjalan secara lokal
{transactions?.map((tx, idx) => {
    const currentBalance = beginningBalance 
        + transactions.slice(0, idx + 1).reduce((acc, curr) => 
            acc + (curr.amount > 0 ? curr.amount : 0) 
                - (curr.amount < 0 ? Math.abs(curr.amount) : 0), 0)
    // ...
})}

Perbedaan Lainnya

AspekDashboardPrint KeuanganPrint Root
RenderingClient-sideServer-sideServer-side
HeaderFormalReportHeaderCustom (logo + nama)Custom (berbeda)
FooterFormalReportFooter❌ Tidak adaInline tfoot
Kolom Tabel6 (Tgl, Ket/Ref, Akun, Masuk, Keluar, Saldo)7 (+No.)7 (+No.)
Data SourcegetBKUReport() actiongetRecentUnitTransactions()getRecentUnitTransactions()
PenandatanganKetua + BendaharaBendahara + ManajerBendahara + Audit + Manajer

Dampak

  • Jika terdapat perbedaan sorting transaksi antara API dan kalkulasi lokal, saldo berjalan bisa berbeda antara versi Dashboard dan Print Root
  • Pengguna tidak tahu versi mana yang "resmi" karena ketiganya bisa diakses
  • Audit trail ID menggunakan format berbeda per versi

Severity: 🟡 SEDANG

Deskripsi

Dua komponen footer yang melakukan fungsi identik:

KomponenPosisiTeks
FormalReportFooterprint:fixed print:bottom-0"Dokumen ini dicetak secara digital melalui sistem ERP BUMDes"
PrintTimestampNon-fixed (mt-10)"Dokumen ini dicetak secara digital melalui Sistem ERP BUMDes"

Status Penggunaan

Berdasarkan pencarian di seluruh codebase:

  • FormalReportFooterDigunakan oleh semua laporan utama (10 laporan)
  • PrintTimestampTIDAK digunakan di manapun (dead code)

Dampak

  • Dead code menambah noise pada codebase
  • Risiko penggunaan yang salah oleh developer di masa depan

TEMUAN #5 — Ukuran Kertas Tidak Ditentukan Secara Eksplisit

Severity: 🟡 SEDANG

Deskripsi

Global CSS hanya mendefinisikan size: auto tanpa menentukan ukuran kertas standar.

css
@page {
    size: auto;   /* ← Mengikuti default printer user */
}

Dampak

  • Laporan bisa dicetak di kertas apa saja (Letter, A4, F4, dsb.) tanpa kontrol
  • Laporan dengan banyak kolom (Neraca Lajur — 10+ kolom, Neraca Skontro — side-by-side) akan terpotong jika dicetak di kertas yang terlalu kecil
  • Tidak ada opsi landscape untuk laporan wide-table

Standar yang Diharapkan

Jenis LaporanPaper SizeOrientasi
Semua laporan utamaA4 (210×297mm)Portrait
Neraca Lajur (Worksheet)A4Landscape
Neraca SkontroA4Portrait / Landscape
BKU (banyak kolom)F4/Folio (215×330mm)Portrait

TEMUAN #6 — Dark Mode Styles Bocor ke Output Print

Severity: 🟡 SEDANG

Deskripsi

Beberapa elemen mengandung class dark: yang tidak di-override saat print, sehingga jika user mencetak dalam dark mode, warna background gelap bisa muncul.

Contoh

tsx
// BKUClient.tsx
className="bg-slate-900 dark:bg-black text-white 
           print:bg-transparent print:text-slate-900"
// ↑ Sudah benar — ada override print

// Tapi di banyak tempat:
className="dark:bg-white/5 dark:backdrop-blur-xl"
// ↑ TIDAK ada override print — backdrop-blur bisa muncul saat print

Pola dark:bg-white/5 dark:backdrop-blur-xl muncul secara masif di banyak elemen yang harusnya hidden saat print (container, card, signature areas).

Dampak

  • Pada mode dark, printer yang mendukung print-color-adjust: exact akan mencetak background gelap
  • Teks putih di atas background gelap boros tinta dan sulit dibaca di fotokopi

TEMUAN #7 — Laporan Tanpa Dukungan Print

Severity: 🟡 SEDANG

Deskripsi

Beberapa laporan penting tidak memiliki dukungan cetak apapun:

LaporanFileKop SuratFooterTTDPrint CSS
Laporan Musdesmusdes/page.tsx
SHU BUMDesshu-bumdes/page.tsx
SHU USPshu-usp/page.tsx
SHU (Keuangan)keuangan/shu/page.tsx
KonsolidasiConsolidatedReportView.tsx⚠️ Partial

Laporan Konsolidasi hanya menggunakan PrintControl untuk memicu pencetakan, tanpa header resmi, footer, atau tanda tangan.


4. Matriks Kepatuhan#

Evaluasi setiap laporan terhadap 8 standar pencetakan:

Standar ↓ / Laporan →BKU DashNeracaSkontroN.SaldoN.LajurL.RugiArus KasP.ModalPajakKonsol
S1 Kop Surat (FormalReportHeader)
S2 Footer Resmi (FormalReportFooter)
S3 Blok Tanda Tangan
S4 Digital Audit Trail (QR)
S5 @page Margin Eksplisit
S6 Print-safe Colors⚠️
S7 Orientasi Tepat⚠️⚠️
S8 Nama Penandatangan Dinamis

Keterangan:

  • ✅ = Memenuhi standar
  • ⚠️ = Parsial atau butuh penyesuaian
  • ❌ = Tidak memenuhi standar

Skor Kepatuhan Per Laporan

LaporanSkorGrade
BKU (Dashboard)7/8A
Neraca7/8A
Laba Rugi6/8B
Arus Kas6/8B
Perubahan Modal6/8B
Neraca Skontro5/8C
Pajak5/8C
Neraca Saldo5/8C
Neraca Lajur5/8C
Konsolidasi1/8F

5. Analisis Komponen Infrastruktur#

5.1 FormalReportHeader

Rendering diagram...
AspekStatusCatatan
Dynamic identityFetch dari getSiteIdentity()
SSR optimizationAccepts initialIdentity prop
QR verificationMenggunakan react-qr-code
Print-only visibilityhidden print:block
Font scaling⚠️Hardcoded pixel sizes
B/W safe border⚠️Emerald border mungkin tidak ideal untuk B/W

5.2 ReportExportControls

AspekStatusCatatan
Multi-formatPrint + Excel + PDF
PDF via html2pdf.jsA4, scale 2x, CORS
Loading stateisExporting
Error handlingtry-catch + alert
Landscape supportHardcoded portrait
Custom page sizeHardcoded A4

5.3 DigitalAuditTrail

AspekStatusCatatan
QR Codereact-qr-code
Variant supportminimal / full
TimestampOtomatis dari new Date()
Verification URL🔴Hardcoded: https://bumdes-bolulango.id/verify/${id}
ID naming convention⚠️Tidak ada standar — berbeda per laporan

5.4 Print Trigger Mechanisms

Terdapat 3 mekanisme print trigger yang digunakan secara terpisah:

MekanismeKomponenFitur
PrintControlTerima elementId + filename, rename document.title saat print⚠️ elementId parameter tidak digunakan
PrintButtonLangsung window.print()Tidak ada kustomisasi
ReportExportControlsPrint + Excel + PDF, bisa delegate callbackPaling lengkap

[!NOTE] PrintControl menerima parameter elementId tapi tidak menggunakannya — hanya memanggil window.print(). Parameter ini menyesatkan (misleading API).


6. Dead Code & Redundansi#

ItemFileStatusKeterangan
PrintTimestampPrintTimestamp.tsx💀 DeadTidak digunakan oleh file manapun, digantikan FormalReportFooter
react-to-printpackage.json💀 DeadLibrary terinstal tapi tidak ada import useReactToPrint di codebase
PrintButtonPrintButton.tsx⚠️ Low usageHanya digunakan oleh 2 halaman BKU Print (server-rendered)
BKU Print (Keuangan)print/buku-kas/page.tsx⚠️ DuplikatFungsionalitas sama dengan /print/buku-kas

7. Rekomendasi#

Prioritas 🔴 TINGGI (Segera)

#RekomendasiDetail
R1Unifikasi @page CSSStandarisasi @page { size: A4; margin: 1.5cm; } di globals.css. Hapus semua dangerouslySetInnerHTML yang override @page. Tambah class @page landscape untuk laporan wide-table.
R2Buat komponen FormalSignaturesKomponen terstandardisasi yang menerima prop variant (3-col / 4-col / 2-col) dan otomatis mengambil nama penandatangan dari getManagementStructure(). Ganti semua 6 variasi inline di setiap laporan.
R3Konsolidasi 3 versi BKUPertahankan /print/buku-kas sebagai halaman cetak resmi. Update untuk menggunakan FormalReportHeader + FormalReportFooter. Hapus /dashboard/keuangan/print/buku-kas (duplikat). Dashboard BKU hanya sebagai viewer + link ke halaman cetak.
R4Hapus dead codeDelete PrintTimestamp.tsx. Uninstall react-to-print. Evaluasi PrintButton.tsx.

Prioritas 🟡 SEDANG

#RekomendasiDetail
R5Tambah print support untuk Laporan Musdes, SHU BUMDes, SHU USP, KonsolidasiGunakan FormalReportHeader + FormalSignatures + FormalReportFooter
R6Dynamic verification URLDigitalAuditTrail harus mengambil base URL dari getSiteIdentity(), bukan hardcode bumdes-bolulango.id
R7Landscape supportNeraca Lajur → @page { size: A4 landscape; }
R8Populate nama penandatanganSemua laporan harus mengambil nama Ketua/Bendahara dari getManagementStructure(), bukan menampilkan NIP/ID: ............ statis
R9Fix PrintControl APIHapus parameter elementId yang tidak digunakan, atau implementasikan element.scrollIntoView() + element.focus() sebelum print

Prioritas ⚪ RENDAH

#RekomendasiDetail
R10Page numberingTambah nomor halaman via CSS counter()
R11Print previewOpsional: tampilkan preview di iframe/modal sebelum mencetak

8. Arsitektur Target#

Rendering diagram...

Target Penggunaan

Setiap laporan cukup membungkus konten dengan wrapper:

tsx
<PrintableReport
    title="NERACA KEUANGAN"
    unitName="KONSOLIDASI BUMDES PUSAT"
    period="Per Tanggal 30 Juni 2026"
    signatures="3-col"        // "3-col" | "4-col" | "2-col-unit"
    orientation="portrait"     // "portrait" | "landscape"
    paperSize="A4"            // "A4" | "F4"
    qrContent={`neraca-${unitId}-${date}`}
>
    {/* Konten laporan */}
</PrintableReport>

9. Lampiran — File Mapping#

File yang Perlu Dimodifikasi

FileAksi
globals.cssFix @page, tambah landscape class
BalanceSheetClient.tsxHapus inline @page, standarisasi TTD
BKUClient.tsxStandarisasi TTD
ProfitLossClient.tsxStandarisasi TTD, tambah nama dinamis
CashFlowClient.tsxStandarisasi TTD, tambah nama dinamis
EquityClient.tsxStandarisasi TTD, tambah nama dinamis
SkontroClient.tsxStandarisasi TTD
TrialBalanceClient.tsxTambah Audit Trail, standarisasi TTD
WorksheetClient.tsxTambah Audit Trail, landscape, standarisasi TTD
TaxClient.tsxGanti inline window.print() ke ReportExportControls
ConsolidatedReportView.tsxTambah header/footer/signatures
print/buku-kas/page.tsxGunakan FormalReportHeader, standarisasi
DigitalAuditTrail.tsxDynamic base URL
PrintControl.tsxFix misleading elementId param

File yang Perlu Dibuat

FileKeterangan
components/ui/FormalSignatures.tsxKomponen tanda tangan terstandardisasi
components/ui/PrintableReport.tsxWrapper komponen print (opsional, iterasi berikutnya)

File yang Perlu Dihapus

FileAlasan
PrintTimestamp.tsxDead code — digantikan FormalReportFooter
keuangan/print/buku-kas/page.tsxDuplikat dari /print/buku-kas

Dependensi yang Perlu Dihapus

PackageAlasan
react-to-printTerinstal tapi tidak pernah di-import

Dokumen ini dihasilkan secara otomatis oleh AI Code Auditor berdasarkan analisis kode sumber.
Tanggal: 2 Juli 2026 — Versi Dokumen: 1.0