Overall Compliance Score
${assessment}
Improvement Areas
${recommendations.length === 0 ? '
Excellent! Your policy appears to meet all key benchmarks in this assessment.
' : `
${recommendations.map(r => `- Issue: A 'No' was indicated for: '${r.text}'
Recommendation: ${r.recommendation} `).join('')}
`}
`;
getEl('report-container').innerHTML = html;
showTab(3);
}
function handlePdfDownload() {
if (!appData.checklistResults) { alert('Please generate a report first.'); return; }
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(20);
doc.text("Whistleblower Policy Compliance Report", 105, 20, { align: 'center' });
doc.setFontSize(12);
doc.text("Policy Details", 14, 40);
doc.setFontSize(10);
doc.text(`Company: ${appData.companyName}\nPolicy: ${appData.policyName}\nEffective Date: ${appData.policyDate}`, 14, 48);
const score = appData.checklistResults.reduce((sum, item) => sum + item.answer, 0);
const percentage = Math.round((score / checklistQuestions.length) * 100);
doc.setFontSize(12);
doc.text(`Overall Compliance Score: ${percentage}%`, 14, 70);
const tableBody = appData.checklistResults.map(r => [r.text, r.answer === 1 ? 'Yes' : 'No']);
doc.autoTable({
startY: 80,
head: [['Checklist Item', 'Response']],
body: tableBody,
theme: 'grid',
headStyles: { fillColor: [41, 128, 185] },
didParseCell: function(data) {
if (data.section === 'body' && data.column.index === 1) {
if (data.cell.raw === 'No') data.cell.styles.textColor = [220, 53, 69];
}
}
});
let finalY = doc.autoTable.previous.finalY + 15;
const recommendations = appData.checklistResults.filter(r => r.answer === 0);
if(recommendations.length > 0) {
doc.setFontSize(12);
doc.text("Improvement Areas & Recommendations", 14, finalY);
const recText = recommendations.map(r => `- For the issue "${r.text}", it is recommended to:\n ${r.recommendation}`).join('\n\n');
doc.setFontSize(9);
doc.text(recText, 14, finalY + 7, { maxWidth: 180 });
}
doc.setFontSize(8);
doc.setTextColor(150);
doc.text("This report was generated by the Corporate Whistleblower Policy Compliance Tool.", 105, doc.internal.pageSize.height - 10, { align: 'center' });
doc.save(`Whistleblower-Report-${appData.companyName.replace(/\s/g, '_')}.pdf`);
}
// --- Event Listeners & Initialization ---
nextBtn.addEventListener('click', () => {
if (!validateTab(currentTab)) return;
saveTabData();
if (currentTab < totalTabs - 1) {
showTab(currentTab + 1);
} else {
generateReport();
}
});
prevBtn.addEventListener('click', () => {
if (currentTab > 1) {
saveTabData();
showTab(currentTab - 1);
}
});
getEl('download-pdf-btn').addEventListener('click', handlePdfDownload);
// Initial load
populateChecklist();
updateNavigation();
});