Skip to content

Commit ebb321e

Browse files
FINERACT-2311: added e2e auto test scenarios for buy down fees
1 parent efded6a commit ebb321e

6 files changed

Lines changed: 224 additions & 21 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public enum TransactionType {
3838
CAPITALIZED_INCOME_AMORTIZATION("capitalizedIncomeAmortization"), //
3939
CAPITALIZED_INCOME_ADJUSTMENT("capitalizedIncomeAdjustment"), //
4040
CAPITALIZED_INCOME_AMORTIZATION_ADJUSTMENT("capitalizedIncomeAmortizationAdjustment"), //
41+
BUY_DOWN_FEE("buyDownFee"), //
4142
;
4243

4344
public final String value;

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

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,41 +1659,41 @@ public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
16591659
.name(name)//
16601660
.shortName(shortName)//
16611661
.description(DESCRIPTION_LP2)//
1662-
.enableDownPayment(true)//
1663-
.enableAutoRepaymentForDownPayment(true)//
1664-
.disbursedAmountPercentageForDownPayment(new BigDecimal(25))//
1662+
.loanScheduleType("PROGRESSIVE") //
1663+
.interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
1664+
.transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
16651665
.fundId(FUND_ID)//
16661666
.startDate(null)//
16671667
.closeDate(null)//
16681668
.includeInBorrowerCycle(false)//
16691669
.currencyCode(CURRENCY_CODE)//
16701670
.digitsAfterDecimal(2)//
16711671
.inMultiplesOf(0)//
1672-
.installmentAmountInMultiplesOf(1)//
16731672
.useBorrowerCycle(false)//
1674-
.minPrincipal(100.0)//
1673+
.minPrincipal(10.0)//
16751674
.principal(1000.0)//
16761675
.maxPrincipal(10000.0)//
16771676
.minNumberOfRepayments(1)//
1678-
.numberOfRepayments(3)//
1677+
.numberOfRepayments(4)//
16791678
.maxNumberOfRepayments(30)//
16801679
.isLinkedToFloatingInterestRates(false)//
16811680
.minInterestRatePerPeriod((double) 0)//
1682-
.interestRatePerPeriod((double) 7)//
1683-
.maxInterestRatePerPeriod((double) 60)//
1684-
.interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_MONTH)//
1681+
.interestRatePerPeriod((double) 12)//
1682+
.maxInterestRatePerPeriod((double) 90)//
1683+
.interestRateFrequencyType(INTEREST_RATE_FREQUENCY_TYPE_YEAR)//
16851684
.repaymentEvery(15)//
1685+
.repaymentStartDateType(1)//
16861686
.repaymentFrequencyType(REPAYMENT_FREQUENCY_TYPE_DAYS)//
16871687
.principalVariationsForBorrowerCycle(principalVariationsForBorrowerCycle)//
16881688
.numberOfRepaymentVariationsForBorrowerCycle(numberOfRepaymentVariationsForBorrowerCycle)//
16891689
.interestRateVariationsForBorrowerCycle(interestRateVariationsForBorrowerCycle)//
16901690
.amortizationType(AMORTIZATION_TYPE)//
16911691
.interestType(INTEREST_TYPE_DECLINING_BALANCE)//
16921692
.isEqualAmortization(false)//
1693-
.interestCalculationPeriodType(INTEREST_CALCULATION_PERIOD_TYPE_SAME_AS_REPAYMENT)//
1694-
.transactionProcessingStrategyCode(TRANSACTION_PROCESSING_STRATEGY_CODE)//
1695-
.daysInYearType(360)//
1696-
.daysInMonthType(30)//
1693+
.interestCalculationPeriodType(INTEREST_CALCULATION_PERIOD_TYPE_DAILY)//
1694+
.transactionProcessingStrategyCode(TRANSACTION_PROCESSING_STRATEGY_CODE_ADVANCED)//
1695+
.daysInYearType(DAYS_IN_YEAR_TYPE_360)//
1696+
.daysInMonthType(DAYS_IN_MONTH_TYPE_30)//
16971697
.canDefineInstallmentAmount(true)//
16981698
.graceOnArrearsAgeing(3)//
16991699
.overdueDaysForNPA(179)//
@@ -1703,7 +1703,7 @@ public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
17031703
.canUseForTopup(false)//
17041704
.isInterestRecalculationEnabled(false)//
17051705
.holdGuaranteeFunds(false)//
1706-
.multiDisburseLoan(true)//
1706+
.multiDisburseLoan(false)//
17071707
.allowAttributeOverrides(new AllowAttributeOverrides()//
17081708
.amortizationType(true)//
17091709
.interestType(true)//
@@ -1713,7 +1713,7 @@ public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
17131713
.repaymentEvery(true)//
17141714
.graceOnPrincipalAndInterestPayment(true)//
17151715
.graceOnArrearsAgeing(true))//
1716-
.allowPartialPeriodInterestCalcualtion(true)//
1716+
.allowPartialPeriodInterestCalcualtion(false)//
17171717
.maxTrancheCount(10)//
17181718
.outstandingLoanBalance(10000.0)//
17191719
.charges(charges)//
@@ -1732,10 +1732,7 @@ public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
17321732
.receivablePenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_FEE_RECEIVABLE))//
17331733
.dateFormat(DATE_FORMAT)//
17341734
.locale(LOCALE_EN)//
1735-
.disallowExpectedDisbursements(true)//
1736-
.allowApprovedDisbursedAmountsOverApplied(true)//
1737-
.overAppliedCalculationType(OVER_APPLIED_CALCULATION_TYPE)//
1738-
.overAppliedNumber(OVER_APPLIED_NUMBER)//
1735+
.disallowExpectedDisbursements(false)//
17391736
.delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
17401737
.goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
17411738
.incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
@@ -1749,6 +1746,14 @@ public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
17491746
.chargeOffExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT))//
17501747
.chargeOffFraudExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT_FRAUD))//
17511748
.incomeFromChargeOffPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
1749+
1750+
.enableIncomeCapitalization(true)
1751+
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION)//
1752+
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)//
1753+
.capitalizedIncomeType(PostLoanProductsRequest.CapitalizedIncomeTypeEnum.INTEREST)//
1754+
.deferredIncomeLiabilityAccountId(accountTypeResolver.resolve(DefaultAccountType.DEFERRED_CAPITALIZED_INCOME))//
1755+
.incomeFromCapitalizationAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME))//
1756+
17521757
.buyDownFeeStrategy(PostLoanProductsRequest.BuyDownFeeStrategyEnum.EQUAL_AMORTIZATION)//
17531758
.buyDownFeeCalculationType(PostLoanProductsRequest.BuyDownFeeCalculationTypeEnum.FLAT)//
17541759
.buyDownFeeIncomeType(PostLoanProductsRequest.BuyDownFeeIncomeTypeEnum.INTEREST)//

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,9 @@ public static PostLoansLoanIdRequest defaultContractTerminationUndoRequest() {
312312
public static PostLoansLoanIdRequest defaultLoanContractTerminationRequest() {
313313
return new PostLoansLoanIdRequest().dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE).note("Contract Termination");
314314
}
315+
316+
public static PostLoansLoanIdTransactionsRequest defaultBuyDownFeeIncomeRequest() {
317+
return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE).dateFormat(DATE_FORMAT)
318+
.locale(DEFAULT_LOCALE).note("Buy Down Fee");
319+
}
315320
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,14 +2936,21 @@ public void initialize() throws Exception {
29362936
TestContext.INSTANCE.set(
29372937
TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
29382938
responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcApprovedOverAppliedFlatCapitalizedIncome);
2939+
29392940
// LP2 with progressive loan schedule + horizontal + interest EMI + 360/30
29402941
// + interest recalculation=false, buy down fees enabled
2941-
final String name114 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES.getName();
2942+
final String name116 = DefaultLoanProduct.LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES.getName();
29422943
final PostLoanProductsRequest loanProductsRequestLP2ProgressiveAdvPaymentBuyDownFees = loanProductsRequestFactory
29432944
.defaultLoanProductsRequestLP2BuyDownFees()//
2944-
.name(name114)//
2945+
.name(name116)//
29452946
.transactionProcessingStrategyCode(ADVANCED_PAYMENT_ALLOCATION.getValue())//
29462947
.loanScheduleType("PROGRESSIVE") //
2948+
.isInterestRecalculationEnabled(true)//
2949+
.preClosureInterestCalculationStrategy(1)//
2950+
.rescheduleStrategyMethod(4)//
2951+
.interestRecalculationCompoundingMethod(0)//
2952+
.recalculationRestFrequencyType(2)//
2953+
.recalculationRestFrequencyInterval(1)//
29472954
.paymentAllocation(List.of(//
29482955
createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT"), //
29492956
createPaymentAllocation("GOODWILL_CREDIT", "LAST_INSTALLMENT"), //

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4670,4 +4670,31 @@ public void capitalizedIncomeAdjustmentForbiddenFutureDate(final String transact
46704670
assertThat(errorDetails.getSingleError().getDeveloperMessage())
46714671
.isEqualTo(ErrorMessageHelper.addCapitalizedIncomeFutureDateFailure());
46724672
}
4673+
4674+
public Response<PostLoansLoanIdTransactionsResponse> addBuyDownFeeToTheLoanOnWithEURTransactionAmount(
4675+
final String transactionPaymentType, final String transactionDate, final String amount) throws IOException {
4676+
final Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
4677+
final long loanId = loanResponse.body().getLoanId();
4678+
4679+
final DefaultPaymentType paymentType = DefaultPaymentType.valueOf(transactionPaymentType);
4680+
final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
4681+
4682+
final PostLoansLoanIdTransactionsRequest buyDownFeeRequest = LoanRequestFactory.defaultBuyDownFeeIncomeRequest()
4683+
.transactionDate(transactionDate).transactionAmount(Double.valueOf(amount)).paymentTypeId(paymentTypeValue)
4684+
.externalId("EXT-BUY-DOWN-FEES" + UUID.randomUUID());
4685+
4686+
final Response<PostLoansLoanIdTransactionsResponse> buyDownFeeResponse = loanTransactionsApi
4687+
.executeLoanTransaction(loanId, buyDownFeeRequest, "buyDownFee").execute();
4688+
return buyDownFeeResponse;
4689+
}
4690+
4691+
@And("Admin adds buy down fee with {string} payment type to the loan on {string} with {string} EUR transaction amount")
4692+
public void adminAddsBuyDownFeesToTheLoanOnWithEURTransactionAmount(final String transactionPaymentType, final String transactionDate,
4693+
final String amount) throws IOException {
4694+
final Response<PostLoansLoanIdTransactionsResponse> buyDownFeesIncomeResponse = addBuyDownFeeToTheLoanOnWithEURTransactionAmount(
4695+
transactionPaymentType, transactionDate, amount);
4696+
testContext().set(TestContextKey.LOAN_BUY_DOWN_FEE_RESPONSE, buyDownFeesIncomeResponse);
4697+
ErrorHelper.checkSuccessfulApiCall(buyDownFeesIncomeResponse);
4698+
}
4699+
46734700
}

0 commit comments

Comments
 (0)