// Mock data — Toko Sumber Rejeki (minimarket / toko kelontong, 2 cabang)

const TENANT = {
  name: 'Toko Sumber Rejeki',
  legal: 'CV Sumber Rejeki Sejahtera',
  short: 'SR',
  npwp: '01.234.567.8-405.000',
  address: 'Jl. Merdeka Barat No. 88, Bekasi',
  phone: '021-8845-2210',
};

const CABANG_LIST = [
  { id: 'pusat',  name: 'Cabang Pusat — Bekasi' },
  { id: 'kalimalang', name: 'Cabang Kalimalang' },
];

const PERIOD_LIST = [
  { id: '2026-02', label: 'Februari 2026' },
  { id: '2026-03', label: 'Maret 2026' },
  { id: '2026-04', label: 'April 2026' },
  { id: '2026-05', label: 'Mei 2026' },
];
const CURRENT_PERIOD = '2026-04';

const ROLES = {
  kasir: {
    id: 'kasir',
    name: 'Rina Wahyuni',
    title: 'Kasir Shift Pagi',
    initials: 'RW',
    can: { sell: true, refund: false, edit_product: false, view_report: false, settings: false },
  },
  supervisor: {
    id: 'supervisor',
    name: 'Bambang Kurniawan',
    title: 'Supervisor Toko',
    initials: 'BK',
    can: { sell: true, refund: true, edit_product: true, view_report: true, settings: false },
  },
  pemilik: {
    id: 'pemilik',
    name: 'Hj. Siti Aminah',
    title: 'Pemilik',
    initials: 'SA',
    can: { sell: false, refund: true, edit_product: true, view_report: true, settings: true },
  },
};

// Product categories
const CATEGORIES = [
  { id: 'all',       label: 'Semua' },
  { id: 'sembako',   label: 'Sembako' },
  { id: 'minuman',   label: 'Minuman' },
  { id: 'snack',     label: 'Snack' },
  { id: 'rokok',     label: 'Rokok' },
  { id: 'rumah',     label: 'Kebutuhan Rumah' },
  { id: 'pribadi',   label: 'Perawatan Pribadi' },
];

