# Ringkasan Konteks: Kolom Price Bruto & Perhitungan Diskon Paket (Sales Package 1582)

Dokumen ini meringkas riwayat analisis, masalah, dan perbaikan yang telah diterapkan pada transaksi **Sales Pre Order Packed (1582)** terkait kolom Price (Bruto), kalkulasi diskon paket utama, dan pengaman batas maksimum diskon.

---

## 1. Latar Belakang & Kebutuhan Awal
* **Kebutuhan**: Menampilkan kolom **Price (Bruto)** sebelum kolom **Price** pada baris utama Paket (misal: Paket SILVER Office) di halaman shopping cart.
* **Kalkulasi Dinamis**: 
  * Nilai **Price (Bruto)** (`harga_ori` paket utama) harus dihitung secara dinamis dari akumulasi harga bruto komponen-komponennya (`items2` di session) karena data tersebut tidak disimpan langsung di baris utama `items`.
  * Nilai **Disc (%)** (`disc_percent`) dan **Disc (IDR)** (`disc`) pada baris utama paket harus dihitung secara dinamis berdasarkan selisih antara `harga_ori` (Bruto) dan `harga_disc` (Netto).

---

## 2. Masalah & Perbaikan yang Telah Dilakukan

### A. Kolom Price (Bruto) Bernilai 0
* **Penyebab**: Session baris paket utama tidak memiliki properti `harga_ori`.
* **Solusi**: Menambahkan kalkulasi akumulasi `harga_ori` dari komponen `items2` di loop formatting file:
  * [controllers/_shoppingCart.php](file:///w:/san_cik/application/modules/penjualan/controllers/_shoppingCart.php) (fungsi `viewCart()`).
  * [controllers/Create.php](file:///w:/san_cik/application/modules/penjualan/controllers/Create.php) (di ketiga loop pemrosesan `items`).

### B. Salah Hitung Saat Nilai Disc (%) Baris Utama Diubah
* **Penyebab**: 
  1. JavaScript keyup event di `coTransaksiUi.php` menggunakan target `{harga}` (kolom Price / Harga Jual Paket: `20.000.000`) sebagai dasar perkalian persentase diskon.
  2. Backend di `_processSelectProductPaket.php` menggunakan `harga_orig` (`20.000.000`) sebagai basis perhitungan. Hal ini menyebabkan Netto baru terhitung salah (misal input 10% diskon dari paket `20jt` menghitung netto `18jt`, namun setelah reload, sistem mengira diskon dihitung terhadap bruto `61jt` sehingga persentasenya berubah menjadi `70.7%`).
* **Solusi**:
  1. Memperbarui `shoppingCartKeyUpEvents` di [config/coTransaksiUi.php](file:///w:/san_cik/application/modules/penjualan/config/coTransaksiUi.php) agar keyup event menarget `{harga_ori}` (Price Bruto) sebagai dasar perhitungan diskon JavaScript.
  2. Memperbarui fungsi `select()` di [controllers/_processSelectProductPaket.php](file:///w:/san_cik/application/modules/penjualan/controllers/_processSelectProductPaket.php) untuk menghitung total `harga_ori` komponen terlebih dahulu sebagai base price diskon sebelum menghitung Netto baru (`harga_disc`).

### C. Peringatan Selisih Rp 6 (Warning Proporsi Komponen)
* **Penyebab**: Setiap komponen paket dihitung nilai bersihnya dengan fungsi global `pembulatanDiskon()` yang membuang angka desimal di belakang koma (integer floor). Akumulasi pemotongan desimal di seluruh 10 komponen menimbulkan selisih total Rp 6 terhadap harga jual paket.
* **Solusi**: Menggunakan fitur bawaan sistem, yaitu tombol **"Sesuaikan Sisa Diskon Secara Otomatis"** yang memicu AJAX `autoAdjustRoundingAjax()` di `_shoppingCart.php`. Fungsi ini mendeteksi selisih desimal dan mendistribusikannya ke salah satu komponen secara cerdas agar totalnya cocok secara presisi.

### D. Pengaman Batas Maksimum Diskon (Safety Guard / Clamping)
* **Kebutuhan**: Mencegah diskon dimasukkan berlebih (misal > 100% atau nominal diskon melebihi harga bruto barang).
* **Solusi**:
  1. **Frontend**: Memperbarui JavaScript keyup di `coTransaksiUi.php` untuk membatasi input `disc_percent` maksimal `100` dan input nominal `disc` maksimal senilai `{harga_ori}` secara real-time.
  2. **Backend**: Menambahkan logika *clamping* di `_processSelectProductPaket.php` agar nilai persentase diskon dibatasi ketat di rentang `0` hingga `100` sebelum kalkulasi dilakukan.

---

## 3. Berkas yang Terpengaruh & Telah Diperbarui
1. **[config/coTransaksiUi.php](file:///w:/san_cik/application/modules/penjualan/config/coTransaksiUi.php)**
   * Menambahkan kolom `harga_ori` sebelum `harga`.
   * Mengubah event `onkeyup` pada `disc_percent` dan `disc` menggunakan `{harga_ori}` & menambahkan limit *clamping*.
2. **[controllers/_shoppingCart.php](file:///w:/san_cik/application/modules/penjualan/controllers/_shoppingCart.php)**
   * Mengisi `harga_ori`, `disc`, dan `disc_percent` secara dinamis di `viewCart()`.
3. **[controllers/Create.php](file:///w:/san_cik/application/modules/penjualan/controllers/Create.php)**
   * Mengisi `harga_ori`, `disc`, dan `disc_percent` secara dinamis di 3 loop formatting data.
4. **[controllers/_processSelectProductPaket.php](file:///w:/san_cik/application/modules/penjualan/controllers/_processSelectProductPaket.php)**
   * Memperbarui logika update `disc_percent` pada method `select()` agar berbasis total `harga_ori` komponen serta menambahkan logika pengaman batas desimal diskon.
