Installment and disbursement plan calculator for JavaScript/Node.js.
This package provides 3 main functions:
CalculateInstallmentPlan: build an installment schedule from a single principal amountCalculateInstallmentPlan_DE: convenience wrapper for a default date setupCalculateDisbursementPlan: build a schedule from multiple disbursementsnpm install installment-plan
"type": "module")import syntax in Node.js or bundlers that support ESMimport {
CalculateInstallmentPlan,
CalculateInstallmentPlan_DE,
CalculateDisbursementPlan,
} from "installment-plan";
CalculateInstallmentPlan(
DISBURSEMENTDATE,
PAYMENTFIRSTDATE,
PAYMENTDUEDAY,
Principal,
PaymentAmount,
TopupAmt = 0,
TopupStart = 1,
countInstallment = 0,
)
Parameters:
DISBURSEMENTDATE (Date): disbursement datePAYMENTFIRSTDATE (Date): first payment datePAYMENTDUEDAY (number): due day of month (for following installments)Principal (number): initial principalPaymentAmount (Array<{ from, to, installment, IntRate }>): tiered payment/rate rulesTopupAmt (number, optional): top-up added to payment amountTopupStart (number, optional): installment index where top-up starts (1-based)countInstallment (number, optional): internal/advanced usageReturns:
Array<object> schedule rows, orArray<string> with an error message when date constraints are invalidDate constraints:
>= 45< 0Example:
import { CalculateInstallmentPlan } from "installment-plan";
const DISBURSEMENTDATE = new Date(2023, 9, 25);
const PAYMENTFIRSTDATE = new Date(2023, 10, 24);
const PAYMENTDUEDAY = 24;
const Principal = 500000;
const PaymentAmount = [
{ from: 1, to: 12, installment: 2300, IntRate: 0.0239 },
{ from: 13, to: 24, installment: 2300, IntRate: 0.0414 },
{ from: 25, to: 36, installment: 2300, IntRate: 0.0414 },
{ from: 37, to: 120, installment: 2300, IntRate: 0.0594 },
];
const plan = CalculateInstallmentPlan(
DISBURSEMENTDATE,
PAYMENTFIRSTDATE,
PAYMENTDUEDAY,
Principal,
PaymentAmount,
);
console.log(plan[0]);
CalculateInstallmentPlan_DE(Principal, PaymentAmount)
Parameters:
Principal (number)PaymentAmount (Array<{ from, to, installment, IntRate }>)Behavior:
25Returns:
CalculateInstallmentPlanExample:
import { CalculateInstallmentPlan_DE } from "installment-plan";
const plan = CalculateInstallmentPlan_DE(100000, [
{ from: 1, to: 12, installment: 9000, IntRate: 0.08 },
]);
console.log(plan.length);
CalculateDisbursementPlan(DISB, PA, PAYMENTFIRSTDATE, PAYMENTDUEDAY)
Parameters:
DISB (Array<{ date: Date, amount: number }>): disbursementsPA (Array<{ from, to, installment, IntRate }>): payment/rate tiersPAYMENTFIRSTDATE (Date)PAYMENTDUEDAY (number)Behavior:
Returns:
Array<object> schedule rows, orArray<string> with an error message for invalid day-difference constraintsExample:
import { CalculateDisbursementPlan } from "installment-plan";
const PAYMENTFIRSTDATE = new Date(2025, 4, 6);
const PAYMENTDUEDAY = 6;
const PA = [
{ from: 1, to: 3, installment: 11040, IntRate: 0.0888 },
{ from: 3, to: 60, installment: 11040, IntRate: 0.1199 },
];
const DISB = [
{ date: new Date(2025, 3, 25), amount: 230000 },
{ date: new Date(2025, 3, 25), amount: 160000 },
{ date: new Date(2025, 3, 28), amount: 100000 },
{ date: new Date(2025, 3, 28), amount: 10000 },
];
const plan = CalculateDisbursementPlan(
DISB,
PA,
PAYMENTFIRSTDATE,
PAYMENTDUEDAY,
);
console.log(plan[0]);
Each row in the resulting schedule contains:
c: installment numberprevmonthpaymentdate: previous payment date (string | null)thismonthpaymentdate: current payment date (string)DD: day difference used in interest calculationPA: payment amountIDA: interest due amountDP: deducted principalDI: deducted interestsRP: remaining principalAI: accrued interestAILP: accrued interest from last paymentITP: interest this paymentInstall dependencies:
npm install
Run tests:
npm test
Run coverage:
npm run cv
MIT