// ===== Mock data for IDSS MBG =====
const ROLES = {
  agro: {
    id: "agro",
    name: "Smart Agro Food Collection Center",
    short: "Smart Agro",
    initials: "SA",
    location: "SAFCC Cianjur — Cianjur",
    description: "Mengelola pengumpulan bahan baku dari petani/supplier lokal Cianjur, preprocessing, quality control, dan distribusi ke dapur dengan sistem otomasi smart."
  },
  induk: {
    id: "induk",
    name: "Koordinator Dapur Induk",
    short: "Dapur Induk",
    initials: "DI",
    location: "Dapur Induk Cianjur — 3.000 jiwa/hari",
    description: "Mengolah bahan baku menjadi makanan dengan skala produksi besar (≥3.000 porsi) untuk sekolah, posyandu, dan program nutrisi komunitas di Cianjur."
  },
  satelit: {
    id: "satelit",
    name: "Koordinator Dapur Satelit",
    short: "Dapur Satelit",
    initials: "DS",
    location: "Dapur Satelit Cianjur 01 — 2.000 jiwa/hari",
    description: "Mengolah bahan baku menjadi makanan dengan skala produksi sedang (2.000 porsi) untuk sekolah, posyandu, dan program nutrisi komunitas di Cianjur."
  },
  supplier: {
    id: "supplier",
    name: "Supplier",
    short: "Supplier",
    initials: "SP",
    location: "Cianjur — Mitra Penyuplai SAFCC",
    description: "Supplier pangan"
  },
  supplier_tani: {
    id: "supplier_tani",
    name: "Kelompok Tani",
    short: "Kelompok Tani",
    initials: "KT",
    location: "Cianjur — Kelompok Tani Mitra",
    description: "Kelompok petani lokal yang menyuplai komoditas pertanian segar ke Smart Agro Food Collection Center."
  },
  supplier_koperasi: {
    id: "supplier_koperasi",
    name: "Koperasi",
    short: "Koperasi",
    initials: "KP",
    location: "Cianjur — Koperasi Mitra",
    description: "Koperasi yang mengelola produksi dan distribusi komoditas pangan ke Smart Agro Food Collection Center."
  },
  supplier_umkm: {
    id: "supplier_umkm",
    name: "Usaha Mikro Kecil Menengah (UMKM)",
    short: "UMKM",
    initials: "UM",
    location: "Cianjur — UMKM Mitra",
    description: "Usaha mikro kecil menengah yang menyuplai produk pangan berkualitas ke Smart Agro Food Collection Center."
  },
  supplier_besar: {
    id: "supplier_besar",
    name: "Pengusaha Besar",
    short: "Pengusaha Besar",
    initials: "PB",
    location: "Cianjur — PT/Pengusaha Besar Mitra",
    description: "Pengusaha/perusahaan besar yang menyuplai komoditas pangan dalam skala besar ke Smart Agro Food Collection Center."
  },
  penerima: {
    id: "penerima",
    name: "Penerima Manfaat",
    short: "Penerima Manfaat",
    initials: "PM",
    location: "Sekolah & Posyandu — Cianjur",
    description: "Verifikasi kualitas makanan yang diterima dari dapur dan memberikan feedback untuk meningkatkan kualitas layanan nutrisi berkelanjutan."
  }
};

// ===== PHASE 2: MESSAGE INFRASTRUCTURE =====
// Centralized message types for all inter-role broadcasts
const MESSAGE_TYPES = {
  // SUPPLIER → others
  SUPPLIER_FULFILLMENT_SUBMITTED: "__supplier_fulfillment_submitted",
  SUPPLIER_EWS_SUBMITTED: "__supplier_ews_submitted",

  // PENERIMA → others
  QUALITY_FEEDBACK_SUBMITTED: "__quality_feedback_submitted",
  CHECKLIST_SUBMITTED: "__checklist_submitted",

  // DAPUR → others
  PRODUCTION_PLAN_CREATED: "__production_plan_created",
  MENU_OPTIMIZED: "__menu_optimized",

  // AGRO → others
  SAFCC_REQUEST_CREATED: "__safcc_request_created",
  SAFCC_REQUESTS_UPDATED: "__safcc_requests_updated",
  NERACA_UPDATED: "__neraca_updated"
};

// C2: Message metadata with versioning (supplements MESSAGE_TYPES)
const MESSAGE_METADATA = {
  "__supplier_fulfillment_submitted": { version: 1, requiresAck: true },
  "__supplier_ews_submitted": { version: 1, requiresAck: false },
  "__quality_feedback_submitted": { version: 1, requiresAck: true },
  "__checklist_submitted": { version: 1, requiresAck: false },
  "__production_plan_created": { version: 1, requiresAck: false },
  "__menu_optimized": { version: 1, requiresAck: false },
  "__safcc_request_created": { version: 1, requiresAck: false },
  "__safcc_requests_updated": { version: 1, requiresAck: false },
  "__neraca_updated": { version: 1, requiresAck: false }
};

// ===== CENTRALIZED STATUS ENUMS =====
const STATUS_TYPES = {
  // Supply/Inventory statuses
  TERSUPLAI: "tersuplai",
  MENUNGGU: "menunggu",
  KRITIS: "kritis",

  // Quality feedback statuses
  LULUS: "lulus",
  MINOR: "minor",
  MAJOR: "major",

  // Fulfillment/Delivery statuses
  PENDING: "pending",
  READY: "ready",
  SHIPPED: "shipped",
  ACCEPTED: "accepted",
  REJECTED: "rejected"
};

// ===== CRITERIA ID MAPPING =====
const CRITERIA_KEY_MAP = {
  C1: "kemasan",
  C2: "aroma",
  C3: "warna",
  C4: "tekstur",
  C5: "suhu",
  C6: "etiket"
};

// Komoditas
const KOMODITAS = [
  { id: "K01", nama: "Beras Premium", unit: "kg", kategori: "Karbohidrat" },
  { id: "K02", nama: "Ayam Karkas", unit: "kg", kategori: "Protein hewani" },
  { id: "K03", nama: "Telur Ayam", unit: "kg", kategori: "Protein hewani" },
  { id: "K04", nama: "Tahu Putih", unit: "kg", kategori: "Protein nabati" },
  { id: "K05", nama: "Tempe", unit: "kg", kategori: "Protein nabati" },
  { id: "K06", nama: "Bayam Segar", unit: "kg", kategori: "Sayuran" },
  { id: "K07", nama: "Wortel", unit: "kg", kategori: "Sayuran" },
  { id: "K08", nama: "Pisang Cavendish", unit: "kg", kategori: "Buah" },
  { id: "K09", nama: "Minyak Goreng", unit: "L", kategori: "Lemak" },
  { id: "K10", nama: "Susu UHT", unit: "L", kategori: "Susu" }
];

// Time-delay panen (Fokus Cianjur)
const PREDIKSI_PANEN = [
  { id: "P01", komoditas: "Bayam Segar", lokasi: "Cidaun, Cianjur", target: "2026-05-12", prediksi: "2026-05-14", delay: 2, volume: 1240, status: "delay-rendah", confidence: 0.86 },
  { id: "P02", komoditas: "Wortel", lokasi: "Cipanas, Cianjur", target: "2026-05-08", prediksi: "2026-05-15", delay: 7, volume: 880, status: "delay-tinggi", confidence: 0.78 },
  { id: "P03", komoditas: "Beras Premium", lokasi: "Sukanagara, Cianjur", target: "2026-05-20", prediksi: "2026-05-21", delay: 1, volume: 5500, status: "tepat-waktu", confidence: 0.92 },
  { id: "P04", komoditas: "Pisang Cavendish", lokasi: "Cugenang, Cianjur", target: "2026-05-10", prediksi: "2026-05-09", delay: -1, volume: 2100, status: "lebih-cepat", confidence: 0.81 },
  { id: "P05", komoditas: "Tahu Putih (kedelai)", lokasi: "Pabuaran, Cianjur", target: "2026-05-18", prediksi: "2026-05-22", delay: 4, volume: 1200, status: "delay-sedang", confidence: 0.74 },
  { id: "P06", komoditas: "Telur Ayam", lokasi: "Warungkondang, Cianjur", target: "2026-05-09", prediksi: "2026-05-09", delay: 0, volume: 980, status: "tepat-waktu", confidence: 0.95 }
];

// Supplier (untuk AHP) — bertingkat per komoditas
const SUPPLIERS_BY_KOMODITAS = {
  "Ayam Karkas": {
    satuan: "Rp/kg",
    list: [
      { id: "S-AY01", nama: "PT Karya Unggas Nusantara", harga: 38500, mutu: 4.7, waktu: 4.6, jumlah: 4.8, alamat: "Bogor" },
      { id: "S-AY02", nama: "CV Ayam Sehat Mandiri",     harga: 36800, mutu: 4.3, waktu: 4.1, jumlah: 4.4, alamat: "Sukabumi" },
      { id: "S-AY03", nama: "Koperasi Peternak Jaya",      harga: 35900, mutu: 4.0, waktu: 4.4, jumlah: 4.2, alamat: "Cianjur" },
      { id: "S-AY04", nama: "UD Berkah Unggas",            harga: 34500, mutu: 3.6, waktu: 3.8, jumlah: 4.0, alamat: "Karawang" },
      { id: "S-AY05", nama: "PT Prima Poultry",            harga: 39200, mutu: 4.8, waktu: 4.7, jumlah: 4.6, alamat: "Tangerang" }
    ]
  },
  "Sayur Kangkung": {
    satuan: "Rp/kg",
    list: [
      { id: "S-KG01", nama: "Koperasi Tani Hijau",        harga: 6200, mutu: 4.4, waktu: 4.5, jumlah: 4.3, alamat: "Lembang" },
      { id: "S-KG02", nama: "CV Sayur Segar Bersama",     harga: 5800, mutu: 4.1, waktu: 4.2, jumlah: 4.6, alamat: "Cisarua" },
      { id: "S-KG03", nama: "PT Agro Lestari",            harga: 6800, mutu: 4.7, waktu: 4.6, jumlah: 4.5, alamat: "Pangalengan" },
      { id: "S-KG04", nama: "UD Tani Berkah",             harga: 5400, mutu: 3.7, waktu: 3.9, jumlah: 4.0, alamat: "Cipanas" },
      { id: "S-KG05", nama: "Mitra Sayur Sejahtera",      harga: 6100, mutu: 4.3, waktu: 4.0, jumlah: 4.4, alamat: "Garut" }
    ]
  },
  "Beras": {
    satuan: "Rp/kg",
    list: [
      { id: "S-BR01", nama: "PT Padi Makmur Indonesia",   harga: 13200, mutu: 4.6, waktu: 4.5, jumlah: 4.9, alamat: "Karawang" },
      { id: "S-BR02", nama: "Koperasi Petani Padi Jaya",  harga: 12600, mutu: 4.2, waktu: 4.3, jumlah: 4.7, alamat: "Subang" },
      { id: "S-BR03", nama: "CV Beras Pulen",             harga: 13800, mutu: 4.8, waktu: 4.6, jumlah: 4.5, alamat: "Cianjur" },
      { id: "S-BR04", nama: "UD Sumber Pangan",           harga: 12100, mutu: 3.8, waktu: 4.0, jumlah: 4.3, alamat: "Indramayu" },
      { id: "S-BR05", nama: "PT Pangan Sejahtera",        harga: 13000, mutu: 4.4, waktu: 4.2, jumlah: 4.6, alamat: "Bekasi" }
    ]
  }
};
// alias backward-compat
const SUPPLIERS = SUPPLIERS_BY_KOMODITAS["Ayam Karkas"].list;

// Dapur Cianjur — disuplai (fokus Cianjur)
const _wilayah_cianjur = [
  { kode: "CJR", nama: "Cianjur Pusat" },
  { kode: "CID", nama: "Cidaun" },
  { kode: "CIP", nama: "Cipanas" },
  { kode: "CUG", nama: "Cugenang" },
  { kode: "PAB", nama: "Pabuaran" },
  { kode: "WAR", nama: "Warungkondang" },
  { kode: "SIM", nama: "Sukanagara" }
];
function _genDapur() {
  // Seeded pseudo-random for stability
  let s = 7;
  const rnd = () => { s = (s * 9301 + 49297) % 233280; return s / 233280; };
  const list = [];
  // Dapur Induk Cianjur: 3 unit (melayani Sekolah & Posyandu)
  for (let i = 1; i <= 3; i++) {
    const w = _wilayah_cianjur[i % _wilayah_cianjur.length];
    const r = rnd();
    const status = r < 0.78 ? "tersuplai" : r < 0.93 ? "menunggu" : "kritis";
    const isi = status === "tersuplai" ? 80 + Math.floor(rnd() * 20)
              : status === "menunggu" ? 25 + Math.floor(rnd() * 30)
              : 5 + Math.floor(rnd() * 18);
    const jam = 5 + Math.floor(rnd() * 4), mn = Math.floor(rnd() * 60);
    const sekolah = 15 + Math.floor(rnd() * 8);
    const posyandu = 5 + Math.floor(rnd() * 4);
    list.push({
      id: `DI-${w.kode}-${String(i).padStart(2,"0")}`,
      nama: `Dapur Induk Cianjur ${w.nama}`,
      tipe: "induk",
      jiwa: 2800 + Math.floor(rnd() * 1800),
      sekolahTerlayani: sekolah,
      posyanduTerlayani: posyandu,
      wilayah: `${w.nama}, Cianjur`,
      status,
      lastDelivery: status === "tersuplai" ? `${String(jam).padStart(2,"0")}:${String(mn).padStart(2,"0")}` : "—",
      isi
    });
  }
  // Dapur Satelit Cianjur: 18 unit (melayani Sekolah & Posyandu)
  for (let i = 1; i <= 18; i++) {
    const w = _wilayah_cianjur[i % _wilayah_cianjur.length];
    const r = rnd();
    const status = r < 0.82 ? "tersuplai" : r < 0.95 ? "menunggu" : "kritis";
    const isi = status === "tersuplai" ? 78 + Math.floor(rnd() * 22)
              : status === "menunggu" ? 22 + Math.floor(rnd() * 32)
              : 3 + Math.floor(rnd() * 20);
    const jam = 5 + Math.floor(rnd() * 4), mn = Math.floor(rnd() * 60);
    const sekolah = 8 + Math.floor(rnd() * 5);
    const posyandu = 2 + Math.floor(rnd() * 3);
    list.push({
      id: `DS-${w.kode}-${String(i).padStart(2,"0")}`,
      nama: `Dapur Satelit Cianjur ${String(i).padStart(2,"0")} (${w.nama})`,
      tipe: "satelit",
      jiwa: 700 + Math.floor(rnd() * 1400),
      sekolahTerlayani: sekolah,
      posyanduTerlayani: posyandu,
      wilayah: `${w.nama}, Cianjur`,
      status,
      lastDelivery: status === "tersuplai" ? `${String(jam).padStart(2,"0")}:${String(mn).padStart(2,"0")}` : "—",
      isi
    });
  }
  return list;
}
const DAPUR_LIST = _genDapur();

// Stok komoditas — neraca (skala 288 dapur)
const NERACA = [
  { komoditas: "Beras Premium",   kebutuhan: 86400,  tersedia: 90880,  satuan: "kg", status: "berlebih" },
  { komoditas: "Ayam Karkas",     kebutuhan: 25920,  tersedia: 23680,  satuan: "kg", status: "defisit" },
  { komoditas: "Telur Ayam",      kebutuhan: 17280,  tersedia: 17920,  satuan: "kg", status: "berlebih" },
  { komoditas: "Tahu Putih",      kebutuhan: 11520,  tersedia: 11520,  satuan: "kg", status: "seimbang" },
  { komoditas: "Tempe",           kebutuhan: 11520,  tersedia: 11040,  satuan: "kg", status: "defisit" },
  { komoditas: "Sayur Kangkung",  kebutuhan: 8640,   tersedia: 6080,   satuan: "kg", status: "defisit" },
  { komoditas: "Wortel",          kebutuhan: 8640,   tersedia: 9792,   satuan: "kg", status: "berlebih" },
  { komoditas: "Pisang Cavendish",kebutuhan: 28800,  tersedia: 32800,  satuan: "kg", status: "berlebih" },
  { komoditas: "Minyak Goreng",   kebutuhan: 5120,   tersedia: 4720,   satuan: "L",  status: "defisit" },
  { komoditas: "Susu UHT",        kebutuhan: 72000,  tersedia: 72000,  satuan: "L",  status: "seimbang" }
];

// Menu MILP — bahan
const MENU_BAHAN = [
  { id: "B01", nama: "Nasi Putih", kategori: "Karbohidrat", kal: 130, prot: 2.7, lem: 0.3, fe: 0.2, harga: 1500, gPerPorsi: 100 },
  { id: "B02", nama: "Ayam Goreng", kategori: "Protein hewani", kal: 239, prot: 27, lem: 14, fe: 1.3, harga: 6800, gPerPorsi: 60 },
  { id: "B03", nama: "Telur Dadar", kategori: "Protein hewani", kal: 154, prot: 10.5, lem: 11, fe: 1.2, harga: 2400, gPerPorsi: 55 },
  { id: "B04", nama: "Tempe Orek", kategori: "Protein nabati", kal: 192, prot: 18, lem: 11, fe: 2.7, harga: 1800, gPerPorsi: 50 },
  { id: "B05", nama: "Tahu Bacem", kategori: "Protein nabati", kal: 144, prot: 12, lem: 8, fe: 5.4, harga: 1900, gPerPorsi: 60 },
  { id: "B06", nama: "Tumis Bayam", kategori: "Sayuran", kal: 23, prot: 2.9, lem: 0.4, fe: 2.7, harga: 1200, gPerPorsi: 80 },
  { id: "B07", nama: "Sup Wortel", kategori: "Sayuran", kal: 41, prot: 0.9, lem: 0.2, fe: 0.3, harga: 1300, gPerPorsi: 80 },
  { id: "B08", nama: "Pisang", kategori: "Buah", kal: 89, prot: 1.1, lem: 0.3, fe: 0.3, harga: 1500, gPerPorsi: 100 },
  { id: "B09", nama: "Susu UHT", kategori: "Susu", kal: 61, prot: 3.2, lem: 3.3, fe: 0.0, harga: 2200, gPerPorsi: 200 }
];

