# Rencana Implementasi: Tool Perbaikan Invoice 4822 (Invoicing) & 7499 — Items5_sum Kosong

Tool Visual Diagnostik & Perbaikan untuk **invoice invoicing (`transaksi_jenis = '4822'`)** yang diterbitkan dari modul PenerimaanProject. Saat 7499 (termin proyek) terbit, dia juga otomatis menerbitkan 4822 (invoicing) sebagai "connector transaction". Keduanya menyimpan `items5_sum` di `transaksi_data_registry` — dan **keduanya kosong** pada 189 invoice.

---

## 1. Analisis Masalah & Temuan Data

> [!IMPORTANT]
> **Target utama perbaikan: 4822 (invoicing)**, sesuai instruksi user.
> 7499 (penerimaanprojek) diperbaiki secara bersamaan (dual-sync).

### Data Audit (dari database `run_everest_modul`):

| Metrik | Nilai |
|--------|-------|
| Total invoice 7499 (link_id=0, trash=0, nilai>0) | 344 |
| Total 4822 terhubung ke 7499 (via reference_id) | 344 |
| **4822 dengan items5_sum KOSONG** | **189** |
| 4822 dengan items5_sum TERISI | 155 |

### Rantai Transaksi:
```
7499 (termin proyek) ──spawns──▶ 4822 (invoicing)
     link_id=0 (master)               reference_id = 7499.id
     link_id>0 (child sign)            reference_nomer = 7499.nomer
```

### Akar Masalah:
- Saat `Create.php` menyimpan 7499, `items5_sum` kosong karena user tidak mencentang Work Order di `selectWorkOrder()` atau validasi belum diterapkan.
- Line 3790 menyalin `items5_sum` dari sesi 7499 ke sesi 4822 — jika sumber kosong, hasilnya juga kosong.

### Dampak:
1. **Cetakan invoice (4822) kosong** — tabel rincian pekerjaan tidak muncul.
2. **Tabel `project_tasklist`** tetap `debet=0, sisa=penuh, invoiced=kosong` — seolah proyek belum pernah ditagih.
3. **Rekonsiliasi audit** antara invoice kasir & progres fisik lapangan tidak terhubung.

---

## 2. Rencana Komponen Tool Baru di `Tool.php`

