Berikut adalah versi yang sudah saya rapikan menjadi sebuah **functional specification** yang lebih mudah dipahami oleh AI maupun developer.

---

# Sales Dashboard & Reports Functional Specification

## Overview

Sistem terdiri dari:

1. Dashboard
2. Report 1.1 – Year-to-Date Sales Comparison
3. Report 1.2 – Pareto Analysis

Ketiga halaman tersebut menggunakan mekanisme filtering yang sama sehingga user dapat berpindah antar report tanpa perlu mempelajari filter yang berbeda.

---

# Global Filters

Semua halaman menggunakan filter berikut.

## 1. Period Filter

### Dashboard

* Default: Current Month.
* User dapat memilih bulan dan tahun lainnya.

Contoh:

* Jul 2026
* Aug 2026
* Dec 2025

---

### Report 1.1 & Report 1.2

Menggunakan perbandingan **Year-to-Date (YTD)** antara dua tahun.

Default:

* Current Year (YTD)
* Previous Year (YTD)

Contoh apabila saat ini bulan Juli 2026:

* 2026 (Jan–Jul)
* 2025 (Jan–Jul)

User juga dapat memilih kombinasi tahun lainnya, misalnya:

* 2026 vs 2024
* 2025 vs 2023
* 2024 vs 2022

Untuk semua perbandingan YTD, kedua tahun harus menggunakan rentang bulan yang sama.

Contoh:

Jika bulan saat ini adalah Juli maka:

* 2026 → Jan–Jul
* 2025 → Jan–Jul

Bukan:

* 2025 → Jan–Dec

---

## 2. User Hierarchy Filter

Hak akses mengikuti struktur organisasi sales.

### Salesman

* Tidak memiliki filter bawahan.
* Hanya dapat melihat data miliknya sendiri.

---

### Head

Memiliki filter Salesman.

Dapat melihat:

* seluruh salesman di bawahnya
* atau salah satu salesman tertentu.

---

### Manager

Memiliki filter Head.

Dapat melihat:

* seluruh head di bawahnya
* atau salah satu head tertentu.

---

## 3. Customer Type Filter

Filter ini **hanya berlaku untuk divisi HM (Hygiene & Medical).**

Pilihan:

* All
* Hygiene
* Medical

Filter tersedia pada level:

* Salesman
* Head
* Manager

---

## 4. Customer Filter

Semua level user dapat melakukan filter customer sesuai hak aksesnya.

### Salesman

Hanya customer miliknya.

### Head

Customer milik seluruh salesman di bawahnya.

### Manager

Customer milik seluruh head beserta salesman di bawahnya.

---

## 5. Product Filter

Seluruh report dan dashboard harus dapat difilter berdasarkan kategori produk yang dijual.

Default:

* All Products

Contoh pilihan:

* PET
* PET BICO
* SAPSHEET
* Produk lainnya sesuai master data.

Daftar produk harus berasal dari master data sehingga apabila terdapat produk baru, filter akan otomatis ikut bertambah tanpa perubahan pada aplikasi.

Filter produk mempengaruhi seluruh data yang ditampilkan, termasuk:

* Dashboard Summary
* Sales Actual
* Sales On Hand
* Estimated Sales Achievement
* Semua chart
* Semua tabel
* Export Excel
* Pareto Analysis

---

# Dashboard

## Tujuan

Menampilkan ringkasan performa penjualan pada periode yang dipilih.

---

## Data yang Ditampilkan

### 1. Sales Actual

Total penjualan yang telah terealisasi.

Misalnya:

```text
Sales Actual = X
```

---

### 2. Sales On Hand / Shipment Berjalan

Total order yang masih dalam proses shipment atau masih menjadi outstanding shipment.

Misalnya:

```text
Sales On Hand = Y
```

> Definisi pastinya perlu dikonfirmasi kepada user apakah berasal dari Sales Order, Shipment, atau gabungan keduanya.

---

### 3. Estimated Sales Achievement

Untuk sementara menggunakan rumus sederhana:

```text
Estimated Sales Achievement

= Sales Actual + Sales On Hand

= X + Y
```

Belum memperhitungkan special cases.

---

# Report 1.1 – Year-to-Date Sales Comparison

## Tujuan

Membandingkan performa penjualan antara dua tahun menggunakan konsep Year-to-Date (YTD).

Contoh default:

```text
2026 Jan–Jul
VS
2025 Jan–Jul
```

User dapat mengganti kedua tahun sesuai kebutuhan.

---

## Visualisasi

Menggunakan **Clustered Column Chart** (Grouped Column Chart).

Setiap bulan memiliki dua batang yang dibandingkan secara berdampingan.

Contoh:

```text
Jan

2025 ███████
2026 ███████████

Feb

2025 ████████
2026 █████████████
```

