Contract Lifecycle Compliance Management System
Track contracts from creation to completion and ensure compliance at every step.
All Contracts
| Contract Title | Counterparty | End Date | Status | Actions |
|---|
Log New Compliance Event
Logged Events
Add Document Record
Document Records
Contract Summary
Please select a contract from the dashboard to view its details.
Add New Contract
No document records added.
'; return; } docs.forEach(d => { const el = document.createElement('div'); el.className = 'p-3 bg-white rounded-lg border text-sm'; el.innerHTML = `${d.title}
Version: ${d.version} | Date: ${d.date}
`; container.appendChild(el); }); } function renderSummary() { const container = document.getElementById('contract-summary'); const contract = state.contracts.find(c => c.id === state.selectedContractId); if (!contract) return; const valueFormatted = `$${parseFloat(contract.value || 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; container.innerHTML = `Title: ${contract.title}
Counterparty: ${contract.counterparty}
Term: ${contract.startDate} to ${contract.endDate}
Value: ${valueFormatted}
Status: ${contract.status}
`; } // --- CORE FUNCTIONS --- window.showTab = function(tabIndex) { if (tabIndex < 0 || tabIndex >= tabButtons.length) return; state.currentTab = tabIndex; tabButtons.forEach((btn, i) => btn.classList.toggle('active', i === state.currentTab)); const isDashboardTab = state.currentTab === 0; document.getElementById('tab-content-0').classList.toggle('active', isDashboardTab); if (!isDashboardTab) renderContractDetails(); tabContents.forEach((content, i) => { if (i > 0) content.classList.toggle('active', i === state.currentTab); }); updateNavButtons(); }; function updateNavButtons() { prevBtn.disabled = state.currentTab === 0; nextBtn.disabled = state.currentTab === tabButtons.length - 1; } window.selectContract = function(contractId) { state.selectedContractId = contractId; showTab(1); // Move to first details tab } window.deselectContract = function() { state.selectedContractId = null; showTab(0); } window.editContract = function(contractId) { const contractData = state.contracts.find(c => c.id === contractId); if (contractData) openModal(contractData); } function openModal(contractData = null) { contractForm.reset(); document.getElementById('modal-title').textContent = contractData ? 'Edit Contract' : 'Add New Contract'; if (contractData) { document.getElementById('contract-id').value = contractData.id; document.getElementById('contract-title').value = contractData.title; document.getElementById('contract-counterparty').value = contractData.counterparty; document.getElementById('contract-start-date').value = contractData.startDate; document.getElementById('contract-end-date').value = contractData.endDate; document.getElementById('contract-value').value = contractData.value; document.getElementById('contract-status').value = contractData.status; } else { document.getElementById('contract-id').value = ''; } modal.classList.add('active'); } function closeModal() { modal.classList.remove('active'); } function saveContract(e) { e.preventDefault(); const id = document.getElementById('contract-id').value; const contractData = { title: document.getElementById('contract-title').value, counterparty: document.getElementById('contract-counterparty').value, startDate: document.getElementById('contract-start-date').value, endDate: document.getElementById('contract-end-date').value, value: document.getElementById('contract-value').value, status: document.getElementById('contract-status').value }; if (id) { const index = state.contracts.findIndex(c => c.id == id); state.contracts[index] = { ...state.contracts[index], ...contractData }; } else { contractData.id = Date.now(); state.contracts.push(contractData); state.complianceLogs[contractData.id] = []; state.documents[contractData.id] = []; } renderContractList(); closeModal(); } function downloadPDF() { const contractId = state.selectedContractId; if (!contractId) return; const contract = state.contracts.find(c => c.id === contractId); const compliance = state.complianceLogs[contractId] || []; const documents = state.documents[contractId] || []; const { jsPDF } = jspdf; const doc = new jsPDF(); doc.setFontSize(20); doc.setFont("helvetica", "bold"); doc.text(`Contract Report: ${contract.title}`, 105, 20, { align: 'center' }); doc.autoTable({ startY: 30, body: [ ['Counterparty', contract.counterparty], ['Term', `${contract.startDate} to ${contract.endDate}`], ['Value', `$${parseFloat(contract.value || 0).toLocaleString()}`], ['Status', contract.status], ], theme: 'plain' }); if (compliance.length > 0) { doc.text("Compliance Log", 14, doc.lastAutoTable.finalY + 15); doc.autoTable({ startY: doc.lastAutoTable.finalY + 20, head: [['Date', 'Event', 'Status', 'Notes']], body: compliance.map(l => [l.date, l.event, l.status, l.notes]) }); } if (documents.length > 0) { doc.text("Document Repository", 14, doc.lastAutoTable.finalY + 15); doc.autoTable({ startY: doc.lastAutoTable.finalY + 20, head: [['Date', 'Title', 'Version']], body: documents.map(d => [d.date, d.title, d.version]) }); } doc.save(`Contract_Report_${contract.title.replace(/ /g, '_')}.pdf`); } // --- EVENT LISTENERS --- document.getElementById('add-contract-btn').addEventListener('click', () => openModal()); document.getElementById('cancel-btn').addEventListener('click', closeModal); contractForm.addEventListener('submit', saveContract); document.getElementById('add-compliance-form').addEventListener('submit', (e) => { e.preventDefault(); state.complianceLogs[state.selectedContractId].push({ event: document.getElementById('compliance-event').value, date: document.getElementById('compliance-date').value, status: document.getElementById('compliance-status').value, notes: document.getElementById('compliance-notes').value, }); renderComplianceLog(); e.target.reset(); }); document.getElementById('add-document-form').addEventListener('submit', (e) => { e.preventDefault(); state.documents[state.selectedContractId].push({ title: document.getElementById('doc-title').value, version: document.getElementById('doc-version').value, date: document.getElementById('doc-date').value, }); renderDocumentList(); e.target.reset(); }); nextBtn.addEventListener('click', () => showTab(state.currentTab + 1)); prevBtn.addEventListener('click', () => showTab(state.currentTab - 1)); document.getElementById('pdf-download-btn').addEventListener('click', downloadPDF); // --- INITIALIZATION --- function initialize() { const today = new Date('2025-08-31T22:27:00'); const formattedDate = today.toISOString().split('T')[0]; document.querySelectorAll('input[type="date"]').forEach(input => input.value = formattedDate); renderContractList(); showTab(0); } initialize(); });