# 📋 Analisis, Checklist & Rencana Implementasi Refactoring Modul `penerimaanprojek`

Document Version: `1.0.0`  
Client/Project: `Everest 13agus` (`application/modules/penerimaanprojek`)  
Date: `2026-08-14`  

---

## 📌 Status Perencanaan
> [!IMPORTANT]  
> Dokumen ini dibuat sebagai **Rencana Implementasi (Implementation Plan)** dan **Analisis Teknis Lengkap**. **TIDAK ADA PERUBAHAN KODE** yang dieksekusi pada tugas ini sampai Developer memberikan persetujuan eksplisit.

---

## 🎯 1. Ringkasan Eksekutif & Hasil Analisis Audit

Evaluasi terhadap modul [`penerimaanprojek`](file:///z:/everest_13agus/application/modules/penerimaanprojek) dilakukan berdasarkan aturan pada [`AGENTS.md`](file:///z:/everest_13agus/AGENTS.md), [`global_rules.md`](file:///z:/everest_13agus/global_rules.md), standar multi-cabang [`audit multi cabang.md`](file:///z:/everest_13agus/audit%20multi%20cabang.md), serta standar mutu perangkat lunak **ISO/IEC 25010** dan keamanan **ISO/IEC 27001**.

### 1.1 Matriks Temuan Audit Utama

| Kategori Evaluasi | Status Kepatuhan | Deskripsi Masalah & Lokasi Kode | Tingkat Resiko |
| :--- | :---: | :--- | :---: |
| **SQL Injection & Raw Query** | 🔴 **NON-COMPLIANT** | Penggabungan parameter `$_GET` & raw string variabel langsung ke SQL tanpa binding. Contoh: [`Transaksi.php:L4818-L4819`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L4818-L4819), [`Transaksi.php:L4479`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L4479), [`_processSelectNota.php:L165`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/_processSelectNota.php#L165). | **CRITICAL** |
| **Transaction Concurrency Locker** | 🔴 **NON-COMPLIANT** | Logika lock manual di [`FollowUp.php:L1957-L1964`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/FollowUp.php#L1957-L1964) mengabaikan `cabang_id`, berisiko memicu *false lock takeover* / bentrok antar cabang. Method terpusat `checkLockOrDie()` di [`Modul_Controller.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Modul_Controller.php#L75) tidak pernah dipanggil. | **HIGH** |
| **Primary Document Filter (`link_id = 0`)** | 🔴 **NON-COMPLIANT** | Filter `link_id = 0` dinonaktifkan (di-comment out) pada kueri riwayat dan laporan: [`ActivityReport.php:L7502`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php#L7502), [`ActivityReport.php:L9630`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php#L9630), [`Transaksi.php:L1972`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L1972). Menyebabkan data transaksi tampil ganda (duplikat). | **HIGH** |
| **Scanner Session Stability (Mobile)** | 🔴 **NON-COMPLIANT** | Modul `penerimaanprojek` terdaftar pada **AGENTS.md Sec 3.9.5** namun belum memiliki method `followupDariHp()` dan alur *redirect* berantai (`location.href` ke `createSimpleSessionLogin` -> `forceMobile`). | **HIGH** |
| **Transaction Draft Pattern (MongoDB)** | 🔴 **NON-COMPLIANT** | Base controller [`Modul_Controller.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Modul_Controller.php) belum menyediakan method `saveDraftAjax()` untuk *auto-save* draf belanja ke NoSQL MongoDB. | **MEDIUM** |
| **Orphan / Shadow Code (`Dead Code`)** | 🔴 **NON-COMPLIANT** | Terdapat berkas duplikat dan berkas debug publik yang berisiko keamanan & memperumit pemeliharaan: [`__Create.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__Create.php) (571 KB), [`__FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__FollowUp.php) (1.18 MB), [`_coTransaksiCore.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/config/_coTransaksiCore.php) (152 KB), [`Debug.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Debug.php) (935 B). | **MEDIUM** |
| **PHP 5.6 Compatibility** | 🟢 **COMPLIANT** | Tidak ditemukan sintaks modern incompatible (seperti `??`, `fn()`, `[...]` pada kode PHP aktif). | **PASS** |
| **4 Config Wajib HMVC** | 🟢 **COMPLIANT** | 4 file konfigurasi wajib (`coTransaksiCore.php`, `coTransaksiUi.php`, `coTransaksiLayout.php`, `coTransaksiValues.php`) tersedia lengkap. | **PASS** |

---

## ✅ 2. Checklist Mandiri Perbaikan (Audit & Refactoring Checklist)

Checklist ini disusun secara terstruktur berdasarkan skala prioritas penanganan:

### 🔴 Fasa 1: Perbaikan Keamanan & Integritas Data (Prioritas Tinggi - CRITICAL & HIGH)
- [ ] **[SEC-01] Eliminasi SQL Injection pada `Transaksi.php`**:
  - Ganti kueri `WHERE fulldate >= '$_GET[date1]'` pada [`Transaksi.php:L4818-L4819`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L4818-L4819) menjadi Query Builder / Query Binding ter-sanitasi.
  - Refactor raw SQL `$q_unstarted` pada [`Transaksi.php:L4479`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L4479) untuk menggunakan query binding `$this->db->query($sql, array($externID))`.
- [ ] **[SEC-02] Eliminasi SQL Injection pada `_processSelectNota.php`**:
  - Refactor `where("status='1' and trash='0' and produk_id='$id_project'...")` pada [`_processSelectNota.php:L165`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/_processSelectNota.php#L165) menggunakan array Query Builder.
- [ ] **[SEC-03] Pengelolaan Controller `Debug.php`**:
  - Controller [`Debug.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Debug.php) **TETAP DIPERTAHANKAN** sesuai instruksi eksplisit pengguna.
- [ ] **[LOCK-01] Integrasi Standard Concurrency Locker (`checkLockOrDie`)**:
  - Panggil `$this->checkLockOrDie($jenisTr, $bookingNumber)` di baris awal fungsi transaksi pada [`FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/FollowUp.php), [`Create.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Create.php), dan [`_shoppingCart.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/_shoppingCart.php).
  - Pastikan kueri locker selalu mengunci komposit `cabang_id = my_cabang_id()`.
  - Aktifkan fitur *Ambil Alih Transaksi (Petugas Idle $\ge 5$ menit)* via parameter `?forceRetakeLock=1`.
- [ ] **[FILT-01] Pemulihan Filter Transaksi Primer (`link_id = 0`)**:
  - Aktifkan kembali filter `$tr->addFilter("link_id='0'")` pada [`ActivityReport.php:L7502`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php#L7502), [`L9630`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php#L9630), [`L10773`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php#L10773), dan [`Transaksi.php:L1972`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php#L1972).

---

### 🟡 Fasa 2: Standarisasi Fitur Sesi & Draf Transaksi (Prioritas Menengah - MEDIUM)
- [ ] **[MOB-01] Implementasi Scanner Session Stability Pattern (`followupDariHp`)**:
  - Tambahkan method `followupDariHp()` pada [`FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/FollowUp.php) sesuai aturan **AGENTS.md Sec 3.9**.
  - Terapkan alur *redirect* berantai langsung via `location.href` (tanpa `<iframe>`) ke `createSimpleSessionLogin` -> `forceMobile` -> `followupPrePreview`.
- [ ] **[DRAFT-01] Penyimpanan Draf Transaksi NoSQL MongoDB**:
  - Tambahkan method `saveDraftAjax()` pada [`Modul_Controller.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Modul_Controller.php) menggunakan library `Mongo_db`.
  - Terapkan pengecekan otorisasi draf (`user_id === my_id()`) sebelum pemulihan atau penghapusan draf.
- [ ] **[SESS-01] Preservasi Array `main_elements` saat Transisi Step**:
  - Verifikasi seluruh pemindahan step pada [`FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/FollowUp.php) menyertakan `"main_elements" => isset($_SESSION[$oldCode]['main_elements']) ? $_SESSION[$oldCode]['main_elements'] : array()`.

---

### 🔵 Fasa 3: Clean Code & Pembersihan Berkas Usang (Prioritas Pemeliharaan - LOW)
- [ ] **[CLEAN-01] Pembersihan Berkas Shadow / Dead Code**:
  - Hapus atau arsipkan file duplikat usang:
    * [`controllers/__Create.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__Create.php)
    * [`controllers/__FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__FollowUp.php)
    * [`config/_coTransaksiCore.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/config/_coTransaksiCore.php)
- [ ] **[UI-01] Standarisasi Header Kolom Tabel Kas / Payment**:
  - Perbarui template [`transaksi_payment.html`](file:///z:/everest_13agus/application/modules/penerimaanprojek/template/transaksi_payment.html) dan view terkait untuk menyajikan 3 aktor wajib (`dibuat oleh`, `dibayar/diserahkan oleh`, `diterima oleh`) sesuai **global_rules.md Sec 5**.

---

## 🛠️ 3. Rencana Langkah Implementasi (Proposed Step-by-Step Execution Plan)

---

### Component 1: Core Base Controller & Concurrency Locking Layer

#### [MODIFY] [`Modul_Controller.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Modul_Controller.php)
* **Perubahan yang Direncanakan**:
  1. Memperbaiki typo pesan error pada insialisasi `$this->configValuesJenis` di baris 51.
  2. Menambahkan endpoint tersentralisasi `saveDraftAjax()` untuk integrasi autosave MongoDB (AGENTS.md Sec 3.11).
  3. Memastikan method `checkLockOrDie()` dapat dipanggil dengan aman dari seluruh sub-controller.

---

### Component 2: Security & Parameter Binding Layer

#### [MODIFY] [`Transaksi.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Transaksi.php)
* **Perubahan yang Direncanakan**:
  1. Refactor baris 4818-4819: Ubah `$this->db->where("fulldate>='" . $_GET['date1'] . "'");` menjadi pengikatan aman `$this->db->where('fulldate >=', $date1)`.
  2. Refactor baris 4479: Ubah raw SQL `$q_unstarted` menjadi kueri ter-bind `$this->db->query($q_unstarted, array($externID))`.
  3. Baris 1972: Aktifkan kembali `$tr->addFilter("transaksi.link_id=0");`.

#### [MODIFY] [`_processSelectNota.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/_processSelectNota.php)
* **Perubahan yang Direncanakan**:
  1. Refactor baris 165 & 176: Ganti kueri string mentah dengan kueri berparameter `$this->db->where(array('status' => '1', 'trash' => '0', 'produk_id' => $id_project, 'jenis_transaksi' => 'sub_wo'))`.

---

### Component 3: Transaction Flow, Mobile Scanner & Primary Filter Layer

#### [MODIFY] [`FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/FollowUp.php)
* **Perubahan yang Direncanakan**:
  1. Sisipkan pemanggilan `$this->checkLockOrDie($this->jenisTr, $bookingNumber)` di awal method-method otorisasi dan penulisan transaksi.
  2. Hapus pengecekan manual tanpa `cabang_id` pada baris 1957-1964 dan gantikan dengan pemanggilan model terstandarisasi.
  3. Tambahkan method `followupDariHp()` untuk mendukung akses scanner tablet/mobile tanpa `<iframe>` (AGENTS.md Sec 3.9).
  4. Aktifkan kembali filter `link_id = 0` pada kueri riwayat dan pelaporan (baris 7502, 9630, 10773).

#### [MODIFY] [`ActivityReport.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/ActivityReport.php)
* **Perubahan yang Direncanakan**:
  1. Depetisi kueri tanpa filter `link_id = 0` pada baris 7502, 9630, 10773 untuk memastikan laporan tidak menghasilkan data duplikat.

---

### Component 4: Cleanup & Dead Code Removal

#### [DELETE] [`controllers/__Create.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__Create.php)
#### [DELETE] [`controllers/__FollowUp.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/__FollowUp.php)
#### [DELETE] [`config/_coTransaksiCore.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/config/_coTransaksiCore.php)

> [!NOTE]
> Controller [`Debug.php`](file:///z:/everest_13agus/application/modules/penerimaanprojek/controllers/Debug.php) **TETAP DIPERTAHANKAN** sesuai instruksi eksplisit dari Developer/User.

---

## 🧪 4. Rencana Verifikasi (Verification Plan)

### Automated / Syntax Tests
- Run PHP Lint check (PHP 5.6 CLI syntax verification) pada seluruh berkas yang dimodifikasi:
  ```powershell
  php -l z:\everest_13agus\application\modules\penerimaanprojek\controllers\Modul_Controller.php
  php -l z:\everest_13agus\application\modules\penerimaanprojek\controllers\FollowUp.php
  php -l z:\everest_13agus\application\modules\penerimaanprojek\controllers\Transaksi.php
  ```

### Manual Verification Flow
1. **Verifikasi Concurrency Locker Multi-Cabang**:
   - Buka 2 browser dengan sesi user di 2 cabang berbeda yang mencoba mengakses nomor transaksi yang sama.
   - Pastikan lock diisolasi per `cabang_id` dan pop-up `modal_transaksi_terkunci` muncul jika diakses oleh user lain di cabang yang sama.
   - Uji tombol **"Ambil Alih Transaksi (Petugas Idle)"** setelah pengguna pertama idle > 5 menit (`?forceRetakeLock=1`).
2. **Verifikasi SQL Binding & Input Sanitization**:
   - Jalankan kueri laporan transaksi dengan filter tanggal spesial (karakter petik tunggal `'`) untuk memastikan tidak terjadi SQL error / SQL Injection.
3. **Verifikasi Primary Filter (`link_id = 0`)**:
   - Buka daftar riwayat penerimaan projek dan pastikan baris bayangan tracing (`link_id > 0`) tidak muncul ganda pada daftar.

---

## 📚 5. Referensi Sahih (DOI & ISBN)

*Sesuai ketentuan `global_rules.md` Sec 1 Point 12:*

1. **ISO/IEC 25010:2011**: *Systems and software engineering — Systems and software Quality Requirements and Evaluation (SQuaRE) — System and software quality models*. International Organization for Standardization.
2. **ISO/IEC 27001:2022**: *Information security, cybersecurity and privacy protection — Information security management systems — Requirements*. International Organization for Standardization.
3. **Fowler, M. (2002)**: *Patterns of Enterprise Application Architecture*. Addison-Wesley Professional. **ISBN: 978-0321127426**.
4. **Schwartz, B., Zaitsev, P., & Tkachenko, V. (2012)**: *High Performance MySQL: Optimization, Backups, and Replication* (3rd ed.). O'Reilly Media. **ISBN: 978-1449314286**.
5. **OWASP Foundation (2021)**: *OWASP Top 10:2021 - A03 Injection*. **DOI: 10.13140/RG.2.2.24240.48644**.

---

> [!NOTE]  
> Mohon berikan tanggapan atau persetujuan (*Proceed*) pada rencana implementasi ini sebelum pengerjaan modifikasi kode dimulai.
