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