// Target nutrisi per kelompok usia (Sekolah + Posyandu)
const NUTRISI_TARGET_BY_KELOMPOK = {
  "Balita (6-24 bulan)": {
    kal:  { min: 350,  max: 450,  satuan: "kkal" },
    prot: { min: 10,   max: 15,   satuan: "g" },
    lem:  { min: 11,   max: 16,   satuan: "g" },
    fe:   { min: 6,    max: 12,   satuan: "mg" },
    biaya: { max: 10000, satuan: "Rp" }
  },
  "Anak (3-6 tahun)": {
    kal:  { min: 500,  max: 650,  satuan: "kkal" },
    prot: { min: 18,   max: 28,   satuan: "g" },
    lem:  { min: 16,   max: 26,   satuan: "g" },
    fe:   { min: 5,    max: 10,   satuan: "mg" },
    biaya: { max: 14000, satuan: "Rp" }
  },
  "Anak SD (7-12 tahun)": {
    kal:  { min: 600,  max: 750,  satuan: "kkal" },
    prot: { min: 22,   max: 35,   satuan: "g" },
    lem:  { min: 18,   max: 32,   satuan: "g" },
    fe:   { min: 4.5,  max: 9,    satuan: "mg" },
    biaya: { max: 18000, satuan: "Rp" }
  },
  "Ibu Hamil & Menyusui": {
    kal:  { min: 2200, max: 2500, satuan: "kkal" },
    prot: { min: 65,   max: 85,   satuan: "g" },
    lem:  { min: 65,   max: 80,   satuan: "g" },
    fe:   { min: 27,   max: 30,   satuan: "mg" },
    biaya: { max: 25000, satuan: "Rp" }
  }
};
// Backward compatibility
const NUTRISI_TARGET = NUTRISI_TARGET_BY_KELOMPOK["Anak SD (7-12 tahun)"];

// EWS tahapan (untuk Sekolah & Posyandu)
const EWS_TAHAPAN = [
  { idx: 1, fase: "bahan", id: "T1", nama: "Penerimaan Bahan", deskripsi: "QC saat bahan datang dari supplier" },
  { idx: 2, fase: "bahan", id: "T2", nama: "Penyimpanan", deskripsi: "Cold storage / dry storage (Sekolah & Posyandu)" },
  { idx: 3, fase: "bahan", id: "T3", nama: "Pengolahan", deskripsi: "Cooking & preparation sesuai standar gizi per kelompok usia" },
  { idx: 4, fase: "jadi",  id: "T4", nama: "Pengemasan", deskripsi: "Packaging porsi makanan untuk sekolah & posyandu" },
  { idx: 5, fase: "jadi",  id: "T5", nama: "Distribusi", deskripsi: "Transportasi ke sekolah & posyandu dengan cold chain" },
  { idx: 6, fase: "jadi",  id: "T6", nama: "Penerimaan Lokasi", deskripsi: "Serah-terima di sekolah atau posyandu dengan dokumentasi" }
];

// Kriteria EWS per tahap (skoring 1-5, 5=baik) — 3 kriteria utama per tahapan
// EWS Dapur (T1-T6: Penerimaan → Pengemasan → Transportasi → Penerimaan di Sekolah)
const EWS_KRITERIA = {
  T1: [
    { id: "K1", nama: "Suhu kedatangan & rantai dingin", batasKritis: "≤ 4°C (dingin) / ≤ 10°C (chilled) / ambient ≤ 25°C", bobot: 0.25 },
    { id: "K2", nama: "Kondisi visual bahan baku", batasKritis: "tidak layu/busuk, warna segar, tekstur normal", bobot: 0.20 },
    { id: "K3", nama: "Integritas kemasan awal", batasKritis: "kemasan tidak rusak, bocor, atau terkontaminasi", bobot: 0.15 },
    { id: "K4", nama: "Kebersihan wadah & dokumentasi", batasKritis: "wadah bersih, label jelas, date lengkap", bobot: 0.20 },
    { id: "K5", nama: "Sertifikat & traceability", batasKritis: "SPK/sertifikat halal lengkap, petani teridentifikasi", bobot: 0.20 }
  ],
  T2: [
    { id: "K1", nama: "Suhu penyimpanan stabil", batasKritis: "0–4°C / -18°C / 18–25°C (sesuai jenis)", bobot: 0.25 },
    { id: "K2", nama: "Kelembaban relatif terjaga", batasKritis: "60–75% (variasi ±5%), tidak kondensasi", bobot: 0.20 },
    { id: "K3", nama: "Segregasi & organisasi penyimpanan", batasKritis: "FIFO, terpisah per jenis, tidak tercampur", bobot: 0.15 },
    { id: "K4", nama: "Higienitas area & pest control", batasKritis: "ATP < 30 RLU, tidak ada serangga/rodent", bobot: 0.20 },
    { id: "K5", nama: "Monitoring & pencatatan suhu", batasKritis: "log suhu harian, gap ≤ 1°C dari set point", bobot: 0.20 }
  ],
  T3: [
    { id: "K1", nama: "Suhu masak inti & distribusi panas", batasKritis: "≥ 75°C (65°C untuk pasteurisasi), merata", bobot: 0.25 },
    { id: "K2", nama: "Waktu masak & SOP kepatuhan", batasKritis: "≥ 90% SOP waktu, tidak undercook", bobot: 0.20 },
    { id: "K3", nama: "Higiene operator & APD", batasKritis: "APD lengkap, hand washing, tidak ada luka terbuka", bobot: 0.15 },
    { id: "K4", nama: "Kebersihan peralatan masak", batasKritis: "wajan/panci bersih, ATP < 50 RLU, bebas bahan kimia", bobot: 0.20 },
    { id: "K5", nama: "Pemisahan & anti-cross-contamination", batasKritis: "meja berbeda per kategori, tidak campur alergen", bobot: 0.20 }
  ],
  T4: [
    { id: "K1", nama: "Suhu makanan saat pengemasan", batasKritis: "≥ 60°C (hot hold), ≤ 4°C (cold hold)", bobot: 0.25 },
    { id: "K2", nama: "Integritas & keamanan kemasan", batasKritis: "food-grade, sealed rapat, tidak ada kebocoran", bobot: 0.20 },
    { id: "K3", nama: "Higiene area pengemasan & labeling", batasKritis: "ATP < 30 RLU, label: nama, tgl, isi, allergen", bobot: 0.15 },
    { id: "K4", nama: "Kecepatan pengemasan & minimalisir delay", batasKritis: "pengemasan < 10 menit setelah masak, hot box ready", bobot: 0.20 },
    { id: "K5", nama: "Penyimpanan sementara hingga kirim", batasKritis: "holding time < 30 menit, suhu terjaga, terlindung", bobot: 0.20 }
  ],
  T5: [
    { id: "K1", nama: "Suhu dalam transport & cold chain", batasKritis: "≥ 60°C (hot box) / ≤ 8°C (cold box), konsisten", bobot: 0.25 },
    { id: "K2", nama: "Lama perjalanan & jarak kritis", batasKritis: "≤ 2 jam Cianjur-satelit, ≤ 1.5 jam lokal", bobot: 0.20 },
    { id: "K3", nama: "Kondisi kendaraan & kebersihan", batasKritis: "kabin tertutup, bersih, tidak bau, terpisah dari limbah", bobot: 0.15 },
    { id: "K4", nama: "Monitoring suhu & kondisi kemasan", batasKritis: "thermometer aktif, packaging utuh, tidak tumpah", bobot: 0.20 },
    { id: "K5", nama: "Pengemudi & protokol keselamatan pangan", batasKritis: "APD, tidak makan/merokok di kendaraan, rute jelas", bobot: 0.20 }
  ],
  T6: [
    { id: "K1", nama: "Suhu saat diterima sekolah/posyandu", batasKritis: "≥ 55°C (hot) / ≤ 6°C (cold)", bobot: 0.25 },
    { id: "K2", nama: "Ketepatan waktu vs jadwal", batasKritis: "± 10 menit dari jadwal, tidak terlambat > 30 menit", bobot: 0.20 },
    { id: "K3", nama: "Kondisi fisik makanan & kemasan", batasKritis: "tidak tumpah, kemasan utuh, tidak ada kontaminasi", bobot: 0.15 },
    { id: "K4", nama: "Penerimaan & verifikasi kuantitas", batasKritis: "jumlah sesuai invoice, tidak ada yang hilang/rusak", bobot: 0.20 },
    { id: "K5", nama: "Tata cara serah terima & dokumentasi", batasKritis: "tanda tangan, foto, log intake dicatat dengan lengkap", bobot: 0.20 }
  ]
};

// Default skor EWS hari ini (5 kriteria per tahap)
const EWS_HARIINI = {
  T1: { skor: [4,5,5,4,4], aktif: true,  alert: 1, batches: 12, lulus: 11 },
  T2: { skor: [5,4,5,4,4], aktif: true,  alert: 0, batches: 8,  lulus: 8  },
  T3: { skor: [4,3,4,4,3], aktif: true,  alert: 2, batches: 6,  lulus: 4  },
  T4: { skor: [5,5,5,4,5], aktif: true,  alert: 0, batches: 10, lulus: 10 },
  T5: { skor: [3,4,3,4,3], aktif: true,  alert: 3, batches: 14, lulus: 11 },
  T6: { skor: [4,5,4,5,4], aktif: true,  alert: 1, batches: 22, lulus: 21 }
};

// Sekolah/Posyandu penerima — DAPUR INDUK CIANJUR (skala besar, 3000 porsi/hari)
const SEKOLAH_INDUK = [
  { id: "SI01", nama: "SMAN 1 Cianjur", siswa: 587, segmen: "Siswa SMA", status: "diterima", waktu: "09:18" },
  { id: "SI02", nama: "SMAN 2 Cianjur", siswa: 520, segmen: "Siswa SMA", status: "diterima", waktu: "09:22" },
  { id: "SI03", nama: "SMPN 1 Cianjur", siswa: 513, segmen: "Siswa SMP", status: "diterima", waktu: "09:32" },
  { id: "SI04", nama: "SMPN 2 Cianjur", siswa: 448, segmen: "Siswa SMP", status: "diterima", waktu: "09:28" },
  { id: "SI05", nama: "SDN Cianjur 01", siswa: 396, segmen: "Siswa SD", status: "diterima", waktu: "09:42" },
  { id: "SI06", nama: "SDN Cugenang 02", siswa: 386, segmen: "Siswa SD", status: "diterima", waktu: "09:48" },
  { id: "SI07", nama: "Posyandu Cianjur Pusat", siswa: 86, segmen: "Anak Balita", status: "diterima", waktu: "08:50" },
  { id: "SI08", nama: "Posyandu Kasih Ibu", siswa: 61, segmen: "Ibu Hamil & Menyusui", status: "diterima", waktu: "08:55" }
];

// Sekolah penerima — DAPUR SATELIT CIANJUR (skala sedang, 2000 porsi/hari)
const SEKOLAH_SATELIT = [
  { id: "SS01", nama: "SDN Cianjur 03", siswa: 260, segmen: "Siswa SD", status: "diterima", waktu: "09:38" },
  { id: "SS02", nama: "SDN Cidaun 02", siswa: 270, segmen: "Siswa SD", status: "diterima", waktu: "09:55" },
  { id: "SS03", nama: "SDN Cipanas 01", siswa: 240, segmen: "Siswa SD", status: "delay", waktu: "—" },
  { id: "SS04", nama: "SDN Warungkondang 01", siswa: 195, segmen: "Siswa SD", status: "diterima", waktu: "09:42" },
  { id: "SS05", nama: "SDN Warungkondang 03", siswa: 190, segmen: "Siswa SD", status: "diterima", waktu: "09:38" },
  { id: "SS06", nama: "SDN Pabuaran 01", siswa: 175, segmen: "Siswa SD", status: "diterima", waktu: "09:55" },
  { id: "SS07", nama: "SDN Pabuaran 02", siswa: 155, segmen: "Siswa SD", status: "delay", waktu: "—" },
  { id: "SS08", nama: "TK Cinta Baca", siswa: 145, segmen: "TK/PAUD/RA", status: "diterima", waktu: "09:05" },
  { id: "SS09", nama: "TK Bunga Mawar", siswa: 95, segmen: "TK/PAUD/RA", status: "diterima", waktu: "09:08" },
  { id: "SS10", nama: "PAUD Bintang Baru", siswa: 88, segmen: "TK/PAUD/RA", status: "diterima", waktu: "09:08" },
  { id: "SS11", nama: "Posyandu Merdeka", siswa: 62, segmen: "Ibu Hamil & Menyusui", status: "diterima", waktu: "08:45" },
  { id: "SS12", nama: "Posyandu Harapan", siswa: 75, segmen: "Anak Balita", status: "diterima", waktu: "08:52" },
  { id: "SS13", nama: "Posyandu Sejahtera", siswa: 48, segmen: "Anak Balita", status: "diterima", waktu: "08:55" }
];

const SEKOLAH = SEKOLAH_INDUK; // legacy default

// Alert EWS aktif (Cianjur)
const ALERTS_AKTIF = [
  { id: "A01", tahap: "T5", judul: "Suhu transport turun di rute Cianjur-Cipanas", level: "warn", waktu: "08:42", komoditas: "Nasi + Lauk", aksi: "Cek cold-chain di kendaraan, reroute ke lokasi terdekat" },
  { id: "A02", tahap: "T3", judul: "Suhu masak inti rendah di Dapur Induk Cianjur Pusat", level: "danger", waktu: "06:18", komoditas: "Ayam Goreng", aksi: "Re-cook, hold batch sampai suhu ≥75°C" },
  { id: "A03", tahap: "T6", judul: "Keterlambatan distribusi SDN Cipanas 01", level: "warn", waktu: "09:55", komoditas: "Semua menu", aksi: "Hubungi driver, cek GPS tracking, notifikasi sekolah" },
  { id: "A04", tahap: "T1", judul: "Bayam dari supplier Cidaun visual layu", level: "warn", waktu: "05:24", komoditas: "Bayam Cidaun", aksi: "Reject lot, aktifkan supplier backup Warungkondang" }
];

// Menu rekomendasi minggu
const MENU_MINGGU = [
  { hari: "Senin",  menu: "Nasi + Ayam Bumbu Kuning + Tumis Bayam + Pisang + Susu",  kal: 685, prot: 28.4, biaya: 9800, status: "feasible" },
  { hari: "Selasa", menu: "Nasi + Ikan Goreng + Tahu Tempe Bacem + Sup Wortel + Pepaya", kal: 712, prot: 31.2, biaya: 9600, status: "feasible" },
  { hari: "Rabu",   menu: "Nasi + Telur Balado + Tumis Kangkung + Tempe Orek + Pisang", kal: 668, prot: 24.1, biaya: 8900, status: "feasible" },
  { hari: "Kamis",  menu: "Nasi + Ayam Suwir + Capcay + Tahu Goreng + Jeruk", kal: 695, prot: 29.8, biaya: 9400, status: "feasible" },
  { hari: "Jumat",  menu: "Nasi + Sosis Sapi + Bayam + Telur Dadar + Susu UHT", kal: 720, prot: 30.5, biaya: 9900, status: "tight" }
];

// === Menu Optimization data (mengikuti referensi MenuOptimizationPage.tsx) ===
const NUTRISI_PRESETS = [
  { label: "TK/PAUD/RA",      energi: 328,   protein: 20.50, lemak: 8.64,  karbo: 17.14, gram: 250 },
  { label: "Siswa SD (1-3)",  energi: 368.8, protein: 21.30, lemak: 9.88,  karbo: 18.53, gram: 300 },
  { label: "Siswa SD (4-6)",  energi: 531,   protein: 43.94, lemak: 18.23, karbo: 41.15, gram: 400 },
  { label: "Siswa SMP",       energi: 719,   protein: 62.55, lemak: 24.53, karbo: 55.36, gram: 500 },
  { label: "Siswa SMA",       energi: 762.5, protein: 69.39, lemak: 26.26, karbo: 57.95, gram: 550 },
  { label: "Ibu Hamil",       energi: 818,   protein: 82.62, lemak: 29.18, karbo: 65.24, gram: 600 },
  { label: "Ibu Menyusui",    energi: 818,   protein: 108.18, lemak: 29.27, karbo: 62.99, gram: 620 },
  { label: "Anak Balita",     energi: 342,   protein: 40.19, lemak: 7.98,  karbo: 17.10, gram: 280 }
];

