public void vinculaMatriculaOferta(MatriculaOferta matriculaOferta)
        {
            matriculaOferta = new ManterMatriculaOferta().ObterMatriculaOfertaPorID(matriculaOferta.ID);

            // VERIFICA SE MATRICULA OFERTA PERTENCE A ALGUM ITEM TRILHA
            if (!matriculaOferta.ListaItemTrilhaParticipacao.Any())
            {
                //BUSCA A LISTA DE TURMAS DA MESMA OFERTA CONTINUA
                var turmasOfertaID = new ManterTurma().ObterTodosIQueryable()
                                     .Where(x => x.Oferta.ID == matriculaOferta.Oferta.ID)
                                     .Select(x => x.ID).ToList();

                //BUSCA A LISTA DE MATRICULAS OFERTA DO USUARIO POR TURMA
                var matriculasOfertaID = new ManterMatriculaTurma().ObterTodosIQueryable()
                                         .Where(x => turmasOfertaID.Contains(x.Turma.ID) && matriculaOferta.Usuario.ID == x.MatriculaOferta.Usuario.ID)
                                         .Select(y => y.MatriculaOferta.ID)
                                         .ToList();

                var itemTrilhaParticipacaoUsuario = new ManterItemTrilhaParticipacao().ObterTodosIQueryable()
                                                    .FirstOrDefault(x => matriculasOfertaID.Contains(x.MatriculaOferta.ID) && x.Autorizado == false);

                if (itemTrilhaParticipacaoUsuario != null)
                {
                    itemTrilhaParticipacaoUsuario.MatriculaOferta = matriculaOferta;
                    Salvar(itemTrilhaParticipacaoUsuario);
                }
            }
        }
        public void AtualizarStatusParticipacoesTrilhas(MatriculaOferta matriculaOferta)
        {
            matriculaOferta = new ManterMatriculaOferta().ObterMatriculaOfertaPorID(matriculaOferta.ID);

            List <ItemTrilhaParticipacao> participacoes;

            try
            {
                participacoes = matriculaOferta.ListaItemTrilhaParticipacao.ToList();
            }
            catch
            {
                try
                {
                    participacoes = new ManterMatriculaOferta().ObterMatriculaOfertaPorID(matriculaOferta.ID).ListaItemTrilhaParticipacao.ToList();
                }
                catch (Exception)
                {
                    throw new AcademicoException("Erro ao atualizar participação na Solução Sebrae de Trilhas.");
                }
            }


            // Verificar se a matrícula do aluno está vinculada a algum ItemTrilhaParticipacao e altera a participação de acordo.
            if (participacoes.Any())
            {
                var participacao = participacoes.LastOrDefault();

                if (participacao == null)
                {
                    throw new AcademicoException("Item Trilha Participação inválido para a matrícula.");
                }

                var anterior = participacoes.LastOrDefault(x => x.ID != participacao.ID);

                bool?autorizacaoAnterior = (anterior != null) ? anterior.Autorizado : false;

                participacao.Autorizado = IsAutorizado(participacao.MatriculaOferta, participacao.Autorizado);

                if (autorizacaoAnterior == false && participacao.Autorizado == true)
                {
                    participacao.DataAvaliacao = DateTime.Now;
                    participacao.DataEnvio     = DateTime.Now;
                }

                Salvar(participacao);

                if (autorizacaoAnterior == false && participacao.Autorizado == true)
                {
                    new ManterTrilhaTopicoTematicoParticipacao().IncluirUltimaParticipacao(participacao.UsuarioTrilha, participacao.ItemTrilha);
                    new ManterUsuarioTrilhaMoedas().Incluir(participacao.UsuarioTrilha, participacao.ItemTrilha, null, 0,
                                                            participacao.ItemTrilha.Moedas ?? 0);
                }
            }
        }
        public void IncluirItemTrilhaParticipacao(ItemTrilhaParticipacao pItemTrilhaParticipacao)
        {
            if (pItemTrilhaParticipacao != null && pItemTrilhaParticipacao.MatriculaOferta.IsCancelado())
            {
                var currentMatriculaOferta = new ManterMatriculaOferta()
                                             .ObterTodosIQueryable()
                                             .LastOrDefault(x => x.Usuario.ID == pItemTrilhaParticipacao.MatriculaOferta.Usuario.ID &&
                                                            x.Oferta.SolucaoEducacional.ID == pItemTrilhaParticipacao.MatriculaOferta.Oferta.SolucaoEducacional.ID &&
                                                            (!x.IsCancelado() && x.StatusMatricula == enumStatusMatricula.Inscrito));

                if (currentMatriculaOferta != null)
                {
                    pItemTrilhaParticipacao.MatriculaOferta = currentMatriculaOferta;
                }
            }

            _bmItemTrilhaParticipacao.ValidarItemTrilhaParticipacaoInformado(pItemTrilhaParticipacao);
            //PreencherInformacoesDeAuditoria(pItemTrilhaParticipacao);
            _bmItemTrilhaParticipacao.Salvar(pItemTrilhaParticipacao);
        }