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 3c238b9b8 FINERACT-1971: Added installment level delinquency data to
LoanAccountDataV1/CollectionDataV1 avro schema
3c238b9b8 is described below
commit 3c238b9b8ff8434cfdda6528bb9d1a7076698ee6
Author: Arnold Galovics <[email protected]>
AuthorDate: Mon Jan 22 13:40:29 2024 +0100
FINERACT-1971: Added installment level delinquency data to
LoanAccountDataV1/CollectionDataV1 avro schema
---
.../src/main/avro/loan/v1/CollectionDataV1.avsc | 11 ++
.../mapper/loan/LoanAccountDataMapper.java | 1 +
.../loan/LoanBusinessEventSerializer.java | 11 +-
...inquencyRangeChangeBusinessEventSerializer.java | 85 +---------------
...nInstallmentLevelDelinquencyEventProducer.java} | 111 ++-------------------
...AccountDelinquencyRangeEventSerializerTest.java | 6 +-
6 files changed, 40 insertions(+), 185 deletions(-)
diff --git a/fineract-avro-schemas/src/main/avro/loan/v1/CollectionDataV1.avsc
b/fineract-avro-schemas/src/main/avro/loan/v1/CollectionDataV1.avsc
index 36256d227..3fdc726b7 100644
--- a/fineract-avro-schemas/src/main/avro/loan/v1/CollectionDataV1.avsc
+++ b/fineract-avro-schemas/src/main/avro/loan/v1/CollectionDataV1.avsc
@@ -93,6 +93,17 @@
"items":
"org.apache.fineract.avro.loan.v1.DelinquencyPausePeriodV1"
}
]
+ },
+ {
+ "default": null,
+ "name": "installmentDelinquencyBuckets",
+ "type": [
+ "null",
+ {
+ "type": "array",
+ "items":
"org.apache.fineract.avro.loan.v1.LoanInstallmentDelinquencyBucketDataV1"
+ }
+ ]
}
]
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/mapper/loan/LoanAccountDataMapper.java
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/mapper/loan/LoanAccountDataMapper.java
index 03b144614..d55a124f7 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/mapper/loan/LoanAccountDataMapper.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/mapper/loan/LoanAccountDataMapper.java
@@ -36,6 +36,7 @@ public interface LoanAccountDataMapper {
@Mapping(target = "externalOwnerId", ignore = true)
@Mapping(target = "settlementDate", ignore = true)
@Mapping(target = "purchasePriceRatio", ignore = true)
+ @Mapping(target = "delinquent.installmentDelinquencyBuckets", ignore =
true)
LoanAccountDataV1 map(LoanAccountData source);
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanBusinessEventSerializer.java
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanBusinessEventSerializer.java
index 2ed15944a..6844fe235 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanBusinessEventSerializer.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanBusinessEventSerializer.java
@@ -19,11 +19,13 @@
package
org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.util.Collection;
+import java.util.List;
import lombok.RequiredArgsConstructor;
import org.apache.avro.generic.GenericContainer;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
+import org.apache.fineract.avro.loan.v1.LoanInstallmentDelinquencyBucketDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import
org.apache.fineract.infrastructure.event.business.domain.loan.LoanBusinessEvent;
import
org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanAccountDataMapper;
@@ -46,6 +48,7 @@ public class LoanBusinessEventSerializer implements
BusinessEventSerializer {
private final LoanAccountDataMapper mapper;
private final LoanChargeReadPlatformService loanChargeReadPlatformService;
private final DelinquencyReadPlatformService
delinquencyReadPlatformService;
+ private final LoanInstallmentLevelDelinquencyEventProducer
installmentLevelDelinquencyEventProducer;
@Override
public <T> boolean canSerialize(BusinessEvent<T> event) {
@@ -74,7 +77,13 @@ public class LoanBusinessEventSerializer implements
BusinessEventSerializer {
} else {
data.setSummary(LoanSummaryData.withOnlyCurrencyData(data.getCurrency()));
}
- return mapper.map(data);
+
+ List<LoanInstallmentDelinquencyBucketDataV1>
installmentsDelinquencyData = installmentLevelDelinquencyEventProducer
+ .calculateInstallmentLevelDelinquencyData(event.get(),
data.getCurrency());
+
+ LoanAccountDataV1 result = mapper.map(data);
+
result.getDelinquent().setInstallmentDelinquencyBuckets(installmentsDelinquencyData);
+ return result;
}
@Override
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 22a606c0a..01c7b0166 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
@@ -19,12 +19,8 @@
package
org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
-import java.util.Map;
import java.util.function.BiFunction;
-import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.apache.avro.generic.GenericContainer;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
@@ -33,7 +29,6 @@ import
org.apache.fineract.avro.loan.v1.LoanAccountDelinquencyRangeDataV1;
import org.apache.fineract.avro.loan.v1.LoanAmountDataV1;
import org.apache.fineract.avro.loan.v1.LoanChargeDataRangeViewV1;
import org.apache.fineract.avro.loan.v1.LoanInstallmentDelinquencyBucketDataV1;
-import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import
org.apache.fineract.infrastructure.event.business.domain.loan.LoanDelinquencyRangeChangeBusinessEvent;
import
org.apache.fineract.infrastructure.event.external.service.serialization.mapper.generic.CurrencyDataMapper;
@@ -42,12 +37,10 @@ import
org.apache.fineract.infrastructure.event.external.service.serialization.m
import
org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper;
import
org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
-import
org.apache.fineract.portfolio.delinquency.data.LoanInstallmentDelinquencyTagData;
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;
import
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
import
org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService;
import
org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
@@ -72,6 +65,7 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
private final CurrencyDataMapper currencyMapper;
private final AvroDateTimeMapper dataTimeMapper;
+ private final LoanInstallmentLevelDelinquencyEventProducer
installmentLevelDelinquencyEventProducer;
@Override
public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
@@ -103,8 +97,8 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
DelinquencyRangeDataV1 delinquencyRange =
mapper.map(data.getDelinquencyRange());
- List<LoanInstallmentDelinquencyBucketDataV1>
installmentsDelinquencyData =
calculateInstallmentLevelDelinquencyData(event.get(),
- data);
+ List<LoanInstallmentDelinquencyBucketDataV1>
installmentsDelinquencyData = installmentLevelDelinquencyEventProducer
+ .calculateInstallmentLevelDelinquencyData(event.get(),
data.getCurrency());
LoanAccountDelinquencyRangeDataV1.Builder builder =
LoanAccountDelinquencyRangeDataV1.newBuilder();
return builder//
@@ -119,79 +113,6 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
.setInstallmentDelinquencyBuckets(installmentsDelinquencyData).build();
}
- private List<LoanInstallmentDelinquencyBucketDataV1>
calculateInstallmentLevelDelinquencyData(Loan loan, LoanAccountData data) {
- List<LoanInstallmentDelinquencyBucketDataV1>
loanInstallmentDelinquencyData = new ArrayList<>();
- if (loan.isEnableInstallmentLevelDelinquency()) {
- Collection<LoanInstallmentDelinquencyTagData>
installmentDelinquencyTags = delinquencyReadPlatformService
-
.retrieveLoanInstallmentsCurrentDelinquencyTag(loan.getId());
- if (installmentDelinquencyTags != null &&
installmentDelinquencyTags.size() > 0) {
- // group installments that are in same range
- Map<Long, List<LoanInstallmentDelinquencyTagData>>
installmentsInSameRange = installmentDelinquencyTags.stream().collect(
- Collectors.groupingBy(installmentDelnquencyTags ->
installmentDelnquencyTags.getDelinquencyRange().getId()));
- // for installments in each range, get details from loan
repayment schedule installment, add amounts,
- // list charges
- for (Map.Entry<Long, List<LoanInstallmentDelinquencyTagData>>
installmentDelinquencyTagData : installmentsInSameRange
- .entrySet()) {
- // get installments details
- List<LoanRepaymentScheduleInstallment>
delinquentInstallmentsInSameRange = loan.getRepaymentScheduleInstallments()
- .stream().filter(installment ->
installmentDelinquencyTagData.getValue().stream()
- .anyMatch(installmentTag ->
installmentTag.getId().equals(installment.getId())))
- .toList();
- // add amounts
- LoanAmountDataV1 amount = LoanAmountDataV1.newBuilder()//
-
.setPrincipalAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getPrincipalOutstanding(loan.getCurrency()).getAmount())
- .reduce(BigDecimal.ZERO,
BigDecimal::add))//
-
.setFeeAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getFeeChargesOutstanding(loan.getCurrency()).getAmount())
- .reduce(BigDecimal.ZERO,
BigDecimal::add))//
-
.setInterestAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getInterestOutstanding(loan.getCurrency()).getAmount())
- .reduce(BigDecimal.ZERO,
BigDecimal::add))//
-
.setPenaltyAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getPenaltyChargesOutstanding(loan.getCurrency()).getAmount())
- .reduce(BigDecimal.ZERO,
BigDecimal::add))//
-
.setTotalAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getTotalOutstanding(loan.getCurrency()).getAmount())
- .reduce(BigDecimal.ZERO,
BigDecimal::add))//
- .build();
-
- // get list of charges for installments in same range
- List<LoanCharge> chargesForInstallmentsInSameRange =
loan.getLoanCharges().stream().filter(loanCharge -> !loanCharge
- .isPaid()
- &&
delinquentInstallmentsInSameRange.stream().anyMatch(installmentForCharge ->
(DateUtils
- .isAfter(loanCharge.getEffectiveDueDate(),
installmentForCharge.getFromDate())
- ||
DateUtils.isEqual(loanCharge.getEffectiveDueDate(),
installmentForCharge.getFromDate()))
- &&
(DateUtils.isBefore(loanCharge.getEffectiveDueDate(),
installmentForCharge.getDueDate())
- ||
DateUtils.isEqual(loanCharge.getEffectiveDueDate(),
installmentForCharge.getDueDate()))))
- .toList();
-
- List<LoanChargeDataRangeViewV1> charges = new
ArrayList<>();
- for (LoanCharge charge :
chargesForInstallmentsInSameRange) {
- LoanChargeDataRangeViewV1 chargeData =
LoanChargeDataRangeViewV1.newBuilder().setId(charge.getId())
-
.setName(charge.name()).setAmount(charge.amountOutstanding())
-
.setCurrency(currencyMapper.map(data.getCurrency())).build();
- charges.add(chargeData);
- }
-
-
LoanInstallmentDelinquencyTagData.InstallmentDelinquencyRange delinquencyRange
= installmentDelinquencyTagData
- .getValue().get(0).getDelinquencyRange();
-
- DelinquencyRangeDataV1 delinquencyRangeDataV1 =
DelinquencyRangeDataV1.newBuilder().setId(delinquencyRange.getId())
-
.setClassification(delinquencyRange.getClassification()).setMinimumAgeDays(delinquencyRange.getMinimumAgeDays())
-
.setMaximumAgeDays(delinquencyRange.getMaximumAgeDays()).build();
-
- LoanInstallmentDelinquencyBucketDataV1
installmentDelinquencyBucketDataV1 = LoanInstallmentDelinquencyBucketDataV1
-
.newBuilder().setDelinquencyRange(delinquencyRangeDataV1).setAmount(amount).setCharges(charges)
-
.setCurrency(currencyMapper.map(data.getCurrency())).build();
-
-
loanInstallmentDelinquencyData.add(installmentDelinquencyBucketDataV1);
- }
- }
- }
- return loanInstallmentDelinquencyData;
- }
-
private BigDecimal calculateDataSummary(Loan loan, BiFunction<Loan,
LoanRepaymentScheduleInstallment, BigDecimal> mapper) {
return
loan.getRepaymentScheduleInstallments().stream().map(installment ->
mapper.apply(loan, installment)).reduce(BigDecimal.ZERO,
BigDecimal::add);
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/LoanInstallmentLevelDelinquencyEventProducer.java
similarity index 53%
copy from
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanDelinquencyRangeChangeBusinessEventSerializer.java
copy to
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanInstallmentLevelDelinquencyEventProducer.java
index 22a606c0a..59d41753a 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/LoanInstallmentLevelDelinquencyEventProducer.java
@@ -23,103 +23,30 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import java.util.function.BiFunction;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
-import org.apache.avro.generic.GenericContainer;
-import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.avro.loan.v1.DelinquencyRangeDataV1;
-import org.apache.fineract.avro.loan.v1.LoanAccountDelinquencyRangeDataV1;
import org.apache.fineract.avro.loan.v1.LoanAmountDataV1;
import org.apache.fineract.avro.loan.v1.LoanChargeDataRangeViewV1;
import org.apache.fineract.avro.loan.v1.LoanInstallmentDelinquencyBucketDataV1;
import org.apache.fineract.infrastructure.core.service.DateUtils;
-import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
-import
org.apache.fineract.infrastructure.event.business.domain.loan.LoanDelinquencyRangeChangeBusinessEvent;
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.BusinessEventSerializer;
-import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
+import org.apache.fineract.organisation.monetary.data.CurrencyData;
import
org.apache.fineract.portfolio.delinquency.data.LoanInstallmentDelinquencyTagData;
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;
import
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
-import
org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService;
-import
org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
-@Order(Ordered.LOWEST_PRECEDENCE - 1)
-public class LoanDelinquencyRangeChangeBusinessEventSerializer implements
BusinessEventSerializer {
-
- private final LoanReadPlatformService service;
-
- private final LoanDelinquencyRangeDataMapper mapper;
-
- private final LoanChargeReadPlatformService loanChargeReadPlatformService;
+public class LoanInstallmentLevelDelinquencyEventProducer {
private final DelinquencyReadPlatformService
delinquencyReadPlatformService;
-
- private final LoanChargeDataMapper chargeMapper;
-
private final CurrencyDataMapper currencyMapper;
- private final AvroDateTimeMapper dataTimeMapper;
-
- @Override
- public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
- LoanDelinquencyRangeChangeBusinessEvent event =
(LoanDelinquencyRangeChangeBusinessEvent) rawEvent;
- LoanAccountData data = service.retrieveOne(event.get().getId());
- Long id = data.getId();
- 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<LoanChargeDataRangeViewV1> charges =
loanChargeReadPlatformService.retrieveLoanCharges(id)//
- .stream()//
- .map(chargeMapper::mapRangeView)//
- .toList();
- LoanAmountDataV1 amount = LoanAmountDataV1.newBuilder()//
- .setPrincipalAmount(calculateDataSummary(event.get(),
- (loan, installment) ->
installment.getPrincipalOutstanding(loanCurrency).getAmount()))//
- .setFeeAmount(calculateDataSummary(event.get(),
- (loan, installment) ->
installment.getFeeChargesOutstanding(loanCurrency).getAmount()))//
- .setInterestAmount(calculateDataSummary(event.get(),
- (loan, installment) ->
installment.getInterestOutstanding(loanCurrency).getAmount()))//
- .setPenaltyAmount(calculateDataSummary(event.get(),
- (loan, installment) ->
installment.getPenaltyChargesOutstanding(loanCurrency).getAmount()))//
- .setTotalAmount(
- calculateDataSummary(event.get(), (loan, installment)
-> installment.getTotalOutstanding(loanCurrency).getAmount()))//
- .build();
-
- DelinquencyRangeDataV1 delinquencyRange =
mapper.map(data.getDelinquencyRange());
-
- List<LoanInstallmentDelinquencyBucketDataV1>
installmentsDelinquencyData =
calculateInstallmentLevelDelinquencyData(event.get(),
- data);
- LoanAccountDelinquencyRangeDataV1.Builder builder =
LoanAccountDelinquencyRangeDataV1.newBuilder();
- return builder//
- .setLoanId(id)//
- .setLoanAccountNo(accountNumber)//
- .setLoanExternalId(externalId)//
- .setDelinquencyRange(delinquencyRange)//
- .setCharges(charges)//
- .setAmount(amount)//
- .setCurrency(currencyMapper.map(data.getCurrency()))//
- .setDelinquentDate(delinquentDate)//
-
.setInstallmentDelinquencyBuckets(installmentsDelinquencyData).build();
- }
-
- private List<LoanInstallmentDelinquencyBucketDataV1>
calculateInstallmentLevelDelinquencyData(Loan loan, LoanAccountData data) {
+ public List<LoanInstallmentDelinquencyBucketDataV1>
calculateInstallmentLevelDelinquencyData(Loan loan, CurrencyData currency) {
List<LoanInstallmentDelinquencyBucketDataV1>
loanInstallmentDelinquencyData = new ArrayList<>();
if (loan.isEnableInstallmentLevelDelinquency()) {
Collection<LoanInstallmentDelinquencyTagData>
installmentDelinquencyTags = delinquencyReadPlatformService
@@ -140,19 +67,19 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
// add amounts
LoanAmountDataV1 amount = LoanAmountDataV1.newBuilder()//
.setPrincipalAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getPrincipalOutstanding(loan.getCurrency()).getAmount())
+ .map(installment ->
installment.getPrincipalOutstanding(loan.getCurrency()).getAmount())
.reduce(BigDecimal.ZERO,
BigDecimal::add))//
.setFeeAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getFeeChargesOutstanding(loan.getCurrency()).getAmount())
+ .map(installment ->
installment.getFeeChargesOutstanding(loan.getCurrency()).getAmount())
.reduce(BigDecimal.ZERO,
BigDecimal::add))//
.setInterestAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getInterestOutstanding(loan.getCurrency()).getAmount())
+ .map(installment ->
installment.getInterestOutstanding(loan.getCurrency()).getAmount())
.reduce(BigDecimal.ZERO,
BigDecimal::add))//
.setPenaltyAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getPenaltyChargesOutstanding(loan.getCurrency()).getAmount())
+ .map(installment ->
installment.getPenaltyChargesOutstanding(loan.getCurrency()).getAmount())
.reduce(BigDecimal.ZERO,
BigDecimal::add))//
.setTotalAmount(delinquentInstallmentsInSameRange.stream()
- .map(instlment ->
instlment.getTotalOutstanding(loan.getCurrency()).getAmount())
+ .map(installment ->
installment.getTotalOutstanding(loan.getCurrency()).getAmount())
.reduce(BigDecimal.ZERO,
BigDecimal::add))//
.build();
@@ -169,8 +96,8 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
List<LoanChargeDataRangeViewV1> charges = new
ArrayList<>();
for (LoanCharge charge :
chargesForInstallmentsInSameRange) {
LoanChargeDataRangeViewV1 chargeData =
LoanChargeDataRangeViewV1.newBuilder().setId(charge.getId())
-
.setName(charge.name()).setAmount(charge.amountOutstanding())
-
.setCurrency(currencyMapper.map(data.getCurrency())).build();
+
.setName(charge.name()).setAmount(charge.amountOutstanding()).setCurrency(currencyMapper.map(currency))
+ .build();
charges.add(chargeData);
}
@@ -183,7 +110,7 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
LoanInstallmentDelinquencyBucketDataV1
installmentDelinquencyBucketDataV1 = LoanInstallmentDelinquencyBucketDataV1
.newBuilder().setDelinquencyRange(delinquencyRangeDataV1).setAmount(amount).setCharges(charges)
-
.setCurrency(currencyMapper.map(data.getCurrency())).build();
+ .setCurrency(currencyMapper.map(currency)).build();
loanInstallmentDelinquencyData.add(installmentDelinquencyBucketDataV1);
}
@@ -191,20 +118,4 @@ public class
LoanDelinquencyRangeChangeBusinessEventSerializer implements Busine
}
return loanInstallmentDelinquencyData;
}
-
- private BigDecimal calculateDataSummary(Loan loan, BiFunction<Loan,
LoanRepaymentScheduleInstallment, BigDecimal> mapper) {
- return
loan.getRepaymentScheduleInstallments().stream().map(installment ->
mapper.apply(loan, installment)).reduce(BigDecimal.ZERO,
- BigDecimal::add);
-
- }
-
- @Override
- public <T> boolean canSerialize(BusinessEvent<T> event) {
- return event instanceof LoanDelinquencyRangeChangeBusinessEvent;
- }
-
- @Override
- public Class<? extends GenericContainer> getSupportedSchema() {
- return LoanAccountDelinquencyRangeDataV1.class;
- }
}
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 22a9aa378..62d8f49e2 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
@@ -116,7 +116,8 @@ public class LoanAccountDelinquencyRangeEventSerializerTest
{
// given
LoanDelinquencyRangeChangeBusinessEventSerializer serializer = new
LoanDelinquencyRangeChangeBusinessEventSerializer(
loanReadPlatformService, new
LoanDelinquencyRangeDataMapperImpl(), loanChargeReadPlatformService,
- delinquencyReadPlatformService, new
LoanChargeDataMapperImpl(null, null, null), new CurrencyDataMapperImpl(),
mapper);
+ delinquencyReadPlatformService, new
LoanChargeDataMapperImpl(null, null, null), new CurrencyDataMapperImpl(),
mapper,
+ new
LoanInstallmentLevelDelinquencyEventProducer(delinquencyReadPlatformService,
new CurrencyDataMapperImpl()));
Loan loanForProcessing = Mockito.mock(Loan.class);
LoanAccountData loanAccountData = mock(LoanAccountData.class);
@@ -180,7 +181,8 @@ public class LoanAccountDelinquencyRangeEventSerializerTest
{
// given
LoanDelinquencyRangeChangeBusinessEventSerializer serializer = new
LoanDelinquencyRangeChangeBusinessEventSerializer(
loanReadPlatformService, new
LoanDelinquencyRangeDataMapperImpl(), loanChargeReadPlatformService,
- delinquencyReadPlatformService, new
LoanChargeDataMapperImpl(null, null, null), new CurrencyDataMapperImpl(),
mapper);
+ delinquencyReadPlatformService, new
LoanChargeDataMapperImpl(null, null, null), new CurrencyDataMapperImpl(),
mapper,
+ new
LoanInstallmentLevelDelinquencyEventProducer(delinquencyReadPlatformService,
new CurrencyDataMapperImpl()));
Loan loanForProcessing = Mockito.mock(Loan.class);
LoanAccountData loanAccountData = mock(LoanAccountData.class);