${panels}
`; } function addDim(key){ const input = document.getElementById('dim-input-'+key); const val = input.value.trim(); if(!val) return; if(DB.dimensions[key].includes(val)){ toast('Value already exists','err'); return; } DB.dimensions[key].push(val); saveDB(); render(); toast('Dimension updated','ok'); } function removeDim(key, idx){ DB.dimensions[key].splice(idx, 1); saveDB(); render(); toast('Dimension updated','ok'); } window.addDim = addDim; window.removeDim = removeDim; function backupJSON(){ const str = JSON.stringify(DB, null, 2); const blob = new Blob([str], {type:'application/json'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `delta_invest_backup_${todayISO()}.json`; a.click(); } function restoreJSON(e){ const file = e.target.files[0]; if(!file) return; const r = new FileReader(); r.onload = function(evt){ try{ const parsed = JSON.parse(evt.target.result); if(!parsed.counters || !parsed.inventory){ toast('Invalid backup file format','err'); return; } if(confirm('Are you sure you want to replace all current browser data with this backup file?')){ DB = parsed; saveDB(); render(); toast('System restored successfully','ok'); } }catch(err){ toast('Error parsing file','err'); } }; r.readAsText(file); } function clearAllData(){ if(confirm('CRITICAL WARNING: This will permanently delete all records, items, transactions, and settings stored in this browser. Are you absolutely sure?')){ DB = seedData(); saveDB(); render(); toast('System cleared completely','ok'); } } window.backupJSON = backupJSON; window.restoreJSON = restoreJSON; window.clearAllData = clearAllData; /* ========================================================================= EXCEL & VIEW EXPORT FUNCTION ========================================================================= */ function exportView(viewKey){ let rows = []; let name = ''; if(viewKey==='inventory'){ rows = DB.inventory; name = 'Inventory'; } else if(viewKey==='suppliers'){ rows = DB.suppliers; name = 'Suppliers'; } else if(viewKey==='customers'){ rows = DB.customers; name = 'Customers'; } else if(viewKey==='purchaseOrders'){ rows = DB.purchaseOrders.map(p=>({ ...p, supplierName: supplierName(p.supplierId) })); name = 'Purchase_Orders'; } else if(viewKey==='salesOrders'){ rows = DB.salesOrders.map(s=>({ ...s, customerName: customerName(s.customerId) })); name = 'Sales_Orders'; } else if(viewKey==='receipts'){ rows = DB.receipts.map(r=>({ ...r, customerName: customerName(r.customerId) })); name = 'Receipts'; } else if(viewKey==='payments'){ rows = DB.payments.map(p=>({ ...p, supplierName: supplierName(p.supplierId, p.supplierNameFree) })); name = 'Payments'; } else if(viewKey==='workOrders'){ rows = DB.workOrders.map(w=>({ ...w, supplierName: supplierName(w.supplierId, w.supplierNameFree) })); name = 'Work_Orders'; } else if(viewKey==='pgTracking'){ rows = DB.pgTracking.map(p=>({ ...p, supplierName: supplierName(p.supplierId, p.supplierNameFree) })); name = 'PG_Tracking'; } if(!rows.length){ toast('No records available to export','err'); return; } const ws = XLSX.utils.json_to_sheet(rows); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, name); XLSX.writeFile(wb, `delta_invest_${name.toLowerCase()}_${todayISO()}.xlsx`); } function exportAllExcel(){ const wb = XLSX.utils.book_new(); const addSheet = (data, name, mapFn) => { const list = mapFn ? data.map(mapFn) : data; const ws = XLSX.utils.json_to_sheet(list.length ? list : [{Message:'No records found'}]); XLSX.utils.book_append_sheet(wb, ws, name); }; addSheet(DB.inventory, 'Inventory Master'); addSheet(DB.suppliers, 'Suppliers'); addSheet(DB.customers, 'Customers'); addSheet(DB.purchaseOrders, 'Purchase Orders', p=>({ ...p, supplierName: supplierName(p.supplierId) })); addSheet(DB.poDetails, 'PO Line Details'); addSheet(DB.salesOrders, 'Sales Orders', s=>({ ...s, customerName: customerName(s.customerId) })); addSheet(DB.soDetails, 'SO Line Details'); addSheet(DB.receipts, 'Receipts', r=>({ ...r, customerName: customerName(r.customerId) })); addSheet(DB.payments, 'Payments', p=>({ ...p, supplierName: supplierName(p.supplierId, p.supplierNameFree) })); addSheet(DB.workOrders, 'Work Orders', w=>({ ...w, supplierName: supplierName(w.supplierId, w.supplierNameFree) })); addSheet(DB.pgTracking, 'PG Tracking', p=>({ ...p, supplierName: supplierName(p.supplierId, p.supplierNameFree) })); XLSX.writeFile(wb, `delta_invest_full_system_${todayISO()}.xlsx`); toast('Full Excel database workbook downloaded','ok'); } window.exportAllExcel = exportAllExcel; /* ========================================================================= BOOTSTRAP ========================================================================= */ window.onload = function(){ loadDB(); render(); };