package org.mifos.clientportfolio.newloan.domain;
import org.mifos.accounts.fees.business.FeeBO;
import org.mifos.accounts.fees.business.FeeFormulaEntity;
import org.mifos.accounts.fees.business.RateFeeBO;
import org.mifos.accounts.fees.persistence.FeeDao;
import org.mifos.accounts.fees.util.helpers.FeeFormula;
import org.mifos.framework.util.helpers.Money;
public class RateInstalmentFeeCalculator implements InstallmentFeeCalculator {
private final FeeDao feeDao;
public RateInstalmentFeeCalculator(FeeDao feeDao) {
this.feeDao = feeDao;
}
@Override
public Money calculate(Double feeRate, Money loanAmount, Money loanInterest, FeeBO fee) {
// make sure that we are not using a proxied object when we cast
RateFeeBO rateFeeBO = (RateFeeBO) feeDao.initializeAndUnproxy(fee);
FeeFormulaEntity formula = rateFeeBO.getFeeFormula();
Money amountToCalculateOn = new Money(loanAmount.getCurrency(), "1.0");
if (formula.getId().equals(FeeFormula.AMOUNT.getValue())) {
amountToCalculateOn = loanAmount;
} else if (formula.getId().equals(FeeFormula.AMOUNT_AND_INTEREST.getValue())) {
amountToCalculateOn = loanAmount.add(loanInterest);
} else if (formula.getId().equals(FeeFormula.INTEREST.getValue())) {
amountToCalculateOn = loanInterest;
}
return amountToCalculateOn.multiply(feeRate).divide(100);
}
}