# Blueprint Laporan Outstanding by Salesman (Versi Packinglist)

Dokumen ini menjelaskan arsitektur, alur data, definisi kolom, dan logika bisnis yang digunakan dalam Laporan Outstanding by Salesman (Versi Packinglist) pada aplikasi **san_cik**. Dari kacamata *best practice* akuntansi, laporan ini berfungsi sebagai **Laporan Order Backlog (Pesanan Belum Terkirim)** yang menghubungkan kinerja operasional penjualan dengan proyeksi pendapatan.

---

## 1. Peta Komponen (File Mapping)

Laporan ini dibangun menggunakan pola HMVC CodeIgniter dengan komponen-komponen berikut:

* **Controller:** [Outstanding.php](file:///w:/san_cik/application/modules/laporan/controllers/Outstanding.php)
  Mengatur request URL, memvalidasi input tanggal/periode, dan memuat view.
* **Library (Core Processing):** [DataOutstanding.php](file:///w:/san_cik/application/libraries/laporan/DataOutstanding.php)
  Melakukan query database SQL dan kalkulasi matematika dari data transaksi kotor menjadi data siap tampil.
* **View (Template Tampilan):** [outstanding.php](file:///w:/san_cik/application/modules/laporan/views/outstanding.php)
  Merender tabel, tombol aksi (*Copy*, *CSV*, *Print*), dan pencarian/filter kolom.
* **MongoDB (Caching Layer):** Koleksi `outstanding_seller_blnan`
  Menyimpan data statik bulanan agar pemuatan halaman lebih cepat jika data transaksi pada bulan tersebut tidak berubah.

---

## 2. Alur Arsitektur & Aliran Data

```mermaid
graph TD
    A[User Request /laporan/outstanding/viewoutstanding] --> B[Controller: vieweoutstanding]
    B --> C[Load View: outstanding.php]
    C -- AJAX Request --> D[Controller: cekoutstandingseller]
    D --> E{Apakah MongoDB Aktif & Data Up-to-Date?}
    E -- Ya --I F[Ambil Data dari MongoDB: outstanding_seller_blnan]
    E -- Tidak --> G[Panggil Library: DataOutstanding -> callPerSeller]
    G --> H[Kueri SQL Database]
    H --> I[Hitung Formula & Distribusi Outstanding]
    I --> J[Simpan Caching ke MongoDB]
    F --> K[Render Tabel ke Halaman Web]
    J --> K
```

---

## 3. Definisi Kolom & Rumus Perhitungan (Format Mutasi / Roll-Forward)

Secara prinsip pelaporan finansial, struktur laporan ini mengadopsi format **Mutasi Saldo (Roll-Forward Schedule)**:
`Saldo Akhir = Saldo Awal + Penambahan Periode Berjalan - Pengurangan Periode Berjalan`

Berikut adalah rumus matematika di tingkat baris (*row level*) untuk setiap kolom tabel yang diproses di method [callPerSeller](file:///w:/san_cik/application/libraries/laporan/DataOutstanding.php#L1827):

| Nama Kolom | Nama Variabel Kode | Deskripsi & Rumus Perhitungan |
| :--- | :--- | :--- |
| **NO** | - | Nomor urut baris data. |
| **SID** | `seller_id` | ID unik dari salesman. |
| **SALESMAN** | `seller_nama` | Nama lengkap salesman. |
| **PREVIOUS OUTSTANDING VALUE** | `prev_kredit_all` | Sisa nilai outstanding (tunggakan SO) periode lalu.<br>$$\text{prev\_kredit\_all} = \text{Lokal} + \text{Project} + \text{Export}$$ |
| **NEW ORDER VALUE** | `now_saldo_order_all` | Total nilai SO baru yang masuk di periode berjalan.<br>$$\text{now\_saldo\_order\_all} = \text{Lokal} + \text{Project} + \text{Export}$$ |
| **NEW REJECT VALUE** | `now_saldo_reject_582spd` | Total nilai SO baru yang ditolak (*rejected*) di periode berjalan. |
| **NEW CLOSE VALUE** | `now_saldo_closed_582spd` | Total nilai SO baru yang ditutup tanpa kirim (*closed*) di periode berjalan. |
| **CANCEL VALUE (Order)** | `now_batal_nilai_9912` | Nilai pembatalan pesanan baru. |
| **RETURN VALUE (Order)** | `now_return_nilai_982` | Nilai retur pesanan baru. |
| **NEW ORDER NETTO VALUE** | `now_saldo_order_netto_all` | Nilai bersih order baru yang aktif.<br>$$\text{Netto Order} = \text{New Order} - \text{Reject} - \text{Close}$$ |
| **NEW NETTO PACKING LIST VALUE** | `now_saldo_kirim_all_new` | Alokasi pengiriman yang memotong **order baru**.<br>* Capped sebesar `NEW ORDER NETTO VALUE`. |
| **LAST NETTO PACKING LIST VALUE** | `now_saldo_kirim_all_old` | Alokasi pengiriman yang digunakan untuk melunasi **outstanding lama**.<br>* Diturunkan dari sisa pengiriman setelah memotong order baru. |
| **PACKING LIST VALUE** | `now_saldo_kirim_all` | Nilai kotor seluruh surat jalan/pengiriman di periode berjalan.<br>$$\text{Packing List Value} = \text{Lokal} + \text{Project} + \text{Export}$$ |
| **CANCEL VALUE (Delivery)** | `now_batal_nilai_9912` | Nilai pembatalan surat jalan (*packing list*). |
| **RETURN VALUE (Delivery)** | `now_return_nilai_982` | Nilai retur barang yang dikirim (*packing list*). |
| **NETTO PACKING LIST VALUE** | `now_saldo_kirim_netto_all` | Nilai pengiriman bersih setelah retur/batal.<br>$$\text{Netto PL} = \text{Packing List Value} - \text{Cancel} - \text{Return}$$ |
| **ALL OUTSTANDING VALUE** | `last_kredit_all` | Sisa nilai outstanding akhir periode.<br>$$\text{Outstanding Akhir} = \text{Prev Outstanding} + \text{New Order Netto Value} - \text{Netto Packing List Value}$$ |

---

## 4. Logika Bisnis Distribusi Pengiriman (New vs. Last Netto PL)

Sistem memecah total nilai pengiriman (`now_saldo_kirim_all`) secara kronologis (FIFO) agar evaluasi performa pelayanan pengiriman salesmen terpantau objektif:

* **Skenario A: $\text{NEW ORDER NETTO VALUE} \ge \text{Total Packing List Value}$**
  * Seluruh pengiriman dialokasikan untuk memenuhi pesanan baru.
  * $$\text{NEW NETTO PL} = \text{Total Packing List Value}$$
  * $$\text{LAST NETTO PL} = 0$$

* **Skenario B: $\text{NEW ORDER NETTO VALUE} < \text{Total Packing List Value}$ (dengan syarat $\text{NEW ORDER NETTO VALUE} > 0$)**
  * Pengiriman untuk pesanan baru dibatasi maksimal sebesar nilai bersih pesanan baru. Sisa kelebihan kiriman dialokasikan untuk memotong tunggakan lama.
  * $$\text{NEW NETTO PL} = \text{NEW ORDER NETTO VALUE}$$
  * $$\text{LAST NETTO PL} = \text{Total Packing List Value} - \text{NEW ORDER NETTO VALUE}$$

* **Skenario C: $\text{NEW ORDER NETTO VALUE} \le 0$**
  * Karena tidak ada pesanan baru yang aktif, seluruh pengiriman dialokasikan ke tunggakan lama.
  * $$\text{NEW NETTO PL} = 0$$
  * $$\text{LAST NETTO PL} = \text{Total Packing List Value}$$

> [!IMPORTANT]
> **Catatan Koreksi (Bug Fix):**
> Sebelumnya, sistem menggunakan nilai order kotor (`now_saldo_order_all`) sebagai batas atas alokasi pengiriman baru. Hal ini salah secara logika bisnis karena pengiriman bisa dialokasikan pada pesanan yang sebenarnya sudah ditolak (*rejected*). Koreksi telah diterapkan dengan mengganti pembatas menggunakan nilai order bersih (**`now_saldo_order_netto_all`**).

---

## 5. Keselarasan Standar Keuangan & Praktik Akuntansi Terbaik

Laporan ini telah ditinjau berdasarkan *best practice* pelaporan akuntansi dan kontrol internal perusahaan:

1. **Klasifikasi Laporan (Order Backlog vs Piutang):**
   Laporan ini secara substansi adalah **Laporan Order Backlog** (Pesanan Belum Terpenuhi/Terkirim), **bukan** Laporan Piutang Usaha (*Accounts Receivable*). Angka "outstanding" di sini merepresentasikan nilai komitmen pengiriman barang kepada pelanggan, dan belum menjadi tagihan finansial yang dicatat pada Buku Besar (*General Ledger*).
2. **Kepatuhan Pengakuan Pendapatan (PSAK 72):**
   * Pembuatan Sales Order (SO) baru merupakan komitmen, sehingga tidak dicatat sebagai Pendapatan (*Revenue*).
   * Nilai transaksi pengiriman bersih (`now_saldo_kirim_netto_all`) merupakan titik pemicu (*trigger point*) yang paling selaras dengan pengakuan pendapatan riil (saat kendali atas barang berpindah ke pelanggan).
   * Pembersihan order secara rutin (*reject/close*) sangat dianjurkan untuk meminimalkan risiko pencatatan estimasi pesanan (*backlog*) yang terlalu tinggi (*overstated*), memenuhi prinsip kehati-hatian (*prudence*).
3. **Prinsip Batas Waktu (*Cut-off*):**
   Validitas laporan ini sangat bergantung pada konsistensi penarikan data (*cut-off*). Sistem harus menjamin bahwa status transaksi (SO, Pengiriman, Batal, Retur) dikunci secara akurat pada batas akhir periode (misal: akhir bulan pukul 23:59:59) agar proses rekonsiliasi antara modul Gudang dan Finance (Piutang) tidak menghasilkan selisih (*variance*).
4. **Perlakuan Akuntansi terhadap Retur (*Return*):**
   Dalam formula `Netto PL = Packing List Value - Cancel - Return`, nilai Retur akan mengurangi Netto Pengiriman. Efek dari penurunan ini adalah **menambah kembali** nilai *Outstanding Akhir*. Secara logika bisnis/akuntansi, ini berarti perusahaan masih berutang pengiriman barang pengganti (*replacement*) kepada pelanggan. Namun, jika pelanggan mengembalikan barang dan membatalkan pesanan secara final, maka transaksi *Return* tersebut harus diikuti dengan transaksi penyesuaian (batal pesanan) agar nilai *Outstanding Akhir* kembali dinetralkan dan tidak menggantung.
