# Blueprint: Dashboard BI & Laporan Penjualan Komprehensif (ISO & IFRS Compliant)

Blueprint ini menyajikan rancangan ulang sistem pelaporan penjualan korporat secara menyeluruh dengan memaksimalkan data dari tabel `z_sales_salesman_cache` (level header) dan `z_sales_pembantu_cache` (level detail item) serta memastikan kepatuhan penuh terhadap standar **ISO 9001:2015** (Sistem Manajemen Mutu) dan **IFRS 15 / PSAK 72** (Pengakuan Pendapatan dari Kontrak Pelanggan).

---

## 1. Arsitektur Pelaporan & Kepatuhan Standar

Sistem pelaporan dibagi menjadi **4 Modul Laporan Utama** yang masing-masing memenuhi standar kepatuhan regulasi eksternal maupun efisiensi manajemen internal:

```mermaid
graph TD
    DB[(Database san_13mar)] -->|Data Header| ZC[z_sales_salesman_cache]
    DB -->|Data Detail Item| ZP[z_sales_pembantu_cache]
    
    ZC --> M1[Modul 1: Finansial Eksternal <br/> IFRS 15 / PSAK 72]
    ZC --> M2[Modul 2: Operational SLA <br/> ISO 9001 - Klausul 8.2]
    ZC --> M3[Modul 3: Sales & Territory <br/> ISO 9001 - Klausul 9.1.3]
    ZP --> M4[Modul 4: Analisis Produk <br/> Subsidiary Ledger]

    M1 --> View1[Dashboard Laba Rugi / Omset Bersih]
    M2 --> View2[Dashboard SLA Pengiriman & Funnel Conversion]
    M3 --> View3[Pivot Salesman & RFM Customer]
    M4 --> View4[Pivot Top Product & Market Basket]
```

### Pemetaan Kepatuhan ISO & IFRS
| Modul Laporan | Dasar Standar | Syarat Standar | Implementasi pada Data Anda |
| :--- | :--- | :--- | :--- |
| **Modul 1: Finansial** | IFRS 15 / PSAK 72 | Pendapatan hanya diakui saat kontrol beralih (serah terima barang). | Memfilter data hanya pada tahap **Shipped/Delivered (`582spd`)** dan menghitung `harga_netto` (omset bersih). |
| **Modul 2: Operasional** | ISO 9001:2015 Klausul 8.2 | Monitoring pemenuhan janji layanan dan kapasitas transaksi. | Menghitung durasi pemrosesan (SLA) menggunakan `dtime_order`, `dtime_kirim`, dan `dtime_terima`. |
| **Modul 3: Kinerja** | ISO 9001:2015 Klausul 9.1.3 | Evaluasi efektivitas sistem manajemen melalui metrik kinerja bisnis. | Menyediakan pivot performa tahunan/bulanan per salesman dan analisis retensi customer (RFM). |
| **Modul 4: Detail** | Standar Akuntansi Biaya | Analisis profitabilitas produk & penentuan strategi bundling produk. | Menggunakan tabel pembantu `z_sales_pembantu_cache` untuk memilah omset per item produk (`produk_part`). |

---

## 2. Struktur Database View Pendukung

Untuk mempercepat performa query dashboard, kita membuat database view yang menyatukan dan mendeduplikasi data duplikat secara otomatis.

### A. View Pendapatan Terkonfirmasi (SO & SPD) - `vw_sales_header_clean`
View ini membersihkan duplikat data pada level nota/dokumen.
```sql
CREATE OR REPLACE VIEW vw_sales_header_clean AS
SELECT 
    transaksi_id,
    thn,
    bln,
    tgl,
    fulldate,
    seller_id,
    seller_nama,
    customer_id,
    customer_nama,
    rekening,
    jenis,
    dtime_order,
    dtime_kirim,
    dtime_terima,
    MAX(harga_bruto) AS harga_bruto,
    MAX(diskon_nilai) AS diskon_nilai,
    MAX(ppn_nilai) AS ppn_nilai,
    MAX(harga_netto) AS harga_netto,
    MAX(ongkir_nilai) AS ongkir_nilai,
    MAX(harga_nppn) AS harga_nppn
FROM z_sales_salesman_cache
GROUP BY transaksi_id, thn, bln, tgl, fulldate, seller_id, seller_nama, customer_id, customer_nama, rekening, jenis, dtime_order, dtime_kirim, dtime_terima;
```

### B. View Detail Penjualan Produk - `vw_sales_item_clean`
View ini membersihkan duplikat data pada level baris produk/item.
```sql
CREATE OR REPLACE VIEW vw_sales_item_clean AS
SELECT 
    transaksi_id,
    thn,
    bln,
    fulldate,
    seller_id,
    seller_nama,
    customer_id,
    customer_nama,
    produk_kode,
    produk_part,
    produk_satuan,
    rekening,
    SUM(qty_kredit) AS total_qty_terjual,
    MAX(harga_netto) AS harga_netto_item
FROM z_sales_pembantu_cache
GROUP BY transaksi_id, thn, bln, fulldate, seller_id, seller_nama, customer_id, customer_nama, produk_kode, produk_part, produk_satuan, rekening;
```

---

## 3. Spesifikasi Query SQL Modul Laporan

### MODUL 1: Laporan Finansial Eksternal (IFRS 15 / PSAK 72 Compliant)
Laporan ini hanya mengakui transaksi yang statusnya telah dikirim/diserahterimakan ke customer (`rekening IN ('582spd', '382spd')`).

