Model Bisnis Wincloth
Distribusi (Konsinyasi) — 46 Distributor
Barang dititipkan ke distributor. Masih milik FKC. Distributor bayar hanya setelah barang laku terjual. Kalau tidak laku, bisa dikembalikan (return). Resiko di pihak FKC.
Reseller (Beli Putus) — 273 Reseller
Reseller beli putus — ownership berpindah hanya setelah fulfillment / invoiced (reseller_sales). Sampai saat itu,
stok di reseller_rack adalah RESERVED
milik perusahaan (company-owned) until fulfilled/invoiced, bukan milik reseller, bukan revenue/receivable/cash.
Ambil barang setiap hari Sabtu. Resiko pindah ke reseller setelah laku terjual & dibayar (cash) / tertagih (credit). Lihat Tiga Layer Stok & Money Intelligence Canon (OWNED = FREE_WAREHOUSE + CONSIGNMENT + RESERVED — lihat snapshot aktual di Stock/Owner Brief).
RESERVED vs FULFILLED: reseller_rack = RESERVED (allocated, company-owned); reseller_sales = FULFILLED/invoiced (milik reseller). Jangan samakan.
Tiga Layer Stok
Layer 1: Gudang Pusat — FREE_WAREHOUSE
Stok bebas ATS (product_stockcard) — sumber kebenaran paling atas. Besaran lihat snapshot aktual (Central Available live). Semua produk masuk ke sini dulu dari produksi. Central Available = FREE_WAREHOUSE.
Tabel: product_stockcard — company-owned, FREE
Layer 2: Distributor — CONSIGNMENT
Stok konsinyasi di rack distributor (distribusi_rack) — company-owned sampai terjual. Besaran lihat snapshot aktual. Bisa dikembalikan.
Tabel: distribusi_rack — company-owned
Layer 3: Reseller — RESERVED (Company-Owned)
Stok RESERVED FOR RESELLER
di reseller_rack — milik perusahaan, allocated untuk reseller, bukan milik reseller, bukan revenue/receivable/cash sampai fulfilled/invoiced menjadi reseller_sales.
Pisahkan RESERVED (reseller_rack) vs FULFILLED (reseller_sales).
Canonical type: RESERVED vs FULFILLED — bessaran lihat snapshot aktual Stock / Owner Brief. Invariant: OWNED = FREE_WAREHOUSE + DISTRIBUTOR_CONSIGNMENT + RESERVED_RESELLER (SNAPSHOT, bukan PERIOD). Lihat Money Intelligence Canon (baca snapshot, bukan LIVE hardcode yang bisa basi).
Tabel: reseller_rack (RESERVED, company-owned until fulfilled) — bukan FULFILLED
Invariant: OWNED = FREE_WAREHOUSE + DISTRIBUTOR_CONSIGNMENT + RESERVED_RESELLER
Tipe Semantik — PERIOD / SNAPSHOT / HISTORICAL / PROXY / FLOW_INDICATOR
| Tipe | Arti | Contoh Metrik | Catatan |
|---|---|---|---|
| PERIOD FILTERED | Agregasi qty/sales pada jendela periode filter aktif (startDate–endDate). Terpotong filter. | Total Sales, Total Qty, Channel flow, Period Return Flow | Kalau filter kosong = All Time. Bandingkan hanya dengan same predicate scope. |
| SNAPSHOT asOf | Kondisi stok/customer saat ini (SUM rack / MAX all-time). Tidak terpotong period filter. | Owned Physical, Central Available, Reserved, Dormant daysSinceLastSale | Stok: OWNED = FREE_WAREHOUSE + DISTRIBUTOR_CONSIGNMENT + RESERVED_RESELLER (invariant PASS jika jumlah cocok). Dormant: actualLastSale = MAX(all-time) sampai asOf/current. |
| HISTORICAL CONTEXT | Breakdown tahunan dari full history, tidak dipotong period filter aktif. | Yearly by Channel, Yearly breakdown | Jangan samakan dengan PERIOD — yearly tetap tampil semua tahun meski filter 30 hari. |
| PROXY PROXY / ESTIMASI | Angka proxy/estimasi, bukan canonical. Wajib badge PROXY + dataQuality + hint. | Period Return Flow Ratio, Forecast P80 (NORMAL_APPROX_P80) | Period Return Flow Ratio = return qty period / sold qty same scope — lifecycle UNRESOLVED, bukan canonical Return Rate. P80 = mean + 0.84*std (asumsi normal, n kecil), tampilkan n/std/method. |
| FLOW_INDICATOR FLOW | Selisih arus periode, bukan sisa stok fisik. | Flow Gap = inboundQty(period) − soldQty(period) | Flow Gap adalah period flow indicator, NOT physical WIP / stock on hand. Tanpa opening balance / batch linkage tidak prove sisa fisik. |
Metrik Penjualan
| Metrik | Arti Bisnis | Rumus | Sumber Data |
|---|---|---|---|
| Total Sales | Total omzet penjualan setelah diskon | Σ (qty × price × (1 - disc)) | dist_sales_detail + reseller_sales_detail |
| Total Transaksi | Jumlah invoice unik | COUNT(DISTINCT invoice_number) | dist_sales + reseller_sales |
| Total Qty | Jumlah unit produk terjual | Σ qty | dist_sales_detail + reseller_sales_detail |
| Gross Profit | Laba kotor (sales - modal) | Σ (qty × price × (1-disc)) - Σ (qty × hpp) | sales_detail JOIN product |
| Gross Margin % | Persentase laba kotor terhadap sales | (gross_profit / total_sales) × 100% | Dihitung dari gross profit & sales |
| AOV | Rata-rata omzet per transaksi | total_sales / total_transaksi | Dihitung |
| UPT | Rata-rata unit per transaksi | total_qty / total_transaksi | Dihitung |
Metrik Stok
| Metrik | Arti Bisnis | Rumus | Sumber Data |
|---|---|---|---|
| Stok Saat Ini | Jumlah unit tersedia | Σ qty dari stockcard/rack | product_stockcard / distribusi_rack / reseller_rack |
| Stok Cover | Estimasi stok cukup untuk berapa bulan | stok_saat_ini / rata_rata_penjualan_bulanan | Dihitung dari stok & sales |
| Hari Sejak Pergerakan | Berapa hari stok tidak bergerak (masuk/keluar) | hari_ini - tanggal_pergerakan_terakhir | product_stockcard / distribusi_rack / reseller_rack |
| Inventory Turnover | Berapa kali stok berputar dalam periode | COGS_terjual / rata_rata_nilai_stok | Dihitung dari sales & stok |
| Est. Modal Stok | Nilai modal yang tertahan di stok | stok × hpp | product.hpp × qty stok |
Metrik Customer (Distributor & Reseller)
| Metrik | Arti Bisnis | Rumus | Sumber Data |
|---|---|---|---|
| Hari Terakhir Beli | Jumlah hari sejak transaksi terakhir. Semakin besar = semakin lama tidak aktif | hari_ini - tanggal_transaksi_terakhir | MAX(sales_date) dari dist_sales / reseller_sales |
| Dormant Distributor | Distributor tidak ada transaksi >30 hari (actualLastSale MAX all-time sampai asOf/current — bukan period-filtered) | daysSinceLastSale > 30 — actualLastSale = MAX(all-time sales_date sampai asOf/current) | MAX(all-time) dari dist_sales — CURRENT SNAPSHOT asOf/current, bukan period filter |
| Dormant Reseller | Reseller tidak ada transaksi >30 hari (actualLastSale MAX all-time sampai asOf/current — bukan period-filtered) | daysSinceLastSale > 30 — actualLastSale = MAX(all-time sales_date sampai asOf/current) | MAX(all-time) dari reseller_sales — CURRENT SNAPSHOT asOf/current, bukan period filter |
| Recency (R) | Seberapa baru customer terakhir belanja | hari_ini - tanggal_transaksi_terakhir | MAX(sales_date) |
| Frequency (F) | Seberapa sering customer belanja | COUNT(DISTINCT invoice_number) | dist_sales / reseller_sales |
| Monetary (M) | Total nilai belanja customer | Σ total_sales per customer | dist_sales_detail + reseller_sales_detail |
| Period Return Flow Ratio PROXY bukan canonical | PROXY — return qty period / sold qty same predicate scope & same period — lifecycle UNRESOLVED (DATA SHAPE 16492 qty-only Jan–Jul proven, BUSINESS SEMANTICS UNRESOLVED) — NOT canonical Return Rate | SUM(return qty in period, scoped articleCode/productSearch via JOIN product) / SUM(sold qty same scope & same period) × 100% — null→UNKNOWN jika denominator 0 | dist_return_detail + reseller_sales_return_detail (numerator scoped via JOIN product) vs dist_sales_detail + reseller_sales_detail (denominator same scope) |
Kuadran Produk
Klasifikasi Pergerakan Stok
| Kategori | Kriteria | Tindakan |
|---|---|---|
| Fast Moving | Qty terjual tinggi, stok cepat habis | Jaga stok, prioritaskan restock |
| Normal | Qty terjual sedang, stok bergerak normal | Monitor rutin |
| Slow Moving | Qty terjual rendah, stok lama bergerak | Evaluasi harga, promo, bundling |
| Dead Stock legacy heuristic | 0 penjualan dalam 90 hari terakhir (heuristic) | Clearance, markdown, atau return — review dulu |
| Stok Tanpa Penjualan ZERO_SALES_WITH_STOCK | Stok tersedia >0 tetapi qty terjual =0 pada periode filter aktif — proven (stock ∪ sales) | Review aging/cover/demand/periode sebelum tindakan — bukan segera clearance/markdown |
| Flow Gap FLOW_INDICATOR NOT physical WIP | inboundQty(period) − soldQty(period) — selisih arus periode, bisa negatif jika sold > inbound. | Period flow indicator, NOT physical WIP / stock on hand. Jangan anggap sisa fisik tanpa opening balance / batch linkage / reconciliation. |
| Forecast P80 NORMAL_APPROX_P80 PROXY | P80 ≈ mean(last N bulan) + 0.84 × std — proxy asumsi distribusi normal | Estimasi proxy, bukan persentil empiris. Tampilkan n/std/method/dataQuality + median P50. N kecil = confidence rendah. |
Level Alert
Glosarium Lengkap
| Istilah | Penjelasan |
|---|---|
| Memuat glosarium... | |