> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quinnsambal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Supplier management

<style>
  {`
    [class*="max-w-none"][class*="table"] {
      display: block !important;
      overflow-x: auto !important;
      max-width: 100% !important;
      width: 100% !important;
      flex-grow: 0 !important;
    }
    [class*="max-w-none"][class*="table"] > table {
      width: 100% !important;
      max-width: 100% !important;
      table-layout: fixed !important;
    }
    .mermaid {
      max-width: 100% !important;
      overflow-x: auto !important;
    }
    article svg[role="img"] {
      max-width: 100% !important;
      height: auto !important;
    }
    article img, .prose img {
      max-width: 100% !important;
      height: auto !important;
    }
    img[src*="LOGO"], img[src*="logo"] {
      max-width: 120px !important;
      max-height: 40px !important;
      width: auto !important;
      height: auto !important;
      object-fit: contain !important;
    }
    `}
</style>

***

title: "Supplier Management"
description: "Database supplier lengkap dengan katalog produk, rating performa, perbandingan harga, dan riwayat pembelian."
---------------------------------------------------------------------------------------------------------------------------

# Supplier Management

<img src="https://mintcdn.com/quinnofspicy/e4f_upKhVWcjsUmM/docs/mintlify/screenshots/inventory/supplier-management.png?fit=max&auto=format&n=e4f_upKhVWcjsUmM&q=85&s=4321d59fcc2da458d56efe41d60e1360" alt="Supplier Management" width="1920" height="1080" data-path="docs/mintlify/screenshots/inventory/supplier-management.png" />

Supplier Management adalah pusat database untuk seluruh pemasok yang bekerja sama dengan Quinn of Spicy. Halaman ini menyimpan informasi kontak lengkap, katalog produk yang disediakan beserta harga penawaran, riwayat pembelian, rating performa, dan dokumen kontrak. Dengan data yang terpusat, kamu bisa membandingkan harga dari beberapa supplier, mengevaluasi performa, dan mengambil keputusan pembelian yang lebih cerdas.

## Arsitektur Supplier Management

```mermaid theme={null}
graph TB
    subgraph "Database Supplier"
        SD[Supplier Directory<br/>Data Perusahaan & Kontak]
        CAT[Product Catalog<br/>Daftar Produk & Harga]
        HIS[Purchase History<br/>Riwayat Transaksi]
        RTG[Rating & Evaluation<br/>Skor Performa]
        DOC[Documents<br/>Kontrak & Sertifikat]
    end

    subgraph "Operasi"
        CMP[Price Comparison<br/>Banding Harga Antar Supplier]
        EVAL[Supplier Evaluation<br/>Evaluasi Berkala]
        SRC[Source Selection<br/>Pilih Supplier Terbaik]
    end

    subgraph "Integrasi"
        PO[Purchase Order<br/>Buat PO dari Katalog]
        FIN[Keuangan<br/>Hutang & Pembayaran]
        INV[Inventori<br/>Stok Masuk]
    end

    SD --> PO
    CAT --> PO
    HIS --> EVAL
    RTG --> SRC
    DOC --> SD
    CMP --> SRC
    EVAL --> SRC
    PO --> HIS
    PO --> FIN
    PO --> INV
```

## Data Supplier — Field Lengkap

### Informasi Dasar

| Field | Tipe | Wajib | Deskripsi |
| - | - | - | - |
| **Nama Perusahaan** | Text | Ya | Nama resmi supplier |
| **Nama Kontak** | Text | Ya | Person in charge |
| **Jabatan** | Text | Tidak | Jabatan kontak |
| **Telepon** | Phone | Ya | Nomor telepon / WhatsApp |
| **Email** | Email | Ya | Alamat email |
| **Alamat** | Text | Ya | Alamat lengkap |
| **Kota** | Text | Ya | Kota lokasi |
| **NPWP** | Text | Tidak | Nomor Pokok Wajib Pajak |
| **Kategori** | Multi-select | Ya | Bahan Baku, Kemasan, Peralatan, Jasa, dll |
| **Status** | Enum | Ya | Aktif, Nonaktif, Blacklisted |

