public async Task <int> AdicionarProvaAsync(ProvaInputData provaInputData, string login) { var aluno = _alunoRepository.ObterPorLogin(login); var avaliacao = await _avaliacaoRepository.ObterComQuestoresAsync(provaInputData.AvaliacaoId); Prova prova = new Prova(); prova.AlunoId = aluno.Id; prova.AvaliacaoId = provaInputData.AvaliacaoId; prova.DataProva = DateTime.Now; prova.Aluno = aluno; prova.Avaliacao = avaliacao; foreach (var questao in provaInputData.Questoes) { //prova.QuestoesProva = new List<QuestaoProva>(); var questaoProva = new QuestaoProva() { QuestaoId = questao.QuestaoId }; prova.QuestoesProva = new List <QuestaoProva>(); prova.QuestoesProva.Add(questaoProva); foreach (var opcao in questao.Opcoes) { //questaoProva.OpcoesProva = new List<OpcaoProva>(); var opcaoProva = new OpcaoProva() { OpcaoAvaliacaoId = opcao.OpcaoAvaliacaoId, Resposta = opcao.Resposta }; questaoProva.OpcoesProva = new List <OpcaoProva>(); questaoProva.OpcoesProva.Add(opcaoProva); } } //var avaliacao = await _avaliacaoRepository.ObterComQuestoresAsync(provaInputData.AvaliacaoId); foreach (var questao in prova.QuestoesProva) { var questaoAvaliacao = avaliacao.Questoes.Find(y => y.Id == questao.QuestaoId); if (questaoAvaliacao.Tipo == 1) { var idVerdadeira = questaoAvaliacao.Opcoes.Find(x => x.Verdadeira).Id; questao.Nota = questao.OpcoesProva.Find(y => y.OpcaoAvaliacaoId == idVerdadeira && y.Resposta) == null ? 0 : 1; } if (questaoAvaliacao.Tipo == 2) { var respostas = 0; foreach (var opcoes in questao.OpcoesProva) { if (opcoes.Resposta == questaoAvaliacao.Opcoes.Find(x => x.Id == opcoes.OpcaoAvaliacaoId).Verdadeira) { respostas++; } } if (respostas != 0) { questao.Nota = (decimal)respostas / (decimal)questaoAvaliacao.Opcoes.Count; } else { questao.Nota = respostas; } } } avaliacao.Provas = new List <Prova>(); _provaRepository.Adicionar(prova); await _provaRepository.SaveChangesAsync(); return(prova.Id); }
public async Task <int> SalvarProvaAsync(ProvaQueryResult prova, string login) { var aluno = await _alunoRepository.ObterPorLogin(login); if (aluno == null) { throw new Exception("O aluno não foi localizado!"); } var publicacao = await _publicacaoRepository.ObterComRelacoesAsync(prova.PublicacaoId); if (publicacao == null) { throw new Exception("A publicacao não foi localizada!"); } if (publicacao.DataInicio >= DateTime.Now || publicacao.DataFim <= DateTime.Now) { throw new Exception("Prova fora da data de realização!"); } if (!publicacao.Turma.Alunos.Select(a => a.Id).ToList().Contains(aluno.Id)) { throw new Exception("Publicação não disponível para esse aluno!"); } var Novaprova = new Prova() { IdAluno = aluno.Id, IdPublicacao = publicacao.Id, IdAvaliacao = publicacao.IdAvaliacao, CriadoEm = DateTime.Now, AtualizadoEm = DateTime.Now, Questoes = prova.Questoes.Select(q => new ProvaQuestao { IdAvaliacaoQuestao = q.QuestaoId, IdProva = 0, Nota = 0, AtualizadoEm = DateTime.Now, CriadoEm = DateTime.Now, }).ToList() }; Avaliacao av = publicacao.Avaliacao; for (int i = 0; i < av.Questoes.Count; i++) { Novaprova.Questoes[i].Opcoes = new List <ProvaOpcao>(); if (av.Questoes[i].Tipo == 1) { for (int j = 0; j < av.Questoes[i].Opcoes.Count; j++) { AvaliacaoOpcao op = av.Questoes[i].Opcoes[j]; OpcaoProvaQueryResult opResposta = prova.Questoes[i].Opcoes[j]; Novaprova.Questoes[i].Opcoes.Add(new ProvaOpcao { IdAvaliacaoOpcao = opResposta.OpcaoAvaliacaoId, Resposta = opResposta.Resposta }); if (op.Resposta == opResposta.Resposta) { Novaprova.Questoes[i].Nota = 1; } } } else { double valorOpcao = 1.0 / av.Questoes[i].Opcoes.Count(); for (int j = 0; j < av.Questoes[i].Opcoes.Count; j++) { AvaliacaoOpcao op = av.Questoes[i].Opcoes[j]; OpcaoProvaQueryResult opResposta = prova.Questoes[i].Opcoes[j]; Novaprova.Questoes[i].Opcoes.Add(new ProvaOpcao { IdAvaliacaoOpcao = opResposta.OpcaoAvaliacaoId, Resposta = opResposta.Resposta }); if (op.Resposta == opResposta.Resposta) { Novaprova.Questoes[i].Nota += valorOpcao; } } } } _provaRepository.Adicionar(Novaprova); await _provaRepository.SaveChangesAsync(); return(Novaprova.Id); }