decimal CalcularSRC(int sqPlano)
        {
            var salarioContrib = new SalarioContribuicaoProxy().BuscarUltimoPorContratoTrabalhoPlano(SqContratoTrabalho, sqPlano);
            var SRC            = salarioContrib.VL_BASE_FUNDACAO.Value;

            return(SRC);
        }
        decimal CalcularINSSHipotetico(int sqPlano)
        {
            var indiceProxy = new IndiceProxy();

            var dtFim = DateTime.Now.AddMonths(-1).DefinirDia(1);
            var dtIni = dtFim.AddMonths(-36);

            var indiceINPC = indiceProxy.BuscarPorCdIndicePeriodo("INPC", dtIni, dtFim);

            var fatores = new List <KeyValuePair <DateTime, decimal> >();

            var fatorAnterior = 1M;

            foreach (var indice in indiceINPC)
            {
                var fator = (fatorAnterior * (1 + indice.VL_INDICE.Value / 100)).Arredonda(6);
                fatores.Add(new KeyValuePair <DateTime, decimal>(indice.DT_INIC_VALIDADE, fator));
                fatorAnterior = fator;
            }

            var indiceTETOPREV     = indiceProxy.BuscarPorCdIndice("TETOPREV");
            var salarios           = new SalarioContribuicaoProxy().BuscarPorContratoTrabalhoPlanoPeriodo(SqContratoTrabalho, sqPlano, dtIni, dtFim);
            var salariosCorrigidos = new List <KeyValuePair <DateTime, decimal> >();

            foreach (var salario in salarios)
            {
                var dtReferencia = salario.DT_REFERENCIA;
                var teto         = indiceTETOPREV.FirstOrDefault(x => x.DT_INIC_VALIDADE <= dtReferencia);

                if (teto == null)
                {
                    throw new Exception($"Índice TETOPREV não encontrado para a referência {dtReferencia.ToString("dd/MM/yyyy")}");
                }

                if (!salario.VL_BASE_PREVIDENCIA.HasValue)
                {
                    throw new Exception($"Salário de contribuição não encontrado na data de {salario.DT_REFERENCIA}");
                }

                var valor = Math.Min(salario.VL_BASE_PREVIDENCIA.Value, teto.VL_INDICE.Value);
                var fator = fatores.First(x => x.Key <= dtReferencia);

                valor = valor * fator.Value;

                salariosCorrigidos.Add(new KeyValuePair <DateTime, decimal>(dtReferencia, valor));
            }

            var inssHipotetico = salariosCorrigidos.Sum(x => x.Value) / 36;

            inssHipotetico = Math.Min(inssHipotetico, indiceTETOPREV.First().VL_INDICE.Value);
            return(inssHipotetico);
        }
        public IActionResult Get(int sqPlanoPrevidencial)
        {
            try
            {
                //TODO: Jogar pra proxy

                var contribuicoes = new ContribuicaoProxy().BuscarPorPlanoContratoTrabalho(SqContratoTrabalho, sqPlanoPrevidencial).ToList();

                if (contribuicoes.Count == 0)
                {
                    throw new Exception("Não foram encontradas nenhuma contribuição para este plano.");
                }

                // Data de referência do salário de participação
                var dataReferencia = contribuicoes.First().DT_REFERENCIA;

                // Busca o salário de participação
                var salarioContribuicao = new SalarioContribuicaoProxy().BuscarUltimoPorContratoTrabalhoPlano(SqContratoTrabalho, sqPlanoPrevidencial);
                var salarioParticipacao = salarioContribuicao.VL_BASE_FUNDACAO;

                // Busca o percentual de contribuição
                var percentualContribuicao = new HistManutContribuicaoProxy().BuscarUltimoPorContratoTrabalho(SqContratoTrabalho);
                var percentual             = percentualContribuicao.VL_COEF_TAXA;

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