# 📑 DOKUMEN ANALISIS ALUR HULU - HILIR DISKON SUPPLIER
**Sistem:** Everest ERP (CodeIgniter 3.1.8 / PHP 5.6)  
**Database Analisis:** `192.168.5.17` (`run_everest_modul`) & Codebase `everest_opname28sep`  
**Tanggal Analisis:** 29 September 2026  
**Status Dokumen:** Blueprint Temuan & Rencana Besar Perbaikan  

---

## 1. Eksekutif Ringkasan

Berdasarkan audit end-to-end dari hulu (penerbitan PO dan penerimaan barang di modul `pembelian`) hingga ke hilir (klaim diskon dan monitoring dataTable di modul `kompensasiharga`), ditemukan **4 titik kegagalan sistemik** yang menyebabkan:
1. **2.308 Dokumen Penerimaan Barang (GRN `467`)** memiliki saldo debet jurnal akuntansi yang membengkak ($2\times$ hingga $4\times$ lipat, atau mengambil seluruh total PO pada penerimaan parsial).
2. **Baris Diskon Tertentu Hilang** di tabel `stock_locker_diskon` (seperti Diskon 1 pada `GRN.-1.2496`).
3. **49 Dokumen Klaim Diskon (`3333`)** gagal membentuk jurnal mutasi kredit pada buku pembantu piutang supplier (`__rek_pembantu_subpiutangsuppliertrans__1010020030`), dengan 43 dokumen di antaranya terjadi pada **22 Juli 2026**.
4. **DataTable Kompensasi Harga** menampilkan sisa diskon yang keliru (contoh: Rp 20.185.738 alih-alih Rp 7.633.256) karena mengambil fallback dari jurnal pembantu yang sudah terdebet ganda/over-debit.
5. **Masalah ini aktif dan terus berulang setiap hari** pada transaksi baru (terkonfirmasi hingga 29 September 2026).

---

## 2. Diagram Alur Hulu - Hilir & Titik Kerusakan (Mermaid)

```mermaid
flowchart TD
    classDef ok fill:#d4edda,stroke:#28a745,color:#155724;
    classDef err fill:#f8d7da,stroke:#dc3545,color:#721c24,stroke-width:2px;
    classDef warn fill:#fff3cd,stroke:#ffc107,color:#856404;

    subgraph HULU_PO ["HULU 1: Purchase Order (PO 466 - Modul Pembelian)"]
        PO["Penerbitan PO 466<br/>(Contoh: PO.-1.1849 / 189 unit)"]:::ok
        PRE_LOCKER["Pre-Locker Diskon Supplier<br/>(stock_locker_pre_diskon)"]:::err
        PO -->|"PreSyncDiskonPembelian"| PRE_LOCKER
        TITIK_A["❌ TITIK RUSAK 1:<br/>Nilai di pre_diskon terisi 0<br/>atau tidak tersinkronisasi"]:::err
        PRE_LOCKER -.-> TITIK_A
    end

    subgraph HULU_GRN ["HULU 2: Penerimaan Barang (GRN 467 - Modul Pembelian)"]
        GRN["Penerimaan Fisik GRN 467<br/>(Contoh: GRN.-1.2496 / 50 unit)"]:::ok
        PRE_CHECK{"Cek Pre-Locker<br/>(nilai > 10?)"}:::warn
        LOCKER_DISKON["Tabel stock_locker_diskon<br/>(Fisik Hak Diskon Supplier)"]:::err
        JURNAL_CACHE["Tabel _rek_pembantu_cache<br/>(COA 1010020030 - Piutang Diskon)"]:::err

        PO --> GRN
        GRN --> PRE_CHECK
        PRE_CHECK -->|"Jika Nilai = 0"| RESET["Diskon Di-reset = 0<br/>Tidak masuk items4_sum"]:::err
        RESET --> LOCKER_DISKON
        TITIK_B1["❌ TITIK RUSAK 2A:<br/>Diskon 1 Tidak Terbit di Locker<br/>(Hanya Diskon 2 & 3 yang ada)"]:::err
        LOCKER_DISKON -.-> TITIK_B1

        GRN -->|"Komponen Master [99] & Detail [5]"| JURNAL_CACHE
        TITIK_B2["❌ TITIK RUSAK 2B:<br/>Jurnal Debet Ganda (2x/4x lipat)<br/>& Catat Total PO Utuh pada Parsial<br/>(Debet Rp 24,6 Jt bukan Rp 12,07 Jt)"]:::err
        JURNAL_CACHE -.-> TITIK_B2
    end

    subgraph HILIR_KLAIM ["HILIR 1: Realisasi Klaim Diskon (3333 - Modul Kompensasi Harga)"]
        KLAIM["Input Realisasi Klaim 3333<br/>(Contoh: 3333.-1.191 & 3333.-1.2570)"]:::ok
        SELECTOR["Selector Nota / GRN<br/>(_selectorPihakMain)"]:::warn
        MUTASI_KREDIT["Tabel Mutasi Kredit Pembantu<br/>(__rek_pembantu...1010020030)"]:::err
        GL_JURNAL["Jurnal Umum (GL)<br/>(Credit Note / Kas / Piutang)"]:::ok

        GRN --> SELECTOR
        SELECTOR --> KLAIM
        KLAIM --> GL_JURNAL
        KLAIM -->|"Potong Saldo Diskon"| LOCKER_DISKON
        KLAIM -->|"Posting Kredit Mutasi"| MUTASI_KREDIT

        TITIK_C["❌ TITIK RUSAK 3:<br/>Selector Salah Kirim ID (pihakMainID=2)<br/>Bukan ID GRN (extern_id mismatch)<br/>-> 49 Klaim Gagal Posting Mutasi Kredit"]:::err
        MUTASI_KREDIT -.-> TITIK_C
    end

    subgraph HILIR_UI ["HILIR 2: Monitoring & Tampilan (DataTable - Transaksi.php)"]
        DATATABLE["DataTable viewKlaimSupplierDataAjax<br/>(Kolom Diskon Supplier, Klaim, Sisa)"]:::err
        LOCKER_DISKON -->|"Sumber Primer (Fisik Locker)"| DATATABLE
        JURNAL_CACHE -->|"Fallback bila Locker = 0"| DATATABLE
        MUTASI_KREDIT -->|"Total Nilai Diklaim"| DATATABLE

        TITIK_D["❌ TITIK RUSAK 4:<br/>Locker Diskon 1 Hilang -> Fallback ke Cache Jurnal.<br/>Cache Jurnal Mengalami Over-debit 24,6 Jt.<br/>Hasil Tampilan Bengkak: Rp 20.185.738!"]:::err
        DATATABLE -.-> TITIK_D
    end
```

