San-43 commented on code in PR #5689:
URL: https://github.com/apache/fineract/pull/5689#discussion_r3031899110


##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java:
##########
@@ -289,32 +279,111 @@ private void 
createLoanTermVariationsForRegularLoans(final Loan loan, final Inte
             parent = createLoanTermVariations(loanRescheduleRequest, termType, 
loan, rescheduleFromDate, dueDate,
                     loanRescheduleRequestToTermVariationMappings, isActive, 
isSpecificToInstallment, BigDecimal.valueOf(graceOnPrincipal),
                     parent);
+            pendingRescheduleVariations.add(parent);
 
             BigDecimal extraTermsBasedOnGracePeriods = 
BigDecimal.valueOf(graceOnPrincipal);
-            createLoanTermVariations(loanRescheduleRequest, 
LoanTermVariationType.EXTEND_REPAYMENT_PERIOD.getValue(), loan,
-                    rescheduleFromDate, dueDate, 
loanRescheduleRequestToTermVariationMappings, isActive, isSpecificToInstallment,
-                    extraTermsBasedOnGracePeriods, parent);
+            LoanTermVariations extraTermsVariation = 
createLoanTermVariations(loanRescheduleRequest,
+                    LoanTermVariationType.EXTEND_REPAYMENT_PERIOD.getValue(), 
loan, rescheduleFromDate, dueDate,
+                    loanRescheduleRequestToTermVariationMappings, isActive, 
isSpecificToInstallment, extraTermsBasedOnGracePeriods, parent);
+            pendingRescheduleVariations.add(extraTermsVariation);
 
         }
 
         if (rescheduleFromDate != null && graceOnInterest != null) {
             LoanTermVariations parent = null;
             final Integer termType = 
LoanTermVariationType.GRACE_ON_INTEREST.getValue();
-            createLoanTermVariations(loanRescheduleRequest, termType, loan, 
rescheduleFromDate, dueDate,
-                    loanRescheduleRequestToTermVariationMappings, isActive, 
isSpecificToInstallment, BigDecimal.valueOf(graceOnInterest),
-                    parent);
+            LoanTermVariations loanTermVariation = 
createLoanTermVariations(loanRescheduleRequest, termType, loan, 
rescheduleFromDate,
+                    dueDate, loanRescheduleRequestToTermVariationMappings, 
isActive, isSpecificToInstallment,
+                    BigDecimal.valueOf(graceOnInterest), parent);
+            pendingRescheduleVariations.add(loanTermVariation);
         }
 
         if (rescheduleFromDate != null && extraTerms != null) {
             LoanTermVariations parent = null;
             final Integer termType = 
LoanTermVariationType.EXTEND_REPAYMENT_PERIOD.getValue();
-            createLoanTermVariations(loanRescheduleRequest, termType, loan, 
rescheduleFromDate, dueDate,
-                    loanRescheduleRequestToTermVariationMappings, isActive, 
isSpecificToInstallment, BigDecimal.valueOf(extraTerms),
-                    parent);
+            LoanTermVariations loanTermVariation = 
createLoanTermVariations(loanRescheduleRequest, termType, loan, 
rescheduleFromDate,
+                    dueDate, loanRescheduleRequestToTermVariationMappings, 
isActive, isSpecificToInstallment,
+                    BigDecimal.valueOf(extraTerms), parent);
+            pendingRescheduleVariations.add(loanTermVariation);
+        }
+
+        if (rescheduleFromDate != null && endDate != null && emi != null) {
+            LoanTermVariations parent = null;
+            final Integer termType = 
LoanTermVariationType.EMI_AMOUNT.getValue();
+            int emiVariationsCreated = 0;
+            List<LocalDate> projectedInstallmentDueDates = 
getProjectedInstallmentDueDates(loan, rescheduleFromDate,
+                    pendingRescheduleVariations);
+            for (LocalDate installmentDueDate : projectedInstallmentDueDates) {
+                if (!DateUtils.isBefore(installmentDueDate, 
rescheduleFromDate) && !DateUtils.isAfter(installmentDueDate, endDate)) {
+                    createLoanTermVariations(loanRescheduleRequest, termType, 
loan, installmentDueDate, installmentDueDate,
+                            loanRescheduleRequestToTermVariationMappings, 
isActive, true, emi, parent);
+                    emiVariationsCreated++;
+                }
+                if (DateUtils.isAfter(installmentDueDate, endDate)) {
+                    break;
+                }
+            }
+            if (emiVariationsCreated == 0) {
+                List<ApiParameterError> dataValidationErrors = new 
ArrayList<>();
+                final DataValidatorBuilder dataValidatorBuilder = new 
DataValidatorBuilder(dataValidationErrors)
+                        .resource(RescheduleLoansApiConstants.ENTITY_NAME);
+                
dataValidatorBuilder.reset().parameter(RescheduleLoansApiConstants.endDateParamName).failWithCode(
+                        "end.date.before.next.installment", "End date must be 
on or after the next projected installment date");
+                throw new 
PlatformApiDataValidationException(dataValidationErrors);
+            }
         }
         
loanRescheduleRequest.updateLoanRescheduleRequestToTermVariationMappings(loanRescheduleRequestToTermVariationMappings);
     }
 
+    private List<LocalDate> getProjectedInstallmentDueDates(final Loan loan, 
final LocalDate rescheduleFromDate,
+            final List<LoanTermVariations> pendingRescheduleVariations) {
+        ScheduleGeneratorDTO scheduleGeneratorDTO = 
this.loanUtilService.buildScheduleGeneratorDTO(loan, rescheduleFromDate);
+        final LoanApplicationTerms loanApplicationTerms = 
loanTermVariationsMapper.constructLoanApplicationTerms(scheduleGeneratorDTO,
+                loan);
+        List<LoanTermVariationsData> projectedVariations = 
buildProjectedLoanTermVariatons(loanApplicationTerms,

Review Comment:
   Done 😅, I also rebased onto the latest develop



-- 
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