Contract Lifecycle Compliance Management System

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

Please select a contract from the dashboard to view its details.

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