adamsaghy commented on code in PR #5523:
URL: https://github.com/apache/fineract/pull/5523#discussion_r2874516489


##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java:
##########
@@ -484,6 +495,65 @@ public CommandProcessingResult approve(JsonCommand 
jsonCommand) {
         }
     }
 
+    private LoanScheduleDTO generateRescheduledLoanSchedule(final 
ScheduleGeneratorDTO scheduleGeneratorDTO, final Loan loan,
+            final LocalDate rescheduleFromDate, final MathContext mathContext,
+            final LoanRepaymentScheduleTransactionProcessor 
loanRepaymentScheduleTransactionProcessor) {
+        final LoanApplicationTerms loanApplicationTerms = 
loanTermVariationsMapper.constructLoanApplicationTerms(scheduleGeneratorDTO,
+                loan);
+        final BigDecimal annualNominalInterestRate = null;
+        final List<LoanTermVariationsData> loanTermVariations = new 
ArrayList<>();
+        
loanTermVariationsMapper.constructLoanTermVariations(scheduleGeneratorDTO.getFloatingRateDTO(),
 annualNominalInterestRate,
+                loanTermVariations, loan);
+        
loanApplicationTerms.getLoanTermVariations().setExceptionData(loanTermVariations);
+
+        final LoanScheduleGenerator loanScheduleGenerator = 
this.loanScheduleFactory.create(loanApplicationTerms.getLoanScheduleType(),
+                loanApplicationTerms.getInterestMethod());
+        return loanScheduleGenerator.rescheduleNextInstallments(mathContext, 
loanApplicationTerms, loan,
+                loanApplicationTerms.getHolidayDetailDTO(), 
loanRepaymentScheduleTransactionProcessor, rescheduleFromDate);
+    }
+
+    private void addAutoExtendRepaymentPeriodVariation(final 
LoanRescheduleRequest loanRescheduleRequest, final Loan loan,
+            final LocalDate rescheduleFromDate) {
+        final LoanTermVariations loanTermVariation = new 
LoanTermVariations(LoanTermVariationType.EXTEND_REPAYMENT_PERIOD.getValue(),
+                rescheduleFromDate, BigDecimal.ONE, null, false, loan, 
loan.getStatus().getValue(), true, null);
+        loan.getLoanTermVariations().add(loanTermVariation);
+        loanRescheduleRequest.getLoanRescheduleRequestToTermVariationMappings()
+                
.add(LoanRescheduleRequestToTermVariationMapping.createNew(loanRescheduleRequest,
 loanTermVariation));
+    }
+
+    private boolean isLastInstallmentAmountTooLarge(final LoanScheduleDTO 
loanScheduleDTO, final MonetaryCurrency currency,
+            final LocalDate rescheduleFromDate) {
+        final List<LoanRepaymentScheduleInstallment> installments = 
loanScheduleDTO.getInstallments();
+        if (installments == null || installments.size() < 2) {
+            return false;
+        }
+
+        final List<LoanRepaymentScheduleInstallment> rescheduledInstallments = 
new ArrayList<>();
+        for (LoanRepaymentScheduleInstallment installment : installments) {
+            if (installment.isDownPayment() || 
DateUtils.isBefore(installment.getDueDate(), rescheduleFromDate)) {
+                continue;
+            }
+            rescheduledInstallments.add(installment);
+        }
+
+        if (rescheduledInstallments.size() < 2) {
+            return false;
+        }
+
+        final LoanRepaymentScheduleInstallment lastInstallment = 
rescheduledInstallments.get(rescheduledInstallments.size() - 1);
+        BigDecimal maxPriorDueAmount = BigDecimal.ZERO;
+        for (int i = 0; i < rescheduledInstallments.size() - 1; i++) {
+            final BigDecimal dueAmount = 
rescheduledInstallments.get(i).getDue(currency).getAmount();
+            if (dueAmount.compareTo(maxPriorDueAmount) > 0) {
+                maxPriorDueAmount = dueAmount;
+            }
+        }
+
+        final BigDecimal lastInstallmentDueAmount = 
lastInstallment.getDue(currency).getAmount();
+        final BigDecimal minimumMaterialDifference = 
BigDecimal.ONE.movePointLeft(currency.getDigitsAfterDecimal());
+        return 
lastInstallmentDueAmount.subtract(maxPriorDueAmount).compareTo(minimumMaterialDifference)
 > 0;

Review Comment:
   Could you help me understand the logic behind this?
   
   I’m curious about what constitutes “too large” in this context.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to