From fb6e78fa2bde21b8c30665d0a96d3eca55791876 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Wed, 12 Apr 2023 11:27:41 +0200 Subject: [PATCH] FINERACT-1724: Improve reliability of integration tests --- .../InternalLoanInformationApiResource.java | 24 +- .../api/LoansApiResourceSwagger.java | 4 +- .../loanaccount/domain/LoanRepository.java | 4 + .../domain/LoanRepositoryWrapper.java | 4 + .../AccountNumberPreferencesTest.java | 3 + .../integrationtests/AccountTransferTest.java | 3 + .../AccountingScenarioIntegrationTest.java | 3 + .../integrationtests/BatchApiTest.java | 3 + ...ientLoanChargeExternalIntegrationTest.java | 3 + ...ClientLoanChargeRefundIntegrationTest.java | 3 + ...RefundandRepaymentTypeIntegrationTest.java | 3 + .../ClientLoanIntegrationTest.java | 680 +++++++++--------- ...nMultipleDisbursementsIntegrationTest.java | 3 + ...eMultipleDisbursementsIntegrationTest.java | 3 + .../ClientSavingsIntegrationTest.java | 2 + .../ConcurrencyIntegrationTest.java | 3 + ...linquencyAndChargebackIntegrationTest.java | 390 +++++----- .../DelinquencyBucketsIntegrationTest.java | 611 ++++++++-------- .../DisbursalAndRepaymentScheduleTest.java | 3 + ...teRespectiveLoanRepaymentScheduleTest.java | 3 + .../ExternalIdSupportIntegrationTest.java | 4 + .../GroupLoanIntegrationTest.java | 3 + .../fineract/integrationtests/GroupTest.java | 3 + ...countArrearsAgeingCOBBusinessStepTest.java | 111 +-- ...tCreditRefundPayoutWithChargebackTest.java | 3 + .../LoanAccountFraudTest.java | 3 + .../LoanAccountOverpaidDateStatusTest.java | 142 ++-- .../LoanApplicationApprovalTest.java | 3 + ...ductWithPeriodicAccrualAccountingTest.java | 3 + .../LoanApplicationUndoLastTrancheTest.java | 3 + .../LoanAuditingIntegrationTest.java | 3 + .../LoanChargeOffAccountingTest.java | 3 + .../LoanChargeSpecificDueDateTest.java | 218 +++--- .../LoanDisbursalDateValidationTest.java | 3 + ...oanDisbursementDetailsIntegrationTest.java | 3 + ...edPrincipalPercentageAmortizationTest.java | 3 + .../LoanPayOffAddChargeWithRefundTest.java | 3 + ...RepaymentRescheduleAtDisbursementTest.java | 3 + ...nRescheduleOnDecliningBalanceLoanTest.java | 3 + .../LoanRescheduleRequestTest.java | 3 + .../LoanRescheduleWithAdvancePaymentTest.java | 3 + .../LoanReschedulingWithinCenterTest.java | 19 +- ...pecificDueDateChargeAfterMaturityTest.java | 3 + ...oanTransactionAuditingIntegrationTest.java | 3 + .../LoanTransactionChargebackTest.java | 249 +++---- ...llAmountChargebackForOverpaidLoanTest.java | 3 + ...nTransactionReverseReplayRelationTest.java | 3 + .../LoanTransactionSummaryTest.java | 3 + ...iveInterestAndWriteOffIntegrationTest.java | 3 + ...anWithdrawnByApplicantIntegrationTest.java | 3 + ...BetweenDisbursalAndFirstRepaymentTest.java | 3 + .../fineract/integrationtests/NotesTest.java | 3 + .../RepaymentWithPostDatedChecksTest.java | 3 + ...ingsInterestPostingJobIntegrationTest.java | 2 + .../SchedulerJobsTestResults.java | 319 ++++---- .../SkipRepaymentOnMonthFirstTest.java | 3 + .../common/GlobalConfigurationHelper.java | 4 +- .../common/ProvisioningIntegrationTest.java | 3 + .../common/SchedulerJobHelper.java | 19 +- .../loans/LoanTestLifecycleExtension.java | 79 ++ .../common/loans/LoanTransactionHelper.java | 16 +- .../EntityDatatableChecksIntegrationTest.java | 3 + .../datatable/DatatableIntegrationTest.java | 3 + .../guarantor/GuarantorTest.java | 3 + .../inlinecob/InlineLoanCOBTest.java | 454 ++++++------ .../VariableInstallmentsIntegrationTest.java | 3 + 66 files changed, 1934 insertions(+), 1556 deletions(-) create mode 100644 integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java index 30c0c472b..3a02ae5ea 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java @@ -24,6 +24,7 @@ import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsCons import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_DATE; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -55,7 +56,8 @@ public class InternalLoanInformationApiResource implements InitializingBean { private final LoanRepositoryWrapper loanRepositoryWrapper; private final LoanTransactionRepository loanTransactionRepository; - private final ToApiJsonSerializer toApiJsonSerializer; + private final ToApiJsonSerializer toApiJsonSerializerForMap; + private final ToApiJsonSerializer toApiJsonSerializerForList; private final ApiRequestParameterHelper apiRequestParameterHelper; @Override @@ -86,7 +88,7 @@ public class InternalLoanInformationApiResource implements InitializingBean { Map.of(CREATED_BY, loan.getCreatedBy().orElse(null), CREATED_DATE, loan.getCreatedDate().orElse(null), LAST_MODIFIED_BY, loan.getLastModifiedBy().orElse(null), LAST_MODIFIED_DATE, loan.getLastModifiedDate().orElse(null))); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, auditFields); + return this.toApiJsonSerializerForMap.serialize(settings, auditFields); } @GET @@ -106,6 +108,22 @@ public class InternalLoanInformationApiResource implements InitializingBean { transaction.getCreatedDate().orElse(null), LAST_MODIFIED_BY, transaction.getLastModifiedBy().orElse(null), LAST_MODIFIED_DATE, transaction.getLastModifiedDate().orElse(null))); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, auditFields); + return this.toApiJsonSerializerForMap.serialize(settings, auditFields); + } + + @GET + @Path("status/{statusId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String getLoansByStatus(@Context final UriInfo uriInfo, @PathParam("statusId") Integer statusId) { + log.warn("------------------------------------------------------------"); + log.warn(" "); + log.warn("Fetching loans by status {}", statusId); + log.warn(" "); + log.warn("------------------------------------------------------------"); + + final List loanIds = loanRepositoryWrapper.findLoanIdsByStatusId(statusId); + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + return this.toApiJsonSerializerForList.serialize(settings, loanIds); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java index fffa8beb4..96bf96f27 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java @@ -421,7 +421,7 @@ final class LoansApiResourceSwagger { @Schema(example = "1") public Integer id; @Schema(example = "000000001") - public Long accountNo; + public String accountNo; } static final class GetLoansLoanIdOverdueCharges { @@ -993,7 +993,7 @@ final class LoansApiResourceSwagger { @Schema(example = "95174ff9-1a75-4d72-a413-6f9b1cb988b7") public String externalId; @Schema(example = "000000001") - public Long accountNo; + public String accountNo; public GetLoansLoanIdStatus status; @Schema(example = "false") public boolean disallowExpectedDisbursements; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java index 8204618c7..7fdcc8707 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java @@ -98,6 +98,8 @@ public interface LoanRepository extends JpaRepository, JpaSpecificat String FIND_ALL_STAYED_LOCKED_BY_COB_BUSINESS_DATE = "select loan.id, loan.externalId, loan.accountNumber from LoanAccountLock lock left join Loan loan on lock.loanId = loan.id where lock.lockPlacedOnCobBusinessDate = :cobBusinessDate"; + String FIND_ALL_LOAN_IDS_BY_STATUS_ID = "SELECT loan.id FROM Loan loan WHERE loan.loanStatus = :statusId"; + @Query(FIND_GROUP_LOANS_DISBURSED_AFTER) List getGroupLoansDisbursedAfter(@Param("disbursementDate") LocalDate disbursementDate, @Param("groupId") Long groupId, @Param("loanType") Integer loanType); @@ -215,4 +217,6 @@ public interface LoanRepository extends JpaRepository, JpaSpecificat @Query(FIND_ALL_STAYED_LOCKED_BY_COB_BUSINESS_DATE) List findAllStayedLockedByCobBusinessDate(@Param("cobBusinessDate") LocalDate cobBusinessDate); + @Query(FIND_ALL_LOAN_IDS_BY_STATUS_ID) + List findLoanIdByStatusId(@Param("statusId") Integer statusId); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java index 07b479af5..497335802 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java @@ -258,4 +258,8 @@ public class LoanRepositoryWrapper { public Long findIdByExternalId(ExternalId externalId) { return this.repository.findIdByExternalId(externalId); } + + public List findLoanIdsByStatusId(Integer statusId) { + return repository.findLoanIdByStatusId(statusId); + } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountNumberPreferencesTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountNumberPreferencesTest.java index cf9bca7ec..e43f39d99 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountNumberPreferencesTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountNumberPreferencesTest.java @@ -38,6 +38,7 @@ import org.apache.fineract.integrationtests.common.OfficeHelper; import org.apache.fineract.integrationtests.common.Utils; 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.savings.SavingsAccountHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; @@ -46,9 +47,11 @@ import org.apache.fineract.integrationtests.common.system.CodeHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class AccountNumberPreferencesTest { private static final Logger LOG = LoggerFactory.getLogger(AccountNumberPreferencesTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountTransferTest.java index 110901d6f..6b680a571 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountTransferTest.java @@ -44,6 +44,7 @@ import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.savings.AccountTransferHelper; import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper; @@ -53,6 +54,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,6 +62,7 @@ import org.slf4j.LoggerFactory; * JUnit Test Cases for Account Transfer for. */ @SuppressWarnings({ "rawtypes", "unused" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class AccountTransferTest { private static final Logger LOG = LoggerFactory.getLogger(AccountTransferTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java index daf273487..f9f72b8cf 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java @@ -60,6 +60,7 @@ import org.apache.fineract.integrationtests.common.fixeddeposit.FixedDepositProd import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.recurringdeposit.RecurringDepositAccountHelper; import org.apache.fineract.integrationtests.common.recurringdeposit.RecurringDepositAccountStatusChecker; @@ -70,10 +71,12 @@ import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class AccountingScenarioIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(AccountingScenarioIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java index 0cf426f88..3e55560c3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java @@ -52,6 +52,7 @@ import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.charges.ChargesHelper; 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.savings.SavingsAccountHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; @@ -63,6 +64,7 @@ import org.apache.http.HttpStatus; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,6 +77,7 @@ import org.slf4j.LoggerFactory; * @see org.apache.fineract.integrationtests.common.BatchHelper * @see org.apache.fineract.batch.domain.BatchRequest */ +@ExtendWith(LoanTestLifecycleExtension.class) public class BatchApiTest { private static final Logger LOG = LoggerFactory.getLogger(BatchApiTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeExternalIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeExternalIntegrationTest.java index 4e52851d7..d2b65ddfe 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeExternalIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeExternalIntegrationTest.java @@ -34,14 +34,17 @@ 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.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanChargeExternalIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientLoanChargeExternalIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeRefundIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeRefundIntegrationTest.java index bfc707771..34587fcc9 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeRefundIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeRefundIntegrationTest.java @@ -45,14 +45,17 @@ 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.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanChargeRefundIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientLoanChargeRefundIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest.java index 19bc77cda..957398347 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest.java @@ -39,14 +39,17 @@ import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientLoanCreditBalanceRefundandRepaymentTypeIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java index 1798bab2d..04884c44f 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java @@ -91,6 +91,7 @@ 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.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.savings.AccountTransferHelper; import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper; @@ -103,6 +104,7 @@ import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -111,6 +113,7 @@ import org.slf4j.LoggerFactory; * repayments and verifying accounting transactions */ @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanIntegrationTest { public static final String MINIMUM_OPENING_BALANCE = "1000.0"; @@ -6282,392 +6285,395 @@ public class ClientLoanIntegrationTest { @Test public void chargeAdjustmentAccountingValidation() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()).date("2022.11.01") - .dateFormat("yyyy.MM.dd").locale("en")); - 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 PostGLAccountsResponse uniqueIncomeAccountForFee = this.accountHelper.createGLAccount(new PostGLAccountsRequest() - .type(GLAccountType.INCOME.getValue()) - .glCode(Utils.uniqueRandomStringGenerator("UNIQUE_FEE_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)) - .manualEntriesAllowed(true) - .name(Utils.uniqueRandomStringGenerator("UNIQUE_FEE_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)).usage(1)); - final PostGLAccountsResponse uniqueIncomeAccountForPenalty = this.accountHelper.createGLAccount(new PostGLAccountsRequest() - .type(GLAccountType.INCOME.getValue()) - .glCode(Utils.uniqueRandomStringGenerator("UNIQUE_PENALTY_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)) - .manualEntriesAllowed(true) - .name(Utils.uniqueRandomStringGenerator("UNIQUE_PENALTY_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)).usage(1)); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) + .date("2022.11.01").dateFormat("yyyy.MM.dd").locale("en")); + 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 PostGLAccountsResponse uniqueIncomeAccountForFee = this.accountHelper.createGLAccount(new PostGLAccountsRequest() + .type(GLAccountType.INCOME.getValue()) + .glCode(Utils.uniqueRandomStringGenerator("UNIQUE_FEE_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)) + .manualEntriesAllowed(true) + .name(Utils.uniqueRandomStringGenerator("UNIQUE_FEE_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)).usage(1)); + final PostGLAccountsResponse uniqueIncomeAccountForPenalty = this.accountHelper.createGLAccount(new PostGLAccountsRequest() + .type(GLAccountType.INCOME.getValue()) + .glCode(Utils.uniqueRandomStringGenerator("UNIQUE_PENALTY_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)) + .manualEntriesAllowed(true) + .name(Utils.uniqueRandomStringGenerator("UNIQUE_PENALTY_INCOME" + Calendar.getInstance().getTimeInMillis(), 5)) + .usage(1)); - PostChargesResponse penaltyCharge = chargesHelper.createCharges(new PostChargesRequest().penalty(true).amount(10.0) - .chargeCalculationType(ChargeCalculationType.FLAT.getValue()).chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE.getValue()) - .chargePaymentMode(ChargePaymentMode.REGULAR.getValue()).currencyCode("USD") - .name(Utils.randomStringGenerator("PENALTY_" + Calendar.getInstance().getTimeInMillis(), 5)).chargeAppliesTo(1).locale("en") - .active(true)); + PostChargesResponse penaltyCharge = chargesHelper.createCharges(new PostChargesRequest().penalty(true).amount(10.0) + .chargeCalculationType(ChargeCalculationType.FLAT.getValue()) + .chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE.getValue()).chargePaymentMode(ChargePaymentMode.REGULAR.getValue()) + .currencyCode("USD").name(Utils.randomStringGenerator("PENALTY_" + Calendar.getInstance().getTimeInMillis(), 5)) + .chargeAppliesTo(1).locale("en").active(true)); - PostChargesResponse feeCharge = chargesHelper.createCharges(new PostChargesRequest().penalty(false).amount(9.0) - .chargeCalculationType(ChargeCalculationType.FLAT.getValue()).chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE.getValue()) - .chargePaymentMode(ChargePaymentMode.REGULAR.getValue()).currencyCode("USD") - .name(Utils.randomStringGenerator("FEE_" + Calendar.getInstance().getTimeInMillis(), 5)).chargeAppliesTo(1).locale("en") - .active(true)); + PostChargesResponse feeCharge = chargesHelper.createCharges(new PostChargesRequest().penalty(false).amount(9.0) + .chargeCalculationType(ChargeCalculationType.FLAT.getValue()) + .chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE.getValue()).chargePaymentMode(ChargePaymentMode.REGULAR.getValue()) + .currencyCode("USD").name(Utils.randomStringGenerator("FEE_" + Calendar.getInstance().getTimeInMillis(), 5)) + .chargeAppliesTo(1).locale("en").active(true)); - 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") - .withFeeToIncomeAccountMapping(feeCharge.getResourceId(), uniqueIncomeAccountForFee.getResourceId()) - .withPenaltyToIncomeAccountMapping(penaltyCharge.getResourceId(), uniqueIncomeAccountForPenalty.getResourceId()) - .withFeeAndPenaltyAssetAccount(assetFeeAndPenaltyAccount).build(null); - final Integer loanProductID = this.loanTransactionHelper.getLoanProductId(loanProductJSON); + 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") + .withFeeToIncomeAccountMapping(feeCharge.getResourceId(), uniqueIncomeAccountForFee.getResourceId()) + .withPenaltyToIncomeAccountMapping(penaltyCharge.getResourceId(), uniqueIncomeAccountForPenalty.getResourceId()) + .withFeeAndPenaltyAssetAccount(assetFeeAndPenaltyAccount).build(null); + final Integer loanProductID = this.loanTransactionHelper.getLoanProductId(loanProductJSON); - final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()); + final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()); - final Integer loanID = applyForLoanApplication(client.getClientId().intValue(), loanProductID); + final Integer loanID = applyForLoanApplication(client.getClientId().intValue(), loanProductID); - HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - loanStatusHashMap = this.loanTransactionHelper.approveLoan("02 September 2022", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap); + loanStatusHashMap = this.loanTransactionHelper.approveLoan("02 September 2022", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap); - loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("03 September 2022", loanID, "1000"); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("03 September 2022", loanID, "1000"); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - List loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + List loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - LocalDate targetDate = LocalDate.of(2022, 9, 7); - final String penaltyCharge1AddedDate = dateFormatter.format(targetDate); - Integer penaltyLoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper - .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penaltyCharge.getResourceId()), penaltyCharge1AddedDate, "10")); + LocalDate targetDate = LocalDate.of(2022, 9, 7); + final String penaltyCharge1AddedDate = dateFormatter.format(targetDate); + Integer penaltyLoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper + .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(penaltyCharge.getResourceId()), penaltyCharge1AddedDate, "10")); - final String penalty1LoanChargeDate = dateFormatter.format(targetDate); - this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(penalty1LoanChargeDate); + final String penalty1LoanChargeDate = dateFormatter.format(targetDate); + this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(penalty1LoanChargeDate); - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - List transactions = loanDetails.getTransactions(); - assertEquals(10.0, transactions.get(1).getAmount()); - assertTrue(transactions.get(1).getType().getAccrual()); - assertEquals(10.0, transactions.get(1).getPenaltyChargesPortion()); - Long accrualTransactionId = transactions.get(1).getId(); + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + List transactions = loanDetails.getTransactions(); + assertEquals(10.0, transactions.get(1).getAmount()); + assertTrue(transactions.get(1).getType().getAccrual()); + assertEquals(10.0, transactions.get(1).getPenaltyChargesPortion()); + Long accrualTransactionId = transactions.get(1).getId(); - List journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + accrualTransactionId); - assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + List journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + accrualTransactionId); + assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - GetLoansLoanIdSummary loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(1010.0, loanSummary.getTotalOutstanding()); + GetLoansLoanIdSummary loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(1010.0, loanSummary.getTotalOutstanding()); - String externalId = UUID.randomUUID().toString(); - PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, - (long) penaltyLoanChargeId, new PostLoansLoanIdChargesChargeIdRequest().amount(10.0).externalId(externalId)); + String externalId = UUID.randomUUID().toString(); + PostLoansLoanIdChargesChargeIdResponse chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, + (long) penaltyLoanChargeId, new PostLoansLoanIdChargesChargeIdRequest().amount(10.0).externalId(externalId)); - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - assertEquals(10.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(1010.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + assertEquals(10.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); - loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); - assertEquals(1000.0, loanSummary.getTotalOutstanding()); + loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); + assertEquals(1000.0, loanSummary.getTotalOutstanding()); - transactions = loanDetails.getTransactions(); - assertEquals(10.0, transactions.get(2).getAmount()); - assertTrue(transactions.get(2).getType().getChargeAdjustment()); - assertEquals(10.0, transactions.get(2).getPenaltyChargesPortion()); - Long chargeAdjustmentTransactionId = transactions.get(2).getId(); + transactions = loanDetails.getTransactions(); + assertEquals(10.0, transactions.get(2).getAmount()); + assertTrue(transactions.get(2).getType().getChargeAdjustment()); + assertEquals(10.0, transactions.get(2).getPenaltyChargesPortion()); + Long chargeAdjustmentTransactionId = transactions.get(2).getId(); - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - String uuid = UUID.randomUUID().toString(); - this.loanTransactionHelper.reverseLoanTransaction((long) loanID, chargeAdjustmentTransactionId, - new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy").transactionDate("08 September 2022") - .transactionAmount(0.0).locale("en").reversalExternalId(uuid)); + String uuid = UUID.randomUUID().toString(); + this.loanTransactionHelper.reverseLoanTransaction((long) loanID, chargeAdjustmentTransactionId, + new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat("dd MMMM yyyy").transactionDate("08 September 2022") + .transactionAmount(0.0).locale("en").reversalExternalId(uuid)); - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - assertEquals(10.0f, (float) journalEntries.get(2).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(2).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); - assertEquals(10.0f, (float) journalEntries.get(3).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(3).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(3).get("entryType")).get("value")); + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(10.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(10.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + assertEquals(10.0f, (float) journalEntries.get(2).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(2).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); + assertEquals(10.0f, (float) journalEntries.get(3).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(3).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(3).get("entryType")).get("value")); - targetDate = LocalDate.of(2022, 9, 10); - final String feeCharge1AddedDate = dateFormatter.format(targetDate); - Integer feeLoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper - .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(feeCharge.getResourceId()), feeCharge1AddedDate, "3")); + targetDate = LocalDate.of(2022, 9, 10); + final String feeCharge1AddedDate = dateFormatter.format(targetDate); + Integer feeLoanChargeId = this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper + .getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(feeCharge.getResourceId()), feeCharge1AddedDate, "3")); - final String feeLoanChargeDate = dateFormatter.format(targetDate); - this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(feeLoanChargeDate); + final String feeLoanChargeDate = dateFormatter.format(targetDate); + this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(feeLoanChargeDate); - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - transactions = loanDetails.getTransactions(); - assertEquals(3.0, transactions.get(2).getAmount()); - assertTrue(transactions.get(2).getType().getAccrual()); - assertEquals(3.0, transactions.get(2).getFeeChargesPortion()); - accrualTransactionId = transactions.get(2).getId(); + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + transactions = loanDetails.getTransactions(); + assertEquals(3.0, transactions.get(2).getAmount()); + assertTrue(transactions.get(2).getType().getAccrual()); + assertEquals(3.0, transactions.get(2).getFeeChargesPortion()); + accrualTransactionId = transactions.get(2).getId(); - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + accrualTransactionId); - assertEquals(3.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(3.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + accrualTransactionId); + assertEquals(3.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(3.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(3.0, loanSummary.getFeeChargesCharged()); - assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); - assertEquals(1013.0, loanSummary.getTotalOutstanding()); + loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(10.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(3.0, loanSummary.getFeeChargesCharged()); + assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); + assertEquals(1013.0, loanSummary.getTotalOutstanding()); - loanTransactionHelper.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy") - .transactionDate("11 September 2022").locale("en").transactionAmount(5.0)); + loanTransactionHelper.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy") + .transactionDate("11 September 2022").locale("en").transactionAmount(5.0)); - externalId = UUID.randomUUID().toString(); - chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) feeLoanChargeId, - new PostLoansLoanIdChargesChargeIdRequest().amount(2.0).externalId(externalId)); + externalId = UUID.randomUUID().toString(); + chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) feeLoanChargeId, + new PostLoansLoanIdChargesChargeIdRequest().amount(2.0).externalId(externalId)); - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(7.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); - assertEquals(3.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); - assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalPaid()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(1006.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - assertEquals(7.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(7.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); + assertEquals(3.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); + assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalPaid()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(1006.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + assertEquals(7.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); - loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(3.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(7.0, loanSummary.getPenaltyChargesPaid()); - assertEquals(3.0, loanSummary.getFeeChargesCharged()); - assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); - assertEquals(0.0, loanSummary.getFeeChargesPaid()); - assertEquals(1000.0, loanSummary.getPrincipalOutstanding()); - assertEquals(0.0, loanSummary.getPrincipalPaid()); - assertEquals(7.0, loanSummary.getTotalRepayment()); - assertEquals(1006.0, loanSummary.getTotalOutstanding()); + loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(3.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(7.0, loanSummary.getPenaltyChargesPaid()); + assertEquals(3.0, loanSummary.getFeeChargesCharged()); + assertEquals(3.0, loanSummary.getFeeChargesOutstanding()); + assertEquals(0.0, loanSummary.getFeeChargesPaid()); + assertEquals(1000.0, loanSummary.getPrincipalOutstanding()); + assertEquals(0.0, loanSummary.getPrincipalPaid()); + assertEquals(7.0, loanSummary.getTotalRepayment()); + assertEquals(1006.0, loanSummary.getTotalOutstanding()); - transactions = loanDetails.getTransactions(); - assertEquals(2.0, transactions.get(5).getAmount()); - assertTrue(transactions.get(4).getType().getChargeAdjustment()); - assertEquals(2.0, transactions.get(5).getPenaltyChargesPortion()); - assertEquals(0.0, transactions.get(5).getFeeChargesPortion()); - assertEquals(0.0, transactions.get(5).getPrincipalPortion()); - chargeAdjustmentTransactionId = transactions.get(5).getId(); + transactions = loanDetails.getTransactions(); + assertEquals(2.0, transactions.get(5).getAmount()); + assertTrue(transactions.get(4).getType().getChargeAdjustment()); + assertEquals(2.0, transactions.get(5).getPenaltyChargesPortion()); + assertEquals(0.0, transactions.get(5).getFeeChargesPortion()); + assertEquals(0.0, transactions.get(5).getPrincipalPortion()); + chargeAdjustmentTransactionId = transactions.get(5).getId(); - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(2.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(2.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(2.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(2.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - externalId = UUID.randomUUID().toString(); - chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) penaltyLoanChargeId, - new PostLoansLoanIdChargesChargeIdRequest().amount(7.0).externalId(externalId)); + externalId = UUID.randomUUID().toString(); + chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) penaltyLoanChargeId, + new PostLoansLoanIdChargesChargeIdRequest().amount(7.0).externalId(externalId)); - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); - assertEquals(1.0, loanSchedulePeriods.get(1).getPrincipalPaid()); - assertEquals(999.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(999.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - assertEquals(14.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); + assertEquals(1.0, loanSchedulePeriods.get(1).getPrincipalPaid()); + assertEquals(999.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(999.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + assertEquals(14.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); - loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); - assertEquals(3.0, loanSummary.getFeeChargesCharged()); - assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); - assertEquals(3.0, loanSummary.getFeeChargesPaid()); - assertEquals(999.0, loanSummary.getPrincipalOutstanding()); - assertEquals(1.0, loanSummary.getPrincipalPaid()); - assertEquals(14.0, loanSummary.getTotalRepayment()); - assertEquals(999.0, loanSummary.getTotalOutstanding()); + loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); + assertEquals(3.0, loanSummary.getFeeChargesCharged()); + assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); + assertEquals(3.0, loanSummary.getFeeChargesPaid()); + assertEquals(999.0, loanSummary.getPrincipalOutstanding()); + assertEquals(1.0, loanSummary.getPrincipalPaid()); + assertEquals(14.0, loanSummary.getTotalRepayment()); + assertEquals(999.0, loanSummary.getTotalOutstanding()); - transactions = loanDetails.getTransactions(); - assertEquals(7.0, transactions.get(6).getAmount()); - assertTrue(transactions.get(6).getType().getChargeAdjustment()); - assertEquals(3.0, transactions.get(6).getPenaltyChargesPortion()); - assertEquals(3.0, transactions.get(6).getFeeChargesPortion()); - assertEquals(1.0, transactions.get(6).getPrincipalPortion()); - chargeAdjustmentTransactionId = transactions.get(6).getId(); + transactions = loanDetails.getTransactions(); + assertEquals(7.0, transactions.get(6).getAmount()); + assertTrue(transactions.get(6).getType().getChargeAdjustment()); + assertEquals(3.0, transactions.get(6).getPenaltyChargesPortion()); + assertEquals(3.0, transactions.get(6).getFeeChargesPortion()); + assertEquals(1.0, transactions.get(6).getPrincipalPortion()); + chargeAdjustmentTransactionId = transactions.get(6).getId(); - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(7.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - if (assetAccount.getAccountID() == (int) journalEntries.get(1).get("glAccountId")) { + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(7.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + if (assetAccount.getAccountID() == (int) journalEntries.get(1).get("glAccountId")) { + assertEquals(1.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + + assertEquals(6.0f, (float) journalEntries.get(2).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(2).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); + } else { + assertEquals(1.0f, (float) journalEntries.get(2).get("amount")); + assertEquals(assetAccount.getAccountID(), (int) journalEntries.get(2).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); + + assertEquals(6.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + } + + loanTransactionHelper.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy") + .transactionDate("13 September 2022").locale("en").transactionAmount(998.0)); + + externalId = UUID.randomUUID().toString(); + chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) feeLoanChargeId, + new PostLoansLoanIdChargesChargeIdRequest().amount(1.0).externalId(externalId)); + + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + + loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); + assertEquals(2, loanSchedulePeriods.size()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); + assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); + assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); + assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalPaid()); + assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); + assertEquals(0.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); + assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); + + loanSummary = loanDetails.getSummary(); + assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); + assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); + assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); + assertEquals(3.0, loanSummary.getFeeChargesCharged()); + assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); + assertEquals(3.0, loanSummary.getFeeChargesPaid()); + assertEquals(0.0, loanSummary.getPrincipalOutstanding()); + assertEquals(1000.0, loanSummary.getPrincipalPaid()); + assertEquals(1013.0, loanSummary.getTotalRepayment()); + assertEquals(0.0, loanSummary.getTotalOutstanding()); + + transactions = loanDetails.getTransactions(); + assertEquals(1.0, transactions.get(8).getAmount()); + assertTrue(transactions.get(8).getType().getChargeAdjustment()); + assertEquals(0.0, transactions.get(8).getPenaltyChargesPortion()); + assertEquals(0.0, transactions.get(8).getFeeChargesPortion()); + assertEquals(1.0, transactions.get(8).getPrincipalPortion()); + chargeAdjustmentTransactionId = transactions.get(8).getId(); + + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(1.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); assertEquals(1.0f, (float) journalEntries.get(1).get("amount")); assertEquals(assetAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - assertEquals(6.0f, (float) journalEntries.get(2).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(2).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); - } else { - assertEquals(1.0f, (float) journalEntries.get(2).get("amount")); - assertEquals(assetAccount.getAccountID(), (int) journalEntries.get(2).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(2).get("entryType")).get("value")); + assertTrue(loanDetails.getStatus().getClosedObligationsMet()); - assertEquals(6.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetFeeAndPenaltyAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); + externalId = UUID.randomUUID().toString(); + chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) penaltyLoanChargeId, + new PostLoansLoanIdChargesChargeIdRequest().amount(1.0).externalId(externalId)); + + loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); + + transactions = loanDetails.getTransactions(); + assertEquals(1.0, transactions.get(9).getAmount()); + assertTrue(transactions.get(9).getType().getChargeAdjustment()); + assertEquals(0.0, transactions.get(9).getPenaltyChargesPortion()); + assertEquals(0.0, transactions.get(9).getFeeChargesPortion()); + assertEquals(0.0, transactions.get(9).getPrincipalPortion()); + assertEquals(1.0, transactions.get(9).getOverpaymentPortion()); + chargeAdjustmentTransactionId = transactions.get(9).getId(); + + journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); + assertEquals(1.0f, (float) journalEntries.get(0).get("amount")); + assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); + assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); + assertEquals(1.0f, (float) journalEntries.get(1).get("amount")); + assertEquals(overpaymentAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); + + assertTrue(loanDetails.getStatus().getOverpaid()); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } - - loanTransactionHelper.makeLoanRepayment((long) loanID, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy") - .transactionDate("13 September 2022").locale("en").transactionAmount(998.0)); - - externalId = UUID.randomUUID().toString(); - chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) feeLoanChargeId, - new PostLoansLoanIdChargesChargeIdRequest().amount(1.0).externalId(externalId)); - - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - - loanSchedulePeriods = loanDetails.getRepaymentSchedule().getPeriods(); - assertEquals(2, loanSchedulePeriods.size()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesDue()); - assertEquals(10.0, loanSchedulePeriods.get(1).getPenaltyChargesPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPenaltyChargesOutstanding()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesDue()); - assertEquals(3.0, loanSchedulePeriods.get(1).getFeeChargesPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getFeeChargesOutstanding()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalDue()); - assertEquals(1000.0, loanSchedulePeriods.get(1).getPrincipalPaid()); - assertEquals(0.0, loanSchedulePeriods.get(1).getPrincipalOutstanding()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalDueForPeriod()); - assertEquals(0.0, loanSchedulePeriods.get(1).getTotalOutstandingForPeriod()); - assertEquals(1013.0, loanSchedulePeriods.get(1).getTotalPaidForPeriod()); - - loanSummary = loanDetails.getSummary(); - assertEquals(10.0, loanSummary.getPenaltyChargesCharged()); - assertEquals(0.0, loanSummary.getPenaltyChargesOutstanding()); - assertEquals(10.0, loanSummary.getPenaltyChargesPaid()); - assertEquals(3.0, loanSummary.getFeeChargesCharged()); - assertEquals(0.0, loanSummary.getFeeChargesOutstanding()); - assertEquals(3.0, loanSummary.getFeeChargesPaid()); - assertEquals(0.0, loanSummary.getPrincipalOutstanding()); - assertEquals(1000.0, loanSummary.getPrincipalPaid()); - assertEquals(1013.0, loanSummary.getTotalRepayment()); - assertEquals(0.0, loanSummary.getTotalOutstanding()); - - transactions = loanDetails.getTransactions(); - assertEquals(1.0, transactions.get(8).getAmount()); - assertTrue(transactions.get(8).getType().getChargeAdjustment()); - assertEquals(0.0, transactions.get(8).getPenaltyChargesPortion()); - assertEquals(0.0, transactions.get(8).getFeeChargesPortion()); - assertEquals(1.0, transactions.get(8).getPrincipalPortion()); - chargeAdjustmentTransactionId = transactions.get(8).getId(); - - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(1.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForFee.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(1.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(assetAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - - assertTrue(loanDetails.getStatus().getClosedObligationsMet()); - - externalId = UUID.randomUUID().toString(); - chargeAdjustmentResponse = this.loanTransactionHelper.chargeAdjustment((long) loanID, (long) penaltyLoanChargeId, - new PostLoansLoanIdChargesChargeIdRequest().amount(1.0).externalId(externalId)); - - loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanID); - - transactions = loanDetails.getTransactions(); - assertEquals(1.0, transactions.get(9).getAmount()); - assertTrue(transactions.get(9).getType().getChargeAdjustment()); - assertEquals(0.0, transactions.get(9).getPenaltyChargesPortion()); - assertEquals(0.0, transactions.get(9).getFeeChargesPortion()); - assertEquals(0.0, transactions.get(9).getPrincipalPortion()); - assertEquals(1.0, transactions.get(9).getOverpaymentPortion()); - chargeAdjustmentTransactionId = transactions.get(9).getId(); - - journalEntries = this.journalEntryHelper.getJournalEntriesByTransactionId("L" + chargeAdjustmentTransactionId); - assertEquals(1.0f, (float) journalEntries.get(0).get("amount")); - assertEquals(uniqueIncomeAccountForPenalty.getResourceId().intValue(), (int) journalEntries.get(0).get("glAccountId")); - assertEquals("DEBIT", ((HashMap) journalEntries.get(0).get("entryType")).get("value")); - assertEquals(1.0f, (float) journalEntries.get(1).get("amount")); - assertEquals(overpaymentAccount.getAccountID(), (int) journalEntries.get(1).get("glAccountId")); - assertEquals("CREDIT", ((HashMap) journalEntries.get(1).get("entryType")).get("value")); - - assertTrue(loanDetails.getStatus().getOverpaid()); - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } @Test diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanMultipleDisbursementsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanMultipleDisbursementsIntegrationTest.java index aac19d677..b0201d847 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanMultipleDisbursementsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanMultipleDisbursementsIntegrationTest.java @@ -34,10 +34,12 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +48,7 @@ import org.slf4j.LoggerFactory; * repayments and verifying accounting transactions */ @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanMultipleDisbursementsIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientLoanMultipleDisbursementsIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.java index 2cf2d83ab..5ec7dbdc9 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.java @@ -31,10 +31,12 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,6 +45,7 @@ import org.slf4j.LoggerFactory; * repayments and verifying accounting transactions */ @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ClientLoanNonTrancheMultipleDisbursementsIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java index ae3a20d4d..a29365722 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java @@ -55,6 +55,7 @@ import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,6 +64,7 @@ import org.slf4j.LoggerFactory; * Client Savings Integration Test for checking Savings Application. */ @SuppressWarnings({ "rawtypes" }) +@Order(2) public class ClientSavingsIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ClientSavingsIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ConcurrencyIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ConcurrencyIntegrationTest.java index 6a5e35930..0b1cd78c3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ConcurrencyIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ConcurrencyIntegrationTest.java @@ -40,13 +40,16 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.accounting.Account; 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.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class ConcurrencyIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ConcurrencyIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyAndChargebackIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyAndChargebackIntegrationTest.java index ffc15c978..9160503ce 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyAndChargebackIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyAndChargebackIntegrationTest.java @@ -48,13 +48,16 @@ import org.apache.fineract.integrationtests.common.SchedulerJobHelper; import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class DelinquencyAndChargebackIntegrationTest { private ResponseSpecification responseSpec; @@ -76,244 +79,249 @@ public class DelinquencyAndChargebackIntegrationTest { @Test public void testLoanClassificationStepAsPartOfCOB() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate todaysDate = Utils.getDateAsLocalDate("01 April 2012"); - LocalDate businessDate = todaysDate.minusMonths(3); - log.info("Current Business date {}", businessDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + final LocalDate todaysDate = Utils.getDateAsLocalDate("01 April 2012"); + LocalDate businessDate = todaysDate.minusMonths(3); + log.info("Current Business date {}", businessDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); - // Delinquency Bucket - final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketId); + final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); + // Delinquency Bucket + final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketId); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); - // Older date to have more than one overdue installment - String operationDate = Utils.dateFormatter.format(businessDate); - log.info("Operation date {}", businessDate); + // Older date to have more than one overdue installment + String operationDate = Utils.dateFormatter.format(businessDate); + log.info("Operation date {}", businessDate); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate, "12"); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate, "12"); - // Move the Business date 1 month to apply the first repayment - businessDate = businessDate.plusMonths(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Move the Business date 1 month to apply the first repayment + businessDate = businessDate.plusMonths(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - String amountVal = "100.00"; - Float transactionAmount = Float.valueOf(amountVal); - operationDate = Utils.dateFormatter.format(businessDate); - PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, - transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - Long transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + String amountVal = "100.00"; + Float transactionAmount = Float.valueOf(amountVal); + operationDate = Utils.dateFormatter.format(businessDate); + PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, + transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + Long transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Move the Business date 1 month more to apply the second repayment - businessDate = businessDate.plusMonths(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Move the Business date 1 month more to apply the second repayment + businessDate = businessDate.plusMonths(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - operationDate = Utils.dateFormatter.format(businessDate); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + operationDate = Utils.dateFormatter.format(businessDate); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Get loan details expecting to have not a delinquency classification and 1,000 as Outstanding - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, "0.00", "1000.00", 0, doubleZERO); + // Get loan details expecting to have not a delinquency classification and 1,000 as Outstanding + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, "0.00", "1000.00", 0, doubleZERO); - // Move the Business date n days to apply the chargeback for the previous repayment - businessDate = businessDate.plusDays(21); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Move the Business date n days to apply the chargeback for the previous repayment + businessDate = businessDate.plusDays(21); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Apply the Chargeback transaction - final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amountVal, 0, - responseSpec); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 1); + // Apply the Chargeback transaction + final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amountVal, 0, + responseSpec); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 1); - // Validate the account expecting to have an adjustment for 100.00 and Outstanding 1,100 - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - // Past Due Days in Zero because the Charge back transaction exists and It was done with the current date - validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 0, Double.valueOf("0.00")); + // Validate the account expecting to have an adjustment for 100.00 and Outstanding 1,100 + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + // Past Due Days in Zero because the Charge back transaction exists and It was done with the current date + validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 0, Double.valueOf("0.00")); - // Move the Business date n days to run the COB - businessDate = businessDate.plusDays(14); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Move the Business date n days to run the COB + businessDate = businessDate.plusDays(14); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Run the Loan COB Job - final String jobName = "Loan COB"; - schedulerJobHelper.executeAndAwaitJob(jobName); + // Run the Loan COB Job + final String jobName = "Loan COB"; + schedulerJobHelper.executeAndAwaitJob(jobName); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 14, Double.valueOf("200.00")); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, amountVal, "1100.00", 14, Double.valueOf("200.00")); - // Move the Business date few days to apply the repayment for Chargeback - businessDate = todaysDate.plusDays(4); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Move the Business date few days to apply the repayment for Chargeback + businessDate = todaysDate.plusDays(4); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - operationDate = Utils.dateFormatter.format(businessDate); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + operationDate = Utils.dateFormatter.format(businessDate); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, amountVal, "1000.00", 4, Double.valueOf("100.00")); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, amountVal, "1000.00", 4, Double.valueOf("100.00")); - // Apply a partial repayment - operationDate = Utils.dateFormatter.format(businessDate); - transactionAmount = Float.valueOf("50.00"); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, amountVal, "950.00", 4, Double.valueOf("50.00")); - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + // Apply a partial repayment + operationDate = Utils.dateFormatter.format(businessDate); + transactionAmount = Float.valueOf("50.00"); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, amountVal, "950.00", 4, Double.valueOf("50.00")); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanClassificationStepAsPartOfCOBRepeated() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - List expectedDates = new ArrayList(); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - LocalDate businessDate = LocalDate.parse("2022-01-01", DateUtils.DEFAULT_DATE_FORMATTER); - log.info("Current Business date {}", businessDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + List expectedDates = new ArrayList(); - final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); - // Delinquency Bucket - final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketId); + LocalDate businessDate = LocalDate.parse("2022-01-01", DateUtils.DEFAULT_DATE_FORMATTER); + log.info("Current Business date {}", businessDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); + final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); + // Delinquency Bucket + final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketId); - // Older date to have more than one overdue installment - String operationDate = Utils.dateFormatter.format(businessDate); - log.info("Operation date {}", businessDate); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate, "3"); + // Older date to have more than one overdue installment + String operationDate = Utils.dateFormatter.format(businessDate); + log.info("Operation date {}", businessDate); - // Move the Business date 1 month to apply the first repayment - businessDate = businessDate.plusMonths(1); - expectedDates.add(businessDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate, "3"); - String amountVal = "400.00"; - Float transactionAmount = Float.valueOf(amountVal); - operationDate = Utils.dateFormatter.format(businessDate); - PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, - transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - Long transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + // Move the Business date 1 month to apply the first repayment + businessDate = businessDate.plusMonths(1); + expectedDates.add(businessDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Move the Business date 1 month more to apply the second repayment - businessDate = businessDate.plusMonths(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + String amountVal = "400.00"; + Float transactionAmount = Float.valueOf(amountVal); + operationDate = Utils.dateFormatter.format(businessDate); + PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, + transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + Long transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - operationDate = Utils.dateFormatter.format(businessDate); - expectedDates.add(businessDate); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + // Move the Business date 1 month more to apply the second repayment + businessDate = businessDate.plusMonths(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Get loan details expecting to have not a delinquency classification and 1,000 as Outstanding - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, "0.00", "400.00", 0, doubleZERO); + operationDate = Utils.dateFormatter.format(businessDate); + expectedDates.add(businessDate); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Move the Business date n days to apply the chargeback for the previous repayment - businessDate = businessDate.plusDays(15); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Get loan details expecting to have not a delinquency classification and 1,000 as Outstanding + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, "0.00", "400.00", 0, doubleZERO); - // Apply the Chargeback transaction - final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amountVal, 0, - responseSpec); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 1); + // Move the Business date n days to apply the chargeback for the previous repayment + businessDate = businessDate.plusDays(15); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Validate the account expecting to have an adjustment for 100.00 and Outstanding 1,100 - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - // Past Due Days in Zero because the Charge back transaction exists and It was done with the current date - validateLoanAccount(getLoansLoanIdResponse, amountVal, "800.00", 0, Double.valueOf("0.00")); + // Apply the Chargeback transaction + final Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, amountVal, 0, + responseSpec); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 1); - // Move the Business date n days to run the COB - businessDate = businessDate.plusDays(23); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); + // Validate the account expecting to have an adjustment for 100.00 and Outstanding 1,100 + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + // Past Due Days in Zero because the Charge back transaction exists and It was done with the current date + validateLoanAccount(getLoansLoanIdResponse, amountVal, "800.00", 0, Double.valueOf("0.00")); - // Run the Loan COB Job - final String jobName = "Loan COB"; - schedulerJobHelper.executeAndAwaitJob(jobName); + // Move the Business date n days to run the COB + businessDate = businessDate.plusDays(23); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, amountVal, "800.00", 23, Double.valueOf("800.00")); + // Run the Loan COB Job + final String jobName = "Loan COB"; + schedulerJobHelper.executeAndAwaitJob(jobName); - // Move the Business date few days to apply the repayment for Chargeback - businessDate = LocalDate.parse("2022-03-20", DateUtils.DEFAULT_DATE_FORMATTER); - expectedDates.add(businessDate); - operationDate = Utils.dateFormatter.format(businessDate); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - transactionId = loanIdTransactionsResponse.getResourceId(); - loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, amountVal, "800.00", 23, Double.valueOf("800.00")); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, amountVal, "400.00", 7, Double.valueOf("400.00")); + // Move the Business date few days to apply the repayment for Chargeback + businessDate = LocalDate.parse("2022-03-20", DateUtils.DEFAULT_DATE_FORMATTER); + expectedDates.add(businessDate); + operationDate = Utils.dateFormatter.format(businessDate); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + transactionId = loanIdTransactionsResponse.getResourceId(); + loanTransactionHelper.reviewLoanTransactionRelations(loanId, transactionId, 0); - // Pay the Loan to get this as Closed - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); - assertNotNull(loanIdTransactionsResponse); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertEquals(LoanStatus.CLOSED_OBLIGATIONS_MET.getValue(), getLoansLoanIdResponse.getStatus().getId()); - log.info("Loan id {} with status {}", loanId, getLoansLoanIdResponse.getStatus().getCode()); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, amountVal, "400.00", 7, Double.valueOf("400.00")); - // Evaluate Installments - GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - assertNotNull(getLoanRepaymentSchedule); - log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + // Pay the Loan to get this as Closed + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, transactionAmount, loanId); + assertNotNull(loanIdTransactionsResponse); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertEquals(LoanStatus.CLOSED_OBLIGATIONS_MET.getValue(), getLoansLoanIdResponse.getStatus().getId()); + log.info("Loan id {} with status {}", loanId, getLoansLoanIdResponse.getStatus().getCode()); - for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { - if (period.getPeriod() != null) { - log.info("Period number {} completed on date {}", period.getPeriod(), period.getObligationsMetOnDate()); - assertNotNull(period.getObligationsMetOnDate()); - assertEquals(expectedDates.get(period.getPeriod() - 1), period.getObligationsMetOnDate()); - assertTrue(period.getComplete()); + // Evaluate Installments + GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + assertNotNull(getLoanRepaymentSchedule); + log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + + for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { + if (period.getPeriod() != null) { + log.info("Period number {} completed on date {}", period.getPeriod(), period.getObligationsMetOnDate()); + assertNotNull(period.getObligationsMetOnDate()); + assertEquals(expectedDates.get(period.getPeriod() - 1), period.getObligationsMetOnDate()); + assertTrue(period.getComplete()); + } } + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } private GetLoanProductsProductIdResponse createLoanProduct(final LoanTransactionHelper loanTransactionHelper, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java index 2eb8d3f50..5222433c6 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java @@ -61,13 +61,16 @@ import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.apache.fineract.integrationtests.common.products.DelinquencyRangesHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class DelinquencyBucketsIntegrationTest { private ResponseSpecification responseSpec; @@ -239,193 +242,198 @@ public class DelinquencyBucketsIntegrationTest { @Test public void testLoanClassificationRealtime() { - // Given - final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + try { + // Given + final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 March 2012"); - log.info("Current date {}", bussinesLocalDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); - final BusinessDateResponse businessDateResponse = this.businessDateHelper.getBusinessDateByType(requestSpec, responseSpec, - BusinessDateType.BUSINESS_DATE); + final LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 March 2012"); + log.info("Current date {}", bussinesLocalDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); + final BusinessDateResponse businessDateResponse = this.businessDateHelper.getBusinessDateByType(requestSpec, responseSpec, + BusinessDateType.BUSINESS_DATE); - ArrayList 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); + ArrayList 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()); + GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, + delinquencyRangeResponse.getResourceId()); - // Second Range - delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); + // Second Range + delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); - range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); - final String classificationExpected = range.getClassification(); - log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); + range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); + final String classificationExpected = range.getClassification(); + log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); - String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); - PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, - responseSpec, jsonBucket); - assertNotNull(delinquencyBucketResponse); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketResponse.getResourceId()); + String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); + PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, + responseSpec, jsonBucket); + assertNotNull(delinquencyBucketResponse); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketResponse.getResourceId()); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); - log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); + log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - // Older date to have more than one overdue installment - final LocalDate transactionDate = bussinesLocalDate.minusDays(50); - String operationDate = Utils.dateFormatter.format(transactionDate); + // Older date to have more than one overdue installment + final LocalDate transactionDate = bussinesLocalDate.minusDays(50); + String operationDate = Utils.dateFormatter.format(transactionDate); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate); - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); - log.info("Loan Delinquency Range after Disbursement {}", getLoansLoanIdResponse.getDelinquencyRange().getClassification()); - // First Loan Delinquency Classification after Disbursement command - assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); + log.info("Loan Delinquency Range after Disbursement {}", getLoansLoanIdResponse.getDelinquencyRange().getClassification()); + // First Loan Delinquency Classification after Disbursement command + assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - // Apply a partial repayment - operationDate = Utils.dateFormatter.format(bussinesLocalDate); - loanTransactionHelper.makeLoanRepayment(operationDate, 100.0f, loanId); + // Apply a partial repayment + operationDate = Utils.dateFormatter.format(bussinesLocalDate); + loanTransactionHelper.makeLoanRepayment(operationDate, 100.0f, loanId); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); - assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); - // First Loan Delinquency Classification remains after Repayment because the installment is not fully paid - assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); + assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); + // First Loan Delinquency Classification remains after Repayment because the installment is not fully paid + assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); - // Apply a repayment to get a full paid installment - loanTransactionHelper.makeLoanRepayment(operationDate, 1000.0f, loanId); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); - assertNotNull(getLoansLoanIdResponse); - // The Loan Delinquency Classification after Repayment command must be null - assertNull(getLoansLoanIdResponse.getDelinquencyRange()); - // Get the Delinquency Tags - ArrayList getDelinquencyTagsHistory = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, - responseSpec, loanId); - assertNotNull(getDelinquencyTagsHistory); - log.info("Delinquency Tag History items {}", getDelinquencyTagsHistory.size()); - assertEquals(1, getDelinquencyTagsHistory.size()); - assertNotNull(getDelinquencyTagsHistory.get(0).getLiftedOnDate()); - assertEquals(getDelinquencyTagsHistory.get(0).getAddedOnDate(), businessDateResponse.getDate()); - assertEquals(getDelinquencyTagsHistory.get(0).getLiftedOnDate(), businessDateResponse.getDate()); - assertEquals(getDelinquencyTagsHistory.get(0).getDelinquencyRange().getClassification(), classificationExpected); - log.info("Delinquency Tag Item with Lifted On {}", getDelinquencyTagsHistory.get(0).getLiftedOnDate()); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + // Apply a repayment to get a full paid installment + loanTransactionHelper.makeLoanRepayment(operationDate, 1000.0f, loanId); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); + assertNotNull(getLoansLoanIdResponse); + // The Loan Delinquency Classification after Repayment command must be null + assertNull(getLoansLoanIdResponse.getDelinquencyRange()); + // Get the Delinquency Tags + ArrayList getDelinquencyTagsHistory = loanTransactionHelper + .getLoanDelinquencyTags(requestSpec, responseSpec, loanId); + assertNotNull(getDelinquencyTagsHistory); + log.info("Delinquency Tag History items {}", getDelinquencyTagsHistory.size()); + assertEquals(1, getDelinquencyTagsHistory.size()); + assertNotNull(getDelinquencyTagsHistory.get(0).getLiftedOnDate()); + assertEquals(getDelinquencyTagsHistory.get(0).getAddedOnDate(), businessDateResponse.getDate()); + assertEquals(getDelinquencyTagsHistory.get(0).getLiftedOnDate(), businessDateResponse.getDate()); + assertEquals(getDelinquencyTagsHistory.get(0).getDelinquencyRange().getClassification(), classificationExpected); + log.info("Delinquency Tag Item with Lifted On {}", getDelinquencyTagsHistory.get(0).getLiftedOnDate()); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanClassificationRealtimeWithCharges() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 April 2012"); - log.info("Current date {}", bussinesLocalDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); + final LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 April 2012"); + log.info("Current date {}", bussinesLocalDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); - // Given - final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + // Given + final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); - ArrayList 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); + ArrayList 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()); + GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, + delinquencyRangeResponse.getResourceId()); - // Second Range - delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); + // Second Range + delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); - range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); - final String classificationExpected = range.getClassification(); - log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); + range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); + final String classificationExpected = range.getClassification(); + log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); - String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); - PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, - responseSpec, jsonBucket); - assertNotNull(delinquencyBucketResponse); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketResponse.getResourceId()); + String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); + PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, + responseSpec, jsonBucket); + assertNotNull(delinquencyBucketResponse); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketResponse.getResourceId()); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); - log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); + log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - // Older date to have more than one overdue installment - LocalDate transactionDate = bussinesLocalDate.minusMonths(2).minusDays(5); - String operationDate = Utils.dateFormatter.format(transactionDate); + // Older date to have more than one overdue installment + LocalDate transactionDate = bussinesLocalDate.minusMonths(2).minusDays(5); + String operationDate = Utils.dateFormatter.format(transactionDate); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate); - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - log.info("Loan Delinquency Range after Disbursement {}", getLoansLoanIdResponse.getDelinquencyRange().getClassification()); - assertNotNull(getLoansLoanIdResponse); - // First Loan Delinquency Classification after Disbursement command - assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + log.info("Loan Delinquency Range after Disbursement {}", getLoansLoanIdResponse.getDelinquencyRange().getClassification()); + assertNotNull(getLoansLoanIdResponse); + // First Loan Delinquency Classification after Disbursement command + assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - // Apply a repayment to get a full paid installment - operationDate = Utils.dateFormatter.format(bussinesLocalDate); - loanTransactionHelper.makeLoanRepayment(operationDate, 2049.99f, loanId); + // Apply a repayment to get a full paid installment + operationDate = Utils.dateFormatter.format(bussinesLocalDate); + loanTransactionHelper.makeLoanRepayment(operationDate, 2049.99f, loanId); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - // The Loan Delinquency Classification after Repayment command must be null - log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); - assertNull(getLoansLoanIdResponse.getDelinquencyRange()); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + // The Loan Delinquency Classification after Repayment command must be null + log.info("Loan Delinquency Range after Repayment {}", getLoansLoanIdResponse.getDelinquencyRange()); + assertNull(getLoansLoanIdResponse.getDelinquencyRange()); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - transactionDate = bussinesLocalDate.minusDays(18); - operationDate = Utils.dateFormatter.format(transactionDate); + transactionDate = bussinesLocalDate.minusDays(18); + operationDate = Utils.dateFormatter.format(transactionDate); - // Create and apply Charge for Specific Due Date - final Integer chargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanSpecifiedDueDateJSON(1, "30", false)); - assertNotNull(chargeId); - final Integer loanChargeId = loanTransactionHelper.addChargesForLoan(loanId, getChargeApplyJSON(chargeId, operationDate), - responseSpec); - assertNotNull(loanChargeId); + // Create and apply Charge for Specific Due Date + final Integer chargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanSpecifiedDueDateJSON(1, "30", false)); + assertNotNull(chargeId); + final Integer loanChargeId = loanTransactionHelper.addChargesForLoan(loanId, getChargeApplyJSON(chargeId, operationDate), + responseSpec); + assertNotNull(loanChargeId); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - log.info("Loan Delinquency Range after add Loan Charge {}", getLoansLoanIdResponse.getDelinquencyRange()); - assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); - // Evaluate a Delinquency Tag set after add charge to the Loan - assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + log.info("Loan Delinquency Range after add Loan Charge {}", getLoansLoanIdResponse.getDelinquencyRange()); + assertNotNull(getLoansLoanIdResponse.getDelinquencyRange()); + // Evaluate a Delinquency Tag set after add charge to the Loan + assertEquals(getLoansLoanIdResponse.getDelinquencyRange().getClassification(), classificationExpected); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanClassificationRealtimeOlderLoan() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); // Given final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); @@ -633,189 +641,194 @@ public class DelinquencyBucketsIntegrationTest { @Test public void testLoanClassificationJob() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - LocalDate businessDate = Utils.getLocalDateOfTenant(); - businessDate = businessDate.minusDays(37); - log.info("Current date {}", businessDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + LocalDate businessDate = Utils.getLocalDateOfTenant(); + businessDate = businessDate.minusDays(37); + log.info("Current date {}", businessDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); - final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); + final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); - ArrayList rangeIds = new ArrayList<>(); - String jsonRange = DelinquencyRangesHelper.getAsJSON(1, 3); - PostDelinquencyRangeResponse delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, - jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); - jsonRange = DelinquencyRangesHelper.getAsJSON(4, 60); - // Create - delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); + ArrayList rangeIds = new ArrayList<>(); + String jsonRange = DelinquencyRangesHelper.getAsJSON(1, 3); + PostDelinquencyRangeResponse delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, + responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); + jsonRange = DelinquencyRangesHelper.getAsJSON(4, 60); + // Create + delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); - final GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, - delinquencyRangeResponse.getResourceId()); - final String classificationExpected = range.getClassification(); - log.info("Expected Delinquency Range classification {}", classificationExpected); + final GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, + delinquencyRangeResponse.getResourceId()); + final String classificationExpected = range.getClassification(); + log.info("Expected Delinquency Range classification {}", classificationExpected); - String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); - PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, - responseSpec, jsonBucket); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketResponse.getResourceId()); + String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); + PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, + responseSpec, jsonBucket); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketResponse.getResourceId()); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); - log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); + log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - // Older date to have more than one overdue installment - final LocalDate transactionDate = todaysDate.minusDays(57); - String operationDate = Utils.dateFormatter.format(transactionDate); + final LocalDate todaysDate = Utils.getLocalDateOfTenant(); + // Older date to have more than one overdue installment + final LocalDate transactionDate = todaysDate.minusDays(57); + String operationDate = Utils.dateFormatter.format(transactionDate); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate); - // Run first time the Job - final String jobName = "Loan Delinquency Classification"; - schedulerJobHelper.executeAndAwaitJob(jobName); + // Run first time the Job + final String jobName = "Loan Delinquency Classification"; + schedulerJobHelper.executeAndAwaitJob(jobName); - // Get loan details expecting to have not a delinquency classification - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); - final GetDelinquencyRangesResponse firstTestCase = getLoansLoanIdResponse.getDelinquencyRange(); - log.info("Loan Delinquency Range is null {}", (firstTestCase == null)); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + // Get loan details expecting to have not a delinquency classification + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); + final GetDelinquencyRangesResponse firstTestCase = getLoansLoanIdResponse.getDelinquencyRange(); + log.info("Loan Delinquency Range is null {}", (firstTestCase == null)); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - // Move the Business date to get older the loan and to have an overdue loan - businessDate = businessDate.plusMonths(1); - log.info("Current date {}", businessDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - // Run Second time the Job - schedulerJobHelper.executeAndAwaitJob(jobName); + // Move the Business date to get older the loan and to have an overdue loan + businessDate = businessDate.plusMonths(1); + log.info("Current date {}", businessDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + // Run Second time the Job + schedulerJobHelper.executeAndAwaitJob(jobName); - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); - final GetDelinquencyRangesResponse secondTestCase = getLoansLoanIdResponse.getDelinquencyRange(); - assertNotNull(secondTestCase); - log.info("Loan Delinquency Range is {}", secondTestCase.getClassification()); + final GetDelinquencyRangesResponse secondTestCase = getLoansLoanIdResponse.getDelinquencyRange(); + assertNotNull(secondTestCase); + log.info("Loan Delinquency Range is {}", secondTestCase.getClassification()); - // Then - assertNotNull(delinquencyBucketResponse); - assertNotNull(getLoanProductsProductResponse); - assertNull(firstTestCase); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - assertEquals(secondTestCase.getClassification(), classificationExpected); + // Then + assertNotNull(delinquencyBucketResponse); + assertNotNull(getLoanProductsProductResponse); + assertNull(firstTestCase); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + assertEquals(secondTestCase.getClassification(), classificationExpected); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanClassificationStepAsPartOfCOB() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 April 2012"); - log.info("Current date {}", bussinesLocalDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); + LocalDate bussinesLocalDate = Utils.getDateAsLocalDate("01 April 2012"); + log.info("Current date {}", bussinesLocalDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); - // Given - final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); - final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); + // Given + final LoanTransactionHelper loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); - ArrayList rangeIds = new ArrayList<>(); - String jsonRange = DelinquencyRangesHelper.getAsJSON(1, 3); - PostDelinquencyRangeResponse delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, - jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); - final GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, - delinquencyRangeResponse.getResourceId()); - final String classificationExpected = range.getClassification(); - log.info("Expected Delinquency Range classification {}", classificationExpected); + ArrayList rangeIds = new ArrayList<>(); + String jsonRange = DelinquencyRangesHelper.getAsJSON(1, 3); + PostDelinquencyRangeResponse delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, + responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); + final GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, + delinquencyRangeResponse.getResourceId()); + final String classificationExpected = range.getClassification(); + log.info("Expected Delinquency Range classification {}", classificationExpected); - jsonRange = DelinquencyRangesHelper.getAsJSON(4, 60); - delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); + jsonRange = DelinquencyRangesHelper.getAsJSON(4, 60); + delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); - String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); - PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, - responseSpec, jsonBucket); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketResponse.getResourceId()); + String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); + PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, + responseSpec, jsonBucket); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketResponse.getResourceId()); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucket.getId()); - assertNotNull(getLoanProductsProductResponse); - log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucket.getId()); + assertNotNull(getLoanProductsProductResponse); + log.info("Loan Product Bucket Name: {}", getLoanProductsProductResponse.getDelinquencyBucket().getName()); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - // Older date to have more than one overdue installment - final LocalDate transactionDate = bussinesLocalDate.minusDays(31); - String operationDate = Utils.dateFormatter.format(transactionDate); + // Older date to have more than one overdue installment + final LocalDate transactionDate = bussinesLocalDate.minusDays(31); + String operationDate = Utils.dateFormatter.format(transactionDate); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate); - // COB Step Validation - final JobBusinessStepConfigData jobBusinessStepConfigData = BusinessStepConfigurationHelper - .getConfiguredBusinessStepsByJobName(requestSpec, responseSpec, BusinessConfigurationApiTest.LOAN_JOB_NAME); - assertNotNull(jobBusinessStepConfigData); - assertEquals(BusinessConfigurationApiTest.LOAN_JOB_NAME, jobBusinessStepConfigData.getJobName()); - assertTrue(jobBusinessStepConfigData.getBusinessSteps().size() > 0); - assertTrue(jobBusinessStepConfigData.getBusinessSteps().stream() - .anyMatch(businessStep -> BusinessConfigurationApiTest.LOAN_DELINQUENCY_CLASSIFICATION.equals(businessStep.getStepName()))); + // COB Step Validation + final JobBusinessStepConfigData jobBusinessStepConfigData = BusinessStepConfigurationHelper + .getConfiguredBusinessStepsByJobName(requestSpec, responseSpec, BusinessConfigurationApiTest.LOAN_JOB_NAME); + assertNotNull(jobBusinessStepConfigData); + assertEquals(BusinessConfigurationApiTest.LOAN_JOB_NAME, jobBusinessStepConfigData.getJobName()); + assertTrue(jobBusinessStepConfigData.getBusinessSteps().size() > 0); + assertTrue(jobBusinessStepConfigData.getBusinessSteps().stream().anyMatch( + businessStep -> BusinessConfigurationApiTest.LOAN_DELINQUENCY_CLASSIFICATION.equals(businessStep.getStepName()))); - // Run first time the Loan COB Job - final String jobName = "Loan COB"; - schedulerJobHelper.executeAndAwaitJob(jobName); + // Run first time the Loan COB Job + final String jobName = "Loan COB"; + schedulerJobHelper.executeAndAwaitJob(jobName); - // Get loan details expecting to have not a delinquency classification - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - final GetDelinquencyRangesResponse firstTestCase = getLoansLoanIdResponse.getDelinquencyRange(); - log.info("Loan Delinquency Range is null {}", (firstTestCase == null)); - GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - if (getLoanRepaymentSchedule != null) { - log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); - for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { - log.info("Period number {} for due date {} and outstanding {}", period.getPeriod(), period.getDueDate(), - period.getTotalOutstandingForPeriod()); + // Get loan details expecting to have not a delinquency classification + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + final GetDelinquencyRangesResponse firstTestCase = getLoansLoanIdResponse.getDelinquencyRange(); + log.info("Loan Delinquency Range is null {}", (firstTestCase == null)); + GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + if (getLoanRepaymentSchedule != null) { + log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { + log.info("Period number {} for due date {} and outstanding {}", period.getPeriod(), period.getDueDate(), + period.getTotalOutstandingForPeriod()); + } } + + // Move the Business date to get older the loan and to have an overdue loan + LocalDate lastLoanCOBBusinessDate = bussinesLocalDate; + bussinesLocalDate = bussinesLocalDate.plusDays(3); + schedulerJobHelper.fastForwardTime(lastLoanCOBBusinessDate, bussinesLocalDate, jobName, responseSpec); + log.info("Current date {}", bussinesLocalDate); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); + // Run Second time the Job + schedulerJobHelper.executeAndAwaitJob(jobName); + + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + final GetDelinquencyRangesResponse secondTestCase = getLoansLoanIdResponse.getDelinquencyRange(); + assertNotNull(secondTestCase); + log.info("Loan Delinquency Range is {}", secondTestCase.getClassification()); + + // Then + assertNotNull(delinquencyBucketResponse); + assertNotNull(getLoanProductsProductResponse); + assertNull(firstTestCase); + assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); + assertEquals(secondTestCase.getClassification(), classificationExpected); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } - - // Move the Business date to get older the loan and to have an overdue loan - LocalDate lastLoanCOBBusinessDate = bussinesLocalDate; - bussinesLocalDate = bussinesLocalDate.plusDays(3); - schedulerJobHelper.fastForwardTime(lastLoanCOBBusinessDate, bussinesLocalDate, jobName, responseSpec); - log.info("Current date {}", bussinesLocalDate); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate); - // Run Second time the Job - schedulerJobHelper.executeAndAwaitJob(jobName); - - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - final GetDelinquencyRangesResponse secondTestCase = getLoansLoanIdResponse.getDelinquencyRange(); - assertNotNull(secondTestCase); - log.info("Loan Delinquency Range is {}", secondTestCase.getClassification()); - - // Then - assertNotNull(delinquencyBucketResponse); - assertNotNull(getLoanProductsProductResponse); - assertNull(firstTestCase); - assertEquals(getLoanProductsProductResponse.getDelinquencyBucket().getName(), delinquencyBucket.getName()); - assertEquals(secondTestCase.getClassification(), classificationExpected); - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } private GetLoanProductsProductIdResponse createLoanProduct(final LoanTransactionHelper loanTransactionHelper, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java index ed3d0d125..5c1b27c93 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java @@ -41,17 +41,20 @@ import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuil import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanRescheduleRequestTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; /** * Tests loan schedule change based on group meeting changes and loan rescheduling **/ @SuppressWarnings({ "rawtypes" }) @Disabled +@ExtendWith(LoanTestLifecycleExtension.class) public class DisbursalAndRepaymentScheduleTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DueDateRespectiveLoanRepaymentScheduleTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DueDateRespectiveLoanRepaymentScheduleTest.java index 7cb445183..d2629528b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DueDateRespectiveLoanRepaymentScheduleTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DueDateRespectiveLoanRepaymentScheduleTest.java @@ -41,12 +41,15 @@ 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.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class DueDateRespectiveLoanRepaymentScheduleTest { private static final Logger LOG = LoggerFactory.getLogger(DueDateRespectiveLoanRepaymentScheduleTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java index fefb1898a..c302d7470 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java @@ -76,6 +76,7 @@ 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; @@ -83,7 +84,9 @@ import org.apache.fineract.integrationtests.common.products.DelinquencyRangesHel 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; @@ -849,6 +852,7 @@ public class ExternalIdSupportIntegrationTest extends IntegrationTest { @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()) diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupLoanIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupLoanIntegrationTest.java index 1d11515a9..4ca54a512 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupLoanIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupLoanIntegrationTest.java @@ -39,10 +39,12 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +52,7 @@ import org.slf4j.LoggerFactory; * Group Loan Integration Test for checking Loan Application Repayment Schedule. */ @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class GroupLoanIntegrationTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupTest.java index 96b309e33..3e85e5a51 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupTest.java @@ -37,17 +37,20 @@ import org.apache.fineract.integrationtests.common.GroupHelper; import org.apache.fineract.integrationtests.common.Utils; 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.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Group Test for checking Group: Creation, Activation, Client Association, Updating & Deletion */ +@ExtendWith(LoanTestLifecycleExtension.class) public class GroupTest { private static final Logger LOG = LoggerFactory.getLogger(GroupTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountArrearsAgeingCOBBusinessStepTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountArrearsAgeingCOBBusinessStepTest.java index f74310e27..5609a9ada 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountArrearsAgeingCOBBusinessStepTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountArrearsAgeingCOBBusinessStepTest.java @@ -46,11 +46,14 @@ import org.apache.fineract.integrationtests.common.SchedulerJobHelper; import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanAccountArrearsAgeingCOBBusinessStepTest { private ResponseSpecification responseSpec; @@ -77,72 +80,76 @@ public class LoanAccountArrearsAgeingCOBBusinessStepTest { @Test public void loanArrearsAgeingCOBBusinessStepTest() { // Set Business Date - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - LocalDate businessDate = Utils.getLocalDateOfTenant(); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - LocalDate operationDate = businessDate.minusDays(40); - String loanOperationDate = Utils.dateFormatter.format(operationDate); + LocalDate businessDate = Utils.getLocalDateOfTenant(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - // create Client - final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); + LocalDate operationDate = businessDate.minusDays(40); + String loanOperationDate = Utils.dateFormatter.format(operationDate); - // create Loan Product + // create Client + final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); - // Delinquency Bucket - final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketId); + // create Loan Product - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucketId); - assertNotNull(getLoanProductsProductResponse); + // Delinquency Bucket + final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketId); - // Loan1 ExternalId - String loan1ExternalIdStr = UUID.randomUUID().toString(); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucketId); + assertNotNull(getLoanProductsProductResponse); - // create Loan Account for Client with Loan Product type 1 - Long loanProductId = getLoanProductsProductResponse.getId(); - final Integer loanId_1 = createLoanAccount(loanOperationDate, clientId, loanProductId, loan1ExternalIdStr); + // Loan1 ExternalId + String loan1ExternalIdStr = UUID.randomUUID().toString(); - String loan2ExternalIdStr = UUID.randomUUID().toString(); - final Integer loanId_2 = createLoanAccount(loanOperationDate, clientId, loanProductId, loan2ExternalIdStr); + // create Loan Account for Client with Loan Product type 1 + Long loanProductId = getLoanProductsProductResponse.getId(); + final Integer loanId_1 = createLoanAccount(loanOperationDate, clientId, loanProductId, loan1ExternalIdStr); - // Run Loan cob with verfying business step for Update Arrears ageing details - final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); + String loan2ExternalIdStr = UUID.randomUUID().toString(); + final Integer loanId_2 = createLoanAccount(loanOperationDate, clientId, loanProductId, loan2ExternalIdStr); - // COB Step Validation - final JobBusinessStepConfigData jobBusinessStepConfigData = BusinessStepConfigurationHelper - .getConfiguredBusinessStepsByJobName(requestSpec, responseSpec, BusinessConfigurationApiTest.LOAN_JOB_NAME); - assertNotNull(jobBusinessStepConfigData); - assertEquals(BusinessConfigurationApiTest.LOAN_JOB_NAME, jobBusinessStepConfigData.getJobName()); - assertTrue(jobBusinessStepConfigData.getBusinessSteps().size() > 0); - assertTrue(jobBusinessStepConfigData.getBusinessSteps().stream() - .anyMatch(businessStep -> UPDATE_LOAN_ARREARS_AGING.equals(businessStep.getStepName()))); + // Run Loan cob with verfying business step for Update Arrears ageing details + final SchedulerJobHelper schedulerJobHelper = new SchedulerJobHelper(requestSpec); - // Run the Loan COB Job - final String jobName = "Loan COB"; - schedulerJobHelper.executeAndAwaitJob(jobName); + // COB Step Validation + final JobBusinessStepConfigData jobBusinessStepConfigData = BusinessStepConfigurationHelper + .getConfiguredBusinessStepsByJobName(requestSpec, responseSpec, BusinessConfigurationApiTest.LOAN_JOB_NAME); + assertNotNull(jobBusinessStepConfigData); + assertEquals(BusinessConfigurationApiTest.LOAN_JOB_NAME, jobBusinessStepConfigData.getJobName()); + assertTrue(jobBusinessStepConfigData.getBusinessSteps().size() > 0); + assertTrue(jobBusinessStepConfigData.getBusinessSteps().stream() + .anyMatch(businessStep -> UPDATE_LOAN_ARREARS_AGING.equals(businessStep.getStepName()))); - // verify Arrears details are updated for both the loans, by verifying loan summary fields for - // principalOverdue,totalOverdue,overdueSinceddate + // Run the Loan COB Job + final String jobName = "Loan COB"; + schedulerJobHelper.executeAndAwaitJob(jobName); - // Retrieve Loan 1 with loanId - GetLoansLoanIdResponse loan1Details = loanTransactionHelper.getLoanDetails((long) loanId_1); - GetLoansLoanIdSummary loan1Summary = loan1Details.getSummary(); - assertNotNull(loan1Summary); - assertNotNull(loan1Summary.getOverdueSinceDate()); - assertEquals(loan1Summary.getPrincipalOverdue(), 1000.00); - assertEquals(loan1Summary.getTotalOverdue(), 1000.00); + // verify Arrears details are updated for both the loans, by verifying loan summary fields for + // principalOverdue,totalOverdue,overdueSinceddate - // Retrieve Loan 2 with loanId - GetLoansLoanIdResponse loan2Details = loanTransactionHelper.getLoanDetails((long) loanId_2); - GetLoansLoanIdSummary loan2Summary = loan2Details.getSummary(); - assertNotNull(loan2Summary); - assertNotNull(loan2Summary.getOverdueSinceDate()); - assertEquals(loan2Summary.getPrincipalOverdue(), 1000.00); - assertEquals(loan2Summary.getTotalOverdue(), 1000.00); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + // Retrieve Loan 1 with loanId + GetLoansLoanIdResponse loan1Details = loanTransactionHelper.getLoanDetails((long) loanId_1); + GetLoansLoanIdSummary loan1Summary = loan1Details.getSummary(); + assertNotNull(loan1Summary); + assertNotNull(loan1Summary.getOverdueSinceDate()); + assertEquals(loan1Summary.getPrincipalOverdue(), 1000.00); + assertEquals(loan1Summary.getTotalOverdue(), 1000.00); + + // Retrieve Loan 2 with loanId + GetLoansLoanIdResponse loan2Details = loanTransactionHelper.getLoanDetails((long) loanId_2); + GetLoansLoanIdSummary loan2Summary = loan2Details.getSummary(); + assertNotNull(loan2Summary); + assertNotNull(loan2Summary.getOverdueSinceDate()); + assertEquals(loan2Summary.getPrincipalOverdue(), 1000.00); + assertEquals(loan2Summary.getTotalOverdue(), 1000.00); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } private GetLoanProductsProductIdResponse createLoanProduct(final LoanTransactionHelper loanTransactionHelper, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountCreditRefundPayoutWithChargebackTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountCreditRefundPayoutWithChargebackTest.java index 1e266b071..202b2ed98 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountCreditRefundPayoutWithChargebackTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountCreditRefundPayoutWithChargebackTest.java @@ -40,11 +40,14 @@ import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanAccountCreditRefundPayoutWithChargebackTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountFraudTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountFraudTest.java index 30d1c5c1c..d4e2e0b8a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountFraudTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountFraudTest.java @@ -36,11 +36,14 @@ import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.Utils; 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.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanAccountFraudTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountOverpaidDateStatusTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountOverpaidDateStatusTest.java index 544388edd..63b9f593d 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountOverpaidDateStatusTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAccountOverpaidDateStatusTest.java @@ -46,11 +46,14 @@ import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper; import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanAccountOverpaidDateStatusTest { private ResponseSpecification responseSpec; @@ -76,92 +79,95 @@ public class LoanAccountOverpaidDateStatusTest { @Test public void loanOverpaidDateStatusTest() { // Set business date - final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); + try { + final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - // Loan ExternalId - String loanExternalIdStr = UUID.randomUUID().toString(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); - // Delinquency Bucket - final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketId); + // Loan ExternalId + String loanExternalIdStr = UUID.randomUUID().toString(); - // Client and Loan account creation + // Delinquency Bucket + final Integer delinquencyBucketId = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, responseSpec); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketId); - final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, - delinquencyBucketId); - assertNotNull(getLoanProductsProductResponse); + // Client and Loan account creation - final Integer loanId = createLoanAccount(clientId, getLoanProductsProductResponse.getId(), loanExternalIdStr); + final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, + delinquencyBucketId); + assertNotNull(getLoanProductsProductResponse); - // make Repayments - final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("5 September 2022").locale("en") - .transactionAmount(200.0)); + final Integer loanId = createLoanAccount(clientId, getLoanProductsProductResponse.getId(), loanExternalIdStr); - final PostLoansLoanIdTransactionsResponse repaymentTransaction_2 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("6 September 2022").locale("en") - .transactionAmount(200.0)); + // make Repayments + final PostLoansLoanIdTransactionsResponse repaymentTransaction_1 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("5 September 2022").locale("en") + .transactionAmount(200.0)); - final PostLoansLoanIdTransactionsResponse repaymentTransaction_3 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("7 September 2022").locale("en") - .transactionAmount(500.0)); + final PostLoansLoanIdTransactionsResponse repaymentTransaction_2 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("6 September 2022").locale("en") + .transactionAmount(200.0)); - // make repayment to make loan overpaid - final PostLoansLoanIdTransactionsResponse repaymentTransaction_4 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("9 September 2022").locale("en") - .transactionAmount(200.0)); + final PostLoansLoanIdTransactionsResponse repaymentTransaction_3 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("7 September 2022").locale("en") + .transactionAmount(500.0)); - // check loan overpaid date is not null and is set as Business date and loan status - GetLoansLoanIdResponse loanDetailsOverpaid = loanTransactionHelper.getLoanDetails((long) loanId); - assertTrue(loanDetailsOverpaid.getStatus().getOverpaid()); - assertNotNull(loanDetailsOverpaid.getOverpaidOnDate()); - assertEquals(loanDetailsOverpaid.getOverpaidOnDate(), todaysDate); + // make repayment to make loan overpaid + final PostLoansLoanIdTransactionsResponse repaymentTransaction_4 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("9 September 2022").locale("en") + .transactionAmount(200.0)); - // reverse repayment to make loan not overpaid and overpaid date is reset - loanTransactionHelper.reverseRepayment(loanId, repaymentTransaction_4.getResourceId().intValue(), "10 September 2022"); - GetLoansLoanIdResponse loanDetailsNotOverpaidAfterReversal = loanTransactionHelper.getLoanDetails((long) loanId); - assertFalse(loanDetailsNotOverpaidAfterReversal.getStatus().getOverpaid()); - assertNull(loanDetailsNotOverpaidAfterReversal.getOverpaidOnDate()); + // check loan overpaid date is not null and is set as Business date and loan status + GetLoansLoanIdResponse loanDetailsOverpaid = loanTransactionHelper.getLoanDetails((long) loanId); + assertTrue(loanDetailsOverpaid.getStatus().getOverpaid()); + assertNotNull(loanDetailsOverpaid.getOverpaidOnDate()); + assertEquals(loanDetailsOverpaid.getOverpaidOnDate(), todaysDate); - // make repayment to make loan overpaid again - final PostLoansLoanIdTransactionsResponse repaymentTransaction_5 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("11 September 2022").locale("en") - .transactionAmount(200.0)); + // reverse repayment to make loan not overpaid and overpaid date is reset + loanTransactionHelper.reverseRepayment(loanId, repaymentTransaction_4.getResourceId().intValue(), "10 September 2022"); + GetLoansLoanIdResponse loanDetailsNotOverpaidAfterReversal = loanTransactionHelper.getLoanDetails((long) loanId); + assertFalse(loanDetailsNotOverpaidAfterReversal.getStatus().getOverpaid()); + assertNull(loanDetailsNotOverpaidAfterReversal.getOverpaidOnDate()); - // check loan overpaid date is not null and is set as Business date and loan status - GetLoansLoanIdResponse loanDetailsOverpaid_1 = loanTransactionHelper.getLoanDetails((long) loanId); - assertTrue(loanDetailsOverpaid_1.getStatus().getOverpaid()); - assertNotNull(loanDetailsOverpaid_1.getOverpaidOnDate()); - assertEquals(loanDetailsOverpaid_1.getOverpaidOnDate(), todaysDate); + // make repayment to make loan overpaid again + final PostLoansLoanIdTransactionsResponse repaymentTransaction_5 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("11 September 2022").locale("en") + .transactionAmount(200.0)); - // Credit balance refund to reset overpaid status - loanTransactionHelper.creditBalanceRefund("12 September 2022", Float.valueOf(100), null, loanId, ""); - GetLoansLoanIdResponse loanDetailsNotOverpaidAfterCBR = loanTransactionHelper.getLoanDetails((long) loanId); - assertFalse(loanDetailsNotOverpaidAfterCBR.getStatus().getOverpaid()); - assertNull(loanDetailsNotOverpaidAfterCBR.getOverpaidOnDate()); + // check loan overpaid date is not null and is set as Business date and loan status + GetLoansLoanIdResponse loanDetailsOverpaid_1 = loanTransactionHelper.getLoanDetails((long) loanId); + assertTrue(loanDetailsOverpaid_1.getStatus().getOverpaid()); + assertNotNull(loanDetailsOverpaid_1.getOverpaidOnDate()); + assertEquals(loanDetailsOverpaid_1.getOverpaidOnDate(), todaysDate); - // reverse repayment to make loan active again - loanTransactionHelper.reverseRepayment(loanId, repaymentTransaction_2.getResourceId().intValue(), "13 September 2022"); - GetLoansLoanIdResponse loanDetailsNotOverpaidAfterReversal_1 = loanTransactionHelper.getLoanDetails((long) loanId); - assertFalse(loanDetailsNotOverpaidAfterReversal_1.getStatus().getOverpaid()); - assertNull(loanDetailsNotOverpaidAfterReversal_1.getOverpaidOnDate()); + // Credit balance refund to reset overpaid status + loanTransactionHelper.creditBalanceRefund("12 September 2022", Float.valueOf(100), null, loanId, ""); + GetLoansLoanIdResponse loanDetailsNotOverpaidAfterCBR = loanTransactionHelper.getLoanDetails((long) loanId); + assertFalse(loanDetailsNotOverpaidAfterCBR.getStatus().getOverpaid()); + assertNull(loanDetailsNotOverpaidAfterCBR.getOverpaidOnDate()); - // make repayment to make loan overpaid again - final PostLoansLoanIdTransactionsResponse repaymentTransaction_6 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("14 September 2022").locale("en") - .transactionAmount(300.0)); + // reverse repayment to make loan active again + loanTransactionHelper.reverseRepayment(loanId, repaymentTransaction_2.getResourceId().intValue(), "13 September 2022"); + GetLoansLoanIdResponse loanDetailsNotOverpaidAfterReversal_1 = loanTransactionHelper.getLoanDetails((long) loanId); + assertFalse(loanDetailsNotOverpaidAfterReversal_1.getStatus().getOverpaid()); + assertNull(loanDetailsNotOverpaidAfterReversal_1.getOverpaidOnDate()); - // check loan overpaid date is not null and is set as Business date and loan status - GetLoansLoanIdResponse loanDetailsOverpaid_3 = loanTransactionHelper.getLoanDetails((long) loanId); - assertTrue(loanDetailsOverpaid_3.getStatus().getOverpaid()); - assertNotNull(loanDetailsOverpaid_3.getOverpaidOnDate()); - assertEquals(loanDetailsOverpaid_3.getOverpaidOnDate(), todaysDate); + // make repayment to make loan overpaid again + final PostLoansLoanIdTransactionsResponse repaymentTransaction_6 = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr, + new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("14 September 2022").locale("en") + .transactionAmount(300.0)); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + // check loan overpaid date is not null and is set as Business date and loan status + GetLoansLoanIdResponse loanDetailsOverpaid_3 = loanTransactionHelper.getLoanDetails((long) loanId); + assertTrue(loanDetailsOverpaid_3.getStatus().getOverpaid()); + assertNotNull(loanDetailsOverpaid_3.getOverpaidOnDate()); + assertEquals(loanDetailsOverpaid_3.getOverpaidOnDate(), todaysDate); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationApprovalTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationApprovalTest.java index c50d89cfb..3e3a32a4c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationApprovalTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationApprovalTest.java @@ -36,14 +36,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("rawtypes") +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanApplicationApprovalTest { private static final Logger LOG = LoggerFactory.getLogger(LoanApplicationApprovalTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationRejectionForLoanProductWithPeriodicAccrualAccountingTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationRejectionForLoanProductWithPeriodicAccrualAccountingTest.java index e60af672c..e59584368 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationRejectionForLoanProductWithPeriodicAccrualAccountingTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationRejectionForLoanProductWithPeriodicAccrualAccountingTest.java @@ -35,10 +35,13 @@ import org.apache.fineract.integrationtests.common.accounting.Account; import org.apache.fineract.integrationtests.common.accounting.AccountHelper; 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.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanApplicationRejectionForLoanProductWithPeriodicAccrualAccountingTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationUndoLastTrancheTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationUndoLastTrancheTest.java index 7b1f0ca74..39e9271d0 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationUndoLastTrancheTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanApplicationUndoLastTrancheTest.java @@ -39,14 +39,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("rawtypes") +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanApplicationUndoLastTrancheTest { private static final Logger LOG = LoggerFactory.getLogger(LoanApplicationUndoLastTrancheTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAuditingIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAuditingIntegrationTest.java index 72c8a459c..318ec3774 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAuditingIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanAuditingIntegrationTest.java @@ -43,15 +43,18 @@ import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +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.useradministration.users.UserHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanAuditingIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(LoanAuditingIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeOffAccountingTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeOffAccountingTest.java index ccbfb0988..19da79d47 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeOffAccountingTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeOffAccountingTest.java @@ -44,11 +44,14 @@ import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper 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.system.CodeHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanChargeOffAccountingTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java index c4c65a50a..330478d93 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanChargeSpecificDueDateTest.java @@ -50,11 +50,14 @@ import org.apache.fineract.integrationtests.common.accounting.PeriodicAccrualAcc 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.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanChargeSpecificDueDateTest { private ResponseSpecification responseSpec; @@ -293,128 +296,135 @@ public class LoanChargeSpecificDueDateTest { @Test public void testApplyFeeAccrualOnClosedDate() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - // Client and Loan account creation - final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); - final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProductWithPeriodicAccrual(loanTransactionHelper, - null); - assertNotNull(getLoanProductsProductResponse); + final LocalDate todaysDate = Utils.getLocalDateOfTenant(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); - LocalDate transactionDate = LocalDate.of(Utils.getLocalDateOfTenant().getYear(), 1, 1); - String operationDate = Utils.dateFormatter.format(transactionDate); - log.info("Disbursement date {}", transactionDate); + // Client and Loan account creation + final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2012"); + final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProductWithPeriodicAccrual( + loanTransactionHelper, null); + assertNotNull(getLoanProductsProductResponse); - // Create Loan Account - final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), - getLoanProductsProductResponse.getId().toString(), operationDate, "1", "0"); + LocalDate transactionDate = LocalDate.of(Utils.getLocalDateOfTenant().getYear(), 1, 1); + String operationDate = Utils.dateFormatter.format(transactionDate); + log.info("Disbursement date {}", transactionDate); - // Get loan details - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("0.00"), true); + // Create Loan Account + final Integer loanId = createLoanAccount(loanTransactionHelper, clientId.toString(), + getLoanProductsProductResponse.getId().toString(), operationDate, "1", "0"); - // Apply Loan Charge with specific due date - String feeAmount = "10.00"; - String payloadJSON = ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, feeAmount, true); - final PostChargesResponse postChargesResponse = ChargesHelper.createLoanCharge(requestSpec, responseSpec, payloadJSON); - assertNotNull(postChargesResponse); - final Long chargeId = postChargesResponse.getResourceId(); - assertNotNull(chargeId); + // Get loan details + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("0.00"), true); - // First Loan Charge - transactionDate = transactionDate.plusDays(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); - operationDate = Utils.dateFormatter.format(transactionDate); - log.info("Operation date {}", transactionDate); - payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); - PostLoansLoanIdChargesResponse postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, - responseSpec); - assertNotNull(postLoansLoanIdChargesResponse); - final Long loanChargeId01 = postLoansLoanIdChargesResponse.getResourceId(); - assertNotNull(loanChargeId01); + // Apply Loan Charge with specific due date + String feeAmount = "10.00"; + String payloadJSON = ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, feeAmount, true); + final PostChargesResponse postChargesResponse = ChargesHelper.createLoanCharge(requestSpec, responseSpec, payloadJSON); + assertNotNull(postChargesResponse); + final Long chargeId = postChargesResponse.getResourceId(); + assertNotNull(chargeId); - // Run Accruals - log.info("Running Periodic Accrual for date {}", transactionDate); - periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(operationDate); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", Double.valueOf("10.00")); + // First Loan Charge + transactionDate = transactionDate.plusDays(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); + operationDate = Utils.dateFormatter.format(transactionDate); + log.info("Operation date {}", transactionDate); + payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); + PostLoansLoanIdChargesResponse postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, + responseSpec); + assertNotNull(postLoansLoanIdChargesResponse); + final Long loanChargeId01 = postLoansLoanIdChargesResponse.getResourceId(); + assertNotNull(loanChargeId01); - // Repay the first charge fully, 10 - Float amount = Float.valueOf("10.00"); - transactionDate = transactionDate.plusDays(40); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); - operationDate = Utils.dateFormatter.format(transactionDate); - log.info("Operation date {}", transactionDate); - PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, - loanId); - assertNotNull(loanIdTransactionsResponse); - log.info("Loan Transaction Id: {} {}", loanId, loanIdTransactionsResponse.getResourceId()); + // Run Accruals + log.info("Running Periodic Accrual for date {}", transactionDate); + periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(operationDate); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", + Double.valueOf("10.00")); - // Second Loan Charge - feeAmount = "15.00"; - transactionDate = transactionDate.plusDays(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); - operationDate = Utils.dateFormatter.format(transactionDate); - log.info("Operation date {}", transactionDate); - payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); - postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, responseSpec); - assertNotNull(postLoansLoanIdChargesResponse); - final Long loanChargeId02 = postLoansLoanIdChargesResponse.getResourceId(); - assertNotNull(loanChargeId02); + // Repay the first charge fully, 10 + Float amount = Float.valueOf("10.00"); + transactionDate = transactionDate.plusDays(40); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); + operationDate = Utils.dateFormatter.format(transactionDate); + log.info("Operation date {}", transactionDate); + PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, + loanId); + assertNotNull(loanIdTransactionsResponse); + log.info("Loan Transaction Id: {} {}", loanId, loanIdTransactionsResponse.getResourceId()); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("15.00"), true); + // Second Loan Charge + feeAmount = "15.00"; + transactionDate = transactionDate.plusDays(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); + operationDate = Utils.dateFormatter.format(transactionDate); + log.info("Operation date {}", transactionDate); + payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); + postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, responseSpec); + assertNotNull(postLoansLoanIdChargesResponse); + final Long loanChargeId02 = postLoansLoanIdChargesResponse.getResourceId(); + assertNotNull(loanChargeId02); - // Run Accruals - log.info("Running Periodic Accrual for date {}", transactionDate); - periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(operationDate); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", Double.valueOf("25.00")); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("15.00"), true); - // Third Loan Charge - feeAmount = "25.00"; - transactionDate = transactionDate.plusDays(1); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); - operationDate = Utils.dateFormatter.format(transactionDate); - log.info("Operation date {}", transactionDate); - payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); - postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, responseSpec); - assertNotNull(postLoansLoanIdChargesResponse); - final Long loanChargeId03 = postLoansLoanIdChargesResponse.getResourceId(); - assertNotNull(loanChargeId03); + // Run Accruals + log.info("Running Periodic Accrual for date {}", transactionDate); + periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(operationDate); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", + Double.valueOf("25.00")); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("40.00"), true); - loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", Double.valueOf("25.00")); + // Third Loan Charge + feeAmount = "25.00"; + transactionDate = transactionDate.plusDays(1); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, transactionDate); + operationDate = Utils.dateFormatter.format(transactionDate); + log.info("Operation date {}", transactionDate); + payloadJSON = LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(chargeId.toString(), operationDate, feeAmount); + postLoansLoanIdChargesResponse = loanTransactionHelper.addChargeForLoan(loanId, payloadJSON, responseSpec); + assertNotNull(postLoansLoanIdChargesResponse); + final Long loanChargeId03 = postLoansLoanIdChargesResponse.getResourceId(); + assertNotNull(loanChargeId03); - amount = Float.valueOf("1040.00"); - loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, loanId); - assertNotNull(loanIdTransactionsResponse); - log.info("Loan Transaction Id: {} {}", loanId, loanIdTransactionsResponse.getResourceId()); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + validateLoanAccount(getLoansLoanIdResponse, Double.valueOf(principalAmount), Double.valueOf("40.00"), true); + loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", + Double.valueOf("25.00")); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); - loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", Double.valueOf("50.00")); + amount = Float.valueOf("1040.00"); + loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, loanId); + assertNotNull(loanIdTransactionsResponse); + log.info("Loan Transaction Id: {} {}", loanId, loanIdTransactionsResponse.getResourceId()); - final Long transactionId = loanTransactionHelper.evaluateLastLoanTransactionData(getLoansLoanIdResponse, - "loanTransactionType.accrual", operationDate, Double.valueOf("25.00")); - assertNotNull(transactionId); - log.info("transactionId {}", transactionId); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); + loanTransactionHelper.evaluateLoanTransactionData(getLoansLoanIdResponse, "loanTransactionType.accrual", + Double.valueOf("50.00")); - final GetJournalEntriesTransactionIdResponse journalEntriesResponse = journalEntryHelper - .getJournalEntries("L" + transactionId.toString()); - assertNotNull(journalEntriesResponse); - final List journalEntries = journalEntriesResponse.getPageItems(); - assertEquals(2, journalEntries.size()); - assertEquals(25, journalEntries.get(0).getAmount()); - assertEquals(25, journalEntries.get(1).getAmount()); - assertEquals(transactionDate, journalEntries.get(0).getTransactionDate()); - assertEquals(transactionDate, journalEntries.get(1).getTransactionDate()); + final Long transactionId = loanTransactionHelper.evaluateLastLoanTransactionData(getLoansLoanIdResponse, + "loanTransactionType.accrual", operationDate, Double.valueOf("25.00")); + assertNotNull(transactionId); + log.info("transactionId {}", transactionId); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + final GetJournalEntriesTransactionIdResponse journalEntriesResponse = journalEntryHelper + .getJournalEntries("L" + transactionId.toString()); + assertNotNull(journalEntriesResponse); + final List journalEntries = journalEntriesResponse.getPageItems(); + assertEquals(2, journalEntries.size()); + assertEquals(25, journalEntries.get(0).getAmount()); + assertEquals(25, journalEntries.get(1).getAmount()); + assertEquals(transactionDate, journalEntries.get(0).getTransactionDate()); + assertEquals(transactionDate, journalEntries.get(1).getTransactionDate()); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } private GetLoanProductsProductIdResponse createLoanProduct(final LoanTransactionHelper loanTransactionHelper, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursalDateValidationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursalDateValidationTest.java index 772604af1..4dc8d6158 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursalDateValidationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursalDateValidationTest.java @@ -35,14 +35,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("rawtypes") +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanDisbursalDateValidationTest { private static final Logger LOG = LoggerFactory.getLogger(LoanDisbursalDateValidationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursementDetailsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursementDetailsIntegrationTest.java index 8c1cc4e74..3d6cdbe5b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursementDetailsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanDisbursementDetailsIntegrationTest.java @@ -48,13 +48,16 @@ import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuil import org.apache.fineract.integrationtests.common.loans.LoanDisbursementTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanDisbursementDetailsIntegrationTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanFixedPrincipalPercentageAmortizationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanFixedPrincipalPercentageAmortizationTest.java index 4b317e239..86ecc495b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanFixedPrincipalPercentageAmortizationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanFixedPrincipalPercentageAmortizationTest.java @@ -36,14 +36,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.accounting.Account; 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.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanFixedPrincipalPercentageAmortizationTest { private static final Logger LOG = LoggerFactory.getLogger(LoanFixedPrincipalPercentageAmortizationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPayOffAddChargeWithRefundTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPayOffAddChargeWithRefundTest.java index 536e4c066..77bcfed14 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPayOffAddChargeWithRefundTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanPayOffAddChargeWithRefundTest.java @@ -42,11 +42,14 @@ import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanPayOffAddChargeWithRefundTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java index 9afe6f55f..9928f492c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java @@ -39,14 +39,17 @@ import org.apache.fineract.integrationtests.common.accounting.Account; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("rawtypes") +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanRepaymentRescheduleAtDisbursementTest { private static final Logger LOG = LoggerFactory.getLogger(LoanRepaymentRescheduleAtDisbursementTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleOnDecliningBalanceLoanTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleOnDecliningBalanceLoanTest.java index 29fc0b725..8618a7fbf 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleOnDecliningBalanceLoanTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleOnDecliningBalanceLoanTest.java @@ -41,14 +41,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanRescheduleRequestTestBuilder; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanRescheduleOnDecliningBalanceLoanTest { private static final Logger LOG = LoggerFactory.getLogger(LoanRescheduleOnDecliningBalanceLoanTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java index c49e3f59d..361b6b745 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleRequestTest.java @@ -38,10 +38,12 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanRescheduleRequestTestBuilder; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +51,7 @@ import org.slf4j.LoggerFactory; * Test the creation, approval and rejection of a loan reschedule request **/ @SuppressWarnings({ "rawtypes" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanRescheduleRequestTest { private static final Logger LOG = LoggerFactory.getLogger(LoanRescheduleRequestTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleWithAdvancePaymentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleWithAdvancePaymentTest.java index 0f78248d8..0a7864a52 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleWithAdvancePaymentTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanRescheduleWithAdvancePaymentTest.java @@ -39,13 +39,16 @@ import org.apache.fineract.integrationtests.common.WorkingDaysHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanRescheduleRequestTestBuilder; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanRescheduleWithAdvancePaymentTest { private static final Logger LOG = LoggerFactory.getLogger(LoanRescheduleWithAdvancePaymentTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java index 17b261523..77942fa15 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java @@ -51,14 +51,17 @@ import org.apache.fineract.integrationtests.common.accounting.Account; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +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.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanReschedulingWithinCenterTest { private static final Logger LOG = LoggerFactory.getLogger(LoanReschedulingWithinCenterTest.class); @@ -259,9 +262,9 @@ public class LoanReschedulingWithinCenterTest { LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "0", recalculationRestFrequencyDate, LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, isMultiTrancheLoan, null, null); - Calendar seondTrancheDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); - seondTrancheDate.add(Calendar.MONTH, 1); - String secondDisbursement = dateFormat.format(seondTrancheDate.getTime()); + Calendar secondTrancheDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); + secondTrancheDate.add(Calendar.DAY_OF_MONTH, -7); + String secondDisbursement = dateFormat.format(secondTrancheDate.getTime()); // CREATE TRANCHES List createTranches = new ArrayList<>(); @@ -299,11 +302,8 @@ public class LoanReschedulingWithinCenterTest { LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); LoanStatusChecker.verifyLoanIsWaitingForDisbursal(loanStatusHashMap); - // DISBURSE A FIRST TRANCHE - String loanDetails = this.loanTransactionHelper.getLoanDetails(this.requestSpec, this.responseSpec, loanID); - this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount(disbursementDate, loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); + // DISBURSE THE FIRST TRANCHE + this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount(disbursementDate, loanID, "5000"); LOG.info("---------------------------------CHANGING GROUP MEETING DATE ------------------------------------------"); Calendar todaysdate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); @@ -322,6 +322,9 @@ public class LoanReschedulingWithinCenterTest { // VERIFY THE INTEREST Float interestDue = (Float) ((HashMap) loanRepaymnetSchedule.get(2)).get("interestDue"); assertEquals("41.05", String.valueOf(interestDue)); + + // DISBURSE THE SECOND TRANCHE (for let the loan test lifecycle callback to close the loan + this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount(secondDisbursement, loanID, "5000"); } private Integer createLoanProductWithInterestRecalculation(final String repaymentStrategy, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSpecificDueDateChargeAfterMaturityTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSpecificDueDateChargeAfterMaturityTest.java index 05f7f11ed..243595c5c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSpecificDueDateChargeAfterMaturityTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanSpecificDueDateChargeAfterMaturityTest.java @@ -41,14 +41,17 @@ 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.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanSpecificDueDateChargeAfterMaturityTest { public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL"; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionAuditingIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionAuditingIntegrationTest.java index f97d2f196..aadabadee 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionAuditingIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionAuditingIntegrationTest.java @@ -42,15 +42,18 @@ import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +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.useradministration.users.UserHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanTransactionAuditingIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(LoanTransactionAuditingIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java index 998076135..891dd0ac1 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java @@ -51,13 +51,16 @@ import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanTransactionChargebackTest { private ResponseSpecification responseSpec; @@ -250,103 +253,107 @@ public class LoanTransactionChargebackTest { @Test public void applyLoanTransactionChargebackAfterMature() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); - log.info("Current Business date {}", todaysDate); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - // Client and Loan account creation - final Integer loanId = createAccounts(45, 1, false); + final LocalDate todaysDate = Utils.getLocalDateOfTenant(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); + log.info("Current Business date {}", todaysDate); - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); + // Client and Loan account creation + final Integer loanId = createAccounts(45, 1, false); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); - GetDelinquencyRangesResponse delinquencyRange = getLoansLoanIdResponse.getDelinquencyRange(); - assertNotNull(delinquencyRange); - log.info("Loan Delinquency Range is {}", delinquencyRange.getClassification()); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); - assertEquals(2, getLoanRepaymentSchedule.getPeriods().size()); + GetDelinquencyRangesResponse delinquencyRange = getLoansLoanIdResponse.getDelinquencyRange(); + assertNotNull(delinquencyRange); + log.info("Loan Delinquency Range is {}", delinquencyRange.getClassification()); - Float amount = Float.valueOf(amountVal); - PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, - loanId); - assertNotNull(loanIdTransactionsResponse); - final Long transactionId = loanIdTransactionsResponse.getResourceId(); + GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + assertEquals(2, getLoanRepaymentSchedule.getPeriods().size()); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); + Float amount = Float.valueOf(amountVal); + PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, + loanId); + assertNotNull(loanIdTransactionsResponse); + final Long transactionId = loanIdTransactionsResponse.getResourceId(); - reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00")); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); - Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec); + reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00")); - reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00")); - reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("500.00")); + Long chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, + responseSpec); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.active"); + reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00")); + reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("500.00")); - loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, Double.valueOf("500.00")); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.active"); - // N+1 Scenario - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); - assertEquals(3, getLoanRepaymentSchedule.getPeriods().size()); - getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { - if (period.getPeriod() != null && period.getPeriod() == 2) { - log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), - period.getTotalDueForPeriod()); - assertEquals(Double.valueOf("500.00"), period.getPrincipalDue()); + loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, Double.valueOf("500.00")); + + // N+1 Scenario + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + assertEquals(3, getLoanRepaymentSchedule.getPeriods().size()); + getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { + if (period.getPeriod() != null && period.getPeriod() == 2) { + log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), + period.getTotalDueForPeriod()); + assertEquals(Double.valueOf("500.00"), period.getPrincipalDue()); + } } - } - chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 0, responseSpec); + chargebackTransactionId = loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 0, responseSpec); - reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00")); - reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("800.00")); + reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00")); + reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("800.00")); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.active"); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.active"); - delinquencyRange = getLoansLoanIdResponse.getDelinquencyRange(); - assertNull(delinquencyRange); - log.info("Loan Delinquency Range is null {}", (delinquencyRange == null)); + delinquencyRange = getLoansLoanIdResponse.getDelinquencyRange(); + assertNull(delinquencyRange); + log.info("Loan Delinquency Range is null {}", (delinquencyRange == null)); - loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, Double.valueOf("800.00")); + loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, Double.valueOf("800.00")); - // N+1 Scenario -- Remains the same periods number - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); - assertEquals(3, getLoanRepaymentSchedule.getPeriods().size()); - getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); - for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { - if (period.getPeriod() != null && period.getPeriod() == 2) { - log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), - period.getTotalDueForPeriod()); - assertEquals(Double.valueOf("800.00"), period.getPrincipalDue()); + // N+1 Scenario -- Remains the same periods number + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + log.info("Loan with {} periods", getLoanRepaymentSchedule.getPeriods().size()); + assertEquals(3, getLoanRepaymentSchedule.getPeriods().size()); + getLoanRepaymentSchedule = getLoansLoanIdResponse.getRepaymentSchedule(); + for (GetLoansLoanIdRepaymentPeriod period : getLoanRepaymentSchedule.getPeriods()) { + if (period.getPeriod() != null && period.getPeriod() == 2) { + log.info("Period number {} for due date {} and totalDueForPeriod {}", period.getPeriod(), period.getDueDate(), + period.getTotalDueForPeriod()); + assertEquals(Double.valueOf("800.00"), period.getPrincipalDue()); + } } + + // Move the Business date few days to get Collection data + LocalDate businessDate = todaysDate.plusDays(4); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); + log.info("Current Business date {}", businessDate); + + // Get loan details expecting to have a delinquency classification + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 4, Double.valueOf("800.00")); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } - - // Move the Business date few days to get Collection data - LocalDate businessDate = todaysDate.plusDays(4); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate); - log.info("Current Business date {}", businessDate); - - // Get loan details expecting to have a delinquency classification - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 4, Double.valueOf("800.00")); - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } @Test @@ -486,69 +493,71 @@ public class LoanTransactionChargebackTest { @Test public void applyMultipleLoanTransactionChargeback() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final LocalDate todaysDate = Utils.getLocalDateOfTenant(); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); - log.info("Current Business date {}", todaysDate); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + final LocalDate todaysDate = Utils.getLocalDateOfTenant(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, todaysDate); + log.info("Current Business date {}", todaysDate); - // Client and Loan account creation - final Integer loanId = createAccounts(15, 1, false); + // Client and Loan account creation + final Integer loanId = createAccounts(15, 1, false); - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - Float amount = Float.valueOf(amountVal); - PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, - loanId); - assertNotNull(loanIdTransactionsResponse); - final Long transactionId = loanIdTransactionsResponse.getResourceId(); + Float amount = Float.valueOf(amountVal); + PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse = loanTransactionHelper.makeLoanRepayment(operationDate, amount, + loanId); + assertNotNull(loanIdTransactionsResponse); + final Long transactionId = loanIdTransactionsResponse.getResourceId(); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - assertNotNull(getLoansLoanIdResponse); - loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + assertNotNull(getLoansLoanIdResponse); + loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met"); - // First round, empty array - reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00")); + // First round, empty array + reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00")); - loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec); + loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec); - Double expectedAmount = Double.valueOf("200.00"); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); + Double expectedAmount = Double.valueOf("200.00"); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); - loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); - loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); - DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); + loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); + loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse); + DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); - // Second round, array size equal to 1 - reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00")); + // Second round, array size equal to 1 + reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00")); - loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 1, responseSpec); + loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "300.00", 1, responseSpec); - expectedAmount = Double.valueOf("500.00"); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); + expectedAmount = Double.valueOf("500.00"); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); - loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); - DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); + loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); + DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); - // Third round, array size equal to 2 - reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00")); + // Third round, array size equal to 2 + reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00")); - loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec); + loanTransactionHelper.applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec); - expectedAmount = Double.valueOf("1000.00"); - getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); - loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); + expectedAmount = Double.valueOf("1000.00"); + getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId); + loanTransactionHelper.validateLoanPrincipalOustandingBalance(getLoansLoanIdResponse, expectedAmount); - loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); - loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); + loanTransactionHelper.evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, expectedAmount); + loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse); - DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); - - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + DelinquencyBucketsHelper.evaluateLoanCollectionData(getLoansLoanIdResponse, 0, Double.valueOf("0.00")); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } private Integer createAccounts(final Integer daysToSubtract, final Integer numberOfRepayments, final boolean withJournalEntries) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionFullAmountChargebackForOverpaidLoanTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionFullAmountChargebackForOverpaidLoanTest.java index 961a794f7..dcff15282 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionFullAmountChargebackForOverpaidLoanTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionFullAmountChargebackForOverpaidLoanTest.java @@ -40,11 +40,14 @@ import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanTransactionFullAmountChargebackForOverpaidLoanTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayRelationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayRelationTest.java index 30703af6c..c7464bbf2 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayRelationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayRelationTest.java @@ -42,11 +42,14 @@ import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanTransactionReverseReplayRelationTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionSummaryTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionSummaryTest.java index f03ad1954..5ce326a9b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionSummaryTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionSummaryTest.java @@ -45,11 +45,14 @@ import org.apache.fineract.integrationtests.common.Utils; 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.products.DelinquencyBucketsHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanTransactionSummaryTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithWaiveInterestAndWriteOffIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithWaiveInterestAndWriteOffIntegrationTest.java index b5c1d796b..edf7b745d 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithWaiveInterestAndWriteOffIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithWaiveInterestAndWriteOffIntegrationTest.java @@ -34,10 +34,12 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,6 +47,7 @@ import org.slf4j.LoggerFactory; * Client Loan Integration Test for checking Loan Disbursement with Waive Interest and Write-Off. */ @SuppressWarnings({ "rawtypes" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanWithWaiveInterestAndWriteOffIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(LoanWithWaiveInterestAndWriteOffIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithdrawnByApplicantIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithdrawnByApplicantIntegrationTest.java index 2038259ba..999153d7e 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithdrawnByApplicantIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanWithdrawnByApplicantIntegrationTest.java @@ -33,12 +33,15 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @SuppressWarnings("rawtypes") +@ExtendWith(LoanTestLifecycleExtension.class) public class LoanWithdrawnByApplicantIntegrationTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/MinimumDaysBetweenDisbursalAndFirstRepaymentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/MinimumDaysBetweenDisbursalAndFirstRepaymentTest.java index f3ac06696..ba0b2702b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/MinimumDaysBetweenDisbursalAndFirstRepaymentTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/MinimumDaysBetweenDisbursalAndFirstRepaymentTest.java @@ -39,15 +39,18 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; /** * Test the creation, approval and rejection of a loan reschedule request **/ @SuppressWarnings({ "rawtypes" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class MinimumDaysBetweenDisbursalAndFirstRepaymentTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/NotesTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/NotesTest.java index 99f0fa077..74aff3dea 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/NotesTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/NotesTest.java @@ -37,14 +37,17 @@ import org.apache.fineract.integrationtests.common.NotesHelper; import org.apache.fineract.integrationtests.common.Utils; 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.savings.SavingsAccountHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @SuppressWarnings({ "rawtypes" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class NotesTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/RepaymentWithPostDatedChecksTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/RepaymentWithPostDatedChecksTest.java index 42213327c..684e4f020 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/RepaymentWithPostDatedChecksTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/RepaymentWithPostDatedChecksTest.java @@ -42,11 +42,14 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(LoanTestLifecycleExtension.class) public class RepaymentWithPostDatedChecksTest { private ResponseSpecification responseSpec; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java index fce67b8bb..e0a1a51f8 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java @@ -42,10 +42,12 @@ import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Order(2) public class SavingsInterestPostingJobIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(SavingsInterestPostingJobIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java index 1a7502c9c..f13d40620 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTestResults.java @@ -56,6 +56,7 @@ import org.apache.fineract.client.models.JournalEntryTransactionItem; import org.apache.fineract.client.models.PostClientsResponse; import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest; import org.apache.fineract.client.models.PutJobsJobIDRequest; +import org.apache.fineract.client.util.CallFailedRuntimeException; import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.integrationtests.common.BusinessDateHelper; import org.apache.fineract.integrationtests.common.ClientHelper; @@ -76,6 +77,7 @@ import org.apache.fineract.integrationtests.common.fixeddeposit.FixedDepositProd import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; @@ -89,9 +91,11 @@ import org.junit.jupiter.api.MethodOrderer.MethodName; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; @Order(1) @TestMethodOrder(MethodName.class) +@ExtendWith(LoanTestLifecycleExtension.class) @SuppressWarnings({ "unchecked", "rawtypes" }) public class SchedulerJobsTestResults { @@ -648,9 +652,6 @@ public class SchedulerJobsTestResults { Assertions.assertEquals(0, (Integer) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); - this.loanTransactionHelper.undoChargeOffLoan((long) loanID, new PostLoansLoanIdTransactionsRequest()); - this.loanTransactionHelper.closeRescheduledLoan((long) loanID, - new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("03 March 2020").locale("en")); } @Test @@ -716,210 +717,221 @@ public class SchedulerJobsTestResults { @Test public void testLoanCOBJobOutcomeWhileAddingFeeOnDisbursementDate() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - this.savingsAccountHelper = new SavingsAccountHelper(requestSpec, responseSpec); - this.loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + this.savingsAccountHelper = new SavingsAccountHelper(requestSpec, responseSpec); + this.loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", false)); - Assertions.assertNotNull(fee); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - final Integer loanProductID = createLoanProductWithPeriodicAccrual(null); - Assertions.assertNotNull(loanProductID); + Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "10", false)); + Assertions.assertNotNull(fee); - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProductWithPeriodicAccrual(null); + Assertions.assertNotNull(loanProductID); - Assertions.assertNotNull(loanID); + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - this.loanTransactionHelper.addChargesForLoan(loanID, - LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(fee), "02 March 2020", "10", null)); + String loanDetails = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - String jobName = "Loan COB"; - this.schedulerJobHelper.executeAndAwaitJob(jobName); + this.loanTransactionHelper.addChargesForLoan(loanID, + LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON(String.valueOf(fee), "02 March 2020", "10", null)); - List repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); + String jobName = "Loan COB"; + this.schedulerJobHelper.executeAndAwaitJob(jobName); - Assertions.assertEquals(10.00f, (Float) repaymentScheduleDataAfter.get(1).get("feeChargesDue"), - "Verifying From Fee Charges due for first Repayment after Successful completion of Scheduler Job"); + List repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, + loanID); - GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - // First accrual transaction - assertTrue(getLoansLoanIdResponse.getTransactions().get(1).getType().getAccrual()); - assertEquals(10.0f, getLoansLoanIdResponse.getTransactions().get(1).getFeeChargesPortion()); - assertEquals(LocalDate.of(2020, 3, 2), getLoansLoanIdResponse.getTransactions().get(1).getDate()); - Long transactionId = getLoansLoanIdResponse.getTransactions().get(1).getId(); + Assertions.assertEquals(10.00f, (Float) repaymentScheduleDataAfter.get(1).get("feeChargesDue"), + "Verifying From Fee Charges due for first Repayment after Successful completion of Scheduler Job"); - final GetJournalEntriesTransactionIdResponse journalEntriesResponse = journalEntryHelper.getJournalEntries("L" + transactionId); - assertNotNull(journalEntriesResponse); - final List journalEntries = journalEntriesResponse.getPageItems(); - assertEquals(2, journalEntries.size()); - assertEquals(10, journalEntries.get(0).getAmount()); - assertEquals(10, journalEntries.get(1).getAmount()); - assertEquals(LocalDate.of(2020, 3, 2), journalEntries.get(1).getTransactionDate()); - assertEquals(LocalDate.of(2020, 3, 2), journalEntries.get(0).getTransactionDate()); + GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + // First accrual transaction + assertTrue(getLoansLoanIdResponse.getTransactions().get(1).getType().getAccrual()); + assertEquals(10.0f, getLoansLoanIdResponse.getTransactions().get(1).getFeeChargesPortion()); + assertEquals(LocalDate.of(2020, 3, 2), getLoansLoanIdResponse.getTransactions().get(1).getDate()); + Long transactionId = getLoansLoanIdResponse.getTransactions().get(1).getId(); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + final GetJournalEntriesTransactionIdResponse journalEntriesResponse = journalEntryHelper.getJournalEntries("L" + transactionId); + assertNotNull(journalEntriesResponse); + final List journalEntries = journalEntriesResponse.getPageItems(); + assertEquals(2, journalEntries.size()); + assertEquals(10, journalEntries.get(0).getAmount()); + assertEquals(10, journalEntries.get(1).getAmount()); + assertEquals(LocalDate.of(2020, 3, 2), journalEntries.get(1).getTransactionDate()); + assertEquals(LocalDate.of(2020, 3, 2), journalEntries.get(0).getTransactionDate()); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanCOBRunsOnlyOnLoansOneDayBehind() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; - Assertions.assertNotNull(loanID); + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - String jobName = "Loan COB"; + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - schedulerJobHelper.executeAndAwaitJob(jobName); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + String jobName = "Loan COB"; - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 3)); - schedulerJobHelper.executeAndAwaitJob(jobName); + schedulerJobHelper.executeAndAwaitJob(jobName); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 3)); + schedulerJobHelper.executeAndAwaitJob(jobName); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 5)); - schedulerJobHelper.executeAndAwaitJob(jobName); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 5)); + schedulerJobHelper.executeAndAwaitJob(jobName); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testLoanCOBApplyPenaltyOnDue() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - // set penalty wait period to 0 - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); - this.loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + // set penalty wait period to 0 + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); + this.loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; - Assertions.assertNotNull(loanID); + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 1)); - String jobName = "Loan COB"; + loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - this.schedulerJobHelper.executeAndAwaitJob(jobName); - List repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); - Assertions.assertEquals(0, (Integer) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), - "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); + String loanDetails = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 1)); + String jobName = "Loan COB"; - LocalDate lastBusinessDateBeforeFastForward = LocalDate.of(2020, 4, 2); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, lastBusinessDateBeforeFastForward); - this.schedulerJobHelper.executeAndAwaitJob(jobName); - repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); - Assertions.assertEquals(39.39f, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), - "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); + this.schedulerJobHelper.executeAndAwaitJob(jobName); + List repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, + loanID); + Assertions.assertEquals(0, (Integer) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), + "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); - List transactions = this.loanTransactionHelper.getLoanTransactions(this.requestSpec, this.responseSpec, loanID); - Assertions.assertEquals(39.39f, (Float) transactions.get(2).get("amount")); - Assertions.assertEquals(2020, ((List) transactions.get(2).get("date")).get(0)); - Assertions.assertEquals(4, ((List) transactions.get(2).get("date")).get(1)); - Assertions.assertEquals(2, ((List) transactions.get(2).get("date")).get(2)); + LocalDate lastBusinessDateBeforeFastForward = LocalDate.of(2020, 4, 2); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, lastBusinessDateBeforeFastForward); + this.schedulerJobHelper.executeAndAwaitJob(jobName); + repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); + Assertions.assertEquals(39.39f, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), + "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); - // Test penalty where there is 1 day grace period - final Integer loanID2 = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + List transactions = this.loanTransactionHelper.getLoanTransactions(this.requestSpec, this.responseSpec, loanID); + Assertions.assertEquals(39.39f, (Float) transactions.get(2).get("amount")); + Assertions.assertEquals(2020, ((List) transactions.get(2).get("date")).get(0)); + Assertions.assertEquals(4, ((List) transactions.get(2).get("date")).get(1)); + Assertions.assertEquals(2, ((List) transactions.get(2).get("date")).get(2)); - Assertions.assertNotNull(loanID2); + // Test penalty where there is 1 day grace period + final Integer loanID2 = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID2); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID2); - loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 April 2020", loanID2); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID2); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails2 = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID2); - loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 April 2020", loanID2, - JsonPath.from(loanDetails2).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = this.loanTransactionHelper.approveLoan("01 April 2020", loanID2); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "1"); - LocalDate dateToFastForward = LocalDate.of(2020, 5, 2); + String loanDetails2 = this.loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID2); + loanStatusHashMap = this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 April 2020", loanID2, + JsonPath.from(loanDetails2).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, dateToFastForward); - this.schedulerJobHelper.executeAndAwaitJob(jobName); - repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID2); - Assertions.assertEquals(0, (Integer) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), - "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "1"); + LocalDate dateToFastForward = LocalDate.of(2020, 5, 2); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 5, 3)); - this.schedulerJobHelper.executeAndAwaitJob(jobName); - repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID2); - Assertions.assertEquals(39.39f, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), - "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, dateToFastForward); + this.schedulerJobHelper.executeAndAwaitJob(jobName); + repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID2); + Assertions.assertEquals(0, (Integer) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), + "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); - transactions = this.loanTransactionHelper.getLoanTransactions(this.requestSpec, this.responseSpec, loanID2); - Assertions.assertEquals(39.39f, (Float) transactions.get(2).get("amount")); - Assertions.assertEquals(2020, ((List) transactions.get(2).get("date")).get(0)); - Assertions.assertEquals(5, ((List) transactions.get(2).get("date")).get(1)); - Assertions.assertEquals(2, ((List) transactions.get(2).get("date")).get(2)); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 5, 3)); + this.schedulerJobHelper.executeAndAwaitJob(jobName); + repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID2); + Assertions.assertEquals(39.39f, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue"), + "Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job"); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "2"); + transactions = this.loanTransactionHelper.getLoanTransactions(this.requestSpec, this.responseSpec, loanID2); + Assertions.assertEquals(39.39f, (Float) transactions.get(2).get("amount")); + Assertions.assertEquals(2020, ((List) transactions.get(2).get("date")).get(0)); + Assertions.assertEquals(5, ((List) transactions.get(2).get("date")).get(1)); + Assertions.assertEquals(2, ((List) transactions.get(2).get("date")).get(2)); + } finally { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "2"); + } } @Test @@ -1135,9 +1147,16 @@ public class SchedulerJobsTestResults { GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanId); assertEquals(LocalDate.of(2022, 9, 5), loanDetails.getTransactions().get(1).getDate()); } finally { - this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0 2 0 1/1 * ? *")); GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } + + try { + this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0 2 0 1/1 * ? *")); + } catch (CallFailedRuntimeException e) { + // Try again (maybe it was executed by scheduler at the same time when it was called... :/ + Thread.sleep(2000); + this.schedulerJobHelper.updateSchedulerJob(16L, new PutJobsJobIDRequest().cronExpression("0 2 0 1/1 * ? *")); + } } private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SkipRepaymentOnMonthFirstTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SkipRepaymentOnMonthFirstTest.java index 63306821e..36a3d551b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SkipRepaymentOnMonthFirstTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SkipRepaymentOnMonthFirstTest.java @@ -38,16 +38,19 @@ import org.apache.fineract.integrationtests.common.GroupHelper; import org.apache.fineract.integrationtests.common.Utils; 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.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class SkipRepaymentOnMonthFirstTest { private static final Logger LOG = LoggerFactory.getLogger(SkipRepaymentOnMonthFirstTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java index 9981ab436..90ba1561f 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java @@ -520,7 +520,7 @@ public class GlobalConfigurationHelper { HashMap purgeProcessCommandDaysDefault = new HashMap<>(); purgeProcessCommandDaysDefault.put("id", 51); purgeProcessCommandDaysDefault.put("name", "purge-processed-commands-older-than-days"); - purgeProcessCommandDaysDefault.put("value", 0); + purgeProcessCommandDaysDefault.put("value", 30); purgeProcessCommandDaysDefault.put("enabled", false); purgeProcessCommandDaysDefault.put("trapDoor", false); defaults.add(purgeProcessCommandDaysDefault); @@ -545,7 +545,7 @@ public class GlobalConfigurationHelper { reportExportS3FolderName.put("id", 54); reportExportS3FolderName.put("name", "report-export-s3-folder-name"); reportExportS3FolderName.put("value", 0); - reportExportS3FolderName.put("enabled", false); + reportExportS3FolderName.put("enabled", true); reportExportS3FolderName.put("trapDoor", false); defaults.add(reportExportS3FolderName); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java index 6801cd888..2fac87b68 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java @@ -37,6 +37,7 @@ import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.provisioning.ProvisioningHelper; import org.apache.fineract.integrationtests.common.provisioning.ProvisioningTransactionHelper; @@ -44,10 +45,12 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class ProvisioningIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(ProvisioningIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/SchedulerJobHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/SchedulerJobHelper.java index 3636f4f2a..d7a844e2f 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/SchedulerJobHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/SchedulerJobHelper.java @@ -172,26 +172,21 @@ public class SchedulerJobHelper extends IntegrationTest { // Await JobDetailData.lastRunHistory [JobDetailHistoryData] // jobRunStartTime >= beforeExecuteTime (or timeout) - await().atMost(timeout).pollInterval(pause).until(jobLastRunHistorySupplier(jobId), lastRunHistory -> { - String jobRunStartText = lastRunHistory.get("jobRunStartTime"); - if (jobRunStartText == null) { - return false; - } - Instant jobRunStartTime = df.parse(jobRunStartText, Instant::from); - return jobRunStartTime.equals(beforeExecuteTime) || jobRunStartTime.isAfter(beforeExecuteTime); - }); - - // Await JobDetailData.lastRunHistory [JobDetailHistoryData] // jobRunEndTime to be both set and >= jobRunStartTime (or timeout) Map finalLastRunHistory = await().atMost(timeout).pollInterval(pause).until(jobLastRunHistorySupplier(jobId), lastRunHistory -> { + String jobRunStartText = lastRunHistory.get("jobRunStartTime"); + if (jobRunStartText == null) { + return false; + } String jobRunEndText = lastRunHistory.get("jobRunEndTime"); if (jobRunEndText == null) { return false; } + Instant jobRunStartTime = df.parse(jobRunStartText, Instant::from); Instant jobRunEndTime = df.parse(jobRunEndText, Instant::from); - Instant jobRunStartTime = df.parse(lastRunHistory.get("jobRunStartTime"), Instant::from); - return jobRunEndTime.equals(jobRunStartTime) || jobRunEndTime.isAfter(jobRunStartTime); + return (jobRunStartTime.equals(beforeExecuteTime) || jobRunStartTime.isAfter(beforeExecuteTime)) + && (jobRunEndTime.equals(jobRunStartTime) || jobRunEndTime.isAfter(jobRunStartTime)); }); // Verify triggerType diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java new file mode 100644 index 000000000..ffe553ad6 --- /dev/null +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTestLifecycleExtension.java @@ -0,0 +1,79 @@ +/** + * 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.common.loans; + +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.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.HashMap; +import java.util.List; +import org.apache.fineract.client.models.GetLoansLoanIdResponse; +import org.apache.fineract.client.models.PostLoansLoanIdRequest; +import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest; +import org.apache.fineract.integrationtests.common.Utils; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class LoanTestLifecycleExtension implements AfterEachCallback { + + private ResponseSpecification responseSpec; + private RequestSpecification requestSpec; + private LoanTransactionHelper loanTransactionHelper; + private DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMMM yyyy").toFormatter(); + + @Override + public void afterEach(ExtensionContext context) throws Exception { + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + + // Fully repay ACTIVE loans, so it will not be picked up by any jobs + List loanIds = LoanTransactionHelper.getLoanIdsByStatusId(requestSpec, responseSpec, 300); + loanIds.forEach(loanId -> { + HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanId); + LocalDate transactionDate = LocalDate.of((Integer) ((List) prepayDetail.get("date")).get(0), + (Integer) ((List) prepayDetail.get("date")).get(1), (Integer) ((List) prepayDetail.get("date")).get(2)); + Double amount = Double.parseDouble(String.valueOf(prepayDetail.get("amount"))); + Double netDisbursalAmount = Double.parseDouble(String.valueOf(prepayDetail.get("netDisbursalAmount"))); + Double repayAmount = Double.compare(amount, 0.0) > 0 ? amount : netDisbursalAmount; + loanTransactionHelper.makeLoanRepayment((long) loanId, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy") + .transactionDate(dateFormatter.format(transactionDate)).locale("en").transactionAmount(repayAmount)); + }); + // Undo APPROVED loans, so the next step can REJECT them, so it will not be picked up by any jobs + loanIds = LoanTransactionHelper.getLoanIdsByStatusId(requestSpec, responseSpec, 200); + loanIds.forEach(loanId -> { + loanTransactionHelper.undoApproval(loanId); + }); + // Mark SUBMITTED loans, as REJECTED, so it will not be picked up by any jobs + loanIds = LoanTransactionHelper.getLoanIdsByStatusId(requestSpec, responseSpec, 100); + loanIds.forEach(loanId -> { + GetLoansLoanIdResponse details = loanTransactionHelper.getLoanDetails((long) loanId); + loanTransactionHelper.rejectLoan((long) loanId, + new PostLoansLoanIdRequest().rejectedOnDate(dateFormatter.format(details.getTimeline().getSubmittedOnDate())) + .locale("en").dateFormat("dd MMMM yyyy")); + }); + } +} diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java index 5d3860777..2455ea4a9 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java @@ -349,9 +349,9 @@ public class LoanTransactionHelper extends IntegrationTest { getDisburseLoanAsJSON(date, null, netDisbursalAmount)); } - public HashMap disburseLoan(final String date, final Integer loanID, final String netDisbursalAmount, final String externalId) { + public HashMap disburseLoan(final String date, final Integer loanID, final String transactionAmount, final String externalId) { return (HashMap) performLoanTransaction(createLoanOperationURL(DISBURSE_LOAN_COMMAND, loanID), - getDisburseLoanAsJSON(date, null, netDisbursalAmount, externalId), ""); + getDisburseLoanAsJSON(date, transactionAmount, null, externalId), ""); } public HashMap disburseLoanWithTransactionAmount(final String date, final Integer loanID, final String transactionAmount) { @@ -1741,6 +1741,10 @@ public class LoanTransactionHelper extends IntegrationTest { return ok(fineract().loans.stateTransitions1(loanExternalId, request, "reject")); } + public PostLoansLoanIdResponse rejectLoan(Long loanId, PostLoansLoanIdRequest request) { + return ok(fineract().loans.stateTransitions(loanId, request, "reject")); + } + public PostLoansLoanIdResponse withdrawnByApplicantLoan(String loanExternalId, PostLoansLoanIdRequest request) { return ok(fineract().loans.stateTransitions1(loanExternalId, request, "withdrawnByApplicant")); } @@ -1832,4 +1836,12 @@ public class LoanTransactionHelper extends IntegrationTest { public PostLoansLoanIdTransactionsResponse undoChargeOffLoan(Long loanId, PostLoansLoanIdTransactionsRequest request) { return ok(fineract().loanTransactions.executeLoanTransaction(loanId, request, "undo-charge-off")); } + + public static List getLoanIdsByStatusId(RequestSpecification requestSpec, ResponseSpecification responseSpec, + Integer statusId) { + final String GET_LOAN_URL = "/fineract-provider/api/v1/internal/loan/status/" + statusId + "?" + Utils.TENANT_IDENTIFIER; + log.info("---------------------------------GET LOANS BY STATUS---------------------------------------------"); + final String get = Utils.performServerGet(requestSpec, responseSpec, GET_LOAN_URL, null); + return new Gson().fromJson(get, new TypeToken>() {}.getType()); + } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java index 2ad4564ee..17c458691 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java @@ -40,6 +40,7 @@ import org.apache.fineract.integrationtests.common.GroupHelper; import org.apache.fineract.integrationtests.common.Utils; 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.savings.SavingsAccountHelper; import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper; @@ -47,12 +48,14 @@ import org.apache.fineract.integrationtests.common.system.DatatableHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Entity Datatable Checks Integration Test for checking Creation, Deletion and Retrieval of Entity-Datatable Check */ +@ExtendWith(LoanTestLifecycleExtension.class) public class EntityDatatableChecksIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(EntityDatatableChecksIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java index fd17adc88..ad8122047 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java @@ -51,14 +51,17 @@ import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.Utils; 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.system.CodeHelper; import org.apache.fineract.integrationtests.common.system.DatatableHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class DatatableIntegrationTest extends IntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(DatatableIntegrationTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java index 1f90461f6..4d76c7709 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java @@ -43,14 +43,17 @@ import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@ExtendWith(LoanTestLifecycleExtension.class) public class GuarantorTest { private static final Logger LOG = LoggerFactory.getLogger(GuarantorTest.class); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java index f9a3b5365..41cbebee5 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/inlinecob/InlineLoanCOBTest.java @@ -58,6 +58,7 @@ import org.apache.fineract.integrationtests.common.loans.LoanAccountLockHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.apache.fineract.integrationtests.common.products.DelinquencyBucketsHelper; import org.apache.fineract.integrationtests.common.products.DelinquencyRangesHelper; @@ -67,8 +68,10 @@ import org.apache.http.HttpStatus; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; @Slf4j +@ExtendWith(LoanTestLifecycleExtension.class) public class InlineLoanCOBTest { private static final String REPAYMENT_LOAN_PERMISSION = "REPAYMENT_LOAN"; @@ -92,304 +95,343 @@ public class InlineLoanCOBTest { @Test public void testInlineCOB() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; - Assertions.assertNotNull(loanID); + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 3)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 3)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 10)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 3), loan.getLastClosedBusinessDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 10), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 10)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 10), loan.getLastClosedBusinessDate()); + } finally { + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testInlineCOBCatchUpLoans() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - ArrayList 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); + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, - delinquencyRangeResponse.getResourceId()); + ArrayList 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); - // Second Range - delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); - rangeIds.add(delinquencyRangeResponse.getResourceId()); + GetDelinquencyRangesResponse range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, + delinquencyRangeResponse.getResourceId()); - range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); - final String classificationExpected = range.getClassification(); - log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); + // Second Range + delinquencyRangeResponse = DelinquencyRangesHelper.createDelinquencyRange(requestSpec, responseSpec, jsonRange); + rangeIds.add(delinquencyRangeResponse.getResourceId()); - String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); - PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, - responseSpec, jsonBucket); - assertNotNull(delinquencyBucketResponse); - final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, - delinquencyBucketResponse.getResourceId()); + range = DelinquencyRangesHelper.getDelinquencyRange(requestSpec, responseSpec, delinquencyRangeResponse.getResourceId()); + final String classificationExpected = range.getClassification(); + log.info("Expected Delinquency Range classification after Disbursement {}", classificationExpected); - final Integer loanProductID = createLoanProduct(loanTransactionHelper, delinquencyBucket.getId()); + String jsonBucket = DelinquencyBucketsHelper.getAsJSON(rangeIds); + PostDelinquencyBucketResponse delinquencyBucketResponse = DelinquencyBucketsHelper.createDelinquencyBucket(requestSpec, + responseSpec, jsonBucket); + assertNotNull(delinquencyBucketResponse); + final GetDelinquencyBucketsResponse delinquencyBucket = DelinquencyBucketsHelper.getDelinquencyBucket(requestSpec, responseSpec, + delinquencyBucketResponse.getResourceId()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; + final Integer loanProductID = createLoanProduct(loanTransactionHelper, delinquencyBucket.getId()); - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; - Assertions.assertNotNull(loanID); + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - ArrayList loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, - responseSpec, loanID); - Assertions.assertTrue(loanDelinquencyTags.isEmpty()); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 4)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + ArrayList loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, + responseSpec, loanID); + Assertions.assertTrue(loanDelinquencyTags.isEmpty()); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 4, 4), loan.getLastClosedBusinessDate()); - Assertions.assertEquals(1, loanDelinquencyTags.size()); - Assertions.assertEquals(LocalDate.of(2020, 4, 3), loanDelinquencyTags.get(0).getAddedOnDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 4)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 10)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 4, 4), loan.getLastClosedBusinessDate()); + Assertions.assertEquals(1, loanDelinquencyTags.size()); + Assertions.assertEquals(LocalDate.of(2020, 4, 3), loanDelinquencyTags.get(0).getAddedOnDate()); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 4, 10), loan.getLastClosedBusinessDate()); - Assertions.assertEquals(2, loanDelinquencyTags.size()); - Assertions.assertEquals(LocalDate.of(2020, 4, 3), loanDelinquencyTags.get(1).getAddedOnDate()); - Assertions.assertEquals(LocalDate.of(2020, 4, 6), loanDelinquencyTags.get(0).getAddedOnDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 4, 10)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + loanDelinquencyTags = loanTransactionHelper.getLoanDelinquencyTags(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 4, 10), loan.getLastClosedBusinessDate()); + Assertions.assertEquals(2, loanDelinquencyTags.size()); + Assertions.assertEquals(LocalDate.of(2020, 4, 3), loanDelinquencyTags.get(1).getAddedOnDate()); + Assertions.assertEquals(LocalDate.of(2020, 4, 6), loanDelinquencyTags.get(0).getAddedOnDate()); + } finally { + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testInlineCOBOnRepaymentWithSoftLockedLoan() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - Assertions.assertNotNull(loanID); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + Assertions.assertNotNull(loanID); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - createNewSimpleUserWithoutBypassPermission(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); - loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + createNewSimpleUserWithoutBypassPermission(); - loanTransactionHelper.makeRepayment("10 March 2020", 10.0f, loanID); + loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + loanTransactionHelper.makeRepayment("10 March 2020", 10.0f, loanID); + + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + } finally { + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testInlineCOBCatchUpOnRepaymentWithNotLockedLoan() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - Assertions.assertNotNull(loanID); + Assertions.assertNotNull(loanID); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); - createNewSimpleUserWithoutBypassPermission(); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + createNewSimpleUserWithoutBypassPermission(); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - loanTransactionHelper.makeRepayment("10 March 2020", 10.0f, loanID); + loanTransactionHelper.makeRepayment("10 March 2020", 10.0f, loanID); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + } finally { + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test public void testInlineCOBOnBatchAPI() { - GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); - GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); + try { + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2)); + GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build()); - final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); - Assertions.assertNotNull(clientID); + final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec); + Assertions.assertNotNull(clientID); - Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, - ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); - Assertions.assertNotNull(overdueFeeChargeId); + Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec, + ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1")); + Assertions.assertNotNull(overdueFeeChargeId); - final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); - Assertions.assertNotNull(loanProductID); - HashMap loanStatusHashMap; - final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); + final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString()); + Assertions.assertNotNull(loanProductID); + HashMap loanStatusHashMap; + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020"); - Assertions.assertNotNull(loanID); + Assertions.assertNotNull(loanID); - loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); - LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); - loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); - LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); - String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); - loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, - JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); - LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID); + loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID, + JsonPath.from(loanDetails).get("netDisbursalAmount").toString()); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); - inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); - GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2)); + inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue())); + GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate()); - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10)); - createNewSimpleUserWithoutBypassPermission(); + createNewSimpleUserWithoutBypassPermission(); - loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING"); - loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); + loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING"); + loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); - final BatchRequest br1 = BatchHelper.repayLoanRequestWithGivenLoanId(4730L, loanID, "10", LocalDate.of(2020, 3, 10)); + final BatchRequest br1 = BatchHelper.repayLoanRequestWithGivenLoanId(4730L, loanID, "10", LocalDate.of(2020, 3, 10)); - final List batchRequests = new ArrayList<>(); + final List batchRequests = new ArrayList<>(); - batchRequests.add(br1); + batchRequests.add(br1); - final String jsonifiedRequest = BatchHelper.toJsonString(batchRequests); + final String jsonifiedRequest = BatchHelper.toJsonString(batchRequests); - final List response = BatchHelper.postBatchRequestsWithoutEnclosingTransaction(this.requestSpec, this.responseSpec, - jsonifiedRequest); - Assertions.assertEquals(HttpStatus.SC_OK, (long) response.get(0).getStatusCode(), "Verify Status Code 200 for Repayment"); + final List response = BatchHelper.postBatchRequestsWithoutEnclosingTransaction(this.requestSpec, + this.responseSpec, jsonifiedRequest); + Assertions.assertEquals(HttpStatus.SC_OK, (long) response.get(0).getStatusCode(), "Verify Status Code 200 for Repayment"); - loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); - Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID); + Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate()); + } finally { + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); + } } @Test diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/variableinstallments/VariableInstallmentsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/variableinstallments/VariableInstallmentsIntegrationTest.java index 4396565cd..d30c0386c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/variableinstallments/VariableInstallmentsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/variableinstallments/VariableInstallmentsIntegrationTest.java @@ -32,14 +32,17 @@ import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CollateralManagementHelper; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker; +import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension; import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked" }) +@ExtendWith(LoanTestLifecycleExtension.class) public class VariableInstallmentsIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(VariableInstallmentsIntegrationTest.class);