//Extension para pegar a tabela de preços vigente para a contribuição
        public static ContribuicaoPreco retornarPreco(this ContribuicaoTabelaPreco TabelaPreco, int idTipoAssociado)
        {
            var Retorno = new ContribuicaoPreco();

            if (TabelaPreco == null)
            {
                return(Retorno);
            }

            Retorno = TabelaPreco.listaPrecos.FirstOrDefault(x => x.idTipoAssociado == idTipoAssociado && x.flagExcluido == "N");

            Retorno = Retorno ?? new ContribuicaoPreco();

            return(Retorno);
        }
        //Extension para pegar o preço a partir do tipo do associado
        //Verificar se a cobranca deve ser feita pro-rata e calcular o valor
        public static ContribuicaoPreco retornarPrecoAtual(this ContribuicaoTabelaPreco TabelaPreco, int idTipoAssociado, DateTime?dtCobranca)
        {
            var Preco = new ContribuicaoPreco();

            if (TabelaPreco == null)
            {
                return(Preco);
            }

            Preco = TabelaPreco.listaPrecos.FirstOrDefault(x => x.idTipoAssociado == idTipoAssociado && x.flagExcluido == "N");

            Preco = Preco ?? new ContribuicaoPreco();

            var OContribuicao = TabelaPreco.Contribuicao;

            var flagCobrancaProRata = OContribuicao.flagCobrancaProRata == true;

            var OVencimento = OContribuicao.retornarProximoVencimento();

            var dtFimVigencia = OVencimento.dtFimVigencia;

            if (!dtFimVigencia.HasValue || !dtCobranca.HasValue)
            {
                return(Preco);
            }

            if (!flagCobrancaProRata || OContribuicao.idTipoVencimento != TipoVencimentoConst.FIXO_PELA_CONTRIBUICAO && Preco.id == 0)
            {
                return(Preco);
            }

            int qtdeDiasRestante = dtFimVigencia.Value.Date.Subtract(dtCobranca.Value.Date).Days;

            int qtdeDiasTotal = OContribuicao.PeriodoContribuicao.qtdeDias;

            decimal valorPorDia = decimal.Divide(UtilNumber.toDecimal(Preco.valorFinal), UtilNumber.toDecimal(qtdeDiasTotal));

            decimal valorProRata = decimal.Multiply(valorPorDia, UtilNumber.toDecimal(qtdeDiasRestante));

            Preco.valorFinal = valorProRata;

            return(Preco);
        }
        //Extension para pegar a tabela de preços vigente para a contribuição
        public static ContribuicaoTabelaPreco retornarTabelaVigente(this Contribuicao Item)
        {
            var Retorno = new ContribuicaoTabelaPreco();

            if (Item == null)
            {
                return(Retorno);
            }

            Item.listaTabelaPreco = Item.listaTabelaPreco ?? new List <ContribuicaoTabelaPreco>();

            Retorno = Item.listaTabelaPreco.Where(x => x.flagExcluido == false && x.dtInicioVigencia <= DateTime.Today)
                      .OrderByDescending(x => x.dtInicioVigencia)
                      .FirstOrDefault();

            Retorno = Retorno ?? new ContribuicaoTabelaPreco();

            return(Retorno);
        }
        /// <summary>
        /// Verificar se existe tabela de desconto por antecipacao de pagamentos e retornar a tabela
        /// </summary>
        public static List <TituloReceitaDescontoAntecipacao> retornarListaDescontos(this ContribuicaoTabelaPreco OTabelaPreco, int idTipoAssociado, DateTime dtVencimento)
        {
            var listaDescontos = new List <TituloReceitaDescontoAntecipacao>();

            if (OTabelaPreco == null)
            {
                return(listaDescontos);
            }

            var Preco = OTabelaPreco.listaPrecos.FirstOrDefault(x => x.idTipoAssociado == idTipoAssociado && x.flagExcluido == "N");


            if (Preco == null)
            {
                return(listaDescontos);
            }

            var listaPrecoDescontos = Preco.listaDesconto.Where(x => x.dtExclusao == null).ToList();

            if (!listaPrecoDescontos.Any())
            {
                return(listaDescontos);
            }

            foreach (var OPrecoDesconto in listaPrecoDescontos)
            {
                var ItemDesconto = new TituloReceitaDescontoAntecipacao();

                ItemDesconto.dtLimiteDesconto = dtVencimento.AddDays(-Math.Abs(OPrecoDesconto.qtdeDiasAntecipacao));

                ItemDesconto.valor = OPrecoDesconto.valorDesconto;

                listaDescontos.Add(ItemDesconto);
            }


            return(listaDescontos);
        }