## CONTEXT: Struktur Tampilan Report “Kartu Proyek” (Dinamis)

### 0) Tujuan

Membuat report **KARTU PROYEK** yang tampilannya **mirip format manual**, tetapi **kolom kategori biaya bersifat dinamis** (bisa ditambah/dihapus/diubah mengikuti master kategori yang tersedia di database).

---

## 1) Layout Besar Report (Urutan Blok)

Report terdiri dari 3 blok utama:

1. **HEADER IDENTITAS PROYEK**
2. **TABEL BIAYA PROYEK (Expense / Mutasi keluar)**
3. **TABEL PENERIMAAN PEMBAYARAN (Income / Mutasi masuk) + REKAP FINAL**

---

## 2) HEADER IDENTITAS PROYEK

Tampilan:

* Judul besar: **KARTU PROYEK**
* Di bawah judul, tampilkan info proyek dalam bentuk grid 2 kolom (kiri dan kanan).

**Kolom kiri:**

* NAMA PROYEK : `{project_name}`
* LOKASI : `{lokasi}`
* PEKERJAAN : `{pekerjaan}`
* PEMILIK : `{pemilik}`

**Kolom kanan:**

* No. SPK : `{no_spk}`
* No. PO : `{no_po}`
* Sales : `{sales}`

Aturan:

* Jika data kosong/null → tampilkan `-`
* Format teks rapi dan rata kiri.

---

## 3) TABEL BIAYA PROYEK (TABEL UTAMA)

Ini tabel terbesar, berisi daftar transaksi biaya.

### 3.1 Struktur Kolom (Wajib)

Kolom tabel dibagi 3 bagian:

#### A) Kolom tetap (Fixed columns)

1. `TGL`
2. `No. Bukti`
3. `URAIAN`
4. `KATEGORI`

> `KATEGORI` di sini adalah nama “detail kategori” (misal: Jasa Instalasi, Material, dsb).

#### B) Kolom dinamis (Dynamic category columns)

Setelah kolom `KATEGORI`, tampilkan kolom-kolom kategori biaya yang dinamis, contoh:

* `BAHAN (Rp)`
* `UPAH (Rp)`
* `LAIN-LAIN (Rp)`
* `AKOMODASI (Rp)`
* dst…

Aturan penting kolom dinamis:

* Nama header = `{NamaKategori} (Rp)`
* Urutan kolom dinamis mengikuti urutan master (misal `no`).
* Kolom kategori **boleh berubah** (ditambah/dihapus/diubah) tanpa mengubah template report.

#### C) Kolom akhir (Fixed tail columns)

Setelah semua kolom dinamis, selalu ada:

* `JUMLAH (Rp)`
* `Potongan PPh`
* `Total Dibayar`

### 3.2 Aturan Isi Baris (Row rules)

* Setiap baris transaksi:

  * hanya **1 kolom kategori dinamis** yang terisi angka (sesuai kategori transaksi)
  * kolom dinamis lain tampil `-` / kosong
* `JUMLAH (Rp)` berisi nilai transaksi (angka utama)
* `Potongan PPh`:

  * jika tidak ada data sumber → tampil `-` (atau `0`, pilih konsisten)
* `Total Dibayar`:

  * default = `JUMLAH` jika tidak ada PPh
  * jika ada PPh = `JUMLAH - Potongan PPh`

### 3.3 Footer: Baris “TOTAL BIAYA”

Di paling bawah tabel biaya, tambahkan 1 baris summary:

* Label kiri: **TOTAL BIAYA**
* Setiap kolom kategori dinamis menampilkan total masing-masing kategori
* `JUMLAH (Rp)` menampilkan total keseluruhan biaya
* `Potongan PPh` total potongan (jika ada)
* `Total Dibayar` total netto

Catatan tampilan footer:

* Biasanya kolom `TGL`, `No. Bukti`, `URAIAN`, `KATEGORI` digabung (merge) untuk menaruh label “TOTAL BIAYA”.

### 3.4 Ringkasan Modal (Opsional)

Di bawah tabel biaya, boleh tampilkan ringkasan (jika konsep modal/anggaran ada):

* Total Modal : `{total_modal}`
* Selisih Modal - Biaya : `{total_modal - total_biaya}`

Jika tidak relevan → blok ini boleh disembunyikan.

---

## 4) TABEL PENERIMAAN PEMBAYARAN

Setelah tabel biaya, tampil subjudul: **PENERIMAAN PEMBAYARAN**

### 4.1 Struktur kolom (Fixed)

* `TGL`
* `No. Bukti`
* `KETERANGAN`
* `JUMLAH (Rp)`

### 4.2 Footer: “TOTAL PEMBAYARAN”

Tambahkan baris summary:

* Label: **TOTAL PEMBAYARAN**
* Total jumlah penerimaan.

---

## 5) REKAP FINAL (Paling bawah)

Tampilkan blok rekap (format list atau tabel 2 kolom “Label | Nilai”):

* JUMLAH BIAYA PROYEK BULAN LALU : `{biaya_bulan_lalu}`
* JUMLAH BIAYA PROYEK : `{biaya_proyek}`
* TOTAL PEMBAYARAN : `{total_pembayaran}`
* KURANG / LEBIH BAYAR : `{total_pembayaran - biaya_proyek}`

Jika angka tidak tersedia → tampil `-`.

---

## 6) Aturan Formatting Umum (Wajib konsisten)

* Angka uang: format Rupiah (ribuan) contoh `4,371,458`
* Kolom uang rata kanan
* Kolom teks rata kiri
* Nilai kosong tampil `-`
* Jika output multi halaman (PDF/print):

  * header tabel harus repeat per halaman

---
