# Rencana Implementasi: Penggabungan & Optimasi Tab Modul Taxes (JenisTr 110)

## 1. Ringkasan Kebutuhan & Temuan Masalah

Berdasarkan diskusi dan temuan analisis performa terbaru:

### Masalah Utama yang Ditemukan
1. **Dua Tab Terpisah Membingungkan User**: Data transaksi Step 1 sebelumnya dipisah ke 2 tab berbeda (Tab 1: PREPARE E-FAKTUR dan Tab 2: PREPARE GUNGGUNGAN). User kesulitan mencari data karena tidak tahu apakah customer suatu transaksi ber-NPWP atau non-NPWP.
2. **DataTable Sangat Berat (Penyebab Ditemukan)**:
   - Pada endpoint DataTable `viewGunggunganIndex()`, query database `SELECT ... FROM transaksi ...` dieksekusi **tanpa klausa `LIMIT` dan `OFFSET` SQL** (`$query = $this->db->get()`).
   - Seluruh puluhan ribu baris ditarik ke memori PHP, lalu dipotong manual menggunakan `array_chunk()`.
   - Akibatnya, setiap paging, filter, atau sorting memaksa server melakukan full-scan dan load seluruh tabel ke RAM.
3. **Pencampuran Pembayaran/Proses Pajak**: User bingung membedakan transaksi yang seharusnya masuk jalur faktur reguler vs jalur gunggungan.
4. **Navigasi Sulit**: Berpindah-pindah tab dan reload parsial yang lambat memperlambat alur kerja.

---

## 2. Keputusan Desain (Sesuai Arahan User)

| No | Parameter | Keputusan | Detail Teknis |
|---|---|---|---|
| 1 | **Struktur Kolom** | Gabungan keduanya | Menggabungkan kolom `shortHistoryFields` (lengkap dengan info cabang, gudang, dll) dan `shortHistoryFields2` (info `transaksi_label` / sumber transaksi gunggungan). |
| 2 | **Pembeda Baris** | Warna baris berbeda | Baris ber-NPWP diberi highlight warna netral/normal, baris Non-NPWP (Gunggungan) diberi styling warna berbeda (misal aksen amber/kuning lembut dengan badge jelas `NON-NPWP / GUNGGUNGAN`). |
| 3 | **Kolom Aksi** | **Opsi C** (Proporsional) | - Setiap baris memiliki tombol aksi individual (misal: `PREPARED` / `Review`).<br>- Khusus baris Non-NPWP (Gunggungan), tersedia **checkbox multi-select** untuk pemilihan masal gunggungan.<br>- Baris ber-NPWP tidak menampilkan checkbox gunggungan (atau disabled dengan tooltip jelas) agar user tidak salah menggabungkan data ber-NPWP ke dalam transaksi gunggungan. |
| 4 | **Filter Cepat** | Tombol custom dengan badge | Disediakan 3 tombol filter instan di atas tabel:<br>1. **Semua** `[Badge: Total]`<br>2. **NPWP** `[Badge: Total NPWP]`<br>3. **Gunggungan** `[Badge: Total Non-NPWP]`<br>Mengatur filter AJAX tanpa reload halaman. |
| 5 | **Floating Box** | Tetap dipertahankan | Box `#floating-box` "PPN GUNGGUNGAN" tetap aktif saat user mencentang checkbox transaksi non-NPWP untuk melanjutkan proses gunggungan masal. |

---

## 3. Rencana Arsitektur & Optimasi Performa

### 3.1 Optimasi Query Database (True SQL Server-Side Pagination)
- Mengubah endpoint AJAX DataTables agar menggunakan **true SQL `LIMIT` dan `OFFSET`**:
  ```sql
  -- Hitung total data (filtered)
  SELECT COUNT(DISTINCT transaksi.id) as total ...
  
  -- Ambil data hanya sejumlah halaman aktif (misal 20 / 50 data)
  SELECT ... FROM transaksi 
  JOIN transaksi_data ON ... 
  JOIN per_customers ON ... 
  WHERE ... 
  ORDER BY ... 
  LIMIT offset, length;
  ```
- Lookup registry (`pairRegistries`) dan detail transaksi sekunder hanya diproses untuk baris yang lolos `LIMIT` (maksimal 20-50 record per request), bukan untuk seluruh tabel di database. Hal ini memangkas waktu loading dari beberapa detik menjadi beberapa milidetik.

### 3.2 Penanganan Filter NPWP / Gunggungan pada Level Database
- Parameter POST `filter_pajak`:
  - `all`: Menampilkan semua data Step 1.
  - `npwp`: Menambahkan klausul `WHERE IFNULL(per_customers.npwp, '') <> ''`.
  - `gunggungan`: Menambahkan klausul `WHERE IFNULL(per_customers.npwp, '') = ''`.