// Product master (~40 SKUs)
const PRODUCTS = [
  { sku: 'SMB-001', barcode: '8992696405011', name: 'Beras Pandan Wangi 5kg',     cat: 'sembako', price:  78_000, hpp:  68_500, stock: { pusat: 24,  kalimalang: 12 } },
  { sku: 'SMB-002', barcode: '8992696405028', name: 'Minyak Goreng Tropical 2L',  cat: 'sembako', price:  36_500, hpp:  31_200, stock: { pusat: 48,  kalimalang: 22 } },
  { sku: 'SMB-003', barcode: '8992696405035', name: 'Gula Pasir Gulaku 1kg',      cat: 'sembako', price:  16_900, hpp:  14_800, stock: { pusat: 36,  kalimalang: 18 } },
  { sku: 'SMB-004', barcode: '8992696405042', name: 'Telur Ayam Negeri 1kg',      cat: 'sembako', price:  29_500, hpp:  26_000, stock: { pusat:  8,  kalimalang:  4 } },
  { sku: 'SMB-005', barcode: '8992696405059', name: 'Tepung Terigu Segitiga 1kg', cat: 'sembako', price:  13_500, hpp:  11_400, stock: { pusat: 28,  kalimalang: 14 } },
  { sku: 'SMB-006', barcode: '8992696405066', name: 'Mie Instan Indomie Goreng',  cat: 'sembako', price:   3_500, hpp:   2_950, stock: { pusat: 240, kalimalang: 156 } },

  { sku: 'MNM-001', barcode: '8992761101019', name: 'Aqua 600ml',                  cat: 'minuman', price:   4_500, hpp:   3_200, stock: { pusat: 96,  kalimalang: 60 } },
  { sku: 'MNM-002', barcode: '8992761101026', name: 'Le Minerale 1500ml',          cat: 'minuman', price:   7_000, hpp:   5_400, stock: { pusat: 48,  kalimalang: 24 } },
  { sku: 'MNM-003', barcode: '8992761101033', name: 'Teh Botol Sosro 350ml',       cat: 'minuman', price:   5_500, hpp:   4_100, stock: { pusat: 72,  kalimalang: 36 } },
  { sku: 'MNM-004', barcode: '8992761101040', name: 'Coca-Cola 390ml',             cat: 'minuman', price:   7_500, hpp:   5_600, stock: { pusat: 48,  kalimalang: 30 } },
  { sku: 'MNM-005', barcode: '8992761101057', name: 'Susu UHT Ultra 250ml Coklat', cat: 'minuman', price:   5_800, hpp:   4_500, stock: { pusat: 60,  kalimalang: 36 } },
  { sku: 'MNM-006', barcode: '8992761101064', name: 'Pocari Sweat 500ml',          cat: 'minuman', price:   8_500, hpp:   6_700, stock: { pusat: 32,  kalimalang: 18 } },
  { sku: 'MNM-007', barcode: '8992761101071', name: 'Kopi Sachet Kapal Api Mix',   cat: 'minuman', price:   1_500, hpp:   1_100, stock: { pusat: 320, kalimalang: 220 } },

  { sku: 'SNK-001', barcode: '8992441001012', name: 'Chitato Sapi Panggang 68g',   cat: 'snack', price:  10_500, hpp:   8_200, stock: { pusat: 36,  kalimalang: 18 } },
  { sku: 'SNK-002', barcode: '8992441001029', name: 'Taro Net Rumput Laut 70g',    cat: 'snack', price:   8_500, hpp:   6_500, stock: { pusat: 40,  kalimalang: 22 } },
  { sku: 'SNK-003', barcode: '8992441001036', name: 'Beng-Beng 25g',               cat: 'snack', price:   3_000, hpp:   2_300, stock: { pusat: 96,  kalimalang: 48 } },
  { sku: 'SNK-004', barcode: '8992441001043', name: 'Oreo Original 137g',          cat: 'snack', price:  13_500, hpp:  10_400, stock: { pusat: 24,  kalimalang: 14 } },
  { sku: 'SNK-005', barcode: '8992441001050', name: 'Roma Kelapa 300g',            cat: 'snack', price:  18_500, hpp:  15_000, stock: { pusat: 18,  kalimalang:  8 } },
  { sku: 'SNK-006', barcode: '8992441001067', name: 'Silverqueen Cashew 65g',      cat: 'snack', price:  18_000, hpp:  14_200, stock: { pusat: 24,  kalimalang: 12 } },
  { sku: 'SNK-007', barcode: '8992441001074', name: 'Khong Guan Mini Tin 200g',    cat: 'snack', price:  22_000, hpp:  18_500, stock: { pusat:  3,  kalimalang:  2 } },

  { sku: 'RKK-001', barcode: '8993012001019', name: 'Sampoerna Mild 16',           cat: 'rokok', price:  32_500, hpp:  28_900, stock: { pusat: 64,  kalimalang: 36 } },
  { sku: 'RKK-002', barcode: '8993012001026', name: 'Gudang Garam Surya 12',       cat: 'rokok', price:  25_000, hpp:  22_300, stock: { pusat: 48,  kalimalang: 28 } },
  { sku: 'RKK-003', barcode: '8993012001033', name: 'Marlboro Merah 20',           cat: 'rokok', price:  39_000, hpp:  34_800, stock: { pusat: 36,  kalimalang: 18 } },
  { sku: 'RKK-004', barcode: '8993012001040', name: 'Djarum Super 12',             cat: 'rokok', price:  26_500, hpp:  23_600, stock: { pusat: 40,  kalimalang: 22 } },

  { sku: 'RMH-001', barcode: '8994561001011', name: 'Sabun Cuci Sunlight 800ml',   cat: 'rumah', price:  21_500, hpp:  17_400, stock: { pusat: 24,  kalimalang: 14 } },
  { sku: 'RMH-002', barcode: '8994561001028', name: 'Rinso Anti Noda 770g',        cat: 'rumah', price:  21_000, hpp:  17_000, stock: { pusat: 18,  kalimalang:  9 } },
  { sku: 'RMH-003', barcode: '8994561001035', name: 'Pembersih Lantai SOS 800ml',  cat: 'rumah', price:  17_500, hpp:  13_900, stock: { pusat: 20,  kalimalang: 12 } },
  { sku: 'RMH-004', barcode: '8994561001042', name: 'Tisu Paseo 250s',             cat: 'rumah', price:  19_500, hpp:  15_400, stock: { pusat: 36,  kalimalang: 18 } },
  { sku: 'RMH-005', barcode: '8994561001059', name: 'Korek Api Tokai',             cat: 'rumah', price:   3_500, hpp:   2_400, stock: { pusat: 80,  kalimalang: 50 } },
  { sku: 'RMH-006', barcode: '8994561001066', name: 'Baterai ABC AA isi 4',        cat: 'rumah', price:  12_500, hpp:   9_800, stock: { pusat:  5,  kalimalang:  2 } },

  { sku: 'PRB-001', barcode: '8995661801015', name: 'Pasta Gigi Pepsodent 190g',   cat: 'pribadi', price:  18_500, hpp:  14_800, stock: { pusat: 24,  kalimalang: 12 } },
  { sku: 'PRB-002', barcode: '8995661801022', name: 'Sabun Mandi Lifebuoy 110g',   cat: 'pribadi', price:   5_500, hpp:   4_100, stock: { pusat: 60,  kalimalang: 32 } },
  { sku: 'PRB-003', barcode: '8995661801039', name: 'Shampoo Clear 170ml',         cat: 'pribadi', price:  29_000, hpp:  23_500, stock: { pusat: 18,  kalimalang:  9 } },
  { sku: 'PRB-004', barcode: '8995661801046', name: 'Pembalut Laurier Slim 24s',   cat: 'pribadi', price:  28_500, hpp:  23_200, stock: { pusat: 12,  kalimalang:  6 } },
  { sku: 'PRB-005', barcode: '8995661801053', name: 'Pampers Premium M-22',        cat: 'pribadi', price:  78_000, hpp:  66_000, stock: { pusat:  8,  kalimalang:  4 } },
];
const PROD = Object.fromEntries(PRODUCTS.map(p => [p.sku, p]));

