package com.fitbank.installment;
import java.math.BigDecimal;
import java.util.List;
import com.fitbank.common.QuotaBean;
import com.fitbank.common.helper.CalculationBase;
import com.fitbank.common.helper.Constant;
import com.fitbank.fin.helper.FinancialHelper;
import com.fitbank.hb.persistence.gene.Tcurrencyid;
/**
* Clase que se encarga de ajustar el valor de una cuota fija, con capitalizacion diaria.
* @author Fitbank
* @version 2.0
*/
public class AdjustFixedInstallmentCapitalize {
/**
* Base de calculo que se aplicado a la cuota.
*/
private CalculationBase base ;
/**
* Tasa total del credito incluye comisiones.
*/
private BigDecimal rate ;
/**
* Factor acumulativo utilizado en calculo de cuotas en aproximaciones sucesivas.
*/
private BigDecimal totalfactor = BigDecimal.ZERO;
/**
* Ajusta el valor de la cuota fija, si el valor de la ultima cuota es mayor a la cuota fija.
* @param pQuotaTable
* @return
* @throws Exception
*/
public BigDecimal calculate(InstallmentTable pQuotaTable) throws Exception{
BigDecimal quotavalue = pQuotaTable.getFixquota();
rate = pQuotaTable.getTotalrate().divide(new BigDecimal(100),6,BigDecimal.ROUND_HALF_UP);
base = pQuotaTable.getCalculationBase();
Tcurrencyid tcurrencyid = FinancialHelper.getInstance().getTcurrencyid(pQuotaTable.getCurrency());
this.fillFactor(pQuotaTable.getQuotasBean());
quotavalue = pQuotaTable.getAmount().divide(totalfactor,tcurrencyid.getNumerodecimales(),BigDecimal.ROUND_HALF_UP);
return quotavalue;
}
/**
* Crea una lista de cuotas no pagadas y los factores que sumados me permiten hallar el valor presente de una anualidad que no toma en
* consideraci�n per�odos de inter�s deudor..
* @param tquotas Lista de cuotas original.
* @throws Exception
*/
private void fillFactor(List lQuotaBean) throws Exception{
/* = 1/(1+TEA)^(DiasdesDeInicioPrestamoHastaFvenCuota/360) */
rate = rate.add(Constant.BD_ONE);
double days = 0.0;
for(QuotaBean quota: lQuotaBean){
days = days + quota.getNumerodiasprovision();
double factor = Math.pow(rate.doubleValue(),(days/((double)base.getYearBase())));
factor = 1 / factor;
totalfactor = totalfactor.add(BigDecimal.valueOf(factor)) ;
}
totalfactor = totalfactor.divide(BigDecimal.ONE,4,BigDecimal.ROUND_HALF_UP);
}
}