Skip to content

Commit 4a738a7

Browse files
FINERACT-2455: e2e test scenarios for near breach management config
1 parent c45fb3d commit 4a738a7

17 files changed

Lines changed: 2001 additions & 113 deletions

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ public enum DefaultWorkingCapitalLoanProduct implements WorkingCapitalLoanProduc
2424
WCLP_DISCOUNT, //
2525
WCLP_DISALLOW_ATTRIBUTES_OVERRIDE, //
2626
WCLP_DISCOUNT_DISALLOW_ATTRIBUTES_OVERRIDE, //
27-
WCLP_FOR_UPDATE; //
27+
WCLP_FOR_UPDATE, //
28+
WCLP_DELINQUENCY_RESCHEDULE, //
29+
WCLP_BREACH, //
30+
WCLP_BREACH_NEAR_BREACH, //
31+
WCLP_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE, //
32+
WCLP_BREACH_NEAR_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE; //
2833

2934
@Override
3035
public String getName() {
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+
20+
package org.apache.fineract.test.data.workingcapitalproduct;
21+
22+
import lombok.Getter;
23+
import lombok.RequiredArgsConstructor;
24+
25+
@Getter
26+
@RequiredArgsConstructor
27+
public enum WorkingCapitalBreachCalculationType {
28+
29+
FLAT(0L, "FLAT", "Flat"), //
30+
PERCENTAGE(1L, "PERCENTAGE", "Percentage"); //
31+
32+
private final Long id;
33+
private final String code;
34+
private final String value;
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
20+
package org.apache.fineract.test.data.workingcapitalproduct;
21+
22+
import lombok.Getter;
23+
import lombok.RequiredArgsConstructor;
24+
25+
@Getter
26+
@RequiredArgsConstructor
27+
public enum WorkingCapitalBreachFrequencyType {
28+
29+
DAYS(0L, "DAYS", "Days"), //
30+
MONTHS(1L, "MONTHS", "Months"), //
31+
YEARS(2L, "YEARS", "Years");
32+
33+
private final Long id;
34+
private final String code;
35+
private final String value;
36+
}

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,17 @@
4343
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest.AccountingRuleEnum;
4444
import org.apache.fineract.client.models.PostWorkingCapitalLoanTransactionsRequest;
4545
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
46+
import org.apache.fineract.client.models.WorkingCapitalBreachData;
4647
import org.apache.fineract.client.models.WorkingCapitalBreachRequest;
48+
import org.apache.fineract.client.models.WorkingCapitalNearBreachData;
49+
import org.apache.fineract.client.models.WorkingCapitalNearBreachRequest;
4750
import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
4851
import org.apache.fineract.test.data.accounttype.DefaultAccountType;
4952
import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
5053
import org.apache.fineract.test.data.delinquency.DelinquencyFrequencyType;
5154
import org.apache.fineract.test.data.delinquency.DelinquencyMinimumPayment;
55+
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalBreachCalculationType;
56+
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalBreachFrequencyType;
5257
import org.apache.fineract.test.helper.Utils;
5358
import org.springframework.stereotype.Component;
5459

@@ -63,14 +68,19 @@ public class WorkingCapitalRequestFactory {
6368
public static final String WCLP_NAME_PREFIX = "WCLP-";
6469
public static final String WCLP_DESCRIPTION = "Working Capital Loan Product";
6570
public static final String DEFAULT_WC_DELINQUENCY_BUCKET_NAME = "Default Working Capital delinquency bucket";
71+
public static final String DEFAULT_WC_BREACH_NAME = "Default Working Capital breach";
72+
public static final String DEFAULT_WC_NEAR_BREACH_NAME = "Default Working Capital near breach";
6673
public static final String PENALTY = "PENALTY";
6774
public static final String FEE = "FEE";
6875
public static final String PRINCIPAL = "PRINCIPAL";
6976
public static final Integer DEFAULT_WC_BREACH_FREQUENCY = 2;
70-
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = "MONTHS";
71-
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = "PERCENTAGE";
77+
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType.MONTHS.getCode();
78+
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = WorkingCapitalBreachCalculationType.PERCENTAGE.getCode();
7279
public static final BigDecimal DEFAULT_WC_BREACH_AMOUNT = new BigDecimal("1.23");
7380
public static final String DEFAULT_WC_BREACH_NAME_PREFIX = "WCB-";
81+
public static final Integer DEFAULT_WC_NEAR_BREACH_FREQUENCY = 12;
82+
public static final String DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType.DAYS.getCode();
83+
public static final BigDecimal DEFAULT_WC_NEAR_BREACH_THRESHOLD = new BigDecimal("70.23");
7484

7585
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithCashAccounting() {
7686
return defaultWorkingCapitalLoanProductRequest()//
@@ -150,12 +160,34 @@ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductAll
150160
.allowAttributeOverrides(allowAttributeOverrides);
151161
}
152162

163+
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachRequest() {
164+
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
165+
String shortName = loanProductsRequestFactory.generateShortNameSafely();
166+
167+
Long breachId = getWCBreachIdByName(DEFAULT_WC_BREACH_NAME);
168+
return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest().name(name)//
169+
.shortName(shortName)//
170+
.breachId(breachId);
171+
}
172+
173+
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachNearBreachRequest() {
174+
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
175+
String shortName = loanProductsRequestFactory.generateShortNameSafely();
176+
177+
Long breachId = getWCBreachIdByName(DEFAULT_WC_BREACH_NAME);
178+
Long nearBreachId = getWCNearBreachIdByName(DEFAULT_WC_NEAR_BREACH_NAME);
179+
return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest().name(name)//
180+
.shortName(shortName)//
181+
.breachId(breachId) //
182+
.nearBreachId(nearBreachId); //
183+
}
184+
153185
public PutWorkingCapitalLoanProductsProductIdRequest defaultWorkingCapitalLoanProductRequestUpdate() {
154186
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
155187
String shortName = loanProductsRequestFactory.generateShortNameSafely();
156188

157189
PostAllowAttributeOverrides allowAttributeOverrides = new PostAllowAttributeOverrides().delinquencyBucketClassification(true)
158-
.discountDefault(false).periodPaymentFrequencyType(false).periodPaymentFrequency(true);
190+
.breach(true).discountDefault(false).periodPaymentFrequencyType(false).periodPaymentFrequency(true);
159191

160192
return new PutWorkingCapitalLoanProductsProductIdRequest()//
161193
.name(name)//
@@ -173,9 +205,10 @@ public PutWorkingCapitalLoanProductsProductIdRequest defaultWorkingCapitalLoanPr
173205
.principal(new BigDecimal(200))//
174206
.minPrincipal(new BigDecimal(15))//
175207
.maxPrincipal(new BigDecimal(300000))//
176-
.discount(new BigDecimal(50)).amortizationType(PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.EIR)//
208+
.discount(new BigDecimal(50)) //
209+
.amortizationType(PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.EIR)//
177210
.npvDayCount(DAYS365.value)//
178-
.delinquencyBucketId(null)//
211+
.delinquencyBucketId(getWCDelinquencyBucketIdByName(DEFAULT_WC_DELINQUENCY_BUCKET_NAME))//
179212
.dateFormat(DATE_FORMAT)//
180213
.locale(LOCALE_EN)//
181214
.allowAttributeOverrides(allowAttributeOverrides)//
@@ -246,6 +279,14 @@ public WorkingCapitalBreachRequest defaultWorkingCapitalBreachRequest() {
246279
.breachAmount(DEFAULT_WC_BREACH_AMOUNT);
247280
}
248281

282+
public WorkingCapitalNearBreachRequest defaultWorkingCapitalNearBreachRequest() {
283+
return new WorkingCapitalNearBreachRequest() //
284+
.nearBreachName("NearBreach-WCL-" + Utils.randomStringGenerator(8)) //
285+
.nearBreachFrequency(DEFAULT_WC_NEAR_BREACH_FREQUENCY) //
286+
.nearBreachFrequencyType(DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE) //
287+
.nearBreachThreshold(DEFAULT_WC_NEAR_BREACH_THRESHOLD); //
288+
}
289+
249290
public PostWorkingCapitalLoanTransactionsRequest defaultWorkingCapitalLoanRepaymentRequest() {
250291
return new PostWorkingCapitalLoanTransactionsRequest() //
251292
.dateFormat(DATE_FORMAT) //
@@ -262,4 +303,25 @@ private Long getWCDelinquencyBucketIdByName(String bucketName) {
262303
}
263304
}
264305

306+
private Long getWCBreachIdByName(String breachName) {
307+
try {
308+
List<WorkingCapitalBreachData> breaches = fineractClient.workingCapitalBreaches().retrieveAllWorkingCapitalBreaches(Map.of());
309+
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalBreachData::getId)
310+
.orElseThrow(() -> new RuntimeException("Working Capital Breach not found with name: " + breachName));
311+
} catch (Exception e) {
312+
throw new RuntimeException("Failed to fetch Working Capital Breacht by name: " + breachName, e);
313+
}
314+
}
315+
316+
private Long getWCNearBreachIdByName(String breachName) {
317+
try {
318+
List<WorkingCapitalNearBreachData> breaches = fineractClient.workingCapitalNearBreaches()
319+
.retrieveAllWorkingCapitalNearBreaches(Map.of());
320+
return breaches.stream().filter(b -> breachName.equals(b.getName())).findFirst().map(WorkingCapitalNearBreachData::getId)
321+
.orElseThrow(() -> new RuntimeException("Working Capital Breach not found with name: " + breachName));
322+
} catch (Exception e) {
323+
throw new RuntimeException("Failed to fetch Working Capital Breacht by name: " + breachName, e);
324+
}
325+
}
326+
265327
}

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,10 @@ public static String workingCapitalBreachNotFoundFailure(final Long id) {
10671067
return String.format("Working Capital Breach with id %d was not found.", id);
10681068
}
10691069

1070+
public static String workingCapitalNearBreachNotFoundFailure(final Long id) {
1071+
return String.format("Working Capital Near Breach with id %d was not found.", id);
1072+
}
1073+
10701074
public static String workingCapitalBreachDuplicateNameFailure(final Long id) {
10711075
return String.format("Data integrity issue with resource: %d", id);
10721076
}
@@ -1095,7 +1099,27 @@ public static String discountDiffDateFromDisburseFailure() {
10951099
return "Failed data validation due to: transaction.date.must.be.equal.disbursement.date.";
10961100
}
10971101

1098-
public static String discountOverrideDisallowedByProductFailure() {
1102+
public static String overrideDisallowedByProductFailure() {
10991103
return "Failed data validation due to: override.not.allowed.by.product.";
11001104
}
1105+
1106+
public static String discountExceedCreatedDiscountFailure() {
1107+
return "Failed data validation due to: amount.cannot.exceed.created.discount.";
1108+
}
1109+
1110+
public static String nearBreachCannotEnableWithoutBreachFailure() {
1111+
return "Failed data validation due to: cannot.enable.near.breach.without.breach.";
1112+
}
1113+
1114+
public static String nearBreachMustBeLowerThenBreachFailure() {
1115+
return "Failed data validation due to: near.breach.frequency.must.be.lower.than.breach.frequency.";
1116+
}
1117+
1118+
public static String breachIdNotFoundFailure(long breachId) {
1119+
return String.format("Working Capital Breach with id %s was not found.", breachId);
1120+
}
1121+
1122+
public static String nearBreachIdNotFoundFailure(long nearBreachId) {
1123+
return String.format("Working Capital Near Breach with id %s was not found.", nearBreachId);
1124+
}
11011125
}

0 commit comments

Comments
 (0)