// Daily sales (today = 2026-04-22)
const TODAY = '2026-04-22';

const TRANSAKSI = [
  { id: 'TRX-260422-0014', time: '07:32', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 4, total:  87_500 },
  { id: 'TRX-260422-0015', time: '07:48', kasir: 'Rina W',  cabang: 'pusat', method: 'qris',     items: 2, total:  21_000 },
  { id: 'TRX-260422-0016', time: '08:05', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 6, total: 124_500 },
  { id: 'TRX-260422-0017', time: '08:14', kasir: 'Rina W',  cabang: 'pusat', method: 'qris',     items: 1, total:   8_500 },
  { id: 'TRX-260422-0018', time: '08:22', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 3, total:  42_000 },
  { id: 'TRX-260422-0019', time: '08:41', kasir: 'Rina W',  cabang: 'pusat', method: 'transfer', items: 8, total: 198_000 },
  { id: 'TRX-260422-0020', time: '09:03', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 5, total:  73_500 },
  { id: 'TRX-260422-0021', time: '09:18', kasir: 'Rina W',  cabang: 'pusat', method: 'qris',     items: 2, total:  18_500 },
  { id: 'TRX-260422-0022', time: '09:34', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 4, total:  56_500 },
  { id: 'TRX-260422-0023', time: '09:55', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 1, total:   5_500 },
  { id: 'TRX-260422-0024', time: '10:12', kasir: 'Yuni P',  cabang: 'kalimalang', method: 'qris', items: 3, total:  39_500 },
  { id: 'TRX-260422-0025', time: '10:24', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 7, total: 156_000 },
  { id: 'TRX-260422-0026', time: '10:47', kasir: 'Yuni P',  cabang: 'kalimalang', method: 'cash', items: 2, total:  18_000 },
  { id: 'TRX-260422-0027', time: '11:08', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 5, total:  92_500 },
  { id: 'TRX-260422-0028', time: '11:29', kasir: 'Rina W',  cabang: 'pusat', method: 'qris',     items: 4, total:  68_000 },
  { id: 'TRX-260422-0029', time: '11:51', kasir: 'Yuni P',  cabang: 'kalimalang', method: 'cash', items: 6, total: 134_500 },
  { id: 'TRX-260422-0030', time: '12:14', kasir: 'Rina W',  cabang: 'pusat', method: 'transfer', items: 9, total: 248_000 },
  { id: 'TRX-260422-0031', time: '12:36', kasir: 'Yuni P',  cabang: 'kalimalang', method: 'qris', items: 3, total:  47_000 },
  { id: 'TRX-260422-0032', time: '12:58', kasir: 'Yuni P',  cabang: 'kalimalang', method: 'cash', items: 4, total:  82_500 },
  { id: 'TRX-260422-0033', time: '13:21', kasir: 'Rina W',  cabang: 'pusat', method: 'cash',     items: 2, total:  29_500 },
];

