Skip to content

Commit 259ceae

Browse files
authored
Merge pull request #5772
FINERACT-2455: Add WC near breach evaluation
2 parents 89b8278 + 8fa7b86 commit 259ceae

7 files changed

Lines changed: 552 additions & 13 deletions

File tree

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ public void createWorkingCapitalLoanProductWithBreachIdAndOverrides() {
304304

305305
@When("Admin creates a Working Capital Loan Product with custom breach config and overrides enabled:")
306306
public void createWorkingCapitalLoanProductWithCustomBreachConfig(final DataTable table) {
307-
final Map<String, String> data = table.asMaps().get(0);
307+
final Map<String, String> data = table.asMaps().getFirst();
308308

309309
final String breachName = "WC Breach " + Utils.randomStringGenerator("", 10);
310310
final WorkingCapitalBreachRequest breachRequest = new WorkingCapitalBreachRequest().name(breachName)
@@ -332,6 +332,47 @@ public void createWorkingCapitalLoanProductWithCustomBreachConfig(final DataTabl
332332
checkWorkingCapitalLoanProductCreate();
333333
}
334334

335+
@When("Admin creates a Working Capital Loan Product with breach and near breach config and overrides enabled:")
336+
public void createWorkingCapitalLoanProductWithBreachAndNearBreachConfig(final DataTable table) {
337+
final Map<String, String> data = table.asMaps().getFirst();
338+
339+
final String breachName = "WC Breach " + Utils.randomStringGenerator("", 10);
340+
final WorkingCapitalBreachRequest breachRequest = new WorkingCapitalBreachRequest().name(breachName)
341+
.breachFrequency(Integer.valueOf(data.get("breachFrequency"))).breachFrequencyType(data.get("breachFrequencyType"))
342+
.breachAmountCalculationType(data.get("breachAmountCalculationType"))
343+
.breachAmount(new BigDecimal(data.get("breachAmount")));
344+
final CommandProcessingResult breachCreateResponse = ok(
345+
() -> fineractFeignClient.workingCapitalBreaches().createWorkingCapitalBreach(breachRequest));
346+
final Long breachId = breachCreateResponse.getResourceId();
347+
testContext().set(TestContextKey.WORKING_CAPITAL_BREACH_ID, breachId);
348+
349+
final WorkingCapitalNearBreachRequest nearBreachRequest = new WorkingCapitalNearBreachRequest()
350+
.nearBreachName("WC Near Breach " + Utils.randomStringGenerator("", 10))
351+
.nearBreachFrequency(Integer.valueOf(data.get("nearBreachFrequency")))
352+
.nearBreachFrequencyType(data.get("nearBreachFrequencyType"))
353+
.nearBreachThreshold(new BigDecimal(data.get("nearBreachThreshold")));
354+
final CommandProcessingResult nearBreachCreateResponse = ok(
355+
() -> fineractFeignClient.workingCapitalNearBreaches().createWorkingCapitalNearBreach(nearBreachRequest));
356+
final Long nearBreachId = nearBreachCreateResponse.getResourceId();
357+
testContext().set(TestContextKey.WORKING_CAPITAL_NEAR_BREACH_ID, nearBreachId);
358+
359+
final String graceDaysStr = data.get("delinquencyGraceDays");
360+
final Integer graceDays = graceDaysStr != null && !graceDaysStr.isEmpty() ? Integer.valueOf(graceDaysStr) : null;
361+
362+
final String name = DefaultWorkingCapitalLoanProduct.WCLP.getName() + Utils.randomStringGenerator("_", 10);
363+
final PostWorkingCapitalLoanProductsRequest request = workingCapitalRequestFactory
364+
.defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest() //
365+
.name(name) //
366+
.breachId(breachId) //
367+
.nearBreachId(nearBreachId) //
368+
.delinquencyGraceDays(graceDays);
369+
370+
final PostWorkingCapitalLoanProductsResponse response = createWorkingCapitalLoanProduct(request);
371+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE, response);
372+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST, request);
373+
checkWorkingCapitalLoanProductCreate();
374+
}
375+
335376
@When("Admin creates a new Working Capital Loan Product with external-id")
336377
public void createWorkingCapitalLoanProductWithExternalId() {
337378
final String workingCapitalProductDefaultName = DefaultWorkingCapitalLoanProduct.WCLP.getName()

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ Feature: Working Capital Delinquency Reschedule Action
487487
| 1 | 01 January 2026 | 30 January 2026 | 100 | 0 | 100 | |
488488
Then WC loan delinquency actions contain 2 actions
489489

490+
@TestRailId:C76652
490491
Scenario: Verify that reschedule with no parameters is rejected
491492
When Admin sets the business date to "01 January 2026"
492493
When Admin creates a client with random data
@@ -500,6 +501,7 @@ Feature: Working Capital Delinquency Reschedule Action
500501
When Admin runs inline COB job for Working Capital Loan
501502
Then Admin fails to create WC delinquency reschedule action with no parameters with error containing "At least one of payment"
502503

504+
@TestRailId:C76653
503505
Scenario: Verify that reschedule with minimumPayment but without minimumPaymentType is rejected
504506
When Admin sets the business date to "01 January 2026"
505507
When Admin creates a client with random data
@@ -515,6 +517,7 @@ Feature: Working Capital Delinquency Reschedule Action
515517
| minimumPayment |
516518
| 5 |
517519

520+
@TestRailId:C76654
518521
Scenario: Verify that reschedule with frequency but without frequencyType is rejected
519522
When Admin sets the business date to "01 January 2026"
520523
When Admin creates a client with random data
@@ -530,6 +533,7 @@ Feature: Working Capital Delinquency Reschedule Action
530533
| frequency |
531534
| 30 |
532535

536+
@TestRailId:C76655
533537
Scenario: Verify that reschedule with invalid minimumPaymentType is rejected
534538
When Admin sets the business date to "01 January 2026"
535539
When Admin creates a client with random data
@@ -545,6 +549,7 @@ Feature: Working Capital Delinquency Reschedule Action
545549
| minimumPayment | minimumPaymentType |
546550
| 5 | INVALID |
547551

552+
@TestRailId:C76656
548553
Scenario: Verify that FLAT reschedule with COB generates periods with flat amount
549554
When Admin sets the business date to "01 January 2026"
550555
When Admin creates a client with random data
@@ -568,6 +573,7 @@ Feature: Working Capital Delinquency Reschedule Action
568573
| 3 | 02 March 2026 | 31 March 2026 | 150 | 0 | 150 | false |
569574
| 4 | 01 April 2026 | 30 April 2026 | 150 | 0 | 150 | |
570575

576+
@TestRailId:C76657
571577
Scenario: Verify that reschedule with FLAT minimumPaymentType uses flat amount
572578
When Admin sets the business date to "01 January 2026"
573579
When Admin creates a client with random data
@@ -589,6 +595,8 @@ Feature: Working Capital Delinquency Reschedule Action
589595
| action | startDate | minimumPayment | minimumPaymentType | frequency | frequencyType |
590596
| RESCHEDULE | 01 January 2026 | 150 | FLAT | 30 | DAYS |
591597

598+
@Skip
599+
@TestRailId:C76658
592600
Scenario: Verify that reschedule with payment group only keeps original frequency
593601
When Admin sets the business date to "01 January 2026"
594602
When Admin creates a client with random data
@@ -618,6 +626,8 @@ Feature: Working Capital Delinquency Reschedule Action
618626
| 7 | 30 June 2026 | 29 July 2026 | 100 | 0 | 100 | false |
619627
| 8 | 30 July 2026 | 28 August 2026 | 100 | 0 | 100 | |
620628

629+
@Skip
630+
@TestRailId:C76659
621631
Scenario: Verify that reschedule with frequency group only keeps original payment
622632
When Admin sets the business date to "01 January 2026"
623633
When Admin creates a client with random data

0 commit comments

Comments
 (0)