Export Compliance Plan Document Generator
1. Export Control Classifications
Define the key ECCNs (Export Control Classification Numbers) or USML (U.S. Munitions List) Categories for your products/technology.
| List | Code | Item Description | Control Reason | Actions |
|---|
2. Restricted Party Screening Steps
Define the exact procedural steps for screening a transaction.
| # | Procedure Step | Action |
|---|
Export Compliance Plan Document Draft
Go to the Plan Builder and Control Definitions tabs to define the content.
Please define at least one Classification and one Screening Step in the Control Definitions tab.
'; pdfDownloadBtn.disabled = true; return; } let classTableHTML = `| List | Code | Item Description | Control Reason |
|---|---|---|---|
| ${c.type} | ${c.code} | ${c.item} | ${c.reason} |
- `;
screeningSteps.forEach(s => {
screeningListHTML += `
- ${s.step} `; }); screeningListHTML += `
EXPORT COMPLIANCE PLAN
${data.company_name} | Version ${data.version_number} | Effective: ${data.policy_date}
1. Executive Summary & Policy Statement
**Management Commitment:**
${data.policy_commitment || 'N/A'}
Compliance Officer: ${data.policy_owner || 'N/A'}
2. Export Control Classifications (ECCN / USML)
This table lists the official export control classifications for our primary products and technology:
${classTableHTML}3. Restricted Party Screening Procedures
Policy: ${data.screening_policy || 'N/A'}
Mandatory Screening Steps:
${screeningListHTML}4. Documentation & Training
Documentation Policy: ${data.documentation_policy || 'N/A'}
Training Policy: ${data.training_policy || 'N/A'}
Internal Audit Policy: ${data.audit_policy || 'N/A'}
WARNING: This is a document template and must be reviewed by legal counsel.
`; reviewContent.innerHTML = html; pdfDownloadBtn.disabled = false; switchTab(2); // Switch to review tab }; /** * PDF Generation Function */ const downloadPDF = () => { const data = getMetaFormData(); const jsPDF = window.jspdf.jsPDF; const doc = new jsPDF('p', 'pt', 'a4'); let currentY = 40; const margin = 40; const pageWidth = doc.internal.pageSize.width; const maxWidth = pageWidth - (margin * 2); const checkPageBreak = (spaceNeeded) => { if (currentY + spaceNeeded > doc.internal.pageSize.height - margin) { doc.addPage(); currentY = margin; } }; const addSectionHeader = (title, color = [0, 0, 0]) => { checkPageBreak(30); doc.setFontSize(16); doc.setFont('Helvetica', 'bold'); doc.setTextColor(color[0], color[1], color[2]); doc.text(title, margin, currentY); currentY += 10; doc.setLineWidth(0.5); doc.setDrawColor(200); doc.line(margin, currentY, pageWidth - margin, currentY); currentY += 12; doc.setTextColor(0); }; const addText = (text, size = 10, style = 'normal', indent = 0) => { doc.setFontSize(size); doc.setFont('Helvetica', style); const lines = doc.splitTextToSize(text, maxWidth - indent); checkPageBreak(lines.length * 9); doc.text(lines, margin + indent, currentY); currentY += (lines.length * 9); }; const addKeyValue = (key, value) => { doc.setFontSize(10); doc.setFont('Helvetica', 'bold'); const keyText = `${key}: `; const keyWidth = doc.getStringUnitWidth(keyText) * 10; const valueLines = doc.splitTextToSize(value, maxWidth - keyWidth); checkPageBreak(10); doc.text(keyText, margin, currentY); doc.setFont('Helvetica', 'normal'); doc.text(valueLines[0], margin + keyWidth, currentY); currentY += 10; for(let i = 1; i < valueLines.length; i++) { doc.text(valueLines[i], margin + keyWidth, currentY); currentY += 10; } }; // --- PDF Content --- // Title Block doc.setFontSize(22); doc.setFont('Helvetica', 'bold'); doc.setTextColor(0, 77, 64); doc.text(`EXPORT COMPLIANCE PLAN`, pageWidth / 2, currentY, { align: 'center' }); currentY += 15; doc.setFontSize(14); doc.text(data.company_name, pageWidth / 2, currentY, { align: 'center' }); currentY += 10; doc.setFontSize(10); doc.text(`Version ${data.version_number} | Effective: ${data.policy_date}`, pageWidth / 2, currentY, { align: 'center' }); currentY += 20; // 1. Policy Statement addSectionHeader("1. Executive Summary & Policy Statement", [0, 77, 64]); addText("Management Commitment:", 10, 'bold'); addText(data.policy_commitment, 10, 'normal', 10); currentY += 5; addKeyValue("Compliance Officer", data.policy_owner); currentY += 5; // 2. Classification addSectionHeader("2. Export Control Classifications", [0, 77, 64]); if (classifications.length > 0) { const classHead = [["List", "Code", "Item Description", "Control Reason"]]; const classBody = classifications.map(c => [c.type, c.code, c.item, c.reason]); doc.autoTable({ startY: currentY, head: classHead, body: classBody, theme: 'grid', headStyles: { fillColor: [74, 78, 105], textColor: [255] }, // Secondary color styles: { fontSize: 9, cellPadding: 5, font: 'Helvetica' } }); currentY = doc.autoTable.previous.finalY + 15; } else { addText("No critical classifications defined.", 11, 'italic'); currentY += 10; } // 3. Screening Procedures addSectionHeader("3. Restricted Party Screening Procedures", [0, 77, 64]); addText("Policy:", 10, 'bold'); addText(data.screening_policy, 10, 'normal', 10); currentY += 5; addText("Mandatory Screening Steps:", 10, 'bold'); if (screeningSteps.length > 0) { screeningSteps.forEach((item, index) => { addText(`${index + 1}. ${item.step}`, 10, 'normal', 10); }); } else { addText("No screening steps defined.", 10, 'italic', 10); } currentY += 5; // 4. Documentation & Training addSectionHeader("4. Documentation, Training, & Audit", [0, 77, 64]); addText("Documentation Policy:", 10, 'bold'); addText(data.documentation_policy, 10, 'normal', 10); currentY += 5; addText("Training Policy:", 10, 'bold'); addText(data.training_policy, 10, 'normal', 10); currentY += 5; addText("Internal Audit Policy:", 10, 'bold'); addText(data.audit_policy, 10, 'normal', 10); currentY += 15; // Footer Disclaimer currentY = doc.internal.pageSize.height - 30; doc.setFontSize(8); doc.setFont('Helvetica', 'italic'); doc.setTextColor(244, 67, 54); doc.text("WARNING: This is a document template and must be reviewed by legal counsel.", pageWidth / 2, currentY, { align: 'center' }); doc.setTextColor(0); doc.save(`${data.company_name.replace(/\s/g, '_')}_Export_Compliance_Plan.pdf`); }; // --- Tab Navigation --- const switchTab = (tabIndex) => { tabs.forEach((tab, index) => { tab.classList.toggle('active', index === tabIndex); contents[index].classList.toggle('active', index === tabIndex); }); currentTab = tabIndex; updateNavButtons(); if (tabIndex === 2) { renderReviewSheet(); } } const updateNavButtons = () => { prevBtn.disabled = currentTab === 0; nextBtn.disabled = currentTab === tabs.length - 1; } tabs.forEach((tab, index) => { tab.addEventListener('click', () => { const tabNode = tab.closest('.compliance-tab-button'); const newIndex = Array.from(tabNode.parentNode.children).indexOf(tabNode); switchTab(newIndex); }); }); nextBtn.addEventListener('click', () => { if (currentTab < tabs.length - 1) switchTab(currentTab + 1); }); prevBtn.addEventListener('click', () => { if (currentTab > 0) switchTab(currentTab - 1); }); // --- Event Listeners and Initial Load --- generateReviewBtn.addEventListener('click', renderReviewSheet); pdfDownloadBtn.addEventListener('click', downloadPDF); // Initial Setup setInitialDate(); renderClassifications(); renderScreeningSteps(); updateNavButtons(); });