/**
* @Project: hehenian-biz-service
* @Package com.hehenian.biz.common.settle
* @Title: MIFPSettleCalculator.java
* @Description: TODO
* @author: liuzgmf
* @date 2015年1月6日 上午11:15:33
* @Copyright: HEHENIAN Co.,Ltd. All rights reserved.
* @version V1.0
*/
package com.hehenian.biz.common.settle;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.time.DateUtils;
import com.hehenian.biz.common.system.dataobject.SettDetailDo;
import com.hehenian.biz.common.util.CalculateUtils;
/**
*
* @author: liuzgmf
* @date 2015年1月6日 上午11:15:33
*/
public class MIFPSettleCalculator extends SettleCalculator {
@Override
public List<SettDetailDo> calSettDetail(Double loanAmount, Integer loanPeriod, Double annualRate,Date startDate){
List<SettDetailDo> settDetailDoList = new ArrayList<SettDetailDo>();
for (int i = 1; i <= loanPeriod.intValue(); i++) {
SettDetailDo settDetailDo = new SettDetailDo();
settDetailDo.setPeriod(i);// 期数
Double principal = (i >= loanPeriod.intValue()) ? loanAmount : 0.00;
settDetailDo.setPrincipal(principal);// 本金
Double interest = calMonthRepayInterest(loanAmount, annualRate);// 月还利息
if (i == loanPeriod.intValue()) {
double totalRepayInterest = calTotalRepayInterest(loanAmount, annualRate, loanPeriod);
interest = CalculateUtils.sub(totalRepayInterest, CalculateUtils.mul(interest, (loanPeriod - 1)));
}
settDetailDo.setInterest(interest);// 利息
settDetailDo.setRemainingPrincipal(loanAmount);// 剩余本金
settDetailDo.setRepayDate(DateUtils.addMonths(startDate, i));// 还款日期
settDetailDoList.add(settDetailDo);
}
return settDetailDoList;
}
/**
* 计算月还利息金额
*
* @param remainingPrincipal
* 剩余本金
* @param annualRate
* 年利率
* @return
* @author: liuzgmf
* @date: 2014年9月24日上午9:33:45
*/
private Double calMonthRepayInterest(Double loanAmount, Double annualRate) {
return CalculateUtils.round(CalculateUtils.mul(loanAmount, getMonthRate(annualRate)), 2);
}
/**
* 计算总还利息金额
*
* @param remainingPrincipal
* 剩余本金
* @param annualRate
* 年利率
* @return
* @author: liuzgmf
* @date: 2014年9月24日上午9:33:45
*/
private Double calTotalRepayInterest(Double loanAmount, Double annualRate, Integer loanPeriod) {
return CalculateUtils.round(
CalculateUtils.mul(CalculateUtils.mul(loanAmount, getMonthRate(annualRate)), loanPeriod), 2);
}
}