# Dokumen Arsitektur Sistem Distribusi & Logistik

Dokumen ini menjelaskan rancangan sistem logistik perusahaan untuk dua metode pemenuhan stok:
1. **Metode Regular (Melalui Distribution Center / DC)**
2. **Metode Direct Shipping (Pengiriman Langsung ke Cabang dengan Pencatatan DC Virtual)**

---

## 1. Flowchart Sistem

### A. Alur Regular (Melalui DC Fisik)
```text
[ Mulai ] ──► [ Buat PO Regular ] ──► [ Supplier Kirim ke DC ]
                                                │
                                                ▼
                                      [ Cek Fisik & QC di DC ]
                                                │
                                      (Apakah Lolos QC?)
                                        ├── Ya  ──► [ Inbound & Put-Away ke Rak DC ]
                                        │                     │
                                        │                     ▼
                                        │           [ Alokasi Stok & Picking ]
                                        │                     │
                                        │                     ▼
                                        │           [ DC Kirim ke Cabang ]
                                        │                     │
                                        │                     ▼
                                        │           [ Cabang Terima & Update Stok ]
                                        │                     │
                                        └── Tidak ─► [ Retur ke Supplier dari DC ] ──► [ Selesai ]
```

### B. Alur Direct Shipping (Otomatisasi Virtual)
```text
[ Mulai ] ──► [ Buat PO Direct ] ──► [ Supplier Kirim ke Cabang ]
                                                │
                                                ▼
                                    [ Cabang Terima & Cek Fisik ]
                                                │
                                      (Apakah Lolos QC?)
                                        ├── Ya  ──► [ Cabang Klik "Konfirmasi" di POS ]
                                        │                     │
                                        │                     ▼
                                        │           ┌──────────────────────────────────┐
                                        │           │    TRIGGER OTOMATIS SYSTEM:      │
                                        │           │ 1. Good Receipt Virtual di DC    │
                                        │           │ 2. Transfer Order Virtual ke Cab │
                                        │           └──────────────────────────────────┘
                                        │                     │
                                        │                     ▼
                                        │           [ Stok Cabang Otomatis Aktif ]
                                        │                     │
                                        └── Tidak ─► [ Cabang Tolak/Retur di Tempat ] ──► [ Selesai ]
```

---

## 2. Struktur Master Data (Database Schema)

### A. Tabel Master

#### 1. Master Supplier (`ms_supplier`)
Mencatat data rekanan supplier beserta preferensi pengiriman default.
*   `supplier_id` (VARCHAR, PK)
*   `supplier_name` (VARCHAR)
*   `city` (VARCHAR)
*   `default_delivery_type` (ENUM: 'REGULAR', 'DIRECT')

#### 2. Master Gudang & Cabang (`ms_warehouse_branch`)
Memisahkan entitas antara gudang pusat (DC) dan toko retail (Cabang).
*   `location_id` (VARCHAR, PK)
*   `location_name` (VARCHAR)
*   `location_type` (ENUM: 'DC', 'BRANCH')
*   `city` (VARCHAR)

#### 3. Master Produk (`ms_product`)
*   `sku` (VARCHAR, PK)
*   `product_name` (VARCHAR)
*   `is_direct_allow` (BOOLEAN) - *Batasan jika produk tertentu wajib lewat QC DC.*

---

### B. Tabel Transaksi

#### 1. Header Purchase Order (`tr_po_header`)
*   `po_number` (VARCHAR, PK)
*   `supplier_id` (VARCHAR, FK)
*   `po_type` (ENUM: 'REGULAR', 'DIRECT')
*   `dest_location_id` (VARCHAR, FK) - *Berisi ID DC jika Regular, atau ID Cabang jika Direct.*
*   `po_status` (ENUM: 'DRAFT', 'APPROVED', 'SHIPPED', 'CLOSED')

#### 2. Detail Purchase Order (`tr_po_detail`)
*   `po_number` (VARCHAR, FK)
*   `sku` (VARCHAR, FK)
*   `qty_ordered` (INT)
*   `price` (DECIMAL)

#### 3. Penerimaan Barang (`tr_good_receipt`)
*   `gr_number` (VARCHAR, PK)
*   `po_number` (VARCHAR, FK)
*   `location_id` (VARCHAR, FK) - *Lokasi pencatatan stok masuk.*
*   `received_date` (DATETIME)
*   `received_by` (VARCHAR) - *Berisi nama user atau 'SYSTEM_AUTO'.*

