# 🚀 LSM Web Portal

Flow Aplikasi & Dokumentasi Sistem

Laporan Stok Malam - Bakmi GM

## 🎯 Gambaran Umum Aplikasi

### Tujuan Aplikasi

LSM (Laporan Stok Malam) Web Portal adalah sistem manajemen inventori restoran yang mengotomatisasi:

#### 📝 Pencatatan Stok

Menggantikan proses manual Excel dengan sistem web yang terintegrasi

#### 🧮 Perhitungan SPB

Auto-calculate kebutuhan pemesanan barang berdasarkan forecast

#### 🚚 Delivery Order

Generate DO untuk integrasi dengan sistem ERP (QAD)

#### 📊 Pelaporan

Monitoring dan reporting stok real-time untuk semua cabang

### Pengguna Sistem

Role | Tanggung Jawab | Akses
--- | --- | ---
Staff Store | Input stok harian, kelola SPB | Store sendiri
Store Manager | Approve transaksi, set TSM | Store sendiri
SSM | Review forecast, monitor multi-store | Multiple stores
SDP/HO | Maintain master data, upload forecast | All stores
PPIC | Validasi order, monitor pengiriman | All stores

## 🔄 Flow Proses Bisnis Utama

#### 1️⃣ Setup Master Data (Dilakukan oleh SDP/HO)

    ┌─────────────────────────────────────────────────────────┐
    │ MASTER DATA SETUP                                       │
    ├─────────────────────────────────────────────────────────┤
    │ 1. Upload dari QAD (via Excel):                        │
    │    • Stores (Cabang Restoran) - Upload Excel           │
    │    • Menus (Menu Restoran) - Upload Excel              │
    │    • Raw Materials/Items (Bahan Baku) - Upload Excel   │
    │    • Item Conversions (Konversi Satuan) - Upload Excel │
    │                                                         │
    │ 2. Setup Manual di LSM:                                 │
    │    • Range DOI (Days of Inventory)                     │
    │    • FSTR (Formula/Resep Masakan)                      │
    │    • Reason Adjustments (Alasan Penyesuaian)          │
    │    • Shipment Deliveries (Jadwal Pengiriman)          │
    │    • Holidays (Hari Libur)                             │
    │    • Tipe Dokumen per Item (DO/PO/PR)                  │
    └─────────────────────────────────────────────────────────┘

#### 2️⃣ Upload & Review Forecast (Bulanan)

    Step 1: SDP/HO Upload Forecast
       • Upload file Excel berisi forecast penjualan
       • Data forecast per store, per item, per hari
            ↓
    Step 2: SSM Review & Adjust
       • Review forecast yang di-upload
       • Sesuaikan dengan kondisi aktual
            ↓
    Step 3: SM Set Target Sisa Malam (TSM)
       • Tentukan target stok yang harus tersisa
       • TSM = buffer stock untuk operasional

#### 3️⃣ Proses Harian - Stock Opname (Setiap Malam)

    Waktu: Setiap malam setelah tutup operasional
    PIC: Staff Store

    Step 1: Buat Stock Opname Baru
       • Pilih tanggal SO (hari H)
       • Sistem auto-load semua item untuk store
            ↓
    Step 2: Input Stok Fisik
       • Input Qty Utuh (kemasan utuh)
       • Input Qty Pakai (kemasan terbuka/terpakai)
       • Sistem auto-convert ke satuan standar
            ↓
    Step 3: Sistem Hitung Ending Stock
       Formula:
       Ending Stock = (Qty Utuh × Conversion) + Qty Pakai
            ↓
    Step 4: Save & Submit
       • Save: Simpan sebagai Draft (bisa edit)
       • Submit: Lock data, siap generate SPB

⚠️ ATURAN PENTING:

- Input hanya boleh hari H (tidak boleh backdate)
- Edit window: sampai jam 11:00 H+1
- Setelah submit, data tidak bisa diubah

#### 4️⃣ Generate SPB (Surat Permintaan Barang)

    Trigger: Setelah SO di-submit
    PIC: Staff Store / Store Manager

    Step 1: Sistem Hitung Kebutuhan
       Formula SPB:
       Suggested Qty = (Forecast - Ending Stock) + TSM

       Dimana:
       • Forecast = Proyeksi penjualan dari forecast
       • Ending Stock = Hasil SO malam sebelumnya
       • TSM = Target Sisa Malam (buffer stock)
            ↓
    Step 2: Review & Adjustment
       • Review suggested qty dari sistem
       • Adjust qty jika perlu (dengan alasan)
       • Sistem tampilkan alert:
         - Forecast Alert (variance vs forecast)
         - DOI Status (Critical/Normal/Safe)
            ↓
    Step 3: Finalisasi SPB
       • Final Qty = Suggested Qty + Adjusted Qty
       • Generate SPB Number (auto)
       • Status: Draft → Submitted → Approved

📊 JENIS SPB:

- SPB Regular Pemesanan rutin harian
- SPB Tambahan Pemesanan di luar regular
- SPB Batalan Pembatalan/perubahan SPB