Nilai penjualan ditampilkan di atas setiap batang.

Apabila diperlukan, dapat ditambahkan line chart sebagai indikator tren penjualan masing-masing tahun.

---

## Detail Data

Di bawah chart terdapat tabel detail yang dapat diekspor ke Excel.

Tujuan tabel ini adalah agar user dapat memverifikasi bahwa angka pada chart sesuai dengan data sumber.

Contoh kolom:

| Month | Year | Sales Actual | Qty | Volume | Amount |
| ----- | ---- | -----------: | --: | -----: | -----: |

---

# Report 1.2 – Pareto Analysis

## Tujuan

Mengidentifikasi customer yang memberikan kontribusi terbesar terhadap total volume penjualan.

Berdasarkan catatan user:

> Pareto 80% Volume Qty → Customer 20%

Interpretasi yang paling mungkin adalah analisis Pareto berdasarkan Volume atau Qty.

---

## Cara Perhitungan

1. Ambil seluruh customer sesuai filter.
2. Hitung total Qty atau Volume masing-masing customer.
3. Urutkan dari nilai terbesar ke terkecil.
4. Hitung:

* Persentase kontribusi
* Persentase kumulatif (Cumulative Percentage)

Contoh:

| Customer   | Qty |   % | Cumulative % |
| ---------- | --: | --: | -----------: |
| Customer A | 400 | 40% |          40% |
| Customer B | 250 | 25% |          65% |
| Customer C | 150 | 15% |          80% |
| Customer D |  80 |  8% |          88% |
| Customer E |  60 |  6% |          94% |
| Customer F |  40 |  4% |          98% |
| Customer G |  20 |  2% |         100% |

Dari contoh tersebut dapat disimpulkan bahwa Customer A, B, dan C merupakan customer yang berkontribusi terhadap sekitar 80% total volume penjualan.

---

## Visualisasi

Menggunakan **Pareto Chart**, yaitu kombinasi:

* Column Chart

  * menunjukkan Qty atau Volume per customer.
  * diurutkan dari terbesar ke terkecil.

* Line Chart

  * menunjukkan Cumulative Percentage.

Disarankan menambahkan garis horizontal pada nilai 80% agar user dapat langsung mengetahui customer mana saja yang termasuk kategori Pareto.

---

## Detail Data

Tampilkan tabel detail yang berisi minimal:

| Rank | Customer | Qty | Volume | % Contribution | Cumulative % |
| ---: | -------- | --: | -----: | -------------: | -----------: |

Tabel harus dapat diekspor ke Excel.

---

# Export

Semua report yang memiliki tabel detail harus mendukung export ke Excel.

Data yang diekspor harus identik dengan data yang digunakan untuk membentuk chart.

---

# Hal yang Perlu Dikonfirmasi kepada User

Beberapa requirement masih perlu diperjelas sebelum implementasi.

### 1. Sales On Hand

Perlu dipastikan apakah yang dimaksud adalah:

* Outstanding Sales Order
* Shipment yang sedang berjalan
* Gabungan keduanya

---

### 2. Pareto

Perlu dipastikan apakah Pareto dihitung berdasarkan:

* Qty
* Volume
* Sales Amount

Catatan user menyebut **Volume Qty**, sehingga kemungkinan besar menggunakan Qty atau Volume, tetapi masih perlu konfirmasi.

---

### 3. Chart Report 1.1

Perlu dipastikan apakah yang dibandingkan adalah:

* Sales Amount
* Qty
* Volume

atau menyediakan pilihan metric yang dapat dipilih oleh user.

---

### 4. Estimated Sales Achievement

Saat ini menggunakan rumus:

```text
Sales Actual + Sales On Hand
```

Gunakan mysql-sales_order untuk analisa sistem databasenya. Fokus datanya di ambil dari rpt_ET_ZVBILLING.

Untuk hierarki kamu bisa gunakan users.idroles sebagai referensi:

database\seeders\data_sys_roles.php

Untuk menentukan data Hygiene dan Industrial bisa di ambil dari master: mst_detail_so_type.

Untuk report nya, contoh interface filter dan result report nya seperti ini (untuk referensi, karena kita pakai standar framework bawaan perusahaan):

resources\views\report\rptptr\status_list.blade.php
app\Http\Controllers\RptptrController.php
resources\views\report\rptptr\filter.blade.php
resources\views\report\rptptr\result.blade.php
resources\views\report\rptptr\status.blade.php
resources\views\report\rptptr\partials

Jika kamu bingung mengenai sesuatu, stop, dan tanyakan ke developer (saya). Baru lanjut.

Setelah sistem jadi nanti, buatkan dokumentasi fitur baru, lengkap dan detail pada /docs.