// Per-100g nutrient + biaya per gram (referensi MenuOptimizationPage)
const MENU_DB = {
  carbohydrate: [
    { nama: "Nasi Putih",       p: 2.7,  l: 0.3, k: 28.2, s: 0.4, biayaPerG: 15, gMin: 80,  gMax: 250 },
    { nama: "Nasi Merah",       p: 2.6,  l: 0.9, k: 23.0, s: 1.8, biayaPerG: 22, gMin: 80,  gMax: 250 },
    { nama: "Mie Telur",        p: 5.0,  l: 1.2, k: 25.0, s: 1.2, biayaPerG: 30, gMin: 60,  gMax: 200 },
    { nama: "Roti Gandum",      p: 9.0,  l: 3.5, k: 41.0, s: 6.0, biayaPerG: 45, gMin: 40,  gMax: 150 }
  ],
  proteinAnimal: [
    { nama: "Ayam Goreng",      p: 27.0, l: 14.0, k: 0,   s: 0,   biayaPerG: 85, gMin: 30, gMax: 100 },
    { nama: "Ikan Goreng",      p: 22.0, l: 10.0, k: 0,   s: 0,   biayaPerG: 95,  gMin: 30, gMax: 100 },
    { nama: "Telur Dadar",      p: 10.5, l: 11.0, k: 1.1, s: 0,   biayaPerG: 40,  gMin: 30, gMax: 80 },
    { nama: "Daging Sapi Suwir", p: 26.0, l: 15.0, k: 0,  s: 0,   biayaPerG: 110, gMin: 25, gMax: 80 }
  ],
  proteinPlant: [
    { nama: "Tempe Orek",       p: 18.0, l: 11.0, k: 9.0,  s: 7.0, biayaPerG: 28, gMin: 25, gMax: 80 },
    { nama: "Tahu Bacem",       p: 12.0, l: 8.0,  k: 1.9,  s: 1.2, biayaPerG: 32, gMin: 25, gMax: 80 }
  ],
  vegetable: [
    { nama: "Tumis Bayam",      p: 2.9,  l: 0.4,  k: 3.6,  s: 2.2, biayaPerG: 18, gMin: 40, gMax: 100 },
    { nama: "Sup Wortel",       p: 0.9,  l: 0.2,  k: 9.6,  s: 2.8, biayaPerG: 16, gMin: 40, gMax: 100 },
    { nama: "Capcay",           p: 1.6,  l: 0.3,  k: 5.5,  s: 2.4, biayaPerG: 22, gMin: 40, gMax: 100 },
    { nama: "Tumis Kangkung",   p: 2.6,  l: 0.4,  k: 3.1,  s: 2.0, biayaPerG: 17, gMin: 40, gMax: 100 }
  ],
  fruit: [
    { nama: "Pisang",           p: 1.1,  l: 0.3,  k: 22.8, s: 2.6, biayaPerG: 12, gMin: 50, gMax: 150 },
    { nama: "Jeruk",            p: 0.9,  l: 0.1,  k: 11.7, s: 2.4, biayaPerG: 14, gMin: 50, gMax: 150 },
    { nama: "Pepaya",           p: 0.5,  l: 0.1,  k: 10.8, s: 1.8, biayaPerG: 10, gMin: 50, gMax: 150 }
  ],
  snack: [
    { nama: "Biskuit",          p: 7.0,  l: 12.0, k: 65.0, s: 2.0, biayaPerG: 35, gMin: 15, gMax: 40 },
    { nama: "Kacang Rebus",     p: 8.0,  l: 6.0,  k: 13.0, s: 8.0, biayaPerG: 25, gMin: 15, gMax: 40 }
  ]
};

// EWS data per komoditas (T1 & T2 — penerimaan & penyimpanan, terikat bahan baku)
const EWS_KOMODITAS_LIST = ["Ayam Karkas", "Sayur Kangkung", "Beras"];
const EWS_DATA_KOMODITAS = {
  T1: {
    "Ayam Karkas":   { skor: [4,5,5,4,4], aktif: true, alert: 1, batches: 14, lulus: 13, batasOverride: { K1: "≤ 4°C (rantai dingin)" } },
    "Sayur Kangkung":{ skor: [3,4,5,3,4], aktif: true, alert: 2, batches: 18, lulus: 15, batasOverride: { K1: "≤ 10°C (chilled)" } },
    "Beras":         { skor: [5,5,5,5,4], aktif: true, alert: 0, batches: 8,  lulus: 8,  batasOverride: { K1: "ambient kering ≤ 25°C" } }
  },
  T2: {
    "Ayam Karkas":   { skor: [5,4,4,5,5], aktif: true, alert: 0, batches: 10, lulus: 10, batasOverride: { K1: "-18°C (frozen)" } },
    "Sayur Kangkung":{ skor: [3,3,2,4,4], aktif: true, alert: 2, batches: 12, lulus: 9,  batasOverride: { K1: "0–4°C, lama ≤ 36 jam" } },
    "Beras":         { skor: [5,5,4,5,5], aktif: true, alert: 0, batches: 6,  lulus: 6,  batasOverride: { K1: "RH 60–70%, ambient" } }
  }
};

// ===== SMART AGRO FOOD COLLECTION CENTER EWS (Keamanan Pangan — Preprocessing & Receiving) =====
const AGRO_EWS_TAHAPAN = [
  { idx: 1, fase: "bahan", id: "A1", nama: "Penerimaan dari Petani", deskripsi: "Penilaian kondisi awal dari petani/supplier lokal" },
  { idx: 2, fase: "bahan", id: "A2", nama: "Inspeksi & Grading", deskripsi: "Pemeriksaan kualitas & sorting grade" },
  { idx: 3, fase: "bahan", id: "A3", nama: "Preprocessing", deskripsi: "Cuci, potong, dan persiapan bahan" },
  { idx: 4, fase: "bahan", id: "A4", nama: "Penyimpanan Sementara", deskripsi: "Cold/dry storage sebelum pengiriman ke dapur" },
  { idx: 5, fase: "bahan", id: "A5", nama: "Persiapan Pengiriman", deskripsi: "Packaging & loading untuk pengiriman ke dapur" },
  { idx: 6, fase: "bahan", id: "A6", nama: "Pengiriman ke Dapur", deskripsi: "Kondisi bahan selama transportasi ke dapur" }
];

// EWS SAFCC per tahap (skoring 1-5, 5=baik) — 5 kriteria per tahapan
const AGRO_EWS_KRITERIA = {
  A1: [
    { id: "K1", nama: "Kondisi visual & kesegaran", batasKritis: "Tidak layu/busuk, warna cerah, tekstur normal", bobot: 0.20 },
    { id: "K2", nama: "Dokumentasi & identifikasi petani", batasKritis: "Nama petani, tgl panen, lokasi teridentifikasi", bobot: 0.15 },
    { id: "K3", nama: "Suhu saat pickup & rantai dingin", batasKritis: "Dingin ≤ 4°C / Chilled ≤ 10°C / Ambient ≤ 25°C", bobot: 0.20 },
    { id: "K4", nama: "Integritas wadah & kebersihan", batasKritis: "Wadah bersih, rapi, tidak bocor atau terkontaminasi", bobot: 0.15 },
    { id: "K5", nama: "Sertifikat & standar kesehatan", batasKritis: "Sertifikat halal/kesehatan ada, label jelas", bobot: 0.30 }
  ],
  A2: [
    { id: "K1", nama: "Hasil grading & kualitas uniformitas", batasKritis: "Grade A/B minimal, ukuran seragam, tidak Grade C", bobot: 0.25 },
    { id: "K2", nama: "Kontaminasi visible & kebesihan", batasKritis: "Bebas kotoran, debu, serangga, tanah, atau darah", bobot: 0.20 },
    { id: "K3", nama: "Integritas kemasan awal & kondisi", batasKritis: "Kemasan tidak rusak, bocor, atau terlepas", bobot: 0.15 },
    { id: "K4", nama: "Timbang & verifikasi berat/jumlah", batasKritis: "Berat akurat ±2%, tidak ada kehilangan", bobot: 0.20 },
    { id: "K5", nama: "Identifikasi & lot numbering", batasKritis: "Lot number tercatat, tanggal validitas jelas", bobot: 0.20 }
  ],
  A3: [
    { id: "K1", nama: "Sanitasi & ATP peralatan preprocessing", batasKritis: "ATP < 30 RLU setelah swab, tools steril", bobot: 0.25 },
    { id: "K2", nama: "Efektivitas pencucian & rinsing", batasKritis: "Bebas kotoran, pestisida residue, tanah, atau darah", bobot: 0.20 },
    { id: "K3", nama: "Suhu & kelembaban area kerja", batasKritis: "Suhu ≤ 20°C, RH 60–75%, ventilasi cukup", bobot: 0.15 },
    { id: "K4", nama: "Higiene operator & APD", batasKritis: "APD lengkap, hand washing, tidak ada luka terbuka", bobot: 0.20 },
    { id: "K5", nama: "Segregasi & anti-cross-contamination", batasKritis: "Area terpisah per jenis, tidak campur alergen", bobot: 0.20 }
  ],
  A4: [
    { id: "K1", nama: "Suhu penyimpanan & stabilitas", batasKritis: "Dingin: 0–4°C / Frozen: ≤ -18°C / Ambient: ≤ 18°C", bobot: 0.25 },
    { id: "K2", nama: "Kontrol kelembaban relatif", batasKritis: "RH 60–75% (variasi ±5%), tidak ada kondensasi", bobot: 0.20 },
    { id: "K3", nama: "Segregasi & FIFO labeling", batasKritis: "Label: nama, tanggal, lot, T°C, FIFO diterapkan", bobot: 0.15 },
    { id: "K4", nama: "Kebersihan & pest control storage", batasKritis: "ATP < 30 RLU, tidak ada serangga/rodent sign", bobot: 0.20 },
    { id: "K5", nama: "Monitoring suhu & log catatan", batasKritis: "Log suhu harian dicatat, gap ≤ 1°C dari set point", bobot: 0.20 }
  ],
  A5: [
    { id: "K1", nama: "Integritas kemasan pengiriman", batasKritis: "Kemasan food-grade, bersih, seal rapat, tidak cacat", bobot: 0.20 },
    { id: "K2", nama: "Setup & aktivasi cold chain", batasKritis: "Pendingin aktif dicek sebelum loading, suhu stabil", bobot: 0.20 },
    { id: "K3", nama: "Kelengkapan dokumentasi serah-terima", batasKritis: "Invoice, manifest, sertifikat, temperature log lengkap", bobot: 0.20 },
    { id: "K4", nama: "Loading & packing procedure", batasKritis: "Produk ditata rapi, tidak menekan, stabilitas terjaga", bobot: 0.15 },
    { id: "K5", nama: "Identifikasi lot & destination label", batasKritis: "Label tujuan jelas, lot teridentifikasi, tanggal tercatat", bobot: 0.25 }
  ],
  A6: [
    { id: "K1", nama: "Maintenance suhu transport konsisten", batasKritis: "Dingin ≤ 8°C / Frozen ≤ -12°C / Ambient ≤ 25°C", bobot: 0.25 },
    { id: "K2", nama: "Waktu transit & rute efisiensi", batasKritis: "Lokal Cianjur ≤ 2 jam, rute tepat, tidak berhenti lama", bobot: 0.20 },
    { id: "K3", nama: "Kondisi kendaraan & kebersihan", batasKritis: "Kabin bersih, tertutup, tidak bau, terpisah limbah", bobot: 0.15 },
    { id: "K4", nama: "Monitoring suhu & thermometer aktif", batasKritis: "Thermometer berfungsi, pencatatan transit, no gap", bobot: 0.20 },
    { id: "K5", nama: "Protokol keselamatan pengemudi", batasKritis: "Tidak makan/merokok, APD, temperatur log dicek", bobot: 0.20 }
  ]
};

// Default skor SAFCC EWS hari ini (5 kriteria per tahap)
const AGRO_EWS_HARIINI = {
  A1: { skor: [4,5,4,4,5], aktif: true, alert: 1, batches: 18, lulus: 16 },
  A2: { skor: [5,4,4,4,5], aktif: true, alert: 1, batches: 16, lulus: 15 },
  A3: { skor: [4,4,5,4,4], aktif: true, alert: 0, batches: 15, lulus: 15 },
  A4: { skor: [5,4,5,4,4], aktif: true, alert: 0, batches: 12, lulus: 12 },
  A5: { skor: [4,5,5,4,5], aktif: true, alert: 1, batches: 14, lulus: 13 },
  A6: { skor: [3,4,4,4,4], aktif: true, alert: 2, batches: 14, lulus: 12 }
};

// SAFCC EWS commodity list (8 komoditas utama)
const AGRO_EWS_KOMODITAS_LIST = ["Ayam Karkas", "Sayur Kangkung", "Beras", "Telur Ayam", "Wortel", "Tahu", "Tempe", "Minyak Goreng"];

// SAFCC EWS data per komoditas — detailed & realistic (5 kriteria per tahap)
const AGRO_EWS_DATA_KOMODITAS = {
  A1: {
    "Ayam Karkas":   { skor: [5,5,4,4,5], aktif: true, alert: 0, batches: 6, lulus: 6, batasOverride: { K3: "Rantai dingin ≤ 4°C" } },
    "Sayur Kangkung":{ skor: [3,5,4,4,4], aktif: true, alert: 1, batches: 8, lulus: 7, batasOverride: { K3: "Chilled ≤ 10°C" } },
    "Beras":         { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K3: "Ambient ≤ 28°C, RH ≤ 80%" } },
    "Telur Ayam":    { skor: [4,5,4,5,4], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K3: "Ambient 15–25°C" } },
    "Wortel":        { skor: [4,4,3,4,3], aktif: true, alert: 1, batches: 6, lulus: 5, batasOverride: { K3: "Chilled 5–10°C" } },
    "Tahu":          { skor: [5,4,4,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K3: "Dingin ≤ 5°C" } },
    "Tempe":         { skor: [4,4,3,4,3], aktif: true, alert: 1, batches: 5, lulus: 4, batasOverride: { K3: "Ambient 18–25°C" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K3: "Ambient tertutup ≤ 30°C" } }
  },
  A2: {
    "Ayam Karkas":   { skor: [5,4,5,5,5], aktif: true, alert: 0, batches: 6, lulus: 6, batasOverride: { K1: "Grade A (warna merah, tidak bintik)" } },
    "Sayur Kangkung":{ skor: [3,4,4,4,3], aktif: true, alert: 1, batches: 8, lulus: 7, batasOverride: { K1: "Grade A (tidak layu, tekstur kuat)" } },
    "Beras":         { skor: [5,5,4,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "Grade A (utuh ≥95%, bersih)" } },
    "Telur Ayam":    { skor: [5,5,4,5,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K1: "Grade A (tidak retak, kulit bersih)" } },
    "Wortel":        { skor: [4,4,3,4,4], aktif: true, alert: 1, batches: 6, lulus: 5, batasOverride: { K1: "Grade A (tidak busuk, size 15–25g)" } },
    "Tahu":          { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "Grade A (kuat, tidak pecah, putih bersih)" } },
    "Tempe":         { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K1: "Grade A (permukaan rapi, tidak lembek)" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K1: "Grade A (jernih, tidak keruh)" } }
  },
  A3: {
    "Ayam Karkas":   { skor: [5,5,4,4,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K2: "Potong rapi, tanpa kontaminasi feses" } },
    "Sayur Kangkung":{ skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 7, lulus: 7, batasOverride: { K2: "Cuci bersih, hapus akar, tidak ada tanah" } },
    "Beras":         { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K2: "Pilah batu/sekam, dicuci hingga jernih" } },
    "Telur Ayam":    { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K2: "Cuci lembut, tidak perlu preprocessing khusus" } },
    "Wortel":        { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 6, lulus: 6, batasOverride: { K2: "Kupas kulit, potong ukuran seragam" } },
    "Tahu":          { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K2: "Tiriskan cairan, potong sesuai kebutuhan" } },
    "Tempe":         { skor: [4,4,3,4,3], aktif: true, alert: 0, batches: 4, lulus: 3, batasOverride: { K2: "Potong, rendam air garam jika diperlukan" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K2: "Tidak perlu preprocessing, siap pakai" } }
  },
  A4: {
    "Ayam Karkas":   { skor: [5,4,5,4,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K1: "-18°C freezer, segregasi per supplier" } },
    "Sayur Kangkung":{ skor: [3,4,4,3,4], aktif: true, alert: 1, batches: 6, lulus: 5, batasOverride: { K1: "0–4°C chiller, max 24 jam" } },
    "Beras":         { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "Ambient 18–25°C, RH 65–70%, tertutup" } },
    "Telur Ayam":    { skor: [4,5,5,5,4], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K1: "Ambient 15–20°C, tempat gelap" } },
    "Wortel":        { skor: [3,4,4,3,4], aktif: true, alert: 1, batches: 5, lulus: 4, batasOverride: { K1: "5–10°C, RH 80–90%, max 36 jam" } },
    "Tahu":          { skor: [4,4,5,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "4°C chiller, dalam air bersih atau vacuum" } },
    "Tempe":         { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "18–22°C, RH sedang, max 48 jam" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K1: "Ambient 20–28°C, tempat kering tertutup" } }
  },
  A5: {
    "Ayam Karkas":   { skor: [5,5,5,4,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K2: "Styrofoam + ice pack, seal rapat" } },
    "Sayur Kangkung":{ skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 6, lulus: 6, batasOverride: { K2: "Plastik berlapis, ice pack ringan" } },
    "Beras":         { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K2: "Karton kedap, tertutup rapat" } },
    "Telur Ayam":    { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K2: "Karton egg crate, bantalan foam" } },
    "Wortel":        { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 6, lulus: 6, batasOverride: { K2: "Plastik perforasi, ice pack" } },
    "Tahu":          { skor: [4,5,5,4,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K2: "Styrofoam, ice pack cukup" } },
    "Tempe":         { skor: [4,4,4,4,4], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K2: "Kardus berlapis, ventilasi" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K2: "Kardus/plastik tertutup, tidak perlu pendingin" } }
  },
  A6: {
    "Ayam Karkas":   { skor: [4,4,4,4,4], aktif: true, alert: 1, batches: 5, lulus: 4, batasOverride: { K1: "-15°C ≤ suhu transit ≤ -12°C" } },
    "Sayur Kangkung":{ skor: [3,3,3,3,3], aktif: true, alert: 2, batches: 6, lulus: 4, batasOverride: { K1: "3°C ≤ suhu ≤ 8°C" } },
    "Beras":         { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 4, lulus: 4, batasOverride: { K1: "Ambient 20–28°C (tidak penting, stabil)" } },
    "Telur Ayam":    { skor: [4,5,4,5,4], aktif: true, alert: 0, batches: 5, lulus: 5, batasOverride: { K1: "15–20°C transit, jaga getaran rendah" } },
    "Wortel":        { skor: [3,3,3,3,3], aktif: true, alert: 1, batches: 6, lulus: 5, batasOverride: { K1: "6°C ≤ suhu ≤ 12°C" } },
    "Tahu":          { skor: [4,4,4,4,3], aktif: true, alert: 1, batches: 4, lulus: 3, batasOverride: { K1: "3°C ≤ suhu ≤ 6°C" } },
    "Tempe":         { skor: [3,4,4,4,3], aktif: true, alert: 1, batches: 4, lulus: 3, batasOverride: { K1: "18–24°C, hindari lembab" } },
    "Minyak Goreng": { skor: [5,5,5,5,5], aktif: true, alert: 0, batches: 2, lulus: 2, batasOverride: { K1: "Ambient 20–30°C (tidak kritis)" } }
  }
};