// Hourly heatmap (7-21h × Sun-Sat = simplified). Values 0-100 (intensity).
// Row = day (0=Sun .. 6=Sat). Col = hour 7..20
const HOURLY_HEATMAP = [
  [10, 22, 38, 45, 58, 72, 80, 68, 52, 64, 78, 88, 70, 42], // Sun
  [ 8, 18, 30, 38, 48, 65, 72, 60, 42, 54, 68, 76, 60, 32], // Mon
  [ 8, 16, 28, 35, 45, 60, 68, 56, 40, 50, 62, 72, 55, 30], // Tue
  [ 9, 18, 30, 38, 48, 64, 72, 58, 40, 52, 64, 74, 58, 32], // Wed
  [10, 20, 32, 40, 52, 68, 75, 62, 44, 56, 70, 80, 62, 35], // Thu
  [12, 24, 36, 46, 58, 75, 84, 70, 50, 62, 78, 90, 75, 48], // Fri
  [14, 30, 45, 55, 68, 82, 90, 78, 60, 72, 86, 95, 82, 58], // Sat
];
const HEATMAP_DAYS  = ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'];
const HEATMAP_HOURS = ['07','08','09','10','11','12','13','14','15','16','17','18','19','20'];

// Top SKUs today
const TOP_SKUS = [
  { sku: 'SMB-006', qty: 84,  total: 294_000 },
  { sku: 'MNM-001', qty: 62,  total: 279_000 },
  { sku: 'MNM-007', qty: 138, total: 207_000 },
  { sku: 'SNK-003', qty: 56,  total: 168_000 },
  { sku: 'MNM-003', qty: 28,  total: 154_000 },
  { sku: 'PRB-002', qty: 26,  total: 143_000 },
  { sku: 'RMH-005', qty: 38,  total: 133_000 },
  { sku: 'SMB-002', qty:  3,  total: 109_500 },
  { sku: 'SMB-001', qty:  1,  total:  78_000 },
  { sku: 'MNM-004', qty:  9,  total:  67_500 },
];

// Kasir leaderboard today
const KASIR_LEADERBOARD = [
  { name: 'Rina Wahyuni',    cabang: 'pusat',      trx: 14, omzet: 1_240_000, avgTicket:  88_571 },
  { name: 'Yuni Pratiwi',    cabang: 'kalimalang', trx:  6, omzet:   458_500, avgTicket:  76_417 },
  { name: 'Andri Saputra',   cabang: 'pusat',      trx:  0, omzet:         0, avgTicket:       0 },
  { name: 'Wati Susanto',    cabang: 'kalimalang', trx:  0, omzet:         0, avgTicket:       0 },
];

