Infrastructure Investment Yield Monitor
Project & Initial Investment Details
If CAPEX occurs in specific future years, detail this in your own planning. This tool will average it for simple yield or use it as a lump sum at year 1 for IRR/NPV if not detailed further.
Annual Revenue Streams
Annual Operational Expenditures (OpEx)
Financial Parameters for Analysis
Infrastructure Investment Analysis Results
Please complete all previous sections and click "Monitor Yield & Returns".
Average Annual Net Operating Income (NOI): ${iiym_formatCurrency(iiym_analysisData.results.averageAnnualNOI)}
Simple Yield on Cost (Avg. NOI / Total Inv.): ${iiym_analysisData.results.simpleYieldOnCost.toFixed(2)}%
Simple Payback Period: ${iiym_analysisData.results.simplePaybackPeriod}
Net Present Value (NPV) @ ${(inputs.discountRate*100).toFixed(1)}%: ${iiym_formatCurrency(iiym_analysisData.results.npv)}
Internal Rate of Return (IRR): ${iiym_analysisData.results.irr}
`; dlButton.style.display = 'block'; resTabLink.disabled = false; resTabLink.click(); } } window.iiym_downloadPDF = function() { const { jsPDF } = window.jspdf; if (!jsPDF || !iiym_analysisData.inputs || Object.keys(iiym_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(18); doc.setTextColor(28, 61, 90); // #1c3d5a doc.text("Infrastructure Investment Yield & Return Analysis", pageWidth / 2, yPos, { align: 'center' }); yPos += lineHeight * 2.5; function addSection(title, dataObj, isList = false) { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 30) { doc.addPage(); yPos = pageMargin; } doc.setFontSize(13); doc.setFont(undefined, 'bold'); doc.setTextColor(42, 67, 101); // #2a4365 doc.text(title, pageMargin, yPos); yPos += lineHeight * 1.5; doc.setFontSize(10); doc.setFont(undefined, 'normal'); doc.setTextColor(51,51,51); if (isList) { dataObj.forEach(item => { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - lineHeight) { doc.addPage(); yPos = pageMargin; } doc.text(item, pageMargin + indent, yPos); yPos += lineHeight; }); } else { for (const [key, value] of Object.entries(dataObj)) { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - lineHeight) { doc.addPage(); yPos = pageMargin; } let formattedKey = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase()); let valStr = String(value); if (typeof value === 'number') { if (key.toLowerCase().includes('rate') || key.toLowerCase().includes('percent') || key.toLowerCase().includes('escalation') || key.toLowerCase().includes('yield')) { valStr = value.toFixed(2) + '%'; } else { valStr = iiym_formatCurrency(value); } } else if (key === 'irr' || key === 'simplePaybackPeriod') { valStr = String(value); } doc.text(`${formattedKey}:`, pageMargin + indent, yPos); doc.text(valStr, pageMargin + indent + 85, yPos, {align: 'left', maxWidth: usableWidth - (indent + 85)}); yPos += lineHeight * 1.1; } } yPos += lineHeight * 0.5; } const inputSummaryForPdf = { "Project Name": iiym_analysisData.inputs.projectName, "Project Type": iiym_analysisData.inputs.projectType, "Location Scope": iiym_analysisData.inputs.projectLocationScope, "Lifespan (Years)": iiym_analysisData.inputs.lifespanYears, "Initial Investment Cost": iiym_analysisData.inputs.initialInvestmentCost, "Additional CAPEX (Undiscounted)": iiym_analysisData.inputs.additionalCapex, "Primary Revenue (Initial Annual)": iiym_analysisData.inputs.primaryRevenueInitial, "Primary Revenue Escalation": (iiym_analysisData.inputs.primaryRevenueEscalation * 100), "Other Revenue (Initial Annual)": iiym_analysisData.inputs.otherRevenueInitial, "Other Revenue Escalation": (iiym_analysisData.inputs.otherRevenueEscalation * 100), "O&M Cost (Initial Annual)": iiym_analysisData.inputs.omCostInitial, "O&M Cost Escalation": (iiym_analysisData.inputs.omEscalation * 100), "Other OpEx (Initial Annual)": iiym_analysisData.inputs.otherOpexInitial, "Other OpEx Escalation": (iiym_analysisData.inputs.otherOpexEscalation * 100), "Discount Rate": (iiym_analysisData.inputs.discountRate * 100) }; addSection("Input Parameters Summary", inputSummaryForPdf); const resultsSummaryForPdf = { "Total Investment Cost (for Simple Yield)": iiym_analysisData.results.totalInvestmentCost, "First Year Net Operating Income": iiym_analysisData.results.firstYearNOI, "Average Annual Net Operating Income": iiym_analysisData.results.averageAnnualNOI, "Simple Yield on Cost": iiym_analysisData.results.simpleYieldOnCost, // Already a number, will be formatted with % "Simple Payback Period": iiym_analysisData.results.simplePaybackPeriod, "Net Present Value (NPV)": iiym_analysisData.results.npv, "Internal Rate of Return (IRR)": iiym_analysisData.results.irr }; addSection("Key Financial Indicators", resultsSummaryForPdf); let cashFlowSampleForPdf = ["Year | Gross Revenue ($) | Total OpEx ($) | NOI ($) | Net CF (for IRR/NPV) ($)"]; const yearsToShowInPdf = Math.min(iiym_analysisData.annual_cash_flows.length, 5); // Show initial investment line cashFlowSampleForPdf.push(`0 | --- | --- | --- | ${iiym_formatCurrency(-iiym_analysisData.inputs.initialInvestmentCost)}`); for(let i = 0; i < yearsToShowInPdf; i++) { const cf = iiym_analysisData.annual_cash_flows[i]; cashFlowSampleForPdf.push( `${cf.year} | ` + `${iiym_formatCurrency(cf.grossRevenue)} | ` + `${iiym_formatCurrency(cf.totalOpEx)} | ` + `${iiym_formatCurrency(cf.netOperatingIncome)} | `+ `${iiym_formatCurrency(cf.netCashFlowForMetrics)}` ); } if (iiym_analysisData.annual_cash_flows.length > 5) { cashFlowSampleForPdf.push("..."); const lastCf = iiym_analysisData.annual_cash_flows[iiym_analysisData.annual_cash_flows.length - 1]; cashFlowSampleForPdf.push( `${lastCf.year} | ` + `${iiym_formatCurrency(lastCf.grossRevenue)} | ` + `${iiym_formatCurrency(lastCf.totalOpEx)} | ` + `${iiym_formatCurrency(lastCf.netOperatingIncome)} | `+ `${iiym_formatCurrency(lastCf.netCashFlowForMetrics)}` ); } if (yPos > doc.internal.pageSize.getHeight() - pageMargin - (cashFlowSampleForPdf.length * lineHeight) - (lineHeight*2.5) ) { doc.addPage(); yPos = pageMargin; } doc.setFont(undefined,'normal'); doc.setFontSize(8); addSection("Annual Cash Flow Summary (Sample)", cashFlowSampleForPdf, true); doc.save('Infrastructure_Investment_Analysis.pdf'); }