FINERACT-2181: Introduce customData field for Loan and LoanTransaction business events

This commit is contained in:
Oleksii Novikov
2025-02-26 14:27:31 +01:00
committed by Adam Saghy
parent ccf213aefe
commit 2cf99818e6
10 changed files with 412 additions and 9 deletions
@@ -37,6 +37,7 @@ public interface LoanAccountDataMapper {
@Mapping(target = "settlementDate", ignore = true)
@Mapping(target = "purchasePriceRatio", ignore = true)
@Mapping(target = "delinquent.installmentDelinquencyBuckets", ignore = true)
@Mapping(target = "customData", ignore = true)
LoanAccountDataV1 map(LoanAccountData source);
}
@@ -30,5 +30,6 @@ public interface LoanTransactionDataMapper {
// unpaidCharges are calculated and set explicitly based on if needed (only for charge-off transaction yet)
@Mapping(target = "unpaidCharges", ignore = true)
@Mapping(target = "externalOwnerId", ignore = true)
@Mapping(target = "customData", ignore = true)
LoanTransactionDataV1 map(LoanTransactionData source);
}
@@ -18,8 +18,11 @@
*/
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.apache.avro.generic.GenericContainer;
import org.apache.commons.collections4.CollectionUtils;
@@ -30,6 +33,7 @@ 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;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.ExternalEventCustomDataSerializer;
import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants;
import org.apache.fineract.portfolio.loanaccount.data.CollectionData;
@@ -56,6 +60,7 @@ public class LoanBusinessEventSerializer implements BusinessEventSerializer {
private final LoanSummaryBalancesRepository loanSummaryBalancesRepository;
@Lazy
private final LoanSummaryProviderDelegate loanSummaryProviderDelegate;
private final List<ExternalEventCustomDataSerializer<LoanBusinessEvent>> externalEventCustomDataSerializers;
@Override
public <T> boolean canSerialize(BusinessEvent<T> event) {
@@ -98,8 +103,11 @@ public class LoanBusinessEventSerializer implements BusinessEventSerializer {
data.setLoanTermVariations(activeLoanTermVariations.stream().map(LoanTermVariations::toData).toList());
}
LoanAccountDataV1 result = mapper.map(data);
final LoanAccountDataV1 result = mapper.map(data);
result.getDelinquent().setInstallmentDelinquencyBuckets(installmentsDelinquencyData);
result.setCustomData(collectCustomData(event));
return result;
}
@@ -107,4 +115,10 @@ public class LoanBusinessEventSerializer implements BusinessEventSerializer {
public Class<? extends GenericContainer> getSupportedSchema() {
return LoanAccountDataV1.class;
}
private Map<String, ByteBuffer> collectCustomData(final LoanBusinessEvent event) {
return externalEventCustomDataSerializers.stream().collect(Collectors.toMap(ExternalEventCustomDataSerializer::key,
serializer -> serializer.serialize(event), (existing, replacement) -> replacement));
}
}
@@ -19,7 +19,6 @@
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.util.List;
import org.apache.avro.generic.GenericContainer;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
@@ -27,6 +26,7 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.transaction
import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.UnpaidChargeDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.ExternalEventCustomDataSerializer;
import org.apache.fineract.portfolio.loanaccount.data.UnpaidChargeData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadService;
@@ -44,8 +44,9 @@ public class LoanChargeOffBusinessEventSerializer extends LoanTransactionBusines
public LoanChargeOffBusinessEventSerializer(LoanReadPlatformService loanReadPlatformService,
LoanTransactionDataMapper loanTransactionMapper, LoanChargePaidByReadService loanChargePaidByReadService,
UnpaidChargeDataMapper unpaidChargeDataMapper, LoanTransactionRepository loanTransactionRepository) {
super(loanReadPlatformService, loanTransactionMapper, loanChargePaidByReadService);
UnpaidChargeDataMapper unpaidChargeDataMapper, LoanTransactionRepository loanTransactionRepository,
List<ExternalEventCustomDataSerializer<LoanTransactionBusinessEvent>> externalEventCustomDataSerializers) {
super(loanReadPlatformService, loanTransactionMapper, loanChargePaidByReadService, externalEventCustomDataSerializers);
this.unpaidChargeDataMapper = unpaidChargeDataMapper;
this.loanTransactionRepository = loanTransactionRepository;
}
@@ -61,11 +62,8 @@ public class LoanChargeOffBusinessEventSerializer extends LoanTransactionBusines
LoanTransactionBusinessEvent event = (LoanTransactionBusinessEvent) rawEvent;
List<UnpaidChargeData> unpaidChargeDataList = loanTransactionRepository.fetchTotalUnpaidChargesForLoan(event.get().getLoan());
transactionDataV1.setUnpaidCharges(unpaidChargeDataMapper.map(unpaidChargeDataList));
transactionDataV1.setCustomData(collectCustomData(event));
return transactionDataV1;
}
@Override
public Class<? extends GenericContainer> getSupportedSchema() {
return LoanTransactionDataV1.class;
}
}
@@ -18,6 +18,10 @@
*/
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.apache.avro.generic.GenericContainer;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
@@ -26,6 +30,7 @@ import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.ExternalEventCustomDataSerializer;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadService;
import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
@@ -38,6 +43,7 @@ public class LoanTransactionBusinessEventSerializer implements BusinessEventSeri
private final LoanReadPlatformService service;
private final LoanTransactionDataMapper loanTransactionMapper;
private final LoanChargePaidByReadService loanChargePaidByReadService;
private final List<ExternalEventCustomDataSerializer<LoanTransactionBusinessEvent>> externalEventCustomDataSerializers;
@Override
public <T> boolean canSerialize(BusinessEvent<T> event) {
@@ -51,11 +57,21 @@ public class LoanTransactionBusinessEventSerializer implements BusinessEventSeri
Long loanTransactionId = event.get().getId();
LoanTransactionData transactionData = service.retrieveLoanTransaction(loanId, loanTransactionId);
transactionData.setLoanChargePaidByList(loanChargePaidByReadService.fetchLoanChargesPaidByDataTransactionId(loanTransactionId));
return loanTransactionMapper.map(transactionData);
final LoanTransactionDataV1 result = loanTransactionMapper.map(transactionData);
result.setCustomData(collectCustomData(event));
return result;
}
@Override
public Class<? extends GenericContainer> getSupportedSchema() {
return LoanTransactionDataV1.class;
}
protected Map<String, ByteBuffer> collectCustomData(final LoanTransactionBusinessEvent event) {
return externalEventCustomDataSerializers.stream().collect(Collectors.toMap(ExternalEventCustomDataSerializer::key,
serializer -> serializer.serialize(event), (existing, replacement) -> replacement));
}
}