#### 4. Mutasi Antar Gudang (`tr_inter_transfer`)
*   `transfer_number` (VARCHAR, PK)
*   `from_location_id` (VARCHAR, FK)
*   `to_location_id` (VARCHAR, FK)
*   `transfer_status` (ENUM: 'PENDING', 'IN_TRANSIT', 'COMPLETED')
*   `is_virtual` (BOOLEAN) - *TRUE jika transaksi Direct Shipping.*

---

## 3. Matriks Logika & Otomatisasi Sistem

| Skenario | Dokumen Awal | Proses Inbound | Proses Outbound | Logika Kartu Stok (DC) | Logika Kartu Stok (Cabang) |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **1. Regular (Lewat DC)** | PO Type: `REGULAR`<br>Dest: `DC_01` | User DC klik **Good Receipt** saat fisik truk supplier tiba. | User DC buat **Transfer Order** & kirim fisik ke cabang. | **+ Plus** (Saat GR)<br>**- Minus** (Saat Kirim) | **+ Plus** (Saat fisik tiba di cabang) |
| **2. Direct Shipping** | PO Type: `DIRECT`<br>Dest: `BR_SBY` | **Otomatis Sistem** (Virtual GR ke DC) saat Cabang klik terima. | **Otomatis Sistem** (Virtual Transfer ke Cabang) detik yang sama. | **+ Plus** & **- Minus** di detik yang sama.<br>*(Saldo fisik tetap 0)* | **+ Plus** (Sesuai jumlah yang dikonfirmasi cabang) |

---

## 4. Logika Pemrograman Back-End (Pseudo-code Trigger Direct Shipping)

Ketika Cabang menerima barang fisik dari Supplier dan menekan tombol **"Konfirmasi Terima"** pada aplikasi POS/ERP, sistem harus menjalankan fungsi otomatis berikut secara *real-time*:

```backend-logic
FUNCTION on_cabang_receive_direct_po(po_number, cabang_id, item_list) {
    
    // 1. Buat Nomor GR Virtual untuk DC
    VAR gr_virtual_id = generate_gr_number();
    INSERT INTO tr_good_receipt (gr_number, po_number, location_id, received_by)
    VALUES (gr_virtual_id, po_number, 'DC_PUSAT', 'SYSTEM_AUTO');
    
    // Efek: Stok DC bertambah secara virtual
    LOOP item IN item_list {
        UPDATE stock_table SET qty = qty + item.qty_received 
        WHERE location_id = 'DC_PUSAT' AND sku = item.sku;
    }

    // 2. Buat Dokumen Transfer Virtual dari DC ke Cabang Penerima
    VAR tf_virtual_id = generate_transfer_number();
    INSERT INTO tr_inter_transfer (transfer_number, from_location_id, to_location_id, is_virtual, transfer_status)
    VALUES (tf_virtual_id, 'DC_PUSAT', cabang_id, TRUE, 'COMPLETED');

    // Efek: Potong stok virtual di DC, lempar langsung ke Cabang
    LOOP item IN item_list {
        // Potong DC
        UPDATE stock_table SET qty = qty - item.qty_received 
        WHERE location_id = 'DC_PUSAT' AND sku = item.sku;
        
        // Tambah Cabang (Stok Aktif Siap Jual)
        UPDATE stock_table SET qty = qty + item.qty_received 
        WHERE location_id = cabang_id AND sku = item.sku;
    }
    
    // 3. Update Status PO menjadi Selesai
    UPDATE tr_po_header SET po_status = 'CLOSED' WHERE po_number = po_number;
}
```

---

## 5. Penanganan Retur (Reverse Logistics)

### Kasus A: Retur pada Jalur Regular (Di DC)
*   **Kondisi**: Barang rusak ditemukan saat *unloading* di DC.
*   **Solusi**: Tim DC langsung menolak barang, membuat Berita Acara (BA), dan memotong jumlah item pada dokumen `tr_good_receipt` sebelum disimpan ke rak. Pembayaran ke supplier hanya mendasarkan pada item yang lolos QC.

### Kasus B: Retur pada Jalur Direct Shipping (Di Cabang)
*   **Kondisi**: Barang dikirim langsung ke cabang, namun ada sebagian barang yang rusak/salah spesifikasi.
*   **Solusi Sistem**: 
    1. Staf cabang memasukkan jumlah barang yang **Diterima (Baik)** dan jumlah barang yang **Ditolak (Rusak)** pada sistem konfirmasi.
    2. *Trigger* otomatis pada Poin 4 hanya akan memproses kuantitas barang yang **Baik** untuk masuk ke mekanisme Virtual GR DC hingga ke stok Cabang.
    3. Untuk barang yang **Ditolak**, sistem akan menerbitkan lembar klaim otomatis (`Claim Ticket`) ke supplier atas nama DC, sementara fisik barang langsung dibawa kembali oleh armada supplier dari toko tersebut.
