diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/FixedDepositTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/FixedDepositTest.java index 2a493ac35..a3cedd5c1 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/FixedDepositTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/FixedDepositTest.java @@ -661,11 +661,13 @@ public class FixedDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); @@ -706,6 +708,7 @@ public class FixedDepositTest { double interestPerDay = interestRateInFraction * perDay; todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(todaysDate.getTime())); Integer daysInMonth = todaysDate.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; @@ -761,11 +764,13 @@ public class FixedDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); @@ -810,6 +815,7 @@ public class FixedDepositTest { double interestPerDay = interestRateInFraction * perDay; todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(todaysDate.getTime())); Integer daysInMonth = todaysDate.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; @@ -865,11 +871,13 @@ public class FixedDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); @@ -903,6 +911,7 @@ public class FixedDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); + activationDate.add(Calendar.DAY_OF_MONTH, -1); DateTime startDate = new DateTime(activationDate.getTime()); Calendar prematureClosureDate = Calendar.getInstance(); @@ -918,6 +927,7 @@ public class FixedDepositTest { double interestPerDay = interestRateInFraction * perDay; todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(todaysDate.getTime())); Integer daysInMonth = todaysDate.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; @@ -972,11 +982,13 @@ public class FixedDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); @@ -1014,6 +1026,7 @@ public class FixedDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); + activationDate.add(Calendar.DAY_OF_MONTH, -1); DateTime startDate = new DateTime(activationDate.getTime()); Calendar prematureClosureDate = Calendar.getInstance(); @@ -1029,6 +1042,7 @@ public class FixedDepositTest { double interestPerDay = interestRateInFraction * perDay; todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(todaysDate.getTime())); Integer daysInMonth = todaysDate.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/RecurringDepositTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/RecurringDepositTest.java index c5fde08b5..458542002 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/RecurringDepositTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/RecurringDepositTest.java @@ -975,7 +975,6 @@ public class RecurringDepositTest { DEPOSIT_AMOUNT, EXPECTED_FIRST_DEPOSIT_ON_DATE); Assert.assertNotNull(transactionIdForDeposit); - currentDate = currentDate - 1; interestPerMonth = (float) (interestPerDay * principal * currentDate); System.out.println("IPM = " + interestPerMonth); principal += interestPerMonth; @@ -1102,7 +1101,6 @@ public class RecurringDepositTest { DEPOSIT_AMOUNT, EXPECTED_FIRST_DEPOSIT_ON_DATE); Assert.assertNotNull(transactionIdForDeposit); - currentDate = currentDate - 1; interestPerMonth = (float) (interestPerDay * principal * currentDate); System.out.println("IPM = " + interestPerMonth); principal += interestPerMonth; @@ -1150,12 +1148,14 @@ public class RecurringDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); String EXPECTED_FIRST_DEPOSIT_ON_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); final Account assetAccount = this.accountHelper.createAssetAccount(); @@ -1196,6 +1196,7 @@ public class RecurringDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); + activationDate.add(Calendar.DAY_OF_MONTH, -1); DateTime start = new DateTime(activationDate.getTime()); Calendar prematureClosureDate = Calendar.getInstance(); @@ -1219,6 +1220,7 @@ public class RecurringDepositTest { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); + calendar.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(calendar.getTime())); Integer daysInMonth = calendar.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; @@ -1232,7 +1234,6 @@ public class RecurringDepositTest { DEPOSIT_AMOUNT, EXPECTED_FIRST_DEPOSIT_ON_DATE); Assert.assertNotNull(transactionIdForDeposit); - currentDate = currentDate - 1; interestPerMonth = (float) (interestPerDay * principal * currentDate); System.out.println("IPM = " + interestPerMonth); principal += interestPerMonth; @@ -1280,12 +1281,14 @@ public class RecurringDepositTest { todaysDate = Calendar.getInstance(); todaysDate.add(Calendar.MONTH, -1); + todaysDate.add(Calendar.DAY_OF_MONTH, -1); final String SUBMITTED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String APPROVED_ON_DATE = dateFormat.format(todaysDate.getTime()); final String ACTIVATION_DATE = dateFormat.format(todaysDate.getTime()); String EXPECTED_FIRST_DEPOSIT_ON_DATE = dateFormat.format(todaysDate.getTime()); final String MONTH_DAY = monthDayFormat.format(todaysDate.getTime()); todaysDate.add(Calendar.MONTH, 1); + todaysDate.add(Calendar.DAY_OF_MONTH, 1); final String CLOSED_ON_DATE = dateFormat.format(todaysDate.getTime()); final Account assetAccount = this.accountHelper.createAssetAccount(); @@ -1331,6 +1334,7 @@ public class RecurringDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); + activationDate.add(Calendar.DAY_OF_MONTH, -1); DateTime start = new DateTime(activationDate.getTime()); Calendar prematureClosureDate = Calendar.getInstance(); @@ -1354,6 +1358,7 @@ public class RecurringDepositTest { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); + calendar.add(Calendar.DAY_OF_MONTH, -1); Integer currentDate = new Integer(currentDateFormat.format(calendar.getTime())); Integer daysInMonth = calendar.getActualMaximum(Calendar.DATE); daysInMonth = (daysInMonth - currentDate) + 1; @@ -1367,7 +1372,6 @@ public class RecurringDepositTest { DEPOSIT_AMOUNT, EXPECTED_FIRST_DEPOSIT_ON_DATE); Assert.assertNotNull(newTransactionIdForDeposit); - currentDate = currentDate - 1; interestPerMonth = (float) (interestPerDay * principal * currentDate); System.out.println("IPM = " + interestPerMonth); principal += interestPerMonth; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositAccount.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositAccount.java index e8c1d54d9..bbf1a8142 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositAccount.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/FixedDepositAccount.java @@ -499,7 +499,9 @@ public class FixedDepositAccount extends SavingsAccount { public void postPreMaturityInterest(final LocalDate accountCloseDate, final boolean isPreMatureClosure) { Money interestPostedToDate = totalInterestPosted(); - final Money interestOnMaturity = calculatePreMatureInterest(accountCloseDate, retreiveOrderedNonInterestPostingTransactions(), isPreMatureClosure); + // calculate interest before one day of closure date + final LocalDate interestCalculatedToDate = accountCloseDate.minusDays(1); + final Money interestOnMaturity = calculatePreMatureInterest(interestCalculatedToDate, retreiveOrderedNonInterestPostingTransactions(), isPreMatureClosure); boolean recalucateDailyBalance = false; // post remaining interest diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/RecurringDepositAccount.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/RecurringDepositAccount.java index df4a80f7a..2fc954fd4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/RecurringDepositAccount.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/RecurringDepositAccount.java @@ -600,7 +600,9 @@ public class RecurringDepositAccount extends SavingsAccount { public void postPreMaturityInterest(final LocalDate accountCloseDate, final boolean isPreMatureClosure) { final Money interestPostedToDate = totalInterestPosted(); - final Money interestOnMaturity = calculatePreMatureInterest(accountCloseDate, retreiveOrderedNonInterestPostingTransactions(), isPreMatureClosure); + // calculate interest before one day of closure date + final LocalDate interestCalculatedToDate = accountCloseDate.minusDays(1); + final Money interestOnMaturity = calculatePreMatureInterest(interestCalculatedToDate, retreiveOrderedNonInterestPostingTransactions(), isPreMatureClosure); boolean recalucateDailyBalance = false; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/DepositAccountPreMatureCalculationPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/DepositAccountPreMatureCalculationPlatformServiceImpl.java index f5b5955b6..181da73ea 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/DepositAccountPreMatureCalculationPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/DepositAccountPreMatureCalculationPlatformServiceImpl.java @@ -71,17 +71,19 @@ public class DepositAccountPreMatureCalculationPlatformServiceImpl implements De account.clientId(), DepositAccountType.SAVINGS_DEPOSIT); final JsonElement element = this.fromJsonHelper.parse(query.json()); final LocalDate preMaturityDate = this.fromJsonHelper.extractLocalDateNamed(closedOnDateParamName, element); + // calculate interest before one day of closure date + final LocalDate interestCalculatedToDate = preMaturityDate.minusDays(1); final boolean isPreMatureClosure = true; if (depositAccountType.isFixedDeposit()) { final FixedDepositAccount fd = (FixedDepositAccount) account; accountData = FixedDepositAccountData.preClosureDetails(account.getId(), - fd.calculatePreMatureAmount(preMaturityDate, isPreMatureClosure), onAccountClosureOptions, paymentTypeOptions, + fd.calculatePreMatureAmount(interestCalculatedToDate, isPreMatureClosure), onAccountClosureOptions, paymentTypeOptions, savingsAccountDatas); } else if (depositAccountType.isRecurringDeposit()) { final RecurringDepositAccount rd = (RecurringDepositAccount) account; accountData = RecurringDepositAccountData.preClosureDetails(account.getId(), - rd.calculatePreMatureAmount(preMaturityDate, isPreMatureClosure), onAccountClosureOptions, paymentTypeOptions, + rd.calculatePreMatureAmount(interestCalculatedToDate, isPreMatureClosure), onAccountClosureOptions, paymentTypeOptions, savingsAccountDatas); }