Standar Pencetakan (Print)
Dokumentasi Hasil Audit
Standar Pencetakan Laporan Keuangan & BKU — ERP BUMDes#
| Keterangan | Detail |
|---|---|
| Nomor Dokumen | AUDIT/PRINT/2026-07/001 |
| Tanggal Audit | 2 Juli 2026 |
| Auditor | AI Code Auditor (Antigravity) |
| Sistem | ERP BUMDes — hutamonu/erp-bumdes |
| Framework | Next.js (App Router) + Tailwind CSS |
| Versi | Production (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:
- Konsistensi format antara seluruh laporan keuangan saat dicetak
- Kepatuhan regulasi terhadap standar pelaporan BUMDes
- Integritas data pada output cetak (angka, nama, tanda tangan)
- Kualitas teknis implementasi print CSS dan komponen
2. Ruang Lingkup#
2.1 Laporan yang Diaudit
| # | Laporan | Route | Status Print |
|---|---|---|---|
| 1 | Buku Kas Umum (BKU) — Dashboard | /dashboard/keuangan/bku | ✅ Ada |
| 2 | Buku Kas Umum (BKU) — Print Keuangan | /dashboard/keuangan/print/buku-kas | ✅ Ada |
| 3 | Buku Kas Umum (BKU) — Print Root | /print/buku-kas | ✅ Ada |
| 4 | Neraca (Balance Sheet) | /dashboard/keuangan/neraca | ✅ Ada |
| 5 | Neraca Skontro | /dashboard/keuangan/neraca-skontro | ✅ Ada |
| 6 | Neraca Saldo (Trial Balance) | /dashboard/keuangan/neraca-saldo | ✅ Ada |
| 7 | Neraca Lajur (Worksheet) | /dashboard/keuangan/neraca-lajur | ✅ Ada |
| 8 | Laba Rugi (Profit & Loss) | /dashboard/keuangan/laba-rugi | ✅ Ada |
| 9 | Arus Kas (Cash Flow) | /dashboard/keuangan/arus-kas | ✅ Ada |
| 10 | Perubahan Modal (Equity) | /dashboard/keuangan/perubahan-modal | ✅ Ada |
| 11 | Pajak | /dashboard/keuangan/pajak | ✅ Ada |
| 12 | Laporan Konsolidasi | Komponen shared | ⚠️ Partial |
| 13 | Laporan Musdes | /dashboard/laporan/musdes | ❌ Tidak ada |
| 14 | SHU BUMDes | /dashboard/laporan/shu-bumdes | ❌ Tidak ada |
2.2 Komponen Infrastruktur yang Diaudit
| # | Komponen | Path |
|---|---|---|
| 1 | PrintControl | PrintControl.tsx |
| 2 | PrintButton | PrintButton.tsx |
| 3 | FormalReportHeader | FormalReportHeader.tsx |
| 4 | FormalReportFooter | FormalReportFooter.tsx |
| 5 | PrintTimestamp | PrintTimestamp.tsx |
| 6 | ReportExportControls | ReportExportControls.tsx |
| 7 | DigitalAuditTrail | DigitalAuditTrail.tsx |
| 8 | ConsolidatedReportView | ConsolidatedReportView.tsx |
| 9 | Print Layout (Root) | layout.tsx |
| 10 | Print Layout (Keuangan) | layout.tsx |
| 11 | Global CSS | globals.css |
2.3 Dependensi Print Library
| Library | Versi | Digunakan Oleh |
|---|---|---|
html2pdf.js | ^0.14.0 | ReportExportControls — export PDF via DOM capture |
jspdf | ^4.0.0 | Export PDF programmatic (beberapa laporan) |
jspdf-autotable | ^5.0.7 | Tabel PDF otomatis |
react-qr-code | ^2.0.18 | FormalReportHeader, DigitalAuditTrail |
react-to-print | ^3.0.2 | Terinstal tapi TIDAK digunakan (dead dependency) |
3. Temuan Audit#
3.1 Ringkasan Severity
| Severity | Jumlah | Keterangan |
|---|---|---|
| 🔴 KRITIS | 3 | Berpotensi menyebabkan kesalahan angka atau format tidak layak |
| 🟡 SEDANG | 4 | Inkonsistensi format yang mempengaruhi profesionalisme laporan |
| Total | 7 |
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 CSS — globals.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 Override — BalanceSheetClient.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.5in | 0.5 inch |
print/keuangan/buku-kas (BKU Print) | ✅ 0.5in | 0.5 inch |
| Laba Rugi | ❌ | 0 (global) |
| Arus Kas | ❌ | 0 (global) |
| Perubahan Modal | ❌ | 0 (global) |
| Neraca Skontro | ❌ | 0 (global) |
| Neraca Saldo | ❌ | 0 (global) |
| Neraca Lajur | ❌ | 0 (global) |
| Pajak | ❌ | 0 (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)
FormalReportFootermenggunakan spacerprint: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
| Aspek | Var.A | Var.B | Var.C | Var.D | Var.E | Var.F | Var.G |
|---|---|---|---|---|---|---|---|
| Ketua BUMDes | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Bendahara | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Pengawas | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Digital Audit | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
| Manajer Unit | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| Nama Dinamis | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| Grid System | 3-col | 12-grid | 12-grid | 2-col | 4-col | 2-col | 3-col |
| Space TTD | 24 | 16 | 16 | — | — | 20 | 20 |
| Border Top | 2px black | 1px slate | 1px slate | 2px black | 1px 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
| Versi | File | Metode Kalkulasi Saldo |
|---|---|---|
| Dashboard | BKUClient.tsx | entry.balance — langsung dari API response |
| Print Keuangan | print/buku-kas/page.tsx | tx.runningBalance — pre-calculated field |
| Print Root | print/buku-kas/page.tsx | Dihitung 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
| Aspek | Dashboard | Print Keuangan | Print Root |
|---|---|---|---|
| Rendering | Client-side | Server-side | Server-side |
| Header | FormalReportHeader | Custom (logo + nama) | Custom (berbeda) |
| Footer | FormalReportFooter | ❌ Tidak ada | Inline tfoot |
| Kolom Tabel | 6 (Tgl, Ket/Ref, Akun, Masuk, Keluar, Saldo) | 7 (+No.) | 7 (+No.) |
| Data Source | getBKUReport() action | getRecentUnitTransactions() | getRecentUnitTransactions() |
| Penandatangan | Ketua + Bendahara | Bendahara + Manajer | Bendahara + 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
TEMUAN #4 — Komponen Footer Duplikat
Severity: 🟡 SEDANG
Deskripsi
Dua komponen footer yang melakukan fungsi identik:
| Komponen | Posisi | Teks |
|---|---|---|
| FormalReportFooter | print:fixed print:bottom-0 | "Dokumen ini dicetak secara digital melalui sistem ERP BUMDes" |
| PrintTimestamp | Non-fixed (mt-10) | "Dokumen ini dicetak secara digital melalui Sistem ERP BUMDes" |
Status Penggunaan
Berdasarkan pencarian di seluruh codebase:
FormalReportFooter→ Digunakan oleh semua laporan utama (10 laporan)PrintTimestamp→ TIDAK 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 Laporan | Paper Size | Orientasi |
|---|---|---|
| Semua laporan utama | A4 (210×297mm) | Portrait |
| Neraca Lajur (Worksheet) | A4 | Landscape |
| Neraca Skontro | A4 | Portrait / 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: exactakan 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:
| Laporan | File | Kop Surat | Footer | TTD | Print CSS |
|---|---|---|---|---|---|
| Laporan Musdes | musdes/page.tsx | ❌ | ❌ | ❌ | ❌ |
| SHU BUMDes | shu-bumdes/page.tsx | ❌ | ❌ | ❌ | ❌ |
| SHU USP | shu-usp/page.tsx | ❌ | ❌ | ❌ | ❌ |
| SHU (Keuangan) | keuangan/shu/page.tsx | ❌ | ❌ | ❌ | ❌ |
| Konsolidasi | ConsolidatedReportView.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 Dash | Neraca | Skontro | N.Saldo | N.Lajur | L.Rugi | Arus Kas | P.Modal | Pajak | Konsol |
|---|---|---|---|---|---|---|---|---|---|---|
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
| Laporan | Skor | Grade |
|---|---|---|
| BKU (Dashboard) | 7/8 | A |
| Neraca | 7/8 | A |
| Laba Rugi | 6/8 | B |
| Arus Kas | 6/8 | B |
| Perubahan Modal | 6/8 | B |
| Neraca Skontro | 5/8 | C |
| Pajak | 5/8 | C |
| Neraca Saldo | 5/8 | C |
| Neraca Lajur | 5/8 | C |
| Konsolidasi | 1/8 | F |
5. Analisis Komponen Infrastruktur#
5.1 FormalReportHeader
Rendering diagram...
| Aspek | Status | Catatan |
|---|---|---|
| Dynamic identity | ✅ | Fetch dari getSiteIdentity() |
| SSR optimization | ✅ | Accepts initialIdentity prop |
| QR verification | ✅ | Menggunakan react-qr-code |
| Print-only visibility | ✅ | hidden print:block |
| Font scaling | ⚠️ | Hardcoded pixel sizes |
| B/W safe border | ⚠️ | Emerald border mungkin tidak ideal untuk B/W |
5.2 ReportExportControls
| Aspek | Status | Catatan |
|---|---|---|
| Multi-format | ✅ | Print + Excel + PDF |
| PDF via html2pdf.js | ✅ | A4, scale 2x, CORS |
| Loading state | ✅ | isExporting |
| Error handling | ✅ | try-catch + alert |
| Landscape support | ❌ | Hardcoded portrait |
| Custom page size | ❌ | Hardcoded A4 |
5.3 DigitalAuditTrail
| Aspek | Status | Catatan |
|---|---|---|
| QR Code | ✅ | react-qr-code |
| Variant support | ✅ | minimal / full |
| Timestamp | ✅ | Otomatis 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:
| Mekanisme | Komponen | Fitur |
|---|---|---|
PrintControl | Terima elementId + filename, rename document.title saat print | ⚠️ elementId parameter tidak digunakan |
PrintButton | Langsung window.print() | Tidak ada kustomisasi |
ReportExportControls | Print + Excel + PDF, bisa delegate callback | Paling lengkap |
[!NOTE]
PrintControlmenerima parameterelementIdtapi tidak menggunakannya — hanya memanggilwindow.print(). Parameter ini menyesatkan (misleading API).
6. Dead Code & Redundansi#
| Item | File | Status | Keterangan |
|---|---|---|---|
PrintTimestamp | PrintTimestamp.tsx | 💀 Dead | Tidak digunakan oleh file manapun, digantikan FormalReportFooter |
react-to-print | package.json | 💀 Dead | Library terinstal tapi tidak ada import useReactToPrint di codebase |
PrintButton | PrintButton.tsx | ⚠️ Low usage | Hanya digunakan oleh 2 halaman BKU Print (server-rendered) |
| BKU Print (Keuangan) | print/buku-kas/page.tsx | ⚠️ Duplikat | Fungsionalitas sama dengan /print/buku-kas |
7. Rekomendasi#
Prioritas 🔴 TINGGI (Segera)
| # | Rekomendasi | Detail |
|---|---|---|
| R1 | Unifikasi @page CSS | Standarisasi @page { size: A4; margin: 1.5cm; } di globals.css. Hapus semua dangerouslySetInnerHTML yang override @page. Tambah class @page landscape untuk laporan wide-table. |
| R2 | Buat komponen FormalSignatures | Komponen 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. |
| R3 | Konsolidasi 3 versi BKU | Pertahankan /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. |
| R4 | Hapus dead code | Delete PrintTimestamp.tsx. Uninstall react-to-print. Evaluasi PrintButton.tsx. |
Prioritas 🟡 SEDANG
| # | Rekomendasi | Detail |
|---|---|---|
| R5 | Tambah print support untuk Laporan Musdes, SHU BUMDes, SHU USP, Konsolidasi | Gunakan FormalReportHeader + FormalSignatures + FormalReportFooter |
| R6 | Dynamic verification URL | DigitalAuditTrail harus mengambil base URL dari getSiteIdentity(), bukan hardcode bumdes-bolulango.id |
| R7 | Landscape support | Neraca Lajur → @page { size: A4 landscape; } |
| R8 | Populate nama penandatangan | Semua laporan harus mengambil nama Ketua/Bendahara dari getManagementStructure(), bukan menampilkan NIP/ID: ............ statis |
| R9 | Fix PrintControl API | Hapus parameter elementId yang tidak digunakan, atau implementasikan element.scrollIntoView() + element.focus() sebelum print |
Prioritas ⚪ RENDAH
| # | Rekomendasi | Detail |
|---|---|---|
| R10 | Page numbering | Tambah nomor halaman via CSS counter() |
| R11 | Print preview | Opsional: 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
| File | Aksi |
|---|---|
| globals.css | Fix @page, tambah landscape class |
| BalanceSheetClient.tsx | Hapus inline @page, standarisasi TTD |
| BKUClient.tsx | Standarisasi TTD |
| ProfitLossClient.tsx | Standarisasi TTD, tambah nama dinamis |
| CashFlowClient.tsx | Standarisasi TTD, tambah nama dinamis |
| EquityClient.tsx | Standarisasi TTD, tambah nama dinamis |
| SkontroClient.tsx | Standarisasi TTD |
| TrialBalanceClient.tsx | Tambah Audit Trail, standarisasi TTD |
| WorksheetClient.tsx | Tambah Audit Trail, landscape, standarisasi TTD |
| TaxClient.tsx | Ganti inline window.print() ke ReportExportControls |
| ConsolidatedReportView.tsx | Tambah header/footer/signatures |
| print/buku-kas/page.tsx | Gunakan FormalReportHeader, standarisasi |
| DigitalAuditTrail.tsx | Dynamic base URL |
| PrintControl.tsx | Fix misleading elementId param |
File yang Perlu Dibuat
| File | Keterangan |
|---|---|
components/ui/FormalSignatures.tsx | Komponen tanda tangan terstandardisasi |
components/ui/PrintableReport.tsx | Wrapper komponen print (opsional, iterasi berikutnya) |
File yang Perlu Dihapus
| File | Alasan |
|---|---|
| PrintTimestamp.tsx | Dead code — digantikan FormalReportFooter |
| keuangan/print/buku-kas/page.tsx | Duplikat dari /print/buku-kas |
Dependensi yang Perlu Dihapus
| Package | Alasan |
|---|---|
react-to-print | Terinstal 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