### Informasi Tambahan

| Field | Deskripsi |
| - | - |
| **Website** | URL website supplier |
| **Social Media** | Akun media sosial |
| **Payment Terms** | Default termin pembayaran (Cash, Net 7, Net 14, Net 30) |
| **Minimum Order** | Minimum order value atau quantity |
| **Lead Time** | Rata-rata waktu pengiriman (hari) |
| **Delivery Area** | Area yang dilayani |
| **Bank Account** | Informasi rekening (untuk pembayaran) |
| **PIC Internal** | Staff internal yang menangani supplier ini |

## Katalog Produk per Supplier

Setiap supplier bisa memiliki katalog produk riêng dengan harga penawaran:

| Field | Deskripsi |
| - | - |
| **Produk** | Referensi ke produk di katalog perusahaan |
| **Harga Penawaran** | Harga per unit yang ditawarkan supplier ini |
| **Satuan** | Unit (kg, liter, pcs, box, dll) |
| **Minimum Order** | Minimum order untuk produk ini |
| **Lead Time** | Waktu pengiriman spesifik produk ini |
| **Last Updated** | Tanggal terakhir harga diupdate |
| **Status** | Tersedia / Tidak Tersedia |

### Contoh Katalog

| Produk | Harga Supplier A | Harga Supplier B | Harga Supplier C | Terbaik |
| - | - | - | - | - |
| Cabai Merah (kg) | Rp 45.000 | Rp 42.000 | Rp 47.000 | **Supplier B** |
| Bawang Putih (kg) | Rp 28.000 | Rp 30.000 | Rp 25.000 | **Supplier C** |
| Minyak Goreng (liter) | Rp 16.000 | Rp 15.500 | Rp 16.500 | **Supplier B** |
| Kemasan Pouch (pcs) | Rp 500 | Rp 450 | Rp 520 | **Supplier B** |

## Rating & Evaluasi Performa

### Komponen Rating

```mermaid theme={null}
graph LR
    subgraph "Rating Supplier (1-5)"
        Q[Quality<br/>Kualitas Barang<br/>Bobot: 35%]
        D[Delivery<br/>Ketepatan Waktu<br/>Bobot: 30%]
        S[Service<br/>Pelayanan<br/>Bobot: 20%]
        P[Price<br/>Harga Kompetitif<br/>Bobot: 15%]
    end

    Q & D & S & P --> OV[Overall Score<br/>Weighted Average]
```

| Komponen | Bobot | Kriteria | Skor |
| - | - | - | - |
| **Kualitas Barang** | 35% | Kesesuaian spesifikasi, tingkat cacat, konsistensi | 1-5 |
| **Ketepatan Waktu** | 30% | % PO yang tiba sesuai jadwal, rata-rata keterlambatan | 1-5 |
| **Pelayanan** | 20% | Responsivitas, penanganan komplain, fleksibilitas | 1-5 |
| **Harga Kompetitif** | 15% | Perbandingan harga dengan supplier lain | 1-5 |

### Skor Akhir

| Range | Predikat | Tindakan |
| - | - | - |
| **4.5 - 5.0** | Excellent | Pertahankan, tingkatkan volume order |
| **3.5 - 4.4** | Good | Pertahankan, evaluasi minor |
| **2.5 - 3.4** | Fair | Peringatkan, beri waktu perbaikan 3 bulan |
| **1.5 - 2.4** | Poor | Kurangi order, cari alternatif |
| **\< 1.5** | Critical | Blacklist, ganti supplier |

## Riwayat Pembelian

Setiap transaksi PO tercatat di riwayat supplier:

| Kolom | Deskripsi |
| - | - |
| **PO Number** | Nomor purchase order |
| **Tanggal** | Tanggal PO dibuat |
| **Total Nilai** | Nilai total PO |
| **Items** | Jumlah item yang dipesan |
| **Status** | Status PO (Full Received, Partial, dll) |
| **On-Time** | Apakah barang tiba tepat waktu |
| **Quality Issue** | Ada/tidak masalah kualitas |

### Metrik Riwayat

| Metrik | Deskripsi | Periode |
| - | - | - |
| **Total Order** | Jumlah PO yang dibuat | All-time |
| **Total Nilai** | Akumulasi nilai pembelian | All-time |
| **Avg Order Value** | Rata-rata nilai per PO | 12 bulan |
| **Order Frequency** | Rata-rata frekuensi order | Per bulan |
| **On-Time Rate** | % PO yang tiba tepat waktu | 12 bulan |
| **Quality Rate** | % PO tanpa masalah kualitas | 12 bulan |

## Perbandingan Harga

Fitur untuk membandingkan harga produk yang sama dari beberapa supplier:

```mermaid theme={null}
flowchart TD
    A[Pilih Produk] --> B[Sistem Cari Semua Supplier<br/>yang Menyediakan Produk Ini]
    B --> C[Tampilkan Tabel Perbandingan]
    C --> D{Analisa}
    D --> E[Harga Terendah]
    D --> F[Lead Time Tercepat]
    D --> G[Rating Terbaik]
    E & F & G --> H[Rekomendasi Supplier]
    H --> I[Buat PO dari Supplier Terpilih]
```

| Faktor | Prioritas | Catatan |
| - | - | - |
| **Harga** | Tinggi | Selisih >5% biasanya signifikan |
| **Kualitas** | Tinggi | Jangan korbankan kualitas demi harga |
| **Lead Time** | Sedang | Penting untuk bahan baku kritis |
| **Rating** | Sedang | Performa historis supplier |
| **Minimum Order** | Rendah | Relevan jika kebutuhan kecil |

## Dokumen Supplier

| Jenis Dokumen | Fungsi | Format |
| - | - | - |
| **Kontrak Kerjasama** | Perjanjian harga, volume, termin | PDF |
| **Sertifikat Halal** | Jaminan kehalalan bahan | PDF/Image |
| **Sertifikat BPOM** | Izin edar produk | PDF/Image |
| **Surat Penunjukan** | Dealer/distributor resmi | PDF/Image |
| **Katalog Produk** | Daftar produk terbaru | PDF/Excel |
| **Daftar Harga** | Price list terbaru | PDF/Excel |

## Filter & Pencarian

| Filter | Opsi | Fungsi |
| - | - | - |
| **Nama** | Text search | Cari berdasarkan nama perusahaan atau kontak |
| **Kategori** | Bahan Baku, Kemasan, Peralatan, Jasa | Filter per jenis supplier |
| **Status** | Aktif, Nonaktif, Blacklisted | Filter berdasarkan status |
| **Kota** | Nama kota | Filter per lokasi |
| **Rating** | 1-5 bintang | Filter berdasarkan performa |

## Integrasi

```mermaid theme={null}
graph LR
    SUP[Supplier Management] -->|Katalog & Harga| PO[Purchase Order]
    PO -->|Riwayat & Rating| SUP
    PO -->|Stock In| INV[Stock Management]
    PO -->|Hutang| FIN[Keuangan]
    FIN -->|Pembayaran| SUP
```

## Tips

* **Evaluasi supplier secara berkala** (minimal per kuartal) untuk memastikan kualitas dan harga masih kompetitif.
* **Jaga hubungan baik** dengan supplier utama — komunikasikan perubahan kebutuhan atau jadwal pengiriman jauh-jauh hari.
* **Selalu punya minimal 2 supplier** untuk bahan baku kritis supaya tidak bergantung pada satu sumber.
* **Gunakan fitur perbandingan harga** setiap kali akan membuat PO untuk memastikan mendapat harga terbaik.

***

## Entity Relationship Diagram

```mermaid theme={null}
erDiagram
    Supplier ||--o{ PurchaseOrder : "membuat"
    Supplier ||--o{ QualityCheck : "diaudit"
    PurchaseOrder ||--o{ QualityCheck : "inspeksi"
    PurchaseOrder ||--o{ StockMovement : "penerimaan barang"
    QualityCheck ||--o{ StockMovement : "lot masuk inventory"

    Supplier {
        string company_id PK
        string supplier_code UK "Kode unik supplier"
        string company_name "Nama perusahaan"
        string contact_person "Nama kontak"
        string email "Email"
        string phone "Telepon"
        string address "Alamat lengkap"
        string city "Kota"
        string country "Negara"
        string tax_id "NPWP / Tax ID"
        string bank_account "Rekening bank"
        string bank_name "Nama bank"
        string payment_terms "Termin pembayaran"
        string currency "Mata uang (default IDR)"
        number rating "Rating 1-5"
        boolean is_active "Status aktif"
        string supplier_type "general|farmer|distributor|importer"
        boolean is_locked "Terkunci jika ada PO aktif"
        datetime last_validated_at "Terakhir validasi data"
        number validation_score "Skor kelengkapan 0-100"
        array supplied_materials "Daftar bahan yang dipasok"
        string notes "Catatan"
    }

    PurchaseOrder {
        string company_id FK
        string po_number UK "Nomor PO unik"
        string supplier_id FK
        string supplier_name
        date po_date "Tanggal PO"
        date expected_delivery_date "Target pengiriman"
        array items "Daftar item (product, qty, harga)"
        number subtotal "Subtotal sebelum pajak"
        number tax_amount "Pajak"
        number shipping_cost "Ongkir"
        number total_amount "Total keseluruhan"
        string status "draft|sent|confirmed|received|invoiced|cancelled"
        string received_status "pending|partially_received|fully_received"
        string notes "Catatan PO"
    }

    QualityCheck {
        string company_id FK
        string qc_number UK "QC-YYYYMMDD-XXX"
        string purchase_order_id FK
        string supplier_id FK
        string raw_material_id FK "Bahan baku yang diperiksa"
        string batch_id "Batch bahan baku"
        number quantity_received "Jumlah diterima"
        date qc_date "Tanggal pengecekan"
        string inspector_id FK "QC inspector"
        array checklist "Item pemeriksaan kualitas"
        string overall_status "pending|approved|rejected|conditional"
        number approved_quantity "Lolos QC"
        number rejected_quantity "Ditolak"
        number temperature "Suhu bahan (°C)"
        number humidity "Kelembaban (%)"
        string expiry_date_check "valid|expired|near_expiry|no_date"
        boolean inventory_updated "Sudah masuk stok"
    }

    StockMovement {
        string company_id FK
        string inventory_id FK
        string product_id FK
        string movement_type "in|out|transfer|adjustment|return|damaged|hold|hold_release"
        number quantity "Jumlah pergerakan"
        number stock_before "Stok sebelum"
        number stock_after "Stok sesudah"
        string reference_type "purchase|sale|production|qc_release|..."
        string lot_id "Lot/Batch untuk traceability"
        string reference_id "ID transaksi terkait (PO, SO)"
        number unit_cost "Harga modal per unit"
        string performed_by "User yang melakukan"
    }
```

## Tabel Schema Lengkap

### Supplier — Semua Field

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Ya | — | ID perusahaan (multi-tenant) |
| `supplier_code` | string | Tidak | — | Kode supplier unik (auto-generate) |
| `company_name` | string | Ya | — | Nama resmi perusahaan supplier |
| `contact_person` | string | Tidak | — | Nama kontak person (PIC) |
| `email` | string (email) | Tidak | — | Alamat email supplier |
| `phone` | string | Tidak | — | Nomor telepon / WhatsApp |
| `address` | string | Tidak | — | Alamat lengkap |
| `city` | string | Tidak | — | Kota lokasi |
| `country` | string | Tidak | — | Negara |
| `tax_id` | string | Tidak | — | NPWP atau Tax ID perusahaan |
| `bank_account` | string | Tidak | — | Nomor rekening bank |
| `bank_name` | string | Tidak | — | Nama bank |
| `payment_terms` | string | Tidak | — | Termin pembayaran (NET 30, COD, dll) |
| `currency` | string | Tidak | `IDR` | Mata uang transaksi |
| `rating` | number | Tidak | — | Rating performa supplier (1–5) |
| `is_active` | boolean | Tidak | `true` | Status aktif supplier |
| `supplier_type` | enum | Tidak | `general` | Klasifikasi: general, farmer, distributor, importer |
| `is_locked` | boolean | Tidak | `false` | Data terkunci karena ada PO aktif — field nama, NPWP, rekening tidak bisa diedit |
| `last_validated_at` | datetime | Tidak | — | Timestamp terakhir validasi data supplier |
| `validation_score` | number | Tidak | `0` | Skor kelengkapan data supplier (0–100) |
| `supplied_materials` | array\[string] | Tidak | — | Daftar bahan baku / komoditas yang dipasok |
| `notes` | string | Tidak | — | Catatan tambahan |

### PurchaseOrder — Ringkasan Field

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Ya | — | ID perusahaan |
| `po_number` | string | Tidak | — | Nomor PO unik (auto-generate) |
| `supplier_id` | string | Ya | — | Referensi ke Supplier |
| `supplier_name` | string | Tidak | — | Nama supplier (denormalized) |
| `po_date` | date | Ya | — | Tanggal pembuatan PO |
| `expected_delivery_date` | date | Tidak | — | Target tanggal pengiriman |
| `items` | array\[object] | Ya | — | Daftar item: product\_id, product\_name, quantity, unit, unit\_price, total\_price, received\_quantity |
| `subtotal` | number | Tidak | `0` | Subtotal sebelum pajak |
| `tax_amount` | number | Tidak | `0` | Jumlah pajak |
| `shipping_cost` | number | Tidak | `0` | Biaya pengiriman |
| `total_amount` | number | Tidak | — | Total keseluruhan (subtotal + tax + shipping) |
| `status` | enum | Tidak | `draft` | Status PO: draft, sent, confirmed, received, invoiced, cancelled |
| `received_status` | enum | Tidak | `pending` | Status penerimaan: pending, partially\_received, fully\_received |
| `notes` | string | Tidak | — | Catatan PO |

### QualityCheck — Ringkasan Field

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Ya | — | ID perusahaan |
| `qc_number` | string | Ya | — | Nomor QC unik (format: QC-YYYYMMDD-XXX) |
| `purchase_order_id` | string | Tidak | — | Referensi ke Purchase Order |
| `supplier_id` | string | Ya | — | Referensi ke Supplier |
| `raw_material_id` | string | Ya | — | ID bahan baku yang diperiksa |
| `batch_id` | string | Tidak | — | Batch ID bahan baku |
| `quantity_received` | number | Tidak | — | Jumlah yang diterima dari supplier |
| `qc_date` | date | Ya | — | Tanggal pengecekan QC |
| `qc_time` | string | Tidak | — | Waktu pengecekan |
| `inspector_id` | string | Tidak | — | ID user QC inspector |
| `checklist` | array\[object] | Tidak | — | Checklist: item, standard, result (pass/fail/warning/na), notes |
| `overall_status` | enum | Tidak | `pending` | Status keseluruhan: pending, approved, rejected, conditional |
| `rejection_reason` | string | Tidak | — | Alasan penolakan (jika rejected) |
| `photos` | array\[string] | Tidak | — | URL foto dokumentasi QC |
| `temperature` | number | Tidak | — | Suhu bahan saat diterima (°C) |
| `humidity` | number | Tidak | — | Kelembaban (%) |
| `expiry_date_check` | enum | Tidak | — | Cek expired: valid, expired, near\_expiry, no\_date |
| `approved_quantity` | number | Tidak | `0` | Jumlah yang disetujui masuk inventory |
| `rejected_quantity` | number | Tidak | `0` | Jumlah yang ditolak |
| `inventory_updated` | boolean | Tidak | `false` | Apakah stok sudah masuk inventory |
| `claimed_quantity` | number | Tidak | — | Kuantitas menurut surat jalan supplier |
| `weighed_quantity` | number | Tidak | — | Kuantitas hasil timbang ulang di gudang |
| `delivery_variance` | number | Tidak | `0` | Selisih: claimed − weighed |
| `unit_cost` | number | Tidak | `0` | Estimasi HPP bahan baku per unit |

