Farmland Investment Yield Calculator

Land & Purchase Details

One-time costs incurred in Year 1 for improvements (e.g., drainage, fencing).

Annual Revenue & Income (Initial Year Estimates)

Annual Operating Expenses (Initial Year Estimates)

Financial Parameters & Sale Projection (Optional)


Optional: Farmland Sale Projection at End of Holding Period

Farmland Investment Analysis Results

Please complete all previous sections and click "Calculate Yields & Returns".

Projected Net Sale Proceeds (End of Year ${inputs.holdingPeriodYears}): ${fiyc_formatCurrency(fiyc_analysisData.results.projectedNetSaleProceeds)}

Total Return on Investment (Over ${inputs.holdingPeriodYears} Years): ${fiyc_formatNumber(fiyc_analysisData.results.totalReturnOnInvestment, 2)}%

Average Annualized Return: ${fiyc_formatNumber(fiyc_analysisData.results.averageAnnualizedReturn, 2)}%

Net Present Value (NPV) @ ${(inputs.discountRate*100).toFixed(1)}%: ${fiyc_formatCurrency(fiyc_analysisData.results.npv)}

Internal Rate of Return (IRR): ${fiyc_analysisData.results.irr}

` : (inputs.holdingPeriodYears > 0 ? `

Sale projection not entered. NPV and IRR based on operating cash flows only.

Net Present Value (NPV) @ ${(inputs.discountRate*100).toFixed(1)}%: ${fiyc_formatCurrency(fiyc_analysisData.results.npv)}

Internal Rate of Return (IRR): ${fiyc_analysisData.results.irr}

