# Evaluasi & Panduan Refactoring Modul Pembelian (Pilot Project)

Dokumen ini mencatat temuan penting, metodologi pemulihan, dan panduan replikasi standar dari *pilot project* refactoring **Thin Controller - Fat Service** pada modul `pembelian` (terhadap `Create.php` dan `FollowUp.php`). Dokumen ini wajib dibaca dan diikuti oleh AI Agent berikutnya sebelum menyentuh modul inventory lain (penjualan, distribusi, produksi, dll).

---

## 1. Temuan Penting & Protokol Keamanan (Lessons Learned)

Selama eksekusi pilot project, terdapat beberapa temuan kritikal yang memicu pembaruan protokol kerja:

### ⚠️ Bahaya File Backup Usang (`__*.php`)
*   **Temuan**: Berkas dengan prefix `__` (seperti `__FollowUp.php` dan `__Create.php`) adalah berkas cadangan statis dari versi historis proyek (tahun 2024). Berkas ini **tidak sinkron** dengan basis kode berjalan (*production-ready*) saat ini yang memuat method-method baru seperti `updateItems()` dan `doUpdateApproval()`.
*   **Akibat**: Menggunakan `__FollowUp.php` sebagai basis pengembalian kode sempat menghilangkan fitur-fitur pembaruan terakhir yang tidak tercatat di cadangan 2024.
*   **Solusi**: Gunakan file asli dengan akhiran `_asli.php` (seperti `FollowUp_asli.php`) yang mencerminkan kode operasional sesungguhnya jika ingin melakukan rekonstruksi kode.

### 🛡️ Protokol Wajib Backup Lokal Sesaat (`*.bak_*`)
*   **Aturan Baru**: Sebelum melakukan modifikasi, pemotongan, atau penggantian teks pada berkas controller utama (`Create.php` / `FollowUp.php`), Agent **wajib** menduplikasi berkas aktif tersebut menjadi berkas backup sementara di direktori yang sama.
*   **Skema Penamaan**: `[NamaFile].php.bak_[fase_refactoring]` (contoh: `FollowUp.php.bak_f7`).
*   **Pembersihan**: Setelah perubahan selesai dan berhasil divalidasi dengan `php -l` (bebas error sintaks), berkas cadangan sementara ini **harus segera dihapus** agar tidak mengotori repositori.

---

## 2. Metodologi Refactoring Presisi (Safe Slicing & Delegation)

Untuk meminimalkan kesalahan penempatan kurung kurawal (`{}` / syntax error) saat mengekstrak kode ribuan baris, gunakan pendekatan **Regex Line-Boundary Slicing** via Python/Script dibanding penggantian teks manual:

1.  **Dapatkan Batas Baris Fungsi**:
    Gunakan script parser regex untuk menemukan baris awal deklarasi fungsi target dan fungsi setelahnya di dalam berkas aktif.
2.  **Ekstraksi Isi (Body)**:
    Potong baris dari awal deklarasi (`functionName() {`) hingga baris sebelum fungsi berikutnya. Bersihkan kurung kurawal penutup paling luar dari fungsi target agar menyisakan isi kodenya saja.
3.  **Penggantian Variabel `$this`**:
    Lakukan penggantian string `$this->` menjadi `$c->` hanya pada isi kode fungsi yang telah diekstrak sebelum menulisnya ke dalam berkas Library tujuan.
4.  **Delegasi Bersih**:
    Tulis ulang fungsi di Controller utama menjadi delegasi tipis:
    ```php
    public function namaFungsi()
    {
        $this->load->library("LibPembelian[NamaController][Domain]");
        $this->libpembelian[controller][domain]->process[NamaFungsi]($this);
    }
    ```
5.  **Verifikasi Kompilasi**:
    Selalu jalankan pemeriksaan sintaks secara otomatis menggunakan perintah terminal:
    `php -l path/to/file.php`

---

## 3. Hasil Refactoring Modul Pembelian

### 3.1 Berkas Controller (`Create.php`)
*   **Ukuran Awal**: ~9.480 baris.
*   **Ukuran Akhir**: **1.135 baris** (berkurang ~88%).
*   **Pembagian Library**:
    *   [LibPembelianCreateSave.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianCreateSave.php) (domain Simpan & Preview)
    *   [LibPembelianCreateEdit.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianCreateEdit.php) (domain Edit & Preview Edit)
    *   [LibPembelianCreateCancel.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianCreateCancel.php) (domain Pembatalan & Preview)

### 3.2 Berkas Controller (`FollowUp.php`)
*   **Ukuran Awal**: 23.691 baris.
*   **Ukuran Akhir**: **7.694 baris** (berkurang ~67%).
*   **Pembagian Library & Helper**:
    *   [he_pembelian_followup_helper.php](file:///w:/new_san_variant/application/modules/pembelian/helpers/he_pembelian_followup_helper.php) (utilitas `parseDashIds`, `lookupGroupedQty`)
    *   [LibPembelianFollowUpFollowupPreview.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpFollowupPreview.php) (Preview Approval)
    *   [LibPembelianFollowUpDoFollowup.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpDoFollowup.php) (Eksekusi Approval)
    *   [LibPembelianFollowUpDoRevert.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpDoRevert.php) (Eksekusi Revert)
    *   [LibPembelianFollowUpDoCancelPacking.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpDoCancelPacking.php) (Eksekusi Batal Packing)
    *   [LibPembelianFollowUpRevertAll.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpRevertAll.php) (Revert All & Pre-Preview)
    *   [LibPembelianFollowUpCancelPreview.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpCancelPreview.php) (Cancel Previews)
    *   [LibPembelianFollowUpEdit.php](file:///w:/new_san_variant/application/modules/pembelian/libraries/LibPembelianFollowUpEdit.php) (Edit & EditForm)

---

## 4. Panduan Uji Validasi Pasca Refactoring

Setiap kali melakukan refactoring modul baru, jalankan pengujian berikut untuk menjamin integritas fungsional sistem:
1.  **Dry Run**: Akses form transaksi, tambahkan item ke keranjang belanja (*shopping cart*) dan pastikan data terhitung dengan benar.
2.  **Preview Validation**: Klik tombol *Preview* sebelum menyimpan, pastikan halaman rincian transaksi tampil dengan data yang valid.
3.  **Submission Test**: Simpan transaksi menjadi draft, kemudian lakukan proses approval langkah demi langkah di menu FollowUp.
4.  **Revert/Cancel Test**: Lakukan pembatalan persetujuan atau langkah transaksi pada menu FollowUp dan pastikan stok ter-update kembali.
