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 {
private final boolean isFloatingInterestRate;
private final LocalDate startDate;
private BigDecimal interestRateDiff;
private final Collection<FloatingRatePeriodData> baseLendingRatePeriods;
private final boolean isFloatingInterestRate;
private final LocalDate startDate;
private BigDecimal interestRateDiff;
private BigDecimal actualInterestRateDiff;
private final Collection<FloatingRatePeriodData> baseLendingRatePeriods;
public FloatingRateDTO(final boolean isFloatingInterestRate,
final LocalDate startDate, final BigDecimal interestRateDiff,
final Collection<FloatingRatePeriodData> baseLendingRatePeriods) {
this.isFloatingInterestRate = isFloatingInterestRate;
this.startDate = startDate;
this.interestRateDiff = interestRateDiff;
this.baseLendingRatePeriods = baseLendingRatePeriods;
}
public FloatingRateDTO(final boolean isFloatingInterestRate, final LocalDate startDate, final BigDecimal interestRateDiff,
final Collection<FloatingRatePeriodData> baseLendingRatePeriods) {
this.isFloatingInterestRate = isFloatingInterestRate;
this.startDate = startDate;
this.interestRateDiff = interestRateDiff;
this.actualInterestRateDiff = interestRateDiff;
this.baseLendingRatePeriods = baseLendingRatePeriods;
}
public BigDecimal fetchBaseRate(LocalDate date) {
BigDecimal rate = null;
for (FloatingRatePeriodData periodData : this.baseLendingRatePeriods) {
final LocalDate periodFromDate = new LocalDate(periodData.getFromDate());
if (periodFromDate.isBefore(date)
|| periodFromDate.isEqual(date)) {
rate = periodData.getInterestRate();
break;
}
}
return rate;
}
public BigDecimal fetchBaseRate(LocalDate date) {
BigDecimal rate = null;
for (FloatingRatePeriodData periodData : this.baseLendingRatePeriods) {
final LocalDate periodFromDate = new LocalDate(periodData.getFromDate());
if (periodFromDate.isBefore(date) || periodFromDate.isEqual(date)) {
rate = periodData.getInterestRate();
break;
}
}
return rate;
}
public void addInterestRateDiff(final BigDecimal diff) {
this.interestRateDiff = this.interestRateDiff.add(diff);
}
public void addInterestRateDiff(final BigDecimal diff) {
this.interestRateDiff = this.interestRateDiff.add(diff);
}
public boolean isFloatingInterestRate() {
return this.isFloatingInterestRate;
}
public boolean isFloatingInterestRate() {
return this.isFloatingInterestRate;
}
public LocalDate getStartDate() {
return this.startDate;
}
public LocalDate getStartDate() {
return this.startDate;
}
public BigDecimal getInterestRateDiff() {
return this.interestRateDiff;
}
public BigDecimal getInterestRateDiff() {
return this.interestRateDiff;
}
public Collection<FloatingRatePeriodData> getBaseLendingRatePeriods() {
return this.baseLendingRatePeriods;
}
public Collection<FloatingRatePeriodData> getBaseLendingRatePeriods() {
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) {
return target != null && target.isBefore(date);
return target != null && !target.isAfter(date);
}
public LocalDate getDateValue() {
@@ -2597,6 +2597,7 @@ public class Loan extends AbstractPersistable<Long> {
final boolean isSpecificToInstallment = false;
BigDecimal interestRate = annualNominalInterestRate;
if (loanProduct.isLinkedToFloatingInterestRate()) {
floatingRateDTO.resetInterestRateDiff();
Collection<FloatingRatePeriodData> applicableRates = loanProduct.fetchInterestRates(floatingRateDTO);
LocalDate interestRateStartDate = DateUtils.getLocalDateOfTenant();
for (FloatingRatePeriodData periodData : applicableRates) {