From 0d1439afea61a959dd5b89beb36b8fd834b0f661 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Tue, 17 Mar 2015 17:14:53 +0530 Subject: [PATCH] schedule correction for payments after maturity date --- .../ClientLoanIntegrationTest.java | 139 +++++++++--------- .../integrationtests/common/Utils.java | 18 +++ .../domain/AbstractLoanScheduleGenerator.java | 66 +++++---- 3 files changed, 122 insertions(+), 101 deletions(-) diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java index 8cc788d2b..d1fa67af8 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/ClientLoanIntegrationTest.java @@ -3164,7 +3164,7 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3184,7 +3184,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3202,7 +3202,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); @@ -3210,7 +3210,7 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3218,7 +3218,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3226,13 +3226,13 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); Float earlyPayment = new Float("4000"); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -5); final String LOAN_SECOND_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_SECOND_REPAYMENT_DATE, earlyPayment, loanID); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "3965.31", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "1771.88", "16.39", "0.0", "0.0"); @@ -3241,7 +3241,7 @@ public class ClientLoanIntegrationTest { HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); String prepayAmount = String.valueOf(prepayDetail.get("amount")); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String LOAN_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_REPAYMENT_DATE, new Float(prepayAmount), loanID); loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3254,7 +3254,7 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3278,7 +3278,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "4.62", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "3.47", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "2.32", "0.0"); @@ -3296,7 +3296,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "4.62", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.76", "46.15", "4.62", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "2.32", "0.0"); @@ -3304,7 +3304,7 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3312,7 +3312,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "4.62", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "3.47", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "2.32", "0.0"); @@ -3320,13 +3320,13 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); Float earlyPayment = new Float("4000"); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -5); final String LOAN_SECOND_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_SECOND_REPAYMENT_DATE, earlyPayment, loanID); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "4.62", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "3961.84", "34.69", "3.47", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "1773.61", "16.41", "1.64", "0.0"); @@ -3335,7 +3335,7 @@ public class ClientLoanIntegrationTest { HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); String prepayAmount = String.valueOf(prepayDetail.get("amount")); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String LOAN_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_REPAYMENT_DATE, new Float(prepayAmount), loanID); loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3348,7 +3348,7 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3368,7 +3368,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3387,7 +3387,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.54", "46.37", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); @@ -3398,7 +3398,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanFutureRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, 0, "4965.3", "92.52", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2517.24", "11.67", "0.0", "0.0"); @@ -3406,7 +3406,7 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues, 0); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3414,7 +3414,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3422,14 +3422,14 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); Float earlyPayment = new Float("4000"); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -5); final String LOAN_SECOND_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_SECOND_REPAYMENT_DATE, earlyPayment, loanID); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); - Calendar today = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); + Calendar today = Calendar.getInstance(Utils.getTimeZoneOfTenant()); Map paymentday = new HashMap<>(3); paymentday.put("dueDate", getDateAsArray(today, -5, Calendar.DAY_OF_MONTH)); paymentday.put("principalDue", "3990.09"); @@ -3444,7 +3444,7 @@ public class ClientLoanIntegrationTest { HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); String prepayAmount = String.valueOf(prepayDetail.get("amount")); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String LOAN_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_REPAYMENT_DATE, new Float(prepayAmount), loanID); loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3458,13 +3458,13 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.DAY_OF_MONTH, -2); final String REST_START_DATE = dateFormat.format(todaysDate.getTime()); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); todaysDate.add(Calendar.DAY_OF_MONTH, 2); final String LOAN_FLAT_CHARGE_DATE = dateFormat.format(todaysDate.getTime()); @@ -3495,7 +3495,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2486.04", "42.87", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2497.5", "31.41", "200", "0.0"); @@ -3514,7 +3514,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.57", "46.34", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2497.49", "31.42", "200", "0.0"); @@ -3523,7 +3523,7 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - Calendar repaymentDate = Calendar.getInstance(); + Calendar repaymentDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); repaymentDate.add(Calendar.DAY_OF_MONTH, -7); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(repaymentDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3531,7 +3531,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2486.04", "42.87", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2497.5", "31.41", "200", "0.0"); @@ -3540,14 +3540,14 @@ public class ClientLoanIntegrationTest { verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); Float earlyPayment = new Float("5100"); - repaymentDate = Calendar.getInstance(); + repaymentDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); repaymentDate.add(Calendar.DAY_OF_MONTH, -5); final String LOAN_SECOND_REPAYMENT_DATE = dateFormat.format(repaymentDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_SECOND_REPAYMENT_DATE, earlyPayment, loanID); loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "100.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "5057.13", "42.87", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "0", "19.55", "200", "0.0"); @@ -3557,7 +3557,7 @@ public class ClientLoanIntegrationTest { HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); String prepayAmount = String.valueOf(prepayDetail.get("amount")); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String LOAN_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_REPAYMENT_DATE, new Float(prepayAmount), loanID); loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); @@ -3573,13 +3573,13 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7 * 3); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.DAY_OF_MONTH, -2); final String REST_START_DATE = dateFormat.format(todaysDate.getTime()); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); Integer overdueFeeChargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec, ChargesHelper.getLoanOverdueFeeJSONWithCalculattionTypePercentage()); @@ -3601,7 +3601,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -2, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3619,7 +3619,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -2, "2482.76", "46.15", "0.0", "0.0"); @@ -3635,14 +3635,14 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -2, "2482.76", "46.15", "0.0", "252.89"); addRepaymentValues(expectedvalues, todaysDate, 1, "2481.38", "47.53", "0.0", "252.89"); addRepaymentValues(expectedvalues, todaysDate, 1, "2479.99", "48.92", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2517.11", "11.8", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - Calendar repaymentDate = Calendar.getInstance(); + Calendar repaymentDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); repaymentDate.add(Calendar.DAY_OF_MONTH, -7 * 2); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(repaymentDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3651,14 +3651,14 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -2, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "252.89"); addRepaymentValues(expectedvalues, todaysDate, 1, "2492.89", "36.02", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2517.23", "11.68", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - repaymentDate = Calendar.getInstance(); + repaymentDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); repaymentDate.add(Calendar.DAY_OF_MONTH, -3); final String LOAN_SECOND_REPAYMENT_DATE = dateFormat.format(repaymentDate.getTime()); totalDueForCurrentPeriod = (Float) loanSchedule.get(2).get("totalDueForPeriod"); @@ -3666,7 +3666,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -2, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "252.89"); addRepaymentValues(expectedvalues, todaysDate, 1, "2498.39", "30.52", "0.0", "0.0"); @@ -3688,7 +3688,7 @@ public class ClientLoanIntegrationTest { final Account expenseAccount = this.accountHelper.createExpenseAccount(); final Account overpaymentAccount = this.accountHelper.createLiabilityAccount(); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3709,7 +3709,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3727,7 +3727,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); @@ -3738,13 +3738,13 @@ public class ClientLoanIntegrationTest { final JournalEntry[] assetAccountInitialEntry = { new JournalEntry(10000.0f, JournalEntry.TransactionType.CREDIT), new JournalEntry(10000.0f, JournalEntry.TransactionType.DEBIT), }; this.journalEntryHelper.checkJournalEntryForAssetAccount(assetAccount, LOAN_DISBURSEMENT_DATE, assetAccountInitialEntry); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String runOndate = dateFormat.format(todaysDate.getTime()); this.periodicAccrualAccountingHelper.runPeriodicAccrualAccounting(runOndate); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now().minusDays(7), 46.15f, 0f, 0f, loanID); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now(), 46.15f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant().minusDays(7), 46.15f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant(), 46.15f, 0f, 0f, loanID); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); @@ -3752,26 +3752,26 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2517.29", "11.62", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now().minusDays(7), 46.15f, 0f, 0f, loanID); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now(), 34.69f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant().minusDays(7), 46.15f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant(), 34.69f, 0f, 0f, loanID); HashMap prepayDetail = this.loanTransactionHelper.getPrepayAmount(this.requestSpec, this.responseSpec, loanID); String prepayAmount = String.valueOf(prepayDetail.get("amount")); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); String LOAN_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); this.loanTransactionHelper.makeRepayment(LOAN_REPAYMENT_DATE, new Float(prepayAmount), loanID); loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, loanID); LoanStatusChecker.verifyLoanAccountIsClosed(loanStatusHashMap); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now().minusDays(7), 46.15f, 0f, 0f, loanID); - this.loanTransactionHelper.checkAccrualTransactionForRepayment(LocalDate.now(), 34.69f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant().minusDays(7), 46.15f, 0f, 0f, loanID); + this.loanTransactionHelper.checkAccrualTransactionForRepayment(Utils.getLocalDateOfTenant(), 34.69f, 0f, 0f, loanID); } @@ -3781,7 +3781,7 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3801,7 +3801,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3820,7 +3820,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.54", "46.37", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); @@ -3828,7 +3828,7 @@ public class ClientLoanIntegrationTest { addRepaymentValues(expectedvalues, todaysDate, 1, "11.79", "0.05", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); HashMap loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); List dates = (List) loanSummary.get("overdueSinceDate"); @@ -3836,13 +3836,13 @@ public class ClientLoanIntegrationTest { assertEquals(todaysDate.get(Calendar.MONTH) + 1, dates.get(1)); assertEquals(todaysDate.get(Calendar.DAY_OF_MONTH), dates.get(2)); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -8); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); this.loanTransactionHelper.makeRepayment(LOAN_FIRST_REPAYMENT_DATE, totalDueForCurrentPeriod, loanID); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); dates = (List) loanSummary.get("overdueSinceDate"); @@ -3858,7 +3858,8 @@ public class ClientLoanIntegrationTest { DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar todaysDate = Calendar.getInstance(); + Calendar todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); + System.out.println("----timeeeeeeeeeeeeee------>"+dateFormat.format(todaysDate.getTime())); todaysDate.add(Calendar.DAY_OF_MONTH, -14); final String LOAN_DISBURSEMENT_DATE = dateFormat.format(todaysDate.getTime()); @@ -3878,7 +3879,7 @@ public class ClientLoanIntegrationTest { ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); List> expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2494.22", "34.69", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.73", "23.18", "0.0", "0.0"); @@ -3897,7 +3898,7 @@ public class ClientLoanIntegrationTest { loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(this.requestSpec, this.responseSpec, loanID); expectedvalues = new ArrayList<>(); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); addRepaymentValues(expectedvalues, todaysDate, -1, "2482.76", "46.15", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2482.54", "46.37", "0.0", "0.0"); addRepaymentValues(expectedvalues, todaysDate, 1, "2505.67", "23.24", "0.0", "0.0"); @@ -3905,7 +3906,7 @@ public class ClientLoanIntegrationTest { addRepaymentValues(expectedvalues, todaysDate, 1, "11.79", "0.05", "0.0", "0.0"); verifyLoanRepaymentSchedule(loanSchedule, expectedvalues); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); HashMap loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); List dates = (List) loanSummary.get("overdueSinceDate"); @@ -3913,13 +3914,13 @@ public class ClientLoanIntegrationTest { assertEquals(todaysDate.get(Calendar.MONTH) + 1, dates.get(1)); assertEquals(todaysDate.get(Calendar.DAY_OF_MONTH), dates.get(2)); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -8); final String LOAN_FIRST_REPAYMENT_DATE = dateFormat.format(todaysDate.getTime()); Float totalDueForCurrentPeriod = (Float) loanSchedule.get(1).get("totalDueForPeriod"); this.loanTransactionHelper.makeRepayment(LOAN_FIRST_REPAYMENT_DATE, totalDueForCurrentPeriod, loanID); - todaysDate = Calendar.getInstance(); + todaysDate = Calendar.getInstance(Utils.getTimeZoneOfTenant()); todaysDate.add(Calendar.DAY_OF_MONTH, -7); loanSummary = this.loanTransactionHelper.getLoanSummary(this.requestSpec, this.responseSpec, loanID); dates = (List) loanSummary.get("overdueSinceDate"); diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/Utils.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/Utils.java index de6378e75..4818d13da 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/Utils.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/Utils.java @@ -16,9 +16,12 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import java.util.Random; +import java.util.TimeZone; import org.apache.commons.lang.StringUtils; import org.apache.http.conn.HttpHostConnectException; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDate; import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; @@ -34,6 +37,8 @@ public class Utils { public static final String TENANT_IDENTIFIER = "tenantIdentifier=default"; + public static final String TENANT_TIME_ZONE = "Asia/Kolkata"; + private static final String LOGIN_URL = "/mifosng-provider/api/v1/authentication?username=mifos&password=password&" + TENANT_IDENTIFIER; public static void initializeRESTAssured() { @@ -120,4 +125,17 @@ public class Utils { return new SimpleDateFormat("dd MMMMMM yyyy").format(dateToBeConvert.getTime()); } + public static LocalDate getLocalDateOfTenant() { + LocalDate today = new LocalDate(); + final DateTimeZone zone = DateTimeZone.forID(TENANT_TIME_ZONE); + if (zone != null) { + today = new LocalDate(zone); + } + return today; + } + + public static TimeZone getTimeZoneOfTenant() { + return TimeZone.getTimeZone(TENANT_TIME_ZONE); + } + } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index 9a875aeef..864c17260 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -555,6 +555,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener updateLatePaymentsToMap(loanApplicationTerms, holidayDetailDTO, currency, latePaymentMap, currentDate, installments, false); Money outstanding = Money.zero(currency); Money totalInterest = Money.zero(currency); + Money totalCumulativeInterest = Money.zero(currency); Map retainEntries = new HashMap<>(); double interestCalculationGraceOnRepaymentPeriodFraction = Double.valueOf(0); int periodNumberTemp = 1; @@ -575,36 +576,34 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener if (detail.isProcessed()) { continue; } - if (detail.getTransactionDate().isBefore(actualRepaymentDate)) { - List currentTransactions = createCurrentTransactionList(detail); + List currentTransactions = createCurrentTransactionList(detail); - if (!periodStartDate.isEqual(detail.getTransactionDate())) { - PrincipalInterest principalInterestForThisPeriod = calculatePrincipalInterestComponentsForPeriod( - this.paymentPeriodsInOneYearCalculator, interestCalculationGraceOnRepaymentPeriodFraction, - totalInterest.zero(), totalInterest.zero(), totalInterest.zero(), totalInterest.zero(), outstanding, - loanApplicationTerms, periodNumberTemp, mc, latePaymentMap, periodStartDate, detail.getTransactionDate(), - daysInPeriod); + if (!periodStartDate.isEqual(detail.getTransactionDate())) { + PrincipalInterest principalInterestForThisPeriod = calculatePrincipalInterestComponentsForPeriod( + this.paymentPeriodsInOneYearCalculator, interestCalculationGraceOnRepaymentPeriodFraction, + totalInterest.zero(), totalInterest.zero(), totalInterest.zero(), totalInterest.zero(), outstanding, + loanApplicationTerms, periodNumberTemp, mc, latePaymentMap, periodStartDate, detail.getTransactionDate(), + daysInPeriod); - Money interest = principalInterestForThisPeriod.interest(); - totalInterest = totalInterest.plus(interest); + Money interest = principalInterestForThisPeriod.interest(); + totalInterest = totalInterest.plus(interest); - LoanScheduleModelRepaymentPeriod installment = LoanScheduleModelRepaymentPeriod.repayment(instalmentNumber, - startDate, detail.getTransactionDate(), totalInterest.zero(), totalInterest.zero(), totalInterest, - totalInterest.zero(), totalInterest.zero(), totalInterest, true); - periods.add(installment); - totalInterest = totalInterest.zero(); - addLoanRepaymentScheduleInstallment(installments, installment); - periodStartDate = detail.getTransactionDate(); - startDate = detail.getTransactionDate(); - } - loanRepaymentScheduleTransactionProcessor.handleRepaymentSchedule(currentTransactions, currency, installments); - updateLatePaymentsToMap(loanApplicationTerms, holidayDetailDTO, currency, latePaymentMap, currentDate, installments, - false); - outstanding = outstanding.zero(); - outstanding = updateOutstandingFromLatePayment(periodStartDate, latePaymentMap, outstanding, retainEntries); - if (latePaymentMap.isEmpty() && !outstanding.isGreaterThanZero()) { - break; - } + LoanScheduleModelRepaymentPeriod installment = LoanScheduleModelRepaymentPeriod.repayment(instalmentNumber++, + startDate, detail.getTransactionDate(), totalInterest.zero(), totalInterest.zero(), totalInterest, + totalInterest.zero(), totalInterest.zero(), totalInterest, true); + periods.add(installment); + totalCumulativeInterest = totalCumulativeInterest.plus(totalInterest); + totalInterest = totalInterest.zero(); + addLoanRepaymentScheduleInstallment(installments, installment); + periodStartDate = detail.getTransactionDate(); + startDate = detail.getTransactionDate(); + } + loanRepaymentScheduleTransactionProcessor.handleRepaymentSchedule(currentTransactions, currency, installments); + updateLatePaymentsToMap(loanApplicationTerms, holidayDetailDTO, currency, latePaymentMap, currentDate, installments, false); + outstanding = outstanding.zero(); + outstanding = updateOutstandingFromLatePayment(periodStartDate, latePaymentMap, outstanding, retainEntries); + if (latePaymentMap.isEmpty() && !outstanding.isGreaterThanZero()) { + break; } } @@ -625,11 +624,14 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener periodStartDate = actualRepaymentDate; } while (actualRepaymentDate.isBefore(currentDate) && outstanding.isGreaterThanZero()); - LoanScheduleModelRepaymentPeriod installment = LoanScheduleModelRepaymentPeriod.repayment(instalmentNumber, startDate, - actualRepaymentDate, totalInterest.zero(), totalInterest.zero(), totalInterest, totalInterest.zero(), totalInterest.zero(), - totalInterest, true); - periods.add(installment); - return totalInterest; + if (totalInterest.isGreaterThanZero()) { + LoanScheduleModelRepaymentPeriod installment = LoanScheduleModelRepaymentPeriod.repayment(instalmentNumber++, startDate, + actualRepaymentDate, totalInterest.zero(), totalInterest.zero(), totalInterest, totalInterest.zero(), + totalInterest.zero(), totalInterest, true); + periods.add(installment); + totalCumulativeInterest = totalCumulativeInterest.plus(totalInterest); + } + return totalCumulativeInterest; } private Collection getApplicableTransactionsForPeriod(final LoanApplicationTerms loanApplicationTerms,