# 📖 DOKUMENTASI ALUR UI: MODUL PENJUALAN (`penjualan`)

## 📌 Rangkuman Modul & Kode Transaksi
- **Nama Modul**: `penjualan`
- **Tipe Transaksi Utama**: Penjualan Barang Jadi / Finished Goods (Reguler, Sales Support, Direct Counter, Special Order)
- **Daftar Kode Transaksi (`jenisTr`)**:
  - `582`: Penjualan Reguler Barang Jadi (FG) — **Salesman Mode**
  - `5822`: Penjualan Reguler Barang Jadi (FG) — **Sales Support / Admin Mode**
  - `5823`: Penjualan Reguler Barang Jadi (FG) — **Direct Counter Mode**
  - `1582`: Penjualan Special Order / Overseas Order
- **Template Display**: `template/transaksi_nosalesman.html`
- **Model Produk**: `MdlProduk2` / `MdlHargaProduk2`
- **Model Pembeli (Customer)**: `MdlCustomer`

---

## 🌳 Diagram Pohon Silsilah Transaksi (Transaction Tree)

```mermaid
graph TD
    subgraph Penjualan Reguler Salesman [Kode 582]
        A["582 (Invoice / Master)"] --> A1["582spo (Sales Pre-Order)"]
        A1 --> A2["582so (Sales Order Approved)"]
        A2 --> A3["582pkd (Packing List Gudang)"]
        A3 --> A4["582spd (Shipped / Surat Jalan)"]
        A4 --> A5["582 (Invoice Final)"]
        
        A2 -.-> A_RJ["582sorj (Reject Sales Order)"]
        A3 -.-> A_PKRJ["582pkdrj (Reject Packing)"]
    end

    subgraph Penjualan Sales Support [Kode 5822]
        B["5822 (Invoice Master)"] --> B1["5822spo (Pre-Order Admin)"]
        B1 --> B2["5822so (SO Disetujui SPV)"]
        B2 --> B3["5822pkd (Packing List)"]
        B3 --> B4["5822spd (Shipped / Surat Jalan)"]
    end

    subgraph Penjualan Direct Counter [Kode 5823]
        D["5823 (Direct Sales Master)"] --> D1["5823spo (Counter Order)"]
        D1 --> D2["5823so (Instant Approve)"]
        D2 --> D3["5823spd (Direct Pickup / Cash)"]
    end

    subgraph Penjualan Special / Overseas [Kode 1582]
        C["1582 (Invoice Special)"] --> C1["1582spo (Pre-Order Special)"]
        C1 --> C2["1582so (SO Disetujui Director)"]
        C2 --> C3["1582spd (Shipped Direct)"]
    end
```

---

## 📋 Elemen Form Administrasi Wajib (`elements` & `relativeElements`)

Konfigurasi elemen isian formulir administrasi yang wajib dipilih/diisi pengguna saat membuat dan memproses nota penjualan (`coTransaksiUi.php`):

### 1. Elemen Utama (`elements`)
| Nama Field | Label Form | Tipe Input | Model / Sumber Data | Edit Points (Step) | Keterangan |
|---|---|---|---|---|---|
| `paymentMethod` | Payment Method | `radio` | `MdlPaymentMethod` | Step 1 (`Create`) | Wajib memilih metode pembayaran (*Cash*, *Credit/TOP*, *CIA/DP*, *Bank Transfer*). Melakukan validasi limit kredit piutang (`kreditLimitValidate`). |
| `shippingMethod` | Dikirim / Diambil Sendiri | `radio` | Static / Config | Step 1 (`Create`) | Wajib memilih armada pengiriman: **Dikirim via Kurir** atau **Diambil Sendiri**. |
| `dueDate` | Due Date | `date` | System Date | Step 1, 2 | Tanggal jatuh tempo pelunasan nota penjualan. |
| `keterangan` | Keterangan / Note | `textarea` | User Input | Step 1, 2, 3, 4 | Catatan administrasi tambahan pada nota penjualan. |

### 2. Elemen Relasional Dinamis (`relativeElements`)
Tampil secara dinamis berdasarkan pilihan elemen utama:
- **Jika `paymentMethod` = `cash` atau `cia`**:
  - **`cash_account`**: Tipe Input `radio` / `select`, Model `MdlBankAccount_cash_and_in`. User wajib memilih **Rekening Kas / Bank Penerima** di cabang aktif (`cabang_id = placeID`).
- **Jika `shippingMethod` = `dikirim`**:
  - **`pengirim_id`**: Tipe Input `select`, Model `MdlPengirim`. User wajib memilih **Nama Kurir / Armada Ekspedisi**.