// SAFCC EWS Alerts (realistic untuk Cianjur)
const AGRO_ALERTS_AKTIF = [
  { id: "AG01", tahap: "A1", judul: "Wortel dari Cipanas suhu pickup 12°C (melebihi target)", level: "warn", waktu: "05:30", komoditas: "Wortel", aksi: "Verifikasi cold chain kendaraan pickup, tambah ice pack" },
  { id: "AG02", tahap: "A3", judul: "ATP swab peralatan preprocessing 45 RLU (>30)", level: "warn", waktu: "06:45", komoditas: "Sayur Kangkung", aksi: "Re-sanitasi peralatan dengan klorin 200ppm, swab ulang" },
  { id: "AG03", tahap: "A4", judul: "Chiller sayuran suhu naik 6°C (sensor error?)", level: "danger", waktu: "07:15", komoditas: "Kangkung & Wortel", aksi: "Cek kondensor chiller, maintenance darurat, transfer ke chiller backup" },
  { id: "AG04", tahap: "A6", judul: "Kendaraan distribusi Cianjur-Warungkondang AC mati", level: "danger", waktu: "08:20", komoditas: "Ayam Karkas, Tahu", aksi: "Tukar kendaraan sebelum loading, pastikan AC aktif sebelum berangkat" }
];

// ===== Supplier Kelompok Tani Data =====