#### 5️⃣ Generate Delivery Order (DO)

    Trigger: Setelah SPB Approved
    PIC: PPIC / Store Manager

    Step 1: Generate DO dari SPB
       • Pilih SPB yang sudah approved
       • Sistem create DO dengan detail items
            ↓
    Step 2: Generate CSV File
       • Sistem export DO ke format CSV
       • Format sesuai requirement ERP (QAD)
            ↓
    Step 3: Kirim ke ERP
       • Upload CSV ke sistem QAD
       • QAD proses untuk pengiriman barang
            ↓
    Step 4: Mark as Sent
       • Update status DO: Generated → Sent
       • Tracking untuk monitoring pengiriman

### Flow Diagram Lengkap

    ┌──────────────┐
    │ MASTER DATA  │ ← Upload Excel dari QAD (Stores, Menus, Items)
    │   SETUP      │ ← Setup Manual (DOI, FSTR, Schedules)
    │              │ ← Set tipe_dokumen per item (DO/PO/PR)
    └──────┬───────┘
           │
           ↓
    ┌──────────────┐
    │   FORECAST   │ ← Upload Excel (SDP/HO)
    │  MANAGEMENT  │ ← Review & Adjust (SSM)
    │              │ ← Set TSM (SM)
    └──────┬───────┘
           │
           ↓
    ┌──────────────┐
    │ STOCK OPNAME │ ← Input Qty Utuh & Pakai (Staff Store)
    │   (MALAM)    │ ← Auto Convert & Calculate
    │              │ ← Submit (Lock Data)
    └──────┬───────┘
           │
           ↓
    ┌──────────────┐
    │ GENERATE SPB │ ← Auto Calculate: (Forecast - SO) + TSM
    │              │ ← Review & Adjust (SM)
    │              │ ← Submit & Approve
    └──────┬───────┘
           │
           ↓
    ┌──────────────────────────────────────────────┐
    │ GENERATE CSV (Group by tipe_dokumen)        │
    ├──────────────────────────────────────────────┤
    │                                              │
    │  ┌─────────────┐  ┌─────────────┐  ┌──────┐│
    │  │  CSV DO     │  │  CSV PO     │  │ CSV  ││
    │  │  (Warehouse)│  │  (Supplier) │  │ PR   ││
    │  └──────┬──────┘  └──────┬──────┘  └───┬──┘│
    └─────────┼─────────────────┼─────────────┼───┘
              │                 │             │
              ↓                 ↓             ↓
        [Upload ke QAD]   [Upload ke QAD] [Upload ke QAD]
              │                 │             │
              ↓                 ↓             ↓
        Warehouse         Purchasing      Approval
        Process           Process         Process
              │                 │             │
              ↓                 ↓             ↓
        Kirim ke Store    Order Supplier  Create PO
           │
           ↓
    ┌──────────────┐
    │   LAPORAN    │ ← LSM Report
    │              │ ← DOI Report
    │              │ ← Compliance Report
    └──────────────┘

## 🗄️ Struktur Database & Relasi Tabel

### Kategori Tabel

#### 📁 Master Data Tables

- m_stores
- m_menus
- m_raw_materials
- m_item_conversions
- m_range_dois
- m_fstrs
- m_shipment_schedules
- m_holidays
- m_sales_types
- m_numbering_formats

#### 📝 Transaction Tables

- t_forecasts
- t_stock_opnames
- t_item_requests
- t_delivery_orders
- t_stock_movements
- t_current_stocks

#### ⚙️ System Tables

- users
- roles
- permissions
- qad_sync_logs

### Relasi Utama: Stock Opname Flow

    ┌─────────────────┐
    │  m_stores       │
    │  (Cabang)       │
    └────────┬────────┘
             │ 1
             │
             │ N
    ┌────────▼────────────┐
    │ t_stock_opnames     │ ← Header SO
    │ - so_number         │
    │ - store_id          │
    │ - so_date           │
    │ - status            │
    └────────┬────────────┘
             │ 1
             │
             │ N
    ┌────────▼─────────────────┐         ┌──────────────────┐
    │ t_stock_opname_details   │ N ────→ │ m_raw_materials  │
    │ - stock_opname_id        │         │ (Bahan Baku)     │
    │ - raw_material_id        │         └──────────────────┘
    │ - qty_utuh               │
    │ - qty_pakai              │
    │ - qty_converted          │
    │ - qty_total (ending)     │
    └──────────────────────────┘

✅ Dampak Relasi:

- Satu Store bisa punya banyak Stock Opname (history harian)
- Satu SO punya banyak detail items
- Setiap detail SO terhubung ke master raw material
- Ending stock dari SO digunakan untuk calculate SPB

### Relasi Utama: SPB (Item Request) Flow

    ┌─────────────────┐
    │ t_stock_opnames │ ← SO sebelumnya
    └────────┬────────┘
             │ 1
             │
             │ 1
    ┌────────▼────────────┐         ┌──────────────────────┐
    │ t_item_requests     │ 1 ────→ │ m_stores             │
    │ - spb_number        │         └──────────────────────┘
    │ - store_id          │
    │ - stock_opname_id   │         ┌──────────────────────┐
    │ - request_type      │ 1 ────→ │ m_shipment_schedules │
    │ - shipment_id       │         │ (Jadwal Kirim)       │
    │ - status            │         └──────────────────────┘
    └────────┬────────────┘
             │ 1
             │
             │ N
    ┌────────▼─────────────────┐         ┌──────────────────┐
    │ t_item_request_details   │ N ────→ │ m_raw_materials  │
    │ - item_request_id        │         └──────────────────┘
    │ - raw_material_id        │
    │ - forecast_qty           │ ← Dari forecast
    │ - so_qty                 │ ← Dari SO (ending stock)
    │ - tsm_qty                │ ← Target Sisa Malam
    │ - suggested_qty          │ ← (Forecast - SO) + TSM
    │ - adjusted_qty           │ ← Manual adjustment
    │ - final_qty              │ ← Suggested + Adjusted
    └──────────────────────────┘

