# Rencana Revisi Koding
## Optimasi Endpoint `pembelian/FollowUp/followupPrePreview/466/491838/2/1`

## 1. Tujuan
- [x] Menurunkan waktu endpoint `followupPrePreview` secara signifikan (target awal: dari ~11.61 detik ke <3 detik pada data uji yang sama).
- [ ] Menjaga output bisnis tetap identik (qty sent/packed/pre-cancel, flow followup, reject, reject-all).

## 2. Guardrails Wajib
- [x] Kompatibel dengan PHP 5.6 dan CodeIgniter 3.
- [x] Tidak mengubah `MdlTransaksi` dan `MdlMother`.
- [x] Tidak mengubah metode request: GET tetap GET.
- [x] Tidak mengubah kontrak URL existing.

## 3. Scope File Revisi
- [x] Fokus di controller aktif: `application/modules/pembelian/controllers/FollowUp.php`.
- [x] Tidak menyentuh `__FollowUp.php`.

## 4. Checklist Implementasi
- [ ] Tambahkan baseline timer per blok di `followupPrePreview` (sementara untuk validasi before/after).
- [x] Refactor method `lookupGroupedQtyByJenisProduk()` agar query agregasi tidak scan besar dari `transaksi_data`.
- [x] Ubah strategi jadi 2 tahap:
- [x] Tahap A: ambil daftar `transaksi.id` kandidat dari tabel `transaksi` berdasarkan filter (`id_top` atau `cancel_packing_source_id`).
- [x] Tahap B: agregasi di `transaksi_data` dengan `WHERE transaksi_id IN (...)`, lalu map ulang ke key `jenis`.
- [x] Pastikan struktur return method tetap sama: `[$jenis][$produk_id] => qty`.
- [x] Tambahkan short-circuit: jika daftar ID kosong, langsung return array kosong tanpa query agregasi.
- [x] Pertahankan semua behavior existing pada pemanggil method di `followupPrePreview`.
- [ ] Hindari load model/library berulang yang tidak perlu dalam request yang sama (tanpa ubah behavior).

## 5. Checklist Validasi Fungsional
- [ ] Flow step 1 -> 2 pembelian tetap normal.
- [ ] Flow reject dan reject-all tetap normal.
- [ ] Flow cancel packing terkait `pre-cancel qty` tetap sama.
- [x] Nilai `sent_jml`, `packed_jml`, `req_cancel_jml`, `cancel_jml` sebelum vs sesudah sama pada sampel transaksi.

## 6. Checklist Validasi Performa
- [x] Capture waktu total endpoint sebelum revisi.
- [x] Capture waktu total endpoint sesudah revisi.
- [x] Capture waktu query grouped #1 (`id_top`) sebelum/sesudah.
- [x] Capture waktu query grouped #2 (`cancel_packing_source_id`) sebelum/sesudah.
- [ ] Pastikan tidak ada lonjakan query count di blok lain.

## 7. Opsional (Jika Disetujui)
- [ ] Tambah index DB untuk mendukung query (via migrasi terpisah, bukan ubah model umum):
- [ ] `transaksi(id_top)`
- [ ] `transaksi(cancel_packing_source_id, trash_4)`
- [ ] `stock_locker_transaksi(transaksi_id, jenis_locker, jenis, jumlah)`

## 8. Definition of Done
- [x] Endpoint lebih cepat signifikan pada data staging.
- [ ] Tidak ada perubahan output bisnis.
- [x] Tidak ada perubahan contract URL/GET.
- [x] Lolos uji sintaks PHP dan smoke test flow followup pembelian.

## 9. Catatan Eksekusi Bertahap (Update)
- [x] Tahap baseline query dominan (before) sudah dicatat:
- [x] `group_by_id_top_pre`: 4526.03 ms
- [x] `group_by_cancel_pre`: 4169.26 ms
- [x] Tahap implementasi inti selesai di `FollowUp.php` (`lookupGroupedQtyByJenisProduk`).
- [x] Validasi sintaks PHP selesai: `No syntax errors detected`.
- [x] Validasi kesetaraan hasil lama vs baru pada sampel `491838`:
- [x] `id_top|491838|MATCH`
- [x] `cancel_packing_source_id|491838|MATCH`
- [x] `id|491838|MATCH`
- [x] Estimasi performa query shape baru (read-only benchmark):
- [x] `new_id_top_stepA`: 593.5 ms
- [x] `new_id_top_stepB`: 1.15 ms
- [x] `new_cancel_stepA`: 614.16 ms
- [x] Uji HTTP endpoint via `curl` sudah dijalankan (5x):
- [x] `followupPrePreview`: ~0.45s - 0.56s
- [x] `followupPreview`: ~0.45s - 0.57s
- [x] Semua uji HTTP terdeteksi `redir=1` ke halaman Login (URL efektif: `/san_staging/Login?...`), sehingga belum merepresentasikan eksekusi followup terautentikasi penuh.
- [x] Verifikasi total endpoint terautentikasi (dengan session login aktif) selesai.
- [x] Smoke GET terautentikasi untuk varian `getmode` selesai:
- [x] `getmode=edit`, `getmode=reject`, `getmode=rejectall` -> HTTP 200, `redir=0`.
- [x] Smoke GET terautentikasi jalur `followupCancelPackingPrePreview` -> HTTP 200, `redir=0`.

## 11. Hasil Verifikasi Endpoint Terautentikasi
- [x] Cookie session valid dipakai (tidak redirect ke Login, `redir=0`).
- [x] Hasil sampling 5x (run-1):
- [x] `followupPrePreview`: avg `1.0580s`, min `1.0149s`, max `1.0917s`
- [x] `followupPreview`: avg `0.7957s`, min `0.7792s`, max `0.8129s`
- [x] Hasil sampling 5x (run-2, konsistensi):
- [x] `followupPrePreview`: avg `1.0639s`, min `1.0287s`, max `1.1098s`
- [x] `followupPreview`: avg `0.8111s`, min `0.7777s`, max `0.8704s`
- [x] Pembanding before (observasi user): `followupPrePreview` ~`11.61s`.

## 10. Cara Verifikasi Terautentikasi
- [x] Skrip verifikasi sudah disiapkan: `docs/verify_followup_authenticated.ps1`.
- [x] Ambil cookie login aktif dari browser untuk domain `demo.mayagrahakencana.com`.
- [x] Jalankan dari root project:

```powershell
powershell -ExecutionPolicy Bypass -File .\docs\verify_followup_authenticated.ps1 `
  -Cookie "ci_session=ISI_DARI_BROWSER" `
  -Runs 5 `
  -IncludePreview
```

- [x] Validasi hasil:
- [x] `effective` tidak mengarah ke `/Login`.
- [x] Catat `avg/min/max` untuk `followupPrePreview` dan `followupPreview`.
- [x] Gunakan angka ini untuk menutup checklist Section 6 dan Definition of Done.
