Skip to content

Commit 28f63cc

Browse files
Jose Alberto Hernandezadamsaghy
authored andcommitted
FINERACT-2418: Loan Originator data with codevalues
1 parent 99861ce commit 28f63cc

File tree

10 files changed

+145
-7
lines changed

10 files changed

+145
-7
lines changed

fineract-core/src/main/java/org/apache/fineract/portfolio/loanorigination/data/LoanOriginatorData.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import lombok.Builder;
2525
import lombok.Data;
2626
import lombok.NoArgsConstructor;
27+
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
2728

2829
@Data
2930
@Builder
@@ -38,6 +39,6 @@ public class LoanOriginatorData implements Serializable {
3839
private String externalId;
3940
private String name;
4041
private String status;
41-
private Long originatorTypeId;
42-
private Long channelTypeId;
42+
private CodeValueData originatorType;
43+
private CodeValueData channelType;
4344
}

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/api/LoanOriginatorApiResource.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
4444
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
4545
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
46+
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorTemplateData;
4647
import org.apache.fineract.portfolio.loanorigination.service.LoanOriginatorReadPlatformService;
4748
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4849
import org.springframework.stereotype.Component;
@@ -83,6 +84,19 @@ public List<LoanOriginatorData> retrieveAll() {
8384
return this.loanOriginatorReadPlatformService.retrieveAll();
8485
}
8586

87+
@GET
88+
@Path("template")
89+
@Consumes({ MediaType.APPLICATION_JSON })
90+
@Produces({ MediaType.APPLICATION_JSON })
91+
@Operation(summary = "Get loan originator template data", description = "Retrieves the Loan Originator template data")
92+
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = LoanOriginatorApiResourceSwagger.GetLoanOriginatorTemplateResponse.class)))
93+
@ApiResponse(responseCode = "403", description = "Insufficient permissions")
94+
public LoanOriginatorTemplateData retrieveLoanOriginatorTemplate() {
95+
this.context.authenticatedUser().validateHasReadPermission(LoanOriginatorApiConstants.RESOURCE_NAME);
96+
97+
return this.loanOriginatorReadPlatformService.retrieveTemplate();
98+
}
99+
86100
@GET
87101
@Path("{originatorId}")
88102
@Consumes({ MediaType.APPLICATION_JSON })

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/api/LoanOriginatorApiResourceSwagger.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
package org.apache.fineract.portfolio.loanorigination.api;
2020

2121
import io.swagger.v3.oas.annotations.media.Schema;
22+
import java.util.List;
23+
import java.util.Set;
24+
import org.apache.fineract.infrastructure.codes.api.CodeValuesApiResourceSwagger.GetCodeValuesDataResponse;
2225

2326
final class LoanOriginatorApiResourceSwagger {
2427

@@ -38,9 +41,21 @@ private GetLoanOriginatorsResponse() {}
3841
@Schema(example = "ACTIVE")
3942
public String status;
4043
@Schema(example = "1")
41-
public Long originatorTypeId;
44+
public GetCodeValuesDataResponse originatorType;
4245
@Schema(example = "1")
43-
public Long channelTypeId;
46+
public GetCodeValuesDataResponse channelType;
47+
}
48+
49+
@Schema(description = "GetLoanOriginatorTemplateResponse")
50+
public static final class GetLoanOriginatorTemplateResponse {
51+
52+
private GetLoanOriginatorTemplateResponse() {}
53+
54+
@Schema(example = "EXT-001")
55+
public String externalId;
56+
public Set<String> statusOptions;
57+
public List<GetCodeValuesDataResponse> originatorTypeOptions;
58+
public List<GetCodeValuesDataResponse> channelTypeOptions;
4459
}
4560

4661
@Schema(description = "PostLoanOriginatorsRequest")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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.data;
20+
21+
import java.util.List;
22+
import java.util.Set;
23+
import lombok.Data;
24+
import lombok.RequiredArgsConstructor;
25+
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
26+
27+
@Data
28+
@RequiredArgsConstructor
29+
public class LoanOriginatorTemplateData {
30+
31+
private final String externalId;
32+
private final Set<String> statusOptions;
33+
private final List<CodeValueData> originatorTypeOptions;
34+
private final List<CodeValueData> channelTypeOptions;
35+
}

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/domain/LoanOriginatorStatus.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
*/
1919
package org.apache.fineract.portfolio.loanorigination.domain;
2020