// Shifts
const SHIFTS = [
  { id: 'SH-260422-P', kasir: 'Rina Wahyuni',  cabang: 'pusat',      open: '06:30', close: null, modal: 500_000, omzet: 1_240_000, status: 'open' },
  { id: 'SH-260422-K', kasir: 'Yuni Pratiwi',  cabang: 'kalimalang', open: '07:00', close: null, modal: 500_000, omzet:   458_500, status: 'open' },
  { id: 'SH-260421-P-S', kasir: 'Andri Saputra', cabang: 'pusat',    open: '14:00', close: '22:00', modal: 500_000, omzet: 1_842_000, status: 'closed', selisih: -12_500 },
  { id: 'SH-260421-K-S', kasir: 'Wati Susanto',  cabang: 'kalimalang', open: '14:00', close: '22:00', modal: 500_000, omzet:   685_500, status: 'closed', selisih:    5_000 },
  { id: 'SH-260421-P-P', kasir: 'Rina Wahyuni',  cabang: 'pusat',    open: '06:30', close: '14:00', modal: 500_000, omzet: 1_356_500, status: 'closed', selisih:        0 },
  { id: 'SH-260421-K-P', kasir: 'Yuni Pratiwi',  cabang: 'kalimalang', open: '07:00', close: '14:30', modal: 500_000, omzet:   524_000, status: 'closed', selisih:   -3_000 },
];

// Promo & member
const PROMOS = [
  { id: 'PRM-001', name: 'Diskon Sembako Akhir Bulan', type: 'diskon',   target: 'Kategori: Sembako', value: '5%',  start: '2026-04-25', end: '2026-04-30', status: 'aktif' },
  { id: 'PRM-002', name: 'Bundle Indomie + Telur',     type: 'bundle',   target: 'Indomie 5pcs + Telur 1kg', value: 'Rp 42.500', start: '2026-04-15', end: '2026-05-15', status: 'aktif' },
  { id: 'PRM-003', name: 'Voucher Member Silver',      type: 'voucher',  target: 'Member Silver+', value: 'Rp 10.000 min Rp 100rb', start: '2026-04-01', end: '2026-04-30', status: 'aktif' },
  { id: 'PRM-004', name: 'Diskon Rokok Cashless',      type: 'diskon',   target: 'Kategori: Rokok (QRIS/Transfer)', value: '2%',  start: '2026-04-10', end: '2026-04-30', status: 'aktif' },
  { id: 'PRM-005', name: 'Promo Lebaran',              type: 'diskon',   target: 'Semua kategori', value: '10%', start: '2026-03-25', end: '2026-04-05', status: 'selesai' },
];

const MEMBERS = [
  { id: 'M-001023', name: 'Hendra Wijaya',   tier: 'gold',   trx: 142, spend: 18_450_000, joined: '2024-03-15' },
  { id: 'M-001045', name: 'Ratna Sari',      tier: 'silver', trx:  86, spend:  9_240_000, joined: '2024-08-22' },
  { id: 'M-001078', name: 'Dewi Lestari',    tier: 'silver', trx:  68, spend:  7_120_000, joined: '2024-11-04' },
  { id: 'M-001124', name: 'Agus Pranoto',    tier: 'bronze', trx:  34, spend:  3_650_000, joined: '2025-02-18' },
  { id: 'M-001156', name: 'Maria Susanti',   tier: 'bronze', trx:  22, spend:  2_180_000, joined: '2025-06-09' },
];

// Recent refunds
const REFUNDS = [
  { id: 'RF-260420-001', trx: 'TRX-260420-0118', date: '2026-04-20', kasir: 'Rina W', amount: 36_500, reason: 'Minyak goreng kemasan bocor', status: 'approved' },
  { id: 'RF-260418-001', trx: 'TRX-260418-0094', date: '2026-04-18', kasir: 'Yuni P', amount: 78_000, reason: 'Pampers salah ukuran (M ditukar L)', status: 'approved' },
  { id: 'RF-260415-001', trx: 'TRX-260415-0167', date: '2026-04-15', kasir: 'Rina W', amount: 13_500, reason: 'Oreo expired', status: 'approved' },
];

