> ## 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.

# Haccp

<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: "HACCP Verification"
description: "Sistem keamanan pangan HACCP: 4 Critical Control Points, monitoring harian, deviation management, quality check, traceability lot/batch, dan audit trail terintegrasi."
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

# HACCP Verification

<img src="https://mintcdn.com/quinnofspicy/ny1xnfpEa_OBdv6T/docs/mintlify/screenshots/manufacturing/haccp-verification.png?fit=max&auto=format&n=ny1xnfpEa_OBdv6T&q=85&s=5bc27ad76a10ba7b0ed82afe39657706" alt="HACCP Verification" width="1920" height="1080" data-path="docs/mintlify/screenshots/manufacturing/haccp-verification.png" />

HACCP (Hazard Analysis Critical Control Point) adalah sistem manajemen keamanan pangan yang mengidentifikasi, mengevaluasi, dan mengendalikan bahaya pada setiap titik kritis dalam proses produksi. Quinn of Spicy menerapkan **4 Critical Control Points (CCP)** yang dimonitor setiap hari — dari penerimaan bahan baku hingga packaging. Setiap penyimpangan (deviasi) tercatat, ditindaklanjuti dengan corrective action, dan diaudit secara berkala.

Sistem HACCP Quinn of Spicy terintegrasi penuh dengan modul **Manufacturing**, **Inventory**, **Quality Check**, dan **Lot/Batch Traceability** melalui entitas `HACCPVerification`, `QualityCheck`, `QualityCase`, `ProductionOrder`, `LotBatch`, dan `StockMovement`. Setiap batch produksi memiliki digital audit trail yang lengkap — dari bahan baku masuk hingga produk jadi dilepas ke inventory.

***

## Arsitektur HACCP System

```mermaid theme={null}
graph TB
    subgraph "7 Prinsip HACCP"
        P1[1. Hazard Analysis<br/>Identifikasi Bahaya]
        P2[2. Critical Control Points<br/>Titik Kendali Kritis]
        P3[3. Critical Limits<br/>Batas Kritis]
        P4[4. Monitoring<br/>Prosedur Pemantauan]
        P5[5. Corrective Actions<br/>Tindakan Korektif]
        P6[6. Verification<br/>Prosedur Verifikasi]
        P7[7. Record Keeping<br/>Pencatatan]
    end

    subgraph "4 CCP Quinn of Spicy"
        CCP1[CCP 1: Penerimaan<br/>Bahan Baku]
        CCP2[CCP 2: Pemasakan]
        CCP3[CCP 3: Cooling]
        CCP4[CCP 4: Packaging]
    end

    subgraph "Operasional"
        DM[Deviation Management<br/>Penyimpangan & Koreksi]
        AUD[Audit<br/>Internal & Eksternal]
        TRN[Training<br/>Sertifikasi Staff]
    end

    P1 --> P2 --> P3 --> P4 --> P5 --> P6 --> P7
    P2 --> CCP1 & CCP2 & CCP3 & CCP4
    CCP1 & CCP2 & CCP3 & CCP4 --> DM
    DM --> AUD
    TRN --> CCP1 & CCP2 & CCP3 & CCP4
```

### Integrasi Sistem HACCP dengan Modul ERP

```mermaid theme={null}
graph LR
    subgraph "Penerimaan Bahan Baku"
        PO[Purchase Order] --> QC[QualityCheck<br/>Inspeksi QC]
        QC --> RM[RawMaterial<br/>Stok Bahan Baku]
    end

    subgraph "Produksi"
        RM --> PROD[ProductionOrder<br/>Perintah Produksi]
        PROD --> HACCP[HACCPVerification<br/>Verifikasi CCP]
        HACCP --> LB[LotBatch<br/>Lot/Batch Output]
    end

    subgraph "Quality & Compliance"
        LB --> QCASE[QualityCase<br/>Penanganan Non-Conformance]
        QCASE --> INV[Inventory<br/>Stok Produk Jadi]
        INV --> SM[StockMovement<br/>Traceability]
    end

    subgraph "Monitoring"
        SM --> ALERT[StockAlert<br/>Peringatan Stok]
        HACCP --> ALERT
        QC --> ALERT
    end
```

***

## 4 Critical Control Points (CCP)

### CCP 1: Penerimaan Bahan Baku

| Aspek | Detail |
| - | - |
| **Bahaya** | Bahan baku terkontaminasi bakteri, kimia, atau fisik |
| **Critical Limit** | Suhu bahan dingin \< 5 derajat C, bahan beku \< -18 derajat C |
| **Monitoring** | Check suhu dengan thermometer saat penerimaan |
| **Frekuensi** | Setiap kedatangan bahan baku |
| **PIC** | Inventory / Receiver |
| **Corrective Action** | Reject jika suhu tidak sesuai, return ke supplier |
| **Record** | Suhu tercatat, foto thermometer, tanda terima |
| **Entitas ERP** | `QualityCheck` (inspeksi), `LotBatch` (pencatatan lot bahan baku), `RawMaterial` (master bahan) |

```mermaid theme={null}
flowchart LR
    A[Bahan Baku Tiba] --> B[Check Suhu<br/>Thermometer]
    B --> C{Suhu Sesuai?}
    C -->|Dingin < 5 derajat C| D[Accept<br/>Catat di Log]
    C -->|Beku < -18 derajat C| D
    C -->|Tidak Sesuai| E[Reject<br/>Return ke Supplier]
    D --> F[Masuk Cold Storage]
```

**Alur ERP saat penerimaan bahan baku:**

1. Supplier mengirim bahan baku beserta surat jalan
2. Receiver membuat record `QualityCheck` dengan nomor otomatis `QC-YYYYMMDD-XXX`
3. Inspector melakukan pemeriksaan: suhu, kelembaban, visual, aroma, tekstur, cek tanggal expired
4. Jika **approved** — kuantitas yang disetujui masuk ke `LotBatch` (item\_type: `raw_material`) dan stok `RawMaterial` bertambah
5. Jika **rejected** — bahan dikembalikan ke supplier, `QualityCheck.overall_status` = `rejected`
6. Jika **conditional** — sebagian diterima, sebagian ditolak; catat `approved_quantity` dan `rejected_quantity`

### CCP 2: Proses Pemasakan

| Aspek | Detail |
| - | - |
| **Bahaya** | Bakteri patogen (Salmonella, E. coli) tidak mati |
| **Critical Limit** | Suhu internal produk > 75 derajat C selama minimal 15 detik |
| **Monitoring** | Check suhu internal setiap batch dengan food thermometer |
| **Frekuensi** | Setiap batch produksi |
| **PIC** | Production Staff |
| **Corrective Action** | Lanjutkan memasak sampai suhu tercapai |
| **Record** | Suhu internal, waktu, batch number |
| **Entitas ERP** | `HACCPVerification` (verifikasi CCP), `ProductionOrder` (perintah produksi) |

```mermaid theme={null}
flowchart LR
    A[Proses Memasak] --> B[Check Suhu Internal<br/>Food Thermometer]
    B --> C{Suhu > 75 derajat C?}
    C -->|Ya| D[Pass<br/>Lanjut ke Cooling]
    C -->|Tidak| E[Continue Cooking]
    E --> F[Tunggu 5 menit]
    F --> B
    D --> G[Catat di Log:<br/>Suhu, Waktu, Batch]
```

**Alur ERP saat proses produksi:**

1. `ProductionOrder` dibuat dengan status `planned`, merujuk ke BOM (Bill of Materials)
2. Produksi dimulai — status berubah menjadi `in_progress`, `production_start_time` tercatat
3. Operator mengisi `HACCPVerification`: suhu proses (`temperature_c`), target suhu (`target_temperature_c`), checklist HACCP digital
4. Sistem otomatis menilai `temperature_ok` (apakah suhu tercapai sesuai target)
5. Durasi produksi dihitung otomatis (`duration_minutes`) dan dibandingkan dengan `standard_time_minutes` untuk menentukan `efficiency_status`
6. Bahan baku yang digunakan dicatat di `raw_materials_used` beserta `inventory_batch_id` untuk traceability penuh

### CCP 3: Cooling (Pendinginan)

| Aspek | Detail |
| - | - |
| **Bahaya** | Pertumbuhan bakteri selama pendinginan (danger zone 5-60 derajat C) |
| **Critical Limit** | Cooling dari 60 derajat C ke 20 derajat C dalam **maksimal 2 jam** |
| **Monitoring** | Record suhu setiap 30 menit selama cooling |
| **Frekuensi** | Setiap batch, setiap 30 menit |
| **PIC** | Production Staff |
| **Corrective Action** | Reheat jika terlalu lambat, dispose jika sudah > 4 jam di danger zone |
| **Record** | Suhu per 30 menit, waktu mulai & selesai cooling |
| **Entitas ERP** | `HACCPVerification` (checklist pendinginan), `ProductionOrder` (tracking durasi) |

```mermaid theme={null}
graph LR
    subgraph "Cooling Timeline (Max 2 jam)"
        T0[60 derajat C<br/>t=0] --> T30[45 derajat C<br/>t=30m]
        T30 --> T60[30 derajat C<br/>t=60m]
        T60 --> T90[22 derajat C<br/>t=90m]
        T90 --> T120[20 derajat C<br/>t=120m]
    end
```

### CCP 4: Packaging

