in service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/IndividualLoanService.java [144:206]
static private List<PlannedPayment> getPlannedPaymentsElements(
final BigDecimal initialBalance,
final int minorCurrencyUnitDigits,
final Set<Action> actionsScheduled,
final List<ScheduledCharge> scheduledCharges,
final BigDecimal loanPaymentSize,
final BigDecimal interest) {
final Map<Period, SortedSet<ScheduledCharge>> orderedScheduledChargesGroupedByPeriod
= scheduledCharges.stream()
.filter(scheduledCharge -> chargeIsNotAccruedOrAccruesAtActionScheduled(actionsScheduled, scheduledCharge))
.collect(Collectors.groupingBy(IndividualLoanService::getPeriodFromScheduledCharge,
Collectors.mapping(x -> x,
Collector.of(
() -> new TreeSet<>(new ScheduledChargeComparator()),
SortedSet::add,
(left, right) -> { left.addAll(right); return left; }))));
final List<Period> sortedRepaymentPeriods
= orderedScheduledChargesGroupedByPeriod.keySet().stream()
.sorted()
.collect(Collector.of(ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }));
final SimulatedRunningBalances balances = new SimulatedRunningBalances();
final List<PlannedPayment> plannedPayments = new ArrayList<>();
for (int i = 0; i < sortedRepaymentPeriods.size(); i++)
{
final Period repaymentPeriod = sortedRepaymentPeriods.get(i);
final BigDecimal requestedRepayment;
final BigDecimal requestedDisbursal;
if (i == 0)
{ //First "period" is actually just the OPEN/APPROVE/DISBURSAL action set.
requestedRepayment = BigDecimal.ZERO;
requestedDisbursal = initialBalance.setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
}
else if (i == sortedRepaymentPeriods.size() - 1)
{ //Last repayment period: Fill the proposed payment out to the remaining balance of the loan.
requestedRepayment = loanPaymentSize.multiply(BigDecimal.valueOf(2));
requestedDisbursal = BigDecimal.ZERO;
}
else {
requestedRepayment = loanPaymentSize;
requestedDisbursal = BigDecimal.ZERO;
}
balances.adjustBalance(AccountDesignators.ENTRY, requestedRepayment);
final SortedSet<ScheduledCharge> scheduledChargesInPeriod = orderedScheduledChargesGroupedByPeriod.get(repaymentPeriod);
final PaymentBuilder paymentBuilder =
CostComponentService.getCostComponentsForScheduledCharges(
scheduledChargesInPeriod,
initialBalance,
balances,
loanPaymentSize,
requestedDisbursal,
requestedRepayment,
interest,
minorCurrencyUnitDigits,
true);
plannedPayments.add(paymentBuilder.accumulatePlannedPayment(balances, repaymentPeriod.getEndDate()));
}
return plannedPayments;
}