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);
        }