Smart Order Routing Optimization System

Smart Order Routing Optimization System

Simulate and find the most efficient fulfillment route for any order.

Could not fulfill the order from any single warehouse due to stock or shipping limitations.

`}

Routing Comparison

${optionsHtml}
WarehouseCostTimeStatus
`; document.getElementById('download-pdf-btn').addEventListener('click', generatePdf); lucide.createIcons(); }; const renderDataConfig = () => { const configContent = document.getElementById('content-config'); if (!configContent) return; // For simplicity, we'll use JSON textareas for configuration configContent.innerHTML = `
${createConfigCard('Warehouses', 'warehouses-json', appData.warehouses)} ${createConfigCard('Inventory', 'inventory-json', appData.inventory)} ${createConfigCard('Shipping Rules', 'shipping-rules-json', appData.shippingRules)}
`; document.getElementById('save-config-btn').addEventListener('click', () => { try { appData.warehouses = JSON.parse(document.getElementById('warehouses-json').value); appData.inventory = JSON.parse(document.getElementById('inventory-json').value); appData.shippingRules = JSON.parse(document.getElementById('shipping-rules-json').value); alert('Configuration saved successfully!'); // Re-render simulator to update SKU dropdown renderSimulator(); } catch (e) { alert('Error: Invalid JSON format. Please check your data.'); } }); }; const createConfigCard = (title, id, data) => `

${title}

`; const generatePdf = () => { loadingOverlay.style.display = 'flex'; const { jsPDF } = window.jspdf; const pdfContent = document.getElementById('pdf-content-area'); const pdfHeader = document.getElementById('pdf-header'); document.getElementById('pdf-generated-date').textContent = new Date().toLocaleDateString('en-US'); pdfHeader.classList.remove('hidden'); html2canvas(pdfContent, { scale: 2, useCORS: true, logging: false }) .then(canvas => { pdfHeader.classList.add('hidden'); const imgData = canvas.toDataURL('image/jpeg', 0.95); const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pageMargin = 40; const contentWidth = pdfWidth - (pageMargin * 2); const imgProps = pdf.getImageProperties(imgData); const imgHeight = (imgProps.height * contentWidth) / imgProps.width; pdf.addImage(imgData, 'JPEG', pageMargin, pageMargin, contentWidth, imgHeight); pdf.save('Order-Routing-Report.pdf'); loadingOverlay.style.display = 'none'; }).catch(err => { console.error("PDF generation failed:", err); pdfHeader.classList.add('hidden'); loadingOverlay.style.display = 'none'; alert('An error occurred generating the PDF.'); }); }; // --- TAB NAVIGATION & INITIALIZATION --- const initializeTabs = () => { const tabsContainer = document.getElementById('tabs-container'); const prevTabBtn = document.getElementById('prev-tab-btn'); const nextTabBtn = document.getElementById('next-tab-btn'); let activeTabIndex = 0; const tabs = [ { name: 'Routing Simulator', id: 'simulator', renderer: renderSimulator }, { name: 'Data Configuration', id: 'config', renderer: renderDataConfig } ]; tabsContainer.innerHTML = tabs.map(t => ``).join(''); mainContent.innerHTML = tabs.map(t => `
`).join(''); const tabButtons = tabsContainer.querySelectorAll('.tab-btn'); const tabContents = mainContent.querySelectorAll('.tab-content'); const switchTab = (index) => { activeTabIndex = index; tabButtons.forEach((btn, i) => btn.classList.toggle('active', i === index)); tabContents.forEach((content, i) => content.classList.toggle('hidden', i !== index)); prevTabBtn.disabled = activeTabIndex === 0; nextTabBtn.disabled = activeTabIndex === tabs.length - 1; }; tabButtons.forEach((btn, index) => btn.addEventListener('click', () => switchTab(index))); prevTabBtn.addEventListener('click', () => { if (activeTabIndex > 0) switchTab(activeTabIndex - 1); }); nextTabBtn.addEventListener('click', () => { if (activeTabIndex < tabs.length - 1) switchTab(activeTabIndex + 1); }); tabs.forEach(t => t.renderer()); switchTab(0); }; initializeTabs(); });
Scroll to Top