public async Task <ActionResult> Corrigir([Bind(Include = "RespostaID,UsuarioID,CandidatoID,QuestaoID,GradeEscolhida,RespostaGradeEscolhida,RespostaNota")] RespostaVM vm, byte[] RespostaControleVersao) { _logger.LogInformation($"****** "); _logger.LogInformation($"{Session.Ler<Usuario>("USUARIO").UsuarioCPF} está tentando atualizar a resposta #{vm.RespostaID}"); _logger.LogInformation($"****** "); if (vm == null || vm.RespostaID == 0) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } //O corretor deverá poder selecionar apenas uma das notas na grade de correção. Após salvar o documento atual, o sistema deve retornar um outro documento aleatoriamente para o corretor. Resposta respostaParaAtualizar = await _repository.ProcurarAsync(vm.RespostaID); vm.Questao = respostaParaAtualizar.Questao; vm.Usuario = respostaParaAtualizar.Usuario; vm.Candidato = respostaParaAtualizar.Candidato; vm.RespostaControleVersao = RespostaControleVersao; vm.RespostaImagem = respostaParaAtualizar.RespostaImagem; #region verificar se foi apagado if (respostaParaAtualizar == null) { Resposta respostaApagada = new Resposta(); TryUpdateModel(respostaApagada); _logger.LogInformation($"****** "); _logger.LogInformation($"****** {Session.Ler<Usuario>("USUARIO").UsuarioCPF} tentou corrigir a resposta #{vm.RespostaID} com nota {respostaParaAtualizar.RespostaNota} mas já havia sido apagada anteriormente."); _logger.LogInformation($"****** "); ModelState.AddModelError(string.Empty, "Não foi possível salvar as mudanças. A resposta foi apagada."); return(View(vm)); } #endregion #region validação de negócio if (!(vm.RespostaGradeEscolhida >= 1 && vm.RespostaGradeEscolhida <= 4)) { ModelState.AddModelError(string.Empty, $"Selecione a grade desejada"); return(View(vm)); } if (vm.RespostaGradeEscolhida == 1 && !(vm.RespostaNota >= 0 && vm.RespostaNota <= vm.Questao.QuestaoGradeFidelidadeAoTema)) { ModelState.AddModelError(string.Empty, $"O intervalo válido para Fidelidade Ao Tema é {0,00} a {vm.Questao.QuestaoGradeFidelidadeAoTema}"); return(View(vm)); } else if (vm.RespostaGradeEscolhida == 2 && !(vm.RespostaNota >= 0 && vm.RespostaNota <= vm.Questao.QuestaoGradeOrganizacaoIdeias)) { ModelState.AddModelError(string.Empty, $"O intervalo válido para Organização de ideias é {0,00} a {vm.Questao.QuestaoGradeOrganizacaoIdeias}"); return(View(vm)); } else if (vm.RespostaGradeEscolhida == 3 && !(vm.RespostaNota >= 0 && vm.RespostaNota <= vm.Questao.QuestaoGradeNivelDeLinguagem)) { ModelState.AddModelError(string.Empty, $"O intervalo válido para Nível de linguagem é {0,00} a {vm.Questao.QuestaoGradeNivelDeLinguagem}"); return(View(vm)); } else if (vm.RespostaGradeEscolhida == 4 && !(vm.RespostaNota >= 0 && vm.RespostaNota <= vm.Questao.QuestaoGradeDominioDasRegras)) { ModelState.AddModelError(string.Empty, $"O intervalo válido para Domínio das regras é {0,00} a {vm.Questao.QuestaoGradeDominioDasRegras}"); return(View(vm)); } if (vm.RespostaNotaConcluida.HasValue && vm.RespostaNotaConcluida.Value) { _logger.LogInformation($"****** "); _logger.LogInformation($"****** {Session.Ler<Usuario>("USUARIO").UsuarioCPF} tentou corrigir a resposta #{vm.RespostaID} com nota {respostaParaAtualizar.RespostaNota} mas uma nota já havia sido definida anteriormente."); _logger.LogInformation($"****** "); ModelState.AddModelError(string.Empty, "Uma nota já foi atribuída a esta avaliação."); return(View(vm)); } #endregion try { if (TryUpdateModel(respostaParaAtualizar, new string[] { "RespostaID", "UsuarioID", "CandidatoID", "QuestaoID", "RespostaGradeEscolhida", "RespostaNota", "RespostaControleVersao" })) { if (ModelState.IsValid) { respostaParaAtualizar.RespostaNotaConcluida = true; await _repository.AlterarAsync(respostaParaAtualizar, RespostaControleVersao); _repository.Recarregar(respostaParaAtualizar); _logger.LogInformation($"****** "); _logger.LogInformation($"****** {Session.Ler<Usuario>("USUARIO").UsuarioCPF} corrigiu a resposta #{vm.RespostaID} com nota {respostaParaAtualizar.RespostaNota}"); _logger.LogInformation($"****** "); //levamos professor para corrigir outra prova de modo aleatorio try { Resposta r = await _repository.GetRandom(); return(RedirectToAction("Corrigir", new { id = r.RespostaID })); } catch (Exception /*ex*/) { //se random falhar, podem ter acabado as respostas para corrigir return(RedirectToAction("CorrigirRespostas")); } } else { ModelState.AddModelError(string.Empty, "Não foi possível salvar as mudanças. Por favor verifique os dados informados."); } } else { ModelState.AddModelError(string.Empty, "Não foi possível salvar as mudanças. Por favor verifique os dados informados."); } } catch (DbUpdateConcurrencyException /*dbex*/) { ModelState.AddModelError(string.Empty, "Não foi possível salvar as mudanças pois outro professor acabou de modificar esta resposta! Tente mais tarde."); } catch (RetryLimitExceededException /*dex*/) { ModelState.AddModelError("", "Não foi possível salvar os dados. Entre em contato com o administrator."); } return(View(vm)); }