Browse Source

Consider current month in FIRE calculation (#1349)

pull/1353/head
Yash Solanki 2 years ago
committed by GitHub
parent
commit
246de7aa86
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  2. 13
      libs/ui/src/lib/fire-calculator/fire-calculator.service.ts

9
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -25,6 +25,7 @@ import {
Tooltip Tooltip
} from 'chart.js'; } from 'chart.js';
import * as Color from 'color'; import * as Color from 'color';
import { getMonth } from 'date-fns';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash';
import { Subject, takeUntil } from 'rxjs'; import { Subject, takeUntil } from 'rxjs';
@ -50,6 +51,8 @@ export class FireCalculatorComponent
@ViewChild('chartCanvas') chartCanvas; @ViewChild('chartCanvas') chartCanvas;
private readonly CONTRIBUTION_PERIOD = 12;
public calculatorForm = this.formBuilder.group({ public calculatorForm = this.formBuilder.group({
annualInterestRate: new FormControl<number>(undefined), annualInterestRate: new FormControl<number>(undefined),
paymentPerPeriod: new FormControl<number>(undefined), paymentPerPeriod: new FormControl<number>(undefined),
@ -296,11 +299,15 @@ export class FireCalculatorComponent
label: $localize`Savings` label: $localize`Savings`
}; };
const monthsPassedInCurrentYear = getMonth(new Date());
for (let period = 1; period <= t; period++) { for (let period = 1; period <= t; period++) {
const periodInMonths =
period * this.CONTRIBUTION_PERIOD - monthsPassedInCurrentYear;
const { interest, principal, totalAmount } = const { interest, principal, totalAmount } =
this.fireCalculatorService.calculateCompoundInterest({ this.fireCalculatorService.calculateCompoundInterest({
P, P,
period, periodInMonths,
PMT, PMT,
r r
}); });

13
libs/ui/src/lib/fire-calculator/fire-calculator.service.ts

@ -4,35 +4,32 @@ import Big from 'big.js';
@Injectable() @Injectable()
export class FireCalculatorService { export class FireCalculatorService {
private readonly COMPOUND_PERIOD = 12; private readonly COMPOUND_PERIOD = 12;
private readonly CONTRIBUTION_PERIOD = 12;
public constructor() {} public constructor() {}
public calculateCompoundInterest({ public calculateCompoundInterest({
P, P,
period, periodInMonths,
PMT, PMT,
r r
}: { }: {
P: number; P: number;
period: number; periodInMonths: number;
PMT: number; PMT: number;
r: number; r: number;
}) { }) {
let interest = new Big(0); let interest = new Big(0);
const principal = new Big(P).plus( const principal = new Big(P).plus(new Big(PMT).mul(periodInMonths));
new Big(PMT).mul(this.CONTRIBUTION_PERIOD).mul(period)
);
let totalAmount = principal; let totalAmount = principal;
if (r) { if (r) {
const compoundInterestForPrincipal = new Big(1) const compoundInterestForPrincipal = new Big(1)
.plus(new Big(r).div(this.COMPOUND_PERIOD)) .plus(new Big(r).div(this.COMPOUND_PERIOD))
.pow(new Big(this.COMPOUND_PERIOD).mul(period).toNumber()); .pow(periodInMonths);
const compoundInterest = new Big(P).mul(compoundInterestForPrincipal); const compoundInterest = new Big(P).mul(compoundInterestForPrincipal);
const contributionInterest = new Big( const contributionInterest = new Big(
new Big(PMT).mul(compoundInterestForPrincipal.minus(1)) new Big(PMT).mul(compoundInterestForPrincipal.minus(1))
).div(new Big(r).div(this.CONTRIBUTION_PERIOD)); ).div(new Big(r).div(this.COMPOUND_PERIOD));
interest = compoundInterest.plus(contributionInterest).minus(principal); interest = compoundInterest.plus(contributionInterest).minus(principal);
totalAmount = compoundInterest.plus(contributionInterest); totalAmount = compoundInterest.plus(contributionInterest);
} }

Loading…
Cancel
Save