private static bool PossuiQuestionarioPendente(Usuario usuario, ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var turmasPendentes = new ManterTurma().ObterTurmasPendentes(usuario);

            if (turmasPendentes.Any())
            {
                Turma primeiraTurma = turmasPendentes.FirstOrDefault();

                //Valida se a data da matricula está no ano vigente, caso contrário, não apresenta questionário de abandono.
                //Verify if the registration date is in current year, otherwise, don't show the abandon quiz.
                if (!(primeiraTurma.DataFinal.Value.Year < DateTime.Now.Year))
                {
                    if ((primeiraTurma = turmasPendentes.FirstOrDefault()) != null)
                    {
                        retorno.CodigoDisponibilidade =
                            (int)enumDisponibilidadeSolucaoEducacional.PendenciaAbandono;

                        retorno.IdTurma = primeiraTurma.ID;

                        // Montar mensagem da pendência, com os plurais caso seja mais de uma turma.
                        retorno.TextoDisponibilidade =
                            string.Format(
                                "Você abandonou a{0} turma{0} no{0} curso{0} \"{1}\", e precisa responder o{0} questionário{0} de abandono para poder se inscrever em qualquer curso.",
                                turmasPendentes.Count() > 1 ? "s" : "",
                                string.Join(", ", turmasPendentes.Select(x => x.Oferta.SolucaoEducacional.Nome)));

                        return(true);
                    }
                }
            }

            return(false);
        }
        private static bool UsuarioPossuiLimiteInscricoesSimultaneas(int usuarioId,
                                                                     ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var listaMatriculaOferta =
                new ManterMatriculaOferta().ObterPorUsuario(usuarioId).Select(x => new MatriculaOferta
            {
                ID = x.ID,
                StatusMatricula = x.StatusMatricula
            });

            var cursosInscrito = listaMatriculaOferta.Count(x => x.StatusMatricula == enumStatusMatricula.Inscrito);

            int limteCursosSimultaneos;

            if (
                int.TryParse(
                    ConfiguracaoSistemaUtil.ObterInformacoes(enumConfiguracaoSistema.CursosSimultaneos).Registro,
                    out limteCursosSimultaneos))
            {
                if (cursosInscrito < limteCursosSimultaneos)
                {
                    return(false);
                }

                retorno.TextoDisponibilidade = string.Format("Você só pode realizar {0} em simultâneo.",
                                                             limteCursosSimultaneos);
                retorno.CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.NaoPossuiDisponibilidade;

                return(true);
            }

            return(false);
        }
        public DTODisponibilidadeSolucaoEducacional ConsultarDisponibilidadeMatriculaSolucaoEducacional(int usuarioId,
                                                                                                        int solucaoId)
        {
            var retorno = new DTODisponibilidadeSolucaoEducacional
            {
                CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.NaoPossuiDisponibilidade,
                TextoDisponibilidade  = "Não existe oferta disponível no momento"
            };

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

            if (usuario == null)
            {
                return(retorno);
            }

            if (UsuarioPossuiBloqueioInscricao(usuario, solucaoId, ref retorno))
            {
                return(retorno);
            }

            //Verificar disponibilidade de ofertas normais e contínuas.
            if (VerificarDisponibilidadeOfertasPorPermissoes(usuario, solucaoId, ref retorno))
            {
                return(retorno);
            }

            return(retorno);
        }
        private static bool VerificarDisponibilidadeTurma(Usuario usuario, Turma turma,
                                                          ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var oferta = turma.Oferta;

            return(oferta.IsAbertaParaInscricoes() &&
                   VerificarDisponibilidadeOferta(usuario, oferta, ref retorno));
        }
        private static void PreencherRetornoDadosCurso(Usuario usuario, Oferta oferta,
                                                       enumDisponibilidadeSolucaoEducacional disponibilidade,
                                                       ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            retorno.TextoDisponibilidade     = string.Empty;
            retorno.TextoInformacaoAdicional = oferta.InformacaoAdicional;

            if (disponibilidade == enumDisponibilidadeSolucaoEducacional.ConfirmarMatricula)
            {
                retorno.TextoDisponibilidade = "Você precisa confirmar a inscrição na Solução Educacional";
            }

            if (disponibilidade == enumDisponibilidadeSolucaoEducacional.FilaEspera)
            {
                retorno.TextoDisponibilidade =
                    "No momento não há vagas disponíveis para essa Solução Educacional. Você será inscrito na fila de espera.";
            }

            retorno.IdOferta          = oferta.ID;
            retorno.IdTipoOferta      = (int)oferta.TipoOferta;
            retorno.PermiteFilaEspera = oferta.FiladeEspera;
            retorno.Prazo             = oferta.DiasPrazo.ToString();
            retorno.CargaHoraria      = oferta.CargaHoraria.ToString();
            //retorno.DataInicioOferta = oferta.DataInicio;
            //retorno.DataFimOferta = oferta.DataFim;

            retorno.DataInicioInscricoes =
                retorno.IdTipoOferta == 2 && oferta.SolucaoEducacional != null &&
                oferta.SolucaoEducacional.TeraOfertasContinuas
                    ? oferta.SolucaoEducacional.Inicio
                    : oferta.DataInicioInscricoes;

            retorno.DataFimInscricoes =
                retorno.IdTipoOferta == 2 && oferta.SolucaoEducacional != null &&
                oferta.SolucaoEducacional.TeraOfertasContinuas
                    ? oferta.SolucaoEducacional.Fim
                    : oferta.DataFimInscricoes;

            retorno.InscricaoOnline       = (oferta.InscricaoOnline ?? false);
            retorno.CodigoDisponibilidade = (int)disponibilidade;
            retorno.IdSolucaoEducacional  = oferta.SolucaoEducacional != null
                ? oferta.SolucaoEducacional.ID
                : 0;

            // Caso a oferta possua turmas disponíveis, retorna a oferta com todas as turmas disponíveis para matrícula.
            if (oferta.IsAbertaParaInscricoes() && oferta.PossuiTurmasDisponiveis())
            {
                DTOOferta dtoOferta = new DTOOferta(oferta);

                //Tranca as ofertas que precisam de pagamento.
                dtoOferta.RequerPagamento = VerificarTrancadoParaPagante(usuario, oferta);

                retorno.OfertasDisponiveis.Add(dtoOferta);
            }
        }
        private static bool UsuarioPossuiPermissaoSolucao(Usuario usuario, SolucaoEducacional solucao,
                                                          ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            // Verifica se o usuário não tiver acesso à Solução Educacional.
            if (solucao.UsuarioPossuiPermissaoMatricula(usuario))
            {
                return(false);
            }

            retorno.TextoDisponibilidade  = "Solução não disponível para seu perfil. Entre em contato no fale conosco.";
            retorno.CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.NaoPossuiDisponibilidade;

            return(true);
        }
        private static bool UsuarioPossuiMatriculaSolucao(IList <MatriculaOferta> listaMatriculaOferta, int solucaoId,
                                                          ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var existeAlgumaMatriculaComoInscrito =
                ExisteAlgumaMatriculaComoInscrito(listaMatriculaOferta, solucaoId);

            if (!existeAlgumaMatriculaComoInscrito)
            {
                return(false);
            }

            retorno.TextoDisponibilidade  = "Você já está matriculado nessa Solução Educacional";
            retorno.CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.Matriculado;

            return(true);
        }
        private static bool VerificarDisponibilidadeTurmas(Oferta oferta,
                                                           ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            if (oferta.TipoOferta == enumTipoOferta.Continua &&
                !oferta.ListaTurma.Any(x => x.DataInicio <= DateTime.Now &&
                                       (x.DataFinal == null || x.DataFinal.Value > DateTime.Now) && x.InAberta))
            {
                retorno.TextoDisponibilidade  = "Não existe turma disponível para essa Solução Educacional";
                retorno.CodigoDisponibilidade =
                    (int)enumDisponibilidadeSolucaoEducacional.NaoPossuiDisponibilidade;

                return(true);
            }

            return(false);
        }
        private static bool UsuarioPossuiBloqueioPoliticaDeConsequencia(int usuarioId, int solucaoId,
                                                                        ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            try
            {
                new ManterMatriculaOferta().VerificarPoliticaDeConsequencia(usuarioId, solucaoId);
            }
            catch (PoliticaConsequenciaException ex)
            {
                retorno.TextoDisponibilidade  = ex.Message;
                retorno.CodigoDisponibilidade = (int)ex.Consequencia;

                return(true);
            }

            return(false);
        }
        private static bool VerificarDisponibilidadeOfertasPorPermissoes(Usuario usuario, int solucaoId,
                                                                         ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var manterOferta = new ManterOferta();

            //var ofertas = manterOferta.ObterOfertaPorSolucaoEducacional(solucaoId).Where(
            //    x =>
            //        ((x.DataFim.HasValue && x.DataFim.Value.Date >= DateTime.Today) || (!x.DataFim.HasValue)) &&
            //        (x.DataInicioInscricoes.HasValue && x.DataInicioInscricoes.Value.Date <= DateTime.Today) &&
            //        (x.TipoOferta == enumTipoOferta.Continua ||
            //         (x.DataFimInscricoes.HasValue && x.DataFimInscricoes.Value.Date >= DateTime.Today)) &&
            //        // Seria sábio utilizar o método PossuiTurmasDisponiveis() da Oferta.cs, se o NHibernte não pirasse.
            //        x.ListaTurma.Any(t => t.Status != enumStatusTurma.Cancelada && t.InAberta))
            //    .ToList()
            //    // Somente usuários que possuem permissão de inscrição.
            //    .Where(x => x.UsuarioPossuiPermissao(usuario))
            //    .OrderBy(x => x.DataInicio)
            //    .ToList();

            var ofertas = manterOferta.ObterOfertaPorSolucaoEducacional(solucaoId).Where(
                x =>
                (x.DataInicioInscricoes.HasValue && x.DataInicioInscricoes.Value.Date <= DateTime.Today) &&
                (x.TipoOferta == enumTipoOferta.Continua ||
                 (x.DataFimInscricoes.HasValue && x.DataFimInscricoes.Value.Date >= DateTime.Today)) &&
                // Seria sábio utilizar o método PossuiTurmasDisponiveis() da Oferta.cs, se o NHibernte não pirasse.
                x.ListaTurma.Any(t => (!t.Status.HasValue || t.Status != enumStatusTurma.Cancelada) && t.InAberta))
                          .ToList()
                          // Somente usuários que possuem permissão de inscrição.
                          .Where(x => x.UsuarioPossuiPermissao(usuario))
                          .OrderBy(x => x.DataInicioInscricoes)
                          .ToList();

            foreach (var oferta in ofertas)
            {
                VerificarDisponibilidadeOferta(usuario, oferta, ref retorno);
            }

            if (retorno.IdOferta.HasValue || retorno.OfertasDisponiveis.Any())
            {
                return(true);
            }

            return(false);
        }
        public DTODisponibilidadeSolucaoEducacional ConsultarDisponibilidadeTurma(int usuarioId, int turmaId)
        {
            var retorno = new DTODisponibilidadeSolucaoEducacional
            {
                CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.NaoPossuiDisponibilidade,
                TextoDisponibilidade  = "Não existe oferta disponível no momento"
            };

            var turma = new ManterTurma().ObterTurmaPorID(turmaId);

            if (turma == null)
            {
                retorno.TextoDisponibilidade = "Curso não encontrado ou não disponível. Tente novamente.";

                return(retorno);
            }

            retorno.IdTurma = turmaId;

            var solucaoId = turma.Oferta.SolucaoEducacional.ID;

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

            if (usuario == null)
            {
                return(retorno);
            }

            if (UsuarioPossuiBloqueioInscricao(usuario, solucaoId, ref retorno))
            {
                return(retorno);
            }

            // Verificar se o usuário pode se inscrever na turma.
            if (VerificarDisponibilidadeTurma(usuario, turma, ref retorno))
            {
                return(retorno);
            }

            return(retorno);
        }
        private static bool UsuarioPossuiPendenciaConfirmacao(
            IList <MatriculaOferta> listaMatriculaOfertaNaSolucaoEducacional,
            Usuario usuario, ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var ofertaPendenteConfirmacao =
                listaMatriculaOfertaNaSolucaoEducacional.Where(
                    x => x.StatusMatricula == enumStatusMatricula.PendenteConfirmacaoAluno)
                .Select(x => x.Oferta)
                .FirstOrDefault();

            if (ofertaPendenteConfirmacao != null)
            {
                var disponibilidade = enumDisponibilidadeSolucaoEducacional.ConfirmarMatricula;

                PreencherRetornoDadosCurso(usuario, ofertaPendenteConfirmacao, disponibilidade, ref retorno);

                return(true);
            }

            return(false);
        }
        private static bool VerificarDisponibilidadeOferta(Usuario usuario, Oferta oferta,
                                                           ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            // Caso não seja oferta contínua e só tenha turmas canceladas, não permite a inscrição.
            if (oferta.TipoOferta != enumTipoOferta.Continua &&
                oferta.ListaTurma.All(x => (x.Status.HasValue && x.Status == enumStatusTurma.Cancelada)))
            {
                return(false);
            }

            // Se possuir vagas, liberar para inscrição.
            if (oferta.ObterVagasDisponiveis(usuario.UF) > 0)
            {
                PreencherRetornoDadosCurso(usuario, oferta, enumDisponibilidadeSolucaoEducacional.EfetuarMatricula, ref retorno);
                return(true);
            }

            // Verificar se existem turmas disponíveis caso a oferta seja contínua.
            if (VerificarDisponibilidadeTurmas(oferta, ref retorno))
            {
                return(true);
            }

            if (oferta.TipoOferta == enumTipoOferta.Continua)
            {
                // Permitir inscrição.
                PreencherRetornoDadosCurso(usuario, oferta, enumDisponibilidadeSolucaoEducacional.EfetuarMatricula, ref retorno);
            }

            // TODO: Verificar a necessidade desta verificação de acordo com as regras de negócio.
            if (!oferta.FiladeEspera)
            {
                return(false);
            }

            // Permitir inscrição na fila de espera.
            PreencherRetornoDadosCurso(usuario, oferta, enumDisponibilidadeSolucaoEducacional.FilaEspera, ref retorno);

            return(true);
        }
        private static bool UsuarioPossuiPendenciaCapacitacaoPrograma(int solucaoId, Usuario usuario,
                                                                      ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            var filtroMatriculaCapacitacao = new MatriculaCapacitacao
            {
                StatusMatricula = enumStatusMatricula.Inscrito,
                Usuario         = usuario
            };

            var listaMatriculaCapacitacao = new BMMatriculaCapacitacao().ObterPorFiltros(filtroMatriculaCapacitacao,
                                                                                         true);

            // Verificar se a capacitação possui pré-capacitações.
            foreach (
                var modNecessario in
                listaMatriculaCapacitacao.Select(
                    matriculaCapacitacao =>
                    new BMModuloSolucaoEducacional().CapacitacaoPossuiSolucao(
                        matriculaCapacitacao.Capacitacao.ID, solucaoId))
                .Where(modSol => modSol != null)
                .Select(modSol => new BMModuloPreRequisito().ListPreRequisitosPorModulo(modSol, usuario.ID))
                .Where(modNecessario => modNecessario.ID != 0))
            {
                retorno.TextoDisponibilidade =
                    string.Format(
                        "Existe uma solução educacional do \"{0}\" da capacitação \"{1}\" do programa \"{2}\" que precisa ser concluída antes que possa ser realizada a inscrição nesse curso. <br /><br /><a href='" +
                        //modNecessario.Capacitacao.Programa.Acesso +
                        "'>Clique aqui</a> para acessar a página do Programa.", modNecessario.Nome,
                        modNecessario.Capacitacao.Nome, modNecessario.Capacitacao.Programa.Nome);

                retorno.CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.PossuiPreReqPrograma;

                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Verificar se o usuário informado pode se inscrever na solução informada.
        /// </summary>
        /// <param name="usuario">Usuário a ser matriculado.</param>
        /// <param name="solucaoId">ID da solução que o usuário deseja se matricular.</param>
        /// <param name="retorno">Objeto de retorno com DTO das informações de bloqueio de matrícula, caso necessário.</param>
        /// <returns>True: usuário não pode se inscrever por causa de algum bloqueio. False: usuário pode proceder com a inscrição.</returns>
        private static bool UsuarioPossuiBloqueioInscricao(Usuario usuario, int solucaoId,
                                                           ref DTODisponibilidadeSolucaoEducacional retorno)
        {
            // Verifica pendências
            if (PossuiQuestionarioPendente(usuario, ref retorno))
            {
                return(true);
            }

            // Verifica se o usuário está matriculado no limite de cursos simultâneos.
            if (UsuarioPossuiLimiteInscricoesSimultaneas(usuario.ID, ref retorno))
            {
                return(true);
            }

            // Obter todas as matrículas da Solução.
            var matriculasSe =
                new ManterMatriculaOferta().ObterPorUsuarioESolucaoEducacional(usuario.ID, solucaoId).ToList();

            // Verifica se o aluno já está matriculado na SE
            if (UsuarioPossuiMatriculaSolucao(matriculasSe, solucaoId, ref retorno))
            {
                return(true);
            }

            // Verifica se existe alguma matricula como Pendente de Confirmação.
            if (UsuarioPossuiPendenciaConfirmacao(matriculasSe, usuario, ref retorno))
            {
                return(true);
            }

            // Se chegou até aqui, pode retornar os dados do termo de aceite e da política de consequência.
            var solucaoEducacional = new ManterSolucaoEducacional().ObterSolucaoEducacionalPorId(solucaoId);

            // Verifica se o usuário tem permissão para se inscrever na SE.
            if (UsuarioPossuiPermissaoSolucao(usuario, solucaoEducacional, ref retorno))
            {
                return(true);
            }

            // MÉTODO IMPORTANTE!!!
            // Verificar bloqueio de acordo com as políticas de consequência.
            if (UsuarioPossuiBloqueioPoliticaDeConsequencia(usuario.ID, solucaoId, ref retorno))
            {
                return(true);
            }

            // Sse o aluno estiver inscrito em algum programa, verifica se existe algum pré-requisito não cursado.
            if (UsuarioPossuiPendenciaCapacitacaoPrograma(solucaoId, usuario, ref retorno))
            {
                return(true);
            }

            if (solucaoEducacional.TermoAceite != null)
            {
                retorno.NomeTermoAceite           = solucaoEducacional.TermoAceite.Nome;
                retorno.TextoTermoAceite          = solucaoEducacional.TermoAceite.Texto;
                retorno.TextoPoliticaConsequencia = solucaoEducacional.TermoAceite.PoliticaConsequencia;
            }

            // Verifica se a Solução está Inativa.
            if (solucaoEducacional.Ativo == false)
            {
                retorno.TextoDisponibilidade = "Solução Educacional não está ativa no momento";
                return(true);
            }

            return(false);
        }
 public static bool VerificarTrancadoParaPagante(Usuario usuario, Oferta oferta,
                                                 enumDisponibilidadeSolucaoEducacional disponibilidade, ref DTODisponibilidadeSolucaoEducacional retorno)
 {
     if (disponibilidade == enumDisponibilidadeSolucaoEducacional.EfetuarMatricula)
     {
         if (oferta.ListaNiveisTrancados != null && oferta.ListaNiveisTrancados.Any(x => x.ID == usuario.NivelOcupacional.ID) && !VerificarTrancadoParaPagante(usuario))
         {
             retorno.TextoDisponibilidade  = "A oferta está trancada para pagamento, favor, efetuar o pagamento";
             retorno.CodigoDisponibilidade = (int)enumDisponibilidadeSolucaoEducacional.EfetuarPagamento;
             return(true);
         }
     }
     return(false);
 }