//Extension para pegar a tabela de preços vigente para a contribuição
        public static List <ContribuicaoVencimento> retornarListaVencimento(this Contribuicao Item)
        {
            if (Item.idTipoVencimento != TipoVencimentoConst.FIXO_PELA_CONTRIBUICAO)
            {
                return(new List <ContribuicaoVencimento>());
            }

            var listaContribuicaoVencimento = Item.listaContribuicaoVencimento.Where(x => x.dtExclusao == null).ToList();

            listaContribuicaoVencimento.ForEach(v => {
                var dtVencimento = new DateTime(DateTime.Today.Year, UtilNumber.toInt32(v.mesVencimento), UtilNumber.toInt32(v.diaVencimento));

                var dtInicioVigencia = new DateTime(DateTime.Today.Year, UtilNumber.toInt32(v.mesInicioVigencia), UtilNumber.toInt32(v.diaInicioVigencia));

                var dtFimVigencia = new DateTime(DateTime.Today.Year, UtilNumber.toInt32(v.mesFimVigencia), UtilNumber.toInt32(v.diaFimVigencia));

                if (dtInicioVigencia > dtFimVigencia)
                {
                    dtFimVigencia = dtFimVigencia.AddYears(1);

                    dtVencimento = dtVencimento.AddYears(1);
                }

                v.dtVencimento = dtVencimento;

                v.dtInicioVigencia = dtInicioVigencia;

                v.dtFimVigencia = dtFimVigencia;
            });

            return(listaContribuicaoVencimento);
        }
        //Extension para pegar a tabela de preços vigente para a contribuição
        public static ContribuicaoVencimento retornarProximoVencimento(this Contribuicao Item, DateTime dtVencimento)
        {
            byte diaVencimento = (byte)dtVencimento.Day;

            byte mesVencimento = (byte)dtVencimento.Month;

            var OVencimento = Item.listaContribuicaoVencimento.FirstOrDefault(x => x.dtExclusao == null && x.diaVencimento == diaVencimento && x.mesVencimento == mesVencimento);

            if (OVencimento == null)
            {
                return(null);
            }

            OVencimento.dtVencimento = dtVencimento;

            OVencimento.dtInicioVigencia = new DateTime(dtVencimento.Year, UtilNumber.toInt32(OVencimento.mesInicioVigencia), UtilNumber.toInt32(OVencimento.diaInicioVigencia));

            OVencimento.dtFimVigencia = new DateTime(dtVencimento.Year, UtilNumber.toInt32(OVencimento.mesFimVigencia), UtilNumber.toInt32(OVencimento.diaFimVigencia));

            if (OVencimento.dtInicioVigencia > OVencimento.dtFimVigencia)
            {
                OVencimento.dtFimVigencia = OVencimento.dtFimVigencia.Value.AddYears(1);
            }

            return(OVencimento);
        }
        //Extension para pegar a tabela de preços vigente para a contribuição
        public static bool flagVencimentoVariado(this Contribuicao Item)
        {
            if (Item.idTipoVencimento == TipoVencimentoConst.VENCIMENTO_PELA_ADMISSAO_ASSOCIADO || Item.idTipoVencimento == TipoVencimentoConst.VENCIMENTO_PELO_ULTIMO_PAGAMENTO)
            {
                return(true);
            }

            return(false);
        }
        //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);
        }
        public static List <VigenciaDTO> retornarVigencia(this Contribuicao Item, List <Contribuicao> listaContribuicao)
        {
            DateTime dtVigencia = new DateTime(Convert.ToInt32(Item.anoInicioVigencia), Convert.ToInt32(Item.mesInicioVigencia), 1, 00, 00, 00);

            if (dtVigencia > DateTime.Today)
            {
                return(new List <VigenciaDTO>());
            }

            var ProximaContribuicao = listaContribuicao
                                      .Where(x => x.dtInicioVigencia > Item.dtInicioVigencia)
                                      .OrderBy(x => x.dtInicioVigencia)
                                      .FirstOrDefault();

            int ano = ProximaContribuicao != null?Convert.ToInt32(ProximaContribuicao.anoInicioVigencia) : DateTime.Today.Year;

            int mes = ProximaContribuicao != null?Convert.ToInt32(ProximaContribuicao.mesInicioVigencia) : 12;

            DateTime startDate = new DateTime(Convert.ToInt32(Item.anoInicioVigencia), Convert.ToInt32(Item.mesInicioVigencia), 1, 00, 00, 00);
            DateTime endDate   = new DateTime(ano, mes, DateTime.DaysInMonth(ano, mes), 23, 59, 59);

            //Acerta a contribuição já vencida
            //Acerta a contribuição quando houver outra
            if (!Item.flagVigente || ProximaContribuicao != null)
            {
                endDate = endDate.AddMonths(-1);
            }

            Item.listaVigencia = Enumerable.Range(0, Int32.MaxValue)
                                 .Select(e => startDate.AddMonths(e))
                                 .TakeWhile(e => e < endDate)
                                 .Select(e => new VigenciaDTO {
                ano = e.Year, mes = e.Month, descricaoMes = e.ToString("MMMM")
            }).ToList();

            return(Item.listaVigencia);
        }
        //Extension para pegar a tabela de preços vigente para a contribuição
        public static ContribuicaoVencimento retornarProximoVencimento(this Contribuicao Item, DateTime?dtVencimentoInformado = null)
        {
            var listaContribuicaoVencimento = Item.listaContribuicaoVencimento.Where(x => x.dtExclusao == null).ToList();

            if (Item.flagVencimentoVariado())
            {
                var ONovoVencimento = listaContribuicaoVencimento.FirstOrDefault() ?? new ContribuicaoVencimento();

                ONovoVencimento.dtVencimento = dtVencimentoInformado;

                if (dtVencimentoInformado.HasValue)
                {
                    ONovoVencimento.dtInicioVigencia = dtVencimentoInformado;

                    ONovoVencimento.dtFimVigencia = dtVencimentoInformado.Value.AddYears(1);

                    ONovoVencimento.mesVencimento = dtVencimentoInformado.Value.Month.toByte();

                    ONovoVencimento.diaVencimento = dtVencimentoInformado.Value.Day.toByte();
                }

                return(ONovoVencimento);
            }


            var listaVencimentos = new List <ContribuicaoVencimento>();

            int anoVigencia = DateTime.Today.Year;

            if (dtVencimentoInformado.HasValue)
            {
                anoVigencia = dtVencimentoInformado.Value.Year;
            }

            listaContribuicaoVencimento.ForEach(v => {
                var dtVencimento = new DateTime(anoVigencia, UtilNumber.toInt32(v.mesVencimento), UtilNumber.toInt32(v.diaVencimento));

                var dtInicioVigencia = new DateTime(anoVigencia, UtilNumber.toInt32(v.mesInicioVigencia), UtilNumber.toInt32(v.diaInicioVigencia));

                var dtFimVigencia = new DateTime(anoVigencia, UtilNumber.toInt32(v.mesFimVigencia), UtilNumber.toInt32(v.diaFimVigencia));

                if (dtInicioVigencia > dtFimVigencia)
                {
                    dtFimVigencia = dtFimVigencia.AddYears(1);

                    dtVencimento = dtVencimento.AddYears(1);
                }

                var ItemVencimento = new ContribuicaoVencimento {
                    id            = v.id, dtVencimento = dtVencimento, dtInicioVigencia = dtInicioVigencia,
                    dtFimVigencia = dtFimVigencia, mesVencimento = v.mesVencimento, diaVencimento = v.diaVencimento
                };

                listaVencimentos.Add(ItemVencimento);
            });

            if (dtVencimentoInformado.HasValue)
            {
                var ORetornoVencimento = listaVencimentos.FirstOrDefault(x => x.dtVencimento.GetValueOrDefault().Date == dtVencimentoInformado.GetValueOrDefault().Date) ?? new ContribuicaoVencimento();

                if (ORetornoVencimento.id > 0)
                {
                    return(ORetornoVencimento);
                }
            }

            var dtHoje = DateTimeFactory.Today;

            var OVencimento = listaVencimentos.FirstOrDefault(x => x.dtInicioVigencia <= dtHoje && x.dtFimVigencia >= dtHoje) ?? new ContribuicaoVencimento();

            OVencimento.dtVencimento = OVencimento.dtVencimento ?? DateTime.MinValue;

            return(OVencimento);
        }