Estimated Tax Savings:
$0.00
${category}
`;
for (const key in appData[category]) {
formHtml += createFormGroup(key, appData[category][key], category);
}
formHtml += '
';
content.innerHTML = formHtml;
}
tabContentsContainer.appendChild(content);
tabContents.push(content);
});
updateTabs();
calculateAll();
setupEventListeners();
}
function calculateAll() {
const p = appData['Property & Loan Info'];
const i = appData['Income'];
const e = appData['Operating Expenses'];
const t = appData['Your Tax Info'];
// Calculations
const annualRent = (parseFloat(i.monthly_rent.value) || 0) * 12;
const totalIncome = annualRent + (parseFloat(i.other_income.value) || 0);
const interest = calculateMortgageInterest(p.loan_amount.value, p.interest_rate.value);
const depreciation = ((p.purchase_price.value || 0) - (p.land_value.value || 0)) / 27.5;
let operatingExpenses = 0;
for(const key in e) {
operatingExpenses += (parseFloat(e[key].value) || 0);
}
const deductions = {
'Mortgage Interest': interest,
'Property Taxes': parseFloat(e.property_tax.value) || 0,
'Insurance': parseFloat(e.insurance.value) || 0,
'Repairs & Maintenance': parseFloat(e.repairs_maintenance.value) || 0,
'Management Fees': parseFloat(e.management_fees.value) || 0,
'Other OpEx': (parseFloat(e.utilities.value) || 0) + (parseFloat(e.hoa_fees.value) || 0),
'Depreciation': depreciation
};
const totalDeductions = Object.values(deductions).reduce((sum, val) => sum + val, 0);
const netIncome = totalIncome - totalDeductions;
const taxSavings = (totalDeductions * (t.tax_rate.value || 0)) / 100;
updateDashboard(deductions, totalDeductions, taxSavings, netIncome);
updateChart(deductions);
}
function calculateMortgageInterest(principal, rate) {
// Simple first year interest approximation
return (parseFloat(principal) || 0) * ((parseFloat(rate) || 0) / 100);
}
function updateDashboard(deductions, totalDeductions, taxSavings, netIncome) {
const summaryContainer = document.getElementById('summary-container');
summaryContainer.innerHTML = '';
for (const key in deductions) {
const div = document.createElement('div');
div.className = 'flex justify-between items-center text-gray-600 text-sm';
div.innerHTML = `${key}$${deductions[key].toLocaleString('en-US', {maximumFractionDigits: 2})}`;
summaryContainer.appendChild(div);
}
document.getElementById('total-deductions').textContent = `$${totalDeductions.toLocaleString('en-US', {maximumFractionDigits: 2})}`;
document.getElementById('tax-savings').textContent = `$${taxSavings.toLocaleString('en-US', {maximumFractionDigits: 2})}`;
}
function updateChart(deductions) {
const ctx = document.getElementById('deductions-chart').getContext('2d');
const labels = Object.keys(deductions);
const data = Object.values(deductions);
if (deductionsChart) {
deductionsChart.data.labels = labels;
deductionsChart.data.datasets[0].data = data;
deductionsChart.update();
} else {
deductionsChart = new Chart(ctx, {
type: 'pie',
data: {
labels: labels,
datasets: [{
label: 'Deductions Breakdown',
data: data,
backgroundColor: ['#3b82f6', '#60a5fa', '#93c5fd', '#bfdbfe', '#dbeafe', '#eff6ff', '#1e40af'],
borderColor: 'white',
borderWidth: 2
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: {
legend: { position: 'bottom', labels: { boxWidth: 12, padding: 15 } },
tooltip: {
callbacks: {
label: (c) => `${c.label}: $${parseFloat(c.raw).toLocaleString('en-US', {maximumFractionDigits: 0})}`
}
}
}
}
});
}
}
function updateTabs() {
tabs.forEach((tab, i) => tab.classList.toggle('active', i === currentTabIndex));
tabContents.forEach((c, i) => c.classList.toggle('active', i === currentTabIndex));
prevBtn.disabled = currentTabIndex === 0;
nextBtn.disabled = currentTabIndex === tabs.length - 1;
prevBtn.classList.toggle('opacity-50', currentTabIndex === 0);
nextBtn.classList.toggle('opacity-50', currentTabIndex === tabs.length - 1);
}
function setupEventListeners() {
tabsContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('tab')) {
currentTabIndex = parseInt(e.target.dataset.index);
updateTabs();
}
});
prevBtn.addEventListener('click', () => { if (currentTabIndex > 0) { currentTabIndex--; updateTabs(); } });
nextBtn.addEventListener('click', () => { if (currentTabIndex < tabs.length - 1) { currentTabIndex++; updateTabs(); } });
tabContentsContainer.addEventListener('input', (e) => {
if (e.target.tagName === 'INPUT') {
const category = e.target.dataset.category;
const key = e.target.dataset.key;
if (appData[category] && appData[category][key]) {
appData[category][key].value = e.target.value;
calculateAll();
}
}
});
document.getElementById('pdf-download-btn').addEventListener('click', generatePdf);
}
function generatePdf() {
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' });
const pdfContainer = document.createElement('div');
pdfContainer.style.cssText = 'position:absolute; left:-9999px; width:800px; padding:20px; font-family:Inter,sans-serif; color:#1f2937;';
let html = `
Tax Deduction Estimation Report
Total Deductions
${document.getElementById('total-deductions').textContent}
Estimated Tax Savings
${document.getElementById('tax-savings').textContent}
${category}
| ${item.label} | ${item.prefix || ''}${value}${item.suffix || ''} |
