# DOKUMEN RANGKUMAN SESI DISKUSI & PENGEMBANGAN
## Modul Penerimaan (749), Dashboard Finansial Konsumen 360°, Rekonsiliasi Kasir & Resilient Loader
**Tanggal Sesi:** 25 – 26 Agustus 2026  
**Stack Teknologi:** PHP 5.6 | CodeIgniter 3.1.8 (HMVC Wiredesignz MX) | MariaDB 10 / MySQL | Bootstrap 3 & jQuery

---

## 1. LATAR BELAKANG & KELUHAN AWAL PENGGUNA (PROBLEM STATEMENTS)

Sesi ini berawal dari serangkaian kendala operasional kasir dan kendala teknis pada sistem *Everest ERP*, khususnya pada modul **Penerimaan Kas/Bank (749)** dan sub-modul terkait:

1. **PHP Notice pada `MdlMother.php`:**
   * Terjadi pesan error `Notice: Undefined property: CI::$prefix in core/Model.php on line 73` saat kasir membuka menu riwayat transaksi.
2. **Duplikasi Data Kwitansi Uang Muka (4467):**
   * Kwitansi Uang Muka tertentu (dokumen #4467) terbaca dobel karena baris *digital sign* / otorisasi ikut terhitung sebagai kwitansi baru.
3. **Ketiadaan Informasi Sisa Saldo Uang Muka (DP):**
   * Pada tabel kwitansi 4467, kasir hanya melihat nilai yang diterima dan nilai yang sudah digunakan, tetapi tidak melihat sisa saldo DP yang masih mengendap (*holding deposit*).
4. **Kesulitan Mengetahui Instrumen/Metode Pembayaran (749):**
   * Kasir harus mengklik dan membuka nota satu per satu hanya untuk menjawab apakah pembayaran dilakukan via Transfer Bank (rekening apa), Tunai, Potong DP, Titipan, atau Credit Notes.
5. **Dokumen Operasional Proyek (SPK) Memenuhi Layar:**
   * Tampilan drawer rekonsiliasi proyek terlalu panjang karena daftar SPK teknis lapangan ditampilkan utuh, padahal kasir lebih membutuhkan informasi keuangan.
6. **Ketiadaan Informasi Cepat pada Nomor Dokumen (Hover Popover):**
   * Kasir tidak bisa melihat ringkasan singkat saat kursor diarahkan ke nomor nota, harus membuka halaman baru.
7. **Kebutuhan Memahami Kondisi Finansial Konsumen Secara Utuh (Customer 360°):**
   * Kasir membutuhkan ringkasan global dalam satu layar:
     - Berapa total seluruh piutang konsumen dari semua modul/rekening piutang.
     - Berapa total uang muka konsumen yang masih mengendap di kasir (hutang ke konsumen).
     - Berapa sisa kewajiban bersih konsumen dan persentase cakupan uang mukanya.
8. **Kendala Modal Stuck / Gantung pada `BootstrapDialog.show`:**
   * Ketika kasir mengklik nama konsumen untuk membuka formulir pembayaran, pemanggilan jQuery `.load(url)` bawaan tidak menangani status error (seperti server 503, 500, atau koneksi terputus).
   * Akibatnya, spinner animasi berputar tanpa henti (*infinite loading*) dan kasir "menunggu sampai ayam jantan bertelur" tanpa kepastian.
9. **Kebutuhan Audit Diagnostik & Estimasi Waktu Loading (RUM):**
   * Dibutuhkan pencatatan tanggal & waktu mulai, live timer, waktu saat gagal, durasi timeout, dan rata-rata waktu loading per komputer untuk URL yang sama tanpa membebani server/database.

---

## 2. ANALISIS AKAR MASALAH (ROOT CAUSE ANALYSIS)

### A. PHP Notice `$prefix` pada `MdlMother.php`
* Properti `$prefix`, `$tableName`, dan `$tableNames` tidak dideklarasikan secara eksplisit pada class induk `MdlMother extends CI_Model`.
* Pada PHP 5.6 di lingkungan CodeIgniter, mengakses properti yang belum dideklarasikan melalui method bawaan memicu *magic getter* `__get()` milik CI Controller, yang menghasilkan *Notice: Undefined property*.

### B. Duplikasi Data Kwitansi Uang Muka (4467)
* Dalam arsitektur transaksi Everest, transaksi penerimaan uang muka induk memiliki `link_id = 0` (atau `NULL`).
* Ketika dokumen tersebut ditandatangani secara digital (*approval step*), sistem membuat record turunan di tabel `transaksi` dengan format nomor `4467.x.x_1_[timestamp]` di mana kolom `link_id` diisi dengan ID transaksi induk.
* Query pada controller sebelumnya tidak menyaring `link_id`, sehingga baris approval tersebut dianggap sebagai transaksi penerimaan uang muka terpisah dan nilainya terhitung dobel.

### C. Ekstraksi Multi-Metode Pembayaran (749)
* Data instrumen pembayaran tersimpan di dalam tabel `transaksi_data_registry` kolom `items` dalam format serialized string (base64).
* Tiap item memuat data detail seperti `cash_account__folders_nama` (nama kas/bank), `cash_account__label` (nomor rekening), dan `uangMuka` (referensi kwitansi DP jika memotong uang muka).

### D. Perilaku Bawaan jQuery `.load(url)`
* jQuery `.load(url)` adalah jalan pintas dari `$.ajax()`. Jika dipanggil tanpa callback error:
  - Saat server merespons HTTP 503 (*Service Unavailable*), HTTP 500, atau jika koneksi timeout/putus (status 0), jQuery tidak mengganti konten DOM yang sudah ada.
  - Karena kontainer sudah diset berisi animasi *spinner*, *spinner* tersebut tidak pernah di-reset, mengakibatkan *stuck forever*.

---

## 3. SOLUSI & IMPLEMENTASI TEKNIS

### 3.1. Perbaikan Model Induk (`MdlMother.php`)
* **Berkas:** `application/models/Mdls/MdlMother.php`
* **Perubahan:**
  - Mendeklarasikan properti class:
    ```php
    protected $prefix = null;
    protected $tableName;
    protected $tableNames = array();
    ```
  - Memperbarui fungsi `lookupDataCount()` menjadi *safe check*:
    ```php
    if (isset($this->prefix) && $this->prefix != null && isset($this->tableNames[$this->prefix]["main"])) {
        // eksekusi query count
    }
    ```

---

### 3.2. Eliminasi Duplikasi Kwitansi Uang Muka (4467)
* **Berkas:** `application/modules/penerimaan/controllers/Transaksi.php`
* **Perubahan:**
  - Menambahkan filter mutlak pada query pembacaan kwitansi uang muka:
    ```sql
    AND (t.link_id = '0' OR t.link_id IS NULL)
    AND t.trash = 0
    AND (t.cancel_dtime IS NULL OR t.cancel_dtime = '0000-00-00 00:00:00')
    ```
  - Memastikan hanya transaksi induk sah yang masuk ke dalam kalkulasi saldo uang muka.

---

### 3.3. Dashboard Profil Finansial Konsumen 360° (Panel 0)
* **Berkas:**
  - `application/modules/penerimaan/controllers/Transaksi.php` (kalkulasi metrik)
  - `application/modules/penerimaan/views/transaksi.php` (rendering antarmuka)
* **Komponen Metrik yang Dihitung:**
  1. **Total Piutang Konsumen:**
     - Mengambil seluruh sisa tagihan/piutang aktif konsumen di seluruh modul sistem (Penjualan Reguler, Proyek 7499, POS, dll) dari tabel `transaksi_payment_source`.
  2. **Total Saldo Uang Muka Mengendap:**
     - Mengakumulasikan seluruh kwitansi 4467 sah yang telah diterima kasir dikurangi pemakaian di modul 749.
  3. **Sisa Kewajiban Bersih (*Net Outstanding*):**
     $$\text{Net Kewajiban} = \max(0, \text{Total Piutang} - \text{Saldo DP Mengendap})$$
  4. **Status Profil Finansial Konsumen:**
     - 🟢 **PRIME / TER-COVER PENUH:** Jika Saldo DP $\ge$ Total Piutang (Coverage 100%).
     - 🟡 **SEBAGIAN TER-COVER DP:** Jika Saldo DP $>$ 0 namun belum menutupi seluruh piutang.
     - 🔴 **OUTSTANDING MENUNGGU PEMBAYARAN:** Jika tidak ada saldo DP mengendap sama sekali.

---

### 3.4. Kolom "Sisa Saldo DP" pada Kwitansi 4467
* **Berkas:** `application/modules/penerimaan/views/transaksi.php`
* **Perubahan:**
  - Menambahkan kolom **Sisa Saldo DP** di sebelah kolom Nilai Dibatalkan:
    $$\text{Sisa Saldo DP} = \max(0, \text{Nilai Diterima} - \text{Nilai Digunakan} - \text{Nilai Dibatalkan})$$
  - Menampilkan angka tebal warna kuning-emas tegas (`#d97706`) jika masih ada sisa saldo aktif.

---

### 3.5. Transparansi Metode Pembayaran pada Bukti Penerimaan (749)
* **Berkas:**
  - `application/modules/penerimaan/controllers/Transaksi.php`
  - `application/modules/penerimaan/views/transaksi.php`
* **Perubahan:**
  - Mengekstrak data dari `transaksi_data_registry.items` dan menampilkan rincian langsung di bawah nomor bukti 749:
    - 🏦 `Transfer BCA (8830713132) • Kasir: Widya`
    - 💵 `Kas Tunai • Kasir: ...`
    - 🔄 `Potong Uang Muka (4467.xxx) • Kasir: ...`
    - 💳 `Potong Titipan Customer • Kasir: ...`

---

### 3.6. Hover Card Popover Interaktif & Dokumen SPK Collapsible
* **Berkas:** `application/modules/penerimaan/views/transaksi.php`
* **Perubahan:**
  - **Bootstrap Popover pada Semua Nomor Nota:** Mengarahkan kursor ke nomor nota (749, 7499, 4467, SPK) menampilkan ringkasan penting dokumen (tanggal/jam, nominal, kasir pembuat, metode pembayaran, rincian rekening, dan status validasi).
  - **Dokumen Operasional (SPK) Collapsible:** Bagian dokumen lapangan dibuat *default-collapsed* dengan tombol toggle `[Buka / Tutup SPK]`, menjaga layar kasir tetap bersih dan fokus pada data keuangan.

---

### 3.7. Resilient Modal Loader dengan Stopwatch, Rolling Average & Kartu Diagnostik
* **Berkas:** `application/modules/penerimaan/views/transaksi.php` (fungsi global `window.openReceiptPaymentModal`)
* **Mekanisme Fitur:**
  1. **Client-Side Telemetry Cache (`localStorage`):**
     - Menyimpan 5 durasi pemuatan sukses terakhir per URL unik di browser kasir.
     - **Nol beban database / query server** saat server sedang padat.
     - Menghitung rata-rata bergerak (*moving average*) secara instan.
  2. **Tampilan Saat Loading Berjalan:**
     - 📅 **Waktu Mulai:** Mencatat jam dan detik mulai request (`26 Agu 2026, 11:55:02`).
     - ⏱️ **Waktu Berjalan:** *Live stopwatch* berjalan per 100 milidetik (`0.0s`, `1.4s`, `2.8s`...).
     - 📊 **Rata-rata Normal:** Menampilkan benchmark waktu PC tersebut (`~1.8s (dari 5 riwayat)`).
     - ⏳ **Batas Timeout:** `25 detik`.
     - ⚠️ **Smart Warning:** Otomatis memperingatkan kasir jika respon melebihi $1.8\times$ dari rata-rata normal.
  3. **Tampilan Kartu Diagnostik Saat Terjadi Error (503 / 500 / Timeout / Putus Koneksi):**
     - Spinner langsung berhenti dan berganti menjadi kotak pesan diagnostik lengkap:
       - 📅 **Waktu Mulai:** `26 Agu 2026, 11:55:02`
       - 🛑 **Waktu Saat Gagal:** `26 Agu 2026, 11:55:06 (4.1s)`
       - ⏳ **Batas Timeout:** `25 detik`
       - 📋 **Kode Status:** `503 (Service Unavailable)` *(atau timeout / status jaringan)*
     - Disediakan tombol **`[🔄 Coba Muat Ulang]`** untuk me-request ulang otomatis tanpa refresh halaman browser, serta tombol **`[✕ Tutup Dialog]`**.

---

## 4. HASIL UJI COBA & VERIFIKASI

1. **Uji Linting Sintaks PHP 5.6 (`php -l`):**
   - `application/models/Mdls/MdlMother.php` $\rightarrow$ **LULUS (0 Error)**
   - `application/modules/penerimaan/controllers/Transaksi.php` $\rightarrow$ **LULUS (0 Error)**
   - `application/modules/penerimaan/views/transaksi.php` $\rightarrow$ **LULUS (0 Error)**
2. **Uji Simulasi Pipeline Data E2E (`test_e2e_pipeline.php`):**
   - Filter `link_id = 0` berhasil mengeleminasi record approval ganda pada kwitansi 4467.
   - Resolusi instrumen pembayaran 749 menghasilkan teks metode dan rekening yang akurat.
   - Metrik Profil Finansial 360° berhasil terkalkulasi dengan sempurna.
3. **Uji Tampilan Browser:**
   - Spinner animasi dan kotak telemetri waktu berhasil muncul secara mulus di tengah layar saat nama konsumen diklik.

---

## 5. REKOMENDASI & CATATAN PENGEMBANGAN LANJUTAN

1. **Pemeliharaan Kapasitas Server:**
   - Pesan error 503 yang sempat muncul disebabkan oleh kapasitas web server / PHP-FPM pool yang penuh pada server demo. Dengan adanya kartu diagnostik, kasir dan tim IT dapat langsung mengidentifikasi kapan lonjakan trafik terjadi.
2. **Penerapan Pola Resilient Loader ke Modul Lain:**
   - Pola fungsi `window.openReceiptPaymentModal` dapat diangkat menjadi fungsi helper global di level layout utama (`template/default.html` atau asset JS global) agar modal-modal transaksi lain (seperti modul Penjualan, Pembelian, atau Distribusi) juga memiliki proteksi *anti-stuck* dan stopwatch yang sama.

---
*Dokumen ini disusun sebagai catatan teknis resmi atas seluruh perubahan yang telah disetujui dan diterapkan pada sistem Everest ERP.*