| Aspek | Detail |
| - | - |
| **Bahaya** | Kontaminasi silang saat packaging, seal tidak rapat |
| **Critical Limit** | Seal integrity 100% — tidak ada kebocoran |
| **Monitoring** | Visual inspection setiap package + squeeze test sampling |
| **Frekuensi** | 100% visual, 10% squeeze test |
| **PIC** | Packaging Staff / QC |
| **Corrective Action** | Repack jika seal tidak sempurna |
| **Record** | Jumlah inspected, jumlah rejected, foto (jika ada) |
| **Entitas ERP** | `HACCPVerification` (qc\_result), `LotBatch` (lot produk jadi), `ProductionOrder` (quantity\_defected) |

***

## Monitoring Schedule

### Harian

| Waktu | Aktivitas | CCP | PIC |
| - | - | - | - |
| 06:00 | Check suhu bahan baku datang | CCP 1 | Receiver |
| 07:00 | Sanitasi area produksi | - | Production |
| 08:00 | Check suhu pemasakan batch 1 | CCP 2 | Production |
| 08:30-10:30 | Record cooling setiap 30 menit | CCP 3 | Production |
| 10:00 | Check suhu pemasakan batch 2 | CCP 2 | Production |
| 11:00 | Visual inspection packaging | CCP 4 | QC |
| 16:00 | Rekap monitoring harian | All | QC Manager |

### Mingguan

| Aktivitas | Detail |
| - | - |
| Review monitoring records | Cek kelengkapan dan keakuratan |
| Analisis trend suhu | Identifikasi anomali |
| Kalibrasi thermometer | Pastikan alat ukur akurat |
| Inspeksi sanitasi | Cek kebersihan area produksi |

### Bulanan

| Aktivitas | Detail |
| - | - |
| Full HACCP audit | Verifikasi semua CCP |
| Review corrective actions | Pastikan tindakan efektif |
| Update HACCP plan | Sesuaikan dengan perubahan proses |
| Training refresher | Refresh pengetahuan staff |

***

## Deviation Management

### Saat Terjadi Deviasi

```mermaid theme={null}
flowchart TD
    A[Deviasi Terdeteksi<br/>CCP tidak terpenuhi] --> B[Stop Process<br/>Jika Perlu]
    B --> C[Document Deviasi<br/>Catat detail]
    C --> D[Implement Corrective Action]
    D --> E{Action Efektif?}
    E -->|Ya| F[Verify & Resume]
    E -->|Tidak| G[Escalate ke Manager]
    G --> H[Alternative Action]
    H --> E
    F --> I[Review & Update<br/>Prosedur]
```

### Jenis Corrective Actions

| Deviasi | Corrective Action | Severity |
| - | - | - |
| Suhu bahan baku > 5 derajat C | Reject, return ke supplier | Tinggi |
| Suhu internal \< 75 derajat C | Lanjutkan memasak | Sedang |
| Cooling > 2 jam | Reheat atau dispose | Tinggi |
| Seal bocor | Repack | Rendah |
| Kontaminasi fisik | Dispose batch, investigasi sumber | Tinggi |
| Label salah | Stop, ganti label yang benar | Sedang |

### Penanganan Quality Case (Non-Conformance)

Ketika terjadi penyimpangan kualitas yang memerlukan investigasi lebih lanjut, sistem membuat record `QualityCase` yang terhubung langsung dengan `LotBatch` terkait. Batch yang bermasalah dapat dikarantina (quarantine) untuk mencegah penggunaan lebih lanjut.

**Alur Quality Case:**

1. Temuan kualitas dilaporkan — `QualityCase` dibuat dengan status `open`
2. Tim QC melakukan investigasi — status berubah menjadi `investigating`
3. Jika perlu hold batch — `hold_requested` = true, `LotBatch.status` berubah ke `quarantine`
4. Hold disetujui oleh supervisor — `hold_approved_by` dan `hold_approved_at` tercatat
5. Resolusi ditentukan (rework, dispose, atau release) — status `resolved`
6. Case ditutup — status `closed`, `resolution_notes` didokumentasikan

**Kategori alasan Quality Case:**

| Kategori | Deskripsi | Contoh |
| - | - | - |
| `contamination` | Kontaminasi mikrobiologi, kimia, atau fisik | Bakteri melebihi batas, benda asing ditemukan |
| `labeling_error` | Kesalahan pelabelan produk | Label salah varian, informasi nutrisi tidak sesuai |
| `expired` | Produk melewati masa kedaluwarsa | Batch ditemukan sudah expired di gudang |
| `customer_complaint` | Keluhan dari pelanggan | Rasa tidak konsisten, packaging rusak saat diterima |
| `packaging_defect` | Cacat pada kemasan | Seal bocor, botol retak, label terkelupas |
| `other` | Alasan lainnya | Deviasi proses lainnya yang memerlukan investigasi |

***

## Lot/Batch Traceability

### Konsep Traceability

Setiap batch produksi memiliki **genealogy lengkap** — dari bahan baku mana saja batch tersebut dibuat, siapa operator yang memproduksi, kapan diproduksi, dan apakah sudah diverifikasi HACCP. Traceability ini memungkinkan **recall cepat dan tepat** jika ditemukan masalah kualitas.

### Alur Traceability End-to-End

```mermaid theme={null}
graph TD
    subgraph "Penerimaan"
        SUP[Supplier] -->|Surat Jalan| QC_IN[QualityCheck<br/>Inspeksi Masuk]
        QC_IN -->|Approved| LB_RM[LotBatch<br/>Bahan Baku]
    end

    subgraph "Produksi"
        LB_RM -->|Konsumsi FIFO/FEFO| PO[ProductionOrder]
        PO -->|Verifikasi| HACCP[HACCPVerification]
        HACCP -->|Pass| LB_FG[LotBatch<br/>Produk Jadi]
    end

    subgraph "Distribution"
        LB_FG -->|Rilis QC| INV[Inventory]
        INV -->|StockMovement| SALE[Penjualan]
    end

    subgraph "Quality Hold"
        QC_CASE[QualityCase] -->|Quarantine| LB_HOLD[LotBatch<br/>Status: quarantine]
        LB_HOLD -->|Resolved| INV
    end
```

### Lot Genealogy (Silsilah Batch)

Setiap `LotBatch` output menyimpan referensi ke lot-lot input yang digunakan melalui field `input_lots`. Ini memungkinkan penelusuran:

* **Forward traceability**: Dari bahan baku ke produk jadi — "Bahan baku dari supplier X digunakan di batch produksi mana saja?"
* **Backward traceability**: Dari produk jadi ke bahan baku — "Produk jadi batch Y dibuat dari bahan baku dari supplier mana?"

Field `input_lots` pada `LotBatch` menyimpan:

* `lot_id` dan `lot_number` dari lot input
* `material_id` dan `material_name` dari bahan yang digunakan
* `quantity_used` — jumlah bahan yang dikonsumsi
* `allocation_strategy` — strategi alokasi (fifo, fefo, atau manual)
* `identity_snapshot` — snapshot identitas canonical bahan saat lot output dirilis

### Status Lot/Batch

| Status | Deskripsi | Tindakan yang Diizinkan |
| - | - | - |
| `active` | Lot aktif dan tersedia | Konsumsi, transfer |
| `released` | Lot sudah dirilis ke inventory setelah QC | Penjualan, distribusi |
| `quarantine` | Lot dikarantina (quality hold) | Tidak ada pergerakan stok |
| `expired` | Lot sudah kedaluwarsa | Dispose, penyesuaian stok |
| `depleted` | Stok lot sudah habis | Tidak ada tindakan |
| `recalled` | Lot ditarik kembali (recall) | Isolasi, investigasi |

### Expiry Alert Status

| Status | Kondisi | Tindakan |
| - | - | - |
| `normal` | Masih > 30 hari ke expiry | Tidak ada |
| `near_expiry` | H-30 hari ke expiry | Peringatan, percepat penjualan |
| `critical_expiry` | H-7 hari ke expiry | Alert tinggi, promo clearance |
| `expired` | Sudah melewati tanggal expired | Karantina, dispose |

***

## HACCP Records

### Required Records

| Record | Isi | Retensi | Entitas ERP |
| - | - | - | - |
| **CCP Monitoring Records** | Suhu, waktu, batch, PIC | Min 2 tahun | `HACCPVerification` |
| **Corrective Action Records** | Deviasi, tindakan, hasil | Min 2 tahun | `QualityCase`, `HACCPVerification.notes` |
| **Verification Records** | Hasil audit internal/eksternal | Min 2 tahun | `HACCPVerification.status` |
| **Training Records** | Jadwal, materi, peserta, hasil | Min 2 tahun | - |
| **Equipment Calibration** | Thermometer, timbangan, seal | Min 2 tahun | - |
| **Supplier Certificates** | Halal, BPOM, surat jalan | Min 2 tahun | `QualityCheck.delivery_note_number` |
| **Lot Traceability** | Genealogy bahan baku ke produk jadi | Min 2 tahun | `LotBatch.input_lots`, `StockMovement.lot_id` |

### Record Retention Policy

| Aspek | Kebijakan |
| - | - |
| **Retensi minimum** | 2 tahun |
| **Aksesibilitas** | Harus bisa ditampilkan saat audit |
| **Penyimpanan** | Digital (sistem) + backup |
| **Keamanan** | Tidak bisa dihapus/diubah (audit trail) |
| **Foto dokumentasi** | Disimpan sebagai URL di field `photos` / `evidence_urls` |

