FINERACT-60 : Interest compounding, nth day rest frequency and meeting calendar date changes
Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/763cf18b Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/763cf18b Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/763cf18b Branch: refs/heads/develop Commit: 763cf18b90a5956356fdce270588ad923da2e8f9 Parents: a9f811c Author: Vishwa <vishwan...@confluxtechnologies.com> Authored: Wed May 4 14:44:05 2016 +0530 Committer: Vishwa <vishwan...@confluxtechnologies.com> Committed: Wed May 4 17:27:00 2016 +0530 ---------------------------------------------------------------------- .../AccountingScenarioIntegrationTest.java | 14 +- .../ClientLoanIntegrationTest.java | 334 +- ...anRepaymentRescheduleAtDisbursementTest.java | 41 +- .../LoanReschedulingWithinCenterTest.java | 26 +- .../loans/LoanApplicationTestBuilder.java | 16 - .../common/loans/LoanProductTestBuilder.java | 24 +- .../journalentry/domain/JournalEntry.java | 3 + .../domain/JournalEntryRepository.java | 12 +- .../service/AccountingProcessorHelper.java | 8 +- .../AccrualBasedAccountingProcessorForLoan.java | 111 +- .../infrastructure/jobs/service/JobName.java | 5 +- .../portfolio/calendar/CalendarConstants.java | 3 +- .../calendar/api/CalendarsApiResource.java | 3 +- .../portfolio/calendar/data/CalendarData.java | 84 +- .../portfolio/calendar/domain/Calendar.java | 77 +- .../calendar/domain/CalendarInstance.java | 2 +- .../CalendarCommandFromApiJsonDeserializer.java | 11 + .../CalendarDropdownReadPlatformService.java | 1 + ...CalendarDropdownReadPlatformServiceImpl.java | 4 + .../calendar/service/CalendarEnumerations.java | 27 +- .../CalendarReadPlatformServiceImpl.java | 16 +- .../calendar/service/CalendarUtils.java | 113 +- ...arWritePlatformServiceJpaRepositoryImpl.java | 7 +- .../portfolio/common/domain/NthDayType.java | 17 + .../service/CenterReadPlatformServiceImpl.java | 5 +- .../loanaccount/api/LoanApiConstants.java | 41 +- .../loanaccount/api/LoansApiResource.java | 22 +- .../loanaccount/data/LoanAccountData.java | 32 + .../data/LoanInterestRecalculationData.java | 36 +- .../portfolio/loanaccount/domain/Loan.java | 443 ++- .../domain/LoanInstallmentCharge.java | 6 + ...nInterestRecalcualtionAdditionalDetails.java | 62 + .../LoanInterestRecalculationDetails.java | 157 +- .../LoanRepaymentScheduleInstallment.java | 17 +- .../loanaccount/domain/LoanTransaction.java | 29 + .../loanaccount/domain/LoanTransactionType.java | 9 +- .../loanschedule/data/LoanScheduleParams.java | 76 +- .../domain/AbstractLoanScheduleGenerator.java | 502 ++- ...ingBalanceInterestLoanScheduleGenerator.java | 19 +- .../domain/DefaultScheduledDateGenerator.java | 17 +- .../domain/LoanApplicationTerms.java | 3363 ++++++++---------- .../LoanScheduleModelDisbursementPeriod.java | 6 + .../domain/LoanScheduleModelPeriod.java | 3 + .../LoanScheduleModelRepaymentPeriod.java | 8 + .../domain/ScheduledDateGenerator.java | 4 +- .../service/LoanScheduleAssembler.java | 103 +- ...scheduleRequestWritePlatformServiceImpl.java | 5 +- ...ulateLoanScheduleQueryFromApiJsonHelper.java | 33 +- ...LoanApplicationCommandFromApiJsonHelper.java | 99 +- .../service/LoanAccrualPlatformService.java | 1 + .../service/LoanAccrualPlatformServiceImpl.java | 20 + .../LoanAccrualWritePlatformService.java | 1 + .../LoanAccrualWritePlatformServiceImpl.java | 41 +- ...onWritePlatformServiceJpaRepositoryImpl.java | 213 +- .../loanaccount/service/LoanAssembler.java | 9 +- .../service/LoanReadPlatformService.java | 1 + .../service/LoanReadPlatformServiceImpl.java | 107 +- ...anWritePlatformServiceJpaRepositoryImpl.java | 54 +- .../loanproduct/LoanProductConstants.java | 10 +- .../api/LoanProductsApiResource.java | 7 +- .../loanproduct/data/LoanProductData.java | 53 +- .../LoanProductInterestRecalculationData.java | 76 +- ...LoanProductInterestRecalculationDetails.java | 272 +- .../domain/LoanProductRelatedDetail.java | 4 +- .../serialization/LoanProductDataValidator.java | 69 +- .../LoanDropdownReadPlatformService.java | 2 + .../LoanDropdownReadPlatformServiceImpl.java | 28 +- .../loanproduct/service/LoanEnumerations.java | 49 + .../LoanProductReadPlatformServiceImpl.java | 46 +- ...ssWritePlatformServiceJpaRepositoryImpl.java | 4 +- ...req_and_insertion_script_for_accrual_job.sql | 60 + ...LoanRepaymentScheduleInstallmentBuilder.java | 6 +- 72 files changed, 4180 insertions(+), 3009 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java index 0e40d74..f86bc32 100644 --- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java @@ -166,8 +166,7 @@ public class AccountingScenarioIntegrationTest { float expected_value = this.LP_PRINCIPAL - PRINCIPAL_VALUE_FOR_EACH_PERIOD; this.loanTransactionHelper.verifyRepaymentScheduleEntryFor(1, expected_value, loanID); final JournalEntry[] assetAccountFirstEntry = { new JournalEntry(this.REPAYMENT_AMOUNT[1], JournalEntry.TransactionType.DEBIT), - new JournalEntry(FIRST_INTEREST, JournalEntry.TransactionType.CREDIT), - new JournalEntry(FIRST_PRINCIPAL, JournalEntry.TransactionType.CREDIT), }; + new JournalEntry(FIRST_INTEREST + FIRST_PRINCIPAL, JournalEntry.TransactionType.CREDIT) }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, this.REPAYMENT_DATE[1], assetAccountFirstEntry); System.out.println("Repayment 1 Done......"); @@ -179,8 +178,7 @@ public class AccountingScenarioIntegrationTest { expected_value = expected_value - PRINCIPAL_VALUE_FOR_EACH_PERIOD; this.loanTransactionHelper.verifyRepaymentScheduleEntryFor(2, expected_value, loanID); final JournalEntry[] assetAccountSecondEntry = { new JournalEntry(this.REPAYMENT_AMOUNT[2], JournalEntry.TransactionType.DEBIT), - new JournalEntry(SECOND_AND_THIRD_INTEREST, JournalEntry.TransactionType.CREDIT), - new JournalEntry(SECOND_PRINCIPAL, JournalEntry.TransactionType.CREDIT), }; + new JournalEntry(SECOND_AND_THIRD_INTEREST + SECOND_PRINCIPAL, JournalEntry.TransactionType.CREDIT) }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, this.REPAYMENT_DATE[2], assetAccountSecondEntry); System.out.println("Repayment 2 Done ......"); @@ -605,8 +603,7 @@ public class AccountingScenarioIntegrationTest { float expected_value = this.LP_PRINCIPAL - PRINCIPAL_VALUE_FOR_EACH_PERIOD; this.loanTransactionHelper.verifyRepaymentScheduleEntryFor(1, expected_value, loanID); final JournalEntry[] assetAccountFirstEntry = { new JournalEntry(this.REPAYMENT_AMOUNT[1], JournalEntry.TransactionType.DEBIT), - new JournalEntry(FIRST_INTEREST, JournalEntry.TransactionType.CREDIT), - new JournalEntry(FIRST_PRINCIPAL, JournalEntry.TransactionType.CREDIT), }; + new JournalEntry(FIRST_INTEREST + FIRST_PRINCIPAL, JournalEntry.TransactionType.CREDIT) }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, this.REPAYMENT_DATE[1], assetAccountFirstEntry); System.out.println("Repayment 1 Done......"); @@ -622,8 +619,7 @@ public class AccountingScenarioIntegrationTest { FEE_PORTION, PENALTY_PORTION, loanID); this.loanTransactionHelper.verifyRepaymentScheduleEntryFor(2, expected_value, loanID); final JournalEntry[] assetAccountSecondEntry = { new JournalEntry(this.REPAYMENT_AMOUNT[2], JournalEntry.TransactionType.DEBIT), - new JournalEntry(SECOND_AND_THIRD_INTEREST, JournalEntry.TransactionType.CREDIT), - new JournalEntry(SECOND_PRINCIPAL, JournalEntry.TransactionType.CREDIT), }; + new JournalEntry(SECOND_AND_THIRD_INTEREST + SECOND_PRINCIPAL, JournalEntry.TransactionType.CREDIT) }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, this.REPAYMENT_DATE[2], assetAccountSecondEntry); System.out.println("Repayment 2 Done ......"); @@ -723,7 +719,7 @@ public class AccountingScenarioIntegrationTest { float expected_value = this.LP_PRINCIPAL - PRINCIPAL_VALUE_FOR_EACH_PERIOD; this.loanTransactionHelper.verifyRepaymentScheduleEntryFor(1, expected_value, loanID); final JournalEntry[] assetAccountEntry = { new JournalEntry(15000f, JournalEntry.TransactionType.DEBIT), - new JournalEntry(1000f, JournalEntry.TransactionType.CREDIT), new JournalEntry(10000f, JournalEntry.TransactionType.CREDIT) }; + new JournalEntry(11000f, JournalEntry.TransactionType.CREDIT) }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, this.REPAYMENT_DATE[1], assetAccountEntry); this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, this.REPAYMENT_DATE[1], new JournalEntry(4000f, JournalEntry.TransactionType.CREDIT)); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java index 8b52001..5696143 100644 --- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java @@ -1873,9 +1873,8 @@ public class ClientLoanIntegrationTest { validateCharge(flatInstallmentFee, loanCharges, "50", "150.00", "50.0", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("150.00"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(flatSpecifiedDueDate), "29 October 2011", "100")); @@ -1899,9 +1898,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3251.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("100"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -1937,17 +1934,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("100"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("150"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2811.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3301.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("50.00"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3129.11"), + new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(flatPenaltySpecifiedDueDate), "10 January 2012", "100")); @@ -1970,10 +1963,10 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make over payment for repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3220.60"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3220.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("50.00"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); - this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", new JournalEntry(80.92f, + Float.valueOf("3220.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3139.68"), JournalEntry.TransactionType.CREDIT)); + this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", + new JournalEntry(Float.valueOf("80.92"), JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsOverPaid(loanStatusHashMap); } @@ -2069,9 +2062,8 @@ public class ClientLoanIntegrationTest { validateCharge(percentageInstallmentFee, loanCharges, "1", "90.89", "29.11", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("149.11"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3300.60"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(percentageSpecifiedDueDateCharge), "29 October 2011", "1")); @@ -2095,9 +2087,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3271.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -2133,17 +2123,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("149.11"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2791.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3300.60"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3301.78"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("30.29"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3149.11"), + new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(percentagePenaltySpecifiedDueDate), "10 January 2012", "1")); @@ -2166,10 +2152,10 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make over payment for repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3220.58"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3220.58"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("30.90"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); - this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", new JournalEntry(100f, + Float.valueOf("3220.58"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3120.58"), JournalEntry.TransactionType.CREDIT)); + this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", + new JournalEntry(Float.valueOf("100.00"), JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsOverPaid(loanStatusHashMap); } @@ -2274,9 +2260,8 @@ public class ClientLoanIntegrationTest { validateCharge(amountPlusInterestPercentageInstallmentFee, loanCharges, "1", "94.53", "31.51", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("157.57"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3309.06"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan( loanID, @@ -2303,9 +2288,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3277.55"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("126.06"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -2343,17 +2326,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("157.57"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2791.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3309.06"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3303"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", new JournalEntry(Float.valueOf("3303"), - JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("31.51"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3149.11"), - JournalEntry.TransactionType.CREDIT)); + JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3303"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan( loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( @@ -2377,9 +2356,9 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make over payment for repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3221.61"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3221.61"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("31.51"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); - this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", new JournalEntry(100.42f, + Float.valueOf("3221.61"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3121.19"), + JournalEntry.TransactionType.CREDIT)); + this.journalEntryHelper.checkJournalEntryForLiabilityAccount(overpaymentAccount, "20 January 2012", new JournalEntry(Float.valueOf("100.42"), JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsOverPaid(loanStatusHashMap); @@ -2468,9 +2447,8 @@ public class ClientLoanIntegrationTest { validateCharge(flatInstallmentFee, loanCharges, "50", "150.00", "50.0", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("150.00"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(flatSpecifiedDueDate), "29 October 2011", "100")); @@ -2509,9 +2487,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3251.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("100.00"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3251.49"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -2547,17 +2523,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("100"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("150"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2811.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3301.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("50"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3129.11"), + new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.49"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( @@ -2581,8 +2553,8 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3139.68"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3139.68"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("50.00"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3139.68"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3139.68"), + JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap); } @@ -2673,9 +2645,8 @@ public class ClientLoanIntegrationTest { validateCharge(percentageInstallmentFee, loanCharges, "1", "90.89", "29.11", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("149.11"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3300.60"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( String.valueOf(percentageSpecifiedDueDateCharge), "29 October 2011", "1")); @@ -2715,9 +2686,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3271.49"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3271.49"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -2753,17 +2722,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("149.11"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2791.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3300.60"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3300.60"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3301.78"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("30.29"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3149.11"), + new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3301.78"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan(loanID, LoanTransactionHelper.getSpecifiedDueDateChargesForLoanAsJSON( @@ -2787,8 +2752,8 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3120.58"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3120.58"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("30.90"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3120.58"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3120.58"), + JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap); } @@ -2880,9 +2845,8 @@ public class ClientLoanIntegrationTest { validateCharge(amountPlusInterestPercentageInstallmentFee, loanCharges, "1", "94.53", "31.51", "0.0"); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("157.57"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("2911.49"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3309.06"), + JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan( loanID, @@ -2925,9 +2889,7 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 2------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3277.55"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", - new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("126.06"), - JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("181.77"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2969.72"), + new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3277.55"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); @@ -2965,17 +2927,13 @@ public class ClientLoanIntegrationTest { // checking the journal entry as applied penalty has been collected this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 October 2011", new JournalEntry( - Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("120"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("157.57"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2791.49"), - JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3309.06"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3309.06"), + JournalEntry.TransactionType.CREDIT)); System.out.println("----------Make repayment 3 advance------------"); this.loanTransactionHelper.makeRepayment("20 November 2011", Float.valueOf("3303"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 November 2011", new JournalEntry(Float.valueOf("3303"), - JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("31.51"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("122.38"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3149.11"), - JournalEntry.TransactionType.CREDIT)); + JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3303"), JournalEntry.TransactionType.CREDIT)); this.loanTransactionHelper.addChargesForLoan( loanID, @@ -3000,8 +2958,8 @@ public class ClientLoanIntegrationTest { System.out.println("----------Make repayment 4 ------------"); this.loanTransactionHelper.makeRepayment("20 January 2012", Float.valueOf("3121.19"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, "20 January 2012", new JournalEntry( - Float.valueOf("3121.19"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("31.51"), - JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("3089.68"), JournalEntry.TransactionType.CREDIT)); + Float.valueOf("3121.19"), JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("3121.19"), + JournalEntry.TransactionType.CREDIT)); loanStatusHashMap = (HashMap) this.loanTransactionHelper.getLoanDetail(this.requestSpec, this.responseSpec, loanID, "status"); LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap); } @@ -3198,7 +3156,7 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, null, null); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, null, LoanApplicationTestBuilder.DEFAULT_STRATEGY, new ArrayList<HashMap>(0)); @@ -3305,7 +3263,8 @@ public class ClientLoanIntegrationTest { final Integer loanProductID = createLoanProductWithInterestRecalculation(LoanProductTestBuilder.DEFAULT_STRATEGY, LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN, - LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, preCloseInterestStrategy, null); + LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, preCloseInterestStrategy, null, + null, null); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, null, LoanApplicationTestBuilder.DEFAULT_STRATEGY, new ArrayList<HashMap>(0)); @@ -3384,7 +3343,7 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, null, null); List<HashMap> charges = new ArrayList<>(); Integer installmentCharge = ChargesHelper.createCharges(requestSpec, responseSpec, @@ -3473,6 +3432,8 @@ public class ClientLoanIntegrationTest { Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); + Integer dayOfMonth = getDayOfMonth(todaysDate); + Integer dayOfWeek = getDayOfWeek(todaysDate); final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec); ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID); @@ -3481,10 +3442,10 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_NUMBER_OF_INSTALLMENTS, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "1", LOAN_DISBURSEMENT_DATE, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_WEEKLY, "1", LOAN_DISBURSEMENT_DATE, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, null, dayOfWeek, null, dayOfWeek); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, - LOAN_DISBURSEMENT_DATE, LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0)); + LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0)); Assert.assertNotNull(loanID); HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3560,8 +3521,8 @@ public class ClientLoanIntegrationTest { paymentday.put("penaltyChargesDue", "0"); addRepaymentValues(expectedvalues, todaysDate, -1, false, "2482.76", "46.15", "0.0", "0.0"); expectedvalues.add(paymentday); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.28", "11.63", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "1009.87", "4.66", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.31", "11.6", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "1009.84", "4.66", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); @@ -3583,8 +3544,12 @@ public class ClientLoanIntegrationTest { Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); + Integer compoundingDayOfMonth = getDayOfMonth(todaysDate); + Integer compoundingDayOfWeek = getDayOfWeek(todaysDate); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.DAY_OF_MONTH, -2); + Integer restDayOfMonth = getDayOfMonth(todaysDate); + Integer restDayOfWeek = getDayOfWeek(todaysDate); final String REST_START_DATE = dateFormat.format(todaysDate.getTime()); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); @@ -3609,10 +3574,11 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_STRATEGY_RESCHEDULE_NEXT_REPAYMENTS, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_WEEKLY, "1", REST_START_DATE, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_WEEKLY, "1", LOAN_DISBURSEMENT_DATE, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, compoundingDayOfMonth, compoundingDayOfWeek, + restDayOfMonth, restDayOfWeek); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, - REST_START_DATE, LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, charges); + LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, charges); Assert.assertNotNull(loanID); HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3622,9 +3588,9 @@ public class ClientLoanIntegrationTest { List<Map<String, Object>> expectedvalues = new ArrayList<>(); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, false, "2482.76", "46.15", "100.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2486.03", "42.88", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2497.5", "31.41", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2533.71", "19.93", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2494.22", "34.69", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2505.73", "23.18", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.29", "11.62", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); System.out.println("-----------------------------------APPROVE LOAN-----------------------------------------"); @@ -3641,8 +3607,8 @@ public class ClientLoanIntegrationTest { todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, false, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, false, "2482.08", "46.83", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2488.82", "40.09", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2546.34", "19.96", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2505.67", "23.24", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2529.49", "11.67", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); @@ -3656,9 +3622,9 @@ public class ClientLoanIntegrationTest { expectedvalues = new ArrayList<>(); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, false, "2482.76", "46.15", "100.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2486.03", "42.88", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2497.5", "31.41", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2533.71", "19.93", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2494.22", "34.69", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2505.73", "23.18", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.29", "11.62", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); Float earlyPayment = new Float("5100"); @@ -3671,9 +3637,9 @@ public class ClientLoanIntegrationTest { expectedvalues = new ArrayList<>(); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, false, "2482.76", "46.15", "100.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "5100.0", "36.16", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "0", "11.16", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2417.24", "11.16", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "5065.31", "34.69", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "0", "11.32", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2451.93", "11.32", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); @@ -3689,7 +3655,7 @@ public class ClientLoanIntegrationTest { @Test public void testLoanScheduleWithInterestRecalculation_WITH_REST_WEEKLY_INTEREST_COMPOUND_INTEREST_FEE_STRATEGY_REDUCE_NEXT_INSTALLMENTS_PRE_CLOSE_INTEREST_PRE_CLOSE_DATE() { String preCloseInterestStrategy = LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE; - String preCloseAmount = "7766.82"; + String preCloseAmount = "7761.89"; testLoanScheduleWithInterestRecalculation_WITH_REST_WEEKLY_INTEREST_COMPOUND_INTEREST_FEE_STRATEGY_REDUCE_NEXT_INSTALLMENTS_PRE_CLOSE_INTEREST( preCloseInterestStrategy, preCloseAmount); @@ -3698,7 +3664,7 @@ public class ClientLoanIntegrationTest { @Test public void testLoanScheduleWithInterestRecalculation_WITH_REST_WEEKLY_INTEREST_COMPOUND_INTEREST_FEE_STRATEGY_REDUCE_NEXT_INSTALLMENTS_PRE_CLOSE_INTEREST_REST_DATE() { String preCloseInterestStrategy = LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_REST_DATE; - String preCloseAmount = "7771.8"; + String preCloseAmount = "7786.79"; testLoanScheduleWithInterestRecalculation_WITH_REST_WEEKLY_INTEREST_COMPOUND_INTEREST_FEE_STRATEGY_REDUCE_NEXT_INSTALLMENTS_PRE_CLOSE_INTEREST( preCloseInterestStrategy, preCloseAmount); @@ -3715,7 +3681,9 @@ public class ClientLoanIntegrationTest { todaysDate.add(Calendar.DAY_OF_MONTH, -16); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.DAY_OF_MONTH, -4); - final String REST_START_DATE = dateFormat.format(todaysDate.getTime()); + Integer restDateOfMonth = getDayOfMonth(todaysDate); + Integer restDateOfWeek = getDayOfWeek(todaysDate); + final String REST_START_DATE = null; todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -16); @@ -3738,7 +3706,8 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.DEFAULT_STRATEGY, LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_INTEREST_AND_FEE, LoanProductTestBuilder.RECALCULATION_STRATEGY_RESCHEDULE_NEXT_REPAYMENTS, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_WEEKLY, "1", REST_START_DATE, - LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, null, null, preCloseInterestStrategy, null); + LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, null, null, preCloseInterestStrategy, null, + null, null, restDateOfMonth, restDateOfWeek); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, REST_START_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, charges); @@ -3751,9 +3720,9 @@ public class ClientLoanIntegrationTest { List<Map<String, Object>> expectedvalues = new ArrayList<>(); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -9, true, "2482.76", "46.15", "100.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2489.3", "39.61", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2500.78", "28.13", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2527.16", "16.62", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2494.22", "34.69", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2505.73", "23.18", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.29", "11.62", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); System.out.println("-----------------------------------APPROVE LOAN-----------------------------------------"); @@ -3770,8 +3739,8 @@ public class ClientLoanIntegrationTest { todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -9, true, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, false, "2482.08", "46.83", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2495.47", "33.44", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2539.69", "16.66", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2481.87", "47.04", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2553.29", "11.78", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); @@ -3785,9 +3754,9 @@ public class ClientLoanIntegrationTest { expectedvalues = new ArrayList<>(); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -9, true, "2482.76", "46.15", "100.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2489.3", "39.61", "0.0", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2500.7", "28.21", "200", "0.0"); - addRepaymentValues(expectedvalues, todaysDate, 1, false, "2527.24", "16.62", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2494.22", "34.69", "0.0", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2494.05", "34.86", "200", "0.0"); + addRepaymentValues(expectedvalues, todaysDate, 1, false, "2528.97", "11.67", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); @@ -3831,7 +3800,7 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "1", REST_START_DATE, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyDate, LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, - overdueFeeChargeId.toString(), false); + overdueFeeChargeId.toString(), false, null, null, null, null); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, REST_START_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, null); @@ -3940,7 +3909,7 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, accounts); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, accounts, null, null); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, null, LoanApplicationTestBuilder.DEFAULT_STRATEGY, new ArrayList<HashMap>(0)); @@ -3983,6 +3952,7 @@ public class ClientLoanIntegrationTest { this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, LOAN_DISBURSEMENT_DATE, assetAccountInitialEntry); todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String runOndate = dateFormat.format(todaysDate.getTime()); + System.out.println("runOndate : " + runOndate); this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(runOndate); this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant().minusDays(7), 46.15f, 0f, 0f, loanID); this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant(), 46.15f, 0f, 0f, loanID); @@ -4002,6 +3972,7 @@ public class ClientLoanIntegrationTest { addRepaymentValues(expectedvalues, todaysDate, 1, false, "2517.29", "11.62", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); + this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(runOndate); this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant().minusDays(7), 46.15f, 0f, 0f, loanID); this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant(), 34.69f, 0f, 0f, loanID); @@ -4036,7 +4007,8 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_STRATEGY_RESCHEDULE_NEXT_REPAYMENTS, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "1", LOAN_DISBURSEMENT_DATE, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "1", LOAN_DISBURSEMENT_DATE, - LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); + LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, getDayOfMonth(todaysDate), + getDayOfWeek(todaysDate), getDayOfMonth(todaysDate), getDayOfWeek(todaysDate)); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0)); @@ -4119,7 +4091,7 @@ public class ClientLoanIntegrationTest { LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "1", LOAN_DISBURSEMENT_DATE, LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyDate, LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null, null, - true); + true, null, null, getDayOfMonth(todaysDate), getDayOfWeek(todaysDate)); final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, LOAN_DISBURSEMENT_DATE, LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0)); @@ -4206,10 +4178,10 @@ public class ClientLoanIntegrationTest { final Integer loanProductID = createLoanProductWithInterestRecalculation(LoanProductTestBuilder.DEFAULT_STRATEGY, LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_EMI_AMOUN, - LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, preCloseStrategy, null); + LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_SAME_AS_REPAYMENT_PERIOD, "0", null, preCloseStrategy, null, null, null); final Integer loanID = applyForLoanApplicationForInterestRecalculationWithMoratorium(clientID, loanProductID, - LOAN_DISBURSEMENT_DATE, null, LoanApplicationTestBuilder.DEFAULT_STRATEGY, new ArrayList<HashMap>(0), "1", null); + LOAN_DISBURSEMENT_DATE, LoanApplicationTestBuilder.DEFAULT_STRATEGY, new ArrayList<HashMap>(0), "1", null); Assert.assertNotNull(loanID); HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -4284,14 +4256,19 @@ public class ClientLoanIntegrationTest { private Integer createLoanProductWithInterestRecalculation(final String repaymentStrategy, final String interestRecalculationCompoundingMethod, final String rescheduleStrategyMethod, final String recalculationRestFrequencyType, final String recalculationRestFrequencyInterval, - final String recalculationRestFrequencyDate, final String preCloseInterestCalculationStrategy, final Account[] accounts) { + final String recalculationRestFrequencyDate, final String preCloseInterestCalculationStrategy, final Account[] accounts, + final Integer recalculationRestFrequencyOnDayType, final Integer recalculationRestFrequencyDayOfWeekType) { final String recalculationCompoundingFrequencyType = null; final String recalculationCompoundingFrequencyInterval = null; final String recalculationCompoundingFrequencyDate = null; + final Integer recalculationCompoundingFrequencyOnDayType = null; + final Integer recalculationCompoundingFrequencyDayOfWeekType = null; return createLoanProductWithInterestRecalculation(repaymentStrategy, interestRecalculationCompoundingMethod, rescheduleStrategyMethod, recalculationRestFrequencyType, recalculationRestFrequencyInterval, recalculationRestFrequencyDate, recalculationCompoundingFrequencyType, recalculationCompoundingFrequencyInterval, - recalculationCompoundingFrequencyDate, preCloseInterestCalculationStrategy, accounts, null, false); + recalculationCompoundingFrequencyDate, preCloseInterestCalculationStrategy, accounts, null, false, + recalculationCompoundingFrequencyOnDayType, recalculationCompoundingFrequencyDayOfWeekType, + recalculationRestFrequencyOnDayType, recalculationRestFrequencyDayOfWeekType); } private Integer createLoanProductWithInterestRecalculationAndCompoundingDetails(final String repaymentStrategy, @@ -4299,11 +4276,15 @@ public class ClientLoanIntegrationTest { final String recalculationRestFrequencyType, final String recalculationRestFrequencyInterval, final String recalculationRestFrequencyDate, final String recalculationCompoundingFrequencyType, final String recalculationCompoundingFrequencyInterval, final String recalculationCompoundingFrequencyDate, - final String preCloseInterestCalculationStrategy, final Account[] accounts) { + final String preCloseInterestCalculationStrategy, final Account[] accounts, + final Integer recalculationCompoundingFrequencyOnDayType, final Integer recalculationCompoundingFrequencyDayOfWeekType, + final Integer recalculationRestFrequencyOnDayType, final Integer recalculationRestFrequencyDayOfWeekType) { return createLoanProductWithInterestRecalculation(repaymentStrategy, interestRecalculationCompoundingMethod, rescheduleStrategyMethod, recalculationRestFrequencyType, recalculationRestFrequencyInterval, recalculationRestFrequencyDate, recalculationCompoundingFrequencyType, recalculationCompoundingFrequencyInterval, - recalculationCompoundingFrequencyDate, preCloseInterestCalculationStrategy, accounts, null, false); + recalculationCompoundingFrequencyDate, preCloseInterestCalculationStrategy, accounts, null, false, + recalculationCompoundingFrequencyOnDayType, recalculationCompoundingFrequencyDayOfWeekType, + recalculationRestFrequencyOnDayType, recalculationRestFrequencyDayOfWeekType); } private Integer createLoanProductWithInterestRecalculation(final String repaymentStrategy, @@ -4312,7 +4293,9 @@ public class ClientLoanIntegrationTest { final String recalculationRestFrequencyDate, final String recalculationCompoundingFrequencyType, final String recalculationCompoundingFrequencyInterval, final String recalculationCompoundingFrequencyDate, final String preCloseInterestCalculationStrategy, final Account[] accounts, final String chargeId, - boolean isArrearsBasedOnOriginalSchedule) { + boolean isArrearsBasedOnOriginalSchedule, final Integer recalculationCompoundingFrequencyOnDayType, + final Integer recalculationCompoundingFrequencyDayOfWeekType, final Integer recalculationRestFrequencyOnDayType, + final Integer recalculationRestFrequencyDayOfWeekType) { System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); LoanProductTestBuilder builder = new LoanProductTestBuilder() .withPrincipal("10000000.00") @@ -4328,9 +4311,10 @@ public class ClientLoanIntegrationTest { .withInterestRecalculationDetails(interestRecalculationCompoundingMethod, rescheduleStrategyMethod, preCloseInterestCalculationStrategy) .withInterestRecalculationRestFrequencyDetails(recalculationRestFrequencyType, recalculationRestFrequencyInterval, - recalculationRestFrequencyDate) + recalculationRestFrequencyOnDayType, recalculationRestFrequencyDayOfWeekType) .withInterestRecalculationCompoundingFrequencyDetails(recalculationCompoundingFrequencyType, - recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyDate); + recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyOnDayType, + recalculationCompoundingFrequencyDayOfWeekType); if (accounts != null) { builder = builder.withAccountingRulePeriodicAccrual(accounts); } @@ -4342,30 +4326,27 @@ public class ClientLoanIntegrationTest { } private Integer applyForLoanApplicationForInterestRecalculation(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String repaymentStrategy, final List<HashMap> charges) { - final String compoundingStartDate = null; - return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, restStartDate, - compoundingStartDate, repaymentStrategy, charges); + final String disbursementDate, final String repaymentStrategy, final List<HashMap> charges) { + return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, repaymentStrategy, charges, null, + null); } private Integer applyForLoanApplicationForInterestRecalculationWithMoratorium(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String repaymentStrategy, final List<HashMap> charges, + final String disbursementDate, final String repaymentStrategy, final List<HashMap> charges, final String graceOnInterestPayment, final String graceOnPrincipalPayment) { - final String compoundingStartDate = null; - return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, restStartDate, - compoundingStartDate, repaymentStrategy, charges, graceOnInterestPayment, graceOnPrincipalPayment); + return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, repaymentStrategy, charges, + graceOnInterestPayment, graceOnPrincipalPayment); } private Integer applyForLoanApplicationForInterestRecalculation(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String compoundingStartDate, final String repaymentStrategy, - final List<HashMap> charges) { - return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, restStartDate, - compoundingStartDate, repaymentStrategy, charges, null, null); + final String disbursementDate, final String compoundingStartDate, final String repaymentStrategy, final List<HashMap> charges) { + return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, repaymentStrategy, charges, null, + null); } private Integer applyForLoanApplicationForInterestRecalculation(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String compoundingStartDate, final String repaymentStrategy, - final List<HashMap> charges, final String graceOnInterestPayment, final String graceOnPrincipalPayment) { + final String disbursementDate, final String repaymentStrategy, final List<HashMap> charges, + final String graceOnInterestPayment, final String graceOnPrincipalPayment) { System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); final String loanApplicationJSON = new LoanApplicationTestBuilder() // .withPrincipal("10000.00") // @@ -4380,8 +4361,6 @@ public class ClientLoanIntegrationTest { .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() // .withExpectedDisbursementDate(disbursementDate) // .withSubmittedOnDate(disbursementDate) // - .withRestFrequencyDate(restStartDate)// - .withCompoundingFrequencyDate(compoundingStartDate)// .withwithRepaymentStrategy(repaymentStrategy) // .withPrincipalGrace(graceOnPrincipalPayment) // .withInterestGrace(graceOnInterestPayment)// @@ -4593,9 +4572,9 @@ public class ClientLoanIntegrationTest { final Account expenseAccount = this.accountHelper.createExpenseAccount(); final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - final Integer loanProductID = createLoanProduct("0", "0", LoanProductTestBuilder.DEFAULT_STRATEGY, ACCRUAL_UPFRONT, - assetAccount, incomeAccount, expenseAccount, overpaymentAccount);// , - // LoanProductTestBuilder.EQUAL_INSTALLMENTS, + final Integer loanProductID = createLoanProduct("0", "0", LoanProductTestBuilder.DEFAULT_STRATEGY, ACCRUAL_UPFRONT, assetAccount, + incomeAccount, expenseAccount, overpaymentAccount);// , + // LoanProductTestBuilder.EQUAL_INSTALLMENTS, // LoanProductTestBuilder.FLAT_BALANCE); Assert.assertNotNull(loanProductID); @@ -4656,9 +4635,7 @@ public class ClientLoanIntegrationTest { this.loanTransactionHelper.makeRepayment(twoMonthsfromNow, Float.valueOf("2290"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, twoMonthsfromNow, new JournalEntry(Float.valueOf("2290"), - JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("50"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("240"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("2000"), - JournalEntry.TransactionType.CREDIT)); + JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("2290"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); @@ -4673,9 +4650,7 @@ public class ClientLoanIntegrationTest { this.loanTransactionHelper.makeRepayment(oneMonthfromNow, Float.valueOf("4580"), loanID); this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, oneMonthfromNow, new JournalEntry(Float.valueOf("4580"), - JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("100"), JournalEntry.TransactionType.CREDIT), - new JournalEntry(Float.valueOf("480"), JournalEntry.TransactionType.CREDIT), new JournalEntry(Float.valueOf("4000"), - JournalEntry.TransactionType.CREDIT)); + JournalEntry.TransactionType.DEBIT), new JournalEntry(Float.valueOf("4580"), JournalEntry.TransactionType.CREDIT)); loanSchedule.clear(); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); @@ -4967,10 +4942,9 @@ public class ClientLoanIntegrationTest { System.out.println("------------------------LOAN CREATED WITH ID------------------------------" + loanID); loanProductID = this.loanTransactionHelper.getLoanProductId(new LoanProductTestBuilder().withAmortizationTypeAsEqualInstallments() - .withRepaymentTypeAsMonth().withRepaymentAfterEvery("1") - .withRepaymentStrategy(LoanProductTestBuilder.DEFAULT_STRATEGY).withInterestTypeAsDecliningBalance() - .withInterestCalculationPeriodTypeAsDays().withInArrearsTolerance("10").withMoratorium("2", "3") - .withLoanProductConfiguration(loanProductConfigurationAsFalse).build(null)); + .withRepaymentTypeAsMonth().withRepaymentAfterEvery("1").withRepaymentStrategy(LoanProductTestBuilder.DEFAULT_STRATEGY) + .withInterestTypeAsDecliningBalance().withInterestCalculationPeriodTypeAsDays().withInArrearsTolerance("10") + .withMoratorium("2", "3").withLoanProductConfiguration(loanProductConfigurationAsFalse).build(null)); System.out.println("-------------------LOAN PRODUCT CREATED WITH ATTRIBUTE CONFIGURATION AS FALSE----------------------" + loanProductID); /* @@ -4990,8 +4964,8 @@ public class ClientLoanIntegrationTest { "inArrearsTolerance", "graceOnArrearsAgeing"); for (String comparisonAttribute : comparisonAttributes) { - Object val1 = JsonPath.from(loanProductDetails).get(comparisonAttribute); - Object val2 = JsonPath.from(loanDetails).get(comparisonAttribute); + Object val1 = JsonPath.from(loanProductDetails).get(comparisonAttribute); + Object val2 = JsonPath.from(loanDetails).get(comparisonAttribute); assertEquals(val1, val2); } } @@ -5050,4 +5024,26 @@ public class ClientLoanIntegrationTest { return this.loanTransactionHelper.getLoanId(loanApplicationJSON); } + + public Integer getDayOfWeek(Calendar date) { + Integer dayOfWeek = null; + if (null != date) { + dayOfWeek = date.get(Calendar.DAY_OF_WEEK) - 1; + if (dayOfWeek.compareTo(0) == 0) { + dayOfWeek = 7; + } + } + return dayOfWeek; + } + + public Integer getDayOfMonth(Calendar date) { + Integer dayOfMonth = null; + if (null != date) { + dayOfMonth = date.get(Calendar.DAY_OF_MONTH); + if (dayOfMonth.compareTo(28) > 0) { + dayOfMonth = 28; + } + } + return dayOfMonth; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/763cf18b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java index d0018cd..b56f25d 100644 --- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/LoanRepaymentRescheduleAtDisbursementTest.java @@ -72,7 +72,6 @@ public class LoanRepaymentRescheduleAtDisbursementTest { final String expectedDisbursementDate = "01 March 2015"; final String disbursementDate = "01 March 2015"; final String adjustRepaymentDate = "16 March 2015"; - final String recalculationRestFrequencyDate = "01 January 2012"; // CREATE CLIENT final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January 2014"); @@ -83,7 +82,7 @@ public class LoanRepaymentRescheduleAtDisbursementTest { final Integer loanProductID = createLoanProductWithInterestRecalculation(LoanProductTestBuilder.RBI_INDIA_STRATEGY, LoanProductTestBuilder.RECALCULATION_COMPOUNDING_METHOD_NONE, LoanProductTestBuilder.RECALCULATION_STRATEGY_REDUCE_NUMBER_OF_INSTALLMENTS, - LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "0", recalculationRestFrequencyDate, + LoanProductTestBuilder.RECALCULATION_FREQUENCY_TYPE_DAILY, "0", LoanProductTestBuilder.INTEREST_APPLICABLE_STRATEGY_ON_PRE_CLOSE_DATE, null); // CREATE TRANCHES @@ -98,7 +97,7 @@ public class LoanRepaymentRescheduleAtDisbursementTest { // APPLY FOR TRANCHE LOAN WITH INTEREST RECALCULATION final Integer loanID = applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, - recalculationRestFrequencyDate, LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0), createTranches); + LoanApplicationTestBuilder.RBI_INDIA_STRATEGY, new ArrayList<HashMap>(0), createTranches); HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -148,23 +147,28 @@ public class LoanRepaymentRescheduleAtDisbursementTest { private Integer createLoanProductWithInterestRecalculation(final String repaymentStrategy, final String interestRecalculationCompoundingMethod, final String rescheduleStrategyMethod, final String recalculationRestFrequencyType, final String recalculationRestFrequencyInterval, - final String recalculationRestFrequencyDate, final String preCloseInterestCalculationStrategy, final Account[] accounts) { + final String preCloseInterestCalculationStrategy, final Account[] accounts) { final String recalculationCompoundingFrequencyType = null; final String recalculationCompoundingFrequencyInterval = null; - final String recalculationCompoundingFrequencyDate = null; + final Integer recalculationCompoundingFrequencyOnDayType = null; + final Integer recalculationCompoundingFrequencyDayOfWeekType = null; + final Integer recalculationRestFrequencyOnDayType = null; + final Integer recalculationRestFrequencyDayOfWeekType = null; return createLoanProductWithInterestRecalculation(repaymentStrategy, interestRecalculationCompoundingMethod, rescheduleStrategyMethod, recalculationRestFrequencyType, recalculationRestFrequencyInterval, - recalculationRestFrequencyDate, recalculationCompoundingFrequencyType, recalculationCompoundingFrequencyInterval, - recalculationCompoundingFrequencyDate, preCloseInterestCalculationStrategy, accounts, null, false); + recalculationCompoundingFrequencyType, recalculationCompoundingFrequencyInterval, preCloseInterestCalculationStrategy, + accounts, null, false, recalculationCompoundingFrequencyOnDayType, recalculationCompoundingFrequencyDayOfWeekType, + recalculationRestFrequencyOnDayType, recalculationRestFrequencyDayOfWeekType); } private Integer createLoanProductWithInterestRecalculation(final String repaymentStrategy, final String interestRecalculationCompoundingMethod, final String rescheduleStrategyMethod, final String recalculationRestFrequencyType, final String recalculationRestFrequencyInterval, - final String recalculationRestFrequencyDate, final String recalculationCompoundingFrequencyType, - final String recalculationCompoundingFrequencyInterval, final String recalculationCompoundingFrequencyDate, + final String recalculationCompoundingFrequencyType, final String recalculationCompoundingFrequencyInterval, final String preCloseInterestCalculationStrategy, final Account[] accounts, final String chargeId, - boolean isArrearsBasedOnOriginalSchedule) { + boolean isArrearsBasedOnOriginalSchedule, final Integer recalculationCompoundingFrequencyOnDayType, + final Integer recalculationCompoundingFrequencyDayOfWeekType, final Integer recalculationRestFrequencyOnDayType, + final Integer recalculationRestFrequencyDayOfWeekType) { System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); LoanProductTestBuilder builder = new LoanProductTestBuilder() .withPrincipal("10000.00") @@ -180,9 +184,10 @@ public class LoanRepaymentRescheduleAtDisbursementTest { .withInterestRecalculationDetails(interestRecalculationCompoundingMethod, rescheduleStrategyMethod, preCloseInterestCalculationStrategy) .withInterestRecalculationRestFrequencyDetails(recalculationRestFrequencyType, recalculationRestFrequencyInterval, - recalculationRestFrequencyDate) + recalculationRestFrequencyOnDayType, recalculationRestFrequencyDayOfWeekType) .withInterestRecalculationCompoundingFrequencyDetails(recalculationCompoundingFrequencyType, - recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyDate); + recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyOnDayType, + recalculationCompoundingFrequencyDayOfWeekType); if (accounts != null) { builder = builder.withAccountingRulePeriodicAccrual(accounts); } @@ -194,17 +199,16 @@ public class LoanRepaymentRescheduleAtDisbursementTest { } private Integer applyForLoanApplicationForInterestRecalculation(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String repaymentStrategy, final List<HashMap> charges, List<HashMap> tranches) { + final String disbursementDate, final String repaymentStrategy, final List<HashMap> charges, List<HashMap> tranches) { final String graceOnInterestPayment = null; - final String compoundingStartDate = null; final String graceOnPrincipalPayment = null; - return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, restStartDate, - compoundingStartDate, repaymentStrategy, charges, graceOnInterestPayment, graceOnPrincipalPayment,tranches); + return applyForLoanApplicationForInterestRecalculation(clientID, loanProductID, disbursementDate, repaymentStrategy, charges, + graceOnInterestPayment, graceOnPrincipalPayment, tranches); } private Integer applyForLoanApplicationForInterestRecalculation(final Integer clientID, final Integer loanProductID, - final String disbursementDate, final String restStartDate, final String compoundingStartDate, final String repaymentStrategy, - final List<HashMap> charges, final String graceOnInterestPayment, final String graceOnPrincipalPayment, List<HashMap> tranches) { + final String disbursementDate, final String repaymentStrategy, final List<HashMap> charges, final String graceOnInterestPayment, + final String graceOnPrincipalPayment, List<HashMap> tranches) { System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); final String loanApplicationJSON = new LoanApplicationTestBuilder() // .withPrincipal("10000.00") // @@ -222,7 +226,6 @@ public class LoanRepaymentRescheduleAtDisbursementTest { .withInterestCalculationPeriodTypeAsDays() // .withExpectedDisbursementDate(disbursementDate) // .withSubmittedOnDate(disbursementDate) // - .withRestFrequencyDate(restStartDate)// .withwithRepaymentStrategy(repaymentStrategy) // .withCharges(charges)// .build(clientID.toString(), loanProductID.toString(), null);