---

## 3. Rincian Teknis 4 Titik Kerusakan Sistemik

### 🔴 TITIK RUSAK 1: Anomali Plafon Awal di Pre-Locker PO (`466`)
* **Modul:** `pembelian` (Transaksi `466`)
* **File Terkait:** [coTransaksiCore.php (pembelian)](file:///w:/everest_opname28sep/application/modules/pembelian/config/coTransaksiCore.php#L75-L95) & [PreSyncDiskonPembelian.php](file:///w:/everest_opname28sep/application/models/Preprocs/PreSyncDiskonPembelian.php)
* **Mekanisme Bug:**
  Saat PO `466` diterbitkan, komponen `SyncDiskonPembelian` bertugas mengisi tabel `stock_locker_pre_diskon`. Namun pada transaksi PO tertentu (seperti PO `383654`), seluruh 18 baris pre-diskon tercatat bernilai `0.0000000000`.
* **Dampak:** Nilai 0 ini menjadi pemicu kesalahan berantai saat barang diterima di GRN `467`.

---

### 🔴 TITIK RUSAK 2: Hilangnya Baris Locker & Over-Debit Jurnal pada GRN (`467`)
* **Modul:** `pembelian` (Transaksi `467` / Goods Received Note)
* **File Terkait:**
  * [PreSyncDiskonPembelian.php#L277-L284](file:///w:/everest_opname28sep/application/models/Preprocs/PreSyncDiskonPembelian.php#L277-L284)
  * [PreSyncDiskonPembelian.php#L327](file:///w:/everest_opname28sep/application/models/Preprocs/PreSyncDiskonPembelian.php#L327)
  * [coTransaksiCore.php (pembelian)#L120-L215](file:///w:/everest_opname28sep/application/modules/pembelian/config/coTransaksiCore.php#L120-L215)
* **Mekanisme Bug:**
  1. **Reset Diskon ke 0:** Di [PreSyncDiskonPembelian.php](file:///w:/everest_opname28sep/application/models/Preprocs/PreSyncDiskonPembelian.php), sistem mengecek `WHERE nilai > 10` pada `stock_locker_pre_diskon`. Karena nilai di pre-diskon adalah 0, sistem mengeksekusi:
     ```php
     $key_reset = "diskon_$diskon_key_id" . "_nilai";
     $_SESSION[$cCode][$src_key][$pID][$key_reset] = 0;
     ```
     Akibatnya, Diskon 1 tidak dimasukkan ke array `items4_sum`, sehingga model `ComLockerDiskonValue` tidak pernah menerbitkan slot Diskon 1 ke `stock_locker_diskon`.
  2. **Over-Debit Akuntansi (Jurnal Ganda & Utuh):**
     * Pada penerimaan parsial, jurnal master mencatat seluruh diskon dari total PO (Rp 24.628.767) ke 1 GRN parsial, bukan proporsional 50 unit (Rp 12.076.285).
     * Pada ribuan GRN reguler lainnya, eksekusi simultan antara komponen master [99] dan detail [5] mendebet COA `1010020030` secara berulang, menghasilkan **Debet Jurnal $2\times$ hingga $4\times$ lipat dari nilai fisik locker**.

---

### 🔴 TITIK RUSAK 3: Mismatch ID Selector pada Klaim Diskon (`3333`)
* **Modul:** `kompensasiharga` (Transaksi `3333`)
* **File Terkait:**
  * [coTransaksiUi.php (kompensasiharga)#L2610](file:///w:/everest_opname28sep/application/modules/kompensasiharga/config/coTransaksiUi.php#L2610)
  * [coTransaksiCore.php (kompensasiharga)#L3333](file:///w:/everest_opname28sep/application/modules/kompensasiharga/config/coTransaksiCore.php)
  * [ComRekeningPembantuPiutangSupplierDetailTransItem.php](file:///w:/everest_opname28sep/application/models/Coms/ComRekeningPembantuPiutangSupplierDetailTransItem.php)
* **Mekanisme Bug:**
  1. Pada konfigurasi selector lama:
     ```php
     "pihakNameMainDiskonIdSelector" => "id" // Salah: Mengambil ID baris jenis diskon (1 s/d 8)
     ```
  2. Parameter yang terkirim ke `pihakMainID` adalah `2` (ID Diskon 2), bukan ID GRN (misal `34662`).
  3. Saat komponen `RekeningPembantuPiutangSupplierDetailTransItem` memposting kredit mutasi, query mencari saldo GRN di cache dengan filter:
     ```php
     WHERE extern_id = '2' AND extern2_id = '' AND extern3_id = '11'
     ```
  4. Karena di cache GRN dicatat dengan `extern_id = 34662` (ID GRN), pencarian menghasilkan 0/kosong. Jurnal mutasi kredit di `__rek_pembantu_subpiutangsuppliertrans__1010020030` akhirnya **tidak terbentuk sama sekali (gagal posting)**.
* **Dampak:** Ditemukan **49 dokumen klaim** yang stok diskonnya terpotong di locker, tetapi buku pembantu akuntansi tidak mencatat kredit mutasinya.

---

### 🔴 TITIK RUSAK 4: Fallback DataTable yang Membaca Data Anomali
* **Modul:** `kompensasiharga` (Monitoring DataTable)
* **File Terkait:** [Transaksi.php#L6345-L6380](file:///w:/everest_opname28sep/application/modules/kompensasiharga/controllers/Transaksi.php#L6345-L6380)
* **Mekanisme Bug:**
  1. Controller [Transaksi.php](file:///w:/everest_opname28sep/application/modules/kompensasiharga/controllers/Transaksi.php) mendesain fallback: jika data di `stock_locker_diskon` bernilai 0 / tidak ditemukan, sistem membaca saldo dari `_rek_pembantu_subpiutangsuppliertrans_cache`.
  2. Karena pada Kasus GRN `2496` slot Diskon 1 hilang di locker (Titik Rusak 2), sistem jatuh ke fallback buku pembantu.
  3. Buku pembantu tersebut memuat angka over-debit seluruh PO sebesar Rp 24.628.767 (Titik Rusak 2).
  4. Perhitungan di layar: $\text{Debet } 24.628.767 - \text{Kredit Klaim } 4.443.029 = \mathbf{\text{Rp } 20.185.738}$ (Angka bengkak yang membingungkan user).

---

## 4. Matriks Dampak pada Database Produksi (`192.168.5.17`)

| Kategori Data Bermasalah | Tahun 2024 | Tahun 2025 | Tahun 2026 | Total Terdampak | Status Terkini |
| :--- | :---: | :---: | :---: | :---: | :--- |
| **Klaim 3333 Tanpa Mutasi Kredit** | 6 dok | 0 dok | 43 dok | **49 dokumen** | Terhenti sejak update selector `transaksi_id`, namun 49 dokumen lama menggantung. |
| **GRN 467 Jurnal Debet Over / Beda Locker** | 1.075 dok | 920 dok | 314 dok | **2.308 dokumen** | **Masih aktif terjadi setiap hari** (terkonfirmasi per 29/09/2026 dengan debet $4\times$ lipat). |

---

## 5. Rencana Besar Perbaikan (Grand Repair Plan)

Perbaikan menyeluruh dibagi menjadi **3 Pilar Strategis**:

```
                       ┌───────────────────────────────────────────────┐
                       │        RENCANA BESAR PERBAIKAN DISKON         │
                       └──────────────────────┬────────────────────────┘
                                              │
         ┌────────────────────────────────────┼────────────────────────────────────┐
         ▼                                    ▼                                    ▼
┌──────────────────┐                ┌──────────────────┐                ┌──────────────────┐
│     PILAR 1      │                │     PILAR 2      │                │     PILAR 3      │
│  Perbaikan Hulu  │                │  Perbaikan Hilir │                │ Rekonsiliasi DB  │
│  (Modul 466/467) │                │   (Modul 3333)   │                │ (Data Produksi)  │
└──────────────────┘                └──────────────────┘                └──────────────────┘
```

### PILAR 1: Perbaikan Logika Hulu (`pembelian` — PO `466` & GRN `467`)
1. **Perbaikan Proporsionalitas GRN Parsial:**
   * Memodifikasi penghitungan debet piutang diskon agar dihitung proporsional terhadap unit yang diterima:
     $$\text{Debet Diskon GRN} = \frac{\text{Qty Diterima}}{\text{Qty PO}} \times \text{Total Diskon PO}$$
   * Meniadakan duplikasi posting antara master komponen [99] dan detail komponen [5] di [coTransaksiCore.php (pembelian)](file:///w:/everest_opname28sep/application/modules/pembelian/config/coTransaksiCore.php) agar tidak terjadi lagi debet $2\times$ atau $4\times$ lipat.
2. **Perbaikan Sinkronisasi Pre-Locker:**
   * Memperbaiki logika di [PreSyncDiskonPembelian.php](file:///w:/everest_opname28sep/application/models/Preprocs/PreSyncDiskonPembelian.php) agar tidak sembarangan mereset diskon ke 0 jika barang fisik GRN memang memiliki hak diskon dari supplier.

---

### PILAR 2: Perbaikan Logika Hilir (`kompensasiharga` — Klaim `3333` & Monitoring)
1. **Penguncian Standar Selector:**
   * Memastikan seluruh konfigurasi di [coTransaksiUi.php (kompensasiharga)](file:///w:/everest_opname28sep/application/modules/kompensasiharga/config/coTransaksiUi.php) secara konsisten menggunakan `"transaksi_id"` (bukan `"id"`).
2. **Formula Anti-Anomali pada DataTable:**
   * Mengunci perhitungan pada [Transaksi.php (kompensasiharga)](file:///w:/everest_opname28sep/application/modules/kompensasiharga/controllers/Transaksi.php):
     $$\text{Sisa Diskon} = \text{Diskon Supplier (Registry GRN)} - \text{Nilai Klaim Mutasi}$$
   * Memutus dependensi langsung DataTable terhadap tabel cache rekening pembantu yang rentan over-debit ganda, sehingga tampilan layar selalu matematis dan benar.

---

### PILAR 3: Rekonsiliasi & Migrasi Data Produksi (Database `5.17`)
1. **Penyehatan 49 Dokumen Klaim 3333:**
   * Script rekonsiliasi satu kali (*one-time patch*) untuk membuatkan entri mutasi kredit di `__rek_pembantu_subpiutangsuppliertrans__1010020030` pada 49 transaksi yang tertinggal.
2. **Normalisasi Debet 2.308 GRN 467:**
   * Menyelaraskan saldo debet di `_rek_pembantu_subpiutangsuppliertrans_cache` dengan plafon diskon riil GRN yang sah (mengeliminasi debet ganda $2\times$/$4\times$).
3. **Restorasi Baris Locker yang Hilang:**
   * Mengembalikan baris diskon yang hilang di `stock_locker_diskon` (seperti Diskon 1 pada `GRN.-1.2496` senilai Rp 7.633.256,37) agar hak klaim perusahaan ke supplier tidak hilang dari sistem.

---

## 6. Langkah Selanjutnya

Sesuai arahan Anda, dokumen analisa dan arsitektur besar ini menjadi fondasi awal. Selanjutnya, kita dapat menyusun **Rencana Langkah Detail (Execution Checklist & Step-by-Step Script)** untuk masing-masing pilar di atas sebelum diterapkan.