***

## Verification

### Internal Verification

| Aktivitas | Frekuensi | PIC |
| - | - | - |
| CCP monitoring audit | Mingguan | QC Manager |
| Record review | Mingguan | QC Manager |
| Procedure validation | Bulanan | Production Manager |
| Full internal audit | Kuartalan | Tim Internal |

### External Verification

| Jenis | Frekuensi | Oleh |
| - | - | - |
| **Third-party audit** | Tahunan | Lembaga sertifikasi |
| **Surveillance audit** | 6 bulan | Lembaga sertifikasi |
| **Customer audit** | Insidental | Pelanggan B2B |
| **Regulatory inspection** | Insidental | BPOM / Dinas Kesehatan |

***

## Training

### Program Training

| Training | Target | Frekuensi | Durasi |
| - | - | - | - |
| **HACCP Dasar** | Semua staff produksi | Awal kerja | 8 jam |
| **CCP-specific** | Staff yang menangani CCP | Awal + refresher | 4 jam |
| **Refresher** | Semua staff produksi | Tahunan | 4 jam |
| **Update training** | Saat ada perubahan prosedur | Insidental | 2 jam |
| **Internal auditor** | QC staff | Saat ditunjuk | 16 jam |

### Training Records

| Field | Deskripsi |
| - | - |
| **Tanggal** | Tanggal training |
| **Trainer** | Nama trainer (internal/eksternal) |
| **Peserta** | Daftar nama peserta |
| **Materi** | Topik yang dibahas |
| **Durasi** | Lama training |
| **Hasil Assessment** | Lulus / Tidak lulus |
| **Sertifikat** | Nomor sertifikat (jika ada) |

***

## Certification

| Tahap | Detail |
| - | - |
| **Initial Certification** | Audit awal oleh lembaga sertifikasi |
| **Surveillance** | Audit berkala (6 bulan) untuk mempertahankan |
| **Re-certification** | Setiap 3 tahun |
| **Continuous Improvement** | Bukti perbaikan berkelanjutan |

***

## Best Practices

### Dokumentasi

| Aturan | Alasan |
| - | - |
| **Document everything** | Audit membutuhkan bukti tertulis |
| **Gunakan form standar** | Konsistensi dan kemudahan review |
| **Simpan record terorganisir** | Mudah ditemukan saat audit |
| **Backup digital** | Cegah kehilangan data |

### Continuous Improvement

| Langkah | Detail |
| - | - |
| **Review insiden** | Setiap deviasi dianalisis root cause-nya |
| **Update prosedur** | Sesuaikan dengan temuan |
| **Benchmark** | Bandingkan dengan best practice industri |
| **Investasi alat** | Upgrade thermometer, seal machine, dll |

***

## Entity Relationship Diagram

Berikut adalah diagram relasi antar entitas yang membentuk sistem HACCP secara menyeluruh:

```mermaid theme={null}
erDiagram
    BillOfMaterials ||--o{ ProductionOrder : "menghasilkan"
    ProductionOrder ||--o| HACCPVerification : "diverifikasi oleh"
    ProductionOrder ||--o{ LotBatch : "output lot"
    ProductionOrder ||--o| HPPCalculation : "perhitungan biaya"
    ProductionOrder }o--|| LotBatch : "input lot konsumsi"

    HACCPVerification }o--|| ProductionOrder : "referensi produksi"
    HACCPVerification {
        string company_id
        string haccp_number PK
        string production_order_id FK
        string production_batch_id
        string product_id FK
        string product_name
        string variant
        number quantity_produced
        string operator_id FK
        string operator_name
        string supervisor_id FK
        string supervisor_name
        datetime start_time
        datetime end_time
        number duration_minutes
        number standard_time_minutes
        string efficiency_status
        number temperature_c
        number target_temperature_c
        boolean temperature_ok
        number pressure_bar
        array checklist
        array raw_materials_used
        string qc_result
        string qc_notes
        string status
        array photos
        string notes
    }

    QualityCheck {
        string company_id
        string qc_number PK
        string purchase_order_id FK
        string po_number
        string supplier_id FK
        string supplier_name
        string raw_material_id FK
        string raw_material_name
        string batch_id
        number quantity_received
        string unit
        date qc_date
        string qc_time
        string inspector_id FK
        string inspector_name
        array checklist
        string overall_status
        string rejection_reason
        array photos
        number temperature
        number humidity
        string expiry_date_check
        number approved_quantity
        number rejected_quantity
        boolean inventory_updated
        number claimed_quantity
        number weighed_quantity
        number delivery_variance
        string delivery_note_number
        string proof_attachment_url
        number unit_cost
        string notes
    }

    QualityCase {
        string company_id
        string lot_batch_id FK
        string product_name
        string batch_number
        string reason
        string description
        array evidence_urls
        string reported_by
        datetime reported_at
        string status
        string assigned_to
        string resolution_notes
        datetime resolved_at
        boolean hold_requested
        string hold_approved_by
        datetime hold_approved_at
    }

    ProductionOrder {
        string company_id
        string po_number
        string production_batch_id
        string bom_id FK
        string product_id FK
        string product_sku
        string product_type
        string product_name
        string variant
        string category_key
        string category_name
        string variant_key
        string variant_name
        string variant_label
        number size_grams
        string base_product_key
        number quantity_to_produce
        string priority
        date production_start_date
        datetime production_start_time
        date expected_completion_date
        date actual_completion_date
        datetime production_end_time
        number duration_minutes
        number standard_time_minutes
        string efficiency_status
        number quantity_produced
        number quantity_defected
        number fail_rate
        string operator_id FK
        string operator_name
        string supervisor_id FK
        string supervisor_name
        array raw_materials_used
        boolean haccp_verified
        string haccp_verification_id FK
        string qc_result
        string status
        string assigned_to
        string production_tier
        array input_lot_ids
        string output_lot_id
        string wip_status
        string manual_form_number
        string manual_form_attachment_url
        string manual_form_notes
        string location_id
        string location_name
        string cancellation_reason
        string hold_reason
        datetime hold_started_at
        datetime hold_ended_at
        string hold_by
        string resumed_by
        array returned_materials
        number total_material_cost
        number direct_raw_material_cost
        number semi_finished_cost
        number packaging_cost
        number direct_labor_cost
        number overhead_cost
        number byproduct_credit
        number total_batch_cost
        number allocated_cost_to_good
        number abnormal_loss_amount
        number unit_hpp
        number rounding_residual
        string cost_status
        boolean has_incomplete_cost_input
        number mass_yield_percentage
        number productivity_ratio
        string productivity_label
        object cost_snapshot
        string notes
    }

    LotBatch {
        string company_id
        string lot_number PK
        string product_id FK
        string product_name
        string product_sku
        string product_type
        string identity_status
        string source_material_id
        string category_key
        string category_name
        string variant_key
        string variant_name
        string variant_label
        number size_grams
        string base_product_key
        string production_order_id FK
        number quantity
        number quantity_remaining
        number current_quantity
        number reserved_quantity
        date manufacture_date
        date expiry_date
        string location_id FK
        string location_name
        number cost_per_unit
        string status
        string quality_status
        string notes
        string warehouse_location_name
        string rack_location
        string expiry_alert_status
        boolean haccp_verified
        string item_type
        array input_lots
        string supplier_id FK
        string supplier_name
        string purchase_order_id FK
        string delivery_note_number
        string unit
        datetime received_at
        number claimed_quantity
        number weighed_quantity
        number accepted_quantity
        number rejected_quantity
        string cost_status
        number rounding_residual
        object cost_snapshot
    }

    BillOfMaterials {
        string company_id
        string product_id FK
        string product_sku
        string product_type
        string product_name
        string category_key
        string category_name
        string variant_key
        string variant_name
        string variant_label
        number size_grams
        string base_product_key
        string bom_version
        array raw_materials
        number total_material_cost
        boolean is_active
        date effective_date
        string output_type
        boolean is_locked
        string parent_bom_id
        number yield_expected_percentage
        array packaging_materials
        number base_quantity
        string base_unit
        string status
        string version
        object qc_sop_parameters
        string notes
    }

    HPPCalculation {
        string company_id
        string product_id FK
        string product_name
        string calculation_method
        date period_start
        date period_end
        array raw_materials
        array direct_labor_costs
        array overhead_costs
        number total_raw_materials
        number total_direct_labor
        number total_overhead
        number total_production_cost
        number units_produced
        number hpp_per_unit
        number profit_margin_percentage
        number suggested_selling_price
        string production_order_id FK
        string production_batch_id
        string cost_status
        string notes
    }

    Training {
        string company_id
        string training_name
        string training_type
        string category
        string description
        string trainer
        datetime start_date
        datetime end_date
        number duration_hours
        string location
        number max_participants
        array participants
        number cost_per_person
        number total_cost
        string budget_code
        array materials
        string status
        object evaluation
    }
```

***

## Entity Schema Tables

### HACCPVerification

