Skip to content

Commit 5fa483a

Browse files
authored
Merge pull request #5751
FINERACT-2455: WC - Breach Configuration - Add name
2 parents c04ba3f + 59784d7 commit 5fa483a

22 files changed

Lines changed: 289 additions & 28 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class WorkingCapitalRequestFactory {
6969
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = "MONTHS";
7070
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = "PERCENTAGE";
7171
public static final BigDecimal DEFAULT_WC_BREACH_AMOUNT = new BigDecimal("1.23");
72+
public static final String DEFAULT_WC_BREACH_NAME_PREFIX = "WCB-";
7273

7374
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithCashAccounting() {
7475
return defaultWorkingCapitalLoanProductRequest()//
@@ -237,6 +238,7 @@ public DelinquencyBucketRequest defaultWorkingCapitalDelinquencyBucketRequest()
237238

238239
public WorkingCapitalBreachRequest defaultWorkingCapitalBreachRequest() {
239240
return new WorkingCapitalBreachRequest() //
241+
.name(Utils.randomStringGenerator(DEFAULT_WC_BREACH_NAME_PREFIX, 12)) //
240242
.breachFrequency(DEFAULT_WC_BREACH_FREQUENCY) //
241243
.breachFrequencyType(DEFAULT_WC_BREACH_FREQUENCY_TYPE) //
242244
.breachAmountCalculationType(DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE) //

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@ public static String workingCapitalLoanProductIdentifiedDoesNotExistFailure(Stri
10451045
return String.format("Working Capital Loan Product with identifier %s does not exist", identifierId);
10461046
}
10471047

1048-
public static String workingCapitalDelinquencyBucketCreateDuplicateNameFailure(Long identifierId) {
1048+
public static String workingCapitalDelinquencyBucketDuplicateNameFailure(Long identifierId) {
10491049
return String.format("Data integrity issue with resource: %d", identifierId);
10501050
}
10511051

@@ -1061,6 +1061,10 @@ public static String workingCapitalBreachNotFoundFailure(final Long id) {
10611061
return String.format("Working Capital Breach with id %d was not found.", id);
10621062
}
10631063

1064+
public static String workingCapitalBreachDuplicateNameFailure(final Long id) {
1065+
return String.format("Data integrity issue with resource: %d", id);
1066+
}
1067+
10641068
public static String disburseNotApprovedFailure(String status) {
10651069
return String.format("Disbursement is not allowed from current status %s", status);
10661070
}

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalBreachConfigStepDef.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,17 @@ public void adminCreatesWCBreachWithValuesForUpdate() {
8282
TestContext.GLOBAL.set(TestContextKey.WORKING_CAPITAL_BREACH_CREATE_REQUEST_FOR_UPDATE, request);
8383
}
8484

85+
@When("Admin failed to create WC Breach With duplicated name")
86+
public void adminCreateWCBreachWithDuplicateNameFailure() {
87+
Long existingBreachId = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_ID_FOR_UPDATE);
88+
WorkingCapitalBreachRequest breachRequestForUpdate = TestContext.GLOBAL
89+
.get(TestContextKey.WORKING_CAPITAL_BREACH_CREATE_REQUEST_FOR_UPDATE);
90+
String name = breachRequestForUpdate.getName();
91+
WorkingCapitalBreachRequest breachRequest = workingCapitalRequestFactory.defaultWorkingCapitalBreachRequest().name(name); //
92+
String errorMessage = ErrorMessageHelper.workingCapitalBreachDuplicateNameFailure(existingBreachId);
93+
checkCreateWCBreachWithInvalidDataFailure(breachRequest, errorMessage, 403);
94+
}
95+
8596
@Then("Check created Breach has the following values")
8697
public void checkCreatedBreachHasTheFollowingValues() {
8798
final Long id = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_ID);
@@ -114,6 +125,18 @@ public void adminModifiesWCBreachWithValues() {
114125
TestContext.GLOBAL.set(TestContextKey.WORKING_CAPITAL_BREACH_UPDATE_REQUEST, request);
115126
}
116127

128+
@When("Admin failed to update WC Breach With duplicated name")
129+
public void adminUpdateWCBreachWithDuplicateNameFailure() {
130+
Long breachIdForUpdate = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_ID_FOR_UPDATE);
131+
Long existingBreachId = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_ID);
132+
WorkingCapitalBreachRequest breachRequestForUpdate = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_CREATE_REQUEST);
133+
String name = breachRequestForUpdate.getName();
134+
WorkingCapitalBreachRequest breachRequest = workingCapitalRequestFactory.defaultWorkingCapitalBreachRequest() //
135+
.name(name); //
136+
String errorMessage = ErrorMessageHelper.workingCapitalBreachDuplicateNameFailure(existingBreachId);
137+
checkUpdateWCBreachWithInvalidDataFailure(breachIdForUpdate, breachRequest, errorMessage, 403);
138+
}
139+
117140
@Then("Check updated Breach has the following values")
118141
public void checkUpdatedBreachHasTheFollowingValues() {
119142
final Long id = TestContext.GLOBAL.get(TestContextKey.WORKING_CAPITAL_BREACH_ID);
@@ -213,6 +236,9 @@ private WorkingCapitalBreachRequest setWCBreachFieldValue(final WorkingCapitalBr
213236
final Integer intValue = fieldValue != null && "breachFrequency".equals(fieldName) ? Integer.valueOf(fieldValue) : null;
214237
final BigDecimal decimalValue = fieldValue != null && "breachAmount".equals(fieldName) ? new BigDecimal(fieldValue) : null;
215238
switch (fieldName) {
239+
case "name":
240+
request.setName(fieldValue);
241+
break;
216242
case "breachFrequency":
217243
request.setBreachFrequency(intValue);
218244
break;
@@ -233,6 +259,7 @@ private WorkingCapitalBreachRequest setWCBreachFieldValue(final WorkingCapitalBr
233259

234260
private void checkBreachData(final WorkingCapitalBreachRequest request, final WorkingCapitalBreachData response) {
235261
final SoftAssertions assertions = new SoftAssertions();
262+
assertions.assertThat(response.getName()).isEqualTo(request.getName());
236263
assertions.assertThat(response.getBreachFrequency()).isEqualTo(request.getBreachFrequency());
237264
assertions.assertThat(enumId(response.getBreachFrequencyType())).isEqualTo(request.getBreachFrequencyType());
238265
assertions.assertThat(enumId(response.getBreachAmountCalculationType())).isEqualTo(request.getBreachAmountCalculationType());

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalDelinquencyConfigStepDef.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public void adminCreateWCDelinquencyBucketWithDuplicateNameFailure() {
115115
String name = delinquencyBucketRequestForUpdate.getName();
116116
DelinquencyBucketRequest delinquencyBucketRequest = workingCapitalRequestFactory.defaultWorkingCapitalDelinquencyBucketRequest()
117117
.name(name); //
118-
String errorMessage = ErrorMessageHelper.workingCapitalDelinquencyBucketCreateDuplicateNameFailure(delinquencyBucketIdForUpdate);
118+
String errorMessage = ErrorMessageHelper.workingCapitalDelinquencyBucketDuplicateNameFailure(delinquencyBucketIdForUpdate);
119119
checkCreateWCDelinquencyBucketWithInvalidDataFailure(delinquencyBucketRequest, errorMessage, 403);
120120
}
121121

@@ -175,7 +175,7 @@ public void adminUpdateWCDelinquencyBucketWithDuplicateNameFailure() {
175175
String name = delinquencyBucketRequestForUpdate.getName();
176176
DelinquencyBucketRequest delinquencyBucketRequest = workingCapitalRequestFactory.defaultWorkingCapitalDelinquencyBucketRequest() //
177177
.name(name); //
178-
String errorMessage = ErrorMessageHelper.workingCapitalDelinquencyBucketCreateDuplicateNameFailure(delinquencyBucketId);
178+
String errorMessage = ErrorMessageHelper.workingCapitalDelinquencyBucketDuplicateNameFailure(delinquencyBucketId);
179179
checkUpdateWCDelinquencyBucketWithInvalidDataFailure(delinquencyBucketIdForUpdate, delinquencyBucketRequest, errorMessage, 403);
180180
}
181181

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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.test.initializer.global;
20+
21+
import static org.apache.fineract.client.feign.util.FeignCalls.executeVoid;
22+
23+
import java.math.BigDecimal;
24+
import java.util.List;
25+
import java.util.Map;
26+
import lombok.RequiredArgsConstructor;
27+
import lombok.extern.slf4j.Slf4j;
28+
import org.apache.fineract.client.feign.FineractFeignClient;
29+
import org.apache.fineract.client.models.WorkingCapitalBreachData;
30+
import org.apache.fineract.client.models.WorkingCapitalBreachRequest;
31+
import org.springframework.stereotype.Component;
32+
33+
@Slf4j
34+
@RequiredArgsConstructor
35+
@Component
36+
public class WorkingCapitalBreachInitializeStep implements FineractGlobalInitializerStep {
37+
38+
public static final String DEFAULT_WC_BREACH_NAME = "Default Working Capital breach";
39+
public static final Integer DEFAULT_WC_BREACH_FREQUENCY = 2;
40+
public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = "MONTHS";
41+
public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = "PERCENTAGE";
42+
public static final BigDecimal DEFAULT_WC_BREACH_AMOUNT = new BigDecimal("1.23");
43+
44+
private final FineractFeignClient fineractClient;
45+
46+
@Override
47+
public void initialize() {
48+
setDefaultWCBreach();
49+
}
50+
51+
public void setDefaultWCBreach() {
52+
try {
53+
List<WorkingCapitalBreachData> existingBuckets = fineractClient.workingCapitalBreaches()
54+
.retrieveAllWorkingCapitalBreaches(Map.of());
55+
boolean bucketExists = existingBuckets.stream().anyMatch(b -> DEFAULT_WC_BREACH_NAME.equals(b.getName()));
56+
57+
if (bucketExists) {
58+
return;
59+
}
60+
} catch (Exception e) {
61+
log.debug("Could not retrieve existing working capital breaches, will create default breach", e);
62+
}
63+
64+
WorkingCapitalBreachRequest defaultWorkingCapitalBreachRequest = new WorkingCapitalBreachRequest()//
65+
.name(DEFAULT_WC_BREACH_NAME) //
66+
.breachFrequency(DEFAULT_WC_BREACH_FREQUENCY) //
67+
.breachFrequencyType(DEFAULT_WC_BREACH_FREQUENCY_TYPE) //
68+
.breachAmountCalculationType(DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE) //
69+
.breachAmount(DEFAULT_WC_BREACH_AMOUNT);
70+
71+
executeVoid(() -> fineractClient.workingCapitalBreaches().createWorkingCapitalBreach(defaultWorkingCapitalBreachRequest, Map.of()));
72+
}
73+
}

fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalBreachConfiguration.feature

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Feature: Working Capital Breach Configuration
1717

1818
Examples:
1919
| wcb_field_name_invalid | wcb_field_value_invalid | wcb_error_message |
20+
| name | "null" | The parameter `name` is mandatory. |
21+
| name | "" | The parameter `name` is mandatory. |
2022
| breachFrequency | "null" | The parameter `breachFrequency` is mandatory. |
2123
| breachFrequency | "0" | The parameter `breachFrequency` must be greater than 0. |
2224
| breachFrequencyType | "null" | The parameter `breachFrequencyType` is mandatory. |
@@ -27,33 +29,45 @@ Feature: Working Capital Breach Configuration
2729
| breachAmount | "-1" | The parameter `breachAmount` must be greater than or equal to 0. |
2830

2931
@TestRailId:C74475
30-
Scenario Outline: Verify Working Capital Breach Configuration update with invalid data shall outcome with error - UC3
32+
Scenario: Verify Working Capital Breach Configuration create validation with existing name outcomes with error - UC3
33+
When Admin creates WC Breach With Values for update
34+
Then Admin failed to create WC Breach With duplicated name
35+
36+
@TestRailId:C74476
37+
Scenario Outline: Verify Working Capital Breach Configuration update with invalid data shall outcome with error - UC4
3138
Then Admin failed to update WC Breach for field "<wcb_field_name_invalid>" with invalid data <wcb_field_value_invalid> results with an error <wcb_error_message>
3239

3340
Examples:
3441
| wcb_field_name_invalid | wcb_field_value_invalid | wcb_error_message |
42+
| name | "null" | The parameter `name` is mandatory. |
43+
| name | "" | The parameter `name` is mandatory. |
3544
| breachFrequency | "0" | The parameter `breachFrequency` must be greater than 0. |
3645
| breachFrequencyType | "INVALID" | The parameter `breachFrequencyType` must be one of [ DAYS, MONTHS, YEARS ] . |
3746
| breachAmountCalculationType | "INVALID" | The parameter `breachAmountCalculationType` must be one of [ PERCENTAGE, FLAT ] . |
3847
| breachAmount | "-1" | The parameter `breachAmount` must be greater than or equal to 0. |
3948

40-
@TestRailId:C74476
41-
Scenario: Verify deleting Working Capital Breach Configuration that is already deleted failure - UC4
42-
When Admin creates WC Breach With Values for update
49+
@TestRailId:C_74477
50+
Scenario: Verify Working Capital Breach update validation with existing name outcomes with error - UC5
51+
When Admin creates WC Breach With Values
52+
Then Admin failed to update WC Breach With duplicated name
53+
When Admin deletes WC Breach With Values
54+
55+
@TestRailId:C74478
56+
Scenario: Verify deleting Working Capital Breach Configuration that is already deleted failure - UC6
4357
When Admin deletes WC Breach With Values for update
4458
Then Admin failed to delete WC Breach that is already deleted
4559
Then Admin failed to retrieve WC Breach that is already deleted
4660

47-
@TestRailId:C74477
48-
Scenario Outline: Verify Working Capital Breach delete with invalid data shall outcome with error - validation check with id - UC5
61+
@TestRailId:C74519
62+
Scenario Outline: Verify Working Capital Breach delete with invalid data shall outcome with error - validation check with id - UC7
4963
Then Admin failed to delete WC Breach with id <wcb_field_name_incorrect_value> that doesn't exist
5064
Examples:
5165
| wcb_field_name_incorrect_value |
5266
| 103284 |
5367
| 0 |
5468

55-
@TestRailId:C74478
56-
Scenario Outline: Verify Working Capital Breach retrieve with invalid data shall outcome with error - validation check with id - UC6
69+
@TestRailId:C74520
70+
Scenario Outline: Verify Working Capital Breach retrieve with invalid data shall outcome with error - validation check with id - UC8
5771
Then Admin failed to retrieve WC Breach with id <wcb_field_name_incorrect_value> that is not found
5872
Examples:
5973
| wcb_field_name_incorrect_value |

fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,15 @@ Feature: WorkingCapitalLoanProduct
211211
@TestRailId:C74469
212212
Scenario: Verify WC Loan Product create with breachId
213213
When Admin creates a new Working Capital Loan Product with breachId
214+
Then Admin deletes a Working Capital Loan Product
214215

215216
@TestRailId:C74470
216217
Scenario Outline: Verify WC Loan Product create/update with invalid breachId
217218
Then Admin failed to create a new Working Capital Loan Product field "<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error <wcp_error_message>
218219
When Admin creates a new Working Capital Loan Product
219220
Then Admin failed to update a new Working Capital Loan Product field "<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error <wcp_error_message>
221+
Then Admin deletes a Working Capital Loan Product
222+
220223
Examples:
221224
| wcp_field_name | wcp_invalid_field_value | wcp_error_message |
222225
| breachId | "0" | "The parameter `breachId` must be greater than 0." |

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanbreach/data/WorkingCapitalBreachData.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.fineract.portfolio.workingcapitalloanbreach.data;
2020

21+
import io.swagger.v3.oas.annotations.media.Schema;
2122
import java.math.BigDecimal;
2223
import lombok.AllArgsConstructor;
2324
import lombok.Builder;
@@ -30,6 +31,8 @@
3031
public class WorkingCapitalBreachData {
3132

3233
private Long id;
34+
@Schema(example = "Default WCL Breach")
35+
private String name;
3336
private Integer breachFrequency;
3437
private StringEnumOptionData breachFrequencyType;
3538
private StringEnumOptionData breachAmountCalculationType;

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanbreach/data/WorkingCapitalBreachRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import java.io.Serializable;
2323
import java.math.BigDecimal;
2424

25-
public record WorkingCapitalBreachRequest(Integer breachFrequency, String breachFrequencyType, String breachAmountCalculationType,
26-
BigDecimal breachAmount) implements Serializable {
25+
public record WorkingCapitalBreachRequest(String name, Integer breachFrequency, String breachFrequencyType,
26+
String breachAmountCalculationType, BigDecimal breachAmount) implements Serializable {
2727

2828
@Serial
2929
private static final long serialVersionUID = 1L;

fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanbreach/domain/WorkingCapitalBreach.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import jakarta.persistence.EnumType;
2424
import jakarta.persistence.Enumerated;
2525
import jakarta.persistence.Table;
26+
import jakarta.persistence.UniqueConstraint;
2627
import java.math.BigDecimal;
2728
import lombok.Getter;
2829
import lombok.NoArgsConstructor;
@@ -32,12 +33,15 @@
3233
import org.apache.fineract.portfolio.workingcapitalloanproduct.domain.WorkingCapitalBreachAmountCalculationType;
3334

3435
@Entity
35-
@Table(name = "m_wc_breach")
36+
@Table(name = "m_wc_breach", uniqueConstraints = { @UniqueConstraint(name = "uq_m_wc_breach_name", columnNames = { "name" }) })
3637
@Getter
3738
@Setter
3839
@NoArgsConstructor
3940
public class WorkingCapitalBreach extends AbstractPersistableCustom<Long> {
4041

42+
@Column(name = "name", nullable = false, length = 100)
43+
private String name;
44+
4145
@Column(name = "breach_frequency")
4246
private Integer breachFrequency;
4347

0 commit comments

Comments
 (0)