Corporate Whistleblower Policy Compliance Tool

Corporate Whistleblower Policy Compliance Tool

Assess your policy against key compliance benchmarks.

Company & Policy Details

Step 1 of 3

Effective Date: ${appData.policyDate}

Overall Compliance Score

${percentage}%

${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(); });
Scroll to Top