Entitas utama untuk pencatatan verifikasi HACCP pada setiap sesi produksi. Setiap record merepresentasikan satu kali verifikasi CCP yang dilakukan operator terhadap batch produksi.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan (multi-tenant) |
| `haccp_number` | string | Ya | Nomor HACCP unik, digenerate otomatis dengan format HACCP-YYYYMMDD-XXX |
| `production_order_id` | string | Ya | ID Production Order yang sedang diverifikasi |
| `production_batch_id` | string | Tidak | Batch ID produksi dengan format PROD-YYYYMMDD-XXX |
| `product_id` | string | Ya | ID produk yang sedang diproduksi |
| `product_name` | string | Tidak | Nama produk yang diproduksi |
| `variant` | string | Tidak | Varian produk (Pedas, Manis, Gurih, dll) |
| `quantity_produced` | number | Tidak | Jumlah quantity yang berhasil diproduksi |
| `operator_id` | string | Ya | ID user operator produksi yang melakukan verifikasi |
| `operator_name` | string | Tidak | Nama lengkap operator produksi |
| `supervisor_id` | string | Tidak | ID user supervisor (opsional, untuk eskalasi) |
| `supervisor_name` | string | Tidak | Nama lengkap supervisor |
| `start_time` | datetime | Ya | Waktu mulai sesi produksi |
| `end_time` | datetime | Tidak | Waktu selesai sesi produksi |
| `duration_minutes` | number | Tidak | Durasi produksi dalam menit (dihitung otomatis: end - start) |
| `standard_time_minutes` | number | Tidak | Standard time yang ditetapkan untuk produk ini |
| `efficiency_status` | enum | Tidak | Status efisiensi produksi: efficient, normal, atau inefficient (jika >120% standard) |
| `temperature_c` | number | Tidak | Suhu proses aktual yang terukur (°C) |
| `target_temperature_c` | number | Tidak | Target suhu proses yang harus dicapai (°C) |
| `temperature_ok` | boolean | Tidak | Indikator apakah suhu tercapai sesuai target |
| `pressure_bar` | number | Tidak | Tekanan proses yang terukur (bar, opsional) |
| `checklist` | array | Tidak | Checklist HACCP digital berisi item pemeriksaan (sanitasi, APD, bahan baku, dll) |
| `raw_materials_used` | array | Tidak | Daftar bahan baku yang digunakan untuk traceability/backtracking |
| `qc_result` | enum | Tidak | Hasil QC produk jadi: pass, fail, pending, atau rework |
| `qc_notes` | string | Tidak | Catatan tambahan terkait hasil QC |
| `status` | enum | Tidak | Status verifikasi HACCP: in\_progress, verified, failed, atau rework |
| `photos` | array | Tidak | Daftar URL foto dokumentasi proses produksi |
| `notes` | string | Tidak | Catatan umum terkait verifikasi |

### QualityCheck

Entitas untuk pencatatan pemeriksaan kualitas bahan baku yang diterima dari supplier. Mencakup inspeksi visual, suhu, kelembaban, dan kesesuaian quantity.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan (multi-tenant) |
| `qc_number` | string | Ya | Nomor QC unik, digenerate otomatis dengan format QC-YYYYMMDD-XXX |
| `purchase_order_id` | string | Tidak | ID Purchase Order terkait |
| `po_number` | string | Tidak | Nomor Purchase Order |
| `supplier_id` | string | Ya | ID supplier pemasok bahan baku |
| `supplier_name` | string | Tidak | Nama supplier pemasok |
| `raw_material_id` | string | Ya | ID bahan baku yang diperiksa |
| `raw_material_name` | string | Tidak | Nama bahan baku yang diperiksa |
| `batch_id` | string | Tidak | Batch ID bahan baku yang diterima |
| `quantity_received` | number | Tidak | Jumlah bahan baku yang diterima |
| `unit` | string | Tidak | Satuan quantity (kg, gr, pcs, liter) |
| `qc_date` | date | Ya | Tanggal pengecekan QC dilakukan |
| `qc_time` | string | Tidak | Waktu pengecekan QC dilakukan |
| `inspector_id` | string | Tidak | ID user QC inspector yang melakukan pemeriksaan |
| `inspector_name` | string | Tidak | Nama lengkap QC inspector |
| `checklist` | array | Tidak | Checklist digital pengecekan kualitas (Visual, Aroma, Tekstur, Suhu, Kebersihan) |
| `overall_status` | enum | Tidak | Status keseluruhan QC: pending, approved, rejected, atau conditional |
| `rejection_reason` | string | Tidak | Alasan penolakan jika status rejected |
| `photos` | array | Tidak | Daftar URL foto dokumentasi QC |
| `temperature` | number | Tidak | Suhu bahan saat diterima (°C) |
| `humidity` | number | Tidak | Kelembaban udara saat penerimaan (%) |
| `expiry_date_check` | enum | Tidak | Hasil cek tanggal expired: valid, expired, near\_expiry, atau no\_date |
| `approved_quantity` | number | Tidak | Jumlah yang disetujui masuk inventory (default: 0) |
| `rejected_quantity` | number | Tidak | Jumlah yang ditolak dan tidak masuk inventory (default: 0) |
| `inventory_updated` | boolean | Tidak | Indikator apakah stok sudah masuk inventory (hanya jika approved) |
| `claimed_quantity` | number | Tidak | Kuantitas/berat menurut surat jalan supplier (RCV-01) |
| `weighed_quantity` | number | Tidak | Kuantitas/berat hasil timbang ulang fisik di gudang (RCV-01) |
| `delivery_variance` | number | Tidak | Selisih kuantitas kiriman: claimed - weighed (RCV-02) |
| `delivery_note_number` | string | Tidak | Nomor surat jalan / delivery note dari supplier |
| `proof_attachment_url` | string | Tidak | URL lampiran foto surat jalan atau fisik barang |
| `unit_cost` | number | Tidak | Estimasi biaya per unit / HPP bahan baku (default: 0) |
| `notes` | string | Tidak | Catatan tambahan terkait pemeriksaan QC |

### QualityCase

Entitas untuk manajemen kasus kualitas (quality hold/quarantine). Digunakan saat ditemukan masalah pada batch yang perlu diinvestigasi dan dikarantina.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan pemilik quality case |
| `lot_batch_id` | string | Ya | ID LotBatch yang menjadi objek quality case / hold |
| `product_name` | string | Tidak | Nama produk lot yang ditahan (snapshot saat case dibuka) |
| `batch_number` | string | Tidak | Nomor lot/batch fisik (snapshot saat case dibuka) |
| `reason` | enum | Tidak | Kategori alasan penahanan batch: contamination, labeling\_error, expired, customer\_complaint, packaging\_defect, atau other |
| `description` | string | Tidak | Deskripsi rinci temuan kualitas |
| `evidence_urls` | array | Tidak | Daftar URL bukti foto/dokumen temuan kualitas |
| `reported_by` | string | Ya | Email/ID user yang melaporkan quality case |
| `reported_at` | datetime | Ya | Waktu quality case dilaporkan |
| `status` | enum | Tidak | Status alur penanganan: open, investigating, on\_hold, resolved, atau closed |
| `assigned_to` | string | Tidak | User/tim yang ditugaskan menangani case |
| `resolution_notes` | string | Tidak | Catatan resolusi saat hold dilepas / case ditutup |
| `resolved_at` | datetime | Tidak | Waktu quality case diselesaikan |
| `hold_requested` | boolean | Tidak | Indikator apakah penahanan (quarantine) lot diminta untuk case ini |
| `hold_approved_by` | string | Tidak | Email/ID user yang menyetujui hold |
| `hold_approved_at` | datetime | Tidak | Waktu hold disetujui dan lot dikarantina |

### ProductionOrder

