diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 6c60f801e..c99e1cf08 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -582,7 +582,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf * cash based accounting is selected */ if (((loan.isMultiDisburmentLoan() && loan.getDisbursedLoanDisbursementDetails().size() == 1) || !loan.isMultiDisburmentLoan()) - && loan.isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { + && loan.isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct() && interestApplied.isGreaterThanZero()) { ExternalId externalId = ExternalId.empty(); if (TemporaryConfigurationServiceContainer.isExternalIdAutoGenerationEnabled()) { externalId = ExternalId.generate(); 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 75ce6a37d..6cffe97fb 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 @@ -46,8 +46,6 @@ import org.apache.fineract.integrationtests.common.BusinessDateHelper; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.LoanRescheduleRequestHelper; import org.apache.fineract.integrationtests.common.Utils; -import org.apache.fineract.integrationtests.common.accounting.Account; -import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.charges.ChargesHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; @@ -69,7 +67,6 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat private LoanTransactionHelper loanTransactionHelper; private LoanRescheduleRequestHelper loanRescheduleRequestHelper; private InlineLoanCOBHelper inlineLoanCOBHelper; - private AccountHelper accountHelper; @BeforeEach public void setup() { @@ -81,7 +78,6 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); this.loanRescheduleRequestHelper = new LoanRescheduleRequestHelper(this.requestSpec, this.responseSpec); this.businessDateHelper = new BusinessDateHelper(); - this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec); inlineLoanCOBHelper = new InlineLoanCOBHelper(requestSpec, responseSpec); } @@ -103,16 +99,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", true)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -172,19 +162,31 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); - assertEquals(thirdRepaymentId, response.getTransactions().get(3).getId().intValue()); assertNull(response.getTransactions().get(3).getReversedOnDate()); assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(3).getType().getRepayment()); + assertTrue(response.getTransactions().get(3).getType().getAccrual()); assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); - assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); assertEquals(firstChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + assertEquals(thirdRepaymentId, response.getTransactions().get(4).getId().intValue()); + assertNull(response.getTransactions().get(4).getReversedOnDate()); + assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(4).getType().getRepayment()); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(4).getLoanChargePaidByList().size()); } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, @@ -214,19 +216,13 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", true)); Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -292,19 +288,43 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); assertEquals(400.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); - assertEquals(thirdRepaymentId, response.getTransactions().get(3).getId().intValue()); assertNull(response.getTransactions().get(3).getReversedOnDate()); assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(3).getType().getRepayment()); - assertEquals(100.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); - assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); + assertTrue(response.getTransactions().get(3).getType().getAccrual()); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); - assertEquals(350.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); assertEquals(firstChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + assertEquals(thirdRepaymentId, response.getTransactions().get(4).getId().intValue()); + assertNull(response.getTransactions().get(4).getReversedOnDate()); + assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(4).getType().getRepayment()); + assertEquals(100.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); + assertEquals(50.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); + assertEquals(350.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(4).getLoanChargePaidByList().size()); + assertNull(response.getTransactions().get(5).getReversedOnDate()); + assertTrue(response.getTransactions().get(5).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(5).getType().getAccrual()); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(5).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getInterestPortion())); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(5).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOutstandingLoanBalance())); + assertEquals(secondChargeId, response.getTransactions().get(5).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(5).getLoanChargePaidByList().size()); } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, new PutGlobalConfigurationsRequest().enabled(false)); @@ -327,16 +347,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -446,16 +460,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "3", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "90", "30", "3", "0", @@ -537,16 +545,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "50", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "3", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "90", "30", "3", "0", @@ -687,16 +689,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.03.01").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "20", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -729,19 +725,31 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(firstRepaymentId, response.getTransactions().get(1).getId().intValue()); assertNull(response.getTransactions().get(1).getReversedOnDate()); assertTrue(response.getTransactions().get(1).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(1).getType().getRepayment()); - assertEquals(1010.0, Utils.getDoubleValue(response.getTransactions().get(1).getAmount())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(1).getPrincipalPortion())); + assertTrue(response.getTransactions().get(1).getType().getAccrual()); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(1).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(1).getPrincipalPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(1).getPenaltyChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(1).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(1).getInterestPortion())); - assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(1).getFeeChargesPortion())); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(1).getFeeChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(1).getOutstandingLoanBalance())); assertEquals(firstChargeId, response.getTransactions().get(1).getLoanChargePaidByList().get(0).getChargeId().intValue()); assertEquals(1, response.getTransactions().get(1).getLoanChargePaidByList().size()); + assertEquals(firstRepaymentId, response.getTransactions().get(2).getId().intValue()); + assertNull(response.getTransactions().get(2).getReversedOnDate()); + assertTrue(response.getTransactions().get(2).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(2).getType().getRepayment()); + assertEquals(1010.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(2).getLoanChargePaidByList().size()); } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, @@ -764,16 +772,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.01.28").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "15", true)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -865,20 +867,33 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(5.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(secondRepayment, response.getTransactions().get(2).getId().intValue()); assertNull(response.getTransactions().get(2).getReversedOnDate()); assertTrue(response.getTransactions().get(2).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(2).getType().getRepayment()); - assertEquals(1010.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); - assertEquals(995.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); + assertTrue(response.getTransactions().get(2).getType().getAccrual()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); - assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); assertEquals(1, response.getTransactions().get(2).getLoanChargePaidByList().size()); + assertEquals(secondRepayment, response.getTransactions().get(3).getId().intValue()); + assertNull(response.getTransactions().get(3).getReversedOnDate()); + assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(3).getType().getRepayment()); + assertEquals(1010.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); + assertEquals(995.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); + assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, new PutGlobalConfigurationsRequest().enabled(false)); @@ -901,18 +916,12 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.15").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "20", false)); Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "15", true)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -1027,20 +1036,46 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(1000.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(secondRepayment, response.getTransactions().get(2).getId().intValue()); assertNull(response.getTransactions().get(2).getReversedOnDate()); assertTrue(response.getTransactions().get(2).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(2).getType().getRepayment()); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); + assertTrue(response.getTransactions().get(2).getType().getAccrual()); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); - assertEquals(secondChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); assertEquals(1, response.getTransactions().get(2).getLoanChargePaidByList().size()); + assertNull(response.getTransactions().get(3).getReversedOnDate()); + assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(3).getType().getAccrual()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); + assertEquals(secondChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + + assertEquals(secondRepayment, response.getTransactions().get(4).getId().intValue()); + assertNull(response.getTransactions().get(4).getReversedOnDate()); + assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(4).getType().getRepayment()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); + assertEquals(secondChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(4).getLoanChargePaidByList().size()); + Integer thirdRepayment = (Integer) loanTransactionHelper.makeRepayment("01 March 2023", Float.parseFloat("1000.00"), loanID) .get("resourceId"); @@ -1058,18 +1093,18 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(thirdRepayment, response.getTransactions().get(3).getId().intValue()); - assertNull(response.getTransactions().get(3).getReversedOnDate()); - assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(3).getType().getRepayment()); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); - assertEquals(0, response.getTransactions().get(3).getLoanChargePaidByList().size()); + assertEquals(thirdRepayment, response.getTransactions().get(5).getId().intValue()); + assertNull(response.getTransactions().get(5).getReversedOnDate()); + assertTrue(response.getTransactions().get(5).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(5).getType().getRepayment()); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(5).getAmount())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(5).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOutstandingLoanBalance())); + assertEquals(0, response.getTransactions().get(5).getLoanChargePaidByList().size()); Integer forthRepayment = (Integer) loanTransactionHelper.makeRepayment("01 March 2023", Float.parseFloat("10.00"), loanID) .get("resourceId"); @@ -1088,19 +1123,19 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(forthRepayment, response.getTransactions().get(4).getId().intValue()); - assertNull(response.getTransactions().get(4).getReversedOnDate()); - assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(4).getType().getRepayment()); - assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); - assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); - assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); - assertEquals(1, response.getTransactions().get(4).getLoanChargePaidByList().size()); + assertEquals(forthRepayment, response.getTransactions().get(6).getId().intValue()); + assertNull(response.getTransactions().get(6).getReversedOnDate()); + assertTrue(response.getTransactions().get(6).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(6).getType().getRepayment()); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(6).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getInterestPortion())); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(6).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(6).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(6).getLoanChargePaidByList().size()); } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, @@ -1127,18 +1162,12 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.02.15").dateFormat("yyyy.MM.dd").locale("en")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "20", false)); Integer penalty = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "15", true)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -1253,25 +1282,51 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(1).getPrincipalOutstanding())); assertTrue(response.getStatus().getActive()); - assertEquals(secondRepayment, response.getTransactions().get(2).getId().intValue()); assertNull(response.getTransactions().get(2).getReversedOnDate()); assertTrue(response.getTransactions().get(2).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(2).getType().getRepayment()); - assertEquals(1030.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); + assertTrue(response.getTransactions().get(2).getType().getAccrual()); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(2).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getPenaltyChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOverpaymentPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getInterestPortion())); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); + assertEquals(20.0, Utils.getDoubleValue(response.getTransactions().get(2).getFeeChargesPortion())); assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(2).getOutstandingLoanBalance())); - if (secondChargeId.equals(response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue())) { - assertEquals(secondChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); - assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(1).getChargeId().intValue()); + assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(2).getLoanChargePaidByList().size()); + + assertNull(response.getTransactions().get(3).getReversedOnDate()); + assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(3).getType().getAccrual()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); + assertEquals(secondChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + + assertEquals(secondRepayment, response.getTransactions().get(4).getId().intValue()); + assertNull(response.getTransactions().get(4).getReversedOnDate()); + assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(4).getType().getRepayment()); + assertEquals(1030.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); + if (secondChargeId.equals(response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue())) { + assertEquals(secondChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(1).getChargeId().intValue()); } else { - assertEquals(secondChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(1).getChargeId().intValue()); - assertEquals(firstChargeId, response.getTransactions().get(2).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(secondChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(1).getChargeId().intValue()); + assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); } - assertEquals(2, response.getTransactions().get(2).getLoanChargePaidByList().size()); + assertEquals(2, response.getTransactions().get(4).getLoanChargePaidByList().size()); businessDateHelper.updateBusinessDate(new BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName()) .date("2023.03.07").dateFormat("yyyy.MM.dd").locale("en")); @@ -1313,19 +1368,32 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalPaid())); assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalOutstanding())); - assertEquals(thirdRepayment, response.getTransactions().get(3).getId().intValue()); - assertNull(response.getTransactions().get(3).getReversedOnDate()); - assertTrue(response.getTransactions().get(3).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(3).getType().getRepayment()); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getAmount())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getPrincipalPortion())); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(3).getPenaltyChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getOverpaymentPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getInterestPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(3).getFeeChargesPortion())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(3).getOutstandingLoanBalance())); - assertEquals(secondChargeId, response.getTransactions().get(3).getLoanChargePaidByList().get(0).getChargeId().intValue()); - assertEquals(1, response.getTransactions().get(3).getLoanChargePaidByList().size()); + assertNull(response.getTransactions().get(5).getReversedOnDate()); + assertTrue(response.getTransactions().get(5).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(5).getType().getAccrual()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(5).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(5).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOutstandingLoanBalance())); + assertEquals(thirdChargeId, response.getTransactions().get(5).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(5).getLoanChargePaidByList().size()); + + assertEquals(thirdRepayment, response.getTransactions().get(6).getId().intValue()); + assertNull(response.getTransactions().get(6).getReversedOnDate()); + assertTrue(response.getTransactions().get(6).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(6).getType().getRepayment()); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(6).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getPrincipalPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(6).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getInterestPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(6).getFeeChargesPortion())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(6).getOutstandingLoanBalance())); + assertEquals(secondChargeId, response.getTransactions().get(6).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(6).getLoanChargePaidByList().size()); Integer forthRepayment = (Integer) loanTransactionHelper.makeRepayment("08 March 2023", Float.parseFloat("1015.00"), loanID) .get("resourceId"); @@ -1354,19 +1422,19 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalPaid())); assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalOutstanding())); - assertEquals(forthRepayment, response.getTransactions().get(4).getId().intValue()); - assertNull(response.getTransactions().get(4).getReversedOnDate()); - assertTrue(response.getTransactions().get(4).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(4).getType().getRepayment()); - assertEquals(1015.0, Utils.getDoubleValue(response.getTransactions().get(4).getAmount())); - assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(4).getPrincipalPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getPenaltyChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOverpaymentPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getInterestPortion())); - assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(4).getFeeChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(4).getOutstandingLoanBalance())); - assertEquals(firstChargeId, response.getTransactions().get(4).getLoanChargePaidByList().get(0).getChargeId().intValue()); - assertEquals(1, response.getTransactions().get(4).getLoanChargePaidByList().size()); + assertEquals(forthRepayment, response.getTransactions().get(7).getId().intValue()); + assertNull(response.getTransactions().get(7).getReversedOnDate()); + assertTrue(response.getTransactions().get(7).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(7).getType().getRepayment()); + assertEquals(1015.0, Utils.getDoubleValue(response.getTransactions().get(7).getAmount())); + assertEquals(1000.0, Utils.getDoubleValue(response.getTransactions().get(7).getPrincipalPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(7).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(7).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(7).getInterestPortion())); + assertEquals(15.0, Utils.getDoubleValue(response.getTransactions().get(7).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(7).getOutstandingLoanBalance())); + assertEquals(firstChargeId, response.getTransactions().get(7).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(1, response.getTransactions().get(7).getLoanChargePaidByList().size()); Integer fifthRepayment = (Integer) loanTransactionHelper.makeRepayment("08 March 2023", Float.parseFloat("10.00"), loanID) .get("resourceId"); @@ -1395,24 +1463,24 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalPaid())); assertEquals(0.0, Utils.getDoubleValue(response.getRepaymentSchedule().getPeriods().get(2).getPrincipalOutstanding())); - assertEquals(fifthRepayment, response.getTransactions().get(5).getId().intValue()); - assertNull(response.getTransactions().get(5).getReversedOnDate()); - assertTrue(response.getTransactions().get(5).getTransactionRelations().isEmpty()); - assertTrue(response.getTransactions().get(5).getType().getRepayment()); - assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(5).getAmount())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getPrincipalPortion())); - assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(5).getPenaltyChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOverpaymentPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getInterestPortion())); - assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(5).getFeeChargesPortion())); - assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(5).getOutstandingLoanBalance())); - if (firstChargeId.equals(response.getTransactions().get(5).getLoanChargePaidByList().get(0).getChargeId().intValue())) { - assertEquals(thirdChargeId, response.getTransactions().get(5).getLoanChargePaidByList().get(1).getChargeId().intValue()); + assertEquals(fifthRepayment, response.getTransactions().get(8).getId().intValue()); + assertNull(response.getTransactions().get(8).getReversedOnDate()); + assertTrue(response.getTransactions().get(8).getTransactionRelations().isEmpty()); + assertTrue(response.getTransactions().get(8).getType().getRepayment()); + assertEquals(10.0, Utils.getDoubleValue(response.getTransactions().get(8).getAmount())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(8).getPrincipalPortion())); + assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(8).getPenaltyChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(8).getOverpaymentPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(8).getInterestPortion())); + assertEquals(5.0, Utils.getDoubleValue(response.getTransactions().get(8).getFeeChargesPortion())); + assertEquals(0.0, Utils.getDoubleValue(response.getTransactions().get(8).getOutstandingLoanBalance())); + if (firstChargeId.equals(response.getTransactions().get(8).getLoanChargePaidByList().get(0).getChargeId().intValue())) { + assertEquals(thirdChargeId, response.getTransactions().get(8).getLoanChargePaidByList().get(1).getChargeId().intValue()); } else { - assertEquals(firstChargeId, response.getTransactions().get(5).getLoanChargePaidByList().get(1).getChargeId().intValue()); - assertEquals(thirdChargeId, response.getTransactions().get(5).getLoanChargePaidByList().get(0).getChargeId().intValue()); + assertEquals(firstChargeId, response.getTransactions().get(8).getLoanChargePaidByList().get(1).getChargeId().intValue()); + assertEquals(thirdChargeId, response.getTransactions().get(8).getLoanChargePaidByList().get(0).getChargeId().intValue()); } - assertEquals(2, response.getTransactions().get(5).getLoanChargePaidByList().size()); + assertEquals(2, response.getTransactions().get(8).getLoanChargePaidByList().size()); } finally { globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE, @@ -1437,16 +1505,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.CHARGE_ACCRUAL_DATE, new PutGlobalConfigurationsRequest().stringValue("submitted-date")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "3.65", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -1635,16 +1697,10 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.CHARGE_ACCRUAL_DATE, new PutGlobalConfigurationsRequest().stringValue("submitted-date")); - final Account assetAccount = this.accountHelper.createAssetAccount(); - final Account incomeAccount = this.accountHelper.createIncomeAccount(); - final Account expenseAccount = this.accountHelper.createExpenseAccount(); - final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Integer fee = ChargesHelper.createCharges(requestSpec, responseSpec, ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "3.65", false)); final Integer loanProductID = createLoanProductWithNoAccountingNoInterest("1000", "30", "1", "0", - LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount); + LoanProductTestBuilder.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST_STRATEGY); final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec, "01 January 2023"); final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "30", "30", "1", "0", @@ -1830,13 +1886,13 @@ public class DueDateRespectiveLoanRepaymentScheduleTest extends BaseLoanIntegrat } private Integer createLoanProductWithNoAccountingNoInterest(final String principal, final String repaymentAfterEvery, - final String numberOfRepayments, final String interestRate, final String repaymentStrategy, final Account... accounts) { + final String numberOfRepayments, final String interestRate, final String repaymentStrategy) { LOG.info("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); final String loanProductJSON = new LoanProductTestBuilder().withPrincipal(principal).withRepaymentTypeAsDays() .withRepaymentAfterEvery(repaymentAfterEvery).withNumberOfRepayments(numberOfRepayments) .withinterestRatePerPeriod(interestRate).withInterestRateFrequencyTypeAsMonths().withRepaymentStrategy(repaymentStrategy) - .withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat().withAccountingRulePeriodicAccrual(accounts) - .withDaysInMonth("30").withDaysInYear("365").withMoratorium("0", "0").build(null); + .withAmortizationTypeAsEqualPrincipalPayment().withInterestTypeAsFlat().withAccountingRuleAsNone().withDaysInMonth("30") + .withDaysInYear("365").withMoratorium("0", "0").build(null); return loanTransactionHelper.getLoanProductId(loanProductJSON); } 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 dc95bafa8..a928a1fb2 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 @@ -281,7 +281,7 @@ public class LoanTransactionChargebackTest extends BaseLoanIntegrationTest { List loanTransactions = getLoansLoanIdResponse.getTransactions(); assertNotNull(loanTransactions); log.info("Loan Id {} with {} transactions", loanId, loanTransactions.size()); - assertEquals(2, loanTransactions.size()); + assertEquals(1, loanTransactions.size()); GetLoansLoanIdTransactions loanTransaction = loanTransactions.iterator().next(); log.info("Try to apply the Charge back over transaction Id {} with type {}", loanTransaction.getId(), loanTransaction.getType().getCode());