Sustainable & Impact Investing Risk/Return Analyzer

Investment Profile

Financial Projections (Annual)

E.g., Net revenue, dividends, energy savings. This is the benefit before operational costs related to managing the investment itself.
Costs directly associated with managing this specific investment/project.
If the investment is expected to be sold or have a residual value.

Impact Assessment (Qualitative & Quantitative)

Risk Factors

Investment Analysis Summary

Please complete all previous sections and click "Analyze Risk & Return".

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