Specific Impact Goal(s): ${qualitative.specificImpactGoal.replace(/\n/g, '
') || 'Not Specified'}
Key Performance Indicators (KPIs): ${qualitative.impactKPIs.replace(/\n/g, '
') || 'Not Specified'}
Overall Expected Impact Level: ${qualitative.expectedImpactLevel}
Risk Profile Summary
Assessed Financial Risk Level: ${qualitative.financialRiskLevel}
Assessed Impact Risk Level: ${qualitative.impactRiskLevel}
Specific Risks & Challenges: ${qualitative.specificRisksChallenges.replace(/\n/g, '
') || 'Not Specified'}
Potential Mitigation Strategies: ${qualitative.mitigationStrategies.replace(/\n/g, '
') || 'Not Specified'}
`;
dlButton.style.display = 'block';
resTabLink.disabled = false;
resTabLink.click();
}
}
window.siirra_downloadPDF = function() {
const { jsPDF } = window.jspdf;
if (!jsPDF || !siirra_analysisData.inputs || Object.keys(siirra_analysisData.inputs).length === 0) {
alert("PDF library not loaded or no data to export. Please analyze first.");
return;
}
const doc = new jsPDF();
let yPos = 20;
const lineHeight = 7;
const indent = 5;
const pageMargin = 15;
const pageWidth = doc.internal.pageSize.getWidth();
const usableWidth = pageWidth - 2 * pageMargin;
doc.setFontSize(16); doc.setTextColor(42, 80, 59); // #2a503b
doc.text("Sustainable & Impact Investing Risk/Return Analysis", pageWidth / 2, yPos, { align: 'center' });
yPos += lineHeight * 2.5;
function addSection(title, dataObj, isQualitative = false) {
if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 30) { doc.addPage(); yPos = pageMargin; }
doc.setFontSize(12); doc.setFont(undefined, 'bold'); doc.setTextColor(74, 112, 85); // #4a7055
doc.text(title, pageMargin, yPos);
yPos += lineHeight * 1.5;
doc.setFontSize(9); doc.setFont(undefined, 'normal'); doc.setTextColor(51,51,51);
for (const [key, value] of Object.entries(dataObj)) {
if (yPos > doc.internal.pageSize.getHeight() - pageMargin - lineHeight * (isQualitative ? 3 : 1) ) { doc.addPage(); yPos = pageMargin; }
let formattedKey = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());
let valStr = String(value);
if (typeof value === 'number' && !isQualitative) { // Don't format qualitative numbers like risk levels if they were numbers
if (key.toLowerCase().includes('rate') || key.toLowerCase().includes('percent')) {
valStr = value.toFixed(2) + '%';
} else {
valStr = siirra_formatCurrency(value);
}
} else if (isQualitative && (key.toLowerCase().includes('goal') || key.toLowerCase().includes('kpis') || key.toLowerCase().includes('risks') || key.toLowerCase().includes('strategies'))) {
// Handle multi-line text for textareas
const lines = doc.splitTextToSize(String(value), usableWidth - (indent + 75));
doc.text(`${formattedKey}:`, pageMargin + indent, yPos);
doc.text(lines, pageMargin + indent + 75, yPos);
yPos += lineHeight * lines.length;
continue; // Skip the standard yPos increment for single line
}
doc.text(`${formattedKey}:`, pageMargin + indent, yPos);
doc.text(valStr, pageMargin + indent + 75, yPos, {align: 'left', maxWidth: usableWidth - (indent + 75)});
yPos += lineHeight * 1.1;
}
yPos += lineHeight * 0.5;
}
const inputSummaryForPdf = {
"Investment Name": siirra_analysisData.inputs.investmentName,
"Investment Type": siirra_analysisData.inputs.investmentType,
"Initial Investment": siirra_analysisData.inputs.initialInvestment,
"Horizon (Years)": siirra_analysisData.inputs.horizonYears,
"Initial Annual Financial Return": siirra_analysisData.inputs.annualReturnInitial,
"Return Growth Rate": (siirra_analysisData.inputs.returnGrowthRate * 100),
"Initial Annual Op Cost": siirra_analysisData.inputs.annualOpCostInitial,
"Op Cost Escalation Rate": (siirra_analysisData.inputs.opCostEscalationRate * 100),
"Terminal Value": siirra_analysisData.inputs.terminalValue,
"Discount Rate": (siirra_analysisData.inputs.discountRate * 100)
};
addSection("Investment & Financial Inputs", inputSummaryForPdf);
const resultsSummaryForPdf = {
"Total Initial Investment": siirra_analysisData.results.totalInitialInvestment,
"First Year Net Financial Benefit": siirra_analysisData.results.firstYearNetBenefit,
"Total Net Financial Benefits Over Horizon": siirra_analysisData.results.totalNetFinancialBenefitsOverHorizon,
"Simple Payback Period": siirra_analysisData.results.simplePaybackPeriod,
"Net Present Value (NPV)": siirra_analysisData.results.npv,
"Internal Rate of Return (IRR)": siirra_analysisData.results.irr
};
addSection("Financial Analysis Results", resultsSummaryForPdf);
// Qualitative Data
if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 60) { doc.addPage(); yPos = pageMargin; } // Check for space before new section
const impactAssessmentForPdf = {
"Primary Impact Area": siirra_analysisData.qualitative.primaryImpactArea,
"Specific Impact Goal(s)": siirra_analysisData.qualitative.specificImpactGoal,
"Impact KPIs": siirra_analysisData.qualitative.impactKPIs,
"Expected Impact Level": siirra_analysisData.qualitative.expectedImpactLevel
};
addSection("Impact Assessment Summary", impactAssessmentForPdf, true);
if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 60) { doc.addPage(); yPos = pageMargin; } // Check for space
const riskProfileForPdf = {
"Financial Risk Level": siirra_analysisData.qualitative.financialRiskLevel,
"Impact Risk Level": siirra_analysisData.qualitative.impactRiskLevel,
"Specific Risks & Challenges": siirra_analysisData.qualitative.specificRisksChallenges,
"Mitigation Strategies": siirra_analysisData.qualitative.mitigationStrategies
};
addSection("Risk Profile Summary", riskProfileForPdf, true);
doc.save('Sustainable_Impact_Investment_Analysis.pdf');
}