# Blueprint Refactoring: Migrasi Eksekusi Lintas-Modul (Penghapusan `eval()`)

Dokumen ini adalah *blueprint* teknis untuk membersihkan *technical debt* berupa penggunaan `eval()` pada proses penyimpanan transaksi lintas-modul di arsitektur HMVC CodeIgniter 3.

## 1. Latar Belakang Masalah (Problem Statement)
Saat ini, proses *return* barang (pada `FgReturnService` dan `SuppliesReturnService`) perlu menyimpan data transaksi ke modul lain (`distribusifgproject` dan `distribusisuppliesproject`). 
Karena keterbatasan HMVC CodeIgniter 3 (tanpa *Namespace*), sistem akan mengalami *Fatal Error: Class Name Collision* jika memuat dua *Controller* dengan nama yang sama (misal `Create.php` pada modul A dan modul B) di satu *request* yang sama.

Untuk mengakali hal ini, *developer* sebelumnya meretas (membajak) nama class menggunakan *Regex* dan mengeksekusinya di memori lewat `eval()`.
**Dampak Buruk:**
- Kehilangan akurasi *stack trace* dan *error line number* (sangat sulit di-*debug*).
- Kode mutan (yang tereksekusi berbeda dengan file asli).
- Risiko keamanan (RCE) dan penurunan performa aplikasi.

## 2. Arsitektur Target (The New Standard)
Berdasarkan prinsip *Solid* dan *Separation of Concerns*, Controller HANYA boleh bertugas menangani HTTP Request/Response. Logika bisnis (seperti fungsi `save()` yang berjumlah ribuan baris) **WAJIB** berada di dalam **Model** atau **Library/Service**.

Dengan memindahkan logika `save()` ke Model, kita mendapatkan nama Class yang unik (bebas dari *Collision*) sehingga bisa dipanggil dengan aman dari modul mana pun menggunakan mekanisme standar bawaan CodeIgniter: `$this->load->model(...)`.

---

## 3. Langkah-Langkah Refactoring (Execution Plan)

Mengingat ukuran `save()` mencapai ~8.500 baris, metode yang digunakan adalah **Lift and Shift** (Pemindahan Utuh) untuk meminimalisir *Regression Bug*.

### Langkah 1: Persiapan Model Penengah (Transaksi Processor)
Buat file Model baru di masing-masing modul target (atau di folder global `application/models/Coms/` jika logikanya terbukti 100% identik).

**Target File:** `application/modules/distribusifgproject/models/MdlSaveTransaksiFg.php`
```php
<?php defined('BASEPATH') OR exit('No direct script access allowed');

class MdlSaveTransaksiFg extends CI_Model {
    /**
     * Memindahkan 8500 baris fungsi save() dari Create.php ke sini.
     * Menerima instance controller pemanggil untuk menjaga konteks $this
     */
    public function executeSave($caller) {
        $ci =& get_instance();
        
        // Contoh penyesuaian pemanggilan context:
        // Dari: $this->jenisTr 
        // Menjadi: $caller->jenisTr
        
        // ... [8500 baris kode dari Create.php dipaste di sini] ...
    }
}
```

### Langkah 2: Refactoring Controller Web UI
Kosongkan badan fungsi `save()` di `Create.php` dan jadikan ia sebagai jembatan (*wrapper*) pemanggil Model.

**Target File:** `application/modules/distribusifgproject/controllers/Create.php`
```php
// SEBELUM:
// public function save() {
//    ... 8500 baris kode ...
// }

// SESUDAH:
public function save() {
    $this->load->model('distribusifgproject/MdlSaveTransaksiFg', 'trans_processor');
    
    // Melemparkan instance $this (Create) ke model agar semua properti (configUi, dll) tetap terbaca
    $output = $this->trans_processor->executeSave($this);
    
    echo $output;
}
```

### Langkah 3: Pemusnahan `eval()` pada Return Service
Ubah kode peretas *class* dengan kode pemanggilan standar Model CI.

**Target File:** `application/libraries/FgReturnService.php` (Fungsi `callSave()`)
```php
// SEBELUM:
// $createCode = file_get_contents($createFile);
// $createCode = preg_replace(...);
// eval($createCode);
// $output = $create->save();

// SESUDAH:
// 1. Buat object kosong (stdClass) atau mock object untuk menampung properti yang dibutuhkan
$mockController = new stdClass();
$mockController->jenisTr = $this->jenisTr;
$mockController->cCode = $cCode;
$mockController->modul = $this->modul;
$mockController->session = $ci->session;
$mockController->configUi = $configUi;
// ... (isi semua properti yang dibutuhkan seperti sebelumnya)

// 2. Load model secara langsung
$ci->load->model('distribusifgproject/MdlSaveTransaksiFg', 'trans_processor');

// 3. Eksekusi fungsi save
$output = $ci->trans_processor->executeSave($mockController);
```

---

## 4. Analisis Dampak & Risiko (Impact Analysis)

### Files Impacted (Terdampak Langsung)
1. `modules/distribusifgproject/controllers/Create.php`
2. `modules/distribusisuppliesproject/controllers/Create.php`
3. `libraries/FgReturnService.php`
4. `libraries/SuppliesReturnService.php`
5. *(Baru)* `modules/.../models/MdlSaveTransaksiFg.php`

### Tingkat Risiko: TINGGI (High Risk)
Karena memindahkan lebih dari 8.000 baris kode, risiko utama adalah tertinggalnya penyesuaian variabel context (`$this`). 
Jika di dalam Model ada kode pemanggil `$this->configUi` yang lupa diubah menjadi `$caller->configUi`, sistem akan menghasilkan *Fatal Error: Undefined property*.

### Kebutuhan Pengujian (Testing Requirements)
Untuk memastikan *blueprint* ini sukses dieksekusi, QA/Developer **WAJIB** melakukan 3 skenario tes berikut di lingkungan lokal/development sebelum rilis:
1. **Flow UI Normal:** Buka halaman pembuatan transaksi distribusi secara manual (via Web UI), isi form, dan tekan Simpan.
2. **Flow Return FG:** Simulasikan *Return Barang Jadi* agar `FgReturnService` terpicu di latar belakang.
3. **Flow Return Supplies:** Simulasikan *Return Supplies* agar `SuppliesReturnService` terpicu di latar belakang.

Semua skenario harus berhasil menyimpan data transaksi tanpa memunculkan layar kosong (*White Screen of Death*) atau error log terkait *undefined property*.
