# Analisis Modul Taxes — Penggabungan Tab Step 1 & Tab Gunggungan

## Temuan Analisis

### Arsitektur Tab Halaman Index Saat Ini

Halaman index modul `taxes` (jenisTr `110` = E-Faktur PPN Keluaran) memiliki **4 tab** yang di-render di view [transaksi.php](file:///z:/everest_6sept/application/modules/taxes/views/transaksi.php):

| # | Tab | Step / URL | Sumber Data | Keterangan |
|---|-----|-----------|-------------|------------|
| 1 | **PREPARE E-FAKTUR** | `?step=1` | `viewUndoneItemsIndex2()` → PHP pagination (array chunk) | Transaksi step 1 — **hanya yang customernya punya NPWP** yang bisa di-action |
| 2 | **PREPARE GUNGGUNGAN** | `?step=pre_gunggungan` | `viewGunggunganIndex()` → **DataTable server-side JSON** | Transaksi step 1 — **hanya yang customernya TANPA NPWP** yang bisa di-action |
| 3 | **ENTRY E-FAKTUR** | `?step=2` | `viewUndoneItemsIndex2()` | Transaksi step 2 |
| 4 | **OTORISASI E-FAKTUR** | `?step=3` | `viewUndoneItemsIndex2()` | Transaksi step 3 |

### Bagaimana Pemisahan NPWP / Non-NPWP Bekerja

#### 1. Konfigurasi Pemicu
Di [coTransaksiUi.php:1415-1418](file:///z:/everest_6sept/application/modules/taxes/config/coTransaksiUi.php#L1415-L1418):
```php
"filterCustomerNpwp" => array(
    "enabled" => true,
    "mdlName" => "MdlCustomer",
),
```
Dan di [coTransaksiUi.php:600-618](file:///z:/everest_6sept/application/modules/taxes/config/coTransaksiUi.php#L600-L618) ada definisi `gunggungFields` yang membuat `$gunggungFieldsView = true` dan memicu munculnya tab kedua.

#### 2. Alur Data di Controller
- **[`Transaksi::index()`](file:///z:/everest_6sept/application/modules/taxes/controllers/Transaksi.php#L6327-L6420)**: Entry point yang mendeteksi `jenisTr == "110"` untuk memanggil `viewUndoneItemsIndex2` (bukan `viewUndoneItemsIndex`).

- **[`Transaksi::viewUndoneItemsIndex2()`](file:///z:/everest_6sept/application/modules/taxes/controllers/Transaksi.php#L2966)**: Fungsi utama tab Step 1. Menggunakan cloned query untuk **menghitung secara terpisah**:
  - `$npwpStepOneCount` — customer yang punya NPWP (`ifnull(npwp,'') <> ''`)
  - `$nonNpwpCount` — customer yang TIDAK punya NPWP (`ifnull(npwp,'') = ''`)
  - Badge Tab 1 di-override hanya menampilkan jumlah NPWP: `$stepCounts[1] = $npwpStepOneCount`
  - Jika `?step=pre_gunggungan`, data `$tmpHist_0` sengaja dikosongkan karena data gunggungan dimuat via AJAX server-side.

- **[`Transaksi::viewGunggunganIndex()`](file:///z:/everest_6sept/application/modules/taxes/controllers/Transaksi.php#L7755-L8539)**: Endpoint DataTable server-side khusus tab Gunggungan. Default query menambahkan filter `per_customers.npwp = ''`. Mendukung toggle `hideNpwp` POST parameter untuk menampilkan/menyembunyikan customer ber-NPWP.

#### 3. Alur Data di View
- **[transaksi.php:2369-2378](file:///z:/everest_6sept/application/modules/taxes/views/transaksi.php#L2369-L2378)**: Setelah tab Step 1 di-render, kode menginjeksi tab tambahan "PREPARE GUNGGUNGAN" jika `$tStep == 1 && $gunggungFieldsView == true`.
- **Cross-restriction simetris**:
  - Di Tab 1 (NPWP): Item tanpa NPWP ditampilkan tapi aksinya diblokir → muncul teks *"Hanya bisa diproses di TAB Prepare Gunggungan"* + baris abu-abu.
  - Di Tab 2 (Gunggungan): Item dengan NPWP ditampilkan tapi aksinya diblokir → muncul teks *"Hanya bisa diproses di TAB Prepare E-Faktur"* + baris abu-abu.

### Perbedaan Teknis Kedua Tab

| Aspek | Tab 1 (PREPARE E-FAKTUR) | Tab 2 (PREPARE GUNGGUNGAN) |
|-------|--------------------------|---------------------------|
| **Rendering** | PHP server-side HTML (array chunk pagination) | **DataTable server-side AJAX** (`viewGunggunganIndex` → JSON) |
| **Kolom** | `shortHistoryFields` (14 kolom + NPWP, cabang, gudang) | `shortHistoryFields2` (13 kolom, tanpa cabang/gudang, + `transaksi_label`) |
| **Input inline** | Ada input faktur (tgl faktur, nomer faktur) jika `inputFakturTransaksi` enabled | Tidak ada input faktur inline |
| **Action utama** | Tombol "PREPARED" → `followupPrePreview` | Checkbox multi-select → proses gunggungan masal |
| **Filter NPWP** | Client-side: disable input jika tanpa NPWP | Server-side: `WHERE per_customers.npwp = ''` |
| **Floating box** | Tidak ada | Ada floating box "PPN GUNGGUNGAN" (`#floating-box`) di navbar bawah |

### Diagram Alur Saat Ini

```mermaid
flowchart TD
    A["Transaksi::index()"] --> B{"jenisTr == '110'?"}
    B -->|Ya| C["AJAX load viewUndoneItemsIndex2()"]
    B -->|Tidak| D["AJAX load viewUndoneItemsIndex()"]
    
    C --> E["View: transaksi.php case 'viewUndoneItemsIndex'"]
    E --> F["Render Tab Navigation"]
    
    F --> G["Tab 1: PREPARE E-FAKTUR<br/>step=1"]
    F --> H["Tab 2: PREPARE GUNGGUNGAN<br/>step=pre_gunggungan<br/>(injected if gunggungFieldsView)"]
    F --> I["Tab 3: ENTRY E-FAKTUR<br/>step=2"]
    F --> J["Tab 4: OTORISASI E-FAKTUR<br/>step=3"]
    
    G --> K["Data: semua transaksi step 1<br/>Aksi: hanya jika customer punya NPWP"]
    H --> L["viewGunggunganIndex() via AJAX<br/>Data: default hanya non-NPWP<br/>Aksi: checkbox multi-select gunggungan"]
```

---

## Rencana Penggabungan (Proposal)

### Tujuan
Menggabungkan **Tab 1 (PREPARE E-FAKTUR)** dan **Tab 2 (PREPARE GUNGGUNGAN)** menjadi **1 tab** yang berisi DataTable server-side, dimana:
- Semua transaksi step 1 ditampilkan dalam 1 tabel (baik NPWP maupun non-NPWP)
- Action bisa langsung dilakukan di dalam DataTable
- Tidak ada lagi pemisahan tab berdasarkan status NPWP

### File yang Terdampak

#### Controller
| File | Perubahan |
|------|-----------|
| [Transaksi.php](file:///z:/everest_6sept/application/modules/taxes/controllers/Transaksi.php) | Buat/modifikasi endpoint DataTable server-side baru yang menggabungkan kedua sumber data. Ubah `index()` agar mengarahkan ke endpoint baru. |

#### View
| File | Perubahan |
|------|-----------|
| [transaksi.php](file:///z:/everest_6sept/application/modules/taxes/views/transaksi.php) | Ubah rendering tab: hapus injeksi tab gunggungan, ubah tab step=1 menjadi DataTable server-side. Tambah kolom indikator NPWP/non-NPWP dan action sesuai tipe. |

#### Template
| File | Perubahan |
|------|-----------|
| [transaksi_index.html](file:///z:/everest_6sept/application/modules/taxes/template/transaksi_index.html) | Floating box "PPN GUNGGUNGAN" tetap dipertahankan jika masih diperlukan untuk proses gunggungan masal. |

#### Config
| File | Perubahan |
|------|-----------|
| [coTransaksiUi.php](file:///z:/everest_6sept/application/modules/taxes/config/coTransaksiUi.php) | Kemungkinan perlu kolom gabungan baru yang mengombinasikan `shortHistoryFields` + elemen gunggungan. |

> [!WARNING]
> **Dampak Akuntansi**: Config `coTransaksiCore.php` memisahkan mapping jurnal akuntansi antara `new_grand_ppn_gunggungan` (akun 2030070 - PPN Out sudah ada faktur) dan `new_grand_ppn_non_gunggungan` (akun 2030060 - PPN Out). Penggabungan tab **TIDAK BOLEH** menghapus pembedaan ini di level proses follow-up. Pembedaan NPWP/non-NPWP tetap harus terjadi saat memproses transaksi, bukan saat menampilkan daftar.

> [!IMPORTANT]  
> **Logika proses gunggungan masal**: Tab gunggungan saat ini memiliki fitur checkbox multi-select + floating box yang memungkinkan user memilih beberapa transaksi non-NPWP untuk digabungkan menjadi 1 transaksi gunggungan. Fitur ini harus tetap ada di tab gabungan, tapi khusus untuk transaksi non-NPWP saja.

## Open Questions

> [!IMPORTANT]
> 1. **Kolom DataTable gabungan**: Apakah ingin menggunakan set kolom `shortHistoryFields` (lebih lengkap, ada cabang/gudang) atau `shortHistoryFields2` (lebih ringkas, ada `transaksi_label`), atau gabungan keduanya?

> [!IMPORTANT]
> 2. **Indikator NPWP di tabel**: Bagaimana cara membedakan baris NPWP vs non-NPWP secara visual? Opsi:
>    - Kolom NPWP yang sudah ada tetap ditampilkan (kalau kosong berarti non-NPWP)
>    - Tambahan badge/icon khusus
>    - Warna baris berbeda

> [!IMPORTANT]
> 3. **Action button**: Bagaimana perilaku action button di tab gabungan?
>    - **Opsi A**: Semua baris punya tombol action yang sama (PREPARED), tapi sistem otomatis mendeteksi apakah ini gunggungan atau bukan berdasarkan NPWP saat proses follow-up
>    - **Opsi B**: Baris NPWP punya tombol "PREPARED" biasa, baris non-NPWP punya checkbox untuk proses gunggungan masal
>    - **Opsi C**: Kombinasi — semua baris bisa diproses individual via tombol, PLUS ada checkbox untuk multi-select gunggungan yang hanya aktif pada baris non-NPWP

> [!IMPORTANT]
> 4. **Filter/toggle NPWP**: Apakah perlu ada filter dropdown/toggle di atas DataTable untuk memfilter tampilan (Semua / Hanya NPWP / Hanya Non-NPWP)?

> [!IMPORTANT]
> 5. **Floating box gunggungan**: Apakah floating box "PPN GUNGGUNGAN" di navbar bawah masih diperlukan, atau digantikan mekanisme lain?

## Verification Plan

### Manual Verification
- Deploy ke staging, buka halaman index taxes jenisTr `110`
- Verifikasi DataTable menampilkan semua data step 1 (NPWP + non-NPWP)
- Verifikasi action button berfungsi untuk kedua tipe
- Verifikasi proses gunggungan masal masih berfungsi untuk non-NPWP
- Verifikasi badge count tab menampilkan total yang benar
- Verifikasi proses follow-up tetap menghasilkan jurnal akuntansi yang benar (mapping `new_grand_ppn_gunggungan` vs `new_grand_ppn_non_gunggungan`)
