Smart Wholesale Order Forecasting System

Smart Wholesale Order Forecasting System

Use historical data to predict future order volumes.

Forecast Awaiting Data

Input your sales history in the 'Historical Data' tab and run a forecast to see your results here.

Est. Growth

${growth.toFixed(1)}%

`; // 2. Populate table data let tableHtml = ` ${lastResult.forecast.map(item => ` `).join('')}
Period Forecasted Sales ($)
${item.period}$${item.sales.toLocaleString()}
`; document.getElementById('pdf-table-container').innerHTML = tableHtml; try { const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const margin = 40; const chartImage = forecastChart.toBase64Image('image/png', 1.0); const contentCanvas = await html2canvas(document.getElementById('pdf-content'), { scale: 2 }); const contentImgData = contentCanvas.toDataURL('image/png'); const contentImgProps = pdf.getImageProperties(contentImgData); const contentPdfHeight = (contentImgProps.height * (pdfWidth - margin*2)) / contentImgProps.width; pdf.addImage(contentImgData, 'PNG', margin, margin, pdfWidth - margin*2, contentPdfHeight); const chartImgProps = pdf.getImageProperties(chartImage); const chartPdfHeight = (chartImgProps.height * (pdfWidth - margin*2)) / chartImgProps.width; const yPos = margin + contentPdfHeight + 20; pdf.addPage(); pdf.text("Forecast Visualization", margin, margin); pdf.addImage(chartImage, 'PNG', margin, margin + 20, pdfWidth - margin * 2, chartPdfHeight); pdf.save('Wholesale_Order_Forecast.pdf'); } catch (e) { console.error("PDF generation failed:", e); alert("An error occurred generating the PDF."); } } // --- Event Listeners --- tabs.forEach((tab, index) => tab.btn.addEventListener('click', () => switchTab(index))); prevBtn.addEventListener('click', () => switchTab(currentTab - 1)); nextBtn.addEventListener('click', () => switchTab(currentTab + 1)); addRowBtn.addEventListener('click', () => { const lastPeriod = historicalData.length > 0 ? historicalData[historicalData.length - 1].period : 0; historicalData.push({ period: lastPeriod + 1, sales: 0 }); renderDataTable(); }); dataTableBody.addEventListener('change', (e) => { if(e.target.classList.contains('table-input')) { const index = parseInt(e.target.closest('tr').dataset.index); const field = e.target.dataset.field; historicalData[index][field] = parseInt(e.target.value); } }); dataTableBody.addEventListener('click', (e) => { const deleteBtn = e.target.closest('.delete-row-btn'); if (deleteBtn) { const index = parseInt(deleteBtn.closest('tr').dataset.index); historicalData.splice(index, 1); renderDataTable(); } }); generateForecastBtn.addEventListener('click', handleGenerateForecast); downloadPdfBtn.addEventListener('click', handlePdfDownload); // --- Initialization --- historicalData = JSON.parse(JSON.stringify(sampleData)); renderDataTable(); switchTab(0); updateNavButtons(); lucide.createIcons(); });
Scroll to Top