From 7c399ce65351390f3461000521bbccf43abdcb17 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Wed, 16 Apr 2014 23:04:20 +0530 Subject: [PATCH] MIFOSX-1093- modified scheduler jobs for performence issues --- .../integrationtests/ChargesTest.java | 30 +- .../integrationtests/SchedulerJobsTest.java | 2 +- .../SchedulerJobsTestResults.java | 540 +++++------------- .../common/charges/ChargesHelper.java | 10 +- .../common/loans/LoanProductTestBuilder.java | 7 + .../common/loans/LoanTransactionHelper.java | 6 + .../LoanChargeReadPlatformService.java | 4 +- .../LoanChargeReadPlatformServiceImpl.java | 12 +- ...WritePlatformServiceJpaRepositoryImpl.java | 17 +- 9 files changed, 176 insertions(+), 452 deletions(-) diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ChargesTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ChargesTest.java index ef241a861..39271c537 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ChargesTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ChargesTest.java @@ -74,15 +74,6 @@ public class ChargesTest { chargeChangedData = (HashMap) chargeDataAfterChanges.get("chargeCalculationType"); Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("chargeCalculationType")); - - if(ChargesHelper.addfeefrequency) { - changes = ChargesHelper.updateCharges(this.requestSpec, this.responseSpec, disbursementChargeId, ChargesHelper.getModifyChargeFeeFrequencyAsWeeksJSON()); - - chargeDataAfterChanges = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, disbursementChargeId); - - chargeChangedData = (HashMap) chargeDataAfterChanges.get("feeFrequency"); - Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("feeFrequency")); - } Integer chargeIdAfterDeletion = ChargesHelper.deleteCharge(this.responseSpec, this.requestSpec, disbursementChargeId); Assert.assertEquals("Verifying Charge ID after deletion", disbursementChargeId, chargeIdAfterDeletion); @@ -125,7 +116,7 @@ public class ChargesTest { chargeChangedData = (HashMap) chargeDataAfterChanges.get("chargeCalculationType"); Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("chargeCalculationType")); - + chargeIdAfterDeletion = ChargesHelper.deleteCharge(this.responseSpec, this.requestSpec, specifiedDueDateChargeId); Assert.assertEquals("Verifying Charge ID after deletion", specifiedDueDateChargeId, chargeIdAfterDeletion); @@ -166,15 +157,6 @@ public class ChargesTest { chargeChangedData = (HashMap) chargeDataAfterChanges.get("chargeCalculationType"); Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("chargeCalculationType")); - - if(ChargesHelper.addfeefrequency) { - changes = ChargesHelper.updateCharges(this.requestSpec, this.responseSpec, installmentFeeChargeId, ChargesHelper.getModifyChargeFeeFrequencyAsMonthsJSON()); - - chargeDataAfterChanges = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, installmentFeeChargeId); - - chargeChangedData = (HashMap) chargeDataAfterChanges.get("feeFrequency"); - Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("feeFrequency")); - } chargeIdAfterDeletion = ChargesHelper.deleteCharge(this.responseSpec, this.requestSpec, installmentFeeChargeId); Assert.assertEquals("Verifying Charge ID after deletion", installmentFeeChargeId, chargeIdAfterDeletion); @@ -217,7 +199,15 @@ public class ChargesTest { chargeChangedData = (HashMap) chargeDataAfterChanges.get("chargeCalculationType"); Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("chargeCalculationType")); - + + changes = ChargesHelper.updateCharges(this.requestSpec, this.responseSpec, overdueFeeChargeId, + ChargesHelper.getModifyChargeFeeFrequencyAsYearsJSON()); + + chargeDataAfterChanges = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, overdueFeeChargeId); + + chargeChangedData = (HashMap) chargeDataAfterChanges.get("feeFrequency"); + Assert.assertEquals("Verifying Charge after Modification", chargeChangedData.get("id"), changes.get("feeFrequency")); + chargeIdAfterDeletion = ChargesHelper.deleteCharge(this.responseSpec, this.requestSpec, overdueFeeChargeId); Assert.assertEquals("Verifying Charge ID after deletion", overdueFeeChargeId, chargeIdAfterDeletion); } diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTest.java index e85a1fc0f..8f8c1ff13 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTest.java @@ -87,7 +87,7 @@ public class SchedulerJobsTest { // Waiting for Job to complete while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); + Thread.sleep(15000); schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); Assert.assertNotNull(schedulerJob); System.out.println("Job is Still Running"); diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTestResults.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTestResults.java index b916c8a27..2869cb35d 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTestResults.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SchedulerJobsTestResults.java @@ -108,49 +108,17 @@ public class SchedulerJobsTestResults { savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId); SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(3).get("jobId"); - + HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); String JobName = "Apply Annual Fee For Savings"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); + excuteJob(JobName); + final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, annualFeeChargeId); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + Float chargeAmount = (Float) chargeData.get("amount"); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - - // Waiting for Job to Complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, annualFeeChargeId); - - Float chargeAmount = (Float) chargeData.get("amount"); - - final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - Assert.assertEquals("Verifying Annual Fee after Running Scheduler Job for Apply Anual Fee", chargeAmount, - (Float) summaryAfter.get("totalAnnualFees")); - break; - } - } + final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); + Assert.assertEquals("Verifying Annual Fee after Running Scheduler Job for Apply Anual Fee", chargeAmount, + (Float) summaryAfter.get("totalAnnualFees")); } @@ -179,46 +147,16 @@ public class SchedulerJobsTestResults { savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId); SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); + final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); - // Integer jobId = (Integer) allSchedulerJobsData.get(5).get("jobId"); String JobName = "Post Interest For Savings"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); + excuteJob(JobName); + final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + Assert.assertNotSame("Verifying the Balance after running Post Interest for Savings Job", summaryBefore.get("accountBalance"), + summaryAfter.get("accountBalance")); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - - Assert.assertNotSame("Verifying the Balance after running Post Interest for Savings Job", - summaryBefore.get("accountBalance"), summaryAfter.get("accountBalance")); - break; - } - } } @Test @@ -270,53 +208,20 @@ public class SchedulerJobsTestResults { loanStatusHashMap = this.loanTransactionHelper.disburseLoan(AccountTransferTest.LOAN_DISBURSAL_DATE, loanID); LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(6).get("jobId"); String JobName = "Transfer Fee For Loans From Savings"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); + excuteJob(JobName); + final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - final HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); + final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, specifiedDueDateChargeId); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + Float chargeAmount = (Float) chargeData.get("amount"); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + final Float balance = (Float) summaryBefore.get("accountBalance") - chargeAmount; - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - final HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - - final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, specifiedDueDateChargeId); - - Float chargeAmount = (Float) chargeData.get("amount"); - - final Float balance = (Float) summaryBefore.get("accountBalance") - chargeAmount; - - Assert.assertEquals("Verifying the Balance after running Transfer Fee for Loans from Savings", balance, - (Float) summaryAfter.get("accountBalance")); - break; - } - } + Assert.assertEquals("Verifying the Balance after running Transfer Fee for Loans from Savings", balance, + (Float) summaryAfter.get("accountBalance")); } @@ -369,57 +274,25 @@ public class SchedulerJobsTestResults { configId = this.globalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(this.requestSpec, this.responseSpec, configId.toString(), enabled); } + final ArrayList repaymentScheduleDataBeforeJob = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, + this.responseSpec, loanID); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); + holidayId = this.holidayHelper.activateHolidays(this.requestSpec, this.responseSpec, holidayId.toString()); + Assert.assertNotNull(holidayId); - // Integer jobId = (Integer) allSchedulerJobsData.get(4).get("jobId"); String JobName = "Apply Holidays To Loans"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - final ArrayList repaymentScheduleDataBeforeJob = this.loanTransactionHelper.getLoanRepaymentSchedule( - this.requestSpec, this.responseSpec, loanID); + excuteJob(JobName); + final ArrayList repaymentScheduleDataAfterJob = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, + this.responseSpec, loanID); - holidayId = this.holidayHelper.activateHolidays(this.requestSpec, this.responseSpec, holidayId.toString()); - Assert.assertNotNull(holidayId); + HashMap holidayData = this.holidayHelper.getHolidayById(this.requestSpec, this.responseSpec, holidayId.toString()); + ArrayList repaymentsRescheduledDate = (ArrayList) holidayData.get("repaymentsRescheduledTo"); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + ArrayList rescheduleDateAfter = (ArrayList) repaymentScheduleDataAfterJob.get(2).get("fromDate"); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - final ArrayList repaymentScheduleDataAfterJob = this.loanTransactionHelper.getLoanRepaymentSchedule( - this.requestSpec, this.responseSpec, loanID); - - HashMap holidayData = this.holidayHelper.getHolidayById(this.requestSpec, this.responseSpec, holidayId.toString()); - ArrayList repaymentsRescheduledDate = (ArrayList) holidayData.get("repaymentsRescheduledTo"); - - ArrayList rescheduleDateAfter = (ArrayList) repaymentScheduleDataAfterJob.get(2).get("fromDate"); - - Assert.assertEquals("Verifying Repayment Rescheduled Date after Running Apply Holidays to Loans Scheduler Job", - repaymentsRescheduledDate, repaymentsRescheduledDate); - break; - } - } + Assert.assertEquals("Verifying Repayment Rescheduled Date after Running Apply Holidays to Loans Scheduler Job", + repaymentsRescheduledDate, repaymentsRescheduledDate); } @@ -456,54 +329,22 @@ public class SchedulerJobsTestResults { savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId); SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); + HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); - // Integer jobId = (Integer) allSchedulerJobsData.get(7).get("jobId"); String JobName = "Pay Due Savings Charges"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + excuteJob(JobName); + HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - HashMap summaryBefore = this.savingsAccountHelper.getSavingsSummary(savingsId); + final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, specifiedDueDateChargeId); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + Float chargeAmount = (Float) chargeData.get("amount"); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + final Float balance = (Float) summaryBefore.get("accountBalance") - chargeAmount; - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } + Assert.assertEquals("Verifying the Balance after running Pay due Savings Charges", balance, + (Float) summaryAfter.get("accountBalance")); - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - HashMap summaryAfter = this.savingsAccountHelper.getSavingsSummary(savingsId); - - final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, specifiedDueDateChargeId); - - Float chargeAmount = (Float) chargeData.get("amount"); - - final Float balance = (Float) summaryBefore.get("accountBalance") - chargeAmount; - - Assert.assertEquals("Verifying the Balance after running Pay due Savings Charges", balance, - (Float) summaryAfter.get("accountBalance")); - break; - } - } } @Test @@ -539,48 +380,15 @@ public class SchedulerJobsTestResults { this.journalEntryHelper .checkJournalEntryForLiabilityAccount(liabilityAccount, this.TRANSACTION_DATE, liablilityAccountInitialEntry); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(8).get("jobId"); String JobName = "Update Accounting Running Balances"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + excuteJob(JobName); + final HashMap runningBalanceAfter = this.accountHelper.getAccountingWithRunningBalanceById(accountID.toString()); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + final Integer INT_BALANCE = new Integer(MINIMUM_OPENING_BALANCE); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - final HashMap runningBalanceAfter = this.accountHelper.getAccountingWithRunningBalanceById(accountID.toString()); - - final Integer INT_BALANCE = new Integer(MINIMUM_OPENING_BALANCE); - - Assert.assertEquals("Verifying Account Running Balance after running Update Accounting Running Balances Scheduler Job", - INT_BALANCE, runningBalanceAfter.get("organizationRunningBalance")); - break; - } - } + Assert.assertEquals("Verifying Account Running Balance after running Update Accounting Running Balances Scheduler Job", + INT_BALANCE, runningBalanceAfter.get("organizationRunningBalance")); } @@ -607,47 +415,15 @@ public class SchedulerJobsTestResults { loanStatusHashMap = this.loanTransactionHelper.disburseLoan(AccountTransferTest.LOAN_DISBURSAL_DATE, loanID); LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(1).get("jobId"); String JobName = "Update Loan Arrears Ageing"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + this.excuteJob(JobName); + HashMap loanSummaryData = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + Float totalLoanArrearsAging = (Float) loanSummaryData.get("principalOverdue") + (Float) loanSummaryData.get("interestOverdue"); - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - HashMap loanSummaryData = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - - Float totalLoanArrearsAging = (Float) loanSummaryData.get("principalOverdue") - + (Float) loanSummaryData.get("interestOverdue"); - - Assert.assertEquals("Verifying Arrears Aging after Running Update Loan Arrears Aging Scheduler Job", totalLoanArrearsAging, - loanSummaryData.get("totalOverdue")); - break; - } - } + Assert.assertEquals("Verifying Arrears Aging after Running Update Loan Arrears Aging Scheduler Job", totalLoanArrearsAging, + loanSummaryData.get("totalOverdue")); } @@ -695,52 +471,20 @@ public class SchedulerJobsTestResults { HashMap loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(2).get("jobId"); String JobName = "Update Loan Paid In Advance"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); + excuteJob(JobName); + // Retrieving Loan Repayment Schedule after the successful + // completion of + // Update Loan Paid in Advance Scheduler Job + ArrayList loanScheduleAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, + loanID); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + Float totalPaidInAdvance = (Float) loanScheduleAfter.get(1).get("totalPaidInAdvanceForPeriod"); - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - // Retrieving Loan Repayment Schedule after the successful - // completion of - // Update Loan Paid in Advance Scheduler Job - ArrayList loanScheduleAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, - this.responseSpec, loanID); - - loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - - Float totalPaidInAdvance = (Float) loanScheduleAfter.get(1).get("totalPaidInAdvanceForPeriod"); - - Assert.assertEquals("Verifying Loan Repayment in Advance after Running Update Loan Paid in Advance Scheduler Job", - totalDueForCurrentPeriod, totalPaidInAdvance); - break; - } - } + Assert.assertEquals("Verifying Loan Repayment in Advance after Running Update Loan Paid in Advance Scheduler Job", + totalDueForCurrentPeriod, totalPaidInAdvance); } @@ -790,45 +534,13 @@ public class SchedulerJobsTestResults { HashMap loanSummaryBefore = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(0).get("jobId"); String JobName = "Update loan Summary"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); - - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); - - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - Float expectedSummaryAfterJob = (Float) loanSummaryBefore.get("totalExpectedRepayment") - - (Float) loanSummaryBefore.get("feeChargesPaid"); - HashMap loanSummaryAfter = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); - Assert.assertEquals("Verifying Loan Summary after Running Update Loan Summary Scheduler Job", expectedSummaryAfterJob, - (Float) loanSummaryAfter.get("totalExpectedRepayment")); - break; - } - } + excuteJob(JobName); + Float expectedSummaryAfterJob = (Float) loanSummaryBefore.get("totalExpectedRepayment") + - (Float) loanSummaryBefore.get("feeChargesPaid"); + HashMap loanSummaryAfter = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); + Assert.assertEquals("Verifying Loan Summary after Running Update Loan Summary Scheduler Job", expectedSummaryAfterJob, + (Float) loanSummaryAfter.get("totalExpectedRepayment")); } @@ -894,55 +606,23 @@ public class SchedulerJobsTestResults { MONTH_DAY); Assert.assertNotNull(standingInstructionId); - ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); - Assert.assertNotNull(allSchedulerJobsData); - - // Integer jobId = (Integer) allSchedulerJobsData.get(9).get("jobId"); String JobName = "Execute Standing Instruction"; - for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { - if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { - Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); + excuteJob(JobName); + HashMap fromSavingsSummaryAfter = this.savingsAccountHelper.getSavingsSummary(fromSavingsId); + Float fromSavingsBalanceAfter = (Float) fromSavingsSummaryAfter.get("accountBalance"); - // Executing Scheduler Job - this.schedulerJobHelper.runSchedulerJob(this.requestSpec, this.responseSpecForSchedulerJob, jobId.toString()); + HashMap toSavingsSummaryAfter = this.savingsAccountHelper.getSavingsSummary(toSavingsId); + Float toSavingsBalanceAfter = (Float) toSavingsSummaryAfter.get("accountBalance"); - // Retrieving Scheduler Job by ID - HashMap schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); + final HashMap standingInstructionData = this.standingInstructionsHelper + .getStandingInstructionById(standingInstructionId.toString()); + Float expectedFromSavingsBalance = fromSavingsBalanceBefore - (Float) standingInstructionData.get("amount"); + Float expectedToSavingsBalance = toSavingsBalanceBefore + (Float) standingInstructionData.get("amount"); - // Waiting for Job to complete - while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); - schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); - Assert.assertNotNull(schedulerJob); - System.out.println("Job is Still Running"); - } - - ArrayList jobHistoryData = this.schedulerJobHelper.getSchedulerJobHistory(this.requestSpec, this.responseSpec, - jobId.toString()); - - // Verifying the Status of the Recently executed Scheduler Job - Assert.assertEquals("Verifying Last Scheduler Job Status", "success", - jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - - HashMap fromSavingsSummaryAfter = this.savingsAccountHelper.getSavingsSummary(fromSavingsId); - Float fromSavingsBalanceAfter = (Float) fromSavingsSummaryAfter.get("accountBalance"); - - HashMap toSavingsSummaryAfter = this.savingsAccountHelper.getSavingsSummary(toSavingsId); - Float toSavingsBalanceAfter = (Float) toSavingsSummaryAfter.get("accountBalance"); - - final HashMap standingInstructionData = this.standingInstructionsHelper.getStandingInstructionById(standingInstructionId - .toString()); - Float expectedFromSavingsBalance = fromSavingsBalanceBefore - (Float) standingInstructionData.get("amount"); - Float expectedToSavingsBalance = toSavingsBalanceBefore + (Float) standingInstructionData.get("amount"); - - Assert.assertEquals("Verifying From Savings Balance after Successful completion of Scheduler Job", - expectedFromSavingsBalance, fromSavingsBalanceAfter); - Assert.assertEquals("Verifying To Savings Balance after Successful completion of Scheduler Job", expectedToSavingsBalance, - toSavingsBalanceAfter); - break; - } - } + Assert.assertEquals("Verifying From Savings Balance after Successful completion of Scheduler Job", expectedFromSavingsBalance, + fromSavingsBalanceAfter); + Assert.assertEquals("Verifying To Savings Balance after Successful completion of Scheduler Job", expectedToSavingsBalance, + toSavingsBalanceAfter); } @@ -977,10 +657,57 @@ public class SchedulerJobsTestResults { ArrayList repaymentScheduleDataBefore = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); + String JobName = "Apply penalty to overdue loans"; + excuteJob(JobName); + + final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, overdueFeeChargeId); + + Float chargeAmount = (Float) chargeData.get("amount"); + + ArrayList repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, + this.responseSpec, loanID); + + Assert.assertEquals("Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job", + chargeAmount, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue")); + + } + + @Test + public void testUpdateOverdueDaysForNPA() throws InterruptedException { + this.schedulerJobHelper = new SchedulerJobHelper(this.requestSpec, this.responseSpec); + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + + final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec); + Assert.assertNotNull(clientID); + + final Integer loanProductID = createLoanProduct(null); + Assert.assertNotNull(loanProductID); + + final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null); + Assert.assertNotNull(loanID); + + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + loanStatusHashMap = this.loanTransactionHelper.approveLoan(AccountTransferTest.LOAN_APPROVAL_DATE, loanID); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + + loanStatusHashMap = this.loanTransactionHelper.disburseLoan(AccountTransferTest.LOAN_DISBURSAL_DATE, loanID); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + + final Boolean isNPABefore = (Boolean) this.loanTransactionHelper.getLoanDetail(requestSpec, responseSpec, loanID, "isNPA"); + Assert.assertFalse(isNPABefore); + // Integer jobId = (Integer) allSchedulerJobsData.get(1).get("jobId"); + String JobName = "Update Non Performing Assets"; + excuteJob(JobName); + final Boolean isNPAAfter = (Boolean) this.loanTransactionHelper.getLoanDetail(requestSpec, responseSpec, loanID, "isNPA"); + Assert.assertTrue(isNPAAfter); + } + + private void excuteJob(String JobName) throws InterruptedException { ArrayList allSchedulerJobsData = this.schedulerJobHelper.getAllSchedulerJobs(this.requestSpec, this.responseSpec); Assert.assertNotNull(allSchedulerJobsData); - String JobName = "Apply penalty to overdue loans"; for (Integer jobIndex = 0; jobIndex < allSchedulerJobsData.size(); jobIndex++) { if (allSchedulerJobsData.get(jobIndex).get("displayName").equals(JobName)) { Integer jobId = (Integer) allSchedulerJobsData.get(jobIndex).get("jobId"); @@ -994,7 +721,7 @@ public class SchedulerJobsTestResults { // Waiting for Job to complete while ((Boolean) schedulerJob.get("currentlyRunning") == true) { - Thread.sleep(120000); + Thread.sleep(15000); schedulerJob = this.schedulerJobHelper.getSchedulerJobById(this.requestSpec, this.responseSpec, jobId.toString()); Assert.assertNotNull(schedulerJob); System.out.println("Job is Still Running"); @@ -1007,20 +734,9 @@ public class SchedulerJobsTestResults { Assert.assertEquals("Verifying Last Scheduler Job Status", "success", jobHistoryData.get(jobHistoryData.size() - 1).get("status")); - final HashMap chargeData = ChargesHelper.getChargeById(this.requestSpec, this.responseSpec, overdueFeeChargeId); - - Float chargeAmount = (Float) chargeData.get("amount"); - - ArrayList repaymentScheduleDataAfter = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, - this.responseSpec, loanID); - - Assert.assertEquals("Verifying From Penalty Charges due fot first Repayment after Successful completion of Scheduler Job", - chargeAmount, (Float) repaymentScheduleDataAfter.get(1).get("penaltyChargesDue")); - break; } } - } private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java index 601d9d784..aab5f1911 100755 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/charges/ChargesHelper.java @@ -44,7 +44,6 @@ public class ChargesHelper { private final static boolean active = true; private final static boolean penalty = true; - public final static boolean addfeefrequency = true; private final static String amount = "100"; private final static String currencyCode = "USD"; public final static String feeOnMonthDay = "04 March"; @@ -133,7 +132,7 @@ public class ChargesHelper { System.out.println(chargesCreateJson); return chargesCreateJson; } - + public static String getLoanSpecifiedDueDateWithAccountTransferJSON() { final HashMap map = populateDefaultsForLoan(); map.put("chargeTimeType", CHARGE_SPECIFIED_DUE_DATE); @@ -159,6 +158,9 @@ public class ChargesHelper { map.put("penalty", ChargesHelper.penalty); map.put("chargePaymentMode", ChargesHelper.CHARGE_PAYMENT_MODE_REGULAR); map.put("chargeTimeType", CHARGE_OVERDUE_INSTALLMENT_FEE); + map.put("feeFrequency", ChargesHelper.CHARGE_FEE_FREQUENCY_MONTHS); + map.put("feeOnMonthDay", ChargesHelper.feeOnMonthDay); + map.put("feeInterval", 2); String chargesCreateJson = new Gson().toJson(map); System.out.println(chargesCreateJson); return chargesCreateJson; @@ -174,10 +176,6 @@ public class ChargesHelper { map.put("locale", CommonConstants.locale); map.put("monthDayFormat", ChargesHelper.monthDayFormat); map.put("name", Utils.randomNameGenerator("Charge_Loans_", 6)); - if (ChargesHelper.addfeefrequency) { - map.put("feeFrequency", ChargesHelper.CHARGE_FEE_FREQUENCY_DAYS); - map.put("feeInterval", 2); - } return map; } diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanProductTestBuilder.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanProductTestBuilder.java index c886773f4..8be2b9abf 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanProductTestBuilder.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanProductTestBuilder.java @@ -42,6 +42,7 @@ public class LoanProductTestBuilder { private String interestRatePerPeriod = "2"; private String interestRateFrequencyType = MONTHS; private String interestType = FLAT_BALANCE; + private String overdueDaysForNPA = "5"; private String interestCalculationPeriodType = CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; private String inArrearsTolerance = "0"; private final String transactionProcessingStrategy = MIFOS_STANDARD_STRATEGY; @@ -81,6 +82,7 @@ public class LoanProductTestBuilder { map.put("accountingRule", this.accountingRule); map.put("minPrincipal", this.minPrincipal); map.put("maxPrincipal", this.maxPrincipal); + map.put("overdueDaysForNPA", this.overdueDaysForNPA); if (this.accountingRule.equals(ACCRUAL_UPFRONT) || this.accountingRule.equals(ACCRUAL_PERIODIC)) { map.putAll(getAccountMappingForAccrualBased()); @@ -170,6 +172,11 @@ public class LoanProductTestBuilder { return this; } + public LoanProductTestBuilder withOverdueDaysForNPA(String days) { + this.overdueDaysForNPA = days; + return this; + } + public LoanProductTestBuilder withInterestCalculationPeriodTypeAsDays() { this.interestCalculationPeriodType = DAYS; return this; diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java index c66f5c12f..ec96930f1 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/loans/LoanTransactionHelper.java @@ -54,6 +54,12 @@ public class LoanTransactionHelper { return response; } + public Object getLoanDetail(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, final Integer loanID, + final String param) { + final String URL = "/mifosng-provider/api/v1/loans/" + loanID + "?associations=all&tenantIdentifier=default"; + return Utils.performServerGet(requestSpec, responseSpec, URL, param); + } + public ArrayList getLoanCharges(final Integer loanId) { final String GET_LOAN_CHARGES_URL = "/mifosng-provider/api/v1/loans/" + loanId + "/charges?" + Utils.TENANT_IDENTIFIER; return Utils.performServerGet(requestSpec, responseSpec, GET_LOAN_CHARGES_URL, ""); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformService.java index 4ccdbf37e..722d1b829 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformService.java @@ -22,6 +22,6 @@ public interface LoanChargeReadPlatformService { Collection retrieveLoanChargesForFeePayment(Integer paymentMode, Integer loanStatus); Collection retrieveInstallmentLoanCharges(Long loanChargeId, boolean onlyPaymentPendingCharges); - - Collection retrieveOverdueInstallmentChargeFrequencyNumber(Long installmentId, Long chargeId); + + Collection retrieveOverdueInstallmentChargeFrequencyNumber(Long loanId, Long chargeId, Integer periodNumber); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java index 34b4eb071..c7553cdc0 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java @@ -226,12 +226,14 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform } @Override - public Collection retrieveOverdueInstallmentChargeFrequencyNumber(final Long installmentId,final Long chargeId) { - String sql = "select oic.frequency_number from m_loan_overdue_installment_charge oic inner join m_loan_charge lc on lc.id=oic.loan_charge_id where oic.loan_schedule_id = ? and lc.is_active = 1"; - Object[] params = {installmentId}; - if(chargeId != null){ + public Collection retrieveOverdueInstallmentChargeFrequencyNumber(final Long loanId, final Long chargeId, + final Integer periodNumber) { + String sql = "select oic.frequency_number from m_loan_overdue_installment_charge oic inner join m_loan_charge lc on lc.id=oic.loan_charge_id inner join m_loan_repayment_schedule rs on rs.id = oic.loan_schedule_id inner join m_loan loan on loan.id=rs.loan_id " + + "where lc.is_active = 1 and loan.id = ? and rs.installment=?"; + Object[] params = { loanId, periodNumber }; + if (chargeId != null) { sql += " and lc.charge_id = ? "; - params = new Object[]{installmentId,chargeId}; + params = new Object[] { loanId, periodNumber, chargeId }; } return this.jdbcTemplate.queryForList(sql, Integer.class, params); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 65933448d..c65bb4b76 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -1781,18 +1781,15 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } } + @SuppressWarnings("null") @Transactional public void applyChargeToOverdueLoanInstallment(final Long loanId, final Long loanChargeId, final Integer periodNumber, final JsonCommand command) { - final Loan loan = this.loanAssembler.assembleFrom(loanId); - checkClientOrGroupActive(loan); - final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(loanChargeId); - final LoanRepaymentScheduleInstallment installment = loan.fetchRepaymentScheduleInstallment(periodNumber); - Collection frequencyNumbers = loanChargeReadPlatformService.retrieveOverdueInstallmentChargeFrequencyNumber( - installment.getId(), chargeDefinition.getId()); + Collection frequencyNumbers = loanChargeReadPlatformService.retrieveOverdueInstallmentChargeFrequencyNumber(loanId, + chargeDefinition.getId(), periodNumber); Integer feeFrequency = chargeDefinition.feeFrequency(); final ScheduledDateGenerator scheduledDateGenerator = new DefaultScheduledDateGenerator(); @@ -1822,6 +1819,14 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf scheduleDates.remove(frequency); } + Loan loan = null; + LoanRepaymentScheduleInstallment installment = null; + if (!scheduleDates.isEmpty()) { + loan = this.loanAssembler.assembleFrom(loanId); + checkClientOrGroupActive(loan); + installment = loan.fetchRepaymentScheduleInstallment(periodNumber); + } + for (Map.Entry entry : scheduleDates.entrySet()) { final LoanCharge loanCharge = LoanCharge.createNewFromJson(loan, chargeDefinition, command, entry.getValue());