# 🗺️ ROADMAP REFACTORING & MIGRASI MODUL PENJUALAN
## Modul Target: `application/modules/penjualan/` (Everest CI3)
**Standar Kepatuhan:** ISO 9001 (Mutu & Kontrol Proses), ISO 27001 (Audit Trail), PSAK 14 (Persediaan), PSAK 23 (Pendapatan), Coretax DJP  
**Metode:** *Strangler Fig Pattern* (Migrasi Bertahap Tanpa Mengganggu Transaksi Aktif)  
**Target Utama:** Menurunkan kompleksitas controller dari 22.000 baris menjadi *Thin Controllers* terisolasi dan mencapai MTTR < 15 menit.

---

## 📊 1. ANATOMI MASALAH SAAT INI DI MODUL PENJUALAN

```
application/modules/penjualan/controllers/
 ├── _shoppingCart.php           (4.500+ baris)  → Menghitung stok, diskon, render HTML, validasi sesi (Tumpang tindih)
 ├── _processSelectProduct.php   (700+ baris)    → Cek harga, hold locker, hitung booking (Duplikasi rumus)
 ├── _selectorItem.php           (600+ baris)    → Query stok modal picker (Duplikasi rumus)
 ├── _processPihakMain.php       (800+ baris)    → Pemilihan DC vs Cabang (Magic strings 'pusat'/'center')
 ├── Create.php                  (22.500+ baris) → Simpan draf, validasi, posting transaksi, JSON blob parser
 ├── FollowUp.php                (12.000+ baris) → Approval alur SPO -> SO -> PKD -> SPD -> Invoice
 └── Transaksi.php               (14.000+ baris) → Query list transaksi, filter link_id = 0
```

---

## 🎯 2. MATRIKS 5 FASE ROADMAP PENJUALAN

```mermaid
gantt
    title Roadmap Migrasi Modul Penjualan Everest
    dateFormat  YYYY-MM-DD
    section Fase 1
    Integrasi ComStockEngine (Keranjang & Selector) :done, f1, 2026-08-16, 2026-08-20
    section Fase 2
    Sentralisasi ComPricingEngine (Diskon & Pajak)   :active, f2, 2026-08-21, 2026-08-26
    section Fase 3
    Standarisasi Customer & Gudang (Party Service)   :f3, 2026-08-27, 2026-08-31
    section Fase 4
    Dekomposisi Create.php & FollowUp.php            :f4, 2026-09-01, 2026-09-10
    section Fase 5
    Modernisasi UI Transport (Iframe to JSON API)    :f5, 2026-09-11, 2026-09-18
```

---

### 📍 FASE 1: Integrasi Centralized Persediaan (`ComStockEngine`)
**Fokus:** Menghubungkan seluruh titik pengecekan stok di modul Penjualan ke satu pintu (`ComStockEngine.php`).

* **Pekerjaan Konkret:**
  1. **Refactor `_shoppingCart.php`:** Mengganti baris kalkulasi manual `($stokFisik - $stok_booking) - $itemJml` dengan pemanggilan `$this->ComStockEngine->getStockStatus()`.
  2. **Refactor `_processSelectProduct.php`:** Mengarahkan pembacaan antrean booking dan hold stok ke `ComStockEngine`.
  3. **Refactor `_selectorItem.php`:** Mengarahkan badge stok di pop-up modal pencarian produk ke `ComStockEngine`.
* **Hasil / Deliverable:**
  * Tidak ada lagi perbedaan angka antara Laporan Stok, Modal Selector, dan Keranjang Belanja.
  * Masalah switching stok Cabang vs DC otomatis tuntas di semua jenis penjualan (`582`, `5822`, `5823`, `583`, `585`).

---

### 📍 FASE 2: Sentralisasi Diskon, DPP, & Pajak (`ComPricingEngine`)
**Fokus:** Memusatkan logika harga khusus, diskon bertingkat, dan PPN Coretax 11%.