```sql
SELECT 
    thn AS Tahun,
    bln AS Bulan,
    SUM(harga_bruto) AS Gross_Sales,
    SUM(diskon_nilai) AS Total_Discount,
    SUM(harga_netto) AS Net_Sales_Revenue, -- Nilai yang dilaporkan di laporan keuangan eksternal
    SUM(ppn_nilai) AS PPN_Keluaran,
    SUM(ongkir_nilai) AS Ongkos_Kirim,
    SUM(harga_nppn) AS Total_Billing
FROM vw_sales_header_clean
WHERE rekening IN ('582spd', '382spd')
GROUP BY thn, bln
ORDER BY thn DESC, bln DESC;
```

### MODUL 2: Laporan SLA Layanan & Konversi Funnel (ISO 9001:2015 Klausul 8.2)
Mengukur efisiensi pelayanan operasional (waktu pengiriman barang/SLA logistik).

```sql
SELECT 
    seller_nama AS Salesman,
    COUNT(DISTINCT CASE WHEN rekening IN ('582spo', '382spo') THEN transaksi_id END) AS Total_PreOrders_SPO,
    COUNT(DISTINCT CASE WHEN rekening IN ('582so', '382so') THEN transaksi_id END) AS Total_Orders_SO,
    -- Hitung Rasio Konversi dari SPO ke SO
    CONCAT(ROUND((COUNT(DISTINCT CASE WHEN rekening IN ('582so', '382so') THEN transaksi_id END) / 
           COUNT(DISTINCT CASE WHEN rekening IN ('582spo', '382spo') THEN transaksi_id END)) * 100, 2), '%') AS Conversion_Rate,
    -- Hitung Rata-Rata Kecepatan Layanan / SLA Pengiriman Barang
    ROUND(AVG(DATEDIFF(dtime_kirim, dtime_order)), 1) AS Avg_Days_Order_to_Ship,
    ROUND(AVG(DATEDIFF(dtime_terima, dtime_kirim)), 1) AS Avg_Days_Ship_to_Received
FROM vw_sales_header_clean
GROUP BY seller_nama
HAVING Total_PreOrders_SPO > 0
ORDER BY Total_Orders_SO DESC;
```

### MODUL 3: Laporan Analisis Kinerja Sales & Customer RFM (ISO 9001:2015 Klausul 9.1.3)
Segmentasi pelanggan berbasis keaktifan dan nilai transaksi belanja mereka.

```sql
SELECT 
    customer_nama AS Customer,
    seller_nama AS Salesman_PJ,
    MAX(fulldate) AS Last_Transaction_Date,
    DATEDIFF(CURRENT_DATE(), MAX(fulldate)) AS Recency_Days, -- Semakin kecil semakin aktif
    COUNT(DISTINCT transaksi_id) AS Frequency_Orders,        -- Jumlah pemesanan
    SUM(harga_netto) AS Monetary_Value,                      -- Total nilai omset bersih
    CASE 
        WHEN DATEDIFF(CURRENT_DATE(), MAX(fulldate)) <= 180 AND COUNT(DISTINCT transaksi_id) >= 10 THEN 'Loyal Customer'
        WHEN DATEDIFF(CURRENT_DATE(), MAX(fulldate)) > 180 AND COUNT(DISTINCT transaksi_id) >= 10 THEN 'At Risk (Passive)'
        WHEN DATEDIFF(CURRENT_DATE(), MAX(fulldate)) > 360 THEN 'Churned (Lost)'
        ELSE 'Regular Customer'
    END AS Customer_Segment
FROM vw_sales_header_clean
WHERE rekening IN ('582so', '382so', '588so')
GROUP BY customer_nama, seller_nama
ORDER BY Monetary_Value DESC;
```

### MODUL 4: Laporan Kinerja Produk & Analisis Asosiasi (Subsidiary Ledger)
Menyajikan performa produk terlaris serta potensi cross-selling berdasarkan pola belanja pelanggan.

```sql
-- Query 1: Top 15 Produk Berdasarkan Kuantitas & Omset Bersih
SELECT 
    produk_part AS Model_Produk,
    produk_satuan AS Satuan,
    SUM(total_qty_terjual) AS Qty_Terjual,
    SUM(harga_netto_item) AS Total_Omset_Bersih
FROM vw_sales_item_clean
WHERE rekening IN ('582so', '382so', '588so')
GROUP BY produk_part, produk_satuan
ORDER BY Total_Omset_Bersih DESC
LIMIT 15;
```

---

## 4. Desain Antarmuka Pengguna (UI/UX) Laporan Pivot

Laporan ini dirancang dengan antarmuka yang sangat responsif, premium, dan interaktif menggunakan Highcharts untuk grafik dan DataTables untuk tabel interaktif.

### Filter Panel Dinamis
1.  **Rentang Waktu:** Datepicker dinamis (Tanggal Awal s.d. Tanggal Akhir) atau preset (Bulan ini, Tahun ini, YTD).
2.  **Salesman Picker:** Multiselect dropdown nama salesman aktif.
3.  **Customer Picker:** Pencarian nama customer dengan autocomplete.
4.  **Tipe Penjualan:** Checkbox filter (Lokal, Proyek, Ekspor).
5.  **Mode Standar:** Toggle Mode (Mode Eksternal/IFRS vs Mode Internal/ISO).

### Tampilan Visualisasi
*   **KPI Cards (Top Row):** Menampilkan ringkasan data instan (Total Omset Bersih, Jumlah Transaksi, Nilai Diskon, Rata-Rata SLA).
*   **Grafik Trend (Highcharts):** Grafik area/garis ganda yang membandingkan Omset Bersih vs Nilai Diskon dari bulan ke bulan.
*   **Tabel Pivot Interaktif (DataTables):**
    *   Mendukung sorting instan di seluruh kolom.
    *   Tombol Export bawaan: **Excel**, **PDF**, dan **Print**.
    *   Pagination dinamis untuk kenyamanan membaca puluhan ribu baris.
