package org.mifos.clientportfolio.newloan.domain; import java.math.BigDecimal; import org.joda.time.Days; import org.joda.time.Interval; import org.joda.time.LocalDate; import org.mifos.framework.util.helpers.Money; /** * (principal outstanding / 100 * periodic interest rate) * number of periods */ public class DecliningBalanceWithInterestCalculatedDailyFormula implements InterestCalculationForumula { @Override public Money calculate(Money principalOutstanding, Double aprInterestRate, LocalDate interestPeriodStartDate, LocalDate interestPeriodEndDate) { Interval installmentPeriod = null; if (interestPeriodStartDate.isAfter(interestPeriodEndDate)) { installmentPeriod = new Interval(interestPeriodEndDate.toDateMidnight().toDateTime(), interestPeriodStartDate.toDateMidnight().toDateTime()); } else { installmentPeriod = new Interval(interestPeriodStartDate.toDateMidnight().toDateTime(), interestPeriodEndDate.toDateMidnight().toDateTime()); } Integer installmentPeriodDuration = Days.daysIn(installmentPeriod).getDays(); BigDecimal periodicInterestRate = BigDecimal.valueOf(aprInterestRate / Double.valueOf("365.0")); BigDecimal interestDue = principalOutstanding.getAmount().divide(BigDecimal.valueOf(Long.valueOf("100"))).multiply(periodicInterestRate).multiply(BigDecimal.valueOf(installmentPeriodDuration.doubleValue())); // BigDecimal interestRateFractionForInstallmentPeriodDuration = periodicInterestRate.multiply(BigDecimal.valueOf(installmentPeriodDuration.doubleValue())); // // BigDecimal interestDue = principalOutstanding.getAmount().multiply(interestRateFractionForInstallmentPeriodDuration); return new Money(principalOutstanding.getCurrency(), interestDue); } }