💡 Formula Perhitungan SPB:

`Suggested Qty = (Forecast - Ending Stock) + TSM`

`Final Qty = Suggested Qty + Adjusted Qty`

⚠️ PENTING: Final Qty dari SPB inilah yang digunakan untuk generate DO!

### Relasi: SO → SPB → DO

#### 📦 Alur Data dari SO sampai CSV Export (DO/PO/PR)

    ┌─────────────────────┐
    │ t_stock_opnames     │ ← Input stok malam
    │ - so_number         │
    │ - qty_total         │ ← Ending Stock = 53 kg
    └──────────┬──────────┘
               │ 1
               │ (SO qty digunakan untuk hitung SPB)
               │
               ↓ 1
    ┌──────────▼──────────────┐         ┌──────────────────────┐
    │ t_item_requests         │ N ────→ │ m_raw_materials      │
    │ - spb_number            │         │ - tipe_dokumen       │ ← DO/PO/PR
    │ - stock_opname_id       │         └──────────────────────┘
    │                         │
    │ Detail:                 │
    │ - raw_material_id       │ ← Link ke master item
    │ - forecast_qty: 100 kg  │ ← Dari forecast
    │ - so_qty: 53 kg         │ ← Dari SO (ending stock)
    │ - tsm_qty: 15 kg        │ ← Target buffer
    │ - suggested_qty: 62 kg  │ ← (100-53)+15
    │ - adjusted_qty: 8 kg    │ ← Manual adjustment
    │ - final_qty: 70 kg      │ ← QTY YANG AKAN DIPESAN! ✓
    └──────────┬──────────────┘
               │
               │ (Group by tipe_dokumen dari master item)
               │
               ↓
    ┌──────────────────────────────────────────────────────┐
    │ CSV EXPORT (Format tergantung tipe_dokumen)         │
    ├──────────────────────────────────────────────────────┤
    │                                                      │
    │ Items dengan tipe_dokumen = 'DO':                   │
    │   → Generate CSV DO                                  │
    │   → Format: Order No, Ship From, Ship To, ...       │
    │   → Qty: 70 kg (dari SPB final_qty)                 │
    │                                                      │
    │ Items dengan tipe_dokumen = 'PO':                   │
    │   → Generate CSV PO                                  │
    │   → Format: PO Number, Supplier, Order Date, ...    │
    │   → Qty: 70 kg (dari SPB final_qty)                 │
    │                                                      │
    │ Items dengan tipe_dokumen = 'PR':                   │
    │   → Generate CSV PR                                  │
    │   → Format: PR Number, Requester, ...               │
    │   → Qty: 70 kg (dari SPB final_qty)                 │
    └──────────────────────────────────────────────────────┘
               │
               ↓
        [Upload ke QAD]

        File DO: DMDG021R | 101 | 178 | ... | 70 | DS | ...
        File PO: PRMG02YR | GMS | ... | 70 | DS | ...
                                        ↑
                        Qty ini = SPB final_qty untuk semua tipe!

#### ✅ Ringkasan Alur Data

Tabel/Proses | Field/Data Penting | Fungsi
t_stock_opnames | `qty_total` (53 kg) | Input untuk perhitungan SPB
t_item_requests | `final_qty` (70 kg) | Qty yang akan dipesan
m_raw_materials | `tipe_dokumen` (DO/PO/PR) | Menentukan format CSV
CSV Export | `Qty Ordered` (70 kg) | File untuk QAD

Kesimpulan: CSV (DO/PO/PR) menggunakan `final_qty` dari SPB (70 kg), dengan format ditentukan oleh `tipe_dokumen` di master item!

#### ⚠️ Mengapa Perlu Tipe Dokumen Berbeda?

Alasan Bisnis:

- DO (Delivery Order) - Untuk item yang ada di warehouse internal
  - Contoh: Bakmi Frozen, Bumbu Racikan, Kulit Goreng
  - Proses: Warehouse langsung kirim ke store
  - Lead time: 1-2 hari
- PO (Purchase Order) - Untuk item yang dibeli dari supplier
  - Contoh: Sayur Segar, Daging, Seafood
  - Proses: Purchasing order ke supplier → supplier kirim
  - Lead time: 2-3 hari
- PR (Purchase Request) - Untuk item yang perlu approval khusus
  - Contoh: Peralatan baru, Asset, Item non-rutin
  - Proses: Request → Approval → PO → Supplier kirim
  - Lead time: 5-7 hari

