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."); } } }
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { int turmaId; classes.Turma turma; // Já verifica se o Id existe, está correto e existe no banco numa lapada só. // Aqui é assim, sou dessas. if (Request["Id"] != null && (int.TryParse(Request["Id"], out turmaId)) && (turma = new ManterTurma().ObterTurmaPorID(turmaId)) != null) { var usuarioLogado = new ManterUsuario().ObterUsuarioLogado(); if (usuarioLogado.IsAdministrador()) { Response.Redirect("GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID, true); return; } if (turma.ConsultorEducacional == null) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "A turma selecionada não possui Consultor Educacional.", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); return; } var avaliacao = turma.Avaliacoes.FirstOrDefault(); if (avaliacao != null) { switch (avaliacao.Status) { case enumStatusAvaliacao.AguardandoResposta: // Gestor só pode visualizar essa tela caso a avaliação exista e já tenha sido respondida pelo Consultor Educacional. if (usuarioLogado.IsGestor()) { ExibirMensagemAguardandoAvaliacao(turmaId); return; } if (turma.ConsultorEducacional.ID != usuarioLogado.ID) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Apenas o Consultor Educacional da turma pode avaliar a turma.", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); } break; case enumStatusAvaliacao.AguardandoGestor: if (usuarioLogado.IsGestor()) { if (usuarioLogado.UF.ID == turma.ConsultorEducacional.UF.ID) { btnEnviarAvaliacao.Visible = false; btnSalvar.Visible = false; btnAprovar.Visible = true; btnReprovar.Visible = true; BloquearCampos = true; break; } WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Apenas um gestor de " + turma.ConsultorEducacional.UF.Nome + " pode validar a avaliação desta turma.", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); return; } if (usuarioLogado.IsConsultorEducacional()) { BloquearCampos = true; // Bloqueia os campos, pois está aguardando análise do gestor. btnEnviarAvaliacao.Enabled = false; btnSalvar.Enabled = false; btnEnviarAvaliacao.Text = "Aguardando avaliação do gestor"; break; } WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Apenas o Consultor Educacional da turma pode avaliar a turma.", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); return; case enumStatusAvaliacao.Aprovada: BloquearCampos = true; break; default: throw new ArgumentOutOfRangeException(); } } else { if (turma.ConsultorEducacional.ID != usuarioLogado.ID) { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Apenas o Consultor Educacional da turma pode avaliar a turma.", "GerenciamentoMatricula.aspx?oferta=" + turma.Oferta.ID); return; } if (usuarioLogado.IsGestor()) { ExibirMensagemAguardandoAvaliacao(turmaId); return; } } ltrSolucaoEducacional.Text = turma.Oferta.SolucaoEducacional.Nome; var manterAvaliacao = new ManterAvaliacao(); var questoes = manterAvaliacao.ObterQuestoes().ToList(); QuantidadeQuestoes = questoes.Count(); Questoes = questoes; // Chamar o método ObterStatusDisponiveis() porque ele tem um comportamento semelhante // ao de um Singleton, e será usado posteriormente. ObterStatusDisponiveis(turma.Oferta.SolucaoEducacional.CategoriaConteudo, true); rptQuestoes.DataSource = questoes; rptQuestoes.DataBind(); rptMatriculas.DataSource = turma.ListaMatriculas.OrderBy(x => x.MatriculaOferta.Usuario.Nome); rptMatriculas.DataBind(); } else { WebFormHelper.ExibirMensagem(enumTipoMensagem.Erro, "Oferta inválida para avaliação. Tente novamente.", "GerenciamentoMatricula.aspx"); } } }
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); }