Skip to content

Commit c054651

Browse files
alberto-art3chAvtansh88
authored andcommitted
FINERACT-2455: Working Capital loan delinquency grace days
1 parent 9d599f7 commit c054651

23 files changed

+342
-11
lines changed

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/data/WorkingCapitalLoanData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,6 @@ public class WorkingCapitalLoanData implements Serializable {
7474
private List<WorkingCapitalLoanDisbursementDetailData> disbursementDetails;
7575
private WorkingCapitalLoanBalanceData balance;
7676
private List<WorkingCapitalLoanTransactionData> transactions;
77+
private Integer delinquencyGraceDays;
78+
private StringEnumOptionData delinquencyStartType;
7779
}

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/data/WorkingCapitalLoanTemplateData.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,5 @@ public class WorkingCapitalLoanTemplateData {
4646
private Collection<FundData> fundOptions;
4747
private Collection<DelinquencyBucketData> delinquencyBucketOptions;
4848
private List<StringEnumOptionData> periodFrequencyTypeOptions;
49+
private List<StringEnumOptionData> delinquencyStartTypeOptions;
4950
}

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/mapper/WorkingCapitalLoanMapper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public interface WorkingCapitalLoanMapper {
6868
@Mapping(target = "timeline", source = "loan", qualifiedByName = "timelineData")
6969
@Mapping(target = "disbursementDetails", source = "disbursementDetails")
7070
@Mapping(target = "transactions", source = "transactions")
71+
@Mapping(target = "delinquencyGraceDays", source = "loanProductRelatedDetails.delinquencyGraceDays")
72+
@Mapping(target = "delinquencyStartType", source = "loanProductRelatedDetails", qualifiedByName = "delinquencyStartTypeData")
7173
WorkingCapitalLoanData toData(WorkingCapitalLoan loan);
7274

7375
List<WorkingCapitalLoanData> toDataList(List<WorkingCapitalLoan> loans);
@@ -95,6 +97,12 @@ default StringEnumOptionData repaymentFrequencyTypeData(final WorkingCapitalLoan
9597
: null;
9698
}
9799

100+
@Named("delinquencyStartTypeData")
101+
default StringEnumOptionData delinquencyStartTypeData(final WorkingCapitalLoanProductRelatedDetails detail) {
102+
return (detail != null && detail.getDelinquencyStartType() != null) ? detail.getDelinquencyStartType().toStringEnumOptionData()
103+
: null;
104+
}
105+
98106
@Named("paymentAllocationRulesToData")
99107
default List<WorkingCapitalPaymentAllocationData> paymentAllocationRulesToData(
100108
final List<WorkingCapitalLoanPaymentAllocationRule> rules) {

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/serialization/WorkingCapitalLoanApplicationDataValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ public class WorkingCapitalLoanApplicationDataValidator {
8787
WorkingCapitalLoanProductConstants.delinquencyBucketIdParamName, WorkingCapitalLoanProductConstants.repaymentEveryParamName,
8888
WorkingCapitalLoanProductConstants.repaymentFrequencyTypeParamName, WorkingCapitalLoanConstants.submittedOnNoteParameterName,
8989
WorkingCapitalLoanProductConstants.allowAttributeOverridesParamName,
90-
WorkingCapitalLoanProductConstants.paymentAllocationParamName));
90+
WorkingCapitalLoanProductConstants.paymentAllocationParamName, WorkingCapitalLoanProductConstants.delinquencyGraceDaysParamName,
91+
WorkingCapitalLoanProductConstants.delinquencyStartTypeParamName));
9192