### Item Conversion & Calculation

    ┌──────────────────┐
    │ m_raw_materials  │
    │ - code           │
    │ - name           │
    │ - uom            │ ← Unit of Measure (KG, PCS, dll)
    │ - tipe_dokumen   │ ← DO / PO / PR (untuk CSV export) ✓
    └────────┬─────────┘
             │ 1
             │
             │ 1
    ┌────────▼─────────────────┐
    │ m_item_conversions       │
    │ - raw_material_id        │
    │ - conversion_factor      │ ← Faktor konversi
    │ - from_uom               │ ← Satuan asal (PCS)
    │ - to_uom                 │ ← Satuan tujuan (KG)
    └──────────────────────────┘

    Contoh Penggunaan:
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Item: Tepung Terigu
    UOM: KG
    Conversion: 1 Karton (PCS) = 10 KG
    Tipe Dokumen: DO (dikirim dari warehouse internal)

    Input SO:
      Qty Utuh: 5 karton
      Qty Pakai: 3 kg

    Calculation:
      Qty Converted = 5 × 10 = 50 kg
      Ending Stock = 50 + 3 = 53 kg

    Generate CSV:
      Karena tipe_dokumen = 'DO', maka item ini masuk ke CSV DO
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

#### 📋 Kolom Tipe Dokumen di Master Item

Kolom: `tipe_dokumen` di tabel `m_raw_materials`

Nilai yang mungkin:

- DO Delivery Order - Item dari warehouse internal (ex: Bakmi Frozen, Bumbu Racikan)
- PO Purchase Order - Item dari supplier eksternal (ex: Sayur Segar, Daging)
- PR Purchase Request - Item yang perlu approval purchasing (ex: Peralatan, Asset)

Fungsi: Menentukan format CSV yang akan di-generate saat export dari SPB ke QAD

## ⚠️ Dampak Relasi Terhadap Transaksi

### 1. Dampak Perubahan Master Data

#### ❌ Perubahan Raw Material

Skenario: Raw Material "Tepung Terigu" diubah/dihapus

Dampak:

- ✗ SO yang sudah ada: Tetap tampil (data history)
- ✗ SPB yang sudah ada: Tetap tampil (data history)
- ✓ SO baru: Tidak bisa input item tersebut
- ✓ SPB baru: Tidak bisa order item tersebut

Solusi:

- Jangan hapus raw material yang sudah pernah digunakan
- Gunakan flag `is_active = false` untuk non-aktifkan
- Soft delete dengan `delete_flag = 1`

#### ⚠️ Perubahan Conversion Factor

Skenario: Conversion factor diubah dari 10 ke 12

Dampak:

- ✗ SO lama: Tetap pakai conversion lama (53 kg)
- ✓ SO baru: Pakai conversion baru
  - Qty Utuh: 5 karton
  - Qty Converted = 5 × 12 = 60 kg (bukan 50 kg)
  - Ending Stock = 60 + 3 = 63 kg

⚠️ PERHATIAN:

- Perubahan conversion affect akurasi perhitungan
- Bisa menyebabkan over/under stock
- Harus dikomunikasikan ke semua store

### 2. Dampak Perubahan Transaksi

#### 📝 Edit Stock Opname

Aturan:

- ✓ Status Draft: Bisa edit kapan saja
- ✗ Status Submitted: Tidak bisa edit
- ✗ Sudah generate SPB: Tidak bisa edit SO

Dampak jika bisa edit:

- SPB yang sudah dibuat jadi tidak valid
- Ending stock berubah
- Suggested qty SPB harus di-recalculate
- DO yang sudah dibuat jadi salah

Solusi: Lock SO setelah submit. Jika perlu koreksi, buat adjustment di SPB

#### ✅ Best Practices

- Selalu gunakan soft delete (`delete_flag`) untuk data master
- Lock transaksi setelah approved
- Gunakan SPB Batalan untuk koreksi, bukan edit langsung
- Backup database sebelum perubahan besar
- Test di environment development dulu

## 🔗 Integrasi dengan Sistem ERP (QAD)

### Data yang Di-Upload dari QAD ke LSM (via Excel)

#### 📤 Metode Upload: Excel File

Proses:

1. SDP/HO export data dari QAD ke Excel
2. Download template Excel dari LSM
3. Copy-paste atau mapping data dari QAD ke template LSM
4. Upload file Excel ke LSM
5. LSM validasi dan import data

Keuntungan: Fleksibel, bisa review data sebelum upload, tidak perlu API integration

#### � Master Stores

Frekuensi: On-demand / Saat ada perubahan

Method: Upload Excel

Data:

- Store Code
- Store Name
- Store Address
- Status

#### 🍽️ Master Menus

Frekuensi: On-demand / Saat ada menu baru

Method: Upload Excel

Data:

- Menu Code (PLU)
- Menu Name
- Category
- Price

#### � Raw Materials

Frekuensi: Bulanan / Saat ada item baru

Method: Upload Excel

Data:

- Item Code
- Item Name
- UOM
- Category
- Tipe Dokumen (DO/PO/PR)

#### 🔄 Item Conversions

Frekuensi: On-demand / Saat ada perubahan

Method: Upload Excel

Data:

- Item Code
- Conversion Factor
- From/To UOM

### Data yang Dikirim dari LSM ke QAD

#### 🔍 Sumber Data CSV Export (DO/PO/PR)

Pertanyaan: CSV yang di-generate datanya dari mana?

