The Code for Loan Shark
// Calculate payment
function calcPayment(amount, rate, term) {
return (amount * rate) / (1 - Math.pow(1 + rate, -term));
}
// Calculate interest
function calcInterest(balance, rate) {
return balance * rate;
}
// Get values from the user
function buildSchedule() {
const loanAmount = Number(document.getElementById("lamount").value);
let rate = parseFloat(document.getElementById("lrate").value);
// Convert to monthly
rate = rate / 1200;
// Assume monthly input
const term = parseInt(document.getElementById("lterm").value);
const payment = calcPayment(loanAmount, rate, term);
const paymentDS = getPayments(loanAmount, rate, term, payment);
// Pass array to the display function
displayData(paymentDS);
}
// Build the amoratization schedule
function getPayments(amount, rate, term, payment) {
let paymentDS = {
payments: [],
summary: {}
};
// Setup variables to hold values
let balance = amount;
let totalInterest = 0;
let monthlyPrincipal = 0;
let monthlyInterest = 0;
let monthlyTotalInterest = 0;
// Create a loop for each month of the loan
for (let month = 1; month <= term; month++) {
// Calculate the payment and interest
monthlyInterest = calcInterest(balance, rate);
totalInterest += monthlyInterest;
monthlyPrincipal = payment - monthlyInterest;
balance = balance - monthlyPrincipal;
// Add the details to an object
let curPayment = {
month: month,
payment: payment,
principal: monthlyPrincipal,
interest: monthlyInterest,
totalInterest: totalInterest,
balance: balance
};
// Push the curPayment to the payments array
paymentDS.payments.push(curPayment);
}
let summary = {
payment: payment,
totalPrincipal: amount,
totalInterest: totalInterest,
totalCost: (amount + totalInterest)
};
paymentDS.summary = summary;
return paymentDS;
}
// Display the data to the user
function displayData(paymentDS) {
// Get the table
let tableBody = document.getElementById("scheduleBody");
let template = document.getElementById("scheduleTemplate");
// Clear the table
tableBody.innerHTML = "";
for (let i = 0; i < paymentDS.payments.length; i++) {
// Get a clone row template
payRow = template.content.cloneNode(true);
// Grab only the columns in template
paycols = payRow.querySelectorAll("td");
// Six columns in our template
paycols[0].textContent = paymentDS.payments[i].month;
paycols[1].textContent = paymentDS.payments[i].payment.toFixed(2);
paycols[2].textContent = paymentDS.payments[i].principal.toFixed(2);
paycols[3].textContent = paymentDS.payments[i].interest.toFixed(2);
paycols[4].textContent = paymentDS.payments[i].totalInterest.toFixed(2);
paycols[5].textContent = Math.abs(paymentDS.payments[i].balance).toFixed(2);
// Append to the table
tableBody.appendChild(payRow);
}
// Total interest is in the last row of array
let totalInterest = paymentDS.summary.totalInterest;
let payment = paymentDS.summary.payment;
let loanAmount = paymentDS.summary.totalPrincipal
let totalCost = paymentDS.summary.totalCost;
// Build summary area
let labelPrincipal = document.getElementById("totalPrincipal");
labelPrincipal.innerHTML = Number(loanAmount).toLocaleString("en-US", {
style: "currency",
currency: "USD",
});
let labelInterest = document.getElementById("totalInterest");
labelInterest.innerHTML = Number(totalInterest).toLocaleString("en-US", {
style: "currency",
currency: "USD",
});
let paymentdiv = document.getElementById("payment");
paymentdiv.innerHTML = Number(payment).toLocaleString("en-US", {
style: "currency",
currency: "USD",
});
let totalCostDiv = document.getElementById("totalCost");
totalCostDiv.innerHTML = Number(totalCost).toLocaleString("en-US", {
style: "currency",
currency: "USD",
});
}
The code structure:
calcPayment
Calculates monthly payment.
calcInterest
Calculates interest of the loan.