Entitas perintah produksi yang menjadi pusat orchestration proses manufaktur. Terintegrasi langsung dengan verifikasi HACCP dan perhitungan HPP.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan |
| `po_number` | string | Tidak | Nomor Perintah Produksi |
| `production_batch_id` | string | Tidak | Batch ID unik produksi (PROD-YYYYMMDD-XXX) |
| `bom_id` | string | Ya | ID Bill of Materials yang digunakan |
| `product_id` | string | Tidak | ID produk jadi yang akan diproduksi |
| `product_sku` | string | Tidak | SKU master output yang dipilih dari BOM |
| `product_type` | string | Tidak | Jenis produk output dari master/BOM |
| `product_name` | string | Tidak | Nama produk yang akan diproduksi |
| `variant` | string | Tidak | Varian legacy; gunakan variant\_key/variant\_name untuk data canonical |
| `category_key` | string | Tidak | Kunci kategori produk canonical |
| `category_name` | string | Tidak | Nama kategori produk |
| `variant_key` | string | Tidak | Kunci varian produk canonical |
| `variant_name` | string | Tidak | Nama varian produk canonical |
| `variant_label` | string | Tidak | Label varian yang ditampilkan |
| `size_grams` | number | Tidak | Ukuran produk dalam gram |
| `base_product_key` | string | Tidak | Kunci produk dasar canonical |
| `quantity_to_produce` | number | Ya | Jumlah unit yang akan diproduksi |
| `priority` | enum | Tidak | Prioritas produksi: low, normal, high, atau urgent |
| `production_start_date` | date | Ya | Tanggal mulai produksi yang direncanakan |
| `production_start_time` | datetime | Tidak | Waktu mulai aktual produksi |
| `start_idempotency_key` | string | Tidak | Kunci retry start produksi yang dicatat server |
| `start_request_fingerprint` | string | Tidak | Fingerprint payload start untuk menolak retry dengan payload berbeda |
| `expected_completion_date` | date | Tidak | Tanggal penyelesaian yang direncanakan |
| `actual_completion_date` | date | Tidak | Tanggal penyelesaian aktual |
| `production_end_time` | datetime | Tidak | Waktu selesai aktual produksi |
| `duration_minutes` | number | Tidak | Durasi produksi aktual dalam menit (dihitung otomatis: end - start) |
| `standard_time_minutes` | number | Tidak | Standard time untuk produk ini (untuk analisa efisiensi) |
| `efficiency_status` | enum | Tidak | Status efisiensi: efficient, normal, atau inefficient (jika >120% standard) |
| `quantity_produced` | number | Tidak | Jumlah unit yang berhasil diproduksi (default: 0) |
| `quantity_defected` | number | Tidak | Jumlah unit yang cacat/defect (default: 0) |
| `fail_rate` | number | Tidak | Persentase fail (quantity\_defected / quantity\_produced × 100) |
| `consumption_posting_started_at` | datetime | Tidak | Server timestamp claim sebelum posting konsumsi stok dimulai |
| `consumption_posting_idempotency_key` | string | Tidak | Idempotency key server untuk klaim posting konsumsi produksi |
| `consumption_posting_batch_id` | string | Tidak | Batch ID yang diklaim untuk posting konsumsi produksi |
| `operator_id` | string | Tidak | ID user operator produksi |
| `operator_name` | string | Tidak | Nama lengkap operator produksi |
| `supervisor_id` | string | Tidak | ID user supervisor (opsional) |
| `supervisor_name` | string | Tidak | Nama lengkap supervisor |
| `raw_materials_used` | array | Tidak | Daftar bahan baku yang digunakan (untuk traceability/backtracking) |
| `qc_release_started_at` | datetime | Tidak | Server timestamp claim sebelum mutasi rilis QC dimulai |
| `qc_release_idempotency_key` | string | Tidak | Idempotency key server untuk klaim rilis QC |
| `qc_release_request_fingerprint` | string | Tidak | Fingerprint payload rilis QC yang diklaim server |
| `haccp_verified` | boolean | Tidak | Indikator apakah HACCP sudah diverifikasi (default: false) |
| `haccp_verification_id` | string | Tidak | ID HACCPVerification terkait |
| `qc_result` | enum | Tidak | Hasil QC produk jadi: pass, fail, pending, atau rework |
| `status` | enum | Tidak | Status production order: planned, in\_progress, completed, on\_hold, atau cancelled |
| `assigned_to` | string | Tidak | User/tim yang ditugaskan memproduksi |
| `production_tier` | enum | Tidak | Tingkat proses produksi: primary\_semi\_finished atau final\_finished\_good (MFG-01) |
| `input_lot_ids` | array | Tidak | Daftar LotBatch input yang dikonsumsi batch ini (MFG-05) |
| `output_lot_id` | string | Tidak | ID LotBatch output hasil produksi ini |
| `completion_idempotency_key` | string | Tidak | Kunci retry completion produksi yang dicatat server |
| `cancellation_idempotency_key` | string | Tidak | Kunci retry pembatalan produksi yang dicatat server |
| `cancellation_request_fingerprint` | string | Tidak | Fingerprint payload pembatalan untuk menolak retry berbeda |
| `qc_release_idempotency_key` | string | Tidak | Kunci retry rilis QC yang dicatat server |
| `qc_release_request_fingerprint` | string | Tidak | Fingerprint payload rilis QC untuk menolak retry berbeda |
| `materials_actual` | array | Tidak | Pencatatan konsumsi bahan riil versus rencana (MFG-03, MFG-04) |
| `wip_status` | enum | Tidak | Status Work In Process: draft, in\_wip, transferred\_to\_fg, atau cancelled (MFG-06, MFG-07) |
| `manual_form_number` | string | Tidak | Nomor form manual fisik pencatatan dapur/produksi (MFG-08) |
| `manual_form_attachment_url` | string | Tidak | URL lampiran foto/scan form manual fisik (MFG-08) |
| `manual_form_notes` | string | Tidak | Catatan audit atau paraf form manual fisik (MFG-08) |
| `location_id` | string | Tidak | ID lokasi dapur/gudang produksi (MFG-03) |
| `location_name` | string | Tidak | Nama lokasi dapur/gudang produksi (MFG-03) |
| `cancellation_reason` | string | Tidak | Alasan pembatalan production order yang diaudit (MFG-07) |
| `hold_reason` | string | Tidak | Alasan penahanan order produksi saat status on\_hold (MFG-07) |
| `hold_started_at` | datetime | Tidak | Waktu mulai penahanan order produksi (MFG-07) |
| `hold_ended_at` | datetime | Tidak | Waktu penahanan berakhir saat order dilanjutkan kembali (MFG-07) |
| `hold_by` | string | Tidak | Nama user yang menahan order produksi (MFG-07) |
| `resumed_by` | string | Tidak | Nama user yang melanjutkan kembali order produksi (MFG-07) |
| `returned_materials` | array | Tidak | Pencatatan sisa bahan kembali ke stok vs waste/loss saat pembatalan (MFG-07) |
| `total_material_cost` | number | Tidak | Total biaya bahan baku, semi-finished, dan kemasan riil (CST-01) |
| `direct_raw_material_cost` | number | Tidak | Subtotal biaya bahan mentah direct materials (CST-01) |
| `semi_finished_cost` | number | Tidak | Subtotal biaya bahan intermediate/semi-finished goods (CST-01) |
| `packaging_cost` | number | Tidak | Subtotal biaya bahan kemasan (botol, segel, label) (CST-01) |
| `direct_labor_cost` | number | Tidak | Biaya tenaga kerja langsung batch (CST-01) |
| `overhead_cost` | number | Tidak | Biaya overhead pabrik teralokasi batch (CST-01) |
| `byproduct_credit` | number | Tidak | Nilai pengurang sisa / by-product (CST-02, default: 0) |
| `total_batch_cost` | number | Tidak | Total biaya aktual batch produksi (CST-02) |
| `allocated_cost_to_good` | number | Tidak | Biaya yang dialokasikan ke produk baik (CST-02) |
| `abnormal_loss_amount` | number | Tidak | Beban kerugian abnormal yang diexclude dari HPP produk baik (CST-02, default: 0) |
| `unit_hpp` | number | Tidak | HPP per unit produk baik (CST-02, CST-03) |
| `rounding_residual` | number | Tidak | Residual pembulatan alokasi biaya HPP (CST-05, default: 0) |
| `cost_status` | enum | Tidak | Status kelengkapan biaya dan HPP batch: complete, provisional\_incomplete, atau zero\_output\_pending (CST-03, CST-05) |
| `has_incomplete_cost_input` | boolean | Tidak | Flag apakah terdapat lot bahan yang belum memiliki harga tercatat (CST-05, default: false) |
| `mass_yield_percentage` | number | Tidak | Persentase rendemen massa sebanding output vs input (CST-04) |
| `productivity_ratio` | number | Tidak | Rasio produktivitas unit per kg (misal: botol per kg pasta) (CST-04) |
| `productivity_label` | string | Tidak | Label rasio produktivitas unit (misal: 4.00 botol/kg) (CST-04) |
| `cost_snapshot` | object | Tidak | Snapshot permanen komponen biaya, sumber harga per lot, metode alokasi, dan waktu finalisasi (CST-05) |
| `notes` | string | Tidak | Catatan tambahan terkait production order |

### LotBatch