Jawaban: CSV datanya dari SPB, dengan format berbeda tergantung tipe_dokumen di master item!

Alur Data:

1. SO (Stock Opname) → Mencatat ending stock malam hari
   - Data: qty_utuh, qty_pakai, qty_total (ending stock)
   - Fungsi: Input untuk perhitungan SPB
2. SPB (Surat Permintaan Barang) → Menghitung kebutuhan pemesanan
   - Data: forecast_qty, so_qty, tsm_qty, suggested_qty, adjusted_qty, final_qty
   - Fungsi: Menentukan qty yang akan dipesan
3. CSV Export (DO/PO/PR) → File untuk QAD/ERP
   - Data: Ambil final_qty dari SPB + info dari master item
   - Format: Tergantung `tipe_dokumen` di master item (DO/PO/PR)
   - Fungsi: Instruksi ke QAD untuk proses pengadaan/pengiriman

Kesimpulan:

✅ SO = Input data stok aktual
✅ SPB = Perhitungan kebutuhan pemesanan (menggunakan data SO)
✅ CSV (DO/PO/PR) = File export ke QAD (menggunakan data SPB + master item)

### Tipe Dokumen & Format CSV

#### 📋 Penentuan Tipe Dokumen

Tipe dokumen ditentukan oleh kolom `tipe_dokumen` di master item (m_raw_materials)

Kemungkinan nilai:

- DO Delivery Order - Untuk item yang dikirim dari warehouse internal
- PO Purchase Order - Untuk item yang dibeli dari supplier eksternal
- PR Purchase Request - Untuk permintaan pembelian yang perlu approval

Contoh:
• Item "Bakmi Rebus Frozen" → tipe_dokumen = `DO` (dari warehouse GMS)
• Item "Sayur Segar" → tipe_dokumen = `PO` (beli dari supplier)
• Item "Peralatan Baru" → tipe_dokumen = `PR` (perlu approval purchasing)

#### 📤 Format CSV: Delivery Order (DO)

    Untuk item dengan tipe_dokumen = 'DO'
    Frekuensi: Setelah SPB Approved
    Method: CSV File Export

    Kolom CSV DO:
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Order No (8 Char)       | Nomor DO
    Ship From (8 Char)      | Warehouse asal (ex: 101)
    Ship To (8 Char)        | Store tujuan (ex: 178)
    Order Date              | Tanggal order
    Due Date (Date)         | Tanggal kirim
    Remarks (40 Char)       | Catatan (ex: 13:30/Ikzan)
    Item Number             | Kode item
    Item Name               | Nama item
    Qty Ordered             | Qty dari SPB final_qty ✓
    UoM                     | Satuan (ex: DS, KG)
    Transport ID (8 Char)   | ID kendaraan (ex: INTGMS)
    Keterangan (100 Char)   | Keterangan tambahan
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Contoh Data:
    DMDG021R | 101 | 178 | 7/1/2025 | 7/2/2025 | 13:30/Ikzan | FRZ5040 | BAKMI GORENG FRZ 8KG | 1 | DS | INTGMS |
    DMDG021R | 101 | 178 | 7/1/2025 | 7/2/2025 | 13:30/Ikzan | FRZ5021 | BAKMI REBUS FROZEN 9.1KG | 4 | DS | INTGMS |
    DMDG021R | 101 | 178 | 7/1/2025 | 7/2/2025 | 13:30/Ikzan | FRZ5036 | KULIT GORENG VACUUM 7.5KG | 2 | DS | INTGMS |

    Flow:
    LSM Generate CSV DO → Upload ke QAD → Warehouse Process → Kirim ke Store

#### 📤 Format CSV: Purchase Order (PO)

    Untuk item dengan tipe_dokumen = 'PO'
    Frekuensi: Setelah SPB Approved
    Method: CSV File Export

    Kolom CSV PO:
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Purchase Order (8 Char) | Nomor PO
    Supplier (8 Char)       | Kode supplier (ex: GMS)
    Order Date (Date)       | Tanggal order
    Due Date (Date)         | Tanggal kirim
    Remarks (40 Char)       | Catatan (ex: 08:00/jamhuri)
    Site (8 Char)           | Lokasi site (ex: 0A111)
    Currency (3 Char)       | Mata uang (ex: IDR)
    Credit Terms (8 Char)   | Termin pembayaran
    Line (Integer)          | Nomor baris
    Item Number (18 Char)   | Kode item
    Item Name               | Nama item
    Qty Ordered (Decimal)   | Qty dari SPB final_qty ✓
    UoM (2 Char)            | Satuan (ex: DS, KG)
    Unit Cost (Decimal)     | Harga satuan
    Taxable (Yes/No)        | Kena pajak atau tidak
    Tax Class (3 Char)      | Kelas pajak
    Tax In (Yes/No)         | Pajak include atau tidak
    Keterangan (100 Char)   | Keterangan tambahan
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Contoh Data:
    PRMG02YR | GMS | 7/1/2025 | 7/2/2025 | 08:00/jamhuri | 0A111 | IDR | | 1 | FRZ5021 | BAKMI REBUS FROZEN 9.1KG | 5 | DS | | | | |
    PRMG02YR | GMS | 7/1/2025 | 7/2/2025 | 08:00/jamhuri | 0A111 | IDR | | 2 | FRZ5080 | BAKMI MENTAH RETAIL | 1 | DS | | | | |

    Flow:
    LSM Generate CSV PO → Upload ke QAD → Purchasing Process → Order ke Supplier

