# ⚖️ Laporan Audit & Scoring: `_tray_enchanced.php`

**Target Audit:** `application/controllers/_tray_enchanced.php` beserta fungsi turunannya.
**Auditor:** Hakim Kode (AI Agent)

Klaim di komentar awal menyatakan file ini telah di-"*Refactored for MVC compliance*". Berikut adalah vonis analisis dari berbagai aspek.

---

## 1. Arsitektur & Pelanggaran MVC (Skor: 4/10)
**Vonis:** Controller masih tercemar oleh tugas-tugas View!

*   **HTML di dalam Controller:** Di baris `130` dan `219` (`_calculateTransaksi`), terdapat penyusunan string HTML murni (`"<span class='" . $jSpec['icon'] . "'></span> "`) yang dimasukkan ke dalam array. Controller TIDAK BOLEH tahu menahu soal tag HTML atau class CSS (`bg-danger` di baris 296). Controller murni menyajikan struktur data, serahkan render HTML pada View/JavaScript!
*   **Controller Gemuk (Fat Controller):** Method `_calculateTransaksi()` adalah *God Method* sepanjang lebih dari 250 baris. Method ini melakukan terlalu banyak hal: memvalidasi *access right*, menghitung *due date*, mencari notifikasi, mengecek request code, dll. Ini melanggar prinsip *Single Responsibility Principle (SRP)*.

## 2. Kualitas Kode & *Clean Code* (Skor: 3/10)
**Vonis:** Kode bekerja, tapi menjadi mimpi buruk bagi *maintainer* selanjutnya.

*   **Typo Bawaan:** Nama class dan file `_tray_enchanced`. Kata yang benar adalah `enhanced`. Hal sepele, tapi menunjukkan kurangnya ketelitian.
*   **Cyclomatic Complexity Membengkak:** Terdapat *looping* (`foreach`) di dalam *looping*, yang di dalamnya ada beberapa `if-else` bersarang (hingga 5 level). Ini sangat sulit dibaca, sulit di-debug, dan rawan *bug* tersembunyi.
*   **Magic Numbers:** Baris `228`: `$excluded = array("464");`. Ada komentar `// ToDo: Remove magic number...`, namun tidak diperbaiki. Baris `282`: `$tr->addFilter("sisa>1000");` (Angka tanpa konteks yang jelas).
*   **Penamaan Variabel Sembarangan:** Variabel seperti `$lls`, `$o`, `$tr`, `$tmpTr`, `$tmpTmp` sangat tidak representatif.
*   **Inkonsistensi State Global:** Memuat session CI (`$this->session`), tapi kemudian menggunakan raw `$_SESSION['undoneQty']`.

## 3. Performa & Interaksi Database (Skor: 2/10)
**Vonis:** Mengeksekusi *query* seolah-olah *resource database* tidak terbatas!

*   **Dosa Besar N+1 Query:**
    *   Pada `_calculateDataProposals()`, terdapat *looping* dan eksekusi *query* `lookupAll()` **di dalam loop**.
    *   Pada `_recordActiveIP()`, terdapat *looping* grup (*membership*) dan menjalankan *query SELECT*, lalu disusul *query UPDATE* atau *INSERT* di dalam loop.
    *   *Looping query* ini akan menjadi pembunuh performa (*bottleneck*) utama saat data membesar. Seharusnya menggunakan 1x *query* menggunakan `IN ()` atau *batch insert/update*.

## 4. Keamanan (Skor: 5/10)
**Vonis:** Rapuh dan mudah diakali.

*   **Spoofing `HTTP_HOST`:** Mematikan fitur jika mendeteksi 'demo' dari `$_SERVER['HTTP_HOST']`. Header ini sangat mudah di-*spoofing*. Seharusnya menggunakan konfigurasi *environment variables*.
*   **Kesalahan Mencatat IP:** Menggunakan `$_SERVER['REMOTE_ADDR']`. Jika server berada di belakang *Load Balancer* atau *Proxy*, ini hanya akan mencatat IP Proxy. Wajib menggunakan fungsi CI3 `$this->input->ip_address()` yang aman terhadap proxy.

---

## 🔍 Analisis Fungsi Turunan (Dependencies)

### A. `loadConfigUiModul()` (File: `he_misc_helper.php`)
**Skor Kejahatan: 2/10 (Tindak Pidana Performa & Kode Mati)**
*   **Disk I/O di Dalam Looping:** Fungsi ini memanggil `$CI->load->config(...)` di dalam perulangan ratusan kali. Ini menyebabkan operasi baca file hardisk (Disk I/O) berulang kali dan mencekik performa. Konfigurasi seharusnya di-*cache* atau dimuat di awal.
*   **Sampah Kode Mati (*Dead Code*):** Terdapat pemanggilan `matiHere();` dan deklarasi variabel di luar logika *return*. Jejak *debugging* yang tertinggal.

### B. `alowedAccess()` (File: `he_access_right_helper.php`)
**Skor Kejahatan: 4/10 (Hardcoding Aturan Bisnis)**
*   **Logika Bisnis Hardcoded:** Menggunakan logika kaku `step > 1` untuk menentukan hak akses hapus/reject. Sangat berbahaya jika ada modul yang memiliki alur bisnis berbeda.
*   **Query N+1 Tersembunyi:** Dipanggil di dalam *god-method* yang berat, mengandalkan *query* dinamis untuk setiap pengecekan akses UI.

### C. `replaceSession()` (File: `he_session_replacer_helper.php`)
**Skor Kejahatan: 6/10 (Dapat Dimaafkan, Tapi Menyesatkan)**
*   Fungsi ini berjalan baik untuk *bypass* filter cabang, namun penamaannya (`replaceSession`) sangat **menyesatkan**. Fungsi ini tidak mengganti *session* sama sekali, melainkan mengembalikan array filter. Sebaiknya dinamakan `getBranchFilterByRole()`.

---

### ⚖️ KESIMPULAN FINAL (SKOR: 3.5 / 10)

Sistem ini dirangkai seperti **rumah kartu**. Controller `_tray_enchanced` yang sudah obesitas logika *(Fat Controller)*, bertumpu pada *helper-helper* yang mencekik performa server dan penuh dengan aturan bisnis yang di-*hardcode*.

**Tuntutan Perbaikan Struktural:**
1.  **Pecah `_calculateTransaksi()`:** Buat *helper* atau *service layer* khusus untuk kalkulasi data UI agar Controller kembali ramping.
2.  **Hapus HTML dari Controller:** Pindahkan pembentukan tag HTML ke View/JavaScript.
3.  **Hancurkan N+1 Query:** Optimasi metode pengambilan data proposal dan pencatatan IP menggunakan *batch processing*.
4.  **Hentikan I/O File dalam Loop:** Rombak `loadConfigUiModul()` agar menggunakan *compiled cache* (Redis/File), hindari `load->config()` dalam perulangan.
5.  **Cabut Hardcode Hak Akses:** Definisikan *ruleset* `allowReject` dan `allowDelete` ini di dalam file konfigurasi tiap modul (`coTransaksiUi`), bukan di-hardcode dalam *helper*.
