blob: 2ca0a661171a16c550969e2787606a0963319a96 [file] [log] [blame]
/**
* 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.integrationtests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import org.apache.fineract.client.models.BusinessDateRequest;
import org.apache.fineract.client.models.DeleteLoansLoanIdChargesChargeIdResponse;
import org.apache.fineract.client.models.DeleteLoansLoanIdResponse;
import org.apache.fineract.client.models.GetDelinquencyRangesResponse;
import org.apache.fineract.client.models.GetDelinquencyTagHistoryResponse;
import org.apache.fineract.client.models.GetLoansApprovalTemplateResponse;
import org.apache.fineract.client.models.GetLoansLoanIdChargesChargeIdResponse;
import org.apache.fineract.client.models.GetLoansLoanIdChargesTemplateResponse;
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionIdResponse;
import org.apache.fineract.client.models.PostClientsResponse;
import org.apache.fineract.client.models.PostDelinquencyBucketResponse;
import org.apache.fineract.client.models.PostDelinquencyRangeResponse;
import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest;
import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdResponse;
import org.apache.fineract.client.models.PostLoansLoanIdChargesRequest;
import org.apache.fineract.client.models.PostLoansLoanIdChargesResponse;
import org.apache.fineract.client.models.PostLoansLoanIdRequest;
import org.apache.fineract.client.models.PostLoansLoanIdResponse;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsTransactionIdRequest;
import org.apache.fineract.client.models.PutChargeTransactionChangesRequest;
import org.apache.fineract.client.models.PutChargeTransactionChangesResponse;
import org.apache.fineract.client.models.PutLoansLoanIdChargesChargeIdRequest;
import org.apache.fineract.client.models.PutLoansLoanIdChargesChargeIdResponse;
import org.apache.fineract.client.models.PutLoansLoanIdRequest;
import org.apache.fineract.client.models.PutLoansLoanIdResponse;
import org.apache.fineract.client.util.CallFailedRuntimeException;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.integrationtests.client.IntegrationTest;
import org.apache.fineract.integrationtests.common.BusinessDateHelper;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.accounting.Account;
import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
import org.apache.fineract.integrationtests.common.organisation.StaffHelper;
import org.apache.fineract.integrationtests.common.products.DelinquencyBucketsHelper;
import org.apache.fineract.integrationtests.common.products.DelinquencyRangesHelper;
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(LoanTestLifecycleExtension.class)
public class ExternalIdSupportIntegrationTest extends IntegrationTest {
private ResponseSpecification responseSpec;
private RequestSpecification requestSpec;
private ClientHelper clientHelper;
private AccountHelper accountHelper;
private LoanTransactionHelper loanTransactionHelper;
private DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMMM yyyy").toFormatter();
@BeforeAll
public void init() {
Utils.initializeRESTAssured();
this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
this.clientHelper = new ClientHelper(this.requestSpec, this.responseSpec);
this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
}
@Test
public void test() {
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(requestSpec, responseSpec, 50, true);
final Account assetAccount = this.accountHelper.createAssetAccount();
final Account assetFeeAndPenaltyAccount = this.accountHelper.createAssetAccount();
final Account incomeAccount = this.accountHelper.createIncomeAccount();
final Account expenseAccount = this.accountHelper.createExpenseAccount();
final Account overpaymentAccount = this.accountHelper.createLiabilityAccount();
Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true));
Integer penalty2 = ChargesHelper.createCharges(requestSpec, responseSpec,
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true, 1));
final String loanProductJSON = new LoanProductTestBuilder().withPrincipal("1000").withRepaymentTypeAsMonth()
.withRepaymentAfterEvery("1").withNumberOfRepayments("1").withRepaymentTypeAsMonth().withinterestRatePerPeriod("0")
.withInterestRateFrequencyTypeAsMonths().withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat()
.withAccountingRulePeriodicAccrual(new Account[] { assetAccount, incomeAccount, expenseAccount, overpaymentAccount })
.withDaysInMonth("30").withDaysInYear("365").withMoratorium("0", "0")
.withFeeAndPenaltyAssetAccount(assetFeeAndPenaltyAccount).build(null);
final Integer loanProductID = this.loanTransactionHelper.getLoanProductId(loanProductJSON);
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
String loanExternalIdStr = UUID.randomUUID().toString();
final HashMap loan = applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr);
Integer loanId = (Integer) loan.get("resourceId");
this.loanTransactionHelper.approveLoan("02 September 2022", loanId);
String txnExternalIdStr = UUID.randomUUID().toString();
final HashMap disbursedLoanResult = this.loanTransactionHelper.disburseLoan("03 September 2022", loanId, "1000", txnExternalIdStr);
// Check whether the provided external id was retrieved
assertEquals(txnExternalIdStr, disbursedLoanResult.get("subResourceExternalId"));
LocalDate targetDate = LocalDate.of(2022, 9, 7);
final String penaltyCharge1AddedDate = dateFormatter.format(targetDate);
String penalty1LoanChargeExternalId = UUID.randomUUID().toString();
Integer penalty1LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanId,
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10",
penalty1LoanChargeExternalId));
// Get loan charges
List<GetLoansLoanIdChargesChargeIdResponse> loanChargesResult = loanTransactionHelper.getLoanCharges((long) loanId);
assertEquals(penalty1LoanChargeExternalId, loanChargesResult.get(0).getExternalId());
loanChargesResult = loanTransactionHelper.getLoanCharges(loanExternalIdStr);
assertEquals(penalty1LoanChargeExternalId, loanChargesResult.get(0).getExternalId());
// Get loan charge template
GetLoansLoanIdChargesTemplateResponse loanChargeTemplateResult = loanTransactionHelper.getLoanChargeTemplate((long) loanId);
assertNotNull(loanChargeTemplateResult);
loanChargeTemplateResult = loanTransactionHelper.getLoanChargeTemplate(loanExternalIdStr);
assertNotNull(loanChargeTemplateResult);
// Get loan charge
GetLoansLoanIdChargesChargeIdResponse loanChargeResult = loanTransactionHelper.getLoanCharge((long) loanId,
(long) penalty1LoanChargeId);
assertEquals(penalty1LoanChargeExternalId, loanChargeResult.getExternalId());
loanChargeResult = loanTransactionHelper.getLoanCharge(loanExternalIdStr, (long) penalty1LoanChargeId);
assertEquals(penalty1LoanChargeExternalId, loanChargeResult.getExternalId());
loanChargeResult = loanTransactionHelper.getLoanCharge((long) loanId, penalty1LoanChargeExternalId);
assertEquals(penalty1LoanChargeExternalId, loanChargeResult.getExternalId());
loanChargeResult = loanTransactionHelper.getLoanCharge(loanExternalIdStr, penalty1LoanChargeExternalId);
assertEquals(penalty1LoanChargeExternalId, loanChargeResult.getExternalId());
PostLoansLoanIdChargesResponse penalty2Result = this.loanTransactionHelper.addLoanCharge(loanExternalIdStr,
new PostLoansLoanIdChargesRequest().chargeId((long) penalty).amount(10.0).dueDate(penaltyCharge1AddedDate)
.dateFormat("dd MMMM yyyy").locale("en"));
assertNotNull(penalty2Result.getResourceExternalId());
// Check whether we can fetch transaction templates with proper result http code (HTTP 200..300)
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "repayment", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "payoutRefund", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "waiveinterest", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "close-rescheduled", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "disburse", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "recoverypayment", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "refundbycash", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "foreclosure", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "creditBalanceRefund", null, null, null);
loanTransactionHelper.retrieveTransactionTemplate(loanExternalIdStr, "charge-off", null, null, null);
// Check whether an external id was generated
String waiveChargeExternalIdStr = UUID.randomUUID().toString();
PostLoansLoanIdChargesChargeIdResponse waiveLoanChargeResult = loanTransactionHelper.waiveLoanCharge((long) loanId,
(long) penalty1LoanChargeId, new PostLoansLoanIdChargesChargeIdRequest().externalId(waiveChargeExternalIdStr));
assertEquals(waiveChargeExternalIdStr, waiveLoanChargeResult.getSubResourceExternalId());
assertEquals(penalty1LoanChargeExternalId, waiveLoanChargeResult.getResourceExternalId());
GetLoansLoanIdTransactionsTransactionIdResponse response = loanTransactionHelper.getLoanTransactionDetails((long) loanId,
waiveChargeExternalIdStr);
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, waiveLoanChargeResult.getSubResourceExternalId());
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, waiveChargeExternalIdStr);
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
// Check whether an external id was generated
PutChargeTransactionChangesResponse undoWaiveLoanChargeResult = loanTransactionHelper.undoWaiveLoanCharge((long) loanId,
waiveChargeExternalIdStr, new PutChargeTransactionChangesRequest());
assertEquals(waiveChargeExternalIdStr, undoWaiveLoanChargeResult.getSubResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, waiveChargeExternalIdStr);
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, undoWaiveLoanChargeResult.getSubResourceId());
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, waiveChargeExternalIdStr);
assertEquals(waiveChargeExternalIdStr, response.getExternalId());
// Check whether an external id was generated
waiveLoanChargeResult = loanTransactionHelper.waiveLoanCharge(loanExternalIdStr, (long) penalty1LoanChargeId,
new PostLoansLoanIdChargesChargeIdRequest());
assertNotNull(waiveLoanChargeResult.getSubResourceExternalId());
assertEquals(penalty1LoanChargeExternalId, waiveLoanChargeResult.getResourceExternalId());
// Check whether an external id was generated
undoWaiveLoanChargeResult = loanTransactionHelper.undoWaiveLoanCharge(loanExternalIdStr, waiveLoanChargeResult.getSubResourceId(),
new PutChargeTransactionChangesRequest());
assertNotNull(undoWaiveLoanChargeResult.getSubResourceExternalId());
// Check whether an external id was generated
waiveChargeExternalIdStr = UUID.randomUUID().toString();
waiveLoanChargeResult = loanTransactionHelper.waiveLoanCharge(loanExternalIdStr, penalty1LoanChargeExternalId,
new PostLoansLoanIdChargesChargeIdRequest().externalId(waiveChargeExternalIdStr));
assertEquals(waiveChargeExternalIdStr, waiveLoanChargeResult.getSubResourceExternalId());
assertEquals(penalty1LoanChargeExternalId, waiveLoanChargeResult.getResourceExternalId());
// Check whether an external id was generated
undoWaiveLoanChargeResult = loanTransactionHelper.undoWaiveLoanCharge(loanExternalIdStr,
waiveLoanChargeResult.getSubResourceExternalId(), new PutChargeTransactionChangesRequest());
assertEquals(waiveChargeExternalIdStr, undoWaiveLoanChargeResult.getSubResourceExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse repaymentResult = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.transactionAmount(5.0));
assertNotNull(repaymentResult.getResourceExternalId());
String repaymentExternalId = repaymentResult.getResourceExternalId();
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, repaymentExternalId);
assertEquals(repaymentExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, repaymentResult.getResourceId());
assertEquals(repaymentExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, repaymentExternalId);
assertEquals(repaymentExternalId, response.getExternalId());
// Check whether the provided external id was retrieved
String transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse repaymentResultWithExternalId = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, repaymentResultWithExternalId.getResourceExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse merchantIssuedRefundResult = loanTransactionHelper
.makeMerchantIssuedRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0));
assertNotNull(merchantIssuedRefundResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse merchantIssuedRefundResultWithExternalId = loanTransactionHelper
.makeMerchantIssuedRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, merchantIssuedRefundResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
merchantIssuedRefundResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse payoutRefundResult = loanTransactionHelper.makePayoutRefund(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.transactionAmount(5.0));
assertNotNull(payoutRefundResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse payoutRefundResultWithExternalId = loanTransactionHelper
.makePayoutRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, payoutRefundResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, payoutRefundResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse goodWillCreditResult = loanTransactionHelper.makeGoodwillCredit(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.transactionAmount(5.0));
assertNotNull(goodWillCreditResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse goodWillCreditResultWithExternalId = loanTransactionHelper
.makeGoodwillCredit(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, goodWillCreditResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, goodWillCreditResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse writeoffResult = loanTransactionHelper.makeWriteoff(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en"));
assertNotNull(writeoffResult.getResourceExternalId());
transactionExternalIdStr = writeoffResult.getResourceExternalId();
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, writeoffResult.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse makeRecoveryPaymentResult = loanTransactionHelper.makeRecoveryPayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.transactionAmount(5.0));
assertNotNull(makeRecoveryPaymentResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse makeRecoveryPaymentResultWithExternalId = loanTransactionHelper
.makeRecoveryPayment(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, makeRecoveryPaymentResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
makeRecoveryPaymentResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse undoWriteoffResult = loanTransactionHelper.makeUndoWriteoff(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest());
assertNotNull(undoWriteoffResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse writeoffResultWithExternalId = loanTransactionHelper.makeWriteoff(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("06 September 2022").locale("en")
.externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, writeoffResultWithExternalId.getResourceExternalId());
// Check whether the provided external id was retrieved
final PostLoansLoanIdTransactionsResponse undoWriteoffResultWithExternalId = loanTransactionHelper
.makeUndoWriteoff(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest());
assertEquals(transactionExternalIdStr, undoWriteoffResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, undoWriteoffResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Overpay the account
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse overpaymentResultWithExternalId = loanTransactionHelper
.makeLoanRepayment(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5000.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, overpaymentResultWithExternalId.getResourceExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse makeCreditBalanceRefundResult = loanTransactionHelper
.makeCreditBalanceRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0));
assertNotNull(makeCreditBalanceRefundResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse makeCreditBalanceRefundResultWithExternalId = loanTransactionHelper
.makeCreditBalanceRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate("06 September 2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, makeCreditBalanceRefundResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
makeCreditBalanceRefundResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse chargeRefundResult = loanTransactionHelper.makeChargeRefund(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").locale("en")
.loanChargeId(Long.valueOf(penalty1LoanChargeId)).transactionAmount(1.0));
assertNotNull(chargeRefundResult.getResourceExternalId());
// Check whether the provided external id was retrieved
transactionExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse chargeRefundResultWithExternalId = loanTransactionHelper
.makeChargeRefund(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").locale("en")
.loanChargeId(Long.valueOf(penalty1LoanChargeId)).transactionAmount(1.0).externalId(transactionExternalIdStr));
assertEquals(transactionExternalIdStr, chargeRefundResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanId, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, chargeRefundResultWithExternalId.getResourceId());
assertEquals(transactionExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, transactionExternalIdStr);
assertEquals(transactionExternalIdStr, response.getExternalId());
// Create a loan with interest and test the rest of the transactions
final String loanProductWithInterestJSON = new LoanProductTestBuilder().withPrincipal("10000.0").withRepaymentTypeAsMonth()
.withRepaymentAfterEvery("2").withNumberOfRepayments("5").withRepaymentTypeAsMonth().withinterestRatePerPeriod("1")
.withInterestRateFrequencyTypeAsMonths().withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat()
.withAccounting("1", null).build(null);
final Integer loanProductWithInterestID = this.loanTransactionHelper.getLoanProductId(loanProductWithInterestJSON);
LocalDate aMonthBefore = Utils.getLocalDateOfTenant().minusMonths(1);
String formattedDate = dateFormatter.format(aMonthBefore);
final Integer savingsId = SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec,
client.getClientId().intValue(), "10000.0");
loanExternalIdStr = UUID.randomUUID().toString();
final String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal("10000.0").withLoanTermFrequency("10")
.withLoanTermFrequencyAsMonths().withNumberOfRepayments("5").withRepaymentEveryAfter("2")
.withRepaymentFrequencyTypeAsMonths().withInterestRatePerPeriod("1").withInterestTypeAsFlatBalance()
.withAmortizationTypeAsEqualPrincipalPayments().withInterestCalculationPeriodTypeSameAsRepaymentPeriod()
.withExpectedDisbursementDate(formattedDate).withSubmittedOnDate(formattedDate).withLoanType("individual")
.withExternalId(loanExternalIdStr)
.build(client.getClientId().toString(), loanProductWithInterestID.toString(), savingsId.toString());
final HashMap loanWithInterest = this.loanTransactionHelper.getLoanId(loanApplicationJSON, "");
Integer loanWithInterestId = (Integer) loanWithInterest.get("resourceId");
String chargeExternalId = UUID.randomUUID().toString();
PostLoansLoanIdChargesResponse loanChargeForApprovedLoanResult = this.loanTransactionHelper.addLoanCharge(loanExternalIdStr,
new PostLoansLoanIdChargesRequest().externalId(chargeExternalId).amount(1.0).chargeId((long) penalty)
.dateFormat("dd MMMM yyyy").locale("en").dueDate(formattedDate));
PutLoansLoanIdChargesChargeIdResponse updatedLoanChargeForApprovedLoanResult = this.loanTransactionHelper.updateLoanCharge(
(long) loanWithInterestId, loanChargeForApprovedLoanResult.getResourceId(),
new PutLoansLoanIdChargesChargeIdRequest().amount(2.0));
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), updatedLoanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(),
updatedLoanChargeForApprovedLoanResult.getResourceExternalId());
DeleteLoansLoanIdChargesChargeIdResponse deleteLoanChargeResult = this.loanTransactionHelper
.deleteLoanCharge((long) loanWithInterestId, loanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), deleteLoanChargeResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(), deleteLoanChargeResult.getResourceExternalId());
chargeExternalId = UUID.randomUUID().toString();
loanChargeForApprovedLoanResult = this.loanTransactionHelper.addLoanCharge(loanExternalIdStr,
new PostLoansLoanIdChargesRequest().externalId(chargeExternalId).amount(1.0).chargeId((long) penalty)
.dateFormat("dd MMMM yyyy").locale("en").dueDate(formattedDate));
updatedLoanChargeForApprovedLoanResult = this.loanTransactionHelper.updateLoanCharge((long) loanWithInterestId,
loanChargeForApprovedLoanResult.getResourceExternalId(), new PutLoansLoanIdChargesChargeIdRequest().amount(1.0));
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), updatedLoanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(),
updatedLoanChargeForApprovedLoanResult.getResourceExternalId());
deleteLoanChargeResult = this.loanTransactionHelper.deleteLoanCharge((long) loanWithInterestId,
loanChargeForApprovedLoanResult.getResourceExternalId());
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), deleteLoanChargeResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(), deleteLoanChargeResult.getResourceExternalId());
chargeExternalId = UUID.randomUUID().toString();
loanChargeForApprovedLoanResult = this.loanTransactionHelper.addLoanCharge(loanExternalIdStr,
new PostLoansLoanIdChargesRequest().externalId(chargeExternalId).amount(1.0).chargeId((long) penalty)
.dateFormat("dd MMMM yyyy").locale("en").dueDate(formattedDate));
updatedLoanChargeForApprovedLoanResult = this.loanTransactionHelper.updateLoanCharge(loanExternalIdStr,
loanChargeForApprovedLoanResult.getResourceId(), new PutLoansLoanIdChargesChargeIdRequest().amount(1.0));
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), updatedLoanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(),
updatedLoanChargeForApprovedLoanResult.getResourceExternalId());
deleteLoanChargeResult = this.loanTransactionHelper.deleteLoanCharge(loanExternalIdStr,
loanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), deleteLoanChargeResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(), deleteLoanChargeResult.getResourceExternalId());
chargeExternalId = UUID.randomUUID().toString();
loanChargeForApprovedLoanResult = this.loanTransactionHelper.addLoanCharge(loanExternalIdStr,
new PostLoansLoanIdChargesRequest().externalId(chargeExternalId).amount(1.0).chargeId((long) penalty)
.dateFormat("dd MMMM yyyy").locale("en").dueDate(formattedDate));
updatedLoanChargeForApprovedLoanResult = this.loanTransactionHelper.updateLoanCharge(loanExternalIdStr,
loanChargeForApprovedLoanResult.getResourceExternalId(), new PutLoansLoanIdChargesChargeIdRequest().amount(2.0));
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), updatedLoanChargeForApprovedLoanResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(),
updatedLoanChargeForApprovedLoanResult.getResourceExternalId());
deleteLoanChargeResult = this.loanTransactionHelper.deleteLoanCharge(loanExternalIdStr,
loanChargeForApprovedLoanResult.getResourceExternalId());
assertEquals(loanChargeForApprovedLoanResult.getResourceId(), deleteLoanChargeResult.getResourceId());
assertEquals(loanChargeForApprovedLoanResult.getResourceExternalId(), deleteLoanChargeResult.getResourceExternalId());
this.loanTransactionHelper.approveLoan(formattedDate, loanWithInterestId);
final HashMap disbursedLoanWithInterestResult = this.loanTransactionHelper.disburseLoan(formattedDate, loanWithInterestId, "1000",
null);
// Check whether an external id was generated
assertNotNull(disbursedLoanWithInterestResult.get("subResourceExternalId"));
LocalDate aMonthBeforePlus3Days = aMonthBefore.plusDays(3);
formattedDate = dateFormatter.format(aMonthBeforePlus3Days);
String penalty3LoanChargeExternalId = UUID.randomUUID().toString();
Integer penalty3LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanWithInterestId, LoanTransactionHelper
.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), formattedDate, "10", penalty3LoanChargeExternalId));
Integer penalty4LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanWithInterestId,
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty2), formattedDate, "1000"));
String penalty5LoanChargeExternalId = UUID.randomUUID().toString();
Integer penalty5LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanWithInterestId, LoanTransactionHelper
.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty2), formattedDate, "1000", penalty5LoanChargeExternalId));
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse waiveInterestResult = loanTransactionHelper.makeWaiveInterest(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate(formattedDate).locale("en")
.transactionAmount(5.0));
assertNotNull(waiveInterestResult.getResourceExternalId());
// Check whether the provided external id was retrieved
String waiveInterestTxnExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse waiveInterestResultWithExternalId = loanTransactionHelper
.makeWaiveInterest(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate(formattedDate).locale("en").transactionAmount(1.0).externalId(waiveInterestTxnExternalIdStr));
assertEquals(waiveInterestTxnExternalIdStr, waiveInterestResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, waiveInterestTxnExternalIdStr);
assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, waiveInterestResultWithExternalId.getResourceId());
assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, waiveInterestTxnExternalIdStr);
assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
String inAdvanceRepaymentTxnExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse inAdvanceRepaymentResult = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate(formattedDate).locale("en")
.transactionAmount(500.0).externalId(inAdvanceRepaymentTxnExternalIdStr));
String inAdvanceRepayment2TxnExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse inAdvanceRepayment2Result = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate(formattedDate).locale("en")
.transactionAmount(50.0).externalId(inAdvanceRepayment2TxnExternalIdStr));
// Check whether an external id was generated
final PostLoansLoanIdTransactionsResponse makeRefundByCashResult = loanTransactionHelper.makeRefundByCash(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate(formattedDate).locale("en")
.transactionAmount(1.0));
assertNotNull(makeRefundByCashResult.getResourceExternalId());
// Check whether the provided external id was retrieved
String makeRefundTxnExternalIdStr = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse makeRefundByCashResultWithExternalId = loanTransactionHelper
.makeRefundByCash(loanExternalIdStr, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate(formattedDate).locale("en").transactionAmount(5.0).externalId(makeRefundTxnExternalIdStr));
assertEquals(makeRefundTxnExternalIdStr, makeRefundByCashResultWithExternalId.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, makeRefundTxnExternalIdStr);
assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, makeRefundByCashResultWithExternalId.getResourceId());
assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, makeRefundTxnExternalIdStr);
assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
PostLoansLoanIdTransactionsResponse adjustmentResult = loanTransactionHelper.reverseLoanTransaction((long) loanWithInterestId,
inAdvanceRepayment2TxnExternalIdStr, new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate)
.locale("en").dateFormat("dd MMMM yyyy").transactionAmount(0.0));
assertEquals(inAdvanceRepayment2TxnExternalIdStr, adjustmentResult.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, inAdvanceRepayment2TxnExternalIdStr);
assertEquals(inAdvanceRepayment2TxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, adjustmentResult.getResourceId());
assertEquals(inAdvanceRepayment2TxnExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, inAdvanceRepayment2TxnExternalIdStr);
assertEquals(inAdvanceRepayment2TxnExternalIdStr, response.getExternalId());
adjustmentResult = loanTransactionHelper.reverseLoanTransaction(loanExternalIdStr, inAdvanceRepaymentResult.getResourceId(),
new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate).locale("en").dateFormat("dd MMMM yyyy")
.transactionAmount(0.0));
assertEquals(inAdvanceRepaymentTxnExternalIdStr, adjustmentResult.getResourceExternalId());
String adjustTransactionExternalId = UUID.randomUUID().toString();
adjustmentResult = loanTransactionHelper.adjustLoanTransaction(loanExternalIdStr, waiveInterestTxnExternalIdStr,
new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate).locale("en").dateFormat("dd MMMM yyyy")
.transactionAmount(2.0).externalId(adjustTransactionExternalId));
assertEquals(adjustTransactionExternalId, adjustmentResult.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, adjustTransactionExternalId);
assertEquals(adjustTransactionExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, adjustmentResult.getResourceId());
assertEquals(adjustTransactionExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, adjustTransactionExternalId);
assertEquals(adjustTransactionExternalId, response.getExternalId());
adjustmentResult = loanTransactionHelper.adjustLoanTransaction(loanExternalIdStr, adjustmentResult.getResourceExternalId(),
new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate).locale("en").dateFormat("dd MMMM yyyy")
.transactionAmount(1.0));
assertNotNull(adjustmentResult.getResourceExternalId());
String repaymentForChargeback = UUID.randomUUID().toString();
final PostLoansLoanIdTransactionsResponse repaymentForChargebackResult = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate(formattedDate).locale("en")
.transactionAmount(5.0).externalId(repaymentForChargeback));
String chargebackTransactionExternalId = UUID.randomUUID().toString();
PostLoansLoanIdTransactionsResponse chargebackResult = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr,
repaymentForChargebackResult.getResourceExternalId(), new PostLoansLoanIdTransactionsTransactionIdRequest().locale("en")
.transactionAmount(2.0).externalId(chargebackTransactionExternalId).paymentTypeId(1L));
assertEquals(chargebackTransactionExternalId, chargebackResult.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, chargebackTransactionExternalId);
assertEquals(chargebackTransactionExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, chargebackResult.getResourceId());
assertEquals(chargebackTransactionExternalId, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, chargebackTransactionExternalId);
assertEquals(chargebackTransactionExternalId, response.getExternalId());
chargebackResult = loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr,
repaymentForChargebackResult.getResourceExternalId(),
new PostLoansLoanIdTransactionsTransactionIdRequest().locale("en").transactionAmount(2.0).paymentTypeId(2L));
assertNotNull(chargebackResult.getResourceExternalId());
// Check whether the provided external id was retrieved
String chargeAdjustmentExternalIdStr = UUID.randomUUID().toString();
PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResult = loanTransactionHelper.chargeAdjustment((long) loanWithInterestId,
(long) penalty3LoanChargeId,
new PostLoansLoanIdChargesChargeIdRequest().externalId(chargeAdjustmentExternalIdStr).amount(1.0).locale("en"));
assertEquals(chargeAdjustmentExternalIdStr, chargeAdjustmentResult.getSubResourceExternalId());
assertEquals(penalty3LoanChargeExternalId, chargeAdjustmentResult.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, chargeAdjustmentExternalIdStr);
assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, chargeAdjustmentResult.getSubResourceExternalId());
assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, chargeAdjustmentExternalIdStr);
assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
// Check whether an external id was generated
chargeAdjustmentResult = loanTransactionHelper.chargeAdjustment(loanExternalIdStr, penalty3LoanChargeExternalId,
new PostLoansLoanIdChargesChargeIdRequest().amount(1.0).locale("en"));
assertNotNull(chargeAdjustmentResult.getSubResourceExternalId());
assertEquals(penalty3LoanChargeExternalId, chargeAdjustmentResult.getResourceExternalId());
PostLoansLoanIdChargesChargeIdResponse payChargeResult = this.loanTransactionHelper.payLoanCharge(loanExternalIdStr,
(long) penalty4LoanChargeId,
new PostLoansLoanIdChargesChargeIdRequest().locale("en").dateFormat("dd MMMM yyyy").transactionDate(formattedDate));
assertNotNull(payChargeResult.getSubResourceExternalId());
assertNotNull(payChargeResult.getResourceExternalId());
String payChargeExternalIdStr = UUID.randomUUID().toString();
payChargeResult = this.loanTransactionHelper.payLoanCharge(loanExternalIdStr, penalty5LoanChargeExternalId,
new PostLoansLoanIdChargesChargeIdRequest().locale("en").dateFormat("dd MMMM yyyy").transactionDate(formattedDate)
.externalId(payChargeExternalIdStr));
assertEquals(payChargeExternalIdStr, payChargeResult.getSubResourceExternalId());
assertEquals(penalty5LoanChargeExternalId, payChargeResult.getResourceExternalId());
response = loanTransactionHelper.getLoanTransactionDetails((long) loanWithInterestId, payChargeExternalIdStr);
assertEquals(payChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, payChargeResult.getSubResourceId());
assertEquals(payChargeExternalIdStr, response.getExternalId());
response = loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, payChargeExternalIdStr);
assertEquals(payChargeExternalIdStr, response.getExternalId());
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(requestSpec, responseSpec, 50, false);
}
@Test
public void negativeTest() {
// INIT
final Account assetAccount = this.accountHelper.createAssetAccount();
final Account assetFeeAndPenaltyAccount = this.accountHelper.createAssetAccount();
final Account incomeAccount = this.accountHelper.createIncomeAccount();
final Account expenseAccount = this.accountHelper.createExpenseAccount();
final Account overpaymentAccount = this.accountHelper.createLiabilityAccount();
final String loanProductJSON = new LoanProductTestBuilder().withPrincipal("1000").withRepaymentTypeAsMonth()
.withRepaymentAfterEvery("1").withNumberOfRepayments("1").withRepaymentTypeAsMonth().withinterestRatePerPeriod("0")
.withInterestRateFrequencyTypeAsMonths().withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat()
.withAccountingRulePeriodicAccrual(new Account[] { assetAccount, incomeAccount, expenseAccount, overpaymentAccount })
.withDaysInMonth("30").withDaysInYear("365").withMoratorium("0", "0")
.withFeeAndPenaltyAssetAccount(assetFeeAndPenaltyAccount).build(null);
final Integer loanProductID = this.loanTransactionHelper.getLoanProductId(loanProductJSON);
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
String loanExternalIdStr = UUID.randomUUID().toString();
final HashMap loan = applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr);
Integer loanId = (Integer) loan.get("resourceId");
this.loanTransactionHelper.approveLoan("02 September 2022", loanId);
String txnExternalIdStr = UUID.randomUUID().toString();
final HashMap disbursedLoanResult = this.loanTransactionHelper.disburseLoan("03 September 2022", loanId, "1000", txnExternalIdStr);
// Check whether the provided external id was retrieved
assertEquals(txnExternalIdStr, disbursedLoanResult.get("subResourceExternalId"));
// Second loan
final HashMap loan2 = applyForLoanApplication(client.getClientId().intValue(), loanProductID, null);
Integer loan2Id = (Integer) loan2.get("resourceId");
this.loanTransactionHelper.approveLoan("02 September 2022", loan2Id);
final HashMap disbursedLoan2Result = this.loanTransactionHelper.disburseLoan("03 September 2022", loan2Id, "1000", null);
Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", true));
LocalDate targetDate = LocalDate.of(2022, 9, 7);
final String penaltyCharge1AddedDate = dateFormatter.format(targetDate);
String penalty1LoanChargeExternalId = UUID.randomUUID().toString();
Integer penalty1LoanChargeId = this.loanTransactionHelper.addChargesForLoan(loan2Id,
LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penalty), penaltyCharge1AddedDate, "10",
penalty1LoanChargeExternalId));
// NEGATIVE SCENARIOS
// GET
CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper
.retrieveTransactionTemplate("randomNonExistingLoanExternalId", "disburse", null, null, null));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper
.getLoanTransactionDetails("randomNonExistingLoanExternalId", "randomNonExistingLoanTransactionExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper
.getLoanTransactionDetails(loanExternalIdStr, "randomNonExistingLoanTransactionExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.transaction.external.id.invalid"));
// POST
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper
.makeChargeRefund("randomNonExistingLoanExternalId", new PostLoansLoanIdTransactionsRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.adjustLoanTransaction("randomNonExistingLoanExternalId",
"randomNonExistingLoanTransactionExternalId", new PostLoansLoanIdTransactionsTransactionIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper.adjustLoanTransaction(loanExternalIdStr,
"randomNonExistingLoanTransactionExternalId", new PostLoansLoanIdTransactionsTransactionIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.transaction.external.id.invalid"));
// PUT
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.undoWaiveLoanCharge("randomNonExistingLoanExternalId",
"randomNonExistingLoanTransactionExternalId", new PutChargeTransactionChangesRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper.undoWaiveLoanCharge(loanExternalIdStr,
"randomNonExistingLoanTransactionExternalId", new PutChargeTransactionChangesRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.transaction.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanCharges("randomNonExistingLoanExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanChargeTemplate("randomNonExistingLoanExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanCharge("randomNonExistingLoanExternalId", "randomNonExistingLoanChargeExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanCharge(-1L, (long) penalty1LoanChargeId));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.id.invalid.for.given.loan"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanCharge(loanExternalIdStr, (long) penalty1LoanChargeId));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.id.invalid.for.given.loan"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.getLoanCharge(loanExternalIdStr, "randomNonExistingLoanChargeExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.payLoanCharge("randomNonExistingLoanExternalId", "randomNonExistingLoanChargeExternalId",
new PostLoansLoanIdChargesChargeIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper.payLoanCharge(loanExternalIdStr,
"randomNonExistingLoanChargeExternalId", new PostLoansLoanIdChargesChargeIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.updateLoanCharge("randomNonExistingLoanExternalId",
"randomNonExistingLoanChargeExternalId", new PutLoansLoanIdChargesChargeIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper.updateLoanCharge(loanExternalIdStr,
"randomNonExistingLoanChargeExternalId", new PutLoansLoanIdChargesChargeIdRequest()));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class, () -> this.loanTransactionHelper
.deleteLoanCharge("randomNonExistingLoanExternalId", "randomNonExistingLoanChargeExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loan.external.id.invalid"));
exception = assertThrows(CallFailedRuntimeException.class,
() -> this.loanTransactionHelper.deleteLoanCharge(loanExternalIdStr, "randomNonExistingLoanChargeExternalId"));
assertEquals(404, exception.getResponse().code());
assertTrue(exception.getMessage().contains("error.msg.loanCharge.external.id.invalid"));
}
@Test
public void loan() {
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(requestSpec, responseSpec, 50, true);
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
new BusinessDateHelper().updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
.date("2022.10.10").dateFormat("yyyy.MM.dd").locale("en"));
try {
ArrayList<Integer> rangeIds = new ArrayList<>();
// First Range
String jsonRange = DelinquencyRangesHelper.getAsJSON(1, 3);
PostDelinquencyRangeResponse delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec,
responseSpec, jsonRange);
rangeIds.add(delinquencyRangeResponse.getResourceId());
jsonRange = DelinquencyRangesHelper.getAsJSON(4, 60);
GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec,
delinquencyRangeResponse.getResourceId());
// Second Range
delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange);
rangeIds.add(delinquencyRangeResponse.getResourceId());
String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds);
PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec,
responseSpec, jsonBucket);
final String loanProductJSON = new LoanProductTestBuilder().withPrincipal("1000").withRepaymentTypeAsMonth()
.withRepaymentAfterEvery("1").withNumberOfRepayments("1").withRepaymentTypeAsMonth().withinterestRatePerPeriod("0")
.withInterestRateFrequencyTypeAsMonths().withAmortizationTypeAsEqualPrincipalPayment()
.withInterestTypeAsDecliningBalance().withAccountingRuleAsNone()
.withInterestCalculationPeriodTypeAsRepaymentPeriod(true).withDaysInMonth("30").withDaysInYear("365")
.withMoratorium("0", "0").withDelinquencyBucket(delinquencyBucketResponse.getResourceId())
.withInArrearsTolerance("1001").withMultiDisburse().withDisallowExpectedDisbursements(true).build(null);
final Integer loanProductID = this.loanTransactionHelper.getLoanProductId(loanProductJSON);
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
String loanExternalIdStr = UUID.randomUUID().toString();
final HashMap loan = applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr);
Integer loanId = (Integer) loan.get("resourceId");
String resourceExternalId = (String) loan.get("resourceExternalId");
assertEquals(loanExternalIdStr, resourceExternalId);
LocalDate actualDate = LocalDate.of(2022, 10, 10);
GetLoansApprovalTemplateResponse loanApprovalResult = this.loanTransactionHelper.getLoanApprovalTemplate(loanExternalIdStr);
assertEquals(actualDate, loanApprovalResult.getApprovalDate());
assertEquals(1000.0, loanApprovalResult.getApprovalAmount());
assertEquals(1000.0, loanApprovalResult.getNetDisbursalAmount());
GetLoansLoanIdResponse loanDetailsResult = this.loanTransactionHelper.getLoanDetails(loanExternalIdStr);
assertEquals(loanExternalIdStr, loanDetailsResult.getExternalId());
this.loanTransactionHelper.approveLoan("02 September 2022", loanId);
String txnExternalIdStr = UUID.randomUUID().toString();
final HashMap disbursedLoanResult = this.loanTransactionHelper.disburseLoan("03 September 2022", loanId, "1000",
txnExternalIdStr);
// Check whether the provided external id was retrieved
assertEquals(txnExternalIdStr, disbursedLoanResult.get("subResourceExternalId"));
String txnExternalIdStr2 = UUID.randomUUID().toString();
final HashMap disbursedLoanResult2 = this.loanTransactionHelper.disburseLoan("04 September 2022", loanId, "1000",
txnExternalIdStr2);
// Check whether the provided external id was retrieved
assertEquals(txnExternalIdStr2, disbursedLoanResult2.get("subResourceExternalId"));
PutLoansLoanIdResponse markLoanAsFraudResult = this.loanTransactionHelper.modifyLoanApplication(loanExternalIdStr,
"markAsFraud", new PutLoansLoanIdRequest().fraud(true));
assertEquals(loanExternalIdStr, markLoanAsFraudResult.getResourceExternalId());
List<GetDelinquencyTagHistoryResponse> delinquencyTagHistoryResponseResult = this.loanTransactionHelper
.getLoanDelinquencyTags(loanExternalIdStr);
assertEquals(1, delinquencyTagHistoryResponseResult.size());
assertEquals((long) loanId, delinquencyTagHistoryResponseResult.get(0).getLoanId());
String loanExternalIdStr2 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr2);
PutLoansLoanIdResponse modifyLoanApplicationResult = this.loanTransactionHelper.modifyLoanApplication(loanExternalIdStr2,
"modify",
new PutLoansLoanIdRequest().submittedOnDate("31 August 2022").dateFormat("dd MMMM yyyy").locale("en")
.loanType("individual").productId(loanProductID.longValue()).clientId(client.getClientId()).interestType(0)
.interestCalculationPeriodType(1).interestRatePerPeriod(BigDecimal.ZERO).isEqualAmortization(false)
.loanTermFrequency(30).loanTermFrequencyType(0).maxOutstandingLoanBalance(10000L).numberOfRepayments(1)
.principal(10000L).repaymentEvery(30).repaymentFrequencyType(0)
.transactionProcessingStrategyCode("mifos-standard-strategy").expectedDisbursementDate("2 September 2022")
.amortizationType(1));
assertEquals(loanExternalIdStr2, modifyLoanApplicationResult.getResourceExternalId());
DeleteLoansLoanIdResponse deleteLoanApplicationResult = this.loanTransactionHelper.deleteLoanApplication(loanExternalIdStr2);
assertEquals(loanExternalIdStr2, deleteLoanApplicationResult.getResourceExternalId());
String loanExternalIdStr3 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr3);
PostLoansLoanIdResponse result = this.loanTransactionHelper.rejectLoan(loanExternalIdStr3,
new PostLoansLoanIdRequest().rejectedOnDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr3, result.getResourceExternalId());
String loanExternalIdStr4 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr4);
result = this.loanTransactionHelper.withdrawnByApplicantLoan(loanExternalIdStr4,
new PostLoansLoanIdRequest().withdrawnOnDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr4, result.getResourceExternalId());
String loanExternalIdStr5 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr5);
this.loanTransactionHelper.approveLoan(loanExternalIdStr5,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
result = this.loanTransactionHelper.disburseLoan(loanExternalIdStr5,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
// It's commented out for now, till it got fixed to return the loan externalId as well
// assertEquals(loanExternalIdStr5, result.getResourceExternalId());
String loanExternalIdStr6 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr6);
this.loanTransactionHelper.approveLoan(loanExternalIdStr6,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
result = this.loanTransactionHelper.undoApprovalLoan(loanExternalIdStr6, new PostLoansLoanIdRequest());
assertEquals(loanExternalIdStr6, result.getResourceExternalId());
final Integer savingsId = SavingsAccountHelper.openSavingsAccount(this.requestSpec, this.responseSpec,
client.getClientId().intValue(), "10000.0");
String loanExternalIdStr7 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr7, savingsId.toString());
this.loanTransactionHelper.approveLoan(loanExternalIdStr7,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
result = this.loanTransactionHelper.disburseToSavingsLoan(loanExternalIdStr7,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr7, result.getResourceExternalId());
String loanExternalIdStr8 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr8);
this.loanTransactionHelper.approveLoan(loanExternalIdStr8,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr8,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
result = this.loanTransactionHelper.undoDisbursalLoan(loanExternalIdStr8, new PostLoansLoanIdRequest());
assertEquals(loanExternalIdStr8, result.getResourceExternalId());
String loanExternalIdStr9 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr9);
this.loanTransactionHelper.approveLoan(loanExternalIdStr9,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr9,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr9,
new PostLoansLoanIdRequest().actualDisbursementDate("3 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
result = this.loanTransactionHelper.undoLastDisbursalLoan(loanExternalIdStr9, new PostLoansLoanIdRequest());
assertEquals(loanExternalIdStr9, result.getResourceExternalId());
Integer loanOfficerId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
String loanExternalIdStr10 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr10);
result = this.loanTransactionHelper.assignLoanOfficerLoan(loanExternalIdStr10, new PostLoansLoanIdRequest()
.assignmentDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy").toLoanOfficerId(loanOfficerId));
assertEquals(loanExternalIdStr10, result.getResourceExternalId());
result = this.loanTransactionHelper.unassignLoanOfficerLoan(loanExternalIdStr10,
new PostLoansLoanIdRequest().unassignedDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr10, result.getResourceExternalId());
String loanExternalIdStr11 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr11);
result = this.loanTransactionHelper.recoverGuaranteesLoan(loanExternalIdStr11, new PostLoansLoanIdRequest());
assertEquals(loanExternalIdStr11, result.getResourceExternalId());
String loanExternalIdStr12 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr12);
result = this.loanTransactionHelper.assignDelinquencyLoan(loanExternalIdStr12, new PostLoansLoanIdRequest());
assertEquals(loanExternalIdStr12, result.getResourceExternalId());
String loanExternalIdStr13 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr13);
result = this.loanTransactionHelper.approveLoan(loanExternalIdStr13,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr13, result.getResourceExternalId());
PostLoansLoanIdTransactionsResponse closeRescheduleResult = this.loanTransactionHelper.closeRescheduledLoan(loanExternalIdStr13,
new PostLoansLoanIdTransactionsRequest().transactionDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr13, closeRescheduleResult.getResourceExternalId());
String loanExternalIdStr14 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr14);
String transactionExternalId = UUID.randomUUID().toString();
result = this.loanTransactionHelper.approveLoan(loanExternalIdStr14,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr14, result.getResourceExternalId());
this.loanTransactionHelper.disburseLoan(loanExternalIdStr14,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
PostLoansLoanIdTransactionsResponse closeResult = this.loanTransactionHelper.closeLoan(loanExternalIdStr14,
new PostLoansLoanIdTransactionsRequest().transactionDate("3 September 2022").locale("en").dateFormat("dd MMMM yyyy")
.externalId(transactionExternalId));
assertEquals(transactionExternalId, closeResult.getResourceExternalId());
String loanExternalIdStr15 = UUID.randomUUID().toString();
String transactionExternalId2 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr15);
result = this.loanTransactionHelper.approveLoan(loanExternalIdStr15,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr15,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
assertEquals(loanExternalIdStr15, result.getResourceExternalId());
PostLoansLoanIdTransactionsResponse forecloseResult = this.loanTransactionHelper.forecloseLoan(loanExternalIdStr15,
new PostLoansLoanIdTransactionsRequest().transactionDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy")
.externalId(transactionExternalId2));
assertEquals(transactionExternalId2, forecloseResult.getResourceExternalId());
String loanExternalIdStr16 = UUID.randomUUID().toString();
String transactionExternalId3 = UUID.randomUUID().toString();
applyForLoanApplication(client.getClientId().intValue(), loanProductID, loanExternalIdStr16);
this.loanTransactionHelper.approveLoan(loanExternalIdStr16,
new PostLoansLoanIdRequest().approvedOnDate("2 September 2022").approvedLoanAmount(new BigDecimal("1000"))
.expectedDisbursementDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr16,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
this.loanTransactionHelper.disburseLoan(loanExternalIdStr16,
new PostLoansLoanIdRequest().actualDisbursementDate("2 September 2022").transactionAmount(new BigDecimal("1000"))
.locale("en").dateFormat("dd MMMM yyyy"));
PostLoansLoanIdTransactionsResponse chargeOffResult = this.loanTransactionHelper.chargeOffLoan(loanExternalIdStr16,
new PostLoansLoanIdTransactionsRequest().transactionDate("2 September 2022").locale("en").dateFormat("dd MMMM yyyy")
.externalId(transactionExternalId3));
assertEquals(transactionExternalId3, chargeOffResult.getResourceExternalId());
} finally {
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(requestSpec, responseSpec, 50, false);
}
}
private HashMap applyForLoanApplication(final Integer clientID, final Integer loanProductID, final String externalId,
final String linkAccountId) {
final String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal("1000").withLoanTermFrequency("1")
.withLoanTermFrequencyAsMonths().withNumberOfRepayments("1").withRepaymentEveryAfter("1")
.withRepaymentFrequencyTypeAsMonths().withInterestRatePerPeriod("0").withInterestTypeAsFlatBalance()
.withAmortizationTypeAsEqualPrincipalPayments().withInterestCalculationPeriodTypeSameAsRepaymentPeriod()
.withExpectedDisbursementDate("03 September 2022").withSubmittedOnDate("01 September 2022").withLoanType("individual")
.withExternalId(externalId).build(clientID.toString(), loanProductID.toString(), linkAccountId);
return (HashMap) this.loanTransactionHelper.createLoanAccount(loanApplicationJSON, "");
}
private HashMap applyForLoanApplication(final Integer clientID, final Integer loanProductID, final String externalId) {
final String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal("1000").withLoanTermFrequency("1")
.withLoanTermFrequencyAsMonths().withNumberOfRepayments("1").withRepaymentEveryAfter("1")
.withRepaymentFrequencyTypeAsMonths().withInterestRatePerPeriod("0").withInterestTypeAsFlatBalance()
.withAmortizationTypeAsEqualPrincipalPayments().withInterestCalculationPeriodTypeSameAsRepaymentPeriod()
.withExpectedDisbursementDate("03 September 2022").withSubmittedOnDate("01 September 2022").withLoanType("individual")
.withInArrearsTolerance("1001").withExternalId(externalId).build(clientID.toString(), loanProductID.toString(), null);
return (HashMap) this.loanTransactionHelper.createLoanAccount(loanApplicationJSON, "");
}
}