`;
entityList.appendChild(entityDiv);
// Populate select dropdown
const option = document.createElement('option');
option.value = entity.id;
option.textContent = entity.name;
taskEntitySelect.appendChild(option);
});
}
addEntityBtn.addEventListener('click', () => {
const name = entityNameInput.value.trim();
const state = entityStateInput.value.trim();
if (name && state) {
complianceData.entities.push({
id: Date.now(),
name,
state,
tasks: []
});
entityNameInput.value = '';
entityStateInput.value = '';
renderEntityList();
renderCalendar();
} else {
alert('Please provide both entity name and state of incorporation.');
}
});
entityList.addEventListener('click', (e) => {
if (e.target.classList.contains('delete-entity-btn')) {
const entityId = Number(e.target.dataset.id);
complianceData.entities = complianceData.entities.filter(entity => entity.id !== entityId);
renderEntityList();
renderCalendar();
}
});
addTaskBtn.addEventListener('click', () => {
const entityId = Number(taskEntitySelect.value);
const name = taskNameInput.value.trim();
const dueDate = taskDueDateInput.value;
if (entityId && name && dueDate) {
const entity = complianceData.entities.find(e => e.id === entityId);
if (entity) {
const date = new Date(dueDate + 'T00:00:00'); // Ensure local time
entity.tasks.push({
id: Date.now(),
name,
dueMonth: date.getMonth(),
dueDay: date.getDate() + 1 // Fix for day being off by one
});
taskNameInput.value = '';
taskDueDateInput.value = '';
renderEntityList(); // To update task count
renderCalendar();
}
} else {
alert('Please select an entity, and provide a task name and due date.');
}
});
// --- PDF GENERATION ---
downloadPdfBtn.addEventListener('click', () => {
pdfLoader.classList.remove('hidden');
downloadPdfBtn.disabled = true;
try {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const year = currentDate.getFullYear();
const reportTitle = `Compliance Report for ${year}`;
doc.setFontSize(18);
doc.text(reportTitle, 14, 22);
doc.setFontSize(11);
doc.setTextColor(100);
doc.text(`Generated on: ${new Date().toLocaleDateString()}`, 14, 30);
const head = [['Due Date', 'Entity', 'State', 'Compliance Task']];
const body = [];
complianceData.entities.forEach(entity => {
entity.tasks.forEach(task => {
// Format month and day with leading zeros if needed
const monthStr = String(task.dueMonth + 1).padStart(2, '0');
const dayStr = String(task.dueDay).padStart(2, '0');
const dueDate = `${year}-${monthStr}-${dayStr}`;
body.push([dueDate, entity.name, entity.state, task.name]);
});
});
// Sort by date
body.sort((a, b) => new Date(a[0]) - new Date(b[0]));
doc.autoTable({
head: head,
body: body,
startY: 40,
theme: 'striped',
headStyles: { fillColor: [22, 160, 133] }
});
doc.save(`Compliance-Report-${year}.pdf`);
} catch (e) {
console.error("PDF generation failed:", e);
alert("An error occurred while generating the PDF.");
} finally {
pdfLoader.classList.add('hidden');
downloadPdfBtn.disabled = false;
}
});
// --- INITIALIZATION ---
renderCalendar();
renderEntityList();
showTab(0);
});