#### ✅ Proses Generate CSV dari SPB

Langkah-langkah:

1. SPB sudah approved dengan final_qty untuk setiap item
2. Sistem baca `tipe_dokumen` dari master item (m_raw_materials)
3. Group items berdasarkan tipe_dokumen:
   - Items dengan tipe DO → Generate CSV DO
   - Items dengan tipe PO → Generate CSV PO
   - Items dengan tipe PR → Generate CSV PR
4. Export masing-masing CSV dengan format sesuai tipe
5. Upload ke QAD untuk diproses

Contoh: Jika SPB punya 10 items:
• 7 items tipe DO → Generate 1 file CSV DO dengan 7 baris
• 3 items tipe PO → Generate 1 file CSV PO dengan 3 baris

### Relasi Data: SO → SPB → DO

#### 🔗 Alur Data Lengkap

    ┌─────────────────────────────────────────────────────────┐
    │ HARI 1 - MALAM: STOCK OPNAME (SO)                      │
    ├─────────────────────────────────────────────────────────┤
    │ Input:                                                  │
    │   • Qty Utuh: 5 karton                                 │
    │   • Qty Pakai: 3 kg                                    │
    │                                                         │
    │ Output SO:                                              │
    │   • Ending Stock: 53 kg ← Disimpan di SO               │
    └─────────────────────────────────────────────────────────┘
                        ↓
    ┌─────────────────────────────────────────────────────────┐
    │ HARI 2 - PAGI: GENERATE SPB                            │
    ├─────────────────────────────────────────────────────────┤
    │ Input:                                                  │
    │   • Forecast: 100 kg                                   │
    │   • SO Qty (Ending Stock): 53 kg ← Ambil dari SO      │
    │   • TSM: 15 kg                                         │
    │                                                         │
    │ Perhitungan:                                            │
    │   • Suggested Qty = (100 - 53) + 15 = 62 kg           │
    │   • Adjusted Qty = +8 kg (manual adjustment)           │
    │   • Final Qty = 62 + 8 = 70 kg ← Disimpan di SPB      │
    └─────────────────────────────────────────────────────────┘
                        ↓
    ┌─────────────────────────────────────────────────────────┐
    │ HARI 2 - SIANG: GENERATE DO                            │
    ├─────────────────────────────────────────────────────────┤
    │ Input:                                                  │
    │   • Final Qty dari SPB: 70 kg ← Ambil dari SPB        │
    │                                                         │
    │ Output DO (CSV):                                        │
    │   DO-001, ST001, RM001, 70, KG, 2024-01-17            │
    │                          ↑                              │
    │                    Qty ini dari SPB final_qty!          │
    └─────────────────────────────────────────────────────────┘
                        ↓
    ┌─────────────────────────────────────────────────────────┐
    │ HARI 3 - PAGI: TERIMA BARANG                           │
    ├─────────────────────────────────────────────────────────┤
    │ Warehouse kirim barang sesuai DO:                      │
    │   • Item: Tepung Terigu                                │
    │   • Qty: 70 kg ← Sesuai DO (dari SPB final_qty)       │
    └─────────────────────────────────────────────────────────┘

#### ⚠️ Mengapa DO Tidak Langsung dari SO?

Alasan:

- SO hanya mencatat stok aktual - Tidak ada informasi berapa yang harus dipesan
- SPB menghitung kebutuhan - Mempertimbangkan forecast, TSM, dan adjustment
- DO adalah instruksi pengiriman - Harus berdasarkan qty yang sudah disetujui di SPB

Contoh Kasus:

Jika SO menunjukkan ending stock 53 kg, bukan berarti warehouse harus kirim 53 kg!
Yang dikirim adalah hasil perhitungan di SPB (70 kg) yang sudah mempertimbangkan forecast dan TSM.

### Sync Process & Monitoring

#### 📊 Upload & Export Monitoring

Table: `qad_sync_logs` (untuk tracking upload/export)

- Last upload time per type (Stores, Menus, Items)
- Success rate (%) - berapa baris berhasil diimport
- Validation errors - error per row
- CSV export history - tracking file yang di-generate
- Failed records list dengan detail error

Data Type | Direction | Method | Frequency
--- | --- | --- | ---
Stores | QAD → LSM | Upload Excel | On-demand
Menus | QAD → LSM | Upload Excel | On-demand
Items | QAD → LSM | Upload Excel | Bulanan / On-demand
SPB (CSV DO/PO/PR) | LSM → QAD | Download CSV | Setelah SPB Approved

## 🔢 Master Format Numbering SPB

### Sistem Penomoran Dokumen

Sistem LSM Web Portal menggunakan format penomoran yang terstruktur dan dapat membedakan berbagai jenis dokumen berdasarkan karakteristik transaksi dan barang.

### Pembedaan Format Numbering

#### 1️⃣ SPB Type

Regular:

- Pemesanan rutin harian
- Berdasarkan forecast & SO
- Jadwal tetap

Non-Regular:

