From 033847921269394d9bbe42c9fcad1e57fad20948 Mon Sep 17 00:00:00 2001 From: Arnold Galovics Date: Tue, 14 Feb 2023 16:23:44 +0100 Subject: [PATCH] FINERACT-1724: Added delinquentDate to Delinquency Range Changed events --- .../v1/LoanAccountDelinquencyRangeDataV1.avsc | 8 ++++++++ ...ncyRangeChangeBusinessEventSerializer.java | 9 +++++++++ ...ntDelinquencyRangeEventSerializerTest.java | 19 +++++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fineract-avro-schemas/src/main/avro/loan/v1/LoanAccountDelinquencyRangeDataV1.avsc b/fineract-avro-schemas/src/main/avro/loan/v1/LoanAccountDelinquencyRangeDataV1.avsc index b9bb2dbf1..3da294421 100644 --- a/fineract-avro-schemas/src/main/avro/loan/v1/LoanAccountDelinquencyRangeDataV1.avsc +++ b/fineract-avro-schemas/src/main/avro/loan/v1/LoanAccountDelinquencyRangeDataV1.avsc @@ -42,6 +42,14 @@ "name": "amount", "doc": "Contains installments total, fee, interest, principal and penalty amount summaries", "type": "org.apache.fineract.avro.loan.v1.LoanAmountDataV1" + }, + { + "default": null, + "name": "delinquentDate", + "type": [ + "null", + "string" + ] } ] } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanDelinquencyRangeChangeBusinessEventSerializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanDelinquencyRangeChangeBusinessEventSerializer.java index bc448ff01..e04156482 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanDelinquencyRangeChangeBusinessEventSerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanDelinquencyRangeChangeBusinessEventSerializer.java @@ -33,8 +33,11 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.LoanDelinqu import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.generic.CurrencyDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanDelinquencyRangeDataMapper; +import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; +import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService; +import org.apache.fineract.portfolio.loanaccount.data.CollectionData; import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment; @@ -55,9 +58,12 @@ public class LoanDelinquencyRangeChangeBusinessEventSerializer extends AbstractB private final LoanChargeReadPlatformService loanChargeReadPlatformService; + private final DelinquencyReadPlatformService delinquencyReadPlatformService; + private final LoanChargeDataMapper chargeMapper; private final CurrencyDataMapper currencyMapper; + private final AvroDateTimeMapper dataTimeMapper; @Override protected ByteBufferSerializable toAvroDTO(BusinessEvent rawEvent) { @@ -67,6 +73,8 @@ public class LoanDelinquencyRangeChangeBusinessEventSerializer extends AbstractB String accountNumber = data.getAccountNo(); String externalId = data.getExternalId().getValue(); MonetaryCurrency loanCurrency = event.get().getCurrency(); + CollectionData delinquentData = delinquencyReadPlatformService.calculateLoanCollectionData(id); + String delinquentDate = dataTimeMapper.mapLocalDate(delinquentData.getDelinquentDate()); List charges = loanChargeReadPlatformService.retrieveLoanCharges(id)// .stream()// @@ -95,6 +103,7 @@ public class LoanDelinquencyRangeChangeBusinessEventSerializer extends AbstractB .setCharges(charges)// .setAmount(amount)// .setCurrency(currencyMapper.map(data.getCurrency()))// + .setDelinquentDate(delinquentDate)// .build(); } diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAccountDelinquencyRangeEventSerializerTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAccountDelinquencyRangeEventSerializerTest.java index 78f6b9205..c92d22c4b 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAccountDelinquencyRangeEventSerializerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAccountDelinquencyRangeEventSerializerTest.java @@ -47,6 +47,7 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.LoanDelinqu import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.generic.CurrencyDataMapperImpl; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapperImpl; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanDelinquencyRangeDataMapperImpl; +import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; @@ -57,6 +58,8 @@ import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType; import org.apache.fineract.portfolio.charge.domain.ChargePaymentMode; import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData; +import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService; +import org.apache.fineract.portfolio.loanaccount.data.CollectionData; import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; @@ -82,6 +85,12 @@ public class LoanAccountDelinquencyRangeEventSerializerTest { @Mock private LoanChargeReadPlatformService loanChargeReadPlatformService; + @Mock + private DelinquencyReadPlatformService delinquencyReadPlatformService; + + @Mock + private AvroDateTimeMapper mapper; + @BeforeEach public void setUp() { ThreadLocalContextUtil.setTenant(new FineractPlatformTenant(1L, "default", "Default", "Asia/Kolkata", null)); @@ -94,12 +103,15 @@ public class LoanAccountDelinquencyRangeEventSerializerTest { // given LoanDelinquencyRangeChangeBusinessEventSerializer serializer = new LoanDelinquencyRangeChangeBusinessEventSerializer( loanReadPlatformService, new LoanDelinquencyRangeDataMapperImpl(), loanChargeReadPlatformService, - new LoanChargeDataMapperImpl(), new CurrencyDataMapperImpl()); + delinquencyReadPlatformService, new LoanChargeDataMapperImpl(), new CurrencyDataMapperImpl(), mapper); Loan loanForProcessing = Mockito.mock(Loan.class); LoanAccountData loanAccountData = mock(LoanAccountData.class); + CollectionData delinquentData = mock(CollectionData.class); MonetaryCurrency loanCurrency = new MonetaryCurrency("CODE", 1, 1); MockedStatic moneyHelper = Mockito.mockStatic(MoneyHelper.class); + String delinquentDateAsStr = "2022-12-01"; + LocalDate delinquentDate = LocalDate.parse(delinquentDateAsStr); when(loanForProcessing.getId()).thenReturn(1L); when(loanAccountData.getId()).thenReturn(1L); @@ -109,7 +121,10 @@ public class LoanAccountDelinquencyRangeEventSerializerTest { when(loanAccountData.getCurrency()).thenAnswer(a -> new CurrencyData(loanCurrency.getCode(), loanCurrency.getDigitsAfterDecimal(), loanCurrency.getCurrencyInMultiplesOf())); when(loanForProcessing.getCurrency()).thenReturn(loanCurrency); + when(delinquentData.getDelinquentDate()).thenReturn(delinquentDate); when(loanReadPlatformService.retrieveOne(any(Long.class))).thenReturn(loanAccountData); + when(delinquencyReadPlatformService.calculateLoanCollectionData(any(Long.class))).thenReturn(delinquentData); + when(mapper.mapLocalDate(delinquentDate)).thenReturn(delinquentDateAsStr); LoanDelinquencyRangeChangeBusinessEvent event = new LoanDelinquencyRangeChangeBusinessEvent(loanForProcessing); List repaymentScheduleInstallments = new ArrayList<>(); @@ -141,8 +156,8 @@ public class LoanAccountDelinquencyRangeEventSerializerTest { assertEquals(0, data.getAmount().getInterestAmount().compareTo(new BigDecimal("30.0"))); assertEquals(0, data.getAmount().getFeeAmount().compareTo(new BigDecimal("5.0"))); assertEquals(0, data.getAmount().getPenaltyAmount().compareTo(new BigDecimal("50.0"))); + assertEquals(delinquentDateAsStr, data.getDelinquentDate()); - // assertEquals(data, expectedSerializedData); moneyHelper.close(); }