- Hitungan badge untuk masing-masing kategori dihitung secara terpisah/ringkas sehingga badge selalu akurat.

---

## 4. File yang Akan Dimodifikasi

### 4.1 Controller: `Transaksi.php`
- **File:** [z:\everest_6sept\application\modules\taxes\controllers\Transaksi.php](file:///z:/everest_6sept/application/modules/taxes/controllers/Transaksi.php)
- **Modifikasi:**
  1. Pada `index()`: Mengarahkan loader undone list ke view gabungan baru.
  2. Pada `viewUndoneItemsIndex2()`:
     - Menghilangkan pemisahan tab Step 1 vs Tab Prepare Gunggungan.
     - Merender tabel tunggal dengan tombol filter badge (Semua / NPWP / Gunggungan).
  3. Pada endpoint DataTables server-side (modifikasi / buat method baru yang efisien):
     - Mengimplementasikan true SQL `LIMIT / OFFSET`.
     - Mendukung parameter sorting, pencarian multi-kolom, dan filter tipe pajak.
     - Mengembalikan payload JSON DataTables yang sudah berisi informasi penanda tipe (NPWP vs Non-NPWP) dan elemen aksi Opsi C.

### 4.2 View: `transaksi.php`
- **File:** [z:\everest_6sept\application\modules\taxes\views\transaksi.php](file:///z:/everest_6sept/application/modules/taxes/views/transaksi.php)
- **Modifikasi pada blok `case "viewUndoneItemsIndex"`:**
  1. Tab navigasi hanya terdiri dari:
     - **Tab 1: PREPARE E-FAKTUR & GUNGGUNGAN** (Step 1 - Gabungan)
     - **Tab 2: ENTRY E-FAKTUR** (Step 2)
     - **Tab 3: OTORISASI E-FAKTUR** (Step 3)
  2. Menambahkan bar tombol filter custom di atas DataTable:
     - Tombol `Semua` (dengan badge total)
     - Tombol `NPWP` (dengan badge total NPWP)
     - Tombol `Gunggungan` (dengan badge total Gunggungan)
  3. Konfigurasi `DataTable`:
     - `rowCallback`: Menentukan warna baris berbeda (misal kelas CSS khusus atau inline background untuk data gunggungan vs data NPWP).
     - `columnDefs`: Render kolom aksi Opsi C (Action button untuk semua, Checkbox gunggungan hanya untuk baris non-NPWP).
     - Menjaga integrasi dengan script floating box gunggungan (`checkBoxPost`, `checkSessionData`, `debouncedFunction`).

### 4.3 Config: `coTransaksiUi.php`
- **File:** [z:\everest_6sept\application\modules\taxes\config\coTransaksiUi.php](file:///z:/everest_6sept/application/modules/taxes/config/coTransaksiUi.php)
- **Modifikasi:**
  - Menyiapkan mapping field gabungan agar memuat seluruh field yang dibutuhkan dari `shortHistoryFields` dan `shortHistoryFields2`.

---

## 5. Rencana Verifikasi

1. **Uji Performa Load**:
   - Memastikan response time endpoint DataTables turun signifikan (karena hanya menarik record sesuai `LIMIT`, bukan seluruh data DB).
   - Memastikan paginasi halaman 1, 2, 3... bekerja mulus tanpa lagging.
2. **Uji Filter Cepat (Tombol Badge)**:
   - Klik tombol `NPWP` -> hanya menampilkan baris dengan NPWP.
   - Klik tombol `Gunggungan` -> hanya menampilkan baris non-NPWP.
   - Klik tombol `Semua` -> menampilkan keduanya.
3. **Uji Tampilan & Visual**:
   - Verifikasi warna baris berbeda antara transaksi ber-NPWP dan non-NPWP.
   - Verifikasi kolom aksi (Opsi C): tombol action tampil di semua baris, checkbox gunggungan hanya aktif di baris non-NPWP.
4. **Uji Fitur Gunggungan Masal**:
   - Mencentang beberapa checkbox non-NPWP -> floating box bawah muncul dengan resume PPN gunggungan.
   - Tombol "LANJUTKAN" pada floating box tetap berjalan normal untuk membuat transaksi gunggungan.
5. **Uji Kompatibilitas PHP 5.6 & Keamanan**:
   - Tidak ada sintaks short array `[]`, `??`, atau arrow functions.
   - Semua query menggunakan Query Builder / binding aman.
