This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 001ad2fa1 FINERACT-1839: Fix N+1 installment due date
001ad2fa1 is described below

commit 001ad2fa1f08a5e9a1844439f19e1dd93addefe1
Author: Adam Saghy <[email protected]>
AuthorDate: Tue Aug 29 11:01:34 2023 +0200

    FINERACT-1839: Fix N+1 installment due date
---
 ...bstractLoanRepaymentScheduleTransactionProcessor.java |  6 +++++-
 .../LoanTransactionReverseReplayTest.java                | 16 ++++++++++++++--
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java
index ec10ad8a6..3f448f738 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java
@@ -372,9 +372,13 @@ public abstract class 
AbstractLoanRepaymentScheduleTransactionProcessor implemen
                     loanTransactionMapped = true;
                     break;
 
-                    // If already exists an additional installment just update
+                    // If already exists an additional installment just update 
the due date and
                     // principal from the Loan chargeback / CBR transaction
                 } else if (currentInstallment.isAdditional()) {
+                    if 
(transactionDate.isAfter(currentInstallment.getDueDate())) {
+                        currentInstallment.updateDueDate(transactionDate);
+                    }
+
                     currentInstallment.updateCredits(transactionDate, 
transactionAmount);
                     if (repaidAmount.isGreaterThanZero()) {
                         
currentInstallment.payPrincipalComponent(loanTransaction.getTransactionDate(), 
repaidAmount);
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
index 3fbb1314c..309a1c101 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
@@ -143,7 +143,8 @@ public class LoanTransactionReverseReplayTest {
     /**
      * 1 create a loan account - approve and disburse // 2. make repayment 
(fully paid) // 3. add the charge greater
      * than the maturity date // 4. make 2nd payment with excess amount - the 
loan will move to overpaid state. // 5. Do
-     * a CBR transaction // 6. reverse the 2nd payment // 7. check the 
repayment schedule due date. //
+     * a CBR transaction // 6. reverse the 2nd payment // 7. check the 
repayment schedule due date. 8. add chargeback
+     * for 1st repayment 9. check the repayment schedule due date //
      */
     @Test
     public void 
loanTransactionReverseReplayWithAdditionalInstallmentAndChargesScheduleDueDateTest()
 {
@@ -167,8 +168,9 @@ public class LoanTransactionReverseReplayTest {
                     
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT,
 "10", true));
 
             // make repayment
+            String loanTransactionExternalIdStr = UUID.randomUUID().toString();
             loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, new 
PostLoansLoanIdTransactionsRequest().dateFormat(DATE_PATTERN)
-                    .transactionDate("03 October 
2022").locale("en").transactionAmount(1000.0));
+                    .transactionDate("03 October 
2022").locale("en").transactionAmount(1000.0).externalId(loanTransactionExternalIdStr));
 
             LocalDate targetDate = LocalDate.of(2022, 10, 10);
             final String penaltyCharge1AddedDate = 
dateFormatter.format(targetDate);
@@ -202,6 +204,16 @@ public class LoanTransactionReverseReplayTest {
             lastPeriodIndex = 
loansLoanIdResponse.getRepaymentSchedule().getPeriods().size() - 1;
             assertEquals(LocalDate.of(2022, 10, 10),
                     
loansLoanIdResponse.getRepaymentSchedule().getPeriods().get(lastPeriodIndex).getDueDate());
+
+            businessDateHelper.updateBusinessDate(new 
BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
+                    .date("11 October 
2022").dateFormat(DATE_PATTERN).locale("en"));
+            loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr, 
loanTransactionExternalIdStr,
+                    new 
PostLoansLoanIdTransactionsTransactionIdRequest().locale("en").transactionAmount(100.0).paymentTypeId(1L));
+
+            loansLoanIdResponse = 
loanTransactionHelper.getLoanDetails(loanExternalIdStr);
+            lastPeriodIndex = 
loansLoanIdResponse.getRepaymentSchedule().getPeriods().size() - 1;
+            assertEquals(LocalDate.of(2022, 10, 11),
+                    
loansLoanIdResponse.getRepaymentSchedule().getPeriods().get(lastPeriodIndex).getDueDate());
         } finally {
             GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, 
responseSpec, Boolean.FALSE);
         }

Reply via email to