public DTOCursosPorCategoria ConsultarCursosPorCategoria(int idNoCategoriaConteudo, string cpf, string nome,
                                                                 bool somenteComInscricoesAbertas)
        {
            var retorno = new DTOCursosPorCategoria
            {
                Categoria   = new DTOCategoriaConteudo(),
                ListaCursos = new List <DTOSolucaoEducacional>()
            };

            var categoria = new BMCategoriaConteudo().ObterPorIdNode(idNoCategoriaConteudo);

            retorno.Categoria.ID   = categoria.ID;
            retorno.Categoria.Nome = categoria.Nome;

            var usuario = new BMUsuario().ObterPorCPF(cpf);

            var permissoesSe =
                new BMSolucaoEducacional().ObterListaDePermissoes(usuario.ID, 0)
                .Select(x => x.SolucaoEducacional.ID)
                .ToList();
            var permissoesOf = new BMOferta().ObterListaDePermissoes(usuario.ID).Select(x => x.IdOferta).ToList();

            var solucoesEducacionais = new BMSolucaoEducacional().ObterTodos().AsEnumerable()
                                       .Where(x => x.Nome.ToLower().Contains(nome.ToLower()) &&
                                              x.CategoriaConteudo != null &&
                                              x.Ativo &&
                                              x.CategoriaConteudo.IdNode == idNoCategoriaConteudo &&
                                              //(x.IdNode.HasValue || !string.IsNullOrEmpty(x.Link)) &&
                                              permissoesSe.Contains(x.ID) &&
                                              x.ListaOferta != null &&
                                              x.ListaOferta.Any(o => permissoesOf.Contains(o.ID)) &&
                                              x.ListaOferta.Any(o => o.TipoOferta != enumTipoOferta.Exclusiva)
                                              ).ToList();

            foreach (var item in solucoesEducacionais)
            {
                var obj = new DTOSolucaoEducacional
                {
                    ID                = item.ID,
                    IDChaveExterna    = item.IDChaveExterna,
                    IdNode            = item.IdNode,
                    Nome              = item.Nome,
                    InscricoesAbertas = false
                };

                if (
                    item.ListaOferta.Any(
                        x =>
                        x.DataInicioInscricoes.HasValue && x.DataFimInscricoes.HasValue &&
                        x.DataInicioInscricoes.Value <= DateTime.Today &&
                        x.DataFimInscricoes.Value >= DateTime.Today))
                {
                    foreach (var oferta in item.ListaOferta)
                    {
                        if (string.IsNullOrEmpty(obj.Link))
                        {
                            obj.Link = (item.Fornecedor.ID == (int)enumFornecedor.FGVOCW ||
                                        item.Fornecedor.ID == (int)enumFornecedor.FGVSiga) &&
                                       !string.IsNullOrEmpty(oferta.Link)
                                ? oferta.Link
                                : "";
                        }

                        obj.InscricoesAbertas = oferta.ListaTurma.Any(x => x.DataInicio <= DateTime.Today &&
                                                                      x.DataFinal.HasValue &&
                                                                      x.DataFinal.Value >= DateTime.Today);
                    }
                }
                else
                {
                    obj.InscricoesAbertas = false;
                }

                bool adicionar = true;

                if (somenteComInscricoesAbertas)
                {
                    adicionar = obj.InscricoesAbertas;
                }

                if (adicionar)
                {
                    retorno.ListaCursos.Add(obj);
                }
            }

            return(retorno);
        }
        public DTOSolucoes ConsultarDisponibilidadeMatriculaPorUsuario(int pIdUsuario, int idSolucaoEducacional,
                                                                       int cargaHoraria)
        {
            var retorno = new DTOSolucoes();

            var usuario = new ManterUsuario().ObterUsuarioPorID(pIdUsuario);

            if (usuario != null)
            {
                var permissoesSoculaoEducacional =
                    new BMSolucaoEducacional().ObterListaDePermissoes(usuario.ID, idSolucaoEducacional)
                    .Select(f => f.SolucaoEducacional.ID)
                    .Distinct()
                    .ToList();
                var permissoesOfertas =
                    new BMOferta().ObterListaDePermissoes(usuario.ID).Select(f => f.IdOferta).Distinct().ToList();


                if (idSolucaoEducacional > 0 && permissoesSoculaoEducacional.Contains(idSolucaoEducacional))
                {
                    permissoesSoculaoEducacional.Clear();
                    permissoesSoculaoEducacional.Add(idSolucaoEducacional);
                }

                var solucoes = new ManterSolucaoEducacional().ObterPorFiltroPesquisa(new SolucaoEducacional(), true,
                                                                                     permissoesSoculaoEducacional);

                foreach (var solucaoEducacional in solucoes)
                {
                    var ofertas = solucaoEducacional.ListaOferta.Where(
                        x =>
                        (x.DataInicioInscricoes.HasValue &&
                         x.DataInicioInscricoes.Value.Date <= DateTime.Today) &&
                        x.DataFimInscricoes.HasValue &&
                        x.DataFimInscricoes.Value.Date >= DateTime.Today &&
                        permissoesOfertas.Contains(x.ID) &&
                        //x.ListaPermissao.Any(f=>f.Uf.ID == usuario.UF.ID) &&
                        !(x.ListaTurma.Any(
                              f =>
                              (f.DataFinal == null || f.DataFinal.Value.Date > DateTime.Today) &&

                              // Remover turmas canceladas das possibilidades de matrícula. #2997
                              f.Status != enumStatusTurma.Cancelada &&
                              f.InAberta == false)));

                    if (cargaHoraria > 0)
                    {
                        ofertas = ofertas.Where(f => f.CargaHoraria == cargaHoraria);
                    }

                    var se = new DTOCurso {
                        IDSolucaoEducacional = solucaoEducacional.ID
                    };

                    foreach (var oferta in ofertas.OrderBy(x => x.DataInicioInscricoes))
                    {
                        if (oferta.TipoOferta.Equals(enumTipoOferta.Exclusiva))
                        {
                            break;
                        }

                        //Verificando se existe alguma matricula na SE
                        if (ExisteAlgumaMatriculaComoInscrito(usuario.ListaMatriculaOferta, se.IDSolucaoEducacional))
                        {
                            break;
                        }

                        //VALIDAR SE O USUARIO POSSUI ACESSO A SE: 205 (permissão a se)
                        //VALIDADO NA BUSCA

                        //VALIDAR SE O USUARIO ESTA CURSANDO OUTRA SE
                        //VERIFICA O LIMITE DE CURSOS SIMULTANEOS
                        int cursosEmAndamento =
                            usuario.ListaMatriculaOferta.Where(
                                x => x.StatusMatricula.Equals(enumStatusMatricula.Inscrito)).Count();
                        int limteCursosSimultaneos =
                            int.Parse(
                                ConfiguracaoSistemaUtil.ObterInformacoes(enumConfiguracaoSistema.CursosSimultaneos)
                                .Registro);
                        if (cursosEmAndamento >= limteCursosSimultaneos)
                        {
                            break;
                        }

                        //VALIDAR SE O USUARIO ESTA COM ALGUM ABANDONO ATIVO
                        if (new BMUsuarioAbandono().ValidarAbandonoAtivo(usuario.ID))
                        {
                            break;
                        }

                        //VERIFICA SE A OFERTA INFORMADA FOI ENCONTRADA
                        //NO CADASTRO

                        if (oferta.TipoOferta.Equals(enumTipoOferta.Continua))
                        {
                        }

                        if (oferta.TipoOferta.Equals(enumTipoOferta.Normal))
                        {
                        }

                        var qtdInscritosNaOferta =
                            oferta.ListaMatriculaOferta.Count(
                                x => (x.StatusMatricula != enumStatusMatricula.CanceladoAdm &&
                                      x.StatusMatricula != enumStatusMatricula.CanceladoAluno));

                        if (qtdInscritosNaOferta >= oferta.QuantidadeMaximaInscricoes && !oferta.FiladeEspera)
                        {
                            break;
                        }

                        var trancadoPorNaoPagante = false;

                        if (oferta.ListaNiveisTrancados != null &&
                            oferta.ListaNiveisTrancados.Any(x => x.ID == usuario.NivelOcupacional.ID))
                        {
                            if (!VerificarTrancadoParaPagante(usuario))
                            {
                                trancadoPorNaoPagante = true;
                            }
                        }

                        se.Ofertas.Add(new DTOOfertas
                        {
                            IDOferta                = oferta.ID,
                            CargaHoraria            = oferta.CargaHoraria,
                            TrancadoPorNaoPagamento = trancadoPorNaoPagante,
                            Nome = oferta.Nome
                        });
                    }

                    if (se.Ofertas.Any())
                    {
                        retorno.Cursos.Add(se);
                    }
                }
            }

            return(retorno);
        }