FINERACT-2232: Capitalized income - Business events - E2E

This commit is contained in:
Peter Kovacs
2025-06-13 18:01:14 +02:00
committed by Adam Saghy
parent 6cd634cb2f
commit 009d7b71a9
4 changed files with 118 additions and 0 deletions
@@ -0,0 +1,27 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.test.messaging.event.loan.transaction;
public class LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent extends AbstractLoanTransactionEvent {
@Override
public String getEventName() {
return "LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent";
}
}
@@ -0,0 +1,27 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.test.messaging.event.loan.transaction;
public class LoanCapitalizedIncomeTransactionCreatedBusinessEvent extends AbstractLoanTransactionEvent {
@Override
public String getEventName() {
return "LoanCapitalizedIncomeTransactionCreatedBusinessEvent";
}
}
@@ -138,8 +138,10 @@ import org.apache.fineract.test.messaging.event.loan.transaction.BulkBusinessEve
import org.apache.fineract.test.messaging.event.loan.transaction.LoanAccrualAdjustmentTransactionBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanAccrualTransactionCreatedBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanAdjustTransactionBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanCapitalizedIncomeTransactionCreatedBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanChargeAdjustmentPostBusinessEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanChargeOffEvent;
import org.apache.fineract.test.messaging.event.loan.transaction.LoanChargeOffUndoEvent;
@@ -4240,6 +4242,42 @@ public class LoanStepDef extends AbstractStepDef {
finalAmortizationTransactionId);
}
@Then("LoanCapitalizedIncomeTransactionCreatedBusinessEvent is raised on {string}")
public void checkLoanCapitalizedIncomeTransactionCreatedBusinessEvent(final String date) throws IOException {
Response<PostLoansResponse> loanCreateResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
long loanId = loanCreateResponse.body().getLoanId();
Response<GetLoansLoanIdResponse> loanDetailsResponse = loansApi.retrieveLoan(loanId, false, "transactions", "", "").execute();
ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse);
List<GetLoansLoanIdTransactions> transactions = loanDetailsResponse.body().getTransactions();
GetLoansLoanIdTransactions finalAmortizationTransaction = transactions.stream()
.filter(t -> date.equals(FORMATTER.format(t.getDate())) && "Capitalized Income".equals(t.getType().getValue())).findFirst()
.orElseThrow(() -> new IllegalStateException(String.format("No Capitalized Income transaction found on %s", date)));
Long finalAmortizationTransactionId = finalAmortizationTransaction.getId();
eventAssertion.assertEventRaised(LoanCapitalizedIncomeTransactionCreatedBusinessEvent.class, finalAmortizationTransactionId);
}
@Then("LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent is raised on {string}")
public void checkLoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent(final String date) throws IOException {
Response<PostLoansResponse> loanCreateResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
long loanId = loanCreateResponse.body().getLoanId();
Response<GetLoansLoanIdResponse> loanDetailsResponse = loansApi.retrieveLoan(loanId, false, "transactions", "", "").execute();
ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse);
List<GetLoansLoanIdTransactions> transactions = loanDetailsResponse.body().getTransactions();
GetLoansLoanIdTransactions finalAmortizationTransaction = transactions.stream()
.filter(t -> date.equals(FORMATTER.format(t.getDate())) && "Capitalized Income Adjustment".equals(t.getType().getValue()))
.findFirst().orElseThrow(
() -> new IllegalStateException(String.format("No Capitalized Income Adjustment transaction found on %s", date)));
Long finalAmortizationTransactionId = finalAmortizationTransaction.getId();
eventAssertion.assertEventRaised(LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent.class,
finalAmortizationTransactionId);
}
@And("Admin adds capitalized income adjustment with {string} payment type to the loan on {string} with {string} EUR transaction amount")
public void adminAddsCapitalizedIncomeAdjustmentToTheLoan(final String transactionPaymentType, final String transactionDate,
final String amount) throws IOException {
@@ -4653,3 +4653,29 @@ Feature: Capitalized Income
| 31 January 2024 | Capitalized Income Amortization | 17.03 | 0.0 | 17.03 | 0.0 | 0.0 | 0.0 | false | false |
| 01 February 2024 | Accrual | 0.31 | 0.0 | 0.31 | 0.0 | 0.0 | 0.0 | false | false |
| 01 February 2024 | Capitalized Income Amortization | 17.77 | 0.0 | 17.77 | 0.0 | 0.0 | 0.0 | false | false |
@TestRailId:C3735
Scenario: Verify Capitalized Income business events
When Admin sets the business date to "01 January 2024"
And Admin creates a client with random data
And Admin creates a fully customized loan with the following data:
| LoanProduct | submitted on date | with Principal | ANNUAL interest rate % | interest type | interest calculation period | amortization type | loanTermFrequency | loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | interest free period | Payment strategy |
| LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC | 01 January 2024 | 150 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
And Admin successfully approves the loan on "01 January 2024" with "150" amount and expected disbursement date on "01 January 2024"
And Admin successfully disburse the loan on "01 January 2024" with "90" EUR transaction amount
And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "01 January 2024" with "60" EUR transaction amount
And Admin sets the business date to "02 January 2024"
Then LoanCapitalizedIncomeTransactionCreatedBusinessEvent is raised on "01 January 2024"
When Admin runs inline COB job for Loan
Then LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent is raised on "01 January 2024"
And Loan status will be "ACTIVE"
When Admin adds capitalized income adjustment with "AUTOPAY" payment type to the loan on "02 January 2024" with "10" EUR transaction amount
And Admin sets the business date to "03 January 2024"
Then LoanCapitalizedIncomeAdjustmentTransactionCreatedBusinessEvent is raised on "02 January 2024"
When Admin runs inline COB job for Loan
And Admin sets the business date to "04 January 2024"
And Admin runs inline COB job for Loan
And Customer undo "1"th capitalized income adjustment on "02 January 2024"
When Customer undo "1"th "Capitalized Income" transaction made on "01 January 2024"
And Admin sets the business date to "05 January 2024"
And Admin runs inline COB job for Loan