Entitas untuk pelacakan lot/batch dalam rantai produksi dan inventory. Mendukung full traceability dari bahan baku hingga produk jadi.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan (multi-tenant) |
| `lot_number` | string | Ya | Nomor lot/batch unik |
| `product_id` | string | Ya | ID produk dalam lot ini |
| `product_name` | string | Tidak | Nama produk |
| `product_sku` | string | Tidak | SKU produk |
| `product_type` | string | Tidak | Jenis produk |
| `identity_status` | enum | Tidak | Status identitas canonical: linked atau legacy\_review |
| `source_material_id` | string | Tidak | ID bahan sumber |
| `category_key` | string | Tidak | Kunci kategori produk canonical |
| `category_name` | string | Tidak | Nama kategori produk |
| `variant_key` | string | Tidak | Kunci varian produk canonical |
| `variant_name` | string | Tidak | Nama varian produk canonical |
| `variant_label` | string | Tidak | Label varian yang ditampilkan |
| `size_grams` | number | Tidak | Ukuran produk dalam gram |
| `base_product_key` | string | Tidak | Kunci produk dasar canonical |
| `production_order_id` | string | Tidak | ID production order yang menghasilkan lot ini |
| `quantity` | number | Ya | Jumlah awal dalam lot ini |
| `quantity_remaining` | number | Tidak | Jumlah yang tersisa dari lot ini |
| `current_quantity` | number | Tidak | Kuantitas lot saat ini (cermin dari quantity\_remaining, ditulis oleh proses rilis QC) |
| `reserved_quantity` | number | Tidak | Jumlah yang direservasi oleh proses/alokasi lain (default: 0) |
| `manufacture_date` | date | Tidak | Tanggal produksi lot ini |
| `expiry_date` | date | Tidak | Tanggal kadaluarsa lot ini |
| `location_id` | string | Tidak | ID warehouse location penyimpanan |
| `location_name` | string | Tidak | Nama lokasi penyimpanan |
| `cost_per_unit` | number | Tidak | Biaya per unit untuk lot ini |
| `status` | enum | Tidak | Status lot: active, released, quarantine, expired, depleted, atau recalled |
| `quality_status` | enum | Tidak | Status kualitas: passed, failed, atau pending |
| `notes` | string | Tidak | Catatan tambahan terkait lot |
| `warehouse_location_name` | string | Tidak | Nama gudang penyimpanan |
| `rack_location` | string | Tidak | Lokasi rak penyimpanan (misal: A1, B2) |
| `expiry_alert_status` | enum | Tidak | Status peringatan kadaluarsa: normal, near\_expiry, critical\_expiry, atau expired (H-30, H-7, expired) |
| `haccp_verified` | boolean | Tidak | Indikator apakah batch sudah diverifikasi HACCP (default: false) |
| `item_type` | enum | Tidak | Tipe item lot dalam rantai produksi: finished\_good, semi\_finished, atau raw\_material (MFG-01) |
| `input_lots` | array | Tidak | Daftar lot bahan baku / intermediate yang menyuplai lot ini (MFG-05, many-to-many genealogy) |
| `supplier_id` | string | Tidak | ID supplier pemasok (LOT-01) |
| `supplier_name` | string | Tidak | Nama supplier pemasok |
| `purchase_order_id` | string | Tidak | ID Purchase Order asal penerimaan |
| `delivery_note_number` | string | Tidak | Nomor surat jalan supplier |
| `unit` | string | Tidak | Satuan bahan (kg, gr, pcs, liter) |
| `received_at` | datetime | Tidak | Waktu penerimaan fisik di gudang |
| `claimed_quantity` | number | Tidak | Kuantitas menurut surat jalan supplier |
| `weighed_quantity` | number | Tidak | Kuantitas timbang ulang aktual |
| `accepted_quantity` | number | Tidak | Kuantitas diterima lolos QC |
| `rejected_quantity` | number | Tidak | Kuantitas sortasi reject |
| `cost_status` | enum | Tidak | Status kelengkapan biaya modal lot batch: complete, provisional\_incomplete, atau unassigned (CST-05) |
| `rounding_residual` | number | Tidak | Residual pembulatan alokasi biaya HPP unit (CST-05, default: 0) |
| `cost_snapshot` | object | Tidak | Snapshot rincian komponen biaya pembentuk lot ini (CST-05) |

### BillOfMaterials

Entitas resep/formulasi produk yang mendefinisikan komposisi bahan baku, parameter QC SOP, dan material kemasan untuk setiap varian produk.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan |
| `product_id` | string | Ya | ID produk jadi yang didefinisikan resepnya |
| `product_sku` | string | Tidak | SKU master output |
| `product_type` | string | Tidak | Jenis produk output dari master |
| `product_name` | string | Tidak | Nama produk jadi |
| `category_key` | string | Tidak | Kategori output snapshot: kecil/besar/pouch/bundle |
| `category_name` | string | Tidak | Nama kategori output |
| `variant_key` | string | Tidak | Varian output snapshot: original/extra\_spicy/bundle |
| `variant_name` | string | Tidak | Nama varian output |
| `variant_label` | string | Tidak | Label varian yang ditampilkan |
| `size_grams` | number | Tidak | Ukuran produk dalam gram |
| `base_product_key` | string | Tidak | Kunci produk dasar canonical |
| `bom_version` | string | Tidak | Versi BOM untuk tracking perubahan |
| `raw_materials` | array | Ya | Daftar bahan baku yang dibutuhkan beserta quantity per unit |
| `total_material_cost` | number | Tidak | Total biaya bahan baku per unit produk |
| `is_active` | boolean | Tidak | Indikator apakah BOM masih aktif digunakan (default: true) |
| `effective_date` | date | Tidak | Tanggal berlaku BOM ini |
| `output_type` | enum | Tidak | Tipe output BOM: finished\_good atau semi\_finished (MFG-01) |
| `is_locked` | boolean | Tidak | Indikator apakah versi BOM sudah terkunci karena pernah digunakan berproduksi (MFG-02, default: false) |
| `parent_bom_id` | string | Tidak | ID versi BOM induk sebelum revisi/kloning |
| `yield_expected_percentage` | number | Tidak | Estimasi persentase rendemen output (MFG-02, default: 100) |
| `packaging_materials` | array | Tidak | Daftar kemasan dan bahan pendukung yang dibutuhkan (MFG-02) |
| `base_quantity` | number | Tidak | Basis kuantitas output resep (misal: 10 atau 100) (MFG-02, default: 1) |
| `base_unit` | string | Tidak | Satuan basis output resep (kg, pcs, pack, liter) (MFG-02, default: pcs) |
| `status` | enum | Tidak | Status siklus hidup resep BOM: draft, active, archived, atau obsolete (MFG-02) |
| `version` | string | Tidak | Versi BOM eksplisit (1.0, 1.1, dst) (MFG-02, default: 1.0) |
| `qc_sop_parameters` | object | Tidak | Snapshot additive parameter SOP untuk gate QC release (MFG-04): temperature\_min\_c, temperature\_max\_c, cooking\_time\_min\_minutes, pressure\_min\_bar |
| `notes` | string | Tidak | Catatan tambahan terkait BOM |

### HPPCalculation

Entitas perhitungan Harga Pokok Produksi (HPP) yang menghitung biaya produksi secara komprehensif mencakup bahan baku, tenaga kerja, dan overhead.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Tidak | ID perusahaan |
| `product_id` | string | Tidak | ID produk yang dihitung HPP-nya |
| `product_name` | string | Ya | Nama produk yang dihitung |
| `calculation_method` | enum | Tidak | Metode perhitungan: FIFO, LIFO, atau Average (default: Average) |
| `period_start` | date | Ya | Tanggal awal periode perhitungan |
| `period_end` | date | Ya | Tanggal akhir periode perhitungan |
| `raw_materials` | array | Tidak | Daftar bahan baku yang digunakan beserta biaya |
| `direct_labor_costs` | array | Tidak | Daftar biaya tenaga kerja langsung |
| `overhead_costs` | array | Tidak | Daftar biaya overhead (listrik, sewa, dll) |
| `total_raw_materials` | number | Tidak | Total biaya bahan baku |
| `total_direct_labor` | number | Tidak | Total biaya tenaga kerja langsung |
| `total_overhead` | number | Tidak | Total biaya overhead |
| `total_production_cost` | number | Tidak | Total biaya produksi keseluruhan |
| `units_produced` | number | Tidak | Jumlah unit yang diproduksi |
| `hpp_per_unit` | number | Tidak | HPP per unit produk |
| `profit_margin_percentage` | number | Tidak | Target profit margin dalam persentase |
| `suggested_selling_price` | number | Tidak | Harga jual yang disarankan berdasarkan HPP + margin |
| `production_order_id` | string | Tidak | ID ProductionOrder terkait (CST-06) |
| `production_batch_id` | string | Tidak | Batch ID produksi terkait (CST-06) |
| `cost_status` | enum | Tidak | Status kelengkapan biaya HPP: complete, provisional\_incomplete, atau zero\_output\_pending (CST-05) |
| `notes` | string | Tidak | Catatan tambahan terkait perhitungan |

### Training

Entitas pencatatan training dan pelatihan karyawan, termasuk training HACCP dan food safety.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan |
| `training_name` | string | Ya | Nama/judul training |
| `training_type` | enum | Tidak | Jenis training: internal, external, online, certification, atau workshop (default: internal) |
| `category` | string | Tidak | Kategori pelatihan (Technical, Soft Skills, Leadership, dll) |
| `description` | string | Tidak | Deskripsi materi training |
| `trainer` | string | Tidak | Nama trainer/instructor |
| `start_date` | datetime | Ya | Tanggal dan waktu mulai training |
| `end_date` | datetime | Ya | Tanggal dan waktu selesai training |
| `duration_hours` | number | Tidak | Durasi training dalam jam |
| `location` | string | Tidak | Lokasi pelaksanaan training |
| `max_participants` | number | Tidak | Jumlah maksimal peserta |
| `participants` | array | Tidak | Daftar peserta beserta status kehadiran, nilai, dan sertifikat |
| `cost_per_person` | number | Tidak | Biaya per peserta |
| `total_cost` | number | Tidak | Total biaya training |
| `budget_code` | string | Tidak | Kode anggaran training |
| `materials` | array | Tidak | Daftar materi training (judul dan URL file) |
| `status` | enum | Tidak | Status training: planned, ongoing, completed, atau cancelled |
| `evaluation` | object | Tidak | Hasil evaluasi training: average\_rating, feedback\_count, would\_recommend |

***

## HACCP Monitoring Lifecycle

Diagram state berikut menggambarkan siklus hidup monitoring HACCP dari perencanaan hingga resolusi:

