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); } }