Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FINERACT-2062: Use 48 weeks in a year when interest rate is per month #3795

Draft
wants to merge 1 commit into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1056,7 +1056,7 @@ private BigDecimal calculateLoanTermFrequency(final LocalDate periodStartDate, f
public BigDecimal interestRateFor(final PaymentPeriodsInOneYearCalculator calculator, final MathContext mc,
final Money outstandingBalance, final LocalDate fromDate, final LocalDate toDate) {

long loanTermPeriodsInOneYear = calculator.calculate(PeriodFrequencyType.DAYS).longValue();
long loanTermPeriodsInOneYear = calculator.calculate(PeriodFrequencyType.DAYS,interestRatePeriodFrequencyType).longValue();
int repaymentEvery = Math.toIntExact(ChronoUnit.DAYS.between(fromDate, toDate));
if (isFallingInRepaymentPeriod(fromDate, toDate)) {
loanTermPeriodsInOneYear = calculatePeriodsInOneYear(calculator);
Expand All @@ -1081,13 +1081,13 @@ private long calculatePeriodsInOneYear(final PaymentPeriodsInOneYearCalculator c
if (daysInYearToUse) {
periodsInOneYear = this.daysInYearType.getValue().longValue();
} else {
periodsInOneYear = calculator.calculate(this.repaymentPeriodFrequencyType).longValue();
periodsInOneYear = calculator.calculate(this.repaymentPeriodFrequencyType,interestRatePeriodFrequencyType).longValue();
}
switch (this.interestCalculationPeriodMethod) {
case DAILY:
periodsInOneYear = !this.daysInYearType.getCode().equalsIgnoreCase("DaysInYearType.actual")
? this.daysInYearType.getValue().longValue()
: calculator.calculate(PeriodFrequencyType.DAYS).longValue();
: calculator.calculate(PeriodFrequencyType.DAYS,interestRatePeriodFrequencyType).longValue();
break;
case INVALID:
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

public interface PaymentPeriodsInOneYearCalculator {

Integer calculate(PeriodFrequencyType repaymentFrequencyType);
Integer calculate(PeriodFrequencyType repaymentFrequencyType, PeriodFrequencyType interestRatePeriodType);

BigDecimal calculatePortionOfRepaymentPeriodInterestChargingGrace(LocalDate repaymentPeriodStartDate, LocalDate scheduledDueDate,
LocalDate interestChargedFromLocalDate, PeriodFrequencyType repaymentPeriodFrequencyType, int repaidEvery, MathContext mc);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@
public class DefaultPaymentPeriodsInOneYearCalculator implements PaymentPeriodsInOneYearCalculator {

@Override
public Integer calculate(final PeriodFrequencyType repaymentFrequencyType) {
public Integer calculate(final PeriodFrequencyType repaymentFrequencyType,final PeriodFrequencyType interestRateFrequencyMethod) {

Integer paymentPeriodsInOneYear = 0;
switch (repaymentFrequencyType) {
case DAYS:
paymentPeriodsInOneYear = 365;
paymentPeriodsInOneYear = interestRateFrequencyMethod.isMonthly() ? Integer.valueOf(360) : Integer.valueOf(365);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks weird to me. If why would it be 360 if it is monthly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With monthly interest interest and daily repayments, it looks more reasonable to assume that there are exactly 360 days, a number divisible by the 12 months in the year brings our more explainable installments.

break;
case WEEKS:
paymentPeriodsInOneYear = 52;
paymentPeriodsInOneYear = interestRateFrequencyMethod.isMonthly() ? Integer.valueOf(48) : Integer.valueOf(52);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks weird to me. If why would it be 48 if it is monthly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the interest frequency is monthly, it looks more reasonable to assume there are four weeks in a month, so with 4 weeks in a month and 12 months in a year we shall have 4 x 12 = 48 weeks in a year.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont think thats right... monthly interest calculation cannot be 4 weeks... @bharathc27 Thoughts?

break;
case MONTHS:
paymentPeriodsInOneYear = 12;
Expand Down