MIFOSX-2516: fix for Floating rates with multi tranche loan

This commit is contained in:
pramod
2016-02-23 14:29:02 +05:30
parent 1be4d026cf
commit 331e8e4dec
3 changed files with 45 additions and 40 deletions
@@ -25,51 +25,55 @@ import org.joda.time.LocalDate;
public class FloatingRateDTO { public class FloatingRateDTO {
private final boolean isFloatingInterestRate; private final boolean isFloatingInterestRate;
private final LocalDate startDate; private final LocalDate startDate;
private BigDecimal interestRateDiff; private BigDecimal interestRateDiff;
private final Collection<FloatingRatePeriodData> baseLendingRatePeriods; private BigDecimal actualInterestRateDiff;
private final Collection<FloatingRatePeriodData> baseLendingRatePeriods;
public FloatingRateDTO(final boolean isFloatingInterestRate, public FloatingRateDTO(final boolean isFloatingInterestRate, final LocalDate startDate, final BigDecimal interestRateDiff,
final LocalDate startDate, final BigDecimal interestRateDiff, final Collection<FloatingRatePeriodData> baseLendingRatePeriods) {
final Collection<FloatingRatePeriodData> baseLendingRatePeriods) { this.isFloatingInterestRate = isFloatingInterestRate;
this.isFloatingInterestRate = isFloatingInterestRate; this.startDate = startDate;
this.startDate = startDate; this.interestRateDiff = interestRateDiff;
this.interestRateDiff = interestRateDiff; this.actualInterestRateDiff = interestRateDiff;
this.baseLendingRatePeriods = baseLendingRatePeriods; this.baseLendingRatePeriods = baseLendingRatePeriods;
} }
public BigDecimal fetchBaseRate(LocalDate date) { public BigDecimal fetchBaseRate(LocalDate date) {
BigDecimal rate = null; BigDecimal rate = null;
for (FloatingRatePeriodData periodData : this.baseLendingRatePeriods) { for (FloatingRatePeriodData periodData : this.baseLendingRatePeriods) {
final LocalDate periodFromDate = new LocalDate(periodData.getFromDate()); final LocalDate periodFromDate = new LocalDate(periodData.getFromDate());
if (periodFromDate.isBefore(date) if (periodFromDate.isBefore(date) || periodFromDate.isEqual(date)) {
|| periodFromDate.isEqual(date)) { rate = periodData.getInterestRate();
rate = periodData.getInterestRate(); break;
break; }
} }
} return rate;
return rate; }
}
public void addInterestRateDiff(final BigDecimal diff) { public void addInterestRateDiff(final BigDecimal diff) {
this.interestRateDiff = this.interestRateDiff.add(diff); this.interestRateDiff = this.interestRateDiff.add(diff);
} }
public boolean isFloatingInterestRate() { public boolean isFloatingInterestRate() {
return this.isFloatingInterestRate; return this.isFloatingInterestRate;
} }
public LocalDate getStartDate() { public LocalDate getStartDate() {
return this.startDate; return this.startDate;
} }
public BigDecimal getInterestRateDiff() { public BigDecimal getInterestRateDiff() {
return this.interestRateDiff; return this.interestRateDiff;
} }
public Collection<FloatingRatePeriodData> getBaseLendingRatePeriods() { public Collection<FloatingRatePeriodData> getBaseLendingRatePeriods() {
return this.baseLendingRatePeriods; return this.baseLendingRatePeriods;
} }
public void resetInterestRateDiff() {
this.interestRateDiff = this.actualInterestRateDiff;
}
} }
@@ -84,7 +84,7 @@ public class LoanTermVariationsData implements Comparable<LoanTermVariationsData
} }
private boolean occursBefore(final LocalDate date, final LocalDate target) { private boolean occursBefore(final LocalDate date, final LocalDate target) {
return target != null && target.isBefore(date); return target != null && !target.isAfter(date);
} }
public LocalDate getDateValue() { public LocalDate getDateValue() {
@@ -2597,6 +2597,7 @@ public class Loan extends AbstractPersistable<Long> {
final boolean isSpecificToInstallment = false; final boolean isSpecificToInstallment = false;
BigDecimal interestRate = annualNominalInterestRate; BigDecimal interestRate = annualNominalInterestRate;
if (loanProduct.isLinkedToFloatingInterestRate()) { if (loanProduct.isLinkedToFloatingInterestRate()) {
floatingRateDTO.resetInterestRateDiff();
Collection<FloatingRatePeriodData> applicableRates = loanProduct.fetchInterestRates(floatingRateDTO); Collection<FloatingRatePeriodData> applicableRates = loanProduct.fetchInterestRates(floatingRateDTO);
LocalDate interestRateStartDate = DateUtils.getLocalDateOfTenant(); LocalDate interestRateStartDate = DateUtils.getLocalDateOfTenant();
for (FloatingRatePeriodData periodData : applicableRates) { for (FloatingRatePeriodData periodData : applicableRates) {