## State Machine — Siklus Hidup Supplier

```mermaid theme={null}
stateDiagram-v2
    [*] --> Aktif: Registrasi supplier baru

    state "Aktif" as Aktif
    state "Nonaktif" as Nonaktif
    state "Blacklisted" as Blacklisted
    state "Terkunci (Locked)" as Locked

    Aktif --> Locked: Ada PO aktif berjalan\n(field kritis tidak bisa diedit)
    Locked --> Aktif: Semua PO selesai\n(field kembali editable)
    Aktif --> Nonaktif: Dinonaktifkan manual\n(tidak ada transaksi baru)
    Nonaktif --> Aktif: Diaktifkan kembali\nsetelah evaluasi
    Aktif --> Blacklisted: Pelanggaran berat\n(kualitas gagal berulang,\nfraud, sertifikat palsu)
    Blacklisted --> Aktif: Rehabilitasi setelah\naudit ulang & approval manajemen
    Nonaktif --> Blacklisted: Ditemukan pelanggaran\nselama masa nonaktif
```

### Aturan Transisi Status

| Dari | Ke | Pemicu | Persyaratan |
| - | - | - | - |
| `[*]` | **Aktif** | Registrasi supplier baru | `company_name` wajib diisi |
| **Aktif** | **Terkunci** | PO pertama dibuat untuk supplier ini | Sistem men-set `is_locked = true` otomatis |
| **Terkunci** | **Aktif** | Semua PO terkait berstatus `received` / `cancelled` | Sistem men-set `is_locked = false` otomatis |
| **Aktif** | **Nonaktif** | Admin menonaktifkan manual | Tidak ada PO berstatus `draft`/`sent`/`confirmed` |
| **Nonaktif** | **Aktif** | Admin mengaktifkan kembali | Evaluasi ulang kelengkapan data |
| **Aktif** | **Blacklisted** | Pelanggaran berat terdokumentasi | Approval manajer procurement |
| **Blacklisted** | **Aktif** | Audit ulang lulus | Approval direktur + evidence perbaikan |

## Sequence Diagram — Evaluasi Supplier

```mermaid theme={null}
sequenceDiagram
    participant Admin as Admin Procurement
    participant Sistem as Sistem ERP
    participant DB as Database
    participant PO as PurchaseOrder
    participant QC as QualityCheck

    Admin->>Sistem: Minta laporan evaluasi supplier
    Sistem->>DB: Query semua PurchaseOrder per supplier_id
    DB-->>Sistem: Daftar PO + status penerimaan
    Sistem->>DB: Query semua QualityCheck per supplier_id
    DB-->>Sistem: Daftar QC + overall_status + checklist

    rect rgb(240, 248, 255)
        Note over Sistem: Perhitungan Skor Evaluasi
        Sistem->>Sistem: Hitung Quality Score (35%)<br/>dari QC pass rate
        Sistem->>Sistem: Hitung Delivery Score (30%)<br/>dari on-time delivery rate
        Sistem->>Sistem: Hitung Service Score (20%)<br/>dari responsivitas & handling komplain
        Sistem->>Sistem: Hitung Price Score (15%)<br/>dari perbandingan harga vs kompetitor
    end

    Sistem->>Sistem: Weighted Average = (Q×0.35) + (D×0.30) + (S×0.20) + (P×0.15)
    Sistem->>DB: Update Supplier.rating = skor akhir
    Sistem-->>Admin: Tampilkan scorecard + rekomendasi
    Admin->>DB: Update validation_score + catatan evaluasi
```

## Sequence Diagram — Pembuatan PO dari Supplier

