Exemplo n.º 1
0
        /// <summary>
        /// Metodo que permite cargar el histograma
        /// </summary>
        private void CargarHistograma()
        {
            //creo los intervalos del histograma
            _intervalos = new Intervalo[_cantidadIntervalos];

            var rango             = _lista.Max(aleatorio => aleatorio.NumAleatorio) - _lista.Min(aleatorio => aleatorio.NumAleatorio);
            var amplitudIntervalo = rango / _cantidadIntervalos;

            //A partir de la cantidad de cantidadIntervalos, calculamos sus limites
            //Intervalo [a,b)
            for (var i = 0; i < _cantidadIntervalos; i++)
            {
                //para tp1

                /*  if (i == 0)
                 *    intervalos[i] = new Intervalo(0, ((double) 1 / cantidadIntervalos) * (i + 1));
                 * else
                 * {
                 *    intervalos[i] = new Intervalo(intervalos[i - 1].LimiteSuperior,
                 *        ((double) 1 / cantidadIntervalos) * (i + 1));
                 * }*/


                if (i == 0)
                {
                    _intervalos[i] = new Intervalo(_lista.Min(aleatorio => aleatorio.NumAleatorio),
                                                   _lista.Min(aleatorio => aleatorio.NumAleatorio) + amplitudIntervalo);
                }
                else
                {
                    _intervalos[i] = new Intervalo(_intervalos[i - 1].LimiteSuperior,
                                                   _intervalos[i - 1].LimiteSuperior + amplitudIntervalo);
                }
            }

            //ahora recorremos la lista para calcular las frecuencias observadas.
            foreach (var t1 in _lista)
            {
                foreach (var t in _intervalos)
                {
                    if (t1.NumAleatorio >= t.LimiteInferior &&
                        t1.NumAleatorio < t.LimiteSuperior)
                    {
                        t.CantidadObservaciones++;
                    }
                }
            }

            //limpiamos el chart y preparamos el nuevo histograma
            List <int>
            listaEnteros =
                new List <int>();    //lista para acumular las cantidades de cada intervalo y luego poder obtener el MAX()


            //creo la serie y la seteo
            histogramaGenerado.Series.Clear();
            histogramaGenerado.Series.Add("Frecuecias Observadas");
            histogramaGenerado.Series["Frecuecias Observadas"].ChartType = SeriesChartType.Column;
            histogramaGenerado.Series["Frecuecias Observadas"].Color     = Color.DarkGray;

            //cargamos el histograma con la cantidad de observaciones de cada intervalo
            for (int i = 0; i < _cantidadIntervalos; i++)
            {
                listaEnteros.Add(_intervalos[i].CantidadObservaciones);

                //Agrego el punto a la serie
                histogramaGenerado.Series[0].Points.Add(_intervalos[i].CantidadObservaciones);

                //Agrego los labels de de los intervalos
                histogramaGenerado.Series[0].Points[i].AxisLabel =
                    "[" + TruncateFunction(_intervalos[i].LimiteInferior, 4)
                    + " / " +
                    TruncateFunction(_intervalos[i].LimiteSuperior, 4) + ")";

                //Pongo vertical los label
                histogramaGenerado.ChartAreas[0].AxisX.LabelStyle.Angle = 90;

                histogramaGenerado.Series[0].IsValueShownAsLabel  = true;
                histogramaGenerado.Series[0].LegendText           = _intervalos[i].CantidadObservaciones.ToString();
                histogramaGenerado.Series[0].LabelAngle           = 90;
                histogramaGenerado.Series[0].Points[i].LabelAngle = 90;
            }

            //Obtenemos la cantidad total de observaciones
            var cantidadObservaciones = double.Parse(_lista.Count.ToString());

            histogramaGenerado.ChartAreas[0].AxisY.Maximum = listaEnteros.Max();

            //Obtenemos la frecuencia esperada de la serie

            //es del tp1
            if (_distribucion == null)
            {
                var freEsperada = (double)cantidadObservaciones / (double)_cantidadIntervalos;
                lblFrecuenciaEsperada.Text = freEsperada.ToString();
            }


            //llamada al metodo para cargar la tabla de frecuencias
            CargarTabla();
        }
