# DOKUMEN KONTEKS & TRANSKRIP PERBAIKAN: SELEKTOR PEMBELIAN (RETUR 967)

## 📌 Ringkasan Eksekutif
Dokumen ini merangkum seluruh analisis masalah, akar penyebab, dan solusi perbaikan teknis pada alur pencarian modal item di modul **Pembelian (Khususnya Transaksi 967 - Return Pembelian Produk @Pusat)** untuk dilanjutkan pada sesi chat baru di workspace **`W:\majumapan_4sep`**.

---

## 🔍 1. Identifikasi Masalah & Gejala

### Gejala 1: Nomor Nota Tidak Muncul saat Diketik (Contoh: `1128`)
* **Kueri SQL yang Terbentuk:**
  ```sql
  SELECT * FROM `transaksi` 
  WHERE `transaksi`.`status` = '1' 
    AND `transaksi`.`trash` = '0' 
    AND `returned` = '0' 
    AND `jenis` = '467' 
    AND `suppliers_id` = '345' 
    AND ( ( nomer LIKE '%1128%' ) ) 
  ORDER BY id ASC LIMIT 50
  ```
* **Akar Masalah:**
  1. **Kolom Pencarian:** Pada `MdlNotaItem.php`, pencarian hanya memeriksa kolom `nomer` (nomor sistem). Kolom `nomer_alias` (nomor fisik faktur dari supplier) dalam kondisi nonaktif/dikomentari.
  2. **Filter Ketat:** Kueri membatasi `jenis = '467'` (hanya penerimaan yang sudah selesai), `suppliers_id = '345'`, dan `returned = '0'`.

---

### Gejala 2: Fatal Error Memory Exhaustion 10 GB (Saat Pencarian Match / Kosong `%`)
* **Pesan Error:**
  ```text
  Fatal error: Allowed memory size of 10485760000 bytes exhausted (tried to allocate 4096 bytes) in 
  /var/www/majumapan/system/database/drivers/mysqli/mysqli_result.php on line 229
  ```
* **Akar Masalah di `_selectorItem.php` (Baris 244–295):**
  1. Ketika mode nota dipilih, model sekunder `$b` adalah `MdlNotaItem` (membaca tabel `transaksi`).
  2. Terjadi salah sasaran filter pada baris 272 (`$o->addFilter` alih-alih `$b->addFilter`), sehingga objek `$b` tidak memiliki filter kriteria.
  3. Baris 295 mengeksekusi `$dataSrc = $b->lookupAll()->result();` tanpa LIMIT dan tanpa filter, yang memicu penarikan seluruh data riwayat transaksi perusahaan dari database ke memori RAM PHP hingga menembus 10 GB dan *crash*.

---

## 🛠️ 2. Solusi & Perubahan Kode yang Harus Diterapkan

### Berkas 1: `application/models/Mdls/MdlNotaItem.php`
Aktifkan kolom `nomer_alias` di properti `$listedFieldsSelectItem` (Baris 62–66):
```php
// START OF COMPLETE REPEATED LOGIC
    protected $listedFieldsSelectItem = array(//===kolom2 yang dibaca saat searching. silahkan di-override di model masing2 jika kolomnya kurang
        "nomer" => "nomer",
        "nomer_alias" => "nomer_alias",
    );
// END OF COMPLETE REPEATED LOGIC
```

---

### Berkas 2: `application/modules/pembelian/controllers/_selectorItem.php`

#### A. Koreksi Typo Limit Pencarian (Baris 176–181)
```php
// START OF COMPLETE REPEATED LOGIC
        if (strlen($key) < 3) {
            $this->db->limit(20);
        }
        else {
            $this->db->limit(50);
        }
// END OF COMPLETE REPEATED LOGIC
```

