FINERACT-2181: Add customData field to LoanAdjustTransactionBusinessEvent

This commit is contained in:
Jose Alberto Hernandez
2025-04-15 15:15:21 +02:00
committed by Adam Saghy
parent 2143d35e29
commit 8ce76e1ad6
3 changed files with 70 additions and 4 deletions
@@ -18,6 +18,17 @@
"null", "null",
"org.apache.fineract.avro.loan.v1.LoanTransactionDataV1" "org.apache.fineract.avro.loan.v1.LoanTransactionDataV1"
] ]
},
{
"default": null,
"name": "customData",
"type": [
"null",
{
"values": "bytes",
"type": "map"
}
]
} }
] ]
} }
@@ -18,6 +18,7 @@
*/ */
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan; package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.avro.generic.GenericContainer; import org.apache.avro.generic.GenericContainer;
import org.apache.fineract.avro.generator.ByteBufferSerializable; import org.apache.fineract.avro.generator.ByteBufferSerializable;
@@ -26,7 +27,8 @@ import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper; 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.AbstractBusinessEventWithCustomDataSerializer;
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.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadService;
@@ -35,11 +37,13 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanAdjustTransactionBusinessEventSerializer implements BusinessEventSerializer { public class LoanAdjustTransactionBusinessEventSerializer
extends AbstractBusinessEventWithCustomDataSerializer<LoanAdjustTransactionBusinessEvent> {
private final LoanReadPlatformService service; private final LoanReadPlatformService service;
private final LoanTransactionDataMapper mapper; private final LoanTransactionDataMapper mapper;
private final LoanChargePaidByReadService loanChargePaidByReadService; private final LoanChargePaidByReadService loanChargePaidByReadService;
private final List<ExternalEventCustomDataSerializer<LoanAdjustTransactionBusinessEvent>> externalEventCustomDataSerializers;
@Override @Override
public <T> boolean canSerialize(BusinessEvent<T> event) { public <T> boolean canSerialize(BusinessEvent<T> event) {
@@ -66,11 +70,16 @@ public class LoanAdjustTransactionBusinessEventSerializer implements BusinessEve
newTransactionDetailAvroDto = mapper.map(newTransactionDetailData); newTransactionDetailAvroDto = mapper.map(newTransactionDetailData);
} }
return new LoanTransactionAdjustmentDataV1(transactionToAdjustAvroDto, newTransactionDetailAvroDto); return new LoanTransactionAdjustmentDataV1(transactionToAdjustAvroDto, newTransactionDetailAvroDto, collectCustomData(event));
} }
@Override @Override
public Class<? extends GenericContainer> getSupportedSchema() { public Class<? extends GenericContainer> getSupportedSchema() {
return LoanTransactionAdjustmentDataV1.class; return LoanTransactionAdjustmentDataV1.class;
} }
@Override
protected List<ExternalEventCustomDataSerializer<LoanAdjustTransactionBusinessEvent>> getExternalEventCustomDataSerializers() {
return externalEventCustomDataSerializers;
}
} }
@@ -19,17 +19,21 @@
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan; package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.fineract.avro.loan.v1.LoanTransactionAdjustmentDataV1; import org.apache.fineract.avro.loan.v1.LoanTransactionAdjustmentDataV1;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
@@ -41,6 +45,7 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustT
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapperImpl; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapperImpl;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.ExternalIdMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.ExternalIdMapper;
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.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
@@ -87,8 +92,44 @@ public class LoanAdjustTransactionBusinessEventSerializerTest {
@Test @Test
void loanTransactionReversedOnDateSerializationTest() { void loanTransactionReversedOnDateSerializationTest() {
Loan loanForProcessing = Mockito.mock(Loan.class); Loan loanForProcessing = Mockito.mock(Loan.class);
final List<ExternalEventCustomDataSerializer<LoanAdjustTransactionBusinessEvent>> externalEventCustomDataSerializers = List
.of(new ExternalEventCustomDataSerializer<>() {
@Override
public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) {
return ByteBuffer.wrap("test_data_for_loan_adjust_transaction".getBytes(UTF_8));
}
@Override
public String key() {
return "test_key_1";
}
}, new ExternalEventCustomDataSerializer<>() {
@Override
public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) {
return ByteBuffer.wrap("test_data_for_loan_adjust_transaction_1".getBytes(UTF_8));
}
@Override
public String key() {
return "test_key_1";
}
}, new ExternalEventCustomDataSerializer<>() {
@Override
public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) {
return ByteBuffer.wrap("test_data_for_loan_adjust_transaction_2".getBytes(UTF_8));
}
@Override
public String key() {
return "test_key_2";
}
});
LoanAdjustTransactionBusinessEventSerializer serializer = new LoanAdjustTransactionBusinessEventSerializer(service, LoanAdjustTransactionBusinessEventSerializer serializer = new LoanAdjustTransactionBusinessEventSerializer(service,
new LoanTransactionDataMapperImpl(avroDateTimeMapper, externalIdMapper), loanChargePaidByReadService); new LoanTransactionDataMapperImpl(avroDateTimeMapper, externalIdMapper), loanChargePaidByReadService,
externalEventCustomDataSerializers);
LoanTransaction transactionToAdjust = Mockito.mock(LoanTransaction.class); LoanTransaction transactionToAdjust = Mockito.mock(LoanTransaction.class);
LoanAdjustTransactionBusinessEvent.Data loanAdjustTransactionBusinessEventData = new LoanAdjustTransactionBusinessEvent.Data( LoanAdjustTransactionBusinessEvent.Data loanAdjustTransactionBusinessEventData = new LoanAdjustTransactionBusinessEvent.Data(
transactionToAdjust); transactionToAdjust);
@@ -112,5 +153,10 @@ public class LoanAdjustTransactionBusinessEventSerializerTest {
LoanTransactionAdjustmentDataV1 loanTransactionAdjustmentDataV1 = (LoanTransactionAdjustmentDataV1) serializer LoanTransactionAdjustmentDataV1 loanTransactionAdjustmentDataV1 = (LoanTransactionAdjustmentDataV1) serializer
.toAvroDTO(businessEvent); .toAvroDTO(businessEvent);
assertEquals(reversedLocalDate, loanTransactionAdjustmentDataV1.getTransactionToAdjust().getReversedOnDate()); assertEquals(reversedLocalDate, loanTransactionAdjustmentDataV1.getTransactionToAdjust().getReversedOnDate());
assertNotNull(loanTransactionAdjustmentDataV1.getCustomData());
final Map<String, ByteBuffer> customData = loanTransactionAdjustmentDataV1.getCustomData();
assertEquals("test_data_for_loan_adjust_transaction_1", new String(customData.get("test_key_1").array(), UTF_8));
assertEquals("test_data_for_loan_adjust_transaction_2", new String(customData.get("test_key_2").array(), UTF_8));
} }
} }