Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

function calculateSchedule(workingInterest, loanAmount, installmentFrequency,

installmentAmount, loanTenure, disbursementDate, actualRepaymentDates,


actualRepaidAmounts) {
// Convert string disbursementDate to Date object
disbursementDate = new Date(disbursementDate);

// Calculate total number of installments based on loan tenure


let totalInstallments;
switch (loanTenure) {
case '6':
totalInstallments = 6;
break;
case '12':
totalInstallments = 12;
break;
case '18':
totalInstallments = 18;
break;
case '24':
totalInstallments = 24;
break;
default:
totalInstallments = 12; // Default to 12 months
}

const masterDays = {
Monthly: 30,
weekly: 7,
['Bi-Weekly']: 14,
};

// Initialize arrays to store the schedule data


let schedule = [];
let currentDate = new Date(disbursementDate);

// Calculate schedule for each installment


for (let i = 1; i <= totalInstallments; i++) {
let days = masterDays[installmentFrequency];
// Calculate interest and principal components
let interest = (loanAmount * workingInterest * days) / (365 * 100);
let principal = installmentAmount - interest;

// Update outstanding principal


let outstandingPrincipal = loanAmount - principal;

// Calculate bi-weekly installment


let biWeeklyInstallment = installmentFrequency === 'Monthly' ?
installmentAmount * 12 / 26 : installmentAmount;

// Calculate the payment date


let paymentDate = new Date(currentDate.getTime());
paymentDate.setDate(paymentDate.getDate() + days);

// Check if there is an actual repayment date for the current installment


let actualRepaymentDate = actualRepaymentDates[i - 1];
let actualRepaidAmount = actualRepaidAmounts[i - 1];

// Adjust remaining principal and interest if there's a deviation in repaid


amount
if (actualRepaidAmount && actualRepaidAmount < installmentAmount) {
// Adjust principal and interest based on the actual repaid amount
principal = actualRepaidAmount;
interest = installmentAmount - principal;

// Update outstanding principal


outstandingPrincipal = loanAmount - principal;
}

// Push schedule data to the array


schedule.push({
"Outstanding": outstandingPrincipal.toFixed(2),
"Principal": principal.toFixed(2),
"Interest": interest.toFixed(2),
"Installment": installmentAmount.toFixed(2),
"Bi-Weekly Instt.": biWeeklyInstallment.toFixed(2),
"# Days": days,
"Actual Repayment Date": actualRepaymentDate ? actualRepaymentDate :
"-",
"Actual Repaid Amount": actualRepaidAmount ?
actualRepaidAmount.toFixed(2) : "-",
"Payment Date": paymentDate.toISOString().slice(0, 10) // Format
payment date as yyyy-mm-dd
});

// Update loan amount for next iteration


loanAmount = outstandingPrincipal;

// Move currentDate to the next installment date


currentDate.setDate(currentDate.getDate() + days);
}

return schedule;
}

// Sample input
let workingInterest = 25;
let loanAmount = 15000;
let installmentFrequency = 'Bi-Weekly';
let installmentAmount = 710;
let loanTenure = '24'; // 6, 12, 18, or 24 months
let disbursementDate = '2024-01-01';
let actualRepaymentDates = [null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null];
let actualRepaidAmounts = [null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null];

// Calculate and print schedule


let schedule = calculateSchedule(workingInterest, loanAmount, installmentFrequency,
installmentAmount, loanTenure, disbursementDate, actualRepaymentDates,
actualRepaidAmounts);
console.table(schedule);

You might also like