Corporate Whistleblower Policy Compliance Tool

Corporate Whistleblower Policy Compliance Tool

Assess your policy against key compliance benchmarks.

Company & Policy Details

Step 1 of 3

${index + 1}. ${q.text}

`; }); container.innerHTML = html; } function showTab(tabNumber) { document.querySelectorAll('.tab-pane').forEach(p => p.classList.add('hidden')); getEl(`tab-${tabNumber}`).classList.remove('hidden'); document.querySelectorAll('.tab-btn').forEach(b => { b.classList.toggle('active', b.dataset.tab === `tab-${tabNumber}`); b.classList.toggle('inactive', b.dataset.tab !== `tab-${tabNumber}`); }); currentTab = tabNumber; updateNavigation(); } function updateNavigation() { prevBtn.disabled = currentTab === 1; nextBtn.style.display = currentTab === totalTabs ? 'none' : 'inline-block'; nextBtn.textContent = (currentTab === totalTabs - 1) ? 'Generate Report' : 'Next'; stepIndicator.textContent = `Step ${currentTab} of ${totalTabs}`; } function saveTabData() { if (currentTab === 1) { appData.companyName = getEl('companyName').value; appData.policyName = getEl('policyName').value; appData.policyDate = getEl('policyDate').value; } else if (currentTab === 2) { appData.checklistResults = []; const form = getEl('form-checklist'); checklistQuestions.forEach(q => { const answer = form.elements[q.id].value; appData.checklistResults.push({ id: q.id, text: q.text, answer: parseInt(answer), // 1 for Yes, 0 for No recommendation: q.recommendation }); }); } } function validateTab(tabNumber) { const formId = { 1: 'form-policy-info', 2: 'form-checklist' }[tabNumber]; if (!formId) return true; const form = getEl(formId); if (form && !form.checkValidity()) { form.reportValidity(); return false; } return true; } function generateReport() { saveTabData(); const score = appData.checklistResults.reduce((sum, item) => sum + item.answer, 0); const total = checklistQuestions.length; const percentage = Math.round((score / total) * 100); let scoreColor = 'bg-green-500'; let assessment = 'Strong'; if (percentage < 50) { scoreColor = 'bg-red-500'; assessment = 'Needs Significant Improvement'; } else if (percentage < 80) { scoreColor = 'bg-yellow-500'; assessment = 'Room for Improvement'; } const recommendations = appData.checklistResults.filter(r => r.answer === 0); let html = `

Compliance Report

Policy Details

Company: ${appData.companyName}

Policy: ${appData.policyName}

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