Equipment Loan Financing Calculator
Equipment Loan Details
Loan Summary & Amortization
| Month | Payment | Principal | Interest | Balance |
|---|
Total Cost of Equipment (incl. loan interest): ${elfcFormatCurrency(calculationResults.totalCost)}
`; amortizationTbodyEl.innerHTML = ''; if (calculationResults.loanAmount > 0 && numberOfPayments > 0) { let remainingBalance = calculationResults.loanAmount; let cumulativeInterestPaid = 0; let cumulativePrincipalPaid = 0; for (let i = 1; i <= numberOfPayments; i++) { let interestForMonth = remainingBalance * monthlyInterestRate; let principalForMonth = monthlyPayment - interestForMonth; // Adjust final payment to clear the balance exactly if (i === numberOfPayments) { principalForMonth = remainingBalance; // Principal is whatever is left // Check if monthlyPayment needs adjustment for this last payment if (Math.abs((interestForMonth + principalForMonth) - monthlyPayment) > 0.01) { // Only adjust if calculated differs significantly from regular monthly payment. // This can happen if initial monthlyPayment calculation had rounding. } // monthlyPayment for this row could be interestForMonth + principalForMonth } remainingBalance -= principalForMonth; if (remainingBalance < 0.005 && remainingBalance > -0.005) remainingBalance = 0; // Minor rounding clean-up // Cap interest and principal if payment is 0 (e.g. fully paid by downpayment) if (monthlyPayment === 0) { interestForMonth = 0; principalForMonth = 0; } const actualPaymentThisMonth = (i === numberOfPayments) ? (interestForMonth + principalForMonth) : monthlyPayment; const rowData = { month: i, payment: actualPaymentThisMonth, principal: principalForMonth, interest: interestForMonth, balance: remainingBalance }; calculationResults.amortization.push(rowData); cumulativeInterestPaid += interestForMonth; cumulativePrincipalPaid += principalForMonth; const row = `Loan Summary
Equipment Cost: ${elfcFormatCurrency(calculationResults.equipmentCost)}
Down Payment: ${elfcFormatCurrency(calculationResults.downPayment)}
Loan Amount (Principal): ${elfcFormatCurrency(calculationResults.loanAmount)}
Annual Interest Rate: ${calculationResults.annualInterestRate.toFixed(2)}%
Loan Term: ${calculationResults.loanTermYears} Years (${numberOfPayments} Months)
Monthly Payment: ${elfcFormatCurrency(monthlyPayment)}${finalPaymentNote}
Total Interest Paid: ${elfcFormatCurrency(calculationResults.totalInterest)}
Total Cost of Equipment (incl. loan interest): ${elfcFormatCurrency(calculationResults.totalCost)}
`; } else if (calculationResults.loanAmount <=0) { resultsSummaryContentEl.innerHTML += "Amortization schedule not generated as the equipment is fully paid by the down payment.
"; } else { // numberOfPayments is 0 but loanAmount > 0 resultsSummaryContentEl.innerHTML += "Amortization schedule not generated as the loan term is zero.
"; } switchTab(1); } function elfcDownloadPDF() { if (!calculationResults) { elfcShowError("Please calculate the loan first to generate a PDF."); switchTab(0); return; } elfcClearError(); if (typeof jspdf === 'undefined' || typeof jspdf.jsPDF === 'undefined') { elfcShowError("PDF library (jsPDF) not loaded. Cannot generate PDF. This may be due to network issues or script blockers affecting CDN resources."); return; } const { jsPDF } = jspdf; const doc = new jsPDF(); if (typeof doc.autoTable !== 'function') { elfcShowError("PDF Table library (jsPDF-AutoTable) function not available. The plugin might not have loaded correctly from the CDN. Cannot generate PDF."); return; } const primaryColor = '#0073e6'; const textColor = '#333333'; doc.setFontSize(18); doc.setTextColor(primaryColor); doc.text("Equipment Loan Financing Report", 14, 22); doc.setFontSize(12); doc.setTextColor(textColor); doc.text("Loan Summary:", 14, 35); let summaryY = 42; let finalPaymentNotePdf = ""; if (calculationResults.amortization.length > 0 && calculationResults.loanAmount > 0) { const regularMonthlyPayment = calculationResults.monthlyPayment; const lastAmortPayment = calculationResults.amortization[calculationResults.amortization.length-1].payment; if (Math.abs(regularMonthlyPayment - lastAmortPayment) > 0.01) { finalPaymentNotePdf = ` (Final: ${elfcFormatCurrency(lastAmortPayment)})`; } } const summaryData = [ ["Equipment Cost:", elfcFormatCurrency(calculationResults.equipmentCost)], ["Down Payment:", elfcFormatCurrency(calculationResults.downPayment)], ["Loan Amount (Principal):", elfcFormatCurrency(calculationResults.loanAmount)], ["Annual Interest Rate:", calculationResults.annualInterestRate.toFixed(2) + "%"], ["Loan Term:", `${calculationResults.loanTermYears} Years (${Math.round(calculationResults.loanTermYears * 12)} Months)`], ["Monthly Payment:", `${elfcFormatCurrency(calculationResults.monthlyPayment)}${finalPaymentNotePdf}`], ["Total Interest Paid:", elfcFormatCurrency(calculationResults.totalInterest)], ["Total Cost of Equipment:", elfcFormatCurrency(calculationResults.totalCost)] ]; summaryData.forEach(item => { doc.text(item[0], 14, summaryY); doc.text(item[1], 90, summaryY); summaryY += 7; }); if (calculationResults.amortization.length > 0 && calculationResults.loanAmount > 0) { doc.text("Amortization Schedule:", 14, summaryY + 10); const tableColumnStyles = { 0: { halign: 'center', cellWidth: 15 }, 1: { halign: 'right' }, 2: { halign: 'right' }, 3: { halign: 'right' }, 4: { halign: 'right' } }; const headStyles = { fillColor: primaryColor, textColor: '#ffffff' }; const tableData = calculationResults.amortization.map(p => [ p.month, elfcFormatCurrency(p.payment), elfcFormatCurrency(p.principal), elfcFormatCurrency(p.interest), elfcFormatCurrency(p.balance) ]); doc.autoTable({ startY: summaryY + 15, head: [['Month', 'Payment', 'Principal', 'Interest', 'Balance']], body: tableData, theme: 'grid', headStyles: headStyles, columnStyles: tableColumnStyles, didDrawPage: function (data) { if (data.pageNumber > 1) { doc.setFontSize(18); doc.setTextColor(primaryColor); doc.text("Equipment Loan Financing Report (cont.)", 14, 22); } } }); } else if (calculationResults.loanAmount <= 0) { doc.text("Amortization schedule not applicable: Equipment fully paid by down payment.", 14, summaryY + 10); } else { // Term is zero doc.text("Amortization schedule not applicable: Loan term is zero.", 14, summaryY + 10); } const pdfFileName = `Equipment-Loan-Report-${new Date().toISOString().slice(0,10)}.pdf`; doc.save(pdfFileName); } });