Recommendations
${recommendations.length === 0 ? '
No immediate recommendations. All areas are compliant.
' : `
${recommendations.map(r => `- ${r.status}: ${r.text} - ${r.recommendation}
`).join('')}
`}
`;
getElement('report-output').innerHTML = html;
showTab(3);
};
const handlePdfDownload = () => {
if (!appData.auditResults) {
alert('Please generate a report first.');
return;
}
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(20);
doc.text("Supplier Ethics Compliance Audit Report", 105, 20, { align: 'center' });
doc.setFontSize(12);
doc.text("Audit Summary", 14, 40);
doc.setFontSize(10);
doc.text(`Supplier: ${appData.supplierName}\nLocation: ${appData.supplierLocation}\nAudit Date: ${appData.auditDate}\nAuditor: ${appData.auditorName}`, 14, 48);
const totalPossibleScore = appData.auditResults.length * 2;
const actualScore = appData.auditResults.reduce((sum, item) => sum + item.value, 0);
const percentage = totalPossibleScore > 0 ? (actualScore / totalPossibleScore * 100).toFixed(1) : 0;
doc.setFontSize(12);
doc.text(`Overall Compliance Score: ${percentage}%`, 14, 70);
const tableBody = appData.auditResults.map(r => [r.category, r.text, r.status]);
doc.autoTable({
startY: 80,
head: [['Category', 'Audit Point', 'Status']],
body: tableBody,
theme: 'grid',
headStyles: { fillColor: [41, 128, 185] },
didParseCell: function(data) {
if (data.section === 'body' && data.column.index === 2) {
if (data.cell.raw === 'Non-Compliant') data.cell.styles.textColor = [220, 53, 69];
if (data.cell.raw === 'Needs Improvement') data.cell.styles.textColor = [245, 158, 11];
if (data.cell.raw === 'Compliant') data.cell.styles.textColor = [25, 135, 84];
}
}
});
const finalY = doc.autoTable.previous.finalY + 15;
const recommendations = appData.auditResults.filter(r => r.value < 2);
if(recommendations.length > 0) {
doc.setFontSize(12);
doc.text("Recommendations", 14, finalY);
const recText = recommendations.map(r => `- ${r.status}: ${r.text}\n Recommendation: ${r.recommendation}`).join('\n');
doc.setFontSize(9);
doc.text(recText, 14, finalY + 7);
}
doc.setFontSize(8);
doc.setTextColor(150);
doc.text("Disclaimer: This audit tool is for guidance purposes only.", 105, doc.internal.pageSize.height - 10, { align: 'center' });
doc.save(`Supplier-Ethics-Audit-${appData.supplierName.replace(/\s/g, '_')}.pdf`);
};
// Event Listeners
nextBtn.addEventListener('click', () => {
if (!validateTab(currentTab)) return;
saveTabData();
if (currentTab < totalTabs) {
if (currentTab === totalTabs - 1) {
generateReport();
} else {
showTab(currentTab + 1);
}
}
});
prevBtn.addEventListener('click', () => {
if (currentTab > 1) {
saveTabData();
showTab(currentTab - 1);
}
});
downloadPdfBtn.addEventListener('click', handlePdfDownload);
// Initial Setup
populateChecklist();
updateNavigation();
});