**Lokasi File:** [`application/controllers/Tool.php`](file:///z:/everest_11sept/application/controllers/Tool.php)
**Method Baru:** `repairInvoiceItems5SumProject()`
**Pendaftaran Menu:** `"perbaikan invoice 4822 invoicing (items5_sum kosong)" => "repairInvoiceItems5SumProject"` di `Tool::index()`.

### Alur Kerja Tool:

```mermaid
flowchart TD
    A[Scan seluruh 4822 linked to 7499] --> B{items5_sum kosong?}
    B -->|Ya| C[Trace reference_id → 7499]
    C --> D[Decode 7499 registry.main → projectID]
    D --> E[Query project_tasklist WHERE produk_id=projectID]
    E --> F{Berapa task?}
    F -->|1 task| G[Auto-Fix: Reconstruct items5_sum]
    F -->|Multi task, exact match| G
    F -->|Multi task, no match| H[Manual: Pilih task via UI]
    G --> I[Write items5_sum ke 4822 registry]
    I --> J[Write items5_sum ke 7499 registry]
    J --> K[Write items5_sum ke child sign 4822 & 7499]
    K --> L[Update project_tasklist: debet, sisa, invoiced, inv_trx_id]
```

### Fitur-Fitur Tool:

#### A. Executive KPI Cards
- Total Invoice 4822 terhubung 7499
- Total Anomali (items5_sum kosong & nilai > 0)
- Total Nominal Terdampak (Rp)
- Invoices Siap Auto-Fix (single task / exact match)
- Invoices Sudah Normal

#### B. Tabel Diagnostik Visual Interaktif
| Kolom | Keterangan |
|-------|-----------|
| ID 4822 | ID transaksi invoicing |
| No. 4822 | Nomor nota invoicing |
| ID 7499 | ID transaksi termin terhubung |
| No. 7499 | Nomor nota termin |
| Customer | Nama konsumen |
| Proyek | ID & Nama proyek |
| Nilai Invoice | DPP |
| Status items5_sum 4822 | Badge: `KOSONG` (merah) / `TERISI (N task)` (hijau) |
| Status items5_sum 7499 | Badge: `KOSONG` / `TERISI` |
| Tasklist Info | Jumlah task + Nilai total + Match indicator |
| Aksi | Tombol perbaiki |

#### C. Tombol Aksi
1. **`[Perbaiki 1-Click]`** — Jika single task atau exact match: langsung reconstruct & save ke 4822 + 7499 + child signs + project_tasklist.
2. **`[Pilih Task Manual]`** — Modal interaktif untuk multi-task proyek.
3. **`[Cek Print 4822]`** — Link ke `invoicing/Printing/cetakNota/{id_4822}` untuk verifikasi visual.
4. **`[Cek Print 7499]`** — Link ke `penerimaanprojek/Printing/cetakNota/{id_7499}` untuk verifikasi visual.

#### D. Batch Operation
- Tombol `[Perbaiki Semua Auto-Fix Sekaligus]` — Menjalankan auto-repair untuk seluruh invoice yang single-task atau exact-match dalam satu siklus DB aman.

---

## 3. Struktur Data Standar `items5_sum` & Dual-Sync

### A. Rekonstruksi `items5_sum` dari `project_tasklist`
```php
$items5_sum[$task->id] = array(
    'id'              => $task->id,
    'no_spk'          => $task->no_spk,
    'nama'            => $task->nama,
    'produk_id'       => $task->produk_id,
    'produk_nama'     => $task->produk_nama,
    'nilai_sub_fase'  => $task->nilai_sub_fase,
    'persen_sub'      => $task->persen_sub,
    'debet'           => $nominalBilled,
    'sisa'            => max(0, $task->nilai_sub_fase - $nominalBilled),
    'invoiced'        => $invoiceNomer,
    'inv_trx_id'      => $invoiceId,
    'inv_dtime'       => $invoiceDtime,
    'bahan_baku'      => $arrBahanBaku,
    'kelebihan'       => $arrKelebihan,
    'customerID'      => $invoiceCustomerId,
    'customerName'    => $invoiceCustomerName,
    'jenisTr'         => '7499',
);
```

### B. Target Penulisan (5 titik):
1. **`transaksi_data_registry.items5_sum`** untuk **4822 master** (link_id=0) ← PRIMARY TARGET
2. **`transaksi_data_registry.items5_sum`** untuk **4822 child** (link_id=master4822ID)
3. **`transaksi_data_registry.items5_sum`** untuk **7499 master** (link_id=0)
4. **`transaksi_data_registry.items5_sum`** untuk **7499 child** (link_id=master7499ID)
5. **`project_tasklist`** — update `debet`, `sisa`, `invoiced`, `inv_trx_id`

---

## 4. Logika Pencocokan Task ↔ Invoice

| Skenario | Kondisi | Aksi |
|----------|---------|------|
| **Single Task** | Proyek hanya punya 1 task di `project_tasklist` | Auto-fix: alokasikan seluruh nilai invoice ke task tersebut |
| **Exact Match** | Proyek punya ≥1 task, salah satu `nilai_sub_fase` = `transaksi_nilai` | Auto-fix: alokasikan ke task yang matching |
| **Multi Task, No Match** | Proyek punya >1 task dan tidak ada yang exact match | Butuh pemilihan manual via UI |

---

## 5. Verifikasi & Validasi Keamanan

1. **Keamanan Transaksi DB:**
   - Setiap perbaikan (individual/massal) di-wrap dalam `$this->db->trans_start()` / `$this->db->trans_complete()`.
   - Menggunakan CI3 Query Builder + parameter binding.

2. **Kompatibilitas PHP 5.6:**
   - Sintaks `array()`, tanpa `[]`, tanpa `??`, tanpa spread operator.

3. **Pengujian Nyata:**
   - Perbaiki sampel invoice terbaru (misalnya 4822.1.171.87 / Project 300, 4822.1.171.85 / Project 292).
   - Buka cetakan nota 4822 dan 7499 — pastikan tabel Work Order muncul.
   - Periksa `project_tasklist` — pastikan `debet`, `sisa`, `invoiced`, `inv_trx_id` terisi benar.

---

## Proposed Changes

### [MODIFY] [Tool.php](file:///z:/everest_11sept/application/controllers/Tool.php)
- Tambah method `repairInvoiceItems5SumProject()` (estimasi ~600-800 baris).
- Tambah entry menu di `Tool::index()`.