- SPB Tambahan
- SPB Batalan
- Di luar jadwal regular

#### 2️⃣ Document Type

- SPB Surat Permintaan Barang
- SO Stock Opname
- PO Purchase Order
- DO Delivery Order
- PR Purchase Request

#### 3️⃣ Item Type

Basah:

- Masa simpan pendek
- Sayuran, daging, seafood
- Perlu handling khusus

Kering:

- Masa simpan panjang
- Bumbu, minyak, tepung
- Storage normal

### Format Pattern & Placeholder

#### 📝 Available Placeholders

    {DOCTYPE}   → Document Type (SPB, SO, PO, DO, PR)
    {STORE}     → Store Code (STR01, STR02, dll)
    {SPBTYPE}   → SPB Type (REG, NONREG, ALL)
    {ITEMTYPE}  → Item Type (BASAH, KERING, ALL)
    {YYYY}      → Year 4 digits (2024)
    {YY}        → Year 2 digits (24)
    {MM}        → Month 2 digits (01-12)
    {DD}        → Day 2 digits (01-31)
    {NUMBER}    → Sequential Number (0001, 0002, ...)
    {PREFIX}    → Custom Prefix
    {SUFFIX}    → Custom Suffix
    {SEP}       → Separator Character (-, _, /)

### Contoh Format Pattern

Pattern | Output Example | Use Case
--- | --- | ---
`{DOCTYPE}{SEP}{STORE}{SEP}{YY}{MM}{SEP}{NUMBER}` | SPB-STR01-2601-0001 | Format standar umum
`{DOCTYPE}{SEP}{SPBTYPE}{SEP}{ITEMTYPE}{SEP}{NUMBER}` | SPB-REG-BASAH-0001 | Pembedaan tipe SPB & item
`{STORE}{SEP}{DOCTYPE}{SEP}{SPBTYPE}{SEP}{NUMBER}` | STR01-SPB-NONREG-0001 | Store-centric numbering
`{DOCTYPE}{SEP}{ITEMTYPE}{SEP}{YY}{MM}{SEP}{NUMBER}` | SPB-KERING-2601-0001 | Item type focus
`{STORE}{DOCTYPE}{YY}{MM}{DD}{NUMBER}` | STR01SPB2601190001 | Compact format (no separator)

### Skenario Penggunaan

#### 📋 Skenario 1: SPB Regular Item Basah

Kondisi:

- Store: Cabang Senayan (STR01)
- Document: SPB
- SPB Type: Regular
- Item Type: Basah
- Tanggal: 19 Januari 2026

Format Pattern: `{DOCTYPE}{SEP}{SPBTYPE}{SEP}{ITEMTYPE}{SEP}{YY}{MM}{DD}{SEP}{NUMBER}`

Generated Number: SPB-REG-BASAH-260119-0001

#### 📋 Skenario 2: SPB Non-Regular Item Kering

Kondisi:

- Store: Cabang Kelapa Gading (STR02)
- Document: SPB
- SPB Type: Non-Regular (SPB Tambahan)
- Item Type: Kering
- Tanggal: 19 Januari 2026

Format Pattern: `{STORE}{SEP}{DOCTYPE}{SEP}{SPBTYPE}{SEP}{ITEMTYPE}{SEP}{NUMBER}`

Generated Number: STR02-SPB-NONREG-KERING-0001

#### 📋 Skenario 3: Format All (Universal)

Kondisi:

- Store: Semua Cabang
- Document: SO (Stock Opname)
- SPB Type: All
- Item Type: All

Format Pattern: `{DOCTYPE}{SEP}{STORE}{SEP}{YYYY}{MM}{DD}{SEP}{NUMBER}`

Generated Number: SO-STR01-20260119-001

Kegunaan: Format universal yang berlaku untuk semua tipe SPB dan item

### Keuntungan Sistem Numbering Terstruktur

#### 🎯 Identifikasi Mudah

Dari nomor dokumen langsung tahu:

- Jenis dokumen apa
- Store mana
- Regular atau tidak
- Item basah atau kering

#### 📊 Reporting Akurat

Memudahkan analisis:

- Frekuensi SPB Regular vs Non-Regular
- Volume item Basah vs Kering
- Pattern pemesanan per store
- Trend per periode

#### 🔍 Tracking Efisien

Pencarian & monitoring:

- Filter by SPB type
- Filter by item type
- Quick search by pattern
- Audit trail jelas

#### ⚙️ Fleksibel & Scalable

Mudah dikembangkan:

- Tambah tipe baru
- Custom per store
- Adjust format sesuai kebutuhan
- Support multi-warehouse

### Reset Period & Counter Management

Reset Period | Deskripsi | Use Case | Example
--- | --- | --- | ---
Never | Counter tidak pernah reset | Dokumen yang perlu unique selamanya | SPB-0001, SPB-0002, ...
Daily | Reset setiap hari | Stock Opname harian | SO-20260119-001, SO-20260120-001
Monthly | Reset setiap bulan | SPB Regular bulanan | SPB-2601-0001, SPB-2602-0001
Yearly | Reset setiap tahun | Purchase Order tahunan | PO-2026-0001, PO-2027-0001

#### ⚠️ Penting: Unique Constraint