```mermaid theme={null}
sequenceDiagram
    participant User as Staff Procurement
    participant Sistem as Sistem ERP
    participant Sup as Supplier
    participant PO as PurchaseOrder
    participant QC as QualityCheck
    participant Inv as StockMovement

    User->>Sistem: Pilih supplier dari katalog
    Sistem->>Sup: Fetch data supplier + katalog produk
    Sup-->>Sistem: Data supplier (cek is_active, supplier_type)
    alt Supplier nonaktif atau blacklisted
        Sistem-->>User: ⛔ Error: Supplier tidak aktif
    else Supplier aktif
        Sistem-->>User: Tampilkan katalog produk + harga
    end

    User->>Sistem: Buat PO (pilih items, qty, harga)
    Sistem->>PO: Create PurchaseOrder (status = "draft")
    PO-->>Sistem: PO berhasil dibuat (po_number di-generate)

    User->>Sistem: Submit PO ke supplier
    Sistem->>PO: Update status → "sent"
    Sistem->>Sup: Cek & set is_locked = true (jika pertama kali)
    Sistem-->>User: PO terkirim ke supplier

    Note over User,Inv: === Siklus Penerimaan Barang ===

    User->>Sistem: Konfirmasi barang diterima
    Sistem->>PO: Update status → "confirmed", received_status → "partially_received"

    Sistem->>QC: Buat QualityCheck otomatis
    QC-->>Sistem: QC record dibuat (status = "pending")

    User->>Sistem: Input hasil inspeksi QC
    Sistem->>QC: Update checklist + overall_status

    alt QC approved
        Sistem->>QC: Set approved_quantity, inventory_updated = true
        Sistem->>Inv: Create StockMovement (type = "in", ref = "purchase")
        Inv-->>Sistem: Stok bertambah
        Sistem->>PO: Update received_status → "fully_received"
    else QC rejected
        Sistem->>QC: Set rejected_quantity + rejection_reason
        Sistem-->>User: Notifikasi: barang ditolak, hubungi supplier
    else QC conditional
        Sistem->>QC: Set approved_quantity (sebagian)
        Sistem->>Inv: Create StockMovement untuk qty yang lolos
        Sistem-->>User: Sebagian barang diterima, sisanya ditolak
    end
```

## Tabel Enum

### `supplier_type` — Klasifikasi Supplier

| Nilai | Label | Deskripsi | Aturan Penerimaan |
| - | - | - | - |
| `general` | Supplier Umum | Penyedia barang umum / trading | QC standar, checklist lengkap |
| `farmer` | Petani / K petani | Langsung dari petani atau kelompok tani | QC fokus pada kesegaran, kadar air, sortasi |
| `distributor` | Distributor Resmi | Dealer / distributor resmi brand | Verifikasi sertifikat distribusi, QC sampling |
| `importer` | Importir | Barang impor dari luar negeri | Wajib cek dokumen Bea Cukai, sertifikat halal/BPOM, QC ketat |

### `status` (PurchaseOrder) — Status PO

| Nilai | Label | Deskripsi |
| - | - | - |
| `draft` | Draft | PO belum dikirim, masih dalam penyusunan |
| `sent` | Terkirim | PO sudah dikirim ke supplier, menunggu konfirmasi |
| `confirmed` | Dikonfirmasi | Supplier mengonfirmasi dan sedang mempersiapkan barang |
| `received` | Diterima | Barang sudah diterima (seluruhnya atau sebagian) |
| `invoiced` | Difakturkan | Invoice dari supplier sudah diterima dan diverifikasi |
| `cancelled` | Dibatalkan | PO dibatalkan (oleh admin atau supplier) |

### `received_status` (PurchaseOrder) — Status Penerimaan

| Nilai | Label | Deskripsi |
| - | - | - |
| `pending` | Belum Diterima | Barang belum ada yang diterima |
| `partially_received` | Diterima Sebagian | Sebagian item/qty sudah diterima |
| `fully_received` | Diterima Penuh | Semua item dan qty sudah diterima lengkap |

### `overall_status` (QualityCheck) — Status Hasil QC

| Nilai | Label | Deskripsi | Tindakan |
| - | - | - | - |
| `pending` | Menunggu | QC belum dilakukan | Inspector melakukan inspeksi |
| `approved` | Disetujui | Semua item lolos QC | Stok masuk inventory |
| `rejected` | Ditolak | Item gagal QC | Retur ke supplier / musnahkan |
| `conditional` | Bersyarat | Sebagian lolos, sebagian tidak | Stok parsial masuk inventory |