```mermaid theme={null}
stateDiagram-v2
    [*] --> Planned : Production Order dibuat

    state "Planned" as Planned
    state "In Progress" as InProgress
    state "Monitoring CCP" as Monitoring
    state "Within Limits" as WithinLimits
    state "Deviation Detected" as Deviation
    state "Corrective Action" as CorrectiveAction
    state "Rework" as Rework
    state "Verified" as Verified
    state "Failed" as Failed
    state "QC Release" as QCRelease
    state "Lot Released" as LotReleased

    Planned --> InProgress : Operator mulai produksi
    InProgress --> Monitoring : Check CCP aktif
    Monitoring --> WithinLimits : Semua parameter sesuai critical limit
    Monitoring --> Deviation : Parameter melebihi critical limit

    WithinLimits --> Monitoring : Lanjut monitoring CCP berikutnya
    WithinLimits --> Verified : Semua CCP terpenuhi

    Deviation --> CorrectiveAction : Dokumentasi & tindakan korektif
    CorrectiveAction --> WithinLimits : Action efektif, lanjut produksi
    CorrectiveAction --> Rework : Perlu proses ulang
    CorrectiveAction --> Failed : Action tidak efektif, batch ditolak

    Rework --> Monitoring : Ulangi proses dari CCP terkait
    Rework --> Failed : Gagal rework

    Verified --> QCRelease : Submit hasil QC
    QCRelease --> LotReleased : QC pass, lot dirilis
    QCRelease --> Rework : QC fail, perlu rework
    QCRelease --> Failed : QC fail permanen

    Failed --> [*] : Batch di-scrap / dispose
    LotReleased --> [*] : Lot masuk inventory
```

***

## Sequence Diagrams

### 1. Pembuatan HACCP Plan & Verifikasi Produksi

```mermaid theme={null}
sequenceDiagram
    participant PM as Production Manager
    participant PO as ProductionOrder
    participant BOM as BillOfMaterials
    participant HACCP as HACCPVerification
    participant OP as Operator Produksi

    PM->>PO: Buat Production Order (pilih BOM, quantity, tanggal)
    PO->>BOM: Validasi BOM aktif & ambil raw_materials
    BOM-->>PO: Return daftar bahan + qc_sop_parameters
    PO->>PO: Set status = planned
    PO-->>PM: Konfirmasi order dibuat

    Note over OP: Hari produksi

    OP->>PO: Start produksi (scan batch ID)
    PO->>PO: Set status = in_progress, catat production_start_time
    OP->>HACCP: Input verifikasi HACCP (suhu, checklist, bahan baku)
    HACCP->>HACCP: Generate haccp_number (HACCP-YYYYMMDD-XXX)
    HACCP->>HACCP: Evaluasi checklist & parameter CCP

    alt Semua CCP terpenuhi
        HACCP->>HACCP: Set status = verified, qc_result = pass
        HACCP->>PO: Update haccp_verified = true
    else Ada CCP tidak terpenuhi
        HACCP->>HACCP: Set status = failed, qc_result = fail
        HACCP->>PO: Update haccp_verified = false
    end
```

### 2. Monitoring CCP & Pengecekan Kualitas Bahan Baku

```mermaid theme={null}
sequenceDiagram
    participant RC as Receiver / QC Inspector
    participant QC as QualityCheck
    participant LB as LotBatch
    participant INV as Inventory

    RC->>QC: Input pemeriksaan bahan baku datang
    QC->>QC: Generate qc_number (QC-YYYYMMDD-XXX)
    RC->>QC: Isi checklist (Visual, Aroma, Tekstur, Suhu)
    RC->>QC: Catat suhu, humidity, cek expired date
    RC->>QC: Timbang ulang (claimed vs weighed)

    alt Semua item pass & suhu sesuai
        QC->>QC: Set overall_status = approved
        QC->>QC: Hitung delivery_variance
        QC->>LB: Buat LotBatch (status = active, quality_status = passed)
        QC->>INV: Update stok inventory (inventory_updated = true)
    else Ada item fail
        QC->>QC: Set overall_status = rejected
        QC->>QC: Catat rejection_reason
        QC->>QC: approved_quantity = 0, rejected_quantity = quantity_received
    else Kondisi tertentu (conditional)
        QC->>QC: Set overall_status = conditional
        QC->>LB: Buat LotBatch dengan status = quarantine
        Note over RC: Perlu approval supervisor
    end
```

### 3. Penanganan Deviasi & Quality Case

```mermaid theme={null}
sequenceDiagram
    participant OP as Operator
    participant HACCP as HACCPVerification
    participant QCase as QualityCase
    participant LB as LotBatch
    participant SPV as Supervisor / QC Manager

    OP->>HACCP: Deteksi deviasi CCP (suhu tidak tercapai)
    HACCP->>HACCP: Set status = failed, catat parameter aktual
    OP->>QCase: Buat Quality Case (reason, description, evidence)
    QCase->>QCase: Set status = open

    alt Hold diperlukan
        OP->>QCase: Set hold_requested = true
        QCase->>SPV: Request approval untuk quarantine
        SPV->>QCase: Approve hold (hold_approved_by, hold_approved_at)
        QCase->>LB: Update LotBatch status = quarantine
    end

    SPV->>QCase: Investigasi temuan
    QCase->>QCase: Set status = investigating

    alt Deviasi dapat dikoreksi
        SPV->>QCase: Catat resolution_notes
        QCase->>QCase: Set status = resolved, resolved_at = now
        QCase->>LB: Update LotBatch status = active (jika layak)
    else Batch harus di-scrap
        SPV->>QCase: Catat resolution_notes (dispose)
        QCase->>QCase: Set status = closed
        QCase->>LB: Update LotBatch status = recalled
    end
```

### 4. Corrective Action & Rilis Lot ke Inventory

```mermaid theme={null}
sequenceDiagram
    participant SPV as Supervisor
    participant PO as ProductionOrder
    participant HACCP as HACCPVerification
    participant LB as LotBatch
    participant HPP as HPPCalculation
    participant INV as Inventory

    SPV->>PO: Review batch yang selesai produksi
    PO->>HACCP: Fetch HACCP verification record
    HACCP-->>PO: Return status verified + qc_result

    alt QC pass & HACCP verified
        SPV->>PO: Approve rilis QC
        PO->>PO: Set qc_release_started_at, idempotency key
        PO->>LB: Buat/update LotBatch output (status = released, quality_status = passed)
        PO->>LB: Set haccp_verified = true
        PO->>HPP: Trigger perhitungan HPP batch
        HPP->>HPP: Hitung total_material_cost + direct_labor + overhead
        HPP->>HPP: Hitung unit_hpp = total_batch_cost / quantity_produced
        HPP->>PO: Update unit_hpp, cost_status = complete
        PO->>INV: Posting produk jadi ke inventory
        PO->>PO: Set status = completed
    else QC fail / HACCP not verified
        SPV->>PO: Set status = on_hold, catat hold_reason
        PO->>LB: Set LotBatch status = quarantine
        Note over SPV: Eskalasi ke Production Manager
    end
```

***

## Enum Reference Tables

### HACCPVerification — `efficiency_status`

| Nilai | Deskripsi |
| - | - |
| `efficient` | Produksi selesai di bawah standard time (lebih cepat dari acuan) |
| `normal` | Produksi selesai dalam rentang wajar standard time |
| `inefficient` | Produksi melebihi 120% dari standard time yang ditetapkan |

### HACCPVerification — `qc_result`

| Nilai | Deskripsi |
| - | - |
| `pass` | Produk jadi lolos semua parameter QC dan siap dirilis |
| `fail` | Produk jadi tidak memenuhi standar QC, perlu tindakan lanjutan |
| `pending` | Hasil QC belum ditentukan, masih dalam proses pemeriksaan |
| `rework` | Produk perlu diproses ulang untuk memenuhi standar QC |

### HACCPVerification — `status`

| Nilai | Deskripsi |
| - | - |
| `in_progress` | Verifikasi HACCP sedang berlangsung, produksi belum selesai |
| `verified` | Semua CCP telah diverifikasi dan memenuhi critical limit |
| `failed` | Verifikasi gagal, ditemukan penyimpangan critical limit |
| `rework` | Produksi perlu diulang atau diperbaiki setelah deviasi |

### QualityCheck — `overall_status`

| Nilai | Deskripsi |
| - | - |
| `pending` | Pemeriksaan QC masih dalam proses, belum ada keputusan |
| `approved` | Bahan baku lolos semua parameter QC dan diterima masuk inventory |
| `rejected` | Bahan baku ditolak karena tidak memenuhi standar kualitas |
| `conditional` | Bahan baku diterima dengan syarat tertentu, perlu approval supervisor |

### QualityCheck — `expiry_date_check`

| Nilai | Deskripsi |
| - | - |
| `valid` | Tanggal expired masih jauh, bahan baku layak digunakan |
| `expired` | Bahan baku sudah melewati tanggal kadaluarsa, wajib ditolak |
| `near_expiry` | Tanggal expired mendekati batas, perlu perhatian khusus |
| `no_date` | Tidak terdapat tanggal expired pada kemasan bahan baku |

### QualityCheck — `checklist.result`

| Nilai | Deskripsi |
| - | - |
| `pass` | Item pemeriksaan memenuhi standar yang ditetapkan |
| `fail` | Item pemeriksaan tidak memenuhi standar |
| `warning` | Item pemeriksaan mendekati batas toleransi |
| `na` | Item pemeriksaan tidak berlaku untuk bahan ini |

### QualityCase — `reason`