Exemplo n.º 2
0
 /// <summary>
 /// Metodo que calcula la frecuencia esperada en un intervalo
 /// </summary>
 /// <param name="intervalo"></param>
 /// <param name="tamanioMuestra"></param>
 /// <param name="cantidadIntervalos"></param>
 /// <returns></returns>
 public override double CalcularFrecuenciaEsperadaEnIntervalo(Intervalo intervalo, int tamanioMuestra, int cantidadIntervalos = 0)
 {
     return(tamanioMuestra / cantidadIntervalos);
 }
        public IActionResult GetSimulacaoNaoParticipante([FromBody] DadosSimulacaoNaoParticipante dados)
        {
            try
            {
                var data = DateTime.Now.PrimeiroDiaDoMes();

                var dataAposentadoriaPorIdade  = dados.DataNascimento.AddYears(dados.IdadeAposentadoria);
                var dataAposentaadoriaPorPlano = DateTime.Now.AddYears(10);

                var dataAposentadoria = DateTime.Compare(dataAposentadoriaPorIdade, dataAposentaadoriaPorPlano) > 0 ? dataAposentadoriaPorIdade : dataAposentaadoriaPorPlano;

                var contribFacultativa = dados.ContribFacultativa.HasValue ? dados.ContribFacultativa.Value : 0;

                var contribBruta = dados.ContribBasica * 2 + contribFacultativa;
                var taxaMensal   = BuscarTaxaMensal(dados.TaxaJuros);

                var valorFuturo = dados.AporteInicial;

                while (data <= dataAposentadoria)
                {
                    var contribMensal = contribBruta;

                    if (data.Month == 12)
                    {
                        contribMensal *= 2;
                    }

                    valorFuturo = (valorFuturo + (valorFuturo * taxaMensal / 100)) + contribMensal;

                    data = data.AddMonths(1);
                }

                // Valor do saque
                decimal valorSaque = valorFuturo / 100 * dados.Saque;

                // Dependentes
                var idadeDependente           = 0;
                var idadeDependenteTemporario = 0;
                var dependenteProxy           = new DependenteProxy();

                // Dependente vitalício
                DateTime?dataNascConjugue      = dados.NascimentoConjugue;
                DateTime?dataNascFilhoInvalido = dados.NascimentoFilhoInvalido;
                DateTime?dataNascDependente;

                if (dataNascConjugue != null && dataNascFilhoInvalido != null)
                {
                    dataNascDependente = dataNascConjugue > dataNascFilhoInvalido ? dataNascConjugue : dataNascFilhoInvalido;
                }
                else if (dataNascConjugue != null && dataNascFilhoInvalido == null)
                {
                    dataNascDependente = dataNascConjugue;
                }
                else
                {
                    dataNascDependente = dataNascFilhoInvalido == null ? null : dataNascFilhoInvalido;
                }

                /// var dependenteVitalicio = dependenteProxy.BuscarDependentePorContratoTrabalhoDtValidadeTipo(SqContratoTrabalho, "V", dataAposentadoria);

                if (dataNascDependente != null)
                {
                    // dataNascDependente = Convert.ToDateTime(dataNascDependente);
                    idadeDependente = new Intervalo(dataAposentadoria, dataNascDependente.Value).Anos;
                }

                // Dependente temporário
                if (dados.NascimentoFilhoMaisNovo.HasValue)
                {
                    idadeDependenteTemporario = new Intervalo(dataAposentadoria, dados.NascimentoFilhoMaisNovo.Value).Anos;
                }

                // Fator atuarial
                var fatorAtuarialProxy = new FatorAtuarialMortalidadeProxy();
                var axiPar             = fatorAtuarialProxy.BuscarPorIdadeSexo(dados.IdadeAposentadoria, dados.Sexo).VL_FATOR_A.Value;

                var axiDep = 0M;
                var axyi   = 0M;
                if (idadeDependente > 0)
                {
                    axiDep = fatorAtuarialProxy.BuscarPorIdadeSexo(idadeDependente, dados.SexoFilhoMaisNovo).VL_FATOR_A.Value;
                    var fator = fatorAtuarialProxy.BuscarPorIdadePartIdadeDepSexo(dados.IdadeAposentadoria, idadeDependente, dados.SexoFilhoMaisNovo);
                    axyi = fator.VL_FATOR_A.Value;
                }

                var prazoDepentendeTemporario = 20 - idadeDependenteTemporario;
                if (prazoDepentendeTemporario < 0)
                {
                    prazoDepentendeTemporario = 0;
                }
                var xn = dados.IdadeAposentadoria + prazoDepentendeTemporario;

                var fatorDxn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("lxdx", xn, dados.Sexo).VL_FATOR_B.Value;
                var fatorDx  = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("lxdx", dados.IdadeAposentadoria, dados.Sexo).VL_FATOR_B.Value;

                var fatorAxn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("ax", xn, dados.Sexo).VL_FATOR_A.Value;

                decimal fatorAn = 0;
                if (prazoDepentendeTemporario > 0 && dados.SexoFilhoInvalido != null)
                {
                    fatorAn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("an", prazoDepentendeTemporario, dados.SexoFilhoInvalido).VL_FATOR_A.Value;
                }

                var apuracaoAxn = axiPar - (fatorDxn / fatorDx) * fatorAxn;

                var fatorAtuarialSemPensaoMorte = 13 * axiPar;
                var fatorAtuarialPensaoMorte    = 13 * (axiPar + Math.Max(fatorAn - apuracaoAxn, axiDep - axyi));

                // Renda por prazos indeterminados
                var rendaPrazoIndeterminadoPensaoMorte    = (valorFuturo - valorSaque) / fatorAtuarialPensaoMorte;
                var rendaPrazoIndeterminadoSemPensaoMorte = (valorFuturo - valorSaque) / fatorAtuarialSemPensaoMorte;

                // Renda por prazo certo
                var listaPrazos = new List <KeyValuePair <int, decimal> >();

                for (int prazo = 15; prazo <= 25; prazo++)
                {
                    decimal valor = (valorFuturo - valorSaque) / (prazo * 13);
                    listaPrazos.Add(new KeyValuePair <int, decimal>(prazo, valor));
                }

                // Renda por percentual do saldo de contas
                var listaSaldoPercentuais = new List <KeyValuePair <string, decimal> >();

                for (decimal percentual = 0.5M; percentual <= 2.0M; percentual += 0.5M)
                {
                    decimal valor = (valorFuturo - valorSaque) * percentual / 100;
                    listaSaldoPercentuais.Add(new KeyValuePair <string, decimal>(percentual.ToString("N1").Replace(".", ","), valor));
                }

                return(Json(new
                {
                    nome = dados.Nome,
                    email = dados.Email,
                    valorFuturo,
                    dataAposentadoria,
                    valorSaque,
                    idadeDependente,
                    fatorAtuarialPensaoMorte,
                    fatorAtuarialSemPensaoMorte,
                    rendaPrazoIndeterminadoPensaoMorte,
                    rendaPrazoIndeterminadoSemPensaoMorte,
                    listaPrazos,
                    listaSaldoPercentuais
                }));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        public IActionResult GetSimulacao(int sqPlanoPrevidencial, [FromBody] dynamic dados)
        {
            try
            {
                //TODO: Jogar pra proxy

                var sqPlano = 3;

                var dadosPessoais      = new DadosPessoaisProxy().BuscarPorCdPessoa(CdPessoa).First();
                int idadeAposentadoria = Convert.ToInt32(dados.idadeAposentadoria);
                Add("Idade Aposentadoria", idadeAposentadoria.ToString());

                decimal contribBasica = Convert.ToDecimal(dados.contribBasica, new CultureInfo("pt-BR"));
                Add("Contribuição Básica", contribBasica.ToString());

                decimal contribFacultativa = Convert.ToDecimal(dados.contribFacultativa, new CultureInfo("pt-BR"));
                Add("Contribuição Facultativa", contribFacultativa.ToString());

                decimal saldo = new SaldoProxy().BuscarSaldoCD(DateTime.Now, SqContratoTrabalho, sqPlano, CdPessoa).Total;
                Add($"Saldo em {DateTime.Now:dd/MM/yyyy}", saldo.ToString());

                var taxaJuros = new FatorValidadeProxy().BuscarUltimo().VL_TX_JUROS;
                Add($"Taxa de Juros", taxaJuros.ToString());

                var dataAtual      = DateTime.Now;//.PrimeiroDiaDoMes();
                var dataNascimento = new DadosPessoaisProxy().BuscarPorCdPessoa(CdPessoa).First().DT_NASCIMENTO.Value;

                var dataAposentadoria = dataNascimento.AddYears(idadeAposentadoria);
                Add($"Data de Aposentadoria por Idade", dataAposentadoria.ToString("dd/MM/yyyy"));

                var plano         = new PlanoVinculadoProxy().BuscarPorContratoTrabalhoPlano(SqContratoTrabalho, sqPlano);
                var dataInscricao = plano.DT_INSC_ANTERIOR ?? plano.DT_INSC_PLANO;
                Add($"Data de Inscrição", dataInscricao.ToString("dd/MM/yyyy"));

                var dataAposentadoria2 = dataInscricao.AddYears(10);
                Add($"Data de Aposentadoria por Tempo de Plano", dataAposentadoria2.ToString("dd/MM/yyyy"));

                dataAposentadoria = DateTime.Compare(dataAposentadoria, dataAposentadoria2) > 0 ? dataAposentadoria : dataAposentadoria2;
                Add($"Data de Aposentadoria Real", dataAposentadoria.ToString("dd/MM/yyyy"));

                var data         = DateTime.Compare(dataAtual, dataAposentadoria) > 0 ? dataAposentadoria : dataAtual;
                var contribBruta = contribBasica * 2 + contribFacultativa;
                Add($"Contribuição Bruta", $"{contribBasica} * 2 + {contribFacultativa} = {contribBruta}");

                var taxaMensal = BuscarTaxaMensal(taxaJuros);
                Add($"Taxa Mensal", taxaMensal.ToString());

                var valorFuturo = saldo;

                while (data < dataAposentadoria)
                {
                    var decimoTerceiro = data.Month == 12;
                    var contribMensal  = contribBruta;

                    if (decimoTerceiro)
                    {
                        contribMensal *= 2;
                    }

                    var valorFuturoAtual = valorFuturo;
                    valorFuturo = (valorFuturo + (valorFuturo * taxaMensal / 100)) + contribMensal;

                    Add($"Saldo em {data:dd/MM/yyyy}", $"({valorFuturoAtual} + ({valorFuturoAtual} * {taxaMensal} / 100)) + {contribMensal} = {valorFuturo}");

                    data = data.AddMonths(1);
                }

                // Valor do saque
                var valorSaque = valorFuturo / 100 * (decimal)dados.saque;
                Add($"Valor Saque", $"{valorFuturo} / 100 * {(decimal)dados.saque} = {valorSaque}");

                // Dependentes
                var idadeDependente           = 0;
                var sexoDependente            = "";
                var idadeDependenteTemporario = 0;
                var dependenteProxy           = new DependenteProxy();

                // Dependente vitalício
                var dependenteVitalicio = dependenteProxy.BuscarDependentePorContratoTrabalhoDtValidadeTipo(SqContratoTrabalho, "V", dataAposentadoria);

                if (dependenteVitalicio != null)
                {
                    var dadosDependente = new DadosPessoaisProxy().BuscarDependentePorCdPessoa(dependenteVitalicio.CD_PESSOA_DEP);

                    if (dadosDependente == null)
                    {
                        throw new Exception("Não existem dados cadastrados para um de seus dependentes. Por favor, entre em contato com a Faceb.");
                    }

                    if (string.IsNullOrEmpty(dadosDependente.IR_SEXO))
                    {
                        throw new Exception("Existe um dependente cadastrado que não possui o campo \"Sexo\" preenchido. Por favor, entre em contato com a Faceb.");
                    }

                    sexoDependente = dadosDependente.IR_SEXO;

                    var dataNascDependente = dependenteVitalicio.DT_NASCIMENTO;
                    idadeDependente = new Intervalo(dataAposentadoria, dataNascDependente).Anos;
                }

                // Dependente temporário
                var dependenteTemporario = dependenteProxy.BuscarDependentePorContratoTrabalhoDtValidadeTipo(SqContratoTrabalho, "T", dataAposentadoria);

                if (dependenteTemporario != null)
                {
                    var dadosDependente = new DadosPessoaisProxy().BuscarDependentePorCdPessoa(dependenteTemporario.CD_PESSOA_DEP);

                    if (dadosDependente == null)
                    {
                        throw new Exception("Não existem dados cadastrados para um de seus dependentes. Por favor, entre em contato com a Faceb.");
                    }

                    if (string.IsNullOrEmpty(dadosDependente.IR_SEXO))
                    {
                        throw new Exception("Existe um dependente cadastrado que não possui o campo \"Sexo\" preenchido. Por favor, entre em contato com a Faceb.");
                    }

                    sexoDependente = dadosDependente.IR_SEXO;

                    var dataNascDependenteTemporario = dependenteTemporario.DT_NASCIMENTO;
                    idadeDependenteTemporario = new Intervalo(dataAposentadoria, dataNascDependenteTemporario).Anos;
                }

                // Fator atuarial
                var fatorAtuarialProxy = new FatorAtuarialMortalidadeProxy();
                var axiPar             = fatorAtuarialProxy.BuscarPorIdadeSexo(idadeAposentadoria, dadosPessoais.IR_SEXO).VL_FATOR_A.Value;
                Add("Fator AXI", axiPar.ToString());

                var axiDep = 0M;
                var axyi   = 0M;
                if (idadeDependente > 0)
                {
                    axiDep = fatorAtuarialProxy.BuscarPorIdadeSexo(idadeDependente, sexoDependente).VL_FATOR_A.Value;
                    var fator = fatorAtuarialProxy.BuscarPorIdadePartIdadeDepSexo(idadeAposentadoria, idadeDependente, sexoDependente);
                    axyi = fator.VL_FATOR_A.Value;
                    Add("Fator AXYI", axyi.ToString());
                }

                var prazoDepentendeTemporario = 20 - idadeDependenteTemporario;
                var xn = idadeAposentadoria + prazoDepentendeTemporario;

                var fatorDxn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("lxdx", xn, dadosPessoais.IR_SEXO).VL_FATOR_B.Value;
                var fatorDx  = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("lxdx", idadeAposentadoria, dadosPessoais.IR_SEXO).VL_FATOR_B.Value;
                var fatorAxn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("ax", xn, dadosPessoais.IR_SEXO).VL_FATOR_A.Value;
                Add("Fator Dxn", fatorDxn.ToString());
                Add("Fator Dx", fatorDx.ToString());
                Add("Fator Axn", fatorAxn.ToString());

                decimal fatorAn = 0;
                if (prazoDepentendeTemporario > 0 && !string.IsNullOrEmpty(sexoDependente))
                {
                    fatorAn = fatorAtuarialProxy.BuscarPorTabelaIdadeSexo("an", prazoDepentendeTemporario, sexoDependente).VL_FATOR_A.Value;
                    Add("Fator Axn", fatorAn.ToString());
                }

                var apuracaoAxn = axiPar - (fatorDxn / fatorDx) * fatorAxn;
                Add("Apuração Axn", $"{axiPar} - ({fatorDxn} / {fatorDx}) * {fatorAxn} = {apuracaoAxn}");

                var fatorAtuarialSemPensaoMorte = 13 * axiPar;
                var fatorAtuarialPensaoMorte    = 13 * (axiPar + Math.Max(fatorAn - apuracaoAxn, axiDep - axyi));
                Add("Fator Atuarial Sem Pensão de Morte", $"13 * {axiPar} = {fatorAtuarialSemPensaoMorte}");
                Add("Fator Atuarial Com Pensão de Morte", $"13 * ({axiPar} + {Math.Max(fatorAn - apuracaoAxn, axiDep - axyi)} = {fatorAtuarialPensaoMorte}");

                // Renda por prazos indeterminados
                var rendaPrazoIndeterminadoSemPensaoMorte = (valorFuturo - valorSaque) / fatorAtuarialSemPensaoMorte;
                var rendaPrazoIndeterminadoPensaoMorte    = (valorFuturo - valorSaque) / fatorAtuarialPensaoMorte;
                Add("Renda Prazo Indeterminado Sem Pensão de Morte", $"({valorFuturo} - {valorSaque}) / {fatorAtuarialSemPensaoMorte} = {rendaPrazoIndeterminadoSemPensaoMorte}");
                Add("Renda Prazo Indeterminado Com Pensão de Morte", $"({valorFuturo} - {valorSaque}) / {fatorAtuarialPensaoMorte} = {rendaPrazoIndeterminadoPensaoMorte}");

                // Renda por prazo certo
                var listaPrazos = new List <KeyValuePair <int, decimal> >();

                for (int prazo = 15; prazo <= 25; prazo++)
                {
                    decimal valor = (valorFuturo - valorSaque) / (prazo * 13);
                    listaPrazos.Add(new KeyValuePair <int, decimal>(prazo, valor));
                }

                // Renda por percentual do saldo de contas
                var listaSaldoPercentuais = new List <KeyValuePair <string, decimal> >();

                for (decimal percentual = 0.5M; percentual <= 2.0M; percentual += 0.5M)
                {
                    decimal valor = (valorFuturo - valorSaque) * percentual / 100;
                    listaSaldoPercentuais.Add(new KeyValuePair <string, decimal>(percentual.ToString("N1").Replace(".", ","), valor));
                }

                return(Json(new
                {
                    valorFuturo,
                    dataAposentadoria,
                    valorSaque,
                    idadeDependente,
                    fatorAtuarialPensaoMorte,
                    fatorAtuarialSemPensaoMorte,
                    rendaPrazoIndeterminadoPensaoMorte,
                    rendaPrazoIndeterminadoSemPensaoMorte,
                    listaPrazos,
                    listaSaldoPercentuais,
                    memoria = MemoriaCalculo
                }));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        private void btnProcesar_Click(object sender, EventArgs e)
        {
            datos.Clear();
            intervalos.Clear();

            string mensajeError = "";

            if (validarTab1(ref mensajeError))
            {
                if (cargarDatos())
                {
                    if (datos.Count < 200)
                    {
                        MessageBox.Show("Debe ingresar una muestra mayor a 200 números. Datos encontrados: " + datos.Count());

                        return;
                    }

                    double min = datos.Min();
                    double max = datos.Max() + 0.001d;

                    int numeroDeIntervalos = int.Parse(txtCantIntervalos.Text);

                    double paso = (max - min) / (double)numeroDeIntervalos;

                    paso = Math.Round(paso, CANTIDAD_DECIMALES);

                    double limiteInferior = min;
                    double limiteSuperior = min + paso;

                    Intervalo intervalo = null;

                    for (int i = 0; i < numeroDeIntervalos; i++)
                    {
                        intervalo = new Intervalo();

                        intervalo.numero         = i + 1;
                        intervalo.limiteInferior = Math.Round(limiteInferior, CANTIDAD_DECIMALES);
                        intervalo.limiteSuperior = Math.Round(limiteSuperior, CANTIDAD_DECIMALES);

                        intervalos.Add(intervalo);

                        limiteInferior = limiteSuperior;
                        limiteSuperior = limiteInferior + paso;
                    }

                    for (int i = 0; i < datos.Count; i++)
                    {
                        for (int j = 0; j < intervalos.Count; j++)
                        {
                            if (intervalos[j].limiteSuperior > datos[i])
                            {
                                intervalos[j].frecuenciaObservada++;
                                break;
                            }
                        }
                    }

                    cargarGrillaTab1();

                    graficar(false);

                    lblTamanioMuestra.Text = "Tamaño de la muestra: " + datos.Count().ToString();
                    lblPaso.Text           = "Paso: " + paso.ToString("0.0000");
                    lblPaso.Visible        = true;

                    btnVerDistribucion.Enabled = true;
                    btnComparar.Enabled        = true;
                    grpInfoMuestra.Visible     = true;

                    reiniciarTab2();
                }
            }
            else
            {
                MessageBox.Show(mensajeError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
Exemplo n.º 6
0
 public abstract double CalcularFrecuenciaEsperadaEnIntervalo(Intervalo intervalo, int tamanioMuestra, int cantidadIntervalos = 0);
        public IActionResult GetSimulacao()
        {
            try
            {
                var sqPlano = 1;

                int     idadeParticipante = CalcularIdadeParticipante();
                int     idadeMinima       = CalcularIdadeMinima(idadeParticipante);
                decimal SRC            = CalcularSRC(sqPlano);
                decimal inssHipotetico = CalcularINSSHipotetico(sqPlano);
                int     carencia       = CalcularCarencia(sqPlano);

                var valor1 = (SRC - inssHipotetico) * carencia / 15;
                var valor2 = (SRC * 0.25M) * carencia / 15;

                var valorSuplementacao        = Math.Max(valor1, valor2);
                var dataNascimento            = new DadosPessoaisProxy().BuscarPorCdPessoa(CdPessoa).First().DT_NASCIMENTO;
                var dataAposentadoriaPorIdade = dataNascimento.Value.AddYears(idadeMinima);

                var plano = new PlanoVinculadoProxy().BuscarPorContratoTrabalhoPlano(SqContratoTrabalho, sqPlano);
                var dataAposentadoriaPorPlano = plano.DT_INSC_PLANO.AddYears(15);

                var tempoServico = new TempoServicoProxy().BuscarPorCdPessoa(CdPessoa);

                var tempoTotal = new Intervalo(new CalculoAnosMesesDiasAlgoritmo2());

                foreach (var tempo in tempoServico)
                {
                    DateTime fim;

                    if (tempo.DT_TERM_ATIVIDADE.HasValue)
                    {
                        fim = tempo.DT_TERM_ATIVIDADE.Value;
                    }
                    else
                    {
                        fim = DateTime.Today;
                    }

                    var intervaloTrabalho = new Intervalo(fim, tempo.DT_INIC_ATIVIDADE.Value, new CalculoAnosMesesDiasAlgoritmo2());

                    tempoTotal.Adiciona(intervaloTrabalho);
                }

                var dadosPessoais = new DadosPessoaisProxy().BuscarPorCdPessoa(CdPessoa).First();
                var fatorSexo     = dadosPessoais.IR_SEXO == null || dadosPessoais.IR_SEXO == "M" ? 35 : 30;

                var dataAposentadoriaPorTempoTrabalho
                    = tempoTotal.Anos < fatorSexo
                    ? tempoServico.First().DT_INIC_ATIVIDADE.Value.AddYears(fatorSexo)
                    : tempoServico.First().DT_INIC_ATIVIDADE.Value.AddDays(tempoTotal.Dias);

                var listaDatas = new List <DateTime>
                {
                    dataAposentadoriaPorIdade,
                    dataAposentadoriaPorPlano,
                    dataAposentadoriaPorTempoTrabalho
                };

                var dataAposentadoria = listaDatas.Max(x => x);

                var dataReferencia = DateTime.Now;

                return(Json(new
                {
                    valorSuplementacao,
                    dataAposentadoria,
                    dataReferencia
                }));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }