Skip to content

Commit a1d27ae

Browse files
FINERACT-2354: e2e test scenarios for re-aging with payable and full interest handling options
1 parent 3ff5c0b commit a1d27ae

File tree

5 files changed

+3127
-815
lines changed

5 files changed

+3127
-815
lines changed

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public enum DefaultLoanProduct implements LoanProduct {
125125
LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE, //
126126
LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED, //
127127
LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE, //
128+
LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK, //
128129
LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES, //
129130
LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF, //
130131
LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ACCELERATE_MATURITY_CHARGE_OFF, //

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4238,6 +4238,42 @@ public void initialize() throws Exception {
42384238
.createLoanProduct(loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches).execute();
42394239
TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES,
42404240
responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
4241+
4242+
// LP2 with progressive loan schedule + horizontal + interest recalculation daily EMI + 360/30 +
4243+
// multidisbursement
4244+
// Frequency for recalculate Outstanding Principal: Daily, Frequency Interval for recalculation: 1
4245+
// chargeback - interest, fee, principal, penalty
4246+
String name151 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK
4247+
.getName();
4248+
PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = loanProductsRequestFactory
4249+
.defaultLoanProductsRequestLP2Emi()//
4250+
.name(name151)//
4251+
.daysInYearType(DaysInYearType.DAYS360.value)//
4252+
.daysInMonthType(DaysInMonthType.DAYS30.value)//
4253+
.isInterestRecalculationEnabled(true)//
4254+
.preClosureInterestCalculationStrategy(1)//
4255+
.rescheduleStrategyMethod(4)//
4256+
.interestRecalculationCompoundingMethod(0)//
4257+
.recalculationRestFrequencyType(2)//
4258+
.recalculationRestFrequencyInterval(1)//
4259+
.creditAllocation(List.of(//
4260+
createCreditAllocation("CHARGEBACK", List.of("INTEREST", "FEE", "PRINCIPAL", "PENALTY"))//
4261+
))//
4262+
.paymentAllocation(List.of(//
4263+
createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
4264+
createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //
4265+
createPaymentAllocation("MERCHANT_ISSUED_REFUND", "REAMORTIZATION"), //
4266+
createPaymentAllocation("PAYOUT_REFUND", "NEXT_INSTALLMENT")))//
4267+
.multiDisburseLoan(true)//
4268+
.disallowExpectedDisbursements(true)//
4269+
.maxTrancheCount(10)//
4270+
.outstandingLoanBalance(10000.0);//
4271+
Response<PostLoanProductsResponse> responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback = loanProductsApi
4272+
.createLoanProduct(loanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback)
4273+
.execute();
4274+
TestContext.INSTANCE.set(
4275+
TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK,
4276+
responseLoanProductsRequestLP2AdvancedpaymentInterestEmi36030InterestRecalcDailyMultiDisburseChargeback);
42414277
}
42424278

42434279
public static AdvancedPaymentData createPaymentAllocation(String transactionType, String futureInstallmentAllocationRule,

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

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.time.format.DateTimeFormatter;
3232
import java.util.ArrayList;
3333
import java.util.Arrays;
34-
import java.util.LinkedHashMap;
3534
import java.util.List;
3635
import java.util.Map;
3736
import java.util.Set;
@@ -72,29 +71,11 @@ public void createReAgingTransaction(DataTable table) throws IOException {
7271
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
7372
long loanId = loanResponse.body().getLoanId();
7473

75-
List<List<String>> tableRows = table.asLists();
76-
List<String> headers = tableRows.get(0);
77-
List<String> values = tableRows.get(1);
78-
79-
Map<String, String> rowData = new LinkedHashMap<>();
80-
int columnCount = Math.min(headers.size(), values.size());
81-
for (int i = 0; i < columnCount; i++) {
82-
rowData.put(headers.get(i), values.get(i));
83-
}
84-
85-
int frequencyNumber = Integer.parseInt(resolveValue(rowData, values, 0, "frequencyNumber"));
86-
String frequencyType = resolveValue(rowData, values, 1, "frequencyType");
87-
String startDate = resolveValue(rowData, values, 2, "startDate");
88-
int numberOfInstallments = Integer.parseInt(resolveValue(rowData, values, 3, "numberOfInstallments"));
89-
90-
PostLoansLoanIdTransactionsRequest reAgingRequest = LoanRequestFactory//
91-
.defaultReAgingRequest()//
92-
.frequencyNumber(frequencyNumber)//
93-
.frequencyType(frequencyType)//
94-
.startDate(startDate)//
95-
.numberOfInstallments(numberOfInstallments);//
96-
97-
applyAdditionalFields(reAgingRequest, rowData, Set.of("frequencyNumber", "frequencyType", "startDate", "numberOfInstallments"));
74+
PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
75+
LoanRequestFactory.defaultReAgingRequest(), //
76+
table.row(0), //
77+
table.row(1) //
78+
);
9879

9980
Response<PostLoansLoanIdTransactionsResponse> response = loanTransactionsApi.executeLoanTransaction(loanId, reAgingRequest, "reAge")
10081
.execute();
@@ -195,18 +176,11 @@ public void createReAgingTransactionByLoanExternalId(DataTable table) throws IOE
195176
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
196177
String loanExternalId = loanResponse.body().getResourceExternalId();
197178

198-
List<String> data = table.asLists().get(1);
199-
int frequencyNumber = Integer.parseInt(data.get(0));
200-
String frequencyType = data.get(1);
201-
String startDate = data.get(2);
202-
int numberOfInstallments = Integer.parseInt(data.get(3));
203-
204-
PostLoansLoanIdTransactionsRequest reAgingRequest = LoanRequestFactory//
205-
.defaultReAgingRequest()//
206-
.frequencyNumber(frequencyNumber)//
207-
.frequencyType(frequencyType)//
208-
.startDate(startDate)//
209-
.numberOfInstallments(numberOfInstallments);//
179+
PostLoansLoanIdTransactionsRequest reAgingRequest = setReAgeingRequestProperties(//
180+
LoanRequestFactory.defaultReAgingRequest(), //
181+
table.row(0), //
182+
table.row(1) //
183+
);
210184

211185
Response<PostLoansLoanIdTransactionsResponse> response = loanTransactionsApi
212186
.executeLoanTransaction1(loanExternalId, reAgingRequest, "reAge").execute();
@@ -521,4 +495,19 @@ private List<String> validateRepaymentScheduleTotal(List<String> header, LoanSch
521495
return actualValues;
522496
}
523497

498+
PostLoansLoanIdTransactionsRequest setReAgeingRequestProperties(PostLoansLoanIdTransactionsRequest request, List<String> headers,
499+
List<String> values) {
500+
for (int i = 0; i < headers.size(); i++) {
501+
String header = headers.get(i).toLowerCase().trim().replaceAll(" ", "");
502+
switch (header) {
503+
case "frequencynumber" -> request.setFrequencyNumber(Integer.parseInt(values.get(i)));
504+
case "frequencytype" -> request.setFrequencyType(values.get(i));
505+
case "startdate" -> request.setStartDate(values.get(i));
506+
case "numberofinstallments" -> request.setNumberOfInstallments(Integer.parseInt(values.get(i)));
507+
case "reageinteresthandling" -> request.setReAgeInterestHandling(values.get(i));
508+
default -> throw new IllegalStateException("Unknown header: " + header);
509+
}
510+
}
511+
return request;
512+
}
524513
}

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public abstract class TestContextKey {
156156
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyMultidisburseExpectTranche";
157157
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INT_DAILY_EMI_360_30_INT_RECALC_DAILY_MULTIDISB_EXPECT_TRANCHE_APPROVED_OVER_APPLIED = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyMultidisburseExpectTrancheApprovedOVerAppliedPercentage";
158158
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE = "loanProductCreateResponseLP2AdvancedPaymentInterestRecalculationDailyEmi36030Multidisburse";
159+
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_CHARGEBACK = "loanProductCreateResponseLP2AdvancedPaymentInterestRecalculationDailyEmi36030MultidisburseChargeback";
159160
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CASH_ACCOUNTING_DISBURSEMENT_CHARGES = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyCashBasedDisbursementCharge";
160161
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_CAPITALIZED_INCOME = "loanProductCreateResponseLP2ProgressiveAdvancedPaymentCapitalizedIncome";
161162
public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES = "loanProductCreateResponseLP2ProgressiveAdvancedPaymentBuyDownFees";

0 commit comments

Comments
 (0)