// Individual farmers (petani) - expanded untuk 12 kelompok tani
const PETANI_LIST = [
  // KT01 - Kangkung & Wortel (Cidaun)
  { id: "P001", nama: "Bapak Asep Supriatna", nik: "3203xxxx", umur: 48, kelompok: "KT01", komoditas: ["Sayur Kangkung"], lokasi: "Cidaun, Cianjur", lahan: "1.2 ha", gps: "-6.9821, 107.1234", pengalaman: 22, sertifikasi: ["GAP Sayuran"], kontak: "0812-xxxx-1234", status: "aktif" },
  { id: "P002", nama: "Ibu Siti Nurhaliza", nik: "3203xxxx", umur: 52, kelompok: "KT01", komoditas: ["Sayur Kangkung"], lokasi: "Cidaun, Cianjur", lahan: "0.8 ha", gps: "-6.9834, 107.1201", pengalaman: 18, sertifikasi: ["GAP Sayuran"], kontak: "0813-xxxx-5678", status: "aktif" },
  { id: "P003", nama: "Bapak Hendra Gunawan", nik: "3203xxxx", umur: 45, kelompok: "KT01", komoditas: ["Wortel"], lokasi: "Cidaun, Cianjur", lahan: "1.5 ha", gps: "-6.9845, 107.1178", pengalaman: 20, sertifikasi: ["GAP Sayuran"], kontak: "0814-xxxx-9012", status: "aktif" },
  { id: "P004", nama: "Bapak Sukarno Wijaya", nik: "3203xxxx", umur: 55, kelompok: "KT01", komoditas: ["Sayur Kangkung"], lokasi: "Cidaun, Cianjur", lahan: "0.9 ha", gps: "-6.9843, 107.1156", pengalaman: 25, sertifikasi: ["GAP Sayuran"], kontak: "0815-xxxx-3456", status: "aktif" },

  // KT02 - Kangkung (Cipanas)
  { id: "P005", nama: "Ibu Nenden Nurhasanah", nik: "3203xxxx", umur: 44, kelompok: "KT02", komoditas: ["Sayur Kangkung"], lokasi: "Cipanas, Cianjur", lahan: "1.1 ha", gps: "-6.9901, 107.1445", pengalaman: 16, sertifikasi: ["GAP Sayuran"], kontak: "0816-xxxx-4567", status: "aktif" },
  { id: "P006", nama: "Bapak Rudi Hermanto", nik: "3203xxxx", umur: 50, kelompok: "KT02", komoditas: ["Sayur Kangkung"], lokasi: "Cipanas, Cianjur", lahan: "1.3 ha", gps: "-6.9915, 107.1489", pengalaman: 24, sertifikasi: ["GAP Sayuran"], kontak: "0817-xxxx-5678", status: "aktif" },
  { id: "P007", nama: "Bapak Trisno Wibowo", nik: "3203xxxx", umur: 43, kelompok: "KT02", komoditas: ["Sayur Kangkung"], lokasi: "Cipanas, Cianjur", lahan: "0.9 ha", gps: "-6.9927, 107.1512", pengalaman: 14, sertifikasi: ["GAP Sayuran"], kontak: "0818-xxxx-6789", status: "aktif" },
  { id: "P008", nama: "Ibu Yuni Setiawati", nik: "3203xxxx", umur: 46, kelompok: "KT02", komoditas: ["Sayur Kangkung"], lokasi: "Cipanas, Cianjur", lahan: "0.7 ha", gps: "-6.9901, 107.1523", pengalaman: 13, sertifikasi: [], kontak: "0819-xxxx-7890", status: "aktif" },
  { id: "P009", nama: "Bapak Ismail Marzuki", nik: "3203xxxx", umur: 51, kelompok: "KT02", komoditas: ["Sayur Kangkung"], lokasi: "Cipanas, Cianjur", lahan: "1.0 ha", gps: "-6.9889, 107.1478", pengalaman: 19, sertifikasi: ["GAP Sayuran"], kontak: "0820-xxxx-8901", status: "aktif" },

  // KT03 - Kangkung/Wortel/Bayam (Cilimus)
  { id: "P010", nama: "Bapak Hermawan Suryanto", nik: "3203xxxx", umur: 56, kelompok: "KT03", komoditas: ["Sayur Kangkung", "Wortel"], lokasi: "Cilimus, Cianjur", lahan: "2.0 ha", gps: "-6.9756, 107.1367", pengalaman: 28, sertifikasi: ["GAP Sayuran", "Sertifikat Organik"], kontak: "0821-xxxx-9012", status: "aktif" },
  { id: "P011", nama: "Ibu Rina Dwi Astuti", nik: "3203xxxx", umur: 48, kelompok: "KT03", komoditas: ["Sayur Kangkung", "Bayam"], lokasi: "Cilimus, Cianjur", lahan: "1.5 ha", gps: "-6.9734, 107.1389", pengalaman: 20, sertifikasi: ["Sertifikat Organik"], kontak: "0822-xxxx-0123", status: "aktif" },
  { id: "P012", nama: "Bapak Dino Prasetyo", nik: "3203xxxx", umur: 49, kelompok: "KT03", komoditas: ["Wortel", "Bayam"], lokasi: "Cilimus, Cianjur", lahan: "1.3 ha", gps: "-6.9712, 107.1401", pengalaman: 15, sertifikasi: ["Sertifikat Organik"], kontak: "0823-xxxx-1234", status: "aktif" },
  { id: "P013", nama: "Bapak Gunawan Wijaya", nik: "3203xxxx", umur: 53, kelompok: "KT03", komoditas: ["Sayur Kangkung"], lokasi: "Cilimus, Cianjur", lahan: "1.8 ha", gps: "-6.9745, 107.1334", pengalaman: 26, sertifikasi: ["GAP Sayuran"], kontak: "0824-xxxx-2345", status: "aktif" },
  { id: "P014", nama: "Ibu Sinta Nurmalasari", nik: "3203xxxx", umur: 44, kelompok: "KT03", komoditas: ["Bayam", "Wortel"], lokasi: "Cilimus, Cianjur", lahan: "1.1 ha", gps: "-6.9723, 107.1356", pengalaman: 12, sertifikasi: [], kontak: "0825-xxxx-3456", status: "aktif" },
  { id: "P015", nama: "Bapak Adi Kurniawan", nik: "3203xxxx", umur: 47, kelompok: "KT03", komoditas: ["Sayur Kangkung", "Wortel"], lokasi: "Cilimus, Cianjur", lahan: "1.4 ha", gps: "-6.9767, 107.1378", pengalaman: 18, sertifikasi: ["GAP Sayuran"], kontak: "0826-xxxx-4567", status: "aktif" },

  // KT04 - Kangkung (Agrabinta)
  { id: "P016", nama: "Bapak Dedi Sutrisno", nik: "3203xxxx", umur: 50, kelompok: "KT04", komoditas: ["Sayur Kangkung"], lokasi: "Agrabinta, Cianjur", lahan: "1.0 ha", gps: "-7.0123, 107.1267", pengalaman: 23, sertifikasi: ["GAP Sayuran"], kontak: "0827-xxxx-5678", status: "aktif" },
  { id: "P017", nama: "Bapak Topo Hermawan", nik: "3203xxxx", umur: 45, kelompok: "KT04", komoditas: ["Sayur Kangkung"], lokasi: "Agrabinta, Cianjur", lahan: "0.8 ha", gps: "-7.0145, 107.1289", pengalaman: 17, sertifikasi: [], kontak: "0828-xxxx-6789", status: "aktif" },
  { id: "P018", nama: "Ibu Tri Rahayu", nik: "3203xxxx", umur: 42, kelompok: "KT04", komoditas: ["Sayur Kangkung"], lokasi: "Agrabinta, Cianjur", lahan: "0.9 ha", gps: "-7.0156, 107.1234", pengalaman: 11, sertifikasi: [], kontak: "0829-xxxx-7890", status: "aktif" },
  { id: "P019", nama: "Bapak Samsul Arifin", nik: "3203xxxx", umur: 52, kelompok: "KT04", komoditas: ["Sayur Kangkung"], lokasi: "Agrabinta, Cianjur", lahan: "1.1 ha", gps: "-7.0134, 107.1256", pengalaman: 25, sertifikasi: ["GAP Sayuran"], kontak: "0830-xxxx-8901", status: "aktif" },

  // KT05 - Beras (Sukanagara)
  { id: "P020", nama: "Bapak Saripin", nik: "3203xxxx", umur: 58, kelompok: "KT05", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.5 ha", gps: "-7.0045, 107.0834", pengalaman: 30, sertifikasi: ["Sertifikat Organik"], kontak: "0831-xxxx-9012", status: "aktif" },
  { id: "P021", nama: "Bapak Haryono Sutrisno", nik: "3203xxxx", umur: 54, kelompok: "KT05", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.2 ha", gps: "-7.0067, 107.0912", pengalaman: 27, sertifikasi: ["Sertifikat Organik"], kontak: "0832-xxxx-0123", status: "aktif" },
  { id: "P022", nama: "Bapak Imam Santoso", nik: "3203xxxx", umur: 50, kelompok: "KT05", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.0 ha", gps: "-7.0089, 107.0756", pengalaman: 24, sertifikasi: ["Sertifikat Organik"], kontak: "0833-xxxx-1234", status: "aktif" },
  { id: "P023", nama: "Bapak Yusuf Wijaya", nik: "3203xxxx", umur: 49, kelompok: "KT05", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "1.8 ha", gps: "-7.0012, 107.0834", pengalaman: 19, sertifikasi: ["Sertifikat Organik"], kontak: "0834-xxxx-2345", status: "aktif" },
  { id: "P024", nama: "Ibu Suhartini", nik: "3203xxxx", umur: 47, kelompok: "KT05", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "1.5 ha", gps: "-7.0078, 107.0901", pengalaman: 16, sertifikasi: [], kontak: "0835-xxxx-3456", status: "aktif" },

  // KT06 - Beras (Cugenang)
  { id: "P025", nama: "Bapak Bambang Sutrisna", nik: "3203xxxx", umur: 60, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.8 ha", gps: "-6.9567, 107.0823", pengalaman: 32, sertifikasi: ["Sertifikat Organik"], kontak: "0836-xxxx-4567", status: "aktif" },
  { id: "P026", nama: "Bapak Mulyono Wijaya", nik: "3203xxxx", umur: 55, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.3 ha", gps: "-6.9589, 107.0756", pengalaman: 28, sertifikasi: ["Sertifikat Organik"], kontak: "0837-xxxx-5678", status: "aktif" },
  { id: "P027", nama: "Bapak Sugeng Riyanto", nik: "3203xxxx", umur: 52, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.1 ha", gps: "-6.9512, 107.0834", pengalaman: 25, sertifikasi: ["Sertifikat Organik"], kontak: "0838-xxxx-6789", status: "aktif" },
  { id: "P028", nama: "Ibu Endang Winarti", nik: "3203xxxx", umur: 48, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "1.9 ha", gps: "-6.9578, 107.0912", pengalaman: 20, sertifikasi: [], kontak: "0839-xxxx-7890", status: "aktif" },
  { id: "P029", nama: "Bapak Sudrajat Hermawan", nik: "3203xxxx", umur: 51, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.0 ha", gps: "-6.9545, 107.0789", pengalaman: 23, sertifikasi: ["Sertifikat Organik"], kontak: "0840-xxxx-8901", status: "aktif" },
  { id: "P030", nama: "Ibu Nurjani Sutrisno", nik: "3203xxxx", umur: 46, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "1.7 ha", gps: "-6.9567, 107.0867", pengalaman: 18, sertifikasi: [], kontak: "0841-xxxx-9012", status: "aktif" },
  { id: "P031", nama: "Bapak Darmawan Wijaya", nik: "3203xxxx", umur: 54, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.2 ha", gps: "-6.9534, 107.0812", pengalaman: 26, sertifikasi: ["Sertifikat Organik"], kontak: "0842-xxxx-0123", status: "aktif" },
  { id: "P032", nama: "Bapak Sutarso Suharno", nik: "3203xxxx", umur: 57, kelompok: "KT06", komoditas: ["Beras"], lokasi: "Cugenang, Cianjur", lahan: "2.4 ha", gps: "-6.9556, 107.0745", pengalaman: 29, sertifikasi: ["Sertifikat Organik"], kontak: "0843-xxxx-1234", status: "aktif" },

  // KT07 - Beras (Karangtengah)
  { id: "P033", nama: "Bapak Hendra Wijaya", nik: "3203xxxx", umur: 48, kelompok: "KT07", komoditas: ["Beras"], lokasi: "Karangtengah, Cianjur", lahan: "1.8 ha", gps: "-7.0234, 107.1178", pengalaman: 20, sertifikasi: [], kontak: "0844-xxxx-2345", status: "aktif" },
  { id: "P034", nama: "Bapak Solihin Gunawan", nik: "3203xxxx", umur: 45, kelompok: "KT07", komoditas: ["Beras"], lokasi: "Karangtengah, Cianjur", lahan: "1.5 ha", gps: "-7.0267, 107.1156", pengalaman: 17, sertifikasi: [], kontak: "0845-xxxx-3456", status: "aktif" },
  { id: "P035", nama: "Bapak Mahfud Rahman", nik: "3203xxxx", umur: 51, kelompok: "KT07", komoditas: ["Beras"], lokasi: "Karangtengah, Cianjur", lahan: "1.9 ha", gps: "-7.0245, 107.1201", pengalaman: 24, sertifikasi: [], kontak: "0846-xxxx-4567", status: "aktif" },
  { id: "P036", nama: "Ibu Suryani Lestari", nik: "3203xxxx", umur: 43, kelompok: "KT07", komoditas: ["Beras"], lokasi: "Karangtengah, Cianjur", lahan: "1.3 ha", gps: "-7.0278, 107.1134", pengalaman: 13, sertifikasi: [], kontak: "0847-xxxx-5678", status: "aktif" },

  // KT08 - Beras (Sukanagara)
  { id: "P037", nama: "Ibu Siti Mulyani", nik: "3203xxxx", umur: 56, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.6 ha", gps: "-7.0156, 107.0945", pengalaman: 28, sertifikasi: ["Sertifikat Organik", "SNI"], kontak: "0848-xxxx-6789", status: "aktif" },
  { id: "P038", nama: "Bapak Wahyono Sutrisno", nik: "3203xxxx", umur: 52, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.2 ha", gps: "-7.0178, 107.0867", pengalaman: 25, sertifikasi: ["Sertifikat Organik"], kontak: "0849-xxxx-7890", status: "aktif" },
  { id: "P039", nama: "Bapak Arif Suryanto", nik: "3203xxxx", umur: 49, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.0 ha", gps: "-7.0134, 107.0923", pengalaman: 21, sertifikasi: ["Sertifikat Organik"], kontak: "0850-xxxx-8901", status: "aktif" },
  { id: "P040", nama: "Bapak Bambang Irawan", nik: "3203xxxx", umur: 54, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.3 ha", gps: "-7.0167, 107.0801", pengalaman: 26, sertifikasi: ["Sertifikat Organik"], kontak: "0851-xxxx-9012", status: "aktif" },
  { id: "P041", nama: "Ibu Lilik Nurhaliza", nik: "3203xxxx", umur: 45, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "1.8 ha", gps: "-7.0145, 107.0878", pengalaman: 18, sertifikasi: [], kontak: "0852-xxxx-0123", status: "aktif" },
  { id: "P042", nama: "Bapak Sutirman Wijaya", nik: "3203xxxx", umur: 57, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.4 ha", gps: "-7.0189, 107.0934", pengalaman: 29, sertifikasi: ["Sertifikat Organik"], kontak: "0853-xxxx-1234", status: "aktif" },
  { id: "P043", nama: "Bapak Guntur Hermanto", nik: "3203xxxx", umur: 50, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.1 ha", gps: "-7.0112, 107.0856", pengalaman: 23, sertifikasi: ["Sertifikat Organik"], kontak: "0854-xxxx-2345", status: "aktif" },
  { id: "P044", nama: "Ibu Hartini Suryani", nik: "3203xxxx", umur: 47, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "1.9 ha", gps: "-7.0123, 107.0912", pengalaman: 20, sertifikasi: [], kontak: "0855-xxxx-3456", status: "aktif" },
  { id: "P045", nama: "Bapak Ruli Suparman", nik: "3203xxxx", umur: 53, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.2 ha", gps: "-7.0167, 107.0778", pengalaman: 27, sertifikasi: ["Sertifikat Organik"], kontak: "0856-xxxx-4567", status: "aktif" },
  { id: "P046", nama: "Bapak Edi Cahyono", nik: "3203xxxx", umur: 51, kelompok: "KT08", komoditas: ["Beras"], lokasi: "Sukanagara, Cianjur", lahan: "2.0 ha", gps: "-7.0145, 107.0745", pengalaman: 22, sertifikasi: ["Sertifikat Organik"], kontak: "0857-xxxx-5678", status: "aktif" },

  // KT09 - Ayam Karkas (Warungkondang)
  { id: "P047", nama: "Bapak Amir Gunawan", nik: "3203xxxx", umur: 52, kelompok: "KT09", komoditas: ["Ayam Karkas"], lokasi: "Warungkondang, Cianjur", lahan: "0.6 ha", gps: "-6.8967, 107.1567", pengalaman: 20, sertifikasi: ["Sertifikat Ternak Sehat", "GAP Peternakan"], kontak: "0858-xxxx-6789", status: "aktif" },
  { id: "P048", nama: "Bapak Rinto Hartono", nik: "3203xxxx", umur: 48, kelompok: "KT09", komoditas: ["Ayam Karkas"], lokasi: "Warungkondang, Cianjur", lahan: "0.5 ha", gps: "-6.8945, 107.1512", pengalaman: 17, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0859-xxxx-7890", status: "aktif" },
  { id: "P049", nama: "Bapak Slamet Riyadi", nik: "3203xxxx", umur: 50, kelompok: "KT09", komoditas: ["Ayam Karkas"], lokasi: "Warungkondang, Cianjur", lahan: "0.5 ha", gps: "-6.9001, 107.1489", pengalaman: 19, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0860-xxxx-8901", status: "aktif" },
  { id: "P050", nama: "Bapak Tri Wahyono", nik: "3203xxxx", umur: 45, kelompok: "KT09", komoditas: ["Ayam Karkas"], lokasi: "Warungkondang, Cianjur", lahan: "0.4 ha", gps: "-6.8978, 107.1545", pengalaman: 14, sertifikasi: [], kontak: "0861-xxxx-9012", status: "aktif" },

  // KT10 - Ayam Karkas (Mande)
  { id: "P051", nama: "Bapak Edi Hartono", nik: "3203xxxx", umur: 54, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.8 ha", gps: "-6.8834, 107.1623", pengalaman: 23, sertifikasi: ["Sertifikat Ternak Sehat", "GAP Peternakan"], kontak: "0862-xxxx-0123", status: "aktif" },
  { id: "P052", nama: "Bapak Wahyu Siswanto", nik: "3203xxxx", umur: 49, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.7 ha", gps: "-6.8856, 107.1578", pengalaman: 18, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0863-xxxx-1234", status: "aktif" },
  { id: "P053", nama: "Bapak Taufik Rahman", nik: "3203xxxx", umur: 51, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.6 ha", gps: "-6.8812, 107.1645", pengalaman: 21, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0864-xxxx-2345", status: "aktif" },
  { id: "P054", nama: "Ibu Yani Wijaya", nik: "3203xxxx", umur: 46, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.5 ha", gps: "-6.8845, 107.1601", pengalaman: 15, sertifikasi: [], kontak: "0865-xxxx-3456", status: "aktif" },
  { id: "P055", nama: "Bapak Ibnu Suharjo", nik: "3203xxxx", umur: 53, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.7 ha", gps: "-6.8867, 107.1667", pengalaman: 24, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0866-xxxx-4567", status: "aktif" },
  { id: "P056", nama: "Bapak Santoso Wijaya", nik: "3203xxxx", umur: 50, kelompok: "KT10", komoditas: ["Ayam Karkas"], lokasi: "Mande, Cianjur", lahan: "0.6 ha", gps: "-6.8823, 107.1534", pengalaman: 19, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0867-xxxx-5678", status: "aktif" },

  // KT11 - Ayam Karkas (Cibadak)
  { id: "P057", nama: "Bapak Rustam Efendi", nik: "3203xxxx", umur: 49, kelompok: "KT11", komoditas: ["Ayam Karkas"], lokasi: "Cibadak, Cianjur", lahan: "0.6 ha", gps: "-7.0367, 107.1134", pengalaman: 18, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0868-xxxx-6789", status: "aktif" },
  { id: "P058", nama: "Bapak Bambang Suryanto", nik: "3203xxxx", umur: 51, kelompok: "KT11", komoditas: ["Ayam Karkas"], lokasi: "Cibadak, Cianjur", lahan: "0.5 ha", gps: "-7.0389, 107.1178", pengalaman: 20, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0869-xxxx-7890", status: "aktif" },
  { id: "P059", nama: "Bapak Dewa Hermawan", nik: "3203xxxx", umur: 47, kelompok: "KT11", komoditas: ["Ayam Karkas"], lokasi: "Cibadak, Cianjur", lahan: "0.5 ha", gps: "-7.0345, 107.1156", pengalaman: 16, sertifikasi: [], kontak: "0870-xxxx-8901", status: "aktif" },
  { id: "P060", nama: "Bapak Hari Winarso", nik: "3203xxxx", umur: 53, kelompok: "KT11", komoditas: ["Ayam Karkas"], lokasi: "Cibadak, Cianjur", lahan: "0.6 ha", gps: "-7.0412, 107.1201", pengalaman: 22, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0871-xxxx-9012", status: "aktif" },
  { id: "P061", nama: "Ibu Endah Pratiwi", nik: "3203xxxx", umur: 44, kelompok: "KT11", komoditas: ["Ayam Karkas"], lokasi: "Cibadak, Cianjur", lahan: "0.4 ha", gps: "-7.0356, 107.1112", pengalaman: 12, sertifikasi: [], kontak: "0872-xxxx-0123", status: "aktif" },

  // KT12 - Ayam Karkas (Gekbrong)
  { id: "P062", nama: "Bapak Suryanto", nik: "3203xxxx", umur: 56, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.8 ha", gps: "-6.8712, 107.0945", pengalaman: 27, sertifikasi: ["Sertifikat Ternak Sehat", "GAP Peternakan"], kontak: "0873-xxxx-1234", status: "aktif" },
  { id: "P063", nama: "Bapak Harno Wijaya", nik: "3203xxxx", umur: 50, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.6 ha", gps: "-6.8745, 107.0989", pengalaman: 21, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0874-xxxx-2345", status: "aktif" },
  { id: "P064", nama: "Bapak Yuli Haryanto", nik: "3203xxxx", umur: 48, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.5 ha", gps: "-6.8678, 107.0923", pengalaman: 17, sertifikasi: [], kontak: "0875-xxxx-3456", status: "aktif" },
  { id: "P065", nama: "Bapak Toto Hartono", nik: "3203xxxx", umur: 54, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.7 ha", gps: "-6.8834, 107.1001", pengalaman: 24, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0876-xxxx-4567", status: "aktif" },
  { id: "P066", nama: "Ibu Siyem Nurjani", nik: "3203xxxx", umur: 45, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.4 ha", gps: "-6.8756, 107.0945", pengalaman: 13, sertifikasi: [], kontak: "0877-xxxx-5678", status: "aktif" },
  { id: "P067", nama: "Bapak Warsito Suryanto", nik: "3203xxxx", umur: 51, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.6 ha", gps: "-6.8712, 107.1034", pengalaman: 20, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0878-xxxx-6789", status: "aktif" },
  { id: "P068", nama: "Bapak Karyanto Wijaya", nik: "3203xxxx", umur: 49, kelompok: "KT12", komoditas: ["Ayam Karkas"], lokasi: "Gekbrong, Cianjur", lahan: "0.5 ha", gps: "-6.8689, 107.0867", pengalaman: 18, sertifikasi: ["Sertifikat Ternak Sehat"], kontak: "0879-xxxx-7890", status: "aktif" }
];

// Master Supplier List - semua tipe supplier (Kelompok Tani, Koperasi, UMKM)
const SUPPLIER_LIST = [
  // KELOMPOK TANI (KT)
  { id: "SP001", nama: "Kelompok Tani Maju Bersama", type: "kelompok_tani", leader: "Bapak Suherman", kontak: "0812-xxx-1111", email: "ktmajubersama@gmail.com", lokasi: "Cidaun, Cianjur", gps: "-6.9821, 107.1234", terbentuk: "2018", anggota: 4, komoditas: ["Bayam Segar", "Wortel"], sertifikasi: ["Surat Keterangan Usaha", "GAP Kolektif"], rating: 4.5, totalKiriman: 15, acceptanceRate: 0.93, status: "aktif" },
  { id: "SP002", nama: "Kelompok Tani Hijau Mandiri", type: "kelompok_tani", leader: "Ibu Nenden Nurhasanah", kontak: "0813-xxx-2222", email: "kthijaumandiri@gmail.com", lokasi: "Cipanas, Cianjur", gps: "-6.8934, 107.1567", terbentuk: "2017", anggota: 5, komoditas: ["Bayam Segar"], sertifikasi: ["Surat Keterangan Usaha", "GAP Sayuran"], rating: 4.3, totalKiriman: 12, acceptanceRate: 0.90, status: "aktif" },
  { id: "SP003", nama: "Kelompok Tani Padi Sejahtera", type: "kelompok_tani", leader: "Bapak Saripin", kontak: "0814-xxx-3333", email: "ktpadisejahtera@gmail.com", lokasi: "Sukanagara, Cianjur", gps: "-6.8756, 107.0945", terbentuk: "2015", anggota: 5, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik"], rating: 4.7, totalKiriman: 18, acceptanceRate: 0.98, status: "aktif" },
  { id: "SP004", nama: "Kelompok Peternak Cianjur", type: "kelompok_tani", leader: "Bapak Amir Gunawan", kontak: "0815-xxx-4444", email: "ktpeternak@gmail.com", lokasi: "Warungkondang, Cianjur", gps: "-6.9145, 107.1023", terbentuk: "2019", anggota: 4, komoditas: ["Ayam Karkas"], sertifikasi: ["Surat Keterangan Usaha", "GAP Peternakan"], rating: 4.4, totalKiriman: 14, acceptanceRate: 0.92, status: "aktif" },

  // KOPERASI (KOP)
  { id: "SP101", nama: "Koperasi Petani Sayuran Cianjur", type: "koperasi", leader: "Bapak Hermawan", kontak: "0816-xxx-5555", email: "kopersayurcianjur@gmail.com", lokasi: "Cilimus, Cianjur", gps: "-6.9456, 107.1678", terbentuk: "2016", anggota: 12, komoditas: ["Wortel", "Pisang Cavendish"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik Nasional"], rating: 4.6, totalKiriman: 22, acceptanceRate: 0.95, status: "aktif" },
  { id: "SP102", nama: "Koperasi Produksi Padi Cianjur", type: "koperasi", leader: "Ibu Siti Mulyani", kontak: "0817-xxx-6666", email: "koperpadi@gmail.com", lokasi: "Sukanagara, Cianjur", gps: "-6.8845, 107.0834", terbentuk: "2013", anggota: 18, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik", "SNI"], rating: 4.8, totalKiriman: 25, acceptanceRate: 0.97, status: "aktif" },
  { id: "SP103", nama: "Koperasi Produksi Telur Cianjur", type: "koperasi", leader: "Bapak Sunardi", kontak: "0818-xxx-7777", email: "kopertelur@gmail.com", lokasi: "Pacet, Cianjur", gps: "-7.0123, 107.1234", terbentuk: "2014", anggota: 8, komoditas: ["Telur Ayam"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Kesehatan"], rating: 4.5, totalKiriman: 16, acceptanceRate: 0.94, status: "aktif" },

  // UMKM
  { id: "SP201", nama: "UMKM Tahu Nikmat", type: "umkm", leader: "Ibu Siti Nurhaliza", kontak: "0819-xxx-8888", email: "tahunikmat@gmail.com", lokasi: "Karawang, Cianjur", gps: "-6.9267, 107.0756", terbentuk: "2020", anggota: 3, komoditas: ["Tahu Putih"], sertifikasi: ["Surat Izin Usaha", "BPOM"], rating: 4.2, totalKiriman: 10, acceptanceRate: 0.88, status: "aktif" },
  { id: "SP202", nama: "UMKM Pisang Goreng Premium", type: "umkm", leader: "Bapak Bambang", kontak: "0820-xxx-9999", email: "pisanggoreng@gmail.com", lokasi: "Kampung Baru, Cianjur", gps: "-6.8934, 107.1345", terbentuk: "2021", anggota: 2, komoditas: ["Pisang Cavendish"], sertifikasi: ["Surat Izin Usaha"], rating: 4.1, totalKiriman: 8, acceptanceRate: 0.85, status: "aktif" },
  { id: "SP203", nama: "UMKM Mie Telur Rumahan", type: "umkm", leader: "Ibu Rina", kontak: "0821-xxx-1010", email: "mietelur@gmail.com", lokasi: "Cipanas, Cianjur", gps: "-6.8756, 107.1234", terbentuk: "2019", anggota: 2, komoditas: ["Telur Ayam", "Bayam Segar"], sertifikasi: ["Surat Izin Usaha"], rating: 3.9, totalKiriman: 6, acceptanceRate: 0.80, status: "aktif" },

  // PENGUSAHA BESAR (PT)
  { id: "SP301", nama: "PT Karya Unggas Nusantara", type: "pengusaha_besar", leader: "Bapak Hendra Kusuma", kontak: "0822-xxx-1111", email: "info@karunga.co.id", lokasi: "Bogor, Jawa Barat", gps: "-6.5971, 106.8060", terbentuk: "2010", anggota: 145, komoditas: ["Ayam Karkas", "Telur Ayam"], sertifikasi: ["Surat Izin Usaha Perdagangan", "Sertifikat Kesehatan Ternak", "Sertifikat Halal"], rating: 4.8, totalKiriman: 56, acceptanceRate: 0.99, status: "aktif" },
  { id: "SP302", nama: "PT Agro Lestari Indonesia", type: "pengusaha_besar", leader: "Ibu Dewi Sukamto", kontak: "0823-xxx-2222", email: "sales@agrolestari.id", lokasi: "Pangalengan, Bandung", gps: "-7.3167, 107.5333", terbentuk: "2008", anggota: 120, komoditas: ["Bayam Segar", "Pisang Cavendish"], sertifikasi: ["Surat Izin Usaha Perdagangan", "Sertifikat Organik Internasional", "GlobalGAP"], rating: 4.9, totalKiriman: 62, acceptanceRate: 0.98, status: "aktif" },
  { id: "SP303", nama: "PT Padi Makmur Indonesia", type: "pengusaha_besar", leader: "Bapak Bambang Sutrisno", kontak: "0824-xxx-3333", email: "contact@padimakmur.com", lokasi: "Karawang, Jawa Barat", gps: "-6.3000, 107.2833", terbentuk: "2005", anggota: 180, komoditas: ["Beras", "Biji-bijian"], sertifikasi: ["Surat Izin Usaha Perdagangan", "Sertifikat Organik", "SNI", "ISO 22000"], rating: 4.9, totalKiriman: 71, acceptanceRate: 0.99, status: "aktif" },
  { id: "SP304", nama: "PT Minyak Goreng Sejahtera", type: "pengusaha_besar", leader: "Bapak Sutrisno Wijaya", kontak: "0825-xxx-4444", email: "supply@minyaksehat.co.id", lokasi: "Bekasi, Jawa Barat", gps: "-6.2349, 106.9896", terbentuk: "2012", anggota: 95, komoditas: ["Minyak Goreng", "Wortel"], sertifikasi: ["Surat Izin Usaha Perdagangan", "Sertifikat Halal", "SNI"], rating: 4.7, totalKiriman: 48, acceptanceRate: 0.96, status: "aktif" }
];

// Farmer groups (kelompok tani) - untuk backward compatibility
const KELOMPOK_TANI_LIST = [
  // Sayur Kangkung - 4 kelompok
  { id: "KT01", nama: "Kelompok Tani Maju Bersama", ketua: "Bapak Suherman", lokasi: "Cidaun, Cianjur", terbentuk: "2018", anggota: 4, komoditas: ["Sayur Kangkung", "Wortel"], sertifikasi: ["Surat Keterangan Usaha", "GAP Kolektif"], status: "aktif" },
  { id: "KT02", nama: "Kelompok Tani Hijau Mandiri", ketua: "Ibu Nenden Nurhasanah", lokasi: "Cipanas, Cianjur", terbentuk: "2017", anggota: 5, komoditas: ["Sayur Kangkung"], sertifikasi: ["Surat Keterangan Usaha", "GAP Sayuran"], status: "aktif" },
  { id: "KT03", nama: "Koperasi Petani Sayuran Cianjur", ketua: "Bapak Hermawan", lokasi: "Cilimus, Cianjur", terbentuk: "2016", anggota: 6, komoditas: ["Sayur Kangkung", "Wortel", "Bayam"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik Nasional"], status: "aktif" },
  { id: "KT04", nama: "Kelompok Tani Segar Lestari", ketua: "Bapak Dedi Sutrisno", lokasi: "Agrabinta, Cianjur", terbentuk: "2019", anggota: 4, komoditas: ["Sayur Kangkung"], sertifikasi: ["Surat Keterangan Usaha"], status: "aktif" },

  // Beras - 4 kelompok
  { id: "KT05", nama: "Kelompok Tani Padi Sejahtera", ketua: "Bapak Saripin", lokasi: "Sukanagara, Cianjur", terbentuk: "2015", anggota: 5, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik"], status: "aktif" },
  { id: "KT06", nama: "Gabungan Kelompok Tani Padi Raya", ketua: "Bapak Bambang Sutrisna", lokasi: "Cugenang, Cianjur", terbentuk: "2014", anggota: 8, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik Nasional"], status: "aktif" },
  { id: "KT07", nama: "Kelompok Tani Padi Makmur", ketua: "Bapak Hendra Wijaya", lokasi: "Karangtengah, Cianjur", terbentuk: "2020", anggota: 4, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha"], status: "aktif" },
  { id: "KT08", nama: "Koperasi Produksi Padi Cianjur", ketua: "Ibu Siti Mulyani", lokasi: "Sukanagara, Cianjur", terbentuk: "2013", anggota: 10, komoditas: ["Beras"], sertifikasi: ["Surat Keterangan Usaha", "Sertifikat Organik", "SNI"], status: "aktif" },

  // Ayam Karkas - 4 kelompok
  { id: "KT09", nama: "Kelompok Peternak Cianjur", ketua: "Bapak Amir Gunawan", lokasi: "Warungkondang, Cianjur", terbentuk: "2019", anggota: 4, komoditas: ["Ayam Karkas"], sertifikasi: ["Surat Keterangan Usaha", "GAP Peternakan"], status: "aktif" },
  { id: "KT10", nama: "Komunitas Peternakan Unggas Sehat", ketua: "Bapak Edi Hartono", lokasi: "Mande, Cianjur", terbentuk: "2018", anggota: 6, komoditas: ["Ayam Karkas"], sertifikasi: ["Surat Keterangan Usaha", "GAP Peternakan", "Sertifikat Kesehatan Ternak"], status: "aktif" },
  { id: "KT11", nama: "Kelompok Usaha Peternakan Ayam Kampung", ketua: "Bapak Rustam Efendi", lokasi: "Cibadak, Cianjur", terbentuk: "2017", anggota: 5, komoditas: ["Ayam Karkas"], sertifikasi: ["Surat Keterangan Usaha"], status: "aktif" },
  { id: "KT12", nama: "Persatuan Peternak Ayam Boiler Cianjur", ketua: "Bapak Suryanto", lokasi: "Gekbrong, Cianjur", terbentuk: "2016", anggota: 7, komoditas: ["Ayam Karkas"], sertifikasi: ["Surat Keterangan Usaha", "GAP Peternakan"], status: "aktif" }
];

// Supplier EWS stages (4 tahapan universal untuk semua komoditas)
const SUPPLIER_EWS_TAHAPAN = [
  { idx: 1, id: "S1", nama: "Praktik Budidaya/Pemeliharaan", deskripsi: "Kondisi praktik produksi dari mulai tanam/ternakan" },
  { idx: 2, id: "S2", nama: "Masa Panen/Panen Raya", deskripsi: "Kondisi hasil dan alat panen, kematangan komoditas" },
  { idx: 3, id: "S3", nama: "Pasca Panen & Pengemasan", deskripsi: "Sortasi, grading, pengemasan di lahan/gudang" },
  { idx: 4, id: "S4", nama: "Pengiriman ke SAFCC", deskripsi: "Kondisi kendaraan, suhu, waktu pengiriman" }
];

// Supplier EWS criteria — berbeda per jenis komoditas
const SUPPLIER_EWS_KRITERIA = {
  // SAYURAN (Kangkung, Bayam, Wortel, Buncis)
  "Sayuran": {
    S1: [
      { id: "K1", nama: "Kontrol Pestisida", batasKritis: "Pestisida terdaftar, dicatat dengan baik, masa tunggu diperhitungkan" },
      { id: "K2", nama: "Pemupukan Seimbang", batasKritis: "Kombinasi pupuk organik & kimia, pH tanah optimal 6-7" },
      { id: "K3", nama: "Air Irigasi Bersih", batasKritis: "Sumber air terjaga, tidak dekat TPA/pabrik/jalan raya" }
    ],
    S2: [
      { id: "K1", nama: "Kesegaran Sayuran", batasKritis: "Warna cerah, tekstur renyah, tidak layu/busuk" },
      { id: "K2", nama: "Kebersihan Alat Panen", batasKritis: "Pisau/gunting steril, tangan bersih, wadah higienis" },
      { id: "K3", nama: "Waktu Panen Tepat", batasKritis: "Panen pagi/sore, hindari hujan, suhu ideal 10-15°C" }
    ],
    S3: [
      { id: "K1", nama: "Sortasi & Grading", batasKritis: "Pisahkan ukuran, buang yang layu/cacat, grade A-B terpisah" },
      { id: "K2", nama: "Pengemasan Bertingkat", batasKritis: "Wadah berlubang ventilasi, alas kain lembab, tidak terlalu padat" },
      { id: "K3", nama: "Penyimpanan Dingin", batasKritis: "Suhu 8-12°C, kelembaban 85-90%, hindari cahaya langsung" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Bersih", batasKritis: "Kabin tertutup, tidak berbau, bebas kontaminan & pestisida lain" },
      { id: "K2", nama: "Suhu Transport Terjaga", batasKritis: "Suhu ≤ 10°C sepanjang perjalanan, ada pendingin aktif" },
      { id: "K3", nama: "Waktu Tempuh Cepat", batasKritis: "Tiba di SAFCC ≤ 2 jam dari pickup, langsung masuk penyimpanan" }
    ]
  },

  // BERAS
  "Beras": {
    S1: [
      { id: "K1", nama: "Kondisi Lahan Padi", batasKritis: "Drainase baik, tanah subur, tidak tercemar logam berat" },
      { id: "K2", nama: "Pemupukan Seimbang", batasKritis: "NPK sesuai dosis, pupuk organik dijadwalkan, tidak berlebihan" },
      { id: "K3", nama: "Pengendalian Hama", batasKritis: "Pengamatan rutin, pestisida aman, tidak overdosis" }
    ],
    S2: [
      { id: "K1", nama: "Kematangan Padi", batasKritis: "Gabah 80-90% kuning, kadar air 14-16%, tidak ada beras hampa" },
      { id: "K2", nama: "Alat Panen Steril", batasKritis: "Mesin pemotong bersih, tidak berkarat, tidak campur varietas" },
      { id: "K3", nama: "Proses Pengeringan Awal", batasKritis: "Pengeringan alami atau mesin, kadar air turun ke 14% dengan pelan" }
    ],
    S3: [
      { id: "K1", nama: "Penggilingan & Sortasi", batasKritis: "Gilingan rapi, terpisah beras pecah/kulit, kadar air akhir 13%" },
      { id: "K2", nama: "Pengemasan Terbuka", batasKritis: "Karung bersih, plastik food-grade, diisi tanpa tekanan berlebih" },
      { id: "K3", nama: "Penyimpanan Kering", batasKritis: "Gudang terang kering, suhu ambient 25-30°C, kelembaban < 60%" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Bersih & Kering", batasKritis: "Kabin kering tanpa lumpur, tidak bau, lantai bersih" },
      { id: "K2", nama: "Suhu Transport Ambient", batasKritis: "Lindungi dari hujan & panas ekstrem, jangan di bawah terik langsung" },
      { id: "K3", nama: "Waktu Tempuh Terukur", batasKritis: "Tiba ≤ 4 jam, langsung pindah ke gudang penyimpanan SAFCC" }
    ]
  },

  // AYAM KARKAS
  "Ayam Karkas": {
    S1: [
      { id: "K1", nama: "Kondisi Kandang", batasKritis: "Ventilasi baik, kebersihan harian, disinfeksi berkala, aman dari predator" },
      { id: "K2", nama: "Pakan & Minum Higienis", batasKritis: "Pakan berstandar, air bersih diberikan ad libitum, tidak terkontaminasi" },
      { id: "K3", nama: "Kesehatan Ternak", batasKritis: "Observasi harian, vaksin teratur, tidak ada kasus penyakit menular" }
    ],
    S2: [
      { id: "K1", nama: "Bobot Optimal", batasKritis: "Ayam broiler 1.8-2.2 kg, umur potong 32-35 hari, distribusi bobot merata" },
      { id: "K2", nama: "Proses Panen Halal", batasKritis: "Disestunning, dipotong leher dengan benar, drainase darah sempurna" },
      { id: "K3", nama: "Penanganan Karkas Bersih", batasKritis: "Scalding 60-62°C, pencabutan bulu total, pencucian tiga tahap, tanpa memar" }
    ],
    S3: [
      { id: "K1", nama: "Evisceration & Inspeksi", batasKritis: "Pengeluaran isi perut steril, inspeksi organ normal, pembersihan sempurna" },
      { id: "K2", nama: "Pengemasan Higienis", batasKritis: "Plastik food-grade & vakum, label jelas, berat tertera, sterile dengan ice pack" },
      { id: "K3", nama: "Pendinginan Segera", batasKritis: "Chilling room 0-4°C dalam 30 menit, cold storage -18°C stabil" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Berpendingin", batasKritis: "Freezer truck 0-4°C, kabin higienis, terpisah dari bahan lain, monitoring suhu" },
      { id: "K2", nama: "Suhu Terjaga Konsisten", batasKritis: "Suhu ≤ 4°C sepanjang transport, ice pack cadangan, thermometer aktif" },
      { id: "K3", nama: "Waktu Tempuh Minimal", batasKritis: "Tiba ≤ 3 jam, unload langsung ke penyimpanan -18°C SAFCC, tanpa delay" }
    ]
  },

  // PROTEIN NABATI (Tahu, Tempe)
  "Protein Nabati": {
    S1: [
      { id: "K1", nama: "Kualitas Kedelai", batasKritis: "Kedelai segar, tidak berjamur, tidak tercampur varietas lain" },
      { id: "K2", nama: "Air Rendaman Bersih", batasKritis: "Air sumur/PAM bersih, diganti 2x sehari, tidak berwarna keruh" },
      { id: "K3", nama: "Kebersihan Alat Produksi", batasKritis: "Alat dicuci sebelum & sesudah, tidak ada sisa lama, terhindar dari roket" }
    ],
    S2: [
      { id: "K1", nama: "Perebusan Matang", batasKritis: "Suhu 100°C minimal 10 menit, tidak ada yang mentah/belum empuk" },
      { id: "K2", nama: "Proses Blender Higienis", batasKritis: "Blender steril, tidak ada kontaminasi logam, tekstur halus merata" },
      { id: "K3", nama: "Penggumpalan Sempurna", batasKritis: "Kental konsisten, tidak pecah/kering, tingkat keberhasilan >95%" }
    ],
    S3: [
      { id: "K1", nama: "Pencetakan Rapi", batasKritis: "Cetakan steril, bentuk simetris, ukuran standar, tidak retak" },
      { id: "K2", nama: "Pengemasan Plastik Food-Grade", batasKritis: "Plastik tebal, segel rapi, label jelas, tanpa udara dalam kemasan" },
      { id: "K3", nama: "Penyimpanan Cool Room", batasKritis: "Suhu 18-22°C, kelembaban terkontrol, rak terhindar dari lantai basah" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Tertutup", batasKritis: "Kabin bersih, pendingin aktif, terhindar dari sinar matahari langsung" },
      { id: "K2", nama: "Suhu Transport Stabil", batasKritis: "Suhu 15-25°C, hindari panas ekstrem, monitor dengan termometer" },
      { id: "K3", nama: "Waktu Tempuh Singkat", batasKritis: "Tiba ≤ 2 jam, langsung masuk cool room SAFCC, kemasan masih utuh" }
    ]
  },

  // PISANG (untuk program MBG)
  "Pisang": {
    S1: [
      { id: "K1", nama: "Kesehatan Tanaman", batasKritis: "Pemangkasan rutin, bebas penyakit, nutrisi cukup, iklim sesuai varietas" },
      { id: "K2", nama: "Manajemen Bunga & Buah", batasKritis: "Penyerbukan alami tercukupi, pembuangan buah cacat, penjarangan merata" },
      { id: "K3", nama: "Pengendalian OPT", batasKritis: "Observasi rutin, pestisida minimal, bukan waktu aplikasi dekat panen" }
    ],
    S2: [
      { id: "K1", nama: "Kematangan Optimal", batasKritis: "Pisang: tips kuning, papaya: 1/3 kuning; tidak terlalu keras/terlalu lembek" },
      { id: "K2", nama: "Penanganan Lembut", batasKritis: "Panen dengan tangan, jangan jatuh, gunakan wadah lunak, tidak memar" },
      { id: "K3", nama: "Waktu Panen Ideal", batasKritis: "Panen pagi hari, hindari hujan berat, suhu lingkungan sejuk" }
    ],
    S3: [
      { id: "K1", nama: "Pembersihan Ringan", batasKritis: "Lap lembut jika ada debu, tidak dicuci dengan air dingin, hindari gesekan" },
      { id: "K2", nama: "Pengemasan Berlapis", batasKritis: "Kertas/kain buffer antar buah, kotak berventilasi, tidak terlalu penuh" },
      { id: "K3", nama: "Penyimpanan Sejuk", batasKritis: "Suhu 13-15°C untuk pisang, 12-14°C papaya, hindari pendingin <10°C" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Berpendingin Lembut", batasKritis: "AC sedang, bukan pendingin ekstrem, ventilasi alami terjaga" },
      { id: "K2", nama: "Suhu Transport Terkontrol", batasKritis: "Suhu 12-15°C, jangan berguncang, hindari udara langsung dari AC" },
      { id: "K3", nama: "Waktu Tempuh Cepat", batasKritis: "Tiba ≤ 3 jam, masuk cool room berpendingin lembut, jangan display langsung" }
    ]
  },

  // TELUR
  "Telur": {
    S1: [
      { id: "K1", nama: "Kesehatan Ayam Petelur", batasKritis: "Vaksin teratur, pakan nutrisi lengkap, kondisi kandang bersih & nyaman" },
      { id: "K2", nama: "Manajemen Kandang", batasKritis: "Lantai bersih harian, kayu baru/desinfeksi, tidak ada amonia mengganggu" },
      { id: "K3", nama: "Sistem Air Minum Higienis", batasKritis: "Air bersih diganti 2x/hari, dispenser tidak berbau, tidak terkontaminasi" }
    ],
    S2: [
      { id: "K1", nama: "Ukuran & Bentuk Telur", batasKritis: "Telur medium-large, bentuk normal, kulit halus tanpa cacat" },
      { id: "K2", nama: "Pengumpulan & Penanganan", batasKritis: "Dikumpulkan 3-4x/hari, tangan bersih, wadah/keranjang steril, tidak dijatuhkan" },
      { id: "K3", nama: "Proses Pembersihan Telur", batasKritis: "Tisu lembab untuk debu, tidak dicuci air, tidak dikosongkan dari lilin pelindung" }
    ],
    S3: [
      { id: "K1", nama: "Sortasi Cacat", batasKritis: "Telur retak/kotor dipisahkan, pecah segera dibuang, grade tersort" },
      { id: "K2", nama: "Pengemasan Karton Food-Grade", batasKritis: "Karton bersih, separasi antar telur rapat, label & tanggal tertera" },
      { id: "K3", nama: "Penyimpanan Sejuk", batasKritis: "Suhu 16-18°C, kelembaban 60-70%, rak terhindar dari lantai & cahaya panas" }
    ],
    S4: [
      { id: "K1", nama: "Kendaraan Tertutup & Aman", batasKritis: "Kabin bersih, pendingin ringan/AC, tidak guncangan tinggi saat berkendara" },
      { id: "K2", nama: "Suhu Transport Stabil", batasKritis: "Suhu 15-18°C, jangan terlalu dingin (<10°C), monitor dengan termometer" },
      { id: "K3", nama: "Waktu Tempuh Singkat", batasKritis: "Tiba ≤ 2 jam, langsung ke cool storage SAFCC, karton tidak tersengat hujan" }
    ]
  }
};

// Supplier EWS komoditas list — diperluas dengan lebih banyak variasi
const SUPPLIER_EWS_KOMODITAS_LIST = [
  "Sayuran",
  "Beras",
  "Ayam Karkas",
  "Protein Nabati",
  "Pisang",
  "Telur"
];

// Supplier EWS scoring data per komoditas per tahap (self-report SKT)
const SUPPLIER_EWS_DATA_KOMODITAS = {
  S1: {
    "Sayuran":       { skor: [3, 4, 4], aktif: true, alert: 1, batches: 8, lulus: 7 },
    "Beras":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Ayam Karkas":   { skor: [4, 3, 5], aktif: true, alert: 1, batches: 5, lulus: 4 },
    "Protein Nabati":{ skor: [4, 4, 4], aktif: true, alert: 0, batches: 3, lulus: 3 },
    "Pisang":        { skor: [3, 4, 3], aktif: true, alert: 1, batches: 4, lulus: 3 },
    "Telur":         { skor: [5, 5, 4], aktif: true, alert: 0, batches: 6, lulus: 6 }
  },
  S2: {
    "Sayuran":       { skor: [4, 4, 4], aktif: true, alert: 0, batches: 8, lulus: 8 },
    "Beras":         { skor: [5, 5, 4], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Ayam Karkas":   { skor: [5, 4, 5], aktif: true, alert: 0, batches: 5, lulus: 5 },
    "Protein Nabati":{ skor: [5, 4, 4], aktif: true, alert: 0, batches: 3, lulus: 3 },
    "Pisang":        { skor: [4, 3, 4], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Telur":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 6, lulus: 6 }
  },
  S3: {
    "Sayuran":       { skor: [4, 4, 3], aktif: true, alert: 0, batches: 8, lulus: 8 },
    "Beras":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Ayam Karkas":   { skor: [5, 5, 4], aktif: true, alert: 0, batches: 5, lulus: 5 },
    "Protein Nabati":{ skor: [4, 4, 4], aktif: true, alert: 0, batches: 3, lulus: 3 },
    "Pisang":        { skor: [4, 3, 3], aktif: true, alert: 1, batches: 4, lulus: 3 },
    "Telur":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 6, lulus: 6 }
  },
  S4: {
    "Sayuran":       { skor: [4, 4, 4], aktif: true, alert: 0, batches: 8, lulus: 8 },
    "Beras":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Ayam Karkas":   { skor: [4, 4, 4], aktif: true, alert: 1, batches: 5, lulus: 4 },
    "Protein Nabati":{ skor: [5, 4, 4], aktif: true, alert: 0, batches: 3, lulus: 3 },
    "Pisang":        { skor: [4, 4, 4], aktif: true, alert: 0, batches: 4, lulus: 4 },
    "Telur":         { skor: [5, 5, 5], aktif: true, alert: 0, batches: 6, lulus: 6 }
  }
};

// Shipment history to SAFCC with SLA metrics
const SUPPLIER_PENGIRIMAN = [
  { id: "SH01", tanggal: "2026-05-18", komoditas: "Sayur Kangkung", volume: 480, volumeDiterima: 456, volumeDitolak: 24, satuan: "kg", petani: ["P001","P002","P003"], status: "diterima", skorSAFCC: 4.2, tepatWaktu: true, acceptance: 0.95 },
  { id: "SH02", tanggal: "2026-05-17", komoditas: "Beras", volume: 1200, volumeDiterima: 1176, volumeDitolak: 24, satuan: "kg", petani: ["P005","P006","P007","P008"], status: "diterima", skorSAFCC: 4.8, tepatWaktu: true, acceptance: 0.98 },
  { id: "SH03", tanggal: "2026-05-16", komoditas: "Ayam Karkas", volume: 320, volumeDiterima: 294, volumeDitolak: 26, satuan: "kg", petani: ["P009","P010","P011","P012"], status: "diterima", skorSAFCC: 4.1, tepatWaktu: true, acceptance: 0.92 },
  { id: "SH04", tanggal: "2026-05-15", komoditas: "Wortel", volume: 400, volumeDiterima: 352, volumeDitolak: 48, satuan: "kg", petani: ["P003"], status: "diterima", skorSAFCC: 3.9, tepatWaktu: false, acceptance: 0.88 },
  { id: "SH05", tanggal: "2026-05-14", komoditas: "Sayur Kangkung", volume: 450, volumeDiterima: 432, volumeDitolak: 18, satuan: "kg", petani: ["P001","P002","P004"], status: "diterima", skorSAFCC: 4.3, tepatWaktu: true, acceptance: 0.96 },
  { id: "SH06", tanggal: "2026-05-13", komoditas: "Beras", volume: 1150, volumeDiterima: 1116, volumeDitolak: 34, satuan: "kg", petani: ["P005","P006"], status: "diterima", skorSAFCC: 4.7, tepatWaktu: true, acceptance: 0.97 },
  { id: "SH07", tanggal: "2026-05-12", komoditas: "Ayam Karkas", volume: 300, volumeDiterima: 270, volumeDitolak: 30, satuan: "kg", petani: ["P009","P010"], status: "diterima", skorSAFCC: 4.0, tepatWaktu: true, acceptance: 0.90 },
  { id: "SH08", tanggal: "2026-05-11", komoditas: "Sayur Kangkung", volume: 470, volumeDiterima: 418, volumeDitolak: 52, satuan: "kg", petani: ["P001","P003","P004"], status: "diterima", skorSAFCC: 4.1, tepatWaktu: false, acceptance: 0.89 },
  { id: "SH09", tanggal: "2026-05-10", komoditas: "Beras", volume: 1100, volumeDiterima: 1045, volumeDitolak: 55, satuan: "kg", petani: ["P007","P008"], status: "diterima", skorSAFCC: 4.6, tepatWaktu: true, acceptance: 0.95 },
  { id: "SH10", tanggal: "2026-05-09", komoditas: "Ayam Karkas", volume: 310, volumeDiterima: 289, volumeDitolak: 21, satuan: "kg", petani: ["P011","P012"], status: "diterima", skorSAFCC: 4.2, tepatWaktu: true, acceptance: 0.93 }
];

// SLA targets for supplier
const SUPPLIER_SLA_TARGET = {
  tepatWaktuPercent: 0.90, // 90% pengiriman tepat waktu
  acceptancePercent: 0.95  // 95% komoditas diterima
};

// Supplier acceptance report (self-report SKT untuk tracking acceptance mereka)
const SUPPLIER_ACCEPTANCE_REPORT = {
  "Sayuran": { totalKiriman: 8, diterima: 7, ditolak: 1, acceptance: 0.875 },
  "Beras": { totalKiriman: 6, diterima: 6, ditolak: 0, acceptance: 1.00 },
  "Ayam Karkas": { totalKiriman: 5, diterima: 5, ditolak: 0, acceptance: 1.00 },
  "Protein Nabati": { totalKiriman: 4, diterima: 4, ditolak: 0, acceptance: 1.00 },
  "Pisang": { totalKiriman: 5, diterima: 4, ditolak: 1, acceptance: 0.80 },
  "Telur": { totalKiriman: 6, diterima: 6, ditolak: 0, acceptance: 1.00 }
};

// SAFCC requests to supplier (permintaan dari SAFCC ke supplier)
const SAFCC_REQUESTS = [
  { id: "REQ001", tanggalPermintaan: "2026-05-18", komoditas: "Sayur Kangkung", klasifikasi: "sayuran", jumlahDiminta: 500, satuanDiminta: "kg", deadline: "2026-05-20", dapur: "Induk", status: "pending" },
  { id: "REQ002", tanggalPermintaan: "2026-05-18", komoditas: "Beras", klasifikasi: "karbohidrat", jumlahDiminta: 1500, satuanDiminta: "kg", deadline: "2026-05-21", dapur: "Induk", status: "pending" },
  { id: "REQ003", tanggalPermintaan: "2026-05-18", komoditas: "Ayam Karkas", klasifikasi: "protein_hewani", jumlahDiminta: 400, satuanDiminta: "kg", deadline: "2026-05-19", dapur: "Satelit", status: "partial" },
  { id: "REQ004", tanggalPermintaan: "2026-05-17", komoditas: "Wortel", klasifikasi: "sayuran", jumlahDiminta: 300, satuanDiminta: "kg", deadline: "2026-05-19", dapur: "Induk", status: "ready_to_ship" },
  { id: "REQ005", tanggalPermintaan: "2026-05-17", komoditas: "Sayur Kangkung", klasifikasi: "sayuran", jumlahDiminta: 400, satuanDiminta: "kg", deadline: "2026-05-22", dapur: "Satelit", status: "pending" },
  { id: "REQ006", tanggalPermintaan: "2026-05-16", komoditas: "Beras", klasifikasi: "karbohidrat", jumlahDiminta: 1200, satuanDiminta: "kg", deadline: "2026-05-18", dapur: "Induk", status: "shipped" },
  { id: "REQ007", tanggalPermintaan: "2026-05-18", komoditas: "Bayam", klasifikasi: "sayuran", jumlahDiminta: 350, satuanDiminta: "kg", deadline: "2026-05-20", dapur: "Satelit", status: "pending" },
  { id: "REQ008", tanggalPermintaan: "2026-05-18", komoditas: "Beras", klasifikasi: "karbohidrat", jumlahDiminta: 800, satuanDiminta: "kg", deadline: "2026-05-21", dapur: "Satelit", status: "pending" },
  { id: "REQ009", tanggalPermintaan: "2026-05-18", komoditas: "Telur Ayam", klasifikasi: "protein_hewani", jumlahDiminta: 250, satuanDiminta: "kg", deadline: "2026-05-20", dapur: "Induk", status: "pending" },
  { id: "REQ010", tanggalPermintaan: "2026-05-17", komoditas: "Sayur Kangkung", klasifikasi: "sayuran", jumlahDiminta: 600, satuanDiminta: "kg", deadline: "2026-05-20", dapur: "Induk", status: "pending" },
  { id: "REQ011", tanggalPermintaan: "2026-05-17", komoditas: "Wortel", klasifikasi: "sayuran", jumlahDiminta: 450, satuanDiminta: "kg", deadline: "2026-05-21", dapur: "Satelit", status: "pending" },
  { id: "REQ012", tanggalPermintaan: "2026-05-16", komoditas: "Ayam Karkas", klasifikasi: "protein_hewani", jumlahDiminta: 600, satuanDiminta: "kg", deadline: "2026-05-19", dapur: "Induk", status: "partial" },
  { id: "REQ013", tanggalPermintaan: "2026-05-16", komoditas: "Bayam", klasifikasi: "sayuran", jumlahDiminta: 280, satuanDiminta: "kg", deadline: "2026-05-19", dapur: "Induk", status: "ready_to_ship" },
  { id: "REQ014", tanggalPermintaan: "2026-05-15", komoditas: "Beras", klasifikasi: "karbohidrat", jumlahDiminta: 2000, satuanDiminta: "kg", deadline: "2026-05-20", dapur: "Satelit", status: "shipped" }
];

// Supplier receiving log (log penerimaan hasil dari petani)
const SUPPLIER_PENERIMAAN = [
  { id: "IN001", requestId: "REQ001", tanggalTerima: "2026-05-18", komoditas: "Sayur Kangkung", jumlahDiterima: 350, satuanDiterima: "kg", petani: ["P001", "P002"], status: "ready_to_ship", catatan: "Kualitas baik, segar" },
  { id: "IN002", requestId: "REQ002", tanggalTerima: "2026-05-18", komoditas: "Beras", jumlahDiterima: 950, satuanDiterima: "kg", petani: ["P005", "P006"], status: "partial", catatan: "Menunggu pengiriman dari P007" },
  { id: "IN003", requestId: "REQ003", tanggalTerima: "2026-05-18", komoditas: "Ayam Karkas", jumlahDiterima: 320, satuanDiterima: "kg", petani: ["P009"], status: "ready_to_ship", catatan: "Dari P010 belum datang" },
  { id: "IN004", requestId: "REQ004", tanggalTerima: "2026-05-17", komoditas: "Wortel", jumlahDiterima: 300, satuanDiterima: "kg", petani: ["P003"], status: "ready_to_ship", catatan: "Lengkap dan siap kirim" },
  { id: "IN005", requestId: "REQ005", tanggalTerima: "2026-05-17", komoditas: "Sayur Kangkung", jumlahDiterima: 200, satuanDiterima: "kg", petani: ["P001"], status: "partial", catatan: "Baru dari P001, menunggu P004" }
];

// Penerima Manfaat — Food quality checklist criteria
const PENERIMA_CHECKLIST_CRITERIA = [
  { id: "C1", nama: "Kemasan Utuh", deskripsi: "Kemasan tidak bocor, penyok, atau rusak", icon: "box",
    alasanOpsi: ["Kemasan bocor", "Kemasan penyok/rusak", "Segel terbuka", "Kemasan kotor"] },
  { id: "C2", nama: "Aroma Normal", deskripsi: "Tidak ada bau menyengat, busuk, atau aneh", icon: "smile",
    alasanOpsi: ["Bau asam/busuk", "Bau tengik", "Bau kimia/obat", "Bau asing lainnya"] },
  { id: "C3", nama: "Warna Sesuai", deskripsi: "Warna makanan sesuai dengan jenis & menu", icon: "palette",
    alasanOpsi: ["Warna terlalu pucat", "Warna gosong/gelap", "Tidak sesuai menu", "Ada perubahan warna"] },
  { id: "C4", nama: "Tekstur Baik", deskripsi: "Tekstur tidak berlebihan lembek atau keras", icon: "touch",
    alasanOpsi: ["Terlalu lembek/berair", "Terlalu keras/kering", "Tekstur tidak merata", "Berkerak/menggumpal"] },
  { id: "C5", nama: "Suhu Tepat", deskripsi: "Makanan hangat (panas untuk masakan utama, dingin untuk minuman)", icon: "thermometer",
    alasanOpsi: ["Terlalu dingin", "Kurang panas", "Tidak sesuai jenis makanan", "Terlalu panas"] },
  { id: "C6", nama: "Etiket Jelas", deskripsi: "Label asal dapur dan tanggal tertera dengan jelas", icon: "tag",
    alasanOpsi: ["Label tidak ada", "Tulisan tidak terbaca", "Tanggal tidak tertera", "Informasi tidak lengkap"] }
];

// Penerima Manfaat — Dapur list for origin verification
const PENERIMA_DAPUR_LIST = [
  { id: "D1", nama: "Dapur Induk Cianjur", short: "Induk", alamat: "Jl. Ahmad Yani No. 5, Cianjur", telp: "0263-511234", pic: "Ibu Siti Rahma" },
  { id: "D2", nama: "Dapur Satelit Cianjur 01", short: "Satelit 01", alamat: "Jl. Gatot Subroto No. 12, Cianjur", telp: "0263-512345", pic: "Bapak Bambang" }
];

// Penerima Manfaat — Menu suggestions by segmen (untuk form)
const PENERIMA_MENU_BY_SEGMEN = {
  "Siswa SMA": ["Nasi Kuning + Ayam Goreng + Kangkung", "Nasi Putih + Ikan Kuah + Wortel", "Nasi Kuning + Telur Dadar + Bayam", "Nasi Putih + Tahu Goreng + Sayuran"],
  "Siswa SMP": ["Nasi Kuning + Ayam Goreng + Kangkung", "Nasi Putih + Ikan Kuah + Wortel", "Nasi Kuning + Telur Dadar + Bayam", "Nasi Putih + Tahu Goreng + Sayuran"],
  "Siswa SD": ["Nasi Kuning + Ayam Goreng + Kangkung", "Nasi Putih + Ikan Kuah + Wortel", "Nasi Kuning + Telur Dadar + Bayam", "Bubur Ayam + Telur + Sayuran"],
  "TK/PAUD/RA": ["Bubur Ayam + Telur + Sayuran", "Bubur Putih + Telur Lembut + Wortel", "Bubur Tahu + Sayuran Lunak", "Nasi Lembek + Ayam Cincang + Bayam"],
  "Anak Balita": ["Bubur Ayam Halus + Telur + Sayuran", "Bubur Tahu Putih + Wortel Lembut", "Bubur Beras + Ayam Cincang + Sayuran", "Nasi Lembek + Ikan Lunak + Bayam Cincang"],
  "Ibu Hamil & Menyusui": ["Nasi Kuning + Ayam Goreng + Kangkung", "Nasi Putih + Ikan Kuah + Wortel", "Nasi Kuning + Telur Dadar + Bayam", "Bubur Ayam + Telur + Sayuran"]
};

// Penerima Manfaat — Food quality checklist submissions
const PENERIMA_CHECKLIST_SUBMISSIONS = [
  // SI05 - SDN Cianjur 01
  { id: "CS001", tanggal: "2026-05-18", sekolahId: "SI05", dapur: "D1", menu: "Nasi Kuning + Ayam Goreng + Kangkung", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "-", evaluatorNama: "Ibu Siti Nurhaliza", evaluatorJabatan: "Guru Kelas 3A" },
  { id: "CS002", tanggal: "2026-05-17", sekolahId: "SI05", dapur: "D1", menu: "Bubur Ayam + Telur + Sayuran", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "Kualitas baik", evaluatorNama: "Ibu Emine Suryani", evaluatorJabatan: "Guru Kelas 1A" },
  // SI06 - SDN Cugenang 02
  { id: "CS003", tanggal: "2026-05-18", sekolahId: "SI06", dapur: "D2", menu: "Nasi Putih + Ikan Kuah + Wortel", hasil: [true, true, true, false, true, true], status: "minor", catatan: "Wortel terlalu keras", evaluatorNama: "Bapak Ahmad Riyanto", evaluatorJabatan: "Guru Kelas 5B" },
  { id: "CS004", tanggal: "2026-05-17", sekolahId: "SI06", dapur: "D2", menu: "Nasi Kuning + Telur Dadar + Bayam", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "-", evaluatorNama: "Ibu Dewi Handayani", evaluatorJabatan: "Guru UKS" },
  // SI07 - Posyandu Cianjur Pusat
  { id: "CS005", tanggal: "2026-05-18", sekolahId: "SI07", dapur: "D1", menu: "Bubur Putih + Telur Lembut + Wortel", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "-", evaluatorNama: "Ibu Heni Mutiara", evaluatorJabatan: "Petugas Posyandu" },
  { id: "CS006", tanggal: "2026-05-17", sekolahId: "SI07", dapur: "D1", menu: "Bubur Tahu + Sayuran Lunak", hasil: [true, true, true, true, false, true], status: "minor", catatan: "Tekstur perlu lebih lembut", evaluatorNama: "Ibu Sri Lestari", evaluatorJabatan: "Petugas Posyandu" },
  // SS01 - SDN Cianjur 03
  { id: "CS007", tanggal: "2026-05-18", sekolahId: "SS01", dapur: "D2", menu: "Nasi Putih + Tahu Goreng + Sayuran", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "-", evaluatorNama: "Bapak Supriyanto", evaluatorJabatan: "Kepala Sekolah" },
  { id: "CS008", tanggal: "2026-05-17", sekolahId: "SS01", dapur: "D2", menu: "Nasi Kuning + Ayam Cincang + Kangkung", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "Sangat baik", evaluatorNama: "Ibu Siti Aminah", evaluatorJabatan: "Guru Kelas 2A" },
  // SS02 - SDN Cidaun 02
  { id: "CS009", tanggal: "2026-05-18", sekolahId: "SS02", dapur: "D1", menu: "Nasi Putih + Ikan Lunak + Bayam Cincang", hasil: [true, true, true, false, true, true], status: "minor", catatan: "Ikan agak keras", evaluatorNama: "Ibu Nurlia", evaluatorJabatan: "Guru Kelas 4B" },
  { id: "CS010", tanggal: "2026-05-16", sekolahId: "SS02", dapur: "D1", menu: "Bubur Nasi + Ayam Halus + Wortel", hasil: [true, true, true, true, true, true], status: "lulus", catatan: "-", evaluatorNama: "Bapak Drs. Eka Wijaya", evaluatorJabatan: "Guru Olahraga" }
];

// Penerima Manfaat — Food feedback & ratings
const PENERIMA_FEEDBACK = [
  // SI05 - SDN Cianjur 01
  { id: "FB001", tanggal: "2026-05-18", sekolahId: "SI05", dapur: "D1", menu: "Nasi Kuning + Ayam Goreng + Kangkung", rating: 5, ratingRasa: 5, ratingTampilan: 4, ratingPorsi: 5, feedback: "Sangat enak! Ayamnya juicy dan kangkungnya fresh.", siswaNama: "Putri Raharjanti", siswaKelas: "Kelas 3A" },
  { id: "FB002", tanggal: "2026-05-17", sekolahId: "SI05", dapur: "D1", menu: "Bubur Ayam + Telur + Sayuran", rating: 4, ratingRasa: 4, ratingTampilan: 4, ratingPorsi: 5, feedback: "Bubur lembut dan enak dimakan. Porsi pas.", siswaNama: "Eko Pratama", siswaKelas: "Kelas 1A" },
  // SI06 - SDN Cugenang 02
  { id: "FB003", tanggal: "2026-05-18", sekolahId: "SI06", dapur: "D2", menu: "Nasi Putih + Ikan Kuah + Wortel", rating: 4, ratingRasa: 4, ratingTampilan: 4, ratingPorsi: 3, feedback: "Enak tapi porsinya agak sedikit. Bisa ditambah.", siswaNama: "Ari Prakoso", siswaKelas: "Kelas 5B" },
  { id: "FB004", tanggal: "2026-05-17", sekolahId: "SI06", dapur: "D2", menu: "Nasi Kuning + Telur Dadar + Bayam", rating: 5, ratingRasa: 5, ratingTampilan: 5, ratingPorsi: 4, feedback: "Warnanya menarik, rasanya lezat. Bayamnya tidak pahit sama sekali!", siswaNama: "Siti Rafika", siswaKelas: "Kelas 5A" },
  // SI07 - Posyandu Cianjur Pusat
  { id: "FB005", tanggal: "2026-05-18", sekolahId: "SI07", dapur: "D1", menu: "Bubur Putih + Telur Lembut + Wortel", rating: 4, ratingRasa: 4, ratingTampilan: 4, ratingPorsi: 4, feedback: "Bubur lembut, cocok untuk bayi. Lezat!", siswaNama: "Bayi Rara (9 bulan)", siswaKelas: "Balita" },
  { id: "FB006", tanggal: "2026-05-17", sekolahId: "SI07", dapur: "D1", menu: "Bubur Tahu + Sayuran Lunak", rating: 3, ratingRasa: 3, ratingTampilan: 3, ratingPorsi: 4, feedback: "Lumayan lembut, tapi agak hambar. Mungkin perlu garam sedikit.", siswaNama: "Ibu Hamil Sinta", siswaKelas: "Ibu Hamil & Menyusui" },
  // SS01 - SDN Cianjur 03
  { id: "FB007", tanggal: "2026-05-18", sekolahId: "SS01", dapur: "D2", menu: "Nasi Putih + Tahu Goreng + Sayuran", rating: 4, ratingRasa: 4, ratingTampilan: 4, ratingPorsi: 4, feedback: "Tahu enak dan sayurannya segar. Mantap!", siswaNama: "Doni Hermawan", siswaKelas: "Kelas 2A" },
  { id: "FB008", tanggal: "2026-05-16", sekolahId: "SS01", dapur: "D2", menu: "Nasi Kuning + Ayam Cincang + Kangkung", rating: 5, ratingRasa: 5, ratingTampilan: 5, ratingPorsi: 5, feedback: "Nasi kuningnya warna cerah, ayamnya empuk. Sangat lezat!", siswaNama: "Rara Cantika", siswaKelas: "Kelas 2C" },
  // SS02 - SDN Cidaun 02
  { id: "FB009", tanggal: "2026-05-18", sekolahId: "SS02", dapur: "D1", menu: "Nasi Putih + Ikan Lunak + Bayam Cincang", rating: 3, ratingRasa: 3, ratingTampilan: 3, ratingPorsi: 4, feedback: "Ikan agak amis sedikit, tapi masih enak. Bayamnya OK.", siswaNama: "Yusuf Adrianto", siswaKelas: "Kelas 4B" },
  { id: "FB010", tanggal: "2026-05-17", sekolahId: "SS02", dapur: "D1", menu: "Bubur Nasi + Ayam Halus + Wortel", rating: 4, ratingRasa: 4, ratingTampilan: 4, ratingPorsi: 4, feedback: "Bubur lembut, ayam halus, enak dan mudah dimakan.", siswaNama: "Ani Widiastuti", siswaKelas: "Kelas 3D" }
];

// ===== PHASE 2 INTEGRATION: FEEDBACK LOOPS =====

// Track fulfillments submitted by SUPPLIER (persistent record across sessions)
const SUPPLIER_FULFILLMENT_SUBMISSIONS = [
  { id: "SFS001", requestId: "REQ001", tanggalSubmit: "2026-05-18", komoditas: "Ayam Karkas", jumlahDiminta: 400, jumlahDiberikan: 320, persentase: 80, status: "accepted", catatan: "Kualitas premium, tepat waktu" },
  { id: "SFS002", requestId: "REQ002", tanggalSubmit: "2026-05-18", komoditas: "Sayur Kangkung", jumlahDiminta: 500, jumlahDiberikan: 480, persentase: 96, status: "accepted", catatan: "Fresh, warna hijau cerah" },
  { id: "SFS003", requestId: "REQ003", tanggalSubmit: "2026-05-18", komoditas: "Beras", jumlahDiminta: 1000, jumlahDiberikan: 950, persentase: 95, status: "accepted", catatan: "Beras bersih, tidak tercampur" },
  { id: "SFS004", requestId: "REQ004", tanggalSubmit: "2026-05-17", komoditas: "Telur Ayam", jumlahDiminta: 300, jumlahDiberikan: 290, persentase: 97, status: "accepted", catatan: "Telur segar, tidak ada yang pecah" }
];

// Real-time quality feedback from schools (updated as PENERIMA submits checklists)
const DAPUR_QUALITY_FEEDBACK = [
  { id: "DQF001", tanggal: "2026-05-18", dapurId: "D1", sekolahId: "SI01", sekolahNama: "SMAN 1 Cianjur", menu: "Nasi Kuning + Ayam Goreng + Kangkung", verifikasi: { kemasan: true, aroma: true, warna: true, tekstur: true, suhu: true, etiket: true }, passedCount: 6, totalCount: 6, status: "lulus", catatan: "Kualitas sempurna", pejabat: "Ibu Siti Nurhaliza", alasanPenolakan: {} },
  { id: "DQF002", tanggal: "2026-05-18", dapurId: "D1", sekolahId: "SI03", sekolahNama: "SMPN 1 Cianjur", menu: "Nasi Putih + Ikan Kuah + Wortel", verifikasi: { kemasan: true, aroma: true, warna: false, tekstur: true, suhu: true, etiket: true }, passedCount: 5, totalCount: 6, status: "minor", catatan: "Warna kuah sedikit pudar", pejabat: "Bapak Ahmad Riyanto", alasanPenolakan: { C3: "Warna terlalu pucat" } },
  { id: "DQF003", tanggal: "2026-05-18", dapurId: "D2", sekolahId: "SS01", sekolahNama: "SDN Cianjur 03", menu: "Nasi Putih + Tahu Goreng + Sayuran", verifikasi: { kemasan: true, aroma: true, warna: true, tekstur: true, suhu: true, etiket: true }, passedCount: 6, totalCount: 6, status: "lulus", catatan: "Sangat baik", pejabat: "Bapak Supriyanto", alasanPenolakan: {} }
];

// ===== PHASE 1 INTEGRATION: DAPUR ↔ SUPPLIER ↔ PENERIMA =====

// Tracking deliveries from SUPPLIER to each DAPUR (when SUPPLIER_PENGIRIMAN arrives at kitchen)
const DAPUR_DELIVERY_TRACKING = [
  // Dapur Induk (D1) — received 2026-05-18
  { id: "DDT01", dapurId: "D1", tanggal: "2026-05-18", komoditas: "Sayur Kangkung", volumeDiminta: 500, volumeDiterima: 450, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur" },
  { id: "DDT02", dapurId: "D1", tanggal: "2026-05-18", komoditas: "Beras", volumeDiminta: 1500, volumeDiterima: 1450, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur" },
  { id: "DDT03", dapurId: "D1", tanggal: "2026-05-18", komoditas: "Ayam Karkas", volumeDiminta: 400, volumeDiterima: 380, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur" },
  { id: "DDT04", dapurId: "D1", tanggal: "2026-05-17", komoditas: "Wortel", volumeDiminta: 300, volumeDiterima: 285, status: "accepted", penerimaTanggal: "2026-05-17", penerimaNama: "Koordinator Dapur" },
  // Dapur Satelit (D2) — received 2026-05-18
  { id: "DDT05", dapurId: "D2", tanggal: "2026-05-18", komoditas: "Beras", volumeDiminta: 800, volumeDiterima: 785, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur Satelit" },
  { id: "DDT06", dapurId: "D2", tanggal: "2026-05-18", komoditas: "Telur Ayam", volumeDiminta: 250, volumeDiterima: 245, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur Satelit" },
  { id: "DDT07", dapurId: "D2", tanggal: "2026-05-18", komoditas: "Sayur Kangkung", volumeDiminta: 400, volumeDiterima: 390, status: "accepted", penerimaTanggal: "2026-05-18", penerimaNama: "Koordinator Dapur Satelit" },
  { id: "DDT08", dapurId: "D2", tanggal: "2026-05-17", komoditas: "Pisang Cavendish", volumeDiminta: 200, volumeDiterima: 200, status: "accepted", penerimaTanggal: "2026-05-17", penerimaNama: "Koordinator Dapur Satelit" }
];

// Production schedule: which DAPUR will send which menus to which schools (output dari MenuOptimasi)
const DAPUR_PRODUCTION_PLAN = [
  {
    id: "DPP001",
    tanggal: "2026-05-18",
    dapurId: "D1", // Dapur Induk
    dapurNama: "Dapur Induk Cianjur",
    status: "planned",
    scheduled: [
      { sekolahId: "SI01", sekolahNama: "SMAN 1 Cianjur", segmen: "Siswa SMA", siswa: 587, menu: "Nasi Kuning + Ayam Goreng + Kangkung", status: "planned", estimatedDelivery: "09:18" },
      { sekolahId: "SI02", sekolahNama: "SMAN 2 Cianjur", segmen: "Siswa SMA", siswa: 520, menu: "Nasi Kuning + Ayam Goreng + Kangkung", status: "planned", estimatedDelivery: "09:22" },
      { sekolahId: "SI03", sekolahNama: "SMPN 1 Cianjur", segmen: "Siswa SMP", siswa: 513, menu: "Nasi Putih + Ikan Kuah + Wortel", status: "planned", estimatedDelivery: "09:32" },
      { sekolahId: "SI04", sekolahNama: "SMPN 2 Cianjur", segmen: "Siswa SMP", siswa: 448, menu: "Nasi Putih + Ikan Kuah + Wortel", status: "planned", estimatedDelivery: "09:28" },
      { sekolahId: "SI05", sekolahNama: "SDN Cianjur 01", segmen: "Siswa SD", siswa: 396, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:42" },
      { sekolahId: "SI06", sekolahNama: "SDN Cugenang 02", segmen: "Siswa SD", siswa: 386, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:48" },
      { sekolahId: "SI07", sekolahNama: "Posyandu Cianjur Pusat", segmen: "Anak Balita", siswa: 86, menu: "Bubur Putih + Telur Lembut + Wortel", status: "planned", estimatedDelivery: "08:50" },
      { sekolahId: "SI08", sekolahNama: "Posyandu Kasih Ibu", segmen: "Ibu Hamil & Menyusui", siswa: 61, menu: "Nasi Kuning + Ayam Goreng + Kangkung", status: "planned", estimatedDelivery: "08:55" }
    ]
  },
  {
    id: "DPP002",
    tanggal: "2026-05-18",
    dapurId: "D2", // Dapur Satelit
    dapurNama: "Dapur Satelit Cianjur",
    status: "planned",
    scheduled: [
      { sekolahId: "SS01", sekolahNama: "SDN Cianjur 03", segmen: "Siswa SD", siswa: 260, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:38" },
      { sekolahId: "SS02", sekolahNama: "SDN Cidaun 02", segmen: "Siswa SD", siswa: 270, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:55" },
      { sekolahId: "SS03", sekolahNama: "SDN Cipanas 01", segmen: "Siswa SD", siswa: 240, menu: "Nasi Kuning + Telur Dadar + Bayam", status: "planned", estimatedDelivery: "09:42" },
      { sekolahId: "SS04", sekolahNama: "SDN Warungkondang 01", segmen: "Siswa SD", siswa: 195, menu: "Nasi Kuning + Telur Dadar + Bayam", status: "planned", estimatedDelivery: "09:38" },
      { sekolahId: "SS05", sekolahNama: "SDN Warungkondang 03", segmen: "Siswa SD", siswa: 190, menu: "Nasi Kuning + Telur Dadar + Bayam", status: "planned", estimatedDelivery: "09:55" },
      { sekolahId: "SS06", sekolahNama: "SDN Pabuaran 01", segmen: "Siswa SD", siswa: 175, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:42" },
      { sekolahId: "SS07", sekolahNama: "SDN Pabuaran 02", segmen: "Siswa SD", siswa: 155, menu: "Nasi Putih + Tahu Goreng + Sayuran", status: "planned", estimatedDelivery: "09:55" },
      { sekolahId: "SS08", sekolahNama: "TK Cinta Baca", segmen: "TK/PAUD/RA", siswa: 145, menu: "Nasi Lembek + Ayam Cincang + Bayam", status: "planned", estimatedDelivery: "09:05" },
      { sekolahId: "SS09", sekolahNama: "TK Bunga Mawar", segmen: "TK/PAUD/RA", siswa: 95, menu: "Nasi Lembek + Ayam Cincang + Bayam", status: "planned", estimatedDelivery: "09:08" },
      { sekolahId: "SS10", sekolahNama: "PAUD Bintang Baru", segmen: "TK/PAUD/RA", siswa: 88, menu: "Bubur Ayam Halus + Telur + Sayuran", status: "planned", estimatedDelivery: "09:08" },
      { sekolahId: "SS11", sekolahNama: "Posyandu Merdeka", segmen: "Ibu Hamil & Menyusui", siswa: 62, menu: "Nasi Kuning + Ayam Goreng + Kangkung", status: "planned", estimatedDelivery: "08:45" },
      { sekolahId: "SS12", sekolahNama: "Posyandu Harapan", segmen: "Anak Balita", siswa: 75, menu: "Bubur Ayam Halus + Telur + Sayuran", status: "planned", estimatedDelivery: "08:52" },
      { sekolahId: "SS13", sekolahNama: "Posyandu Sejahtera", segmen: "Anak Balita", siswa: 48, menu: "Bubur Beras + Ayam Cincang + Sayuran", status: "planned", estimatedDelivery: "08:55" }
    ]
  }
];

// Demo user accounts for authentication
window.USER_ACCOUNTS = {
  // AGRO / SAFCC
  "agro1": { password: "agro", role: "agro", name: "SAFCC Coordinator 1" },
  "agro2": { password: "agro", role: "agro", name: "SAFCC Coordinator 2" },

  // DAPUR INDUK
  "induk1": { password: "induk", role: "induk", name: "Koordinator Dapur Induk 1" },
  "induk2": { password: "induk", role: "induk", name: "Koordinator Dapur Induk 2" },

  // DAPUR SATELIT
  "satelit1": { password: "satelit", role: "satelit", name: "Koordinator Dapur Satelit 1" },
  "satelit2": { password: "satelit", role: "satelit", name: "Koordinator Dapur Satelit 2" },

  // SUPPLIER KELOMPOK TANI
  "tani1": { password: "tani", role: "supplier_tani", name: "Supplier Kelompok Tani 1" },
  "tani2": { password: "tani", role: "supplier_tani", name: "Supplier Kelompok Tani 2" },

  // SUPPLIER KOPERASI
  "koperasi1": { password: "koperasi", role: "supplier_koperasi", name: "Supplier Koperasi 1" },
  "koperasi2": { password: "koperasi", role: "supplier_koperasi", name: "Supplier Koperasi 2" },

  // SUPPLIER UMKM
  "umkm1": { password: "umkm", role: "supplier_umkm", name: "Supplier UMKM 1" },
  "umkm2": { password: "umkm", role: "supplier_umkm", name: "Supplier UMKM 2" },

  // SUPPLIER PENGUSAHA BESAR
  "besar1": { password: "besar", role: "supplier_besar", name: "Supplier Pengusaha Besar 1" },
  "besar2": { password: "besar", role: "supplier_besar", name: "Supplier Pengusaha Besar 2" },

  // PENERIMA
  "penerima1": { password: "penerima", role: "penerima", name: "Penerima Manfaat 1" },
  "penerima2": { password: "penerima", role: "penerima", name: "Penerima Manfaat 2" }
};

// Login validation helper
window.validateLogin = (username, password) => {
  const user = window.USER_ACCOUNTS[username];
  if (!user) return { valid: false, error: "Username tidak terdaftar" };
  if (user.password !== password) return { valid: false, error: "Password salah" };
  return { valid: true, user };
};

// Duplicate submission detection
window.SUBMISSION_HISTORY = [];

window.isSubmissionDuplicate = (submission) => {
  if (!submission || !submission.type) return false;

  const key = JSON.stringify({
    type: submission.type,
    dapurId: submission.dapurId || submission.selectedDapur,
    timestamp: new Date(submission._timestamp || submission.tanggal || new Date()).toDateString()
  });
  const hash = btoa(key);

  const found = window.SUBMISSION_HISTORY.some(s =>
    s.hash === hash && (Date.now() - s.time) < 300000
  );

  if (!found) {
    window.SUBMISSION_HISTORY.push({ hash, time: Date.now() });
    if (window.SUBMISSION_HISTORY.length > 100) window.SUBMISSION_HISTORY.shift();
  }

  return found;
};

window.IDSS = { ROLES, KOMODITAS, PREDIKSI_PANEN, SUPPLIERS, SUPPLIERS_BY_KOMODITAS, DAPUR_LIST, NERACA, MENU_BAHAN, NUTRISI_TARGET, EWS_TAHAPAN, EWS_KRITERIA, EWS_HARIINI, EWS_KOMODITAS_LIST, EWS_DATA_KOMODITAS, SEKOLAH, SEKOLAH_INDUK, SEKOLAH_SATELIT, ALERTS_AKTIF, MENU_MINGGU, NUTRISI_PRESETS, MENU_DB, AGRO_EWS_TAHAPAN, AGRO_EWS_KRITERIA, AGRO_EWS_HARIINI, AGRO_EWS_KOMODITAS_LIST, AGRO_EWS_DATA_KOMODITAS, AGRO_ALERTS_AKTIF, PETANI_LIST, KELOMPOK_TANI_LIST, SUPPLIER_LIST, SUPPLIER_EWS_TAHAPAN, SUPPLIER_EWS_KRITERIA, SUPPLIER_EWS_KOMODITAS_LIST, SUPPLIER_EWS_DATA_KOMODITAS, SUPPLIER_PENGIRIMAN, SUPPLIER_SLA_TARGET, SUPPLIER_ACCEPTANCE_REPORT, SAFCC_REQUESTS, SUPPLIER_PENERIMAAN, PENERIMA_CHECKLIST_CRITERIA, PENERIMA_DAPUR_LIST, PENERIMA_MENU_BY_SEGMEN, PENERIMA_CHECKLIST_SUBMISSIONS, PENERIMA_FEEDBACK, DAPUR_DELIVERY_TRACKING, DAPUR_PRODUCTION_PLAN, SUPPLIER_FULFILLMENT_SUBMISSIONS, DAPUR_QUALITY_FEEDBACK, MESSAGE_TYPES, MESSAGE_METADATA, STATUS_TYPES, CRITERIA_KEY_MAP };
