diff --git a/fineract-loan/src/main/java/org/apache/fineract/infrastructure/event/business/domain/loan/transaction/LoanCapitalizedIncomeTransactionCreatedBusinessEvent.java b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/event/business/domain/loan/transaction/LoanCapitalizedIncomeTransactionCreatedBusinessEvent.java
new file mode 100644
index 000000000..49a7e22d1
--- /dev/null
+++ b/fineract-loan/src/main/java/org/apache/fineract/infrastructure/event/business/domain/loan/transaction/LoanCapitalizedIncomeTransactionCreatedBusinessEvent.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.infrastructure.event.business.domain.loan.transaction;
+
+import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
+
+public class LoanCapitalizedIncomeTransactionCreatedBusinessEvent extends LoanTransactionBusinessEvent {
+
+ private static final String TYPE = "LoanCapitalizedIncomeTransactionCreatedBusinessEvent";
+
+ public LoanCapitalizedIncomeTransactionCreatedBusinessEvent(LoanTransaction value) {
+ super(value);
+ }
+
+ @Override
+ public String getType() {
+ return TYPE;
+ }
+}
diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeWritePlatformServiceImpl.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeWritePlatformServiceImpl.java
index 2df2b7d2b..43894c0e3 100644
--- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeWritePlatformServiceImpl.java
+++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/CapitalizedIncomeWritePlatformServiceImpl.java
@@ -34,6 +34,10 @@ import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.ExternalIdFactory;
import org.apache.fineract.infrastructure.core.service.MathUtil;
+import org.apache.fineract.infrastructure.event.business.domain.loan.LoanBalanceChangedBusinessEvent;
+import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent;
+import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanCapitalizedIncomeTransactionCreatedBusinessEvent;
+import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeBalance;
@@ -61,6 +65,7 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
private final LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository;
private final ReprocessLoanTransactionsService reprocessLoanTransactionsService;
private final LoanBalanceService loanBalanceService;
+ private final BusinessEventNotifierService businessEventNotifierService;
@Transactional
@Override
@@ -101,6 +106,9 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
// Post journal entries
journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds);
+ businessEventNotifierService
+ .notifyPostBusinessEvent(new LoanCapitalizedIncomeTransactionCreatedBusinessEvent(capitalizedIncomeTransaction));
+ businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan));
return new CommandProcessingResultBuilder() //
.withEntityId(capitalizedIncomeTransaction.getId()) //
.withEntityExternalId(capitalizedIncomeTransaction.getExternalId()) //
@@ -153,6 +161,10 @@ public class CapitalizedIncomeWritePlatformServiceImpl implements CapitalizedInc
MathUtil.negativeToZero(capitalizedIncomeBalance.getUnrecognizedAmount().subtract(transactionAmount)));
capitalizedIncomeBalanceRepository.save(capitalizedIncomeBalance);
+ businessEventNotifierService.notifyPostBusinessEvent(
+ new LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent(savedCapitalizedIncomeAdjustment));
+ businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan));
+
return new CommandProcessingResultBuilder() //
.withEntityId(savedCapitalizedIncomeAdjustment.getId()) //
.withEntityExternalId(savedCapitalizedIncomeAdjustment.getExternalId()) //
diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
index 6694b9eab..2cd92df3d 100644
--- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
+++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.fineract.portfolio.loanaccount.starter;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.infrastructure.core.service.ExternalIdFactory;
+import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
@@ -50,10 +51,11 @@ public class ProgressiveLoanAccountConfiguration {
PaymentDetailWritePlatformService paymentDetailWritePlatformService, LoanJournalEntryPoster journalEntryPoster,
NoteWritePlatformService noteWritePlatformService, ExternalIdFactory externalIdFactory,
LoanCapitalizedIncomeBalanceRepository capitalizedIncomeBalanceRepository,
- ReprocessLoanTransactionsService reprocessLoanTransactionsService, LoanBalanceService loanBalanceService) {
+ ReprocessLoanTransactionsService reprocessLoanTransactionsService, LoanBalanceService loanBalanceService,
+ BusinessEventNotifierService businessEventNotifierService) {
return new CapitalizedIncomeWritePlatformServiceImpl(loanTransactionValidator, loanAssembler, loanTransactionRepository,
paymentDetailWritePlatformService, journalEntryPoster, noteWritePlatformService, externalIdFactory,
- capitalizedIncomeBalanceRepository, reprocessLoanTransactionsService, loanBalanceService);
+ capitalizedIncomeBalanceRepository, reprocessLoanTransactionsService, loanBalanceService, businessEventNotifierService);
}
@Bean
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
index 23d39d7f9..50b68a01f 100644
--- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
@@ -201,4 +201,5 @@
+
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0183_add_LoanCapitalizedIncomeTransactionCreatedBusinessEvent.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0183_add_LoanCapitalizedIncomeTransactionCreatedBusinessEvent.xml
new file mode 100644
index 000000000..66a28bab0
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0183_add_LoanCapitalizedIncomeTransactionCreatedBusinessEvent.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventConfigurationValidationServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventConfigurationValidationServiceTest.java
index f802e918f..5d5e47edd 100644
--- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventConfigurationValidationServiceTest.java
+++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventConfigurationValidationServiceTest.java
@@ -108,7 +108,8 @@ public class ExternalEventConfigurationValidationServiceTest {
"LoanTransactionInterestRefundPreBusinessEvent", "LoanAccrualAdjustmentTransactionBusinessEvent",
"LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent",
"LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent", "LoanTransactionContractTerminationPostBusinessEvent",
- "LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent");
+ "LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent",
+ "LoanCapitalizedIncomeTransactionCreatedBusinessEvent");
List tenants = Arrays
.asList(new FineractPlatformTenant(1L, "default", "Default Tenant", "Europe/Budapest", null));
@@ -197,7 +198,8 @@ public class ExternalEventConfigurationValidationServiceTest {
"LoanTransactionInterestRefundPreBusinessEvent", "LoanAccrualAdjustmentTransactionBusinessEvent",
"LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent",
"LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent", "LoanTransactionContractTerminationPostBusinessEvent",
- "LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent");
+ "LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent",
+ "LoanCapitalizedIncomeTransactionCreatedBusinessEvent");
List tenants = Arrays
.asList(new FineractPlatformTenant(1L, "default", "Default Tenant", "Europe/Budapest", null));
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 8659659b8..201e41caf 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
@@ -87,6 +87,7 @@ import org.apache.fineract.client.models.RetrieveLoansPointInTimeRequest;
import org.apache.fineract.client.util.CallFailedRuntimeException;
import org.apache.fineract.client.util.Calls;
import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
+import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventDTO;
import org.apache.fineract.integrationtests.client.IntegrationTest;
import org.apache.fineract.integrationtests.common.BatchHelper;
import org.apache.fineract.integrationtests.common.BusinessDateHelper;
@@ -99,6 +100,9 @@ import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper;
import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
import org.apache.fineract.integrationtests.common.error.ErrorResponse;
+import org.apache.fineract.integrationtests.common.externalevents.BusinessEvent;
+import org.apache.fineract.integrationtests.common.externalevents.ExternalEventHelper;
+import org.apache.fineract.integrationtests.common.externalevents.ExternalEventsExtension;
import org.apache.fineract.integrationtests.common.loans.LoanAccountLockHelper;
import org.apache.fineract.integrationtests.common.loans.LoanProductHelper;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
@@ -119,7 +123,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.extension.ExtendWith;
@Slf4j
-@ExtendWith(LoanTestLifecycleExtension.class)
+@ExtendWith({ LoanTestLifecycleExtension.class, ExternalEventsExtension.class })
public abstract class BaseLoanIntegrationTest extends IntegrationTest {
protected static final String DATETIME_PATTERN = "dd MMMM yyyy";
@@ -171,6 +175,7 @@ public abstract class BaseLoanIntegrationTest extends IntegrationTest {
protected GlobalConfigurationHelper globalConfigurationHelper = new GlobalConfigurationHelper();
protected final CodeHelper codeHelper = new CodeHelper();
protected final ChargesHelper chargesHelper = new ChargesHelper();
+ protected final ExternalEventHelper externalEventHelper = new ExternalEventHelper();
protected static void validateRepaymentPeriod(GetLoansLoanIdResponse loanDetails, Integer index, LocalDate dueDate, double principalDue,
double principalPaid, double principalOutstanding, double paidInAdvance, double paidLate) {
@@ -1269,6 +1274,42 @@ public abstract class BaseLoanIntegrationTest extends IntegrationTest {
new PostLoansLoanIdRequest().rejectedOnDate(rejectedOnDate).locale("en").dateFormat(DATETIME_PATTERN));
}
+ protected void verifyBusinessEvents(BusinessEvent... businessEvents) {
+ List allExternalEvents = ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
+ logBusinessEvents(allExternalEvents);
+ Assertions.assertNotNull(businessEvents);
+ Assertions.assertNotNull(allExternalEvents);
+ Assertions.assertTrue(businessEvents.length <= allExternalEvents.size(),
+ "Expected business event count is less than actual. Expected: " + businessEvents.length + " Actual: "
+ + allExternalEvents.size());
+ final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATETIME_PATTERN, Locale.ENGLISH);
+ for (BusinessEvent businessEvent : businessEvents) {
+ long count = allExternalEvents.stream().filter(externalEvent -> businessEvent.verify(externalEvent, formatter)).count();
+ Assertions.assertEquals(1, count, "Expected business event not found " + businessEvent);
+ }
+ }
+
+ protected void logBusinessEvents(List allExternalEvents) {
+ allExternalEvents.forEach(externalEventDTO -> {
+ Object amount = externalEventDTO.getPayLoad().get("amount");
+ Object outstandingLoanBalance = externalEventDTO.getPayLoad().get("outstandingLoanBalance");
+ Object principalPortion = externalEventDTO.getPayLoad().get("principalPortion");
+ Object interestPortion = externalEventDTO.getPayLoad().get("interestPortion");
+ Object feePortion = externalEventDTO.getPayLoad().get("feeChargesPortion");
+ Object penaltyPortion = externalEventDTO.getPayLoad().get("penaltyChargesPortion");
+ log.info("Event Received\n type:'{}'\n businessDate:'{}'", externalEventDTO.getType(), externalEventDTO.getBusinessDate());
+ log.info(
+ "Values\n amount: {}\n outstandingLoanBalance: {}\n principalPortion: {}\n interestPortion: {}\n feePortion: {}\n penaltyPortion: {}",
+ amount, outstandingLoanBalance, principalPortion, interestPortion, feePortion, penaltyPortion);
+ });
+ }
+
+ protected void deleteAllExternalEvents() {
+ ExternalEventHelper.deleteAllExternalEvents(requestSpec, createResponseSpecification(Matchers.is(204)));
+ List allExternalEvents = ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
+ Assertions.assertEquals(0, allExternalEvents.size());
+ }
+
@RequiredArgsConstructor
public static class BatchRequestBuilder {
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CustomSnapshotEventIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CustomSnapshotEventIntegrationTest.java
index abb535e37..59786806a 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CustomSnapshotEventIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CustomSnapshotEventIntegrationTest.java
@@ -37,7 +37,6 @@ import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
import org.apache.fineract.integrationtests.common.externalevents.ExternalEventHelper;
import org.apache.fineract.integrationtests.common.externalevents.ExternalEventsExtension;
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
-import org.hamcrest.Matchers;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -305,12 +304,6 @@ public class CustomSnapshotEventIntegrationTest extends BaseLoanIntegrationTest
});
}
- private void deleteAllExternalEvents() {
- ExternalEventHelper.deleteAllExternalEvents(requestSpec, createResponseSpecification(Matchers.is(204)));
- List allExternalEvents = ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
- Assertions.assertEquals(0, allExternalEvents.size());
- }
-
private void enableCOBBusinessStep(String... steps) {
new BusinessStepHelper().updateSteps("LOAN_CLOSE_OF_BUSINESS", steps);
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 715ca3e93..10988e91c 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
@@ -25,24 +25,12 @@ import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
-import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
-import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-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.GetLoansLoanIdResponse;
import org.apache.fineract.client.models.GetLoansLoanIdStatus;
import org.apache.fineract.client.models.GlobalConfigurationPropertyData;
@@ -66,8 +54,10 @@ 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.externalevents.LoanAdjustTransactionBusinessEvent;
+import org.apache.fineract.integrationtests.common.externalevents.LoanBusinessEvent;
+import org.apache.fineract.integrationtests.common.externalevents.LoanTransactionBusinessEvent;
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;
@@ -1012,12 +1002,6 @@ public class ExternalBusinessEventTest extends BaseLoanIntegrationTest {
externalEventHelper.disableBusinessEvent("LoanBalanceChangedBusinessEvent");
}
- private void deleteAllExternalEvents() {
- ExternalEventHelper.deleteAllExternalEvents(requestSpec, createResponseSpecification(Matchers.is(204)));
- List allExternalEvents = ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
- Assertions.assertEquals(0, allExternalEvents.size());
- }
-
private static Long createLoanProductPeriodicWithInterest() {
String name = Utils.uniqueRandomStringGenerator("LOAN_PRODUCT_", 6);
String shortName = Utils.uniqueRandomStringGenerator("", 4);
@@ -1070,21 +1054,6 @@ public class ExternalBusinessEventTest extends BaseLoanIntegrationTest {
return loanId;
}
- private void logBusinessEvents(List allExternalEvents) {
- allExternalEvents.forEach(externalEventDTO -> {
- Object amount = externalEventDTO.getPayLoad().get("amount");
- Object outstandingLoanBalance = externalEventDTO.getPayLoad().get("outstandingLoanBalance");
- Object principalPortion = externalEventDTO.getPayLoad().get("principalPortion");
- Object interestPortion = externalEventDTO.getPayLoad().get("interestPortion");
- Object feePortion = externalEventDTO.getPayLoad().get("feeChargesPortion");
- Object penaltyPortion = externalEventDTO.getPayLoad().get("penaltyChargesPortion");
- log.info("Event Received\n type:'{}'\n businessDate:'{}'", externalEventDTO.getType(), externalEventDTO.getBusinessDate());
- log.info(
- "Values\n amount: {}\n outstandingLoanBalance: {}\n principalPortion: {}\n interestPortion: {}\n feePortion: {}\n penaltyPortion: {}",
- amount, outstandingLoanBalance, principalPortion, interestPortion, feePortion, penaltyPortion);
- });
- }
-
private void enableLoanInterestRefundPstBusinessEvent(boolean enabled) {
externalEventHelper.configureBusinessEvent("LoanTransactionInterestRefundPostBusinessEvent", enabled);
}
@@ -1096,220 +1065,4 @@ public class ExternalBusinessEventTest extends BaseLoanIntegrationTest {
private void configureLoanAccrualTransactionCreatedBusinessEvent(boolean enabled) {
externalEventHelper.configureBusinessEvent("LoanAccrualTransactionCreatedBusinessEvent", enabled);
}
-
- public void verifyBusinessEvents(BusinessEvent... businessEvents) {
- List allExternalEvents = ExternalEventHelper.getAllExternalEvents(requestSpec, responseSpec);
- logBusinessEvents(allExternalEvents);
- Assertions.assertNotNull(businessEvents);
- Assertions.assertNotNull(allExternalEvents);
- Assertions.assertTrue(businessEvents.length <= allExternalEvents.size(),
- "Expected business event count is less than actual. Expected: " + businessEvents.length + " Actual: "
- + allExternalEvents.size());
- final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATETIME_PATTERN, Locale.ENGLISH);
- for (BusinessEvent businessEvent : businessEvents) {
- long count = allExternalEvents.stream().filter(externalEvent -> businessEvent.verify(externalEvent, formatter)).count();
- Assertions.assertEquals(1, count, "Expected business event not found " + businessEvent);
- }
- }
-
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public static class BusinessEvent {
-
- String type;
- String businessDate;
-
- boolean verify(@NotNull ExternalEventDTO externalEvent, DateTimeFormatter formatter) {
- var businessDate = LocalDate.parse(getBusinessDate(), formatter);
-
- return Objects.equals(externalEvent.getType(), getType()) && Objects.equals(externalEvent.getBusinessDate(), businessDate);
- }
- }
-
- @EqualsAndHashCode(callSuper = true)
- @Data
- @AllArgsConstructor
- public static class LoanTransactionBusinessEvent extends BusinessEvent {
-
- private Double amount;
- private Double outstandingLoanBalance;
- private Double principalPortion;
- private Double interestPortion;
- private Double feeChargesPortion;
- private Double penaltyChargesPortion;
-
- public LoanTransactionBusinessEvent(String type, String businessDate, Double amount, Double outstandingLoanBalance,
- Double principalPortion, Double interestPortion, Double feeChargesPortion, Double penaltyChargesPortion) {
- super(type, businessDate);
- this.amount = amount;
- this.outstandingLoanBalance = outstandingLoanBalance;
- this.principalPortion = principalPortion;
- this.interestPortion = interestPortion;
- this.feeChargesPortion = feeChargesPortion;
- this.penaltyChargesPortion = penaltyChargesPortion;
- }
-
- @Override
- boolean verify(ExternalEventDTO externalEvent, DateTimeFormatter formatter) {
- Object amount = externalEvent.getPayLoad().get("amount");
- Object outstandingLoanBalance = externalEvent.getPayLoad().get("outstandingLoanBalance");
- Object principalPortion = externalEvent.getPayLoad().get("principalPortion");
- Object interestPortion = externalEvent.getPayLoad().get("interestPortion");
- Object feePortion = externalEvent.getPayLoad().get("feeChargesPortion");
- Object penaltyPortion = externalEvent.getPayLoad().get("penaltyChargesPortion");
-
- return super.verify(externalEvent, formatter) && Objects.equals(amount, getAmount())
- && Objects.equals(outstandingLoanBalance, getOutstandingLoanBalance())
- && Objects.equals(principalPortion, getPrincipalPortion()) && Objects.equals(interestPortion, getInterestPortion())
- && Objects.equals(feePortion, getFeeChargesPortion()) && Objects.equals(penaltyPortion, getPenaltyChargesPortion());
- }
- }
-
- @EqualsAndHashCode(callSuper = true)
- @Data
- @AllArgsConstructor
- public static class LoanBusinessEvent extends BusinessEvent {
-
- private Integer statusId;
- private Double principalDisbursed;
- private Double principalOutstanding;
- private List loanTermVariationType;
-
- public LoanBusinessEvent(String type, String businessDate, Integer statusId, Double principalDisbursed,
- Double principalOutstanding) {
- super(type, businessDate);
- this.statusId = statusId;
- this.principalDisbursed = principalDisbursed;
- this.principalOutstanding = principalOutstanding;
- }
-
- public LoanBusinessEvent(String type, String businessDate, Integer statusId, Double principalDisbursed, Double principalOutstanding,
- List loanTermVariationType) {
- super(type, businessDate);
- this.statusId = statusId;
- this.principalDisbursed = principalDisbursed;
- this.principalOutstanding = principalOutstanding;
- this.loanTermVariationType = loanTermVariationType;
- }
-
- @Override
- public boolean verify(ExternalEventDTO externalEvent, DateTimeFormatter formatter) {
- Object summaryRes = externalEvent.getPayLoad().get("summary");
- Object statusRes = externalEvent.getPayLoad().get("status");
- Map summary = summaryRes instanceof Map ? (Map) summaryRes : Map.of();
- Map status = statusRes instanceof Map ? (Map) statusRes : Map.of();
- var principalDisbursed = summary.get("principalDisbursed");
-
- var principalOutstanding = summary.get("principalOutstanding");
- Double statusId = (Double) status.get("id");
- return super.verify(externalEvent, formatter) && Objects.equals(statusId, getStatusId().doubleValue())
- && Objects.equals(principalDisbursed, getPrincipalDisbursed())
- && Objects.equals(principalOutstanding, getPrincipalOutstanding()) && loanTermVariationsMatch(
- (List