public ActionResult validarVencimento(int?idContribuicao, DateTime?dtVencimento)
        {
            Contribuicao OContribuicao = this.OContribuicaoBL.carregar(UtilNumber.toInt32(idContribuicao));

            if (OContribuicao == null)
            {
                return(Json(new JsonMessage {
                    error = true, message = "Não foi possível encontrar a cobrança."
                }, JsonRequestBehavior.AllowGet));
            }


            if (!dtVencimento.HasValue)
            {
                return(Json(new JsonMessage {
                    error = true, message = "Data de Vencimento não informada."
                }, JsonRequestBehavior.AllowGet));
            }


            if (OContribuicao.flagVencimentoVariado())
            {
                return(Json(new { error = false, dtVencimento = "", dtInicioVigencia = "", dtFimVigencia = "" }, JsonRequestBehavior.AllowGet));
            }

            var OVencimento = OContribuicao.retornarProximoVencimento(dtVencimento.Value);

            if (OVencimento == null)
            {
                return(Json(new JsonMessage {
                    error = true, message = "A data de vencimento informada é inválida."
                }, JsonRequestBehavior.AllowGet));
            }

            return(Json(new {
                error = false,
                dtVencimento = dtVencimento.exibirData().ToString(),
                dtInicioVigencia = OVencimento.dtInicioVigencia.exibirData().ToString(),
                dtFimVigencia = OVencimento.dtFimVigencia.exibirData().ToString()
            },
                        JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        ///Vincular uma contribuicao com o associado
        ///Pode-se informar qual contribuição será vinculada
        ///Se nao for informada nenhuma contribuicao, o sistema irá considerar a contribuicao padrao do associado
        /// </summary>
        public UtilRetorno gerarCobranca(Associado OAssociado, Contribuicao OContribuicao, DateTime?dtVencimento = null, DateTime?dtNovoVencimento = null, bool flagPrimeiraCobranca = false, decimal valorCustomizado = 0)
        {
            if (OAssociado?.TipoAssociado == null)
            {
                return(UtilRetorno.newInstance(true, "O associado informado não foi localizado."));
            }

            int?idContribuicao = OContribuicao?.id;

            if (idContribuicao.toInt() == 0)
            {
            }

            if (OContribuicao == null || !OContribuicao.listaContribuicaoVencimento.Any())
            {
                OContribuicao = this.OContribuicaoBL.carregar(idContribuicao.toInt());
            }

            if (OContribuicao == null)
            {
                return(UtilRetorno.newInstance(true, "A contribuição informada não foi localizada."));
            }

            var TabelaPreco = OContribuicao.retornarTabelaVigente();

            if (TabelaPreco.id == 0)
            {
                return(UtilRetorno.newInstance(true, "Não há tabela de preços configuradas para a contribuição."));
            }

            var Vencimento = OContribuicao.retornarProximoVencimento(dtVencimento);

            var Preco = flagPrimeiraCobranca ? TabelaPreco.retornarPrecoAtual(UtilNumber.toInt32(OAssociado.idTipoAssociado), DateTime.Today) : TabelaPreco.retornarPreco(UtilNumber.toInt32(OAssociado.idTipoAssociado));

            if (!dtVencimento.HasValue)
            {
                dtVencimento = Vencimento.dtVencimento;
            }

            if (flagPrimeiraCobranca)
            {
                dtNovoVencimento = DateTime.Today.AddDays(UtilNumber.toInt32(OAssociado.TipoAssociado.diasPrazoPrimeiraCobranca));

                //Caso o vencimento seja por admissão ou por ultimo pagamento, enviamos a data de vencimento vazia no ato do cadastro.
                //Por este motivo atualizamos a competência com base na data de hoje.
                if (OContribuicao.flagVencimentoVariado() && !Vencimento.dtVencimento.HasValue)
                {
                    dtVencimento = DateTime.Today;

                    Vencimento.dtVencimento = dtNovoVencimento;

                    Vencimento.dtInicioVigencia = dtNovoVencimento;

                    Vencimento.dtFimVigencia = dtNovoVencimento.Value.AddYears(1);
                }
            }

            if (!dtVencimento.HasValue)
            {
                return(UtilRetorno.newInstance(true, "O vencimento não está configurado ou não foi informado para essa contribuição."));
            }

            bool flagVencimentoValido = this.validarVencimento(OContribuicao, dtVencimento.Value);

            if (!flagVencimentoValido)
            {
                return(UtilRetorno.newInstance(true, "O vencimento informado não está dentro das opções válidas para a cobrança informada."));
            }

            AssociadoContribuicao OAssociadoContribuicao = new AssociadoContribuicao();

            this.verificarIsencao(ref OAssociadoContribuicao, Preco, OAssociado);

            OAssociadoContribuicao.idAssociado = OAssociado.id;

            OAssociadoContribuicao.idOrganizacao = OAssociado.idOrganizacao;

            OAssociadoContribuicao.idUnidade = OAssociado.idUnidade;

            OAssociadoContribuicao.idTipoAssociado = UtilNumber.toInt32(OAssociado.idTipoAssociado);

            OAssociadoContribuicao.idContribuicao = idContribuicao.toInt();

            OAssociadoContribuicao.valorOriginal = UtilNumber.toDecimal(Preco.valorFinal);

            OAssociadoContribuicao.valorAtual = valorCustomizado > 0? valorCustomizado : OAssociadoContribuicao.valorOriginal;

            OAssociadoContribuicao.dtVencimentoOriginal = dtVencimento.Value;

            OAssociadoContribuicao.dtVencimentoAtual = dtNovoVencimento ?? OAssociadoContribuicao.dtVencimentoOriginal;

            OAssociadoContribuicao.idContribuicaoVencimento = Vencimento.id;

            OAssociadoContribuicao.dtInicioVigencia = Vencimento.dtInicioVigencia;

            OAssociadoContribuicao.dtFimVigencia = Vencimento.dtFimVigencia;

            return(this.gerarCobranca(OAssociadoContribuicao));
        }