* **Pekerjaan Konkret:**
  1. Membangun model domain [`ComPricingEngine.php`](file:///w:/everest_10agus/application/models/Coms/ComPricingEngine.php).
  2. Mengintegrasikan matrix harga (Customer Price, Reseller Price, Project Price).
  3. Mengintegrasikan kalkulasi diskon bertingkat (Diskon 1 + Diskon 2 + Diskon Tambahan).
  4. Menjamin kalkulasi DPP (*Dasar Pengenaan Pajak*) dan PPN 11% presisi 0 rupiah sesuai regulasi Coretax DJP.
* **Hasil / Deliverable:**
  * Seluruh perhitungan grand total, subtotal, dan pajak diproses secara deterministik tanpa pembulatan liar.

---

### 📍 FASE 3: Standarisasi Customer, Alamat & Gudang Pengirim (`ComPartyWarehouseService`)
**Fokus:** Mengeliminasi seluruh *magic strings* pada pemilihan konsumen dan switching pengiriman.

* **Pekerjaan Konkret:**
  1. Membangun [`ComPartyWarehouseService.php`](file:///w:/everest_10agus/application/models/Coms/ComPartyWarehouseService.php).
  2. Membakukan penentuan gudang pengirim menggunakan konstanta `WH_STATUS_PUSAT_ID` (12) dan `WH_STATUS_CABANG_ID` (13).
  3. Mengunci konsistensi array sesi `$_SESSION[$cCode]['main']` dan `main_elements` agar tidak hilang saat transisi antar-halaman.
* **Hasil / Deliverable:**
  * Tidak ada lagi *silent bug* akibat variasi string (`'pusat'`, `'center'`, `'dc'`).

---

### 📍 FASE 4: Dekomposisi `Create.php` & `FollowUp.php` (`ComSalesOrderService`)
**Fokus:** Memangkas controller raksasa `Create.php` (22.500 baris) dan `FollowUp.php` (12.000 baris).

* **Pekerjaan Konkret:**
  1. Membangun service utama [`ComSalesOrderService.php`](file:///w:/everest_10agus/application/models/Coms/ComSalesOrderService.php).
  2. Memisahkan alur menjadi sub-fungsi mandiri yang terisolasi:
     * `validateOrder(CartDTO $cart)`
     * `reserveStockLocker(CartDTO $cart)`
     * `persistTransactionHeader(TransactionDTO $trx)`
     * `persistTransactionItems(array $items)`
     * `triggerAutoJournal(TransactionDTO $trx)`
  3. `Create.php` dan `FollowUp.php` hanya bertindak sebagai *Router* pendek (< 200 baris) yang memanggil service di atas.
* **Hasil / Deliverable:**
  * File `Create.php` menjadi sangat ringkas, mudah dibaca, dan aman dari *side-effects*.

---

### 📍 FASE 5: Modernisasi Transport UI & Dashboard Observability
**Fokus:** Menghapus ketergantungan iframe `#result` dan memasang pencatatan jejak transaksi.

* **Pekerjaan Konkret:**
  1. Mengubah mekanisme submit tombol dari eksekusi iframe ke **Fetch / AJAX Response JSON terstruktur**:
     ```json
     {
       "status": "success",
       "transaction_id": 15822,
       "nomer": "5822spo.1.10.123",
       "redirect_url": "/penjualan/FollowUp/index/5822/..."
     }
     ```
  2. Memasang logging trace eksekusi transaksi penjualan untuk deteksi error instan (< 5 menit).

---

## 🛡️ 3. STANDAR KUALITAS & GERBANG PENGUJIAN (QUALITY GATES)

Setiap penyelesaian fase wajib melewati 3 gerbang verifikasi sebelum dinyatakan selesai:
1. **Automated Unit Regression Test:** Seluruh perhitungan angka matematis wajib 100% lolos pengujian toleransi 0 rupiah / 0 unit selisih.
2. **ACID Transaction Integrity:** Kueri mutasi tetap dilindungi oleh `$this->db->trans_start()` dan `$this->db->trans_complete()`.
3. **Defensive Programming Check:** Kompatibel 100% dengan PHP 5.6 (`array()`, `isset()`), bebas *undefined property/index warnings*.