// Sales trend (per-day for current period)
const DAILY_SALES = [
  { date: '2026-04-01', total:  4_240_000 }, { date: '2026-04-02', total:  3_980_000 },
  { date: '2026-04-03', total:  4_125_000 }, { date: '2026-04-04', total:  5_840_000 },
  { date: '2026-04-05', total:  6_240_000 }, { date: '2026-04-06', total:  4_580_000 },
  { date: '2026-04-07', total:  4_120_000 }, { date: '2026-04-08', total:  3_960_000 },
  { date: '2026-04-09', total:  4_280_000 }, { date: '2026-04-10', total:  4_540_000 },
  { date: '2026-04-11', total:  5_920_000 }, { date: '2026-04-12', total:  6_180_000 },
  { date: '2026-04-13', total:  4_420_000 }, { date: '2026-04-14', total:  4_180_000 },
  { date: '2026-04-15', total:  4_320_000 }, { date: '2026-04-16', total:  4_580_000 },
  { date: '2026-04-17', total:  4_840_000 }, { date: '2026-04-18', total:  6_120_000 },
  { date: '2026-04-19', total:  6_580_000 }, { date: '2026-04-20', total:  4_920_000 },
  { date: '2026-04-21', total:  4_580_000 }, { date: '2026-04-22', total:  1_698_500 }, // today (in progress)
];

const SALES_TARGET_DAILY = 4_500_000;

// Category sales summary (current period)
const CATEGORY_SALES = [
  { cat: 'sembako', omzet: 32_400_000, margin: 4_120_000, share: 0.34 },
  { cat: 'minuman', omzet: 18_240_000, margin: 4_240_000, share: 0.19 },
  { cat: 'rokok',   omzet: 16_800_000, margin: 1_840_000, share: 0.18 },
  { cat: 'snack',   omzet: 12_840_000, margin: 3_120_000, share: 0.13 },
  { cat: 'rumah',   omzet:  8_420_000, margin: 2_080_000, share: 0.09 },
  { cat: 'pribadi', omzet:  6_380_000, margin: 1_560_000, share: 0.07 },
];

// Slow-moving stock
const SLOW_MOVING = [
  { sku: 'SNK-007', daysSinceLastSale: 18, stockOnHand:  5 },
  { sku: 'PRB-005', daysSinceLastSale: 12, stockOnHand: 12 },
  { sku: 'SNK-005', daysSinceLastSale:  9, stockOnHand: 26 },
  { sku: 'RMH-002', daysSinceLastSale:  7, stockOnHand: 27 },
];

// ── Helpers ─────────────────────────────────────────────────────────────────

function rupiah(n, opts = {}) {
  if (n == null || isNaN(n)) return '—';
  const sign = n < 0 ? '-' : '';
  const abs = Math.abs(Math.round(n));
  if (opts.compact && abs >= 1_000_000) {
    if (abs >= 1_000_000_000) return sign + (abs / 1_000_000_000).toFixed(2).replace('.', ',') + ' M';
    return sign + (abs / 1_000_000).toFixed(1).replace('.', ',') + ' jt';
  }
  if (opts.compact && abs >= 1_000) {
    return sign + (abs / 1_000).toFixed(0) + 'rb';
  }
  const str = abs.toLocaleString('id-ID');
  return (opts.sym ? 'Rp ' : '') + sign + str;
}

function formatDateID(iso) {
  if (!iso) return '—';
  const m = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Agu','Sep','Okt','Nov','Des'];
  const d = new Date(iso);
  return `${d.getDate()} ${m[d.getMonth()]} ${d.getFullYear()}`;
}

function periodLabel(id) {
  return PERIOD_LIST.find(p => p.id === id)?.label || id;
}

function methodLabel(m) {
  return ({ cash: 'Tunai', qris: 'QRIS', transfer: 'Transfer', kartu: 'Debit/Kredit' })[m] || m;
}

function totalStock(p) {
  return Object.values(p.stock).reduce((a, b) => a + b, 0);
}

function isLowStock(p, threshold = 10) {
  return totalStock(p) < threshold;
}

function hash(s) {
  let h = 0;
  for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;
  return h;
}

Object.assign(window, {
  TENANT, CABANG_LIST, PERIOD_LIST, CURRENT_PERIOD, ROLES,
  CATEGORIES, PRODUCTS, PROD,
  TODAY, TRANSAKSI, HOURLY_HEATMAP, HEATMAP_DAYS, HEATMAP_HOURS,
  TOP_SKUS, KASIR_LEADERBOARD, SHIFTS,
  PROMOS, MEMBERS, REFUNDS, DAILY_SALES, SALES_TARGET_DAILY,
  CATEGORY_SALES, SLOW_MOVING,
  rupiah, formatDateID, periodLabel, methodLabel, totalStock, isLowStock, hash,
});