| Nilai | Deskripsi |
| - | - |
| `contamination` | Ditemukan kontaminasi fisik, kimia, atau biologis pada batch |
| `labeling_error` | Kesalahan pelabelan (informasi tidak sesuai, salah cetak) |
| `expired` | Batch sudah melewati tanggal kadaluarsa |
| `customer_complaint` | Complaint dari pelanggan terkait kualitas produk |
| `packaging_defect` | Cacat pada kemasan (segel bocor, kemasan rusak) |
| `other` | Alasan lainnya yang tidak termasuk kategori di atas |

### QualityCase — `status`

| Nilai | Deskripsi |
| - | - |
| `open` | Quality case baru dilaporkan, belum ditindaklanjuti |
| `investigating` | Tim sedang melakukan investigasi terhadap temuan |
| `on_hold` | Penanganan ditunda sementara (menunggu bahan/data tambahan) |
| `resolved` | Quality case telah diselesaikan dan resolusi dicatat |
| `closed` | Quality case ditutup secara permanen |

### ProductionOrder — `status`

| Nilai | Deskripsi |
| - | - |
| `planned` | Production order telah dibuat dan dijadwalkan |
| `in_progress` | Produksi sedang berjalan |
| `completed` | Produksi telah selesai dan semua output tercatat |
| `on_hold` | Produksi dihentikan sementara (menunggu material, QC hold, dll) |
| `cancelled` | Production order dibatalkan |

### ProductionOrder — `priority`

| Nilai | Deskripsi |
| - | - |
| `low` | Prioritas rendah, dapat dijadwalkan fleksibel |
| `normal` | Prioritas standar, sesuai jadwal reguler |
| `high` | Prioritas tinggi, perlu didahulukan |
| `urgent` | Sangat mendesak, harus segera diproses |

### ProductionOrder — `production_tier`

| Nilai | Deskripsi |
| - | - |
| `primary_semi_finished` | Pengolahan bahan mentah menjadi barang setengah jadi |
| `final_finished_good` | Assembling/pemrosesan akhir menjadi produk jadi siap edar |

### ProductionOrder — `wip_status`

| Nilai | Deskripsi |
| - | - |
| `draft` | Status awal, belum masuk proses WIP |
| `in_wip` | Sedang dalam proses Work In Process |
| `transferred_to_fg` | Sudah ditransfer ke Finished Goods |
| `cancelled` | Proses WIP dibatalkan |

### ProductionOrder — `cost_status`

| Nilai | Deskripsi |
| - | - |
| `complete` | Semua komponen biaya telah tercatat dan HPP final |
| `provisional_incomplete` | Biaya masih bersifat provisional karena ada input yang belum lengkap |
| `zero_output_pending` | Belum ada output produksi, perhitungan HPP ditunda |

### LotBatch — `status`

| Nilai | Deskripsi |
| - | - |
| `active` | Lot aktif dan tersedia untuk digunakan/dijual |
| `released` | Lot telah dirilis melalui QC dan siap edar |
| `quarantine` | Lot dikarantina, tidak dapat digunakan hingga hold dilepas |
| `expired` | Lot sudah melewati tanggal kadaluarsa |
| `depleted` | Quantity lot sudah habis digunakan |
| `recalled` | Lot ditarik kembali (recall) karena masalah kualitas |

### LotBatch — `quality_status`

| Nilai | Deskripsi |
| - | - |
| `passed` | Lot telah lolos pemeriksaan kualitas |
| `failed` | Lot tidak lolos pemeriksaan kualitas |
| `pending` | Pemeriksaan kualitas masih dalam proses |

### LotBatch — `expiry_alert_status`

| Nilai | Deskripsi |
| - | - |
| `normal` | Tanggal expired masih jauh, tidak ada peringatan |
| `near_expiry` | Mendekati expired (H-30 hari), perlu perhatian |
| `critical_expiry` | Sangat mendekati expired (H-7 hari), perlu tindakan segera |
| `expired` | Sudah melewati tanggal kadaluarsa |

### LotBatch — `item_type`

| Nilai | Deskripsi |
| - | - |
| `finished_good` | Barang jadi siap edar ke konsumen |
| `semi_finished` | Barang setengah jadi, perlu proses lanjutan |
| `raw_material` | Bahan baku mentah untuk produksi |

### LotBatch — `identity_status`

| Nilai | Deskripsi |
| - | - |
| `linked` | Identitas canonical sudah terhubung ke master produk |
| `legacy_review` | Identitas masih menggunakan data legacy, perlu review |

### LotBatch — `cost_status`

| Nilai | Deskripsi |
| - | - |
| `complete` | Biaya modal lot telah tercatat lengkap |
| `provisional_incomplete` | Biaya masih provisional, ada input yang belum lengkap |
| `unassigned` | Biaya belum diassign ke lot ini |

### BillOfMaterials — `output_type`

| Nilai | Deskripsi |
| - | - |
| `finished_good` | Output berupa barang jadi siap edar |
| `semi_finished` | Output berupa barang setengah jadi olahan |

### BillOfMaterials — `status`

| Nilai | Deskripsi |
| - | - |
| `draft` | BOM masih dalam tahap penyusunan, belum aktif |
| `active` | BOM aktif dan digunakan dalam produksi |
| `archived` | BOM diarsipkan, tidak digunakan lagi namun masih dapat diakses |
| `obsolete` | BOM sudah tidak berlaku dan digantikan versi baru |

### BillOfMaterials — `qc_sop_parameters`

| Field | Type | Description |
| - | - | - |
| `temperature_min_c` | number | Suhu minimum proses pemasakan (°C) |
| `temperature_max_c` | number | Suhu maksimum proses pemasakan (°C) |
| `cooking_time_min_minutes` | number | Waktu masak minimum dalam menit |
| `pressure_min_bar` | number | Tekanan minimum proses (bar) |

### HPPCalculation — `calculation_method`

| Nilai | Deskripsi |
| - | - |
| `FIFO` | First In First Out — bahan yang pertama masuk dihitung pertama |
| `LIFO` | Last In First Out — bahan yang terakhir masuk dihitung pertama |
| `Average` | Rata-rata tertimbang dari semua bahan yang digunakan |

### HPPCalculation — `cost_status`

| Nilai | Deskripsi |
| - | - |
| `complete` | Perhitungan HPP lengkap dengan semua komponen biaya |
| `provisional_incomplete` | Perhitungan sementara karena ada input biaya yang belum lengkap |
| `zero_output_pending` | Belum ada output, perhitungan HPP ditunda |

### Training — `training_type`

| Nilai | Deskripsi |
| - | - |
| `internal` | Training internal yang dilakukan oleh trainer perusahaan |
| `external` | Training eksternal dengan trainer/institusi dari luar |
| `online` | Training daring melalui platform online |
| `certification` | Training berorientasi sertifikasi profesi |
| `workshop` | Workshop praktik langsung |

### Training — `status`

| Nilai | Deskripsi |
| - | - |
| `planned` | Training telah direncanakan dan dijadwalkan |
| `ongoing` | Training sedang berlangsung |
| `completed` | Training telah selesai dilaksanakan |
| `cancelled` | Training dibatalkan |

### Training — `participants.attendance_status`

| Nilai | Deskripsi |
| - | - |
| `registered` | Peserta telah terdaftar namun belum mengikuti |
| `attended` | Peserta telah hadir mengikuti training |
| `absent` | Peserta tidak hadir tanpa keterangan |
| `completed` | Peserta telah menyelesaikan training dan lulus assessment |

***

## RBAC Permission Matrix

Berikut adalah matriks hak akses berdasarkan peran (role) terhadap entitas-entitas HACCP:

| Entitas | Operator Produksi | QC Inspector | Supervisor | QC Manager | Production Manager | Admin |
| - | :-: | :-: | :-: | :-: | :-: | :-: |
| **HACCPVerification** | Create, Read | Read | Read, Update | Read, Update, Delete | Read | Full Access |
| **QualityCheck** | Read | Create, Read, Update | Read, Update | Read, Update, Delete | Read | Full Access |
| **QualityCase** | Read | Create, Read | Read, Update | Create, Read, Update, Delete | Read | Full Access |
| **ProductionOrder** | Read, Update (start/complete) | Read | Read, Update (hold/resume) | Read | Create, Read, Update, Delete | Full Access |
| **LotBatch** | Read | Read, Update (quality\_status) | Read | Read, Update (status, quarantine) | Read | Full Access |
| **BillOfMaterials** | Read | Read | Read | Read | Create, Read, Update | Full Access |
| **HPPCalculation** | — | Read | Read | Read | Create, Read, Update | Full Access |
| **Training** | Read (self) | Read | Read, Create (internal) | Read, Create, Update | Read, Create, Update, Delete | Full Access |

### Keterangan Peran

| Role | Deskripsi |
| - | - |
| **Operator Produksi** | Staff yang menjalankan proses produksi sehari-hari, melakukan input data CCP dan verifikasi HACCP |
| **QC Inspector** | Staff quality control yang melakukan inspeksi bahan baku masuk dan produk jadi |
| **Supervisor** | Pengawas lini produksi yang berwenang melakukan hold/resume dan approval corrective action |
| **QC Manager** | Manager quality control yang memiliki otoritas penuh atas semua entitas QC dan quality case |
| **Production Manager** | Manager produksi yang berwenang membuat production order, BOM, dan menghitung HPP |
| **Admin** | Administrator sistem dengan akses penuh ke seluruh entitas dan operasi |


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