Supplier & Vendor Performance Tracker

Supplier & Vendor Performance Tracker

Monitor supplier performance with key metrics and data visualization.

No supplier data found. Add suppliers and performance records to see the dashboard.

${s.contact || 'No contact'}

`).join(''); if(state.suppliers.length === 0) suppliersListEl.innerHTML = `

No suppliers added yet.

`; }; // --- INITIALIZATION & EVENT HANDLERS --- function initialize() { addDeliveryForm.addEventListener('submit', handleAddDelivery); addSupplierForm.addEventListener('submit', handleAddSupplier); downloadPdfBtn.addEventListener('click', generatePdf); document.getElementById('delivery-date').valueAsDate = new Date(); renderAll(); } const switchTab = (tabName) => { state.currentTab = tabName; Object.values(tabButtons).forEach(b => b.classList.remove('active')); Object.values(tabContents).forEach(c => c.classList.add('hidden')); if(tabButtons[tabName]) tabButtons[tabName].classList.add('active'); if(tabContents[tabName]) tabContents[tabName].classList.remove('hidden'); }; Object.keys(tabButtons).forEach(k => tabButtons[k]?.addEventListener('click', () => switchTab(k))); // --- PDF GENERATION --- async function generatePdf() { if (!state.analysis) return; const { jsPDF } = window.jspdf; document.getElementById('pdf-report-date').textContent = `Generated: ${new Date().toLocaleString()}`; document.getElementById('pdf-summary-grid').innerHTML = `

Top Performer

${state.analysis.topPerformer}

Avg. On-Time Rate

${avgOnTimeEl.textContent}

Avg. Quality Score

${avgQualityEl.textContent}
`; document.getElementById('pdf-chart-img').src = performanceChart.toBase64Image(); const tableHTML = `${state.analysis.performance.map(s => ``).join('')}
SupplierOverall ScoreOn-Time RateAvg. QualityTotal Value
${s.name}${s.score.toFixed(1)}${s.onTimeRate.toFixed(1)}%${s.avgQuality.toFixed(1)}$${s.totalValue.toFixed(2)}
`; document.getElementById('pdf-table-container').innerHTML = tableHTML; const pdfContainer = document.getElementById('pdf-container'); pdfContainer.classList.remove('invisible', '-left-[9999px]'); try { const canvas = await html2canvas(document.getElementById('pdf-report'), { scale: 2 }); const imgData = canvas.toDataURL('image/jpeg', 0.9); const pdf = new jsPDF({ orientation: 'p', unit: 'px', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; pdf.addImage(imgData, 'JPEG', 0, 0, pdfWidth, pdfHeight); pdf.save('Supplier_Performance_Report.pdf'); } catch (error) { console.error("PDF generation failed:", error); } finally { pdfContainer.classList.add('invisible', '-left-[9999px]'); } } initialize(); });
Scroll to Top