### `expiry_date_check` (QualityCheck) — Status Cek Expired

| Nilai | Label | Deskripsi |
| - | - | - |
| `valid` | Valid | Tanggal expired masih jauh (>30 hari) |
| `expired` | Kadaluarsa | Tanggal expired sudah lewat |
| `near_expiry` | Hampir Kadaluarsa | Tanggal expired dalam 30 hari |
| `no_date` | Tanpa Tanggal | Tidak ada tanggal expired pada kemasan |

### `movement_type` (StockMovement) — Tipe Pergerakan Stok

| Nilai | Label | Deskripsi | Pengaruh Stok |
| - | - | - | - |
| `in` | Stok Masuk | Penerimaan barang (dari PO) | Menambah |
| `out` | Stok Keluar | Pengeluaran barang (untuk produksi/penjualan) | Mengurangi |
| `transfer` | Transfer | Perpindahan antar lokasi | Netral (kurang di asal, tambah di tujuan) |
| `adjustment` | Penyesuaian | Koreksi stok (opname, selisih) | Menambah/mengurangi |
| `return` | Retur | Pengembalian barang ke supplier | Mengurangi |
| `damaged` | Rusak | Barang rusak / tidak layak | Mengurangi |
| `hold` | Ditahan | Blokir lot untuk QC | Tidak mengubah on-hand (informatif) |
| `hold_release` | Dilepaskan | Lepas blokir lot setelah QC | Tidak mengubah on-hand (informatif) |

## Supplier Scorecard — Breakdown `validation_score`

Skor `validation_score` (0–100) mengukur kelengkapan dan validitas data supplier. Skor ini dihitung otomatis berdasarkan checklist kelengkapan dokumen dan data.

| Komponen | Bobot | Kriteria | Poin |
| - | - | - | - |
| **Data Perusahaan** | 20% | Nama perusahaan, alamat, kota, negara terisi lengkap | 0–20 |
| **Kontak Person** | 10% | Nama kontak, email, dan telepon valid | 0–10 |
| **NPWP / Tax ID** | 10% | NPWP terisi dan terverifikasi | 0–10 |
| **Rekening Bank** | 10% | Nama bank dan nomor rekening terisi | 0–10 |
| **Dokumen Legalitas** | 15% | Kontrak kerjasama, sertifikat halal, BPOM (jika relevan) | 0–15 |
| **Katalog Produk** | 10% | Minimal 1 produk dengan harga terupdate | 0–10 |
| **Termin Pembayaran** | 5% | Payment terms sudah disepakati | 0–5 |
| **Riwayat Transaksi** | 10% | Minimal 1 PO selesai tanpa masalah | 0–10 |
| **Evaluasi Performa** | 10% | Rating >= 3.5 dari evaluasi terakhir | 0–10 |
| **TOTAL** | **100%** | — | **0–100** |

### Interpretasi `validation_score`

| Range | Status | Tindakan |
| - | - | - |
| **80–100** | Tervalidasi Lengkap | Supplier layak untuk PO bernilai tinggi |
| **60–79** | Cukup Lengkap | Boleh bertransaksi, lengkapi dokumen dalam 30 hari |
| **40–59** | Kurang Lengkap | Batasi nilai PO, percepat proses validasi |
| **20–39** | Belum Lengkap | Wajib melengkapi data sebelum PO baru |
| **0–19** | Kritis | Tangguhkan transaksi, evaluasi ulang kelayakan supplier |

### Formula Perhitungan

```
validation_score = (data_perusahaan × 0.20)
                 + (kontak × 0.10)
                 + (npwp × 0.10)
                 + (rekening × 0.10)
                 + (dokumen × 0.15)
                 + (katalog × 0.10)
                 + (payment_terms × 0.05)
                 + (riwayat × 0.10)
                 + (performa × 0.10)
```

Setiap komponen dinilai 0–100 kemudian dikalikan bobotnya. Timestamp perhitungan terakhir disimpan di field `last_validated_at`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.