` : '')} `; dlButton.style.display = 'block'; resTabLink.disabled = false; resTabLink.click(); } } window.fiyc_downloadPDF = function() { const { jsPDF } = window.jspdf; if (!jsPDF || !fiyc_analysisData.inputs || Object.keys(fiyc_analysisData.inputs).length === 0) { alert("PDF library not loaded or no data to export. Please calculate 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(46, 125, 50); // #2E7D32 doc.text("Farmland Investment Yield Analysis", pageWidth / 2, yPos, { align: 'center' }); yPos += lineHeight * 2.5; function addSection(title, dataObj) { if (yPos > doc.internal.pageSize.getHeight() - pageMargin - 30) { doc.addPage(); yPos = pageMargin; } doc.setFontSize(13); doc.setFont(undefined, 'bold'); doc.setTextColor(56, 142, 60); // #388E3C doc.text(title, pageMargin, yPos); yPos += lineHeight * 1.5; doc.setFontSize(10); doc.setFont(undefined, 'normal'); doc.setTextColor(62,39,35); // #3E2723 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') || key.toLowerCase().includes('return')) { valStr = fiyc_formatNumber(value, 2) + '%'; } else { valStr = fiyc_formatCurrency(value); } } else if (key.toLowerCase().includes('irr') || key.toLowerCase().includes('payback')) { valStr = String(value); } doc.text(`${formattedKey}:`, pageMargin + indent, yPos); doc.text(valStr, pageMargin + indent + 90, yPos, {align: 'left', maxWidth: usableWidth - (indent + 90)}); yPos += lineHeight * 1.1; } yPos += lineHeight * 0.5; } const inputSummaryForPdf = { "Farm Name": fiyc_analysisData.inputs.farmName, "Total Acres": fiyc_analysisData.inputs.totalAcres, "Purchase Price Per Acre": fiyc_analysisData.inputs.purchasePricePerAcre, "Other Acquisition Costs": fiyc_analysisData.inputs.otherAcquisitionCosts, "Land Improvement Costs (Year 1)": fiyc_analysisData.inputs.landImprovementCosts, "Primary Crop Type": fiyc_analysisData.inputs.primaryCropType, "Expected Yield Per Acre Units": fiyc_analysisData.inputs.expectedYieldPerAcreUnits, "Expected Price Per Unit Crop": fiyc_analysisData.inputs.expectedPricePerUnitCrop, "Revenue Escalation Rate": (fiyc_analysisData.inputs.revenueEscalationRate * 100), "OpEx Escalation Rate": (fiyc_analysisData.inputs.opexEscalationRate * 100), "Holding Period Years": fiyc_analysisData.inputs.holdingPeriodYears, "Discount Rate": (fiyc_analysisData.inputs.discountRate * 100), "Projected Sale Price Per Acre End": fiyc_analysisData.inputs.projectedSalePricePerAcreEnd > 0 ? fiyc_analysisData.inputs.projectedSalePricePerAcreEnd : "N/A", "Costs Of Sale Percent": fiyc_analysisData.inputs.projectedSalePricePerAcreEnd > 0 ? (fiyc_analysisData.inputs.costsOfSalePercent * 100) : "N/A" }; addSection("Input Parameters Summary", inputSummaryForPdf); const resultsSummaryForPdf = { "Total Acquisition Cost": fiyc_analysisData.results.totalAcquisitionCost, "Year 1 Net Operating Income": fiyc_analysisData.results.year1NOI, "Capitalization Rate": fiyc_analysisData.results.capRate, }; if (fiyc_analysisData.inputs.holdingPeriodYears > 0) { resultsSummaryForPdf["Projected Net Sale Proceeds"] = fiyc_analysisData.results.projectedNetSaleProceeds > 0 ? fiyc_analysisData.results.projectedNetSaleProceeds : "N/A (No Sale Projected)"; resultsSummaryForPdf["Total Return On Investment"] = typeof fiyc_analysisData.results.totalReturnOnInvestment === 'number' ? fiyc_analysisData.results.totalReturnOnInvestment : "N/A"; resultsSummaryForPdf["Average Annualized Return"] = typeof fiyc_analysisData.results.averageAnnualizedReturn === 'number' ? fiyc_analysisData.results.averageAnnualizedReturn : "N/A"; resultsSummaryForPdf["Net Present Value (NPV)"] = fiyc_analysisData.results.npv; resultsSummaryForPdf["Internal Rate of Return (IRR)"] = fiyc_analysisData.results.irr; } addSection("Key Financial Indicators", resultsSummaryForPdf); // Sample Cash Flow for PDF if (fiyc_analysisData.annual_cash_flows && fiyc_analysisData.annual_cash_flows.length > 0) { let cashFlowSampleForPdf = ["Year | Gross Revenue ($) | Total OpEx ($) | NOI ($) | Net CF ($)"]; cashFlowSampleForPdf.push(`0 | --- | --- | --- | ${fiyc_formatCurrency(-fiyc_analysisData.results.totalAcquisitionCost)}`); const yearsToShowInPdf = Math.min(fiyc_analysisData.annual_cash_flows.length, 5); for(let i = 0; i < yearsToShowInPdf; i++) { const cf = fiyc_analysisData.annual_cash_flows[i]; cashFlowSampleForPdf.push( `${cf.year} | ` + `${fiyc_formatCurrency(cf.grossRevenue)} | ` + `${fiyc_formatCurrency(cf.totalOpex)} | ` + `${fiyc_formatCurrency(cf.noi)} | `+ `${fiyc_formatCurrency(cf.netCashFlow)}` ); } if (fiyc_analysisData.annual_cash_flows.length > 5) { cashFlowSampleForPdf.push("..."); const lastCf = fiyc_analysisData.annual_cash_flows[fiyc_analysisData.annual_cash_flows.length - 1]; cashFlowSampleForPdf.push( `${lastCf.year} | ` + `${fiyc_formatCurrency(lastCf.grossRevenue)} | ` + `${fiyc_formatCurrency(lastCf.totalOpex)} | ` + `${fiyc_formatCurrency(lastCf.noi)} | `+ `${fiyc_formatCurrency(lastCf.netCashFlow)}` ); } 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.map(line => line.replace(/\$/g, '')), true); // Pass as list, remove $ for table } doc.save('Farmland_Investment_Analysis.pdf'); }
Scroll to Top