Sistem memastikan tidak ada duplikasi nomor dengan constraint:

`UNIQUE (store_id, document_type, spb_type, item_type, delete_flag)`

Artinya: Setiap kombinasi store, document type, SPB type, dan item type hanya boleh punya 1 format aktif.

## 📊 Contoh Kasus Lengkap

### Proses 3 Hari: Store "Cabang Senayan"

#### 📅 Hari 1 (Senin) - Setup & Forecast

    08:00 - SDP Upload Forecast
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Upload Excel forecast untuk minggu ini
    Forecast untuk Cabang Senayan:
      • Tepung Terigu: 100 kg/hari
      • Minyak Goreng: 50 liter/hari
      • Telur: 200 butir/hari

    10:00 - SSM Review Forecast
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Review forecast yang di-upload
    Adjust berdasarkan event:
      • Ada promo hari Rabu → increase 20%
      • Tepung Terigu: 120 kg (Rabu)

    14:00 - SM Set Target Sisa Malam
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Set TSM untuk setiap item:
      • Tepung Terigu: 15 kg (buffer 1 hari)
      • Minyak Goreng: 10 liter
      • Telur: 50 butir

#### 🌙 Hari 1 (Senin) - Malam (Stock Opname)

    22:00 - Staff Store Input SO
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Store: Cabang Senayan
    Tanggal: 2024-01-15

    Item 1: Tepung Terigu
      • Qty Utuh: 2 karton (1 karton = 10 kg)
      • Qty Pakai: 5 kg
      • Conversion: 2 × 10 = 20 kg
      • Ending Stock: 20 + 5 = 25 kg

    Item 2: Minyak Goreng
      • Qty Utuh: 3 jerigen (1 jerigen = 5 liter)
      • Qty Pakai: 2 liter
      • Conversion: 3 × 5 = 15 liter
      • Ending Stock: 15 + 2 = 17 liter

    Item 3: Telur
      • Qty Utuh: 5 tray (1 tray = 30 butir)
      • Qty Pakai: 10 butir
      • Conversion: 5 × 30 = 150 butir
      • Ending Stock: 150 + 10 = 160 butir

    22:30 - Submit SO
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      • Status: Draft → Submitted
      • SO Number: SO-SEN-20240115-001
      • Data locked, tidak bisa edit

#### ☀️ Hari 2 (Selasa) - Pagi (Generate SPB)

    07:00 - SM Generate SPB dari SO
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Store: Cabang Senayan
    Tanggal: 2024-01-16
    Referensi SO: SO-SEN-20240115-001

    Perhitungan Otomatis:

    Item 1: Tepung Terigu
      • Forecast (Selasa): 100 kg
      • Ending Stock (dari SO): 25 kg
      • TSM: 15 kg
      • Suggested Qty = (100 - 25) + 15 = 90 kg
      • Adjustment: +10 kg (ada catering order)
      • Final Qty: 100 kg ✓

    Item 2: Minyak Goreng
      • Forecast: 50 liter
      • Ending Stock: 17 liter
      • TSM: 10 liter
      • Suggested Qty = (50 - 17) + 10 = 43 liter
      • Adjustment: 0
      • Final Qty: 43 liter ✓

    Item 3: Telur
      • Forecast: 200 butir
      • Ending Stock: 160 butir
      • TSM: 50 butir
      • Suggested Qty = (200 - 160) + 50 = 90 butir
      • Adjustment: 0
      • Final Qty: 90 butir ✓

    08:00 - Review & Submit SPB
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      • SPB Number: SPB-SEN-20240116-001
      • Status: Draft → Submitted → Approved
      • Siap generate DO

#### ✅ Analisis Kasus

Akurasi Forecast:

- Tepung Terigu: Variance -20.8% (Under forecast - aman)
- Telur: Variance -15% (Under forecast - aman)

Efektivitas TSM:

- Semua item ending stock di atas TSM ✓
- TSM setting sudah tepat ✓

Efisiensi Proses:

- Total Lead Time: 34 jam (dari SO sampai terima barang)
- Target: < 36 jam
- Status: ✓ Sesuai target

## 🎓 Kesimpulan

### Keunggulan Sistem LSM Web Portal

#### 🤖 Otomasi Perhitungan

- Auto-calculate ending stock
- Auto-suggest SPB qty
- Mengurangi human error

#### 📊 Real-time Monitoring

- Dashboard monitor semua store
- Alert untuk item critical
- Tracking DO lengkap

#### 🔗 Integrasi ERP

- Sync master data dari QAD
- Export DO ke QAD
- Single source of truth

#### 📝 Audit Trail

- Log semua perubahan
- Track user activity
- History lengkap

### Rekomendasi Implementasi

Phase | Scope | Duration | Activities
--- | --- | --- | ---
Phase 1 | Pilot (1-2 Store) | 2-4 minggu | Test flow, training, fix bugs
Phase 2 | Rollout (5-10 Store) | 4-6 minggu | Deploy, monitor, collect feedback
Phase 3 | Full Deployment | 8-12 minggu | Deploy semua store, continuous improvement

#### 📌 Maintenance Plan

- Daily: Monitor sync logs & system health
- Weekly: Review error reports & user feedback
- Monthly: Performance review & optimization
- Quarterly: User training & feature enhancement