9293
private final FromJsonHelper fromApiJsonHelper;
9394
private final WorkingCapitalPaymentAllocationDataValidator paymentAllocationDataValidator;

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanApplicationReadPlatformServiceImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.fineract.portfolio.workingcapitalloan.mapper.WorkingCapitalLoanSummaryMapper;
4444
import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository;
4545
import org.apache.fineract.portfolio.workingcapitalloanproduct.data.WorkingCapitalLoanProductData;
46+
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalLoanDelinquencyStartType;
4647
import org.apache.fineract.portfolio.workingcapitalloanproduct.service.WorkingCapitalLoanProductReadPlatformService;
4748
import org.springframework.data.domain.Page;
4849
import org.springframework.data.domain.PageImpl;
@@ -71,7 +72,8 @@ public WorkingCapitalLoanTemplateData retrieveTemplate(final Long productId, fin
7172
.retrieveAllDelinquencyBuckets();
7273
final List<StringEnumOptionData> periodFrequencyTypeOptions = ApiFacingEnum
7374
.getValuesAsStringEnumOptionDataList(WorkingCapitalLoanPeriodFrequencyType.class);
74-
75+
final List<StringEnumOptionData> delinquencyStartTypeOptions = ApiFacingEnum
76+
.getValuesAsStringEnumOptionDataList(WorkingCapitalLoanDelinquencyStartType.class);
7577
final WorkingCapitalLoanData.WorkingCapitalLoanDataBuilder builder = WorkingCapitalLoanData.builder();
7678
if (productId != null) {
7779
final WorkingCapitalLoanProductData product = this.productReadPlatformService.retrieveWorkingCapitalLoanProduct(productId);
@@ -98,7 +100,7 @@ public WorkingCapitalLoanTemplateData retrieveTemplate(final Long productId, fin
98100
.fundOptions(productTemplate.getFundOptions())//
99101
.delinquencyBucketOptions(delinquencyBucketOptions)//
100102
.periodFrequencyTypeOptions(periodFrequencyTypeOptions)//
101-
.build();
103+
.delinquencyStartTypeOptions(delinquencyStartTypeOptions).build();
102104
}
103105

104106
@Override

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanAssemblerImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.apache.fineract.portfolio.workingcapitalloan.repository.WorkingCapitalLoanRepository;
5555
import org.apache.fineract.portfolio.workingcapitalloanproduct.WorkingCapitalLoanProductConstants;
5656
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalAdvancedPaymentAllocationsJsonParser;
57+
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalLoanDelinquencyStartType;
5758
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalLoanProduct;
5859
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalLoanProductPaymentAllocationRule;
5960
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalLoanProductRelatedDetail;
@@ -171,6 +172,17 @@ private WorkingCapitalLoanProductRelatedDetails buildLoanProductRelatedDetails(f
171172
new java.util.HashSet<>())
172173
: productDetail.getDiscount());
173174

175+
detail.setDelinquencyGraceDays(
176+
fromApiJsonHelper.parameterExists(WorkingCapitalLoanProductConstants.delinquencyGraceDaysParamName, element)
177+
? fromApiJsonHelper.extractIntegerNamed(WorkingCapitalLoanProductConstants.delinquencyGraceDaysParamName, element,
178+
new java.util.HashSet<>())
179+
: productDetail.getDelinquencyGraceDays());
180+
detail.setDelinquencyStartType(
181+
fromApiJsonHelper.parameterExists(WorkingCapitalLoanProductConstants.delinquencyStartTypeParamName, element)
182+
? WorkingCapitalLoanDelinquencyStartType.valueOf(fromApiJsonHelper
183+
.extractStringNamed(WorkingCapitalLoanProductConstants.delinquencyStartTypeParamName, element))
184+
: productDetail.getDelinquencyStartType());
185+
174186
if (fromApiJsonHelper.parameterExists(WorkingCapitalLoanProductConstants.delinquencyBucketIdParamName, element)) {
175187
final Long bucketId = fromApiJsonHelper.extractLongNamed(WorkingCapitalLoanProductConstants.delinquencyBucketIdParamName,
176188
element);

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/WorkingCapitalLoanProductConstants.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ private WorkingCapitalLoanProductConstants() {
6262
public static final String periodPaymentFrequencyOverridableParamName = "periodPaymentFrequency";
6363
public static final String periodPaymentFrequencyTypeOverridableParamName = "periodPaymentFrequencyType";
6464

65+
// Delinquency grace
66+
public static final String delinquencyGraceDaysParamName = "delinquencyGraceDays";
67+
public static final String delinquencyStartTypeParamName = "delinquencyStartType";
68+
6569
// Resource name for permissions
6670
public static final String WCLP_RESOURCE_NAME = "WORKINGCAPITALLOANPRODUCT";
6771
}

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ private PostWorkingCapitalLoanProductsRequest() {}
9393
public Integer repaymentEvery;
9494
@Schema(example = "DAYS", allowableValues = { "DAYS", "MONTHS", "YEARS" })
9595
public String repaymentFrequencyType;
96+
@Schema(example = "1")
97+
public Integer delinquencyGraceDays;
98+
@Schema(example = "DAYS", allowableValues = { "LOAN_CREATION", "DISBURSEMENT" })
99+
public String delinquencyStartType;
96100

97101
// Configurable attributes
98102
public PostAllowAttributeOverrides allowAttributeOverrides;
@@ -204,6 +208,9 @@ private GetWorkingCapitalLoanProductsResponse() {}
204208
@Schema(example = "30")
205209
public Integer repaymentEvery;
206210
public StringEnumOptionData repaymentFrequencyType;
211+
@Schema(example = "1")
212+
public Integer delinquencyGraceDays;
213+
public StringEnumOptionData delinquencyStartType;
207214

208215
// Configurable attributes
209216
public GetConfigurableAttributes allowAttributeOverrides;
@@ -282,6 +289,7 @@ private GetWorkingCapitalLoanProductsTemplateResponse() {}
282289
public List<StringEnumOptionData> amortizationTypeOptions;
283290
public List<StringEnumOptionData> periodFrequencyTypeOptions;
284291
public List<StringEnumOptionData> advancedPaymentAllocationTypes;
292+
public List<StringEnumOptionData> delinquencyStartTypes;
285293
public List<EnumOptionData> advancedPaymentAllocationTransactionTypes;
286294
public List<GetWorkingCapitalLoanProductsResponse.GetDelinquencyBucket> delinquencyBucketOptions;
287295
}
@@ -340,6 +348,9 @@ private GetWorkingCapitalLoanProductsProductIdResponse() {}
340348
@Schema(example = "30")
341349
public Integer repaymentEvery;
342350
public StringEnumOptionData repaymentFrequencyType;
351+
@Schema(example = "1")
352+
public Integer delinquencyGraceDays;
353+
public StringEnumOptionData delinquencyStartType;
343354

344355
// Configurable attributes
345356
public GetWorkingCapitalLoanProductsResponse.GetConfigurableAttributes allowAttributeOverrides;
@@ -404,6 +415,10 @@ private PutWorkingCapitalLoanProductsProductIdRequest() {}
404415
public Integer repaymentEvery;
405416
@Schema(example = "DAYS", allowableValues = { "DAYS", "MONTHS", "YEARS" })
406417
public String repaymentFrequencyType;
418+
@Schema(example = "1")
419+
public Integer delinquencyGraceDays;
420+
@Schema(example = "DAYS", allowableValues = { "LOAN_CREATION", "DISBURSEMENT" })
421+
public String delinquencyStartType;
407422

408423
// Configurable attributes
409424
public PostWorkingCapitalLoanProductsRequest.PostAllowAttributeOverrides allowAttributeOverrides;

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/data/WorkingCapitalLoanProductData.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public class WorkingCapitalLoanProductData implements Serializable {
7474
private BigDecimal discount;
7575
private Integer repaymentEvery;
7676
private StringEnumOptionData repaymentFrequencyType;
77+
private Integer delinquencyGraceDays;
78+
private StringEnumOptionData delinquencyStartType;
7779

7880
// Configurable attributes (allowAttributeOverrides)
7981
private WorkingCapitalLoanProductConfigurableAttributesData allowAttributeOverrides;
@@ -84,6 +86,7 @@ public class WorkingCapitalLoanProductData implements Serializable {
8486
private List<StringEnumOptionData> amortizationTypeOptions;
8587
private List<StringEnumOptionData> periodFrequencyTypeOptions;
8688
private List<StringEnumOptionData> advancedPaymentAllocationTypes;
89+
private List<StringEnumOptionData> delinquencyStartTypeOptions;
8790
private List<EnumOptionData> advancedPaymentAllocationTransactionTypes;
8891
private Collection<DelinquencyBucketData> delinquencyBucketOptions;
8992

@@ -95,6 +98,7 @@ public WorkingCapitalLoanProductData applyTemplate(final WorkingCapitalLoanProdu
9598
setAdvancedPaymentAllocationTransactionTypes(productTemplate.getAdvancedPaymentAllocationTransactionTypes());
9699
setAdvancedPaymentAllocationTypes(productTemplate.getAdvancedPaymentAllocationTypes());
97100
setDelinquencyBucketOptions(productTemplate.getDelinquencyBucketOptions());
101+
setDelinquencyStartTypeOptions(productTemplate.getDelinquencyStartTypeOptions());
98102
return this;
99103
}
100104
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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.workingcapitalloanproduct.domain;
20+
21+
import lombok.Getter;
22+
import lombok.RequiredArgsConstructor;
23+
import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
24+
import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
25+
import org.springframework.util.StringUtils;
26+
27+
/**
28+
* Delinquency start types for Working Capital Loan Product.
29+
*/
30+
@Getter
31+
@RequiredArgsConstructor
32+
public enum WorkingCapitalLoanDelinquencyStartType implements ApiFacingEnum<WorkingCapitalLoanDelinquencyStartType> {
33+
34+
LOAN_CREATION(1, "LOAN_CREATION", "Loan Creation"), //
35+
DISBURSEMENT(2, "DISBURSEMENT", "Disbursement") //
36+
;
37+
38+
private final Integer value;
39+
private final String code;
40+
private final String humanReadableName;
41+
42+
/**
43+
* Resolve enum from its string name/code (e.g. "LOAN_CREATION", "DISBURSEMENT").
44+
*/
45+
public static WorkingCapitalLoanDelinquencyStartType fromString(final String delinquencyStartTypeValue) {
46+
if (!StringUtils.hasText(delinquencyStartTypeValue)) {
47+
return null;
48+
}
49+
50+
if (delinquencyStartTypeValue.trim().equalsIgnoreCase(LOAN_CREATION.name())) {
51+
return LOAN_CREATION;
52+
}
53+
if (delinquencyStartTypeValue.trim().equalsIgnoreCase(DISBURSEMENT.name())) {
54+
return DISBURSEMENT;
55+
}
56+
57+
return null;
58+
}
59+
60+
public StringEnumOptionData toStringEnumOptionData() {
61+
return new StringEnumOptionData(getValue().toString(), getCode(), getHumanReadableName());
62+
}
63+
}

0 commit comments

Comments
 (0)