Skip to content

Commit f8fab37

Browse files
committed
FINERACT-2421: the loan originator information is missing in LoanAdjustTransactionBusinessEvent and LoanAccrualTransactionCreatedBusinessEvent
1 parent 7f3d40d commit f8fab37

12 files changed

Lines changed: 931 additions & 175 deletions

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/enricher/LoanAccountDataV1OriginatorEnricher.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
*/
1919
package org.apache.fineract.portfolio.loanorigination.enricher;
2020

21-
import java.util.ArrayList;
2221
import java.util.List;
2322
import lombok.RequiredArgsConstructor;
2423
import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
2524
import org.apache.fineract.avro.loan.v1.OriginatorDetailsV1;
2625
import org.apache.fineract.infrastructure.core.service.DataEnricher;
27-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
28-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMapping;
29-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMappingRepository;
26+
import org.apache.fineract.portfolio.loanorigination.helper.LoanOriginatorDetailsResolver;
3027
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3128
import org.springframework.stereotype.Component;
3229

@@ -35,8 +32,7 @@
3532
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
3633
public class LoanAccountDataV1OriginatorEnricher implements DataEnricher<LoanAccountDataV1> {
3734

38-
private final LoanOriginatorMappingRepository loanOriginatorMappingRepository;
39-
private final LoanOriginatorAvroMapper loanOriginatorAvroMapper;
35+
private final LoanOriginatorDetailsResolver loanOriginatorDetailsResolver;
4036

4137
@Override
4238
public boolean isDataTypeSupported(final Class<LoanAccountDataV1> dataType) {
@@ -49,22 +45,7 @@ public void enrich(final LoanAccountDataV1 data) {
4945
return;
5046
}
5147

52-
final List<LoanOriginatorMapping> mappings = loanOriginatorMappingRepository.findByLoanIdWithOriginatorDetails(data.getId());
53-
if (mappings == null || mappings.isEmpty()) {
54-
return;
55-
}
56-
57-
final List<OriginatorDetailsV1> originators = new ArrayList<>();
58-
for (LoanOriginatorMapping mapping : mappings) {
59-
final LoanOriginator originator = mapping.getOriginator();
60-
if (originator != null) {
61-
final OriginatorDetailsV1 originatorDetails = loanOriginatorAvroMapper.toAvro(originator);
62-
if (originatorDetails != null) {
63-
originators.add(originatorDetails);
64-
}
65-
}
66-
}
67-
48+
final List<OriginatorDetailsV1> originators = loanOriginatorDetailsResolver.resolveOriginatorDetails(data.getId());
6849
if (!originators.isEmpty()) {
6950
data.setOriginators(originators);
7051
}

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/enricher/LoanChargeDataV1OriginatorEnricher.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
*/
1919
package org.apache.fineract.portfolio.loanorigination.enricher;
2020

21-
import java.util.ArrayList;
2221
import java.util.List;
2322
import lombok.RequiredArgsConstructor;
2423
import org.apache.fineract.avro.loan.v1.LoanChargeDataV1;
2524
import org.apache.fineract.avro.loan.v1.OriginatorDetailsV1;
2625
import org.apache.fineract.infrastructure.core.service.DataEnricher;
27-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
28-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMapping;
29-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMappingRepository;
26+
import org.apache.fineract.portfolio.loanorigination.helper.LoanOriginatorDetailsResolver;
3027
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3128
import org.springframework.stereotype.Component;
3229

@@ -35,8 +32,7 @@
3532
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
3633
public class LoanChargeDataV1OriginatorEnricher implements DataEnricher<LoanChargeDataV1> {
3734

38-
private final LoanOriginatorMappingRepository loanOriginatorMappingRepository;
39-
private final LoanOriginatorAvroMapper loanOriginatorAvroMapper;
35+
private final LoanOriginatorDetailsResolver loanOriginatorDetailsResolver;
4036

4137
@Override
4238
public boolean isDataTypeSupported(final Class<LoanChargeDataV1> dataType) {
@@ -49,22 +45,7 @@ public void enrich(final LoanChargeDataV1 data) {
4945
return;
5046
}
5147

52-
final List<LoanOriginatorMapping> mappings = loanOriginatorMappingRepository.findByLoanIdWithOriginatorDetails(data.getLoanId());
53-
if (mappings == null || mappings.isEmpty()) {
54-
return;
55-
}
56-
57-
final List<OriginatorDetailsV1> originators = new ArrayList<>();
58-
for (LoanOriginatorMapping mapping : mappings) {
59-
final LoanOriginator originator = mapping.getOriginator();
60-
if (originator != null) {
61-
final OriginatorDetailsV1 originatorDetails = loanOriginatorAvroMapper.toAvro(originator);
62-
if (originatorDetails != null) {
63-
originators.add(originatorDetails);
64-
}
65-
}
66-
}
67-
48+
final List<OriginatorDetailsV1> originators = loanOriginatorDetailsResolver.resolveOriginatorDetails(data.getLoanId());
6849
if (!originators.isEmpty()) {
6950
data.setOriginators(originators);
7051
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.portfolio.loanorigination.enricher;
20+
21+
import java.util.List;
22+
import lombok.RequiredArgsConstructor;
23+
import org.apache.fineract.avro.loan.v1.LoanTransactionAdjustmentDataV1;
24+
import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1;
25+
import org.apache.fineract.avro.loan.v1.OriginatorDetailsV1;
26+
import org.apache.fineract.infrastructure.core.service.DataEnricher;
27+
import org.apache.fineract.portfolio.loanorigination.helper.LoanOriginatorDetailsResolver;
28+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
29+
import org.springframework.stereotype.Component;
30+
31+
@Component
32+
@RequiredArgsConstructor
33+
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
34+
public class LoanTransactionAdjustmentDataV1OriginatorEnricher implements DataEnricher<LoanTransactionAdjustmentDataV1> {
35+
36+
private final LoanOriginatorDetailsResolver loanOriginatorDetailsResolver;
37+
38+
@Override
39+
public boolean isDataTypeSupported(final Class<LoanTransactionAdjustmentDataV1> dataType) {
40+
return dataType.isAssignableFrom(LoanTransactionAdjustmentDataV1.class);
41+
}
42+
43+
@Override
44+
public void enrich(final LoanTransactionAdjustmentDataV1 data) {
45+
final LoanTransactionDataV1 transactionToAdjust = data.getTransactionToAdjust();
46+
if (transactionToAdjust == null || transactionToAdjust.getLoanId() == null) {
47+
return;
48+
}
49+
50+
final List<OriginatorDetailsV1> originators = loanOriginatorDetailsResolver
51+
.resolveOriginatorDetails(transactionToAdjust.getLoanId());
52+
if (!originators.isEmpty()) {
53+
transactionToAdjust.setOriginators(originators);
54+
if (data.getNewTransactionDetail() != null) {
55+
data.getNewTransactionDetail().setOriginators(originators);
56+
}
57+
}
58+
}
59+
}

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/enricher/LoanTransactionDataV1OriginatorEnricher.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
*/
1919
package org.apache.fineract.portfolio.loanorigination.enricher;
2020

21-
import java.util.ArrayList;
2221
import java.util.List;
2322
import lombok.RequiredArgsConstructor;
2423
import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1;
2524
import org.apache.fineract.avro.loan.v1.OriginatorDetailsV1;
2625
import org.apache.fineract.infrastructure.core.service.DataEnricher;
27-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
28-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMapping;
29-
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMappingRepository;
26+
import org.apache.fineract.portfolio.loanorigination.helper.LoanOriginatorDetailsResolver;
3027
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3128
import org.springframework.stereotype.Component;
3229

@@ -35,8 +32,7 @@
3532
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
3633
public class LoanTransactionDataV1OriginatorEnricher implements DataEnricher<LoanTransactionDataV1> {
3734

38-
private final LoanOriginatorMappingRepository loanOriginatorMappingRepository;
39-
private final LoanOriginatorAvroMapper loanOriginatorAvroMapper;
35+
private final LoanOriginatorDetailsResolver loanOriginatorDetailsResolver;
4036

4137
@Override
4238
public boolean isDataTypeSupported(final Class<LoanTransactionDataV1> dataType) {
@@ -49,22 +45,7 @@ public void enrich(final LoanTransactionDataV1 data) {
4945
return;
5046
}
5147

52-
final List<LoanOriginatorMapping> mappings = loanOriginatorMappingRepository.findByLoanIdWithOriginatorDetails(data.getLoanId());
53-
if (mappings == null || mappings.isEmpty()) {
54-
return;
55-
}
56-
57-
final List<OriginatorDetailsV1> originators = new ArrayList<>();
58-
for (LoanOriginatorMapping mapping : mappings) {
59-
final LoanOriginator originator = mapping.getOriginator();
60-
if (originator != null) {
61-
final OriginatorDetailsV1 originatorDetails = loanOriginatorAvroMapper.toAvro(originator);
62-
if (originatorDetails != null) {
63-
originators.add(originatorDetails);
64-
}
65-
}
66-
}
67-
48+
final List<OriginatorDetailsV1> originators = loanOriginatorDetailsResolver.resolveOriginatorDetails(data.getLoanId());
6849
if (!originators.isEmpty()) {
6950
data.setOriginators(originators);
7051
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.portfolio.loanorigination.helper;
20+
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import lombok.RequiredArgsConstructor;
24+
import org.apache.fineract.avro.loan.v1.OriginatorDetailsV1;
25+
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
26+
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMapping;
27+
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMappingRepository;
28+
import org.apache.fineract.portfolio.loanorigination.enricher.LoanOriginatorAvroMapper;
29+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
30+
import org.springframework.stereotype.Component;
31+
32+
/**
33+
* Resolves originator details for a given loan by fetching originator mappings and converting them to Avro format.
34+
*/
35+
@Component
36+
@RequiredArgsConstructor
37+
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
38+
public class LoanOriginatorDetailsResolver {
39+
40+
private final LoanOriginatorMappingRepository loanOriginatorMappingRepository;
41+
private final LoanOriginatorAvroMapper loanOriginatorAvroMapper;
42+
43+
/**
44+
* Fetches originator mappings for the given loan ID and converts them to a list of {@link OriginatorDetailsV1}.
45+
*
46+
* @param loanId
47+
* the loan ID to resolve originators for
48+
* @return the list of originator details, or an empty list if none are found
49+
*/
50+
public List<OriginatorDetailsV1> resolveOriginatorDetails(final Long loanId) {
51+
final List<LoanOriginatorMapping> mappings = loanOriginatorMappingRepository.findByLoanIdWithOriginatorDetails(loanId);
52+
if (mappings == null || mappings.isEmpty()) {
53+
return List.of();
54+
}
55+
56+
final List<OriginatorDetailsV1> originators = new ArrayList<>();
57+
for (LoanOriginatorMapping mapping : mappings) {
58+
final LoanOriginator originator = mapping.getOriginator();
59+
if (originator != null) {
60+
final OriginatorDetailsV1 originatorDetails = loanOriginatorAvroMapper.toAvro(originator);
61+
if (originatorDetails != null) {
62+
originators.add(originatorDetails);
63+
}
64+
}
65+
}
66+
67+
return List.copyOf(originators);
68+
}
69+
}

0 commit comments

Comments
 (0)