#### B. Isolasi Alur Pairing Produk & Eliminasi Memory Leak (Baris 240–292)
Ganti blok penanganan `$selectorModel` dan eksekusi `$b->lookupAll()` menjadi:
```php
// START OF COMPLETE REPEATED LOGIC
            /* -------------------------------------------------
             * Pairing data sekunder hanya untuk entitas Produk (MdlProduk / MdlProduk2)
             * Untuk entitas Nota/Transaksi (MdlNotaItem), data utama sudah lengkap di $tmpO
             * ----------------------------------------------*/
            $tmpP = array();
            switch ($selectorModel) {
                case "MdlProduk":
                case "MdlProduk2":
                    if (sizeof($modelFilter) > 0) {
                        foreach ($modelFilter as $f) {
                            $f_ex = explode("=", $f);
                            if (!isset($f_ex[1])) {
                                $f_ey = explode(">", $f_ex[0]);
                                if (substr($f_ey[1], 0, 1) == ".") {
                                    $b->addFilter($f_ey[0] . ">'" . ltrim($f_ey[1], ".") . "'");
                                }
                                else {
                                    if (isset($_SESSION[$cCode]['main'][$f_ey[1]])) {
                                        $b->addFilter($f_ey[0] . ">'" . $_SESSION[$cCode]['main'][$f_ey[1]] . "'");
                                    }
                                    else {
                                        $b->addFilter($f_ey[0] . ">0");
                                    }
                                }
                            }
                            else {
                                if (substr($f_ex[1], 0, 1) == ".") {
                                    $b->addFilter($f_ex[0] . "='" . ltrim($f_ex[1], ".") . "'");
                                }
                                else {
                                    if (isset($_SESSION[$cCode]['main'][$f_ex[1]])) {
                                        $b->addFilter($f_ex[0] . "='" . $_SESSION[$cCode]['main'][$f_ex[1]] . "'");
                                    }
                                    else {
                                        $b->addFilter($f_ex[0] . "=''");
                                    }
                                }
                            }
                        }
                    }
                    if (sizeof($prodIds) > 0) {
                        $this->db->where_in("id", $prodIds);
                    }
                    $dataSrc = $b->lookupAll()->result();
                    foreach ($dataSrc as $srcItems) {
                        $main_key = isset($selectorSrcParamFields['id']) ? $selectorSrcParamFields['id'] : "id";
                        $tmpP[$srcItems->$main_key] = $srcItems;
                    }
                    break;
                default:
                    // Untuk model non-produk (misal MdlNotaItem), data utama sudah lengkap di $tmpO
                    break;
            }
// END OF COMPLETE REPEATED LOGIC
```

#### C. Penanganan PHP Notice `$pNama` pada Link Mutasi (Baris 408–418)
```php
// START OF COMPLETE REPEATED LOGIC
                //---------------------
                if(sizeof($selectorLinkMutasi)>0){
                    if(isset($selectorLinkMutasi["enabled"]) && ($selectorLinkMutasi["enabled"] == true)){
                        $pNama = isset($row->nama) ? $row->nama : (isset($row->name) ? $row->name : (isset($row->nomer) ? $row->nomer : ""));
                        $blob = blobEncode($pNama);
                        $link_mutasi = base_url() . $selectorLinkMutasi["link"] . "$pID?o=" . my_cabang_id() . "&blob_ext=$blob";
                        $tmp["link_mutasi"] = $link_mutasi;
                    }
                }
                //---------------------
// END OF COMPLETE REPEATED LOGIC
```

#### D. Pembersihan Output Debug Liar
- Komentari `cekHere($mdlName);` (Baris 81)
- Komentari `showLast_query("biru");` (Baris 183)

---

## 📌 3. Petunjuk untuk Sesi Chat Baru
Saat Anda membuka chat baru di workspace **`W:\majumapan_4sep`**, Anda cukup mengirimkan instruksi:
> *"Terapkan perbaikan selektor pembelian dari file KONTEKS_ANALISA_SELECTOR_967.md ke workspace W:\majumapan_4sep"*