---

## 🔄 Rincian Alur UI per Langkah (Step-by-Step UI Flow per Kode Transaksi)

### 📌 KODE 582: PENJUALAN REGULER BARANG JADI (SALESMAN MODE)

#### 🔹 Tahap 1: Pre-Order / Sales Order Creation (`582` ➔ `582spo`)
- **Peran (User Group)**: `o_seller` (Sales Admin / Kasir Penjualan)
- **Status Warna**: *Pending Approval* (`#dd3300`) | **Label Action**: `make order`
- **Alur UI & Interaksi**:
  1. User login dan membuka menu Penjualan Reguler (`582`).
  2. Selecting Customer via modal `_selectorPihak`. Sistem memvalidasi saldo limit kredit & piutang berjalan (`ComRekeningPembantuCustomerDetail`).
  3. Selecting Barang: Non-Varian (1-click masuk keranjang) / Varian (modal matriks Qty varian ➔ "Masuk Keranjang").
  4. Filling Keranjang (`_shoppingCart`) & Elemen Wajib: Mengisi Qty, Price Level (`jual`, `jual_reseller`), Diskon, `paymentMethod`, `shippingMethod`, `cash_account`, serta PPN Include 11%/Exclude/NON-PPN.
  5. Klik "Simpan & Lanjutkan" ➔ Terbit Draf **`582spo`**.

#### 🔹 Tahap 2: Otorisasi & Persetujuan Sales Order (`582spo` ➔ `582so`)
- **Peran (User Group)**: `o_seller_spv` (Supervisor Sales)
- **Status Warna**: *Approved* (`#ff7700`) | **Label Action**: `approve order / otorisasi diskon`
- **Alur UI & Interaksi**:
  1. Supervisor membuka antrean **FollowUp Penjualan** (pengecekan `checkTransactionLocker`).
  2. Meninjau diskon & wewenang sales. Melakukan *Live Editing* (*allowEdit = true*) jika ada negosiasi.
  3. Klik "Approve Order" ➔ Status berubah menjadi **`582so` (Sales Order Resmi)**.

#### 🔹 Tahap 3: Pre-Packing & Pengepakan Gudang (`582so` ➔ `582pkd`)
- **Peran (User Group)**: `o_gudang` (Petugas Gudang / Packing)
- **Status Warna**: *Packed* (`#009900`) | **Label Action**: `process packing`
- **Alur UI & Interaksi**:
  1. Gudang memverifikasi *Payment Gate*: Jika butuh DP dan Finance belum konfirmasi ➔ Peringatan: *"Uang muka belum diterima. Hubungi Finance."*
  2. Petugas memindai fisik barang via barcode scanner tablet (`allowScaner = true` / `followupDariHp`).
  3. Klik "Process Packing" ➔ Status **`582pkd` (Packed)** & stok gudang terkunci.

#### 🔹 Tahap 4: Packing List & Pengiriman (`582pkd` ➔ `582spd` / `582`)
- **Peran (User Group)**: `o_gudang` / Logistik Pengiriman
- **Status Warna**: *Shipped / Invoiced* (`#009900`) | **Label Action**: `process shipment`
- **Alur UI & Interaksi**:
  1. Logistik mengisi detail kurir, resi, & jumlah karton (*Measurement Cbm/Kgs*).
  2. Klik "Process Shipment" ➔ Status **`582spd` (Surat Jalan)** ➔ **`582` (Invoice Final)**.
  3. Stok terpotong permanen & Surat Jalan + Invoice dicetak via `Printing.php`.

---

### 📌 KODE 5822: PENJUALAN REGULER BARANG JADI (SALES SUPPORT / ADMIN MODE)

#### 🔹 Tahap 1: Pre-Order Sales Support (`5822` ➔ `5822spo`)
- **Peran (User Group)**: `o_seller` (Sales Support Admin)
- **Status Warna**: *Pending Approval* (`#dd3300`) | **Label Action**: `make order`
- **Alur UI & Interaksi**:
  1. Sales Support Admin membuka menu Penjualan Sales Support (`5822`).
  2. Selecting Customer & memilih item pesanan dari pesanan masuk email/telepon.
  3. Mengisi `paymentMethod` (TOP Credit), `dueDate`, `shippingMethod`, & catatan instruksi khusus penanganan nota.
  4. Klik "make order" ➔ Terbit Draf **`5822spo`**.