21+
import java.util.HashSet;
22+
import java.util.Set;
23+
2124
public enum LoanOriginatorStatus {
2225

2326
ACTIVE("ACTIVE"), PENDING("PENDING"), INACTIVE("INACTIVE");
@@ -28,10 +31,22 @@ public enum LoanOriginatorStatus {
2831
this.value = value;
2932
}
3033

34+
private static final Set<String> values = new HashSet<>();
35+
36+
static {
37+
for (final LoanOriginatorStatus type : LoanOriginatorStatus.values()) {
38+
values.add(type.value);
39+
}
40+
}
41+
3142
public String getValue() {
3243
return value;
3344
}
3445

46+
public static Set<String> getAllValues() {
47+
return values;
48+
}
49+
3550
public static LoanOriginatorStatus fromString(String text) {
3651
for (LoanOriginatorStatus status : LoanOriginatorStatus.values()) {
3752
if (status.value.equalsIgnoreCase(text)) {

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/mapper/LoanOriginatorMapper.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,20 @@
1919
package org.apache.fineract.portfolio.loanorigination.mapper;
2020

2121
import java.util.List;
22+
import org.apache.fineract.infrastructure.codes.mapper.CodeValueMapper;
2223
import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
2324
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
2425
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
2526
import org.mapstruct.Mapper;
2627
import org.mapstruct.Mapping;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2829

29-
@Mapper(config = MapstructMapperConfig.class)
30+
@Mapper(config = MapstructMapperConfig.class, uses = { CodeValueMapper.class })
3031
@ConditionalOnProperty(value = "fineract.module.loan-origination.enabled", havingValue = "true")
3132
public interface LoanOriginatorMapper {
3233

33-
@Mapping(target = "originatorTypeId", source = "originatorType.id")
34-
@Mapping(target = "channelTypeId", source = "channelType.id")
34+
@Mapping(target = "originatorType", source = "originatorType")
35+
@Mapping(target = "channelType", source = "channelType")
3536
@Mapping(target = "externalId", source = "externalId")
3637
@Mapping(target = "status", expression = "java(entity.getStatus().getValue())")
3738
LoanOriginatorData toData(LoanOriginator entity);

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/service/LoanOriginatorReadPlatformService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.List;
2222
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
23+
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorTemplateData;
2324

2425
public interface LoanOriginatorReadPlatformService {
2526

@@ -32,4 +33,6 @@ public interface LoanOriginatorReadPlatformService {
3233
Long resolveIdByExternalId(String externalId);
3334

3435
List<LoanOriginatorData> retrieveByLoanId(Long loanId);
36+
37+
LoanOriginatorTemplateData retrieveTemplate();
3538
}

fineract-loan-origination/src/main/java/org/apache/fineract/portfolio/loanorigination/service/LoanOriginatorReadPlatformServiceImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323
import lombok.RequiredArgsConstructor;
24+
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
25+
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepository;
26+
import org.apache.fineract.infrastructure.codes.mapper.CodeValueMapper;
2427
import org.apache.fineract.infrastructure.core.domain.ExternalId;
28+
import org.apache.fineract.portfolio.loanorigination.api.LoanOriginatorApiConstants;
2529
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorData;
30+
import org.apache.fineract.portfolio.loanorigination.data.LoanOriginatorTemplateData;
2631
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginator;
2732
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMapping;
2833
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorMappingRepository;
2934
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorRepository;
35+
import org.apache.fineract.portfolio.loanorigination.domain.LoanOriginatorStatus;
3036
import org.apache.fineract.portfolio.loanorigination.exception.LoanOriginatorNotFoundException;
3137
import org.apache.fineract.portfolio.loanorigination.mapper.LoanOriginatorMapper;
3238
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -42,6 +48,8 @@ public class LoanOriginatorReadPlatformServiceImpl implements LoanOriginatorRead
4248
private final LoanOriginatorRepository loanOriginatorRepository;
4349
private final LoanOriginatorMappingRepository loanOriginatorMappingRepository;
4450
private final LoanOriginatorMapper loanOriginatorMapper;
51+
private final CodeValueRepository codeValueRepository;
52+
private final CodeValueMapper codeValueMapper;
4553

4654
@Override
4755
public List<LoanOriginatorData> retrieveAll() {
@@ -78,4 +86,14 @@ public List<LoanOriginatorData> retrieveByLoanId(final Long loanId) {
7886
}
7987
return mappings.stream().map(LoanOriginatorMapping::getOriginator).map(this.loanOriginatorMapper::toData).toList();
8088
}
89+
90+
@Override
91+
public LoanOriginatorTemplateData retrieveTemplate() {
92+
final List<CodeValueData> originationTypeOptions = codeValueMapper
93+
.map(codeValueRepository.findByCodeName(LoanOriginatorApiConstants.ORIGINATOR_TYPE_CODE_NAME));
94+
final List<CodeValueData> channelTypeOptions = codeValueMapper
95+
.map(codeValueRepository.findByCodeName(LoanOriginatorApiConstants.CHANNEL_TYPE_CODE_NAME));
96+
return new LoanOriginatorTemplateData(ExternalId.generate().getValue(), LoanOriginatorStatus.getAllValues(), originationTypeOptions,
97+
channelTypeOptions);
98+
}
8199
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/helpers/FeignLoanOriginatorHelper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.UUID;
2626
import org.apache.fineract.client.feign.FineractFeignClient;
2727
import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
28+
import org.apache.fineract.client.models.GetLoanOriginatorTemplateResponse;
2829
import org.apache.fineract.client.models.GetLoanOriginatorsResponse;
2930
import org.apache.fineract.client.models.PostLoanOriginatorsRequest;
3031
import org.apache.fineract.client.models.PostLoanOriginatorsResponse;
@@ -133,4 +134,8 @@ public CallFailedRuntimeException detachOriginatorFromLoanExpectingError(Long lo
133134
return null;
134135
});
135136
}
137+
138+
public GetLoanOriginatorTemplateResponse retrieveLoanOriginatorTemplate() {
139+
return ok(() -> fineractClient.loanOriginators().retrieveLoanOriginatorTemplate());
140+
}
136141
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/client/feign/tests/FeignLoanOriginatorApiTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
package org.apache.fineract.integrationtests.client.feign.tests;
2020

2121
import java.util.List;
22+
import lombok.extern.slf4j.Slf4j;
2223
import org.apache.fineract.client.feign.FineractFeignClient;
2324
import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
25+
import org.apache.fineract.client.models.GetCodeValuesDataResponse;
26+
import org.apache.fineract.client.models.GetLoanOriginatorTemplateResponse;
2427
import org.apache.fineract.client.models.GetLoanOriginatorsResponse;
2528
import org.apache.fineract.client.models.PostLoanOriginatorsRequest;
2629
import org.apache.fineract.client.models.PutLoanOriginatorsRequest;
@@ -30,10 +33,12 @@
3033
import org.apache.fineract.integrationtests.client.feign.helpers.FeignLoanHelper;
3134
import org.apache.fineract.integrationtests.client.feign.helpers.FeignLoanOriginatorHelper;
3235
import org.apache.fineract.integrationtests.common.FineractFeignClientHelper;
36+
import org.apache.fineract.integrationtests.common.Utils;
3337
import org.junit.jupiter.api.BeforeAll;
3438
import org.junit.jupiter.api.Order;
3539
import org.junit.jupiter.api.Test;
3640

41+
@Slf4j
3742
@Order(1)
3843
public class FeignLoanOriginatorApiTest extends FeignIntegrationTest {
3944

@@ -84,6 +89,32 @@ public void testCreateOriginatorWithAllFields() {
8489
originatorHelper.deleteOriginator(originatorId);
8590
}
8691

92+
@Test
93+
public void testCreateOriginatorWithAllFieldsUsingTemplate() {
94+
final String name = Utils.randomStringGenerator("Originator ", 30);
95+
96+
final GetLoanOriginatorTemplateResponse originatorTemplate = originatorHelper.retrieveLoanOriginatorTemplate();
97+
assertThat(originatorTemplate).isNotNull();
98+
99+
final String status = originatorTemplate.getStatusOptions().iterator().next();
100+
final GetCodeValuesDataResponse originatorTypeCode = originatorTemplate.getOriginatorTypeOptions().get(0);
101+
final GetCodeValuesDataResponse channelTypeCode = originatorTemplate.getChannelTypeOptions().get(0);
102+
103+
final Long originatorId = originatorHelper
104+
.createOriginator(new PostLoanOriginatorsRequest().externalId(originatorTemplate.getExternalId()).name(name).status(status)
105+
.originatorTypeId(originatorTypeCode.getId()).channelTypeId(channelTypeCode.getId()));
106+
107+
final GetLoanOriginatorsResponse originator = originatorHelper.getOriginatorById(originatorId);
108+
109+
assertThat(originator.getExternalId()).isEqualTo(originatorTemplate.getExternalId());
110+
assertThat(originator.getName()).isEqualTo(name);
111+
assertThat(originator.getStatus()).isEqualTo(status);
112+
assertThat(originator.getOriginatorType().getName()).isEqualTo(originatorTypeCode.getName());
113+
assertThat(originator.getChannelType().getName()).isEqualTo(channelTypeCode.getName());
114+
115+
originatorHelper.deleteOriginator(originatorId);
116+
}
117+
87118
@Test
88119
public void testRetrieveOriginatorById() {
89120
final String externalId = FeignLoanOriginatorHelper.generateUniqueExternalId();

0 commit comments

Comments
 (0)