`;
},
renderHealthReport() {
this.dom.resultsGrid.innerHTML = `
${this.createResultCard('Savings Rate', this.healthReport.savingsRate)}
${this.createResultCard('Net Worth', this.healthReport.netWorth)}
${this.createResultCard('Emergency Fund', this.healthReport.emergencyFund)}
`;
},
generatePdf() {
if (!this.healthReport) return;
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ unit: 'pt', format: 'a4' });
const { savingsRate, netWorth, emergencyFund } = this.healthReport;
pdf.setFontSize(20);
pdf.text("Personal Finance Health Report", 40, 60);
pdf.setFontSize(10);
pdf.text(`Generated on: ${new Date().toLocaleDateString()}`, 40, 75);
const tableData = [
['Savings Rate', savingsRate.value, savingsRate.status, savingsRate.advice],
['Net Worth', netWorth.value, netWorth.status, netWorth.advice],
['Emergency Fund', emergencyFund.value, emergencyFund.status, emergencyFund.advice]
];
pdf.autoTable({
startY: 100,
head: [['Metric', 'Your Result', 'Status', 'Recommendation']],
body: tableData,
headStyles: { fillColor: [37, 99, 235] }, // Blue
columnStyles: {
3: { cellWidth: 200 } // Wider column for advice
},
didParseCell: function (data) {
const status = data.cell.raw;
if(data.column.index === 2) {
if(status === 'Excellent') data.cell.styles.textColor = [34, 197, 94];
if(status === 'Good') data.cell.styles.textColor = [234, 179, 8];
if(status === 'Needs Improvement') data.cell.styles.textColor = [239, 68, 68];
}
}
});
pdf.save('Financial-Health-Report.pdf');
}
};
app.init();
});