#### 🔹 Tahap 2: Persetujuan Supervisor Sales Support (`5822spo` ➔ `5822so`)
- **Peran (User Group)**: `o_seller_spv` (Supervisor Sales Support)
- **Status Warna**: *Approved* (`#ff7700`) | **Label Action**: `approve order / otorisasi diskon`
- **Alur UI & Interaksi**:
  1. Supervisor memeriksa kuota alokasi barang & batas waktu penyerahan.
  2. Klik "approve order" ➔ Status berubah menjadi **`5822so`**.

#### 🔹 Tahap 3 & 4: Packing Gudang & Pengiriman (`5822so` ➔ `5822pkd` ➔ `5822spd`)
- **Peran (User Group)**: `o_gudang` (Gudang & Logistik)
- **Status Warna**: *Packed / Shipped* (`#009900`) | **Label Action**: `process packing` / `process shipment`
- **Alur UI & Interaksi**:
  1. Gudang melakukan pengepakan (`5822pkd`) & pemindaian barcode fisik.
  2. Logistik mengonfirmasi resi pengiriman ➔ Status berubah menjadi **`5822spd` (Surat Jalan Final)**.

---

### 📌 KODE 5823: PENJUALAN REGULER DIRECT COUNTER (CASH & CARRY)

#### 🔹 Tahap 1: Counter Order Creation (`5823` ➔ `5823spo`)
- **Peran (User Group)**: `o_seller` (Kasir Counter)
- **Status Warna**: *Pending Approval* (`#dd3300`) | **Label Action**: `make order`
- **Alur UI & Interaksi**:
  1. Kasir counter menginput pesanan pembeli langsung di toko/counter (`5823`).
  2. Selecting Item & Pengisian `paymentMethod` = `cash` (Tunai / Debit Card instant).
  3. Klik "make order" ➔ Terbit Draf **`5823spo`**.

#### 🔹 Tahap 2: Instant Approval & Direct Pickup (`5823spo` ➔ `5823so` ➔ `5823spd`)
- **Peran (User Group)**: `o_seller_spv` / `o_gudang`
- **Status Warna**: *Approved / Shipped* (`#009900`) | **Label Action**: `approve & instant release`
- **Alur UI & Interaksi**:
  1. Pembayaran tunai/debit dikonfirmasi kasir ➔ Otorisasi instant (`5823so`).
  2. Barang diserahkan langsung di tempat (*Diambil Sendiri*) ➔ Status berubah menjadi **`5823spd`** & Kuitansi Penjualan Direct dicetak.

---

### 📌 KODE 1582: PENJUALAN SPECIAL ORDER / OVERSEAS EXPORT

#### 🔹 Tahap 1: Special Pre-Order Creation (`1582` ➔ `1582spo`)
- **Peran (User Group)**: `o_export` / Special Order Officer
- **Status Warna**: *Pending Approval* (`#dd3300`) | **Label Action**: `make order`
- **Alur UI & Interaksi**:
  1. Export Officer membuka menu Special Order (`1582`).
  2. Selecting Overseas Customer & Valuta Asing (USD/EUR/SGD).
  3. Mengisi spesifikasi khusus barang pesanan, Term (*FOB/CIF*), & DP Uang Muka.
  4. Klik "make order" ➔ Terbit Draf **`1582spo`**.

#### 🔹 Tahap 2 & 3: Director Otorisasi & Direct Shipment (`1582spo` ➔ `1582so` ➔ `1582spd`)
- **Peran (User Group)**: `c_holding` (Director) / Logistik Ekspor
- **Status Warna**: *Approved / Shipped* (`#009900`) | **Label Action**: `approve special order` / `process shipment`
- **Alur UI & Interaksi**:
  1. Direksi memeriksa margin & kepastian pembayaran LC/DP ➔ Klik "approve special order" (`1582so`).
  2. Logistik memproses dokumen ekspor/kontainer ➔ Klik "process shipment" ➔ Status **`1582spd` (Invoice Export Final)**.

---

## 📄 Dokumen & Form yang Dihasilkan
1. **Sales Pre-Order (`582spo`, `5822spo`, `5823spo`, `1582spo`)** — Proforma Tagihan & Pemesanan Awal.
2. **Sales Order Disetujui (`582so`, `5822so`, `5823so`, `1582so`)** — SO Resmi Terotorisasi.
3. **Packing List Gudang (`582pkd`, `5822pkd`)** — Petik Barang Gudang.
4. **Surat Jalan & Invoice Final (`582`, `5822spd`, `5823spd`, `1582spd`)** — Dokumen Komersial Resmi & Faktur Pajak PPN.
