using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WCFPrendarioSeguros.Entidades.Objects; using WCFPrendarioSeguros.Entidades.Objects.Request; using WCFPrendarioSeguros.Entidades.Objects.Response; using Microsoft.VisualBasic; using Ultimus.Utilitarios; namespace WCFPrendarioSeguros.BL { public class CalculosSegurosCotizacionBLL { private static UltimusLogs log = new UltimusLogs("WCFPrendarioSeguros"); public static SegurosAutoResponse CalcularSeguroAuto(SeguroAutoRequest req) { SegurosAutoResponse resp = new SegurosAutoResponse(); switch (req.aseguradora) { case Enumeradores.Aseguradora.INS: resp = CalcularSeguroAutoINS(req); break; case Enumeradores.Aseguradora.MAPFRE: resp = CalcularSeguroAutoMAPFRE(req); break; } return resp; } private static SegurosAutoResponse CalcularSeguroAutoINS(SeguroAutoRequest req) { SegurosAutoResponse resp = new SegurosAutoResponse(); double dblValorActualPrestamo = 0; double dblMontoSeguroVehiculo = 0; double dblMontoPrimaMensual = 0; foreach (SubRubroSeguroINS item in req.INSubRubroSeguroINS) { switch (item.tipoVehiculo) { case Enumeradores.TipoVehiculo.VEHICULO_NUEVO: switch (item.esColaborador) { case true: case false: switch (item.moneda) { case Enumeradores.Moneda.DOLARES: dblValorActualPrestamo = ((item.valorVehiculo * item.tipoCambio) * (item.porcentajeValorActual / 100)) + item.montoValorActual; dblMontoPrimaMensual = Financial.Pmt((item.porcentajeInteresCredito / 100) / 12, 12, -dblValorActualPrestamo); dblMontoPrimaMensual = dblMontoPrimaMensual / item.tipoCambio; break; case Enumeradores.Moneda.COLONES: dblValorActualPrestamo = ((item.valorVehiculo) * (item.porcentajeValorActual / 100)) + item.montoValorActual; dblMontoPrimaMensual = Financial.Pmt((item.porcentajeInteresCredito / 100) / 12, 12, -dblValorActualPrestamo); break; } break; } break; case Enumeradores.TipoVehiculo.VEHICULO_USADO: switch (item.esColaborador) { case true: case false: dblMontoPrimaMensual = item.valorVehiculo * (item.porcentajeSeguro / 100); break; } break; } item.outPrimaTotalMensual = dblMontoPrimaMensual; dblMontoSeguroVehiculo += dblMontoPrimaMensual; } resp.OUTSubRubroSeguroINS = req.INSubRubroSeguroINS; resp.MontoSeguroAuto = dblMontoSeguroVehiculo; resp.error_code = "00"; resp.error_message = "EXITOSO"; return resp; } private static SegurosAutoResponse CalcularSeguroAutoMAPFRE(SeguroAutoRequest req) { SegurosAutoResponse resp = new SegurosAutoResponse(); double dblTOTALMontoPrimaNetaAnual = 0; double dblTOTALMontoDescuentoAnual = 0; double dblTOTALMontoIVAAnual = 0; double dblTOTALMontoRecargoPorPagoFraccionado = 0; double dblTOTALMontoPrimaTotalAnual = 0; double dblTOTALMontoPrimaTotalMensual = 0; foreach (SubRubroSeguroMAPFRE item in req.INSubRubroSeguroMAPFRE) { double dblMontoPrimaNetaAnual = 0; double dblMontoDescuentoAnual = 0; double dblMontoIVAAnual = 0; double dblMontoRecargoPorPagoFraccionado = 0; double dblMontoPrimaTotalAnual = 0; double dblMontoPrimaTotalMensual = 0; switch (item.inModoCalculo) { case Enumeradores.ModoCalculo.FIJO: dblMontoPrimaNetaAnual = item.inMontoValorActual; break; case Enumeradores.ModoCalculo.CALCULADO: double PorcMultiplicador = (item.inPorcentajeSeguro / 100) - ((item.inPorcentajeSeguro / 100) * (item.inPorcentajeValorActual / 100)); dblMontoPrimaNetaAnual = item.inValorVehiculo * PorcMultiplicador; break; } dblMontoDescuentoAnual = dblMontoPrimaNetaAnual - (dblMontoPrimaNetaAnual * (item.inPorcentajeDescuento / 100)); dblMontoIVAAnual = (dblMontoPrimaNetaAnual - dblMontoDescuentoAnual) * (item.inPorcentajeIVA / 100); dblMontoPrimaTotalAnual = (dblMontoPrimaNetaAnual - dblMontoDescuentoAnual) + dblMontoIVAAnual; dblMontoRecargoPorPagoFraccionado = dblMontoPrimaTotalAnual * (item.inPorcRecFraccionado / 100); dblMontoPrimaTotalMensual = (dblMontoPrimaTotalAnual + dblMontoRecargoPorPagoFraccionado) / 12; item.outPrimaNetaAnual = dblMontoPrimaNetaAnual; item.outDescuentoAnual = dblMontoDescuentoAnual; item.outIVAAnual = dblMontoIVAAnual; item.outPrimaTotalAnual = dblMontoPrimaTotalAnual; item.outPrimaTotalMensual = dblMontoPrimaTotalMensual; item.outRecargoPagoFraccionado = dblMontoRecargoPorPagoFraccionado; dblTOTALMontoPrimaNetaAnual += dblMontoPrimaNetaAnual; dblTOTALMontoDescuentoAnual += dblMontoDescuentoAnual; dblTOTALMontoIVAAnual += dblMontoIVAAnual; dblTOTALMontoPrimaTotalAnual += dblMontoPrimaTotalAnual; dblTOTALMontoPrimaTotalMensual += dblMontoPrimaTotalMensual; dblTOTALMontoRecargoPorPagoFraccionado += dblMontoRecargoPorPagoFraccionado; } resp.OUTSubRubroSeguroMAPFRE = req.INSubRubroSeguroMAPFRE; resp.MontoPrimaNetaAnual = dblTOTALMontoPrimaNetaAnual; resp.MontoDescuentoAnual = dblTOTALMontoDescuentoAnual; resp.MontoIVAAnual = dblTOTALMontoIVAAnual; resp.MontoRecargoPagoFraccionadoAnual = dblTOTALMontoRecargoPorPagoFraccionado; resp.MontoSeguroAutoAnual = dblTOTALMontoPrimaTotalAnual; resp.MontoSeguroAuto = dblTOTALMontoPrimaTotalMensual; resp.error_code = "00"; resp.error_message = "EXITOSO"; return resp; } public static SegurosVidaResponse CalcularSeguroVida(SeguroVidaRequest req) { SegurosVidaResponse resp = resp = new SegurosVidaResponse(); double dblMontoSeguroVida = 0; if (req.aseguradora == Enumeradores.Aseguradora.INS) { //dblMontoSeguroVida = req.montoCredito * (req.porcentajeSeguro / 100); dblMontoSeguroVida = ((req.montoCredito / 1000) * req.porcentajeSeguro); log.Trace(string.Format("CalcularSeguroVida;INPUT:aseguradora={0},montoCredito={1},porcentajeSeguro={2};CALCULO:dblMontoSeguroVida={3}", req.aseguradora.ToString(), req.montoCredito, req.porcentajeSeguro, dblMontoSeguroVida)); } else if (req.aseguradora == Enumeradores.Aseguradora.DS) { double tmp = ((req.montoCredito / 1000) * req.porcentajeSeguro); double tmp2 = ((req.montoCredito / 1000) * req.porcentajeSeguro2); double tmp3 = ((req.UG / 1000) * req.porcentajeSeguro3); double anual = tmp + tmp2 + tmp3; double mensual = anual / 12; dblMontoSeguroVida = Math.Round(mensual, 2); log.Trace(string.Format("CalcularSeguroVida;INPUT:aseguradora={0},montoCredito={1},porcentajeSeguro={2},porcentajeSeguro2={3},porcentajeSeguro3={4},UG={5};CALCULO:tmp={6},tmp2={7},tmp3={8},anual={9},mensual={10},dblMontoSeguroVida={11}", req.aseguradora.ToString(), req.montoCredito, req.porcentajeSeguro, req.porcentajeSeguro2, req.porcentajeSeguro3, req.UG, tmp, tmp2, tmp3, anual, mensual, dblMontoSeguroVida)); } resp.MontoSeguroVida = dblMontoSeguroVida; resp.error_code = "00"; resp.error_message = "EXITOSO"; return resp; } public static SegurosDesempleoResponse CalcularSeguroDesempleo(SeguroDesempleoRequest req) { SegurosDesempleoResponse resp = resp = new SegurosDesempleoResponse(); double dblMontoSeguroDesempleo = 0; var CuotasinDesempleo = req.montoCuotaSinSeguro + req.montoSeguroVehiculo + req.montoSeguroVida; if (req.aseguradora == Enumeradores.Aseguradora.INS) { //dblMontoSeguroDesempleo = ((((req.montoCuotaSinSeguro + req.montoSeguroVehiculo) / 1000) * req.porcentajeSeguro) * (req.porcentajeSeguroDesempleoA) * (req.porcentajeSeguroDesempleoB)) / (1 - (req.porcentajeSeguro / 1000) * (req.porcentajeSeguroDesempleoB) * (req.porcentajeSeguroDesempleoA)); dblMontoSeguroDesempleo = (((((((((CuotasinDesempleo / 1000) * req.porcentajeSeguro)) + (((CuotasinDesempleo / 1000) * req.porcentajeSeguro) * req.porcentajeSeguroDesempleoB))) + CuotasinDesempleo) / 1000) * req.porcentajeSeguro) * req.porcentajeSeguroDesempleoA) + (((((((((CuotasinDesempleo / 1000) * req.porcentajeSeguro)) + (((CuotasinDesempleo / 1000) * req.porcentajeSeguro) * req.porcentajeSeguroDesempleoB))) + CuotasinDesempleo) / 1000) * req.porcentajeSeguro)); log.Trace(string.Format("CalcularSeguroDesempleo;INPUT:aseguradora={0},montoCuotaSinSeguro={1},montoSeguroVehiculo={2},montoSeguroVida={3},porcentajeSeguro={4},porcentajeSeguroDesempleoA={5},porcentajeSeguroDesempleoB={6};CALCULO:dblMontoSeguroDesempleo={7}", req.aseguradora.ToString(), req.montoCuotaSinSeguro, req.montoSeguroVehiculo, req.montoSeguroVida, req.porcentajeSeguro, req.porcentajeSeguroDesempleoA, req.porcentajeSeguroDesempleoB, dblMontoSeguroDesempleo)); } else if (req.aseguradora == Enumeradores.Aseguradora.DS) { double tmp = Math.Round(CuotasinDesempleo / (1 - (req.porcentajeSeguro / 100)), 2); double mensual = Math.Round(tmp * (req.porcentajeSeguro / 100), 2); double anual = Math.Round(mensual * 12, 2); dblMontoSeguroDesempleo = mensual; log.Trace(string.Format("CalcularSeguroDesempleo;INPUT:aseguradora={0},montoCuotaSinSeguro={1},montoSeguroVehiculo={2},montoSeguroVida={3},porcentajeSeguro={4};CALCULO:tmp={5},mensual={6},anual={7},dblMontoSeguroDesempleo={8}", req.aseguradora.ToString(), req.montoCuotaSinSeguro, req.montoSeguroVehiculo, req.montoSeguroVida, req.porcentajeSeguro, tmp, mensual, anual, dblMontoSeguroDesempleo)); } resp.MontoSeguroDesempleo = dblMontoSeguroDesempleo; resp.error_code = "00"; resp.error_message = "EXITOSO"; return resp; } } }