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 66f3de870 FINERACT-2081: Fix Interest Payment Waiver reverse-replay 
transaction on transaction creation.
66f3de870 is described below

commit 66f3de8702b20b732a3d1ea1c3399316b102fa2e
Author: Soma Sörös <[email protected]>
AuthorDate: Fri Jan 24 16:40:53 2025 +0100

    FINERACT-2081: Fix Interest Payment Waiver reverse-replay transaction on 
transaction creation.
---
 .../LoanWritePlatformServiceJpaRepositoryImpl.java |  13 +-
 .../integrationtests/BaseLoanIntegrationTest.java  |   5 +
 .../ExternalBusinessEventTest.java                 | 158 +++++++++++++++------
 .../common/externalevents/ExternalEventHelper.java |  28 +++-
 .../common/loans/LoanTransactionHelper.java        |   6 +
 5 files changed, 165 insertions(+), 45 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index 91fc7aaf4..263e5c02c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -1142,14 +1142,21 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             ScheduleGeneratorDTO scheduleGeneratorDTO) {
         if 
(loan.getLoanRepaymentScheduleDetail().isInterestRecalculationEnabled()) {
             
loanScheduleService.regenerateRepaymentScheduleWithInterestRecalculation(loan, 
scheduleGeneratorDTO);
-            loanAccrualsProcessingService.reprocessExistingAccruals(loan);
-            
loanAccrualsProcessingService.processIncomePostingAndAccruals(loan);
+
         } else if (loan.getLoanProductRelatedDetail() != null
                 && 
loan.getLoanProductRelatedDetail().getLoanScheduleType().equals(LoanScheduleType.PROGRESSIVE)
                 && 
loan.getLoanTransactions().stream().anyMatch(LoanTransaction::isChargeOff)) {
             loanScheduleService.regenerateRepaymentSchedule(loan, 
scheduleGeneratorDTO);
         }
-        return loan.reprocessTransactions();
+
+        ChangedTransactionDetail changedTransactionDetail = 
loan.reprocessTransactions();
+
+        if 
(loan.getLoanRepaymentScheduleDetail().isInterestRecalculationEnabled()) {
+            loanAccrualsProcessingService.reprocessExistingAccruals(loan);
+            
loanAccrualsProcessingService.processIncomePostingAndAccruals(loan);
+        }
+
+        return changedTransactionDetail;
     }
 
     @Transactional
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BaseLoanIntegrationTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BaseLoanIntegrationTest.java
index a846f9bb3..2ed80f7cf 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BaseLoanIntegrationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BaseLoanIntegrationTest.java
@@ -1079,6 +1079,11 @@ public abstract class BaseLoanIntegrationTest {
         return new Installment(principalAmount, interestAmount, null, null, 
0.0, true, dueDate, null, null);
     }
 
+    protected Installment unpaidInstallment(double principalAmount, double 
interestAmount, String dueDate) {
+        Double amount = principalAmount + interestAmount;
+        return new Installment(principalAmount, interestAmount, null, null, 
amount, false, dueDate, null, null);
+    }
+
     protected Installment installment(double principalAmount, double 
interestAmount, double feeAmount, double totalOutstandingAmount,
             Boolean completed, String dueDate) {
         return new Installment(principalAmount, interestAmount, feeAmount, 
null, totalOutstandingAmount, completed, dueDate, null, null);
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java
index 19eafb865..321e46256 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalBusinessEventTest.java
@@ -42,6 +42,7 @@ import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.fineract.client.models.GlobalConfigurationPropertyData;
 import org.apache.fineract.client.models.PostClientsResponse;
 import org.apache.fineract.client.models.PostCreateRescheduleLoansRequest;
 import org.apache.fineract.client.models.PostCreateRescheduleLoansResponse;
@@ -49,21 +50,25 @@ import 
org.apache.fineract.client.models.PostLoanProductsRequest;
 import org.apache.fineract.client.models.PostLoanProductsResponse;
 import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest;
 import org.apache.fineract.client.models.PostLoansLoanIdChargesResponse;
+import org.apache.fineract.client.models.PostLoansLoanIdRequest;
 import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
 import org.apache.fineract.client.models.PostLoansRequest;
 import org.apache.fineract.client.models.PostUpdateRescheduleLoansRequest;
+import 
org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
 import 
org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventDTO;
 import org.apache.fineract.integrationtests.common.BusinessStepHelper;
 import org.apache.fineract.integrationtests.common.ClientHelper;
-import 
org.apache.fineract.integrationtests.common.ExternalEventConfigurationHelper;
 import org.apache.fineract.integrationtests.common.LoanRescheduleRequestHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import 
org.apache.fineract.integrationtests.common.externalevents.ExternalEventHelper;
 import 
org.apache.fineract.integrationtests.common.externalevents.ExternalEventsExtension;
 import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
 import org.hamcrest.Matchers;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -79,6 +84,7 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     private static ResponseSpecification responseSpec;
     private static RequestSpecification requestSpec;
     Long chargeId = createCharge(111.0, "USD").getResourceId();
+    private final ExternalEventHelper externalEventHelper = new 
ExternalEventHelper();
 
     @BeforeAll
     public static void beforeAll() {
@@ -165,8 +171,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent01() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = 
loanProductHelper.createLoanProduct(create4IProgressive().currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
                     4, null);
@@ -206,8 +212,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent02() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = 
loanProductHelper.createLoanProduct(create4IProgressive().currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
                     4, null);
@@ -273,8 +279,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent03() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = 
loanProductHelper.createLoanProduct(create4IProgressive().currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
                     4, null);
@@ -348,8 +354,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent04() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
@@ -390,8 +396,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent05() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
@@ -458,8 +464,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent06() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 9.99,
@@ -533,8 +539,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent07() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 0.0, 4,
@@ -574,8 +580,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent08() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 0.0, 4,
@@ -641,8 +647,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
     @Test
     public void verifyLoanChargeAdjustmentPostBusinessEvent09() {
         runAt("1 January 2021", () -> {
-            enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
-            
enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanChargeAdjustmentPostBusinessEvent");
+            
externalEventHelper.enableBusinessEvent("LoanTransactionMakeRepaymentPostBusinessEvent");
             PostLoanProductsResponse loanProduct = loanProductHelper
                     
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(false).currencyCode("USD"));
             Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProduct.getResourceId(), "1 January 2021", 600.0, 0.0, 4,
@@ -769,33 +775,105 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
         });
     }
 
-    private static void enableLoanBalanceChangedBusinessEvent() {
-        enableBusinessEvent("LoanBalanceChangedBusinessEvent");
-    }
+    @Nested
+    class ExternalIdGenerationTest {
 
-    private static void configureBusinessEvent(String eventName, boolean 
enabled) {
-        String value = enabled ? "true" : "false";
-        final Map<String, Boolean> updatedConfigurations = 
ExternalEventConfigurationHelper.updateExternalEventConfigurations(requestSpec,
-                responseSpec, "{\"externalEventConfigurations\":{\"" + 
eventName + "\":" + value + "}}\n");
-        Assertions.assertEquals(1, updatedConfigurations.size());
-        Assertions.assertTrue(updatedConfigurations.containsKey(eventName));
-        Assertions.assertEquals(enabled, updatedConfigurations.get(eventName));
-    }
+        Boolean actualConfiguration = null;
+
+        @BeforeEach
+        void setUpEnableExternalIdGenerationIfActuallyDisabled() {
+            if (actualConfiguration == null) {
+                GlobalConfigurationPropertyData globalConfigurationByName = 
globalConfigurationHelper
+                        
.getGlobalConfigurationByName(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID);
+                if (globalConfigurationByName != null) {
+                    actualConfiguration = 
globalConfigurationByName.getEnabled();
+                    Assertions.assertNotNull(actualConfiguration);
+                }
+            }
+            if (!actualConfiguration) {
+                
globalConfigurationHelper.manageConfigurations(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID,
 true);
+            }
+        }
 
-    private static void enableBusinessEvent(String eventName) {
-        configureBusinessEvent(eventName, true);
+        @AfterEach
+        void tearDownDisableExternalIdGenerationIfPreviouslyDisabled() {
+            if (!actualConfiguration) {
+                
globalConfigurationHelper.manageConfigurations(GlobalConfigurationConstants.ENABLE_AUTO_GENERATED_EXTERNAL_ID,
 false);
+            }
+        }
+
+        @Test
+        public void 
testInterestPaymentWaiverNotReverseReplayOnCreationAndHasGeneratedExternalId() {
+            
externalEventHelper.enableBusinessEvent("LoanAdjustTransactionBusinessEvent");
+            AtomicReference<Long> loanIdRef = new AtomicReference<>();
+            runAt("15 January 2025", () -> {
+                PostLoanProductsResponse loanProductResponse = 
loanProductHelper
+                        
.createLoanProduct(create4IProgressive().isInterestRecalculationEnabled(true));
+
+                Long loanId = 
applyAndApproveProgressiveLoan(client.getClientId(), 
loanProductResponse.getResourceId(), "15 January 2025",
+                        430.0, 9.9, 4, null);
+                loanIdRef.set(loanId);
+
+                loanTransactionHelper.disburseLoan(loanId, new 
PostLoansLoanIdRequest().actualDisbursementDate("15 January 2025")
+                        
.dateFormat(DATETIME_PATTERN).transactionAmount(BigDecimal.valueOf(430.0)).locale("en"));
+
+                verifyTransactions(loanId, transaction(430.0, "Disbursement", 
"15 January 2025") //
+                );
+
+                verifyRepaymentSchedule(loanId, //
+                        installment(430.0, null, "15 January 2025"), //
+                        unpaidInstallment(106.18, 3.55, "15 February 2025"), //
+                        unpaidInstallment(107.06, 2.67, "15 March 2025"), //
+                        unpaidInstallment(107.94, 1.79, "15 April 2025"), //
+                        unpaidInstallment(108.82, 0.9, "15 May 2025") //
+                );
+            });
+            runAt("16 January 2025", () -> {
+                Long loanId = loanIdRef.get();
+                executeInlineCOB(loanId);
+                verifyTransactions(loanId, transaction(430.0, "Disbursement", 
"15 January 2025") //
+                );
+            });
+            runAt("17 January 2025", () -> {
+                Long loanId = loanIdRef.get();
+                executeInlineCOB(loanId);
+                verifyTransactions(loanId, transaction(430.0, "Disbursement", 
"15 January 2025"), //
+                        transaction(0.11, "Accrual", "16 January 2025"));
+                deleteAllExternalEvents();
+                PostLoansLoanIdTransactionsResponse 
interestPaymentWaiverResponse = loanTransactionHelper.makeLoanRepayment(loanId,
+                        "InterestPaymentWaiver", "17 January 2025", 10.0);
+
+                List<ExternalEventDTO> allExternalEvents = 
ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
+                List<ExternalEventDTO> adjustments = allExternalEvents.stream()
+                        .filter(e -> 
"LoanAdjustTransactionBusinessEvent".equals(e.getType())).toList();
+                Assertions.assertEquals(0, adjustments.size());
+                Assertions.assertNotNull(interestPaymentWaiverResponse);
+                
Assertions.assertNotNull(interestPaymentWaiverResponse.getResourceExternalId());
+
+                verifyTransactions(loanId, transaction(430.0, "Disbursement", 
"15 January 2025"), //
+                        transaction(10.0, "Interest Payment Waiver", "17 
January 2025"), //
+                        transaction(0.11, "Accrual", "16 January 2025"));
+                verifyRepaymentSchedule(loanId, //
+                        installment(430.0, null, "15 January 2025"), //
+                        installment(106.26, 3.47, 99.73, false, "15 February 
2025"), //
+                        unpaidInstallment(107.06, 2.67, "15 March 2025"), //
+                        unpaidInstallment(107.94, 1.79, "15 April 2025"), //
+                        unpaidInstallment(108.74, 0.9, "15 May 2025") //
+                );
+            });
+        }
     }
 
-    private static void disableBusinessEvent(String eventName) {
-        configureBusinessEvent(eventName, false);
+    private void enableLoanBalanceChangedBusinessEvent() {
+        
externalEventHelper.enableBusinessEvent("LoanBalanceChangedBusinessEvent");
     }
 
-    private static void enableLoanRescheduledDueAdjustScheduleBusinessEvent() {
-        enableBusinessEvent("LoanRescheduledDueAdjustScheduleBusinessEvent");
+    private void enableLoanRescheduledDueAdjustScheduleBusinessEvent() {
+        
externalEventHelper.enableBusinessEvent("LoanRescheduledDueAdjustScheduleBusinessEvent");
     }
 
-    private static void disableLoanBalanceChangedBusinessEvent() {
-        disableBusinessEvent("LoanBalanceChangedBusinessEvent");
+    private void disableLoanBalanceChangedBusinessEvent() {
+        
externalEventHelper.disableBusinessEvent("LoanBalanceChangedBusinessEvent");
     }
 
     private void deleteAllExternalEvents() {
@@ -871,8 +949,8 @@ public class ExternalBusinessEventTest extends 
BaseLoanIntegrationTest {
         });
     }
 
-    private static void enableLoanInterestRefundPstBusinessEvent(boolean 
enabled) {
-        
configureBusinessEvent("LoanTransactionInterestRefundPostBusinessEvent", 
enabled);
+    private void enableLoanInterestRefundPstBusinessEvent(boolean enabled) {
+        
externalEventHelper.configureBusinessEvent("LoanTransactionInterestRefundPostBusinessEvent",
 enabled);
     }
 
     public void verifyBusinessEvents(BusinessEvent... businessEvents) {
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/externalevents/ExternalEventHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/externalevents/ExternalEventHelper.java
index 8b09d312f..ab048d547 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/externalevents/ExternalEventHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/externalevents/ExternalEventHelper.java
@@ -26,18 +26,21 @@ import java.util.List;
 import java.util.Map;
 import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.models.CommandProcessingResult;
+import org.apache.fineract.client.models.PutExternalEventConfigurationsRequest;
 import org.apache.fineract.client.util.JSON;
 import 
org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventDTO;
+import org.apache.fineract.integrationtests.client.IntegrationTest;
 import 
org.apache.fineract.integrationtests.common.ExternalEventConfigurationHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import org.junit.jupiter.api.Assertions;
 
 @Slf4j
-public final class ExternalEventHelper {
+public final class ExternalEventHelper extends IntegrationTest {
 
     private static final Gson GSON = new JSON().getGson();
 
-    private ExternalEventHelper() {}
+    public ExternalEventHelper() {}
 
     @Builder
     public static class Filter {
@@ -117,4 +120,25 @@ public final class ExternalEventHelper {
         Assertions.assertEquals(status, updatedConfigurations.get(eventName));
     }
 
+    public void configureBusinessEvent(String eventName, boolean enabled) {
+        CommandProcessingResult result = 
ok(fineract().externalEventConfigurationApi.updateExternalEventConfigurationsDetails(
+                new 
PutExternalEventConfigurationsRequest().putExternalEventConfigurationsItem(eventName,
 enabled)));
+        Map<String, Object> changes = result.getChanges();
+        Assertions.assertNotNull(changes);
+        Assertions.assertInstanceOf(Map.class, changes);
+        Map<String, Boolean> updatedConfigurations = (Map<String, Boolean>) 
changes.get("externalEventConfigurations");
+        Assertions.assertNotNull(updatedConfigurations);
+        Assertions.assertEquals(1, updatedConfigurations.size());
+        Assertions.assertTrue(updatedConfigurations.containsKey(eventName));
+        Assertions.assertEquals(enabled, updatedConfigurations.get(eventName));
+    }
+
+    public void enableBusinessEvent(String eventName) {
+        configureBusinessEvent(eventName, true);
+    }
+
+    public void disableBusinessEvent(String eventName) {
+        configureBusinessEvent(eventName, false);
+    }
+
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index 67ca63554..81a51b314 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -870,6 +870,12 @@ public class LoanTransactionHelper extends IntegrationTest 
{
         return 
postLoanTransaction(createLoanTransactionURL(repaymentTypeCommand, loanID), 
getRepaymentBodyAsJSON(date, amountToBePaid));
     }
 
+    public PostLoansLoanIdTransactionsResponse makeLoanRepayment(final Long 
loanId, final String command, final String date,
+            final Double amountToBePaid) {
+        return ok(fineract().loanTransactions.executeLoanTransaction(loanId, 
new PostLoansLoanIdTransactionsRequest()
+                
.transactionAmount(amountToBePaid).transactionDate(date).dateFormat("dd MMMM 
yyyy").locale("en"), command));
+    }
+
     // TODO: Rewrite to use fineract-client instead!
     // Example: 
org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
     // org.apache.fineract.client.models.PostLoansLoanIdRequest)

Reply via email to