protected void btnEnviarAvaliacao_OnClick(object sender, EventArgs e) { if (BloquearCampos) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Não é possível alterar esta avaliação, pois ela está bloqueada."); return; } // Salvar os dados da tela antes de enviar, só para se certificar. btnSalvar_OnClick(null, null); // O evento de salvar persiste a avaliação salva na variável AvaliacaoSalva. var avaliacao = AvaliacaoSalva; var manterAvaliacao = new ManterAvaliacao(); var qtQuestoes = manterAvaliacao.ObterQuestoes().Count(); var qtMatriculas = ObterTurma().ListaMatriculas.Count(); var manterUsuario = new ManterUsuario(); var usuarioLogado = manterUsuario.ObterUsuarioLogado(); if (avaliacao.Status == enumStatusAvaliacao.AguardandoResposta) { if (avaliacao.IsRespondido(qtQuestoes, qtMatriculas) && usuarioLogado.IsConsultorEducacional()) { var template = new ManterTemplate().ObterTemplatePorID((int)enumTemplate.AvaliacaoGestor); if (template == null) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Não foi possível enviar e-mail ao gestor. Tente novamente."); return; } // Obter todos os gestores da UF do usuário logado. var usuarioFiltro = new classes.Usuario { ListaPerfil = new List <classes.UsuarioPerfil> { new classes.UsuarioPerfil { Perfil = new classes.Perfil { ID = (int)enumPerfil.GestorUC } } }, UF = new classes.Uf { ID = usuarioLogado.UF.ID } }; var gestores = manterUsuario.ObterPorFiltro(usuarioFiltro) .Where(x => x.Email != null && x.Email != "") // Selecionar somente os campos que interessam. .Select(x => new classes.Usuario { Email = x.Email, Nome = x.Nome }) .ToList(); // Caso não haja gestores para atualizar, notifica o usuário e impede a alteração. if (!gestores.Any()) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Não há gestor na UF " + usuarioLogado.UF.Sigla + " para validar a avaliação dos alunos."); return; } var manterEmail = new ManterEmail(); var textoTemplate = template.TextoTemplate; // Reza a lenda que cada oferta desses cursos só possui uma turma. Vamos torcer para isso ser verdade. var turma = avaliacao.Turma; textoTemplate = textoTemplate // Substituir o nome da solução duas vezes porque tem duas tags de solução. .Replace("#SOLUCAO", turma.Oferta.SolucaoEducacional.Nome) .Replace("#SOLUCAO", turma.Oferta.SolucaoEducacional.Nome) .Replace("#OFERTA", turma.Oferta.Nome) .Replace("#TURMA", turma != null ? turma.Nome : "") .Replace("#CONSULTOR", turma != null && turma.ConsultorEducacional != null ? turma.ConsultorEducacional.Nome : ""); // Executa o envio de e-mails via Threading para deixar o fluxo mais rápido. var thread = new Thread(() => { foreach (var gestor in gestores) { try { var templateFinal = textoTemplate.Replace("#GESTOR", gestor.Nome); manterEmail.EnviarEmail(gestor.Email, template.Assunto ?? template.DescricaoTemplate, templateFinal); } catch (Exception) { // Ignored. } } }) { IsBackground = true }; thread.Start(); avaliacao.Status = enumStatusAvaliacao.AguardandoGestor; manterAvaliacao.Salvar(avaliacao); WebFormHelper.ExibirMensagem(enumTipoMensagem.Sucesso, "Avaliação enviada ao gestor e aguardando análise.", "GerenciamentoMatricula.aspx?oferta=" + avaliacao.Turma.Oferta.ID); } else { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Você precisa responder todas as questões antes de enviar sua avaliação ao Gestor."); } } }
private void ValidarAvaliacao(bool aprovar) { try { var turma = ObterTurma(); var usuarioLogado = new ManterUsuario().ObterUsuarioLogado(); if (UsuarioPodeValidarAvaliacao(turma, usuarioLogado)) { var avaliacao = turma.Avaliacoes.FirstOrDefault(); if (avaliacao != null) { var manterMatriculaOferta = new ManterMatriculaOferta(); var manterAvaliacao = new ManterAvaliacao(); var emailsAlunos = new List <string>(); // Alterar status das matrículas. foreach (var respostaId in avaliacao.Respostas.Where(x => x.Questao.Tipo == enumTipoQuestao.Resultado).Select(x => x.ID)) { // Busca a resposta denovo do banco pois o NHibernate tá pirando com o Lazy. var resposta = manterAvaliacao.ObterQuestaoRespostaPorId(respostaId); var matricula = resposta.MatriculaTurma.MatriculaOferta; // Adicionar emails para envio posterior. if (aprovar && !string.IsNullOrWhiteSpace(matricula.Usuario.Email)) { emailsAlunos.Add(matricula.Usuario.Email); } if (resposta.StatusMatricula != null) { matricula.StatusMatricula = (enumStatusMatricula)resposta.StatusMatricula.ID; manterMatriculaOferta.Salvar(matricula); } } // Mandar e-mail aos alunos caso a avaliação seja aprovada. if (aprovar) { var manterEmail = new ManterEmail(); var template = new ManterTemplate().ObterTemplatePorID((int)enumTemplate.ResultadoAvaliacao); var thread = new Thread(() => { foreach (var email in emailsAlunos) { manterEmail.EnviarEmail(email, template.Assunto ?? template.DescricaoTemplate, template.TextoTemplate); } }) { IsBackground = true }; thread.Start(); } // Finalizar status da avaliação e setar o usuário que analisou. avaliacao.Status = aprovar ? enumStatusAvaliacao.Aprovada : enumStatusAvaliacao.AguardandoResposta; avaliacao.Analista = usuarioLogado; manterAvaliacao.Salvar(avaliacao); WebFormHelper.ExibirMensagem(enumTipoMensagem.Sucesso, "Avaliação " + (!aprovar ? "não" : "") + " aprovada com sucesso", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); return; } } } catch (Exception) { // ignored. } WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Houve um erro na validação da avaliação. Tente novamente."); }
private classes.Avaliacao ObterObjetoAvaliacao(ManterAvaliacao manterAvaliacao = null) { manterAvaliacao = manterAvaliacao ?? new ManterAvaliacao(); var questoes = manterAvaliacao.ObterQuestoes().ToList(); var turma = ObterTurma(); var avaliacao = turma.Avaliacoes.FirstOrDefault() ?? new classes.Avaliacao { Turma = turma }; var respostas = new List <classes.QuestaoResposta>(); // Salvar de acordo com os dados preenchidos na tela e recarregar a tela. foreach (RepeaterItem repeaterMatriculasItem in rptMatriculas.Items) { int matriculaId; if (int.TryParse(((HiddenField)repeaterMatriculasItem.FindControl("hdnIdMatriculaTurma")).Value, out matriculaId)) { var rptQuestaoResposta = (Repeater)repeaterMatriculasItem.FindControl("rptQuestaoResposta"); foreach (RepeaterItem repeaterQuestaoRespostaItem in rptQuestaoResposta.Items) { //var repeaterQuestaoRespostaItem = rptQuestaoResposta.Controls[j]; int idQuestaoResposta; int.TryParse( ((HiddenField)repeaterQuestaoRespostaItem.FindControl("hdnIdQuestaoResposta")).Value, out idQuestaoResposta); var questaoResposta = idQuestaoResposta == 0 ? new classes.QuestaoResposta() : questoes.SelectMany(x => x.Respostas).FirstOrDefault(x => x.ID == idQuestaoResposta) ?? new classes.QuestaoResposta(); var matriculaTurma = turma.ListaMatriculas.FirstOrDefault(x => x.ID == matriculaId); questaoResposta.MatriculaTurma = matriculaTurma != null ? matriculaTurma : null; int idQuestao; int.TryParse( ((HiddenField)repeaterQuestaoRespostaItem.FindControl("hdnIdQuestao")).Value, out idQuestao); questaoResposta.Questao = questoes.FirstOrDefault(x => x.ID == idQuestao); if (questaoResposta.Questao == null) { throw new AcademicoException("Erro na montagem das respostas da questão. Contacte o suporte técnico ou atualize a tela e tente novamente."); } switch (questaoResposta.Questao.Tipo) { case enumTipoQuestao.Dominio: enumDominio?dominio; try { var dominioId = int.Parse( ((DropDownList)repeaterQuestaoRespostaItem.FindControl("ddlDominio")) .SelectedValue); dominio = dominioId == 0 ? null : (enumDominio?)dominioId; } catch (Exception) { dominio = null; } questaoResposta.Dominio = dominio; break; case enumTipoQuestao.Dissertativa: var dissercao = ((TextBox)repeaterQuestaoRespostaItem.FindControl("txtDissertativo")).Text; questaoResposta.Comentario = string.IsNullOrWhiteSpace(dissercao) ? null : dissercao; break; case enumTipoQuestao.Resultado: int statusId; int.TryParse(((DropDownList)repeaterQuestaoRespostaItem.FindControl("ddlStatus")).SelectedValue, out statusId); var status = statusId == 0 ? null : ObterStatusDisponiveis().FirstOrDefault(x => x.ID == statusId); questaoResposta.StatusMatricula = status == null ? null : new classes.StatusMatricula { ID = status.ID }; break; default: throw new ArgumentOutOfRangeException(); } manterAvaliacao.Salvar(questaoResposta); respostas.Add(questaoResposta); } } else { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Houve um erro ao tentar salvar as matrículas. Tente novamente ou contacte o suporte técnico."); } } // Salvar a avaliação antes caso esteja criando uma nova. Está aqui no método ObterObjetoAvaliacao() porque sempre usa a mesma avaliação da Oferta. if (avaliacao.ID == 0) { manterAvaliacao.Salvar(avaliacao); } avaliacao.Respostas = respostas; // Salvar as associações da avaliação com as respostas. manterAvaliacao.Salvar(avaliacao); return(avaliacao); }