Repayment schedule issue to add Multi Disbursement on same day

This commit is contained in:
John Woodlock
2022-03-11 00:57:58 +01:00
committed by Aleksandar Vidakovic
parent 2e66d4628a
commit add67b966d
5 changed files with 255 additions and 20 deletions
@@ -132,9 +132,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
updateAmortization(mc, loanApplicationTerms, scheduleParams.getPeriodNumber(), scheduleParams.getOutstandingBalance());
if (loanApplicationTerms.isMultiDisburseLoan()) {
// fetches the first tranche amount and also updates other
// tranche
// details to map
/* fetches the first tranche amount and also updates other tranche details to map */
BigDecimal disburseAmt = getDisbursementAmount(loanApplicationTerms, scheduleParams.getPeriodStartDate(), periods,
chargesDueAtTimeOfDisbursement, scheduleParams.getDisburseDetailMap(), scheduleParams.applyInterestRecalculation());
scheduleParams.setPrincipalToBeScheduled(Money.of(currency, disburseAmt));
@@ -1918,7 +1916,17 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener
principal = principal.add(disbursementData.amount());
} else if (!excludePastUndisbursed || disbursementData.isDisbursed()
|| !disbursementData.disbursementDate().isBefore(DateUtils.getLocalDateOfTenant())) {
disurseDetail.put(disbursementData.disbursementDate(), Money.of(currency, disbursementData.amount()));
/*
* JW: sums up amounts by disbursal date in case of side-effect issues. Original assumed that there were
* no duplicate disbursal dates and 'put' each amount into the map keyed by date
*/
Money prevsum = disurseDetail.get(disbursementData.disbursementDate());
BigDecimal sumToNow = BigDecimal.ZERO;
if (prevsum != null) {
sumToNow = prevsum.getAmount();
}
sumToNow = sumToNow.add(disbursementData.amount());
disurseDetail.put(disbursementData.disbursementDate(), Money.of(currency, sumToNow));
}
}
return principal;
@@ -1162,22 +1162,20 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
BigDecimal principal = BigDecimal.ZERO;
for (final DisbursementData data : disbursementData) {
if (fromDate.equals(this.disbursement.disbursementDate()) && data.disbursementDate().equals(fromDate)) {
if (periods.size() == 0) {
principal = principal.add(data.amount());
LoanSchedulePeriodData periodData = null;
if (data.getChargeAmount() == null) {
periodData = LoanSchedulePeriodData.disbursementOnlyPeriod(data.disbursementDate(), data.amount(),
disbursementChargeAmount, data.isDisbursed());
} else {
periodData = LoanSchedulePeriodData.disbursementOnlyPeriod(data.disbursementDate(), data.amount(),
disbursementChargeAmount.add(data.getChargeAmount()).subtract(waivedChargeAmount),
data.isDisbursed());
}
if (periodData != null) {
periods.add(periodData);
}
this.outstandingLoanPrincipalBalance = this.outstandingLoanPrincipalBalance.add(data.amount());
principal = principal.add(data.amount());
LoanSchedulePeriodData periodData = null;
if (data.getChargeAmount() == null) {
periodData = LoanSchedulePeriodData.disbursementOnlyPeriod(data.disbursementDate(), data.amount(),
disbursementChargeAmount, data.isDisbursed());
} else {
periodData = LoanSchedulePeriodData.disbursementOnlyPeriod(data.disbursementDate(), data.amount(),
disbursementChargeAmount.add(data.getChargeAmount()).subtract(waivedChargeAmount),
data.isDisbursed());
}
if (periodData != null) {
periods.add(periodData);
}
this.outstandingLoanPrincipalBalance = this.outstandingLoanPrincipalBalance.add(data.amount());
} else if (data.isDueForDisbursement(fromDate, dueDate)) {
if (!excludePastUndisbursed || (excludePastUndisbursed && (data.isDisbursed()
|| !data.disbursementDate().isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))))) {