public async Task <NotaTipoValor> TipoNotaPorAvaliacao(AtividadeAvaliativa atividadeAvaliativa, bool consideraHistorico = false)
        {
            var notaTipo = await ObterNotaTipo(atividadeAvaliativa.TurmaId, atividadeAvaliativa.DataAvaliacao, consideraHistorico);

            if (notaTipo == null)
            {
                throw new NegocioException("Não foi encontrado tipo de nota para a avaliação informada");
            }

            return(notaTipo);
        }
        private void ValidarDataAvaliacaoECriador(AtividadeAvaliativa atividadeAvaliativa, string professorRf)
        {
            if (atividadeAvaliativa.DataAvaliacao.Date > DateTime.Today)
            {
                throw new NegocioException("Não é possivel atribuir notas/conceitos para avaliação(es) com data(s) futura(s)");
            }

            if (!atividadeAvaliativa.ProfessorRf.Equals(professorRf))
            {
                throw new NegocioException("Somente o professor que criou a avaliação, pode atribuir e/ou editar notas/conceitos");
            }
        }
 private void NotificarUsuarioAlteracaoExtemporanea(AtividadeAvaliativa atividadeAvaliativa, string mensagem, long usuarioId, string turmaNome)
 {
     servicoNotificacao.Salvar(new Notificacao()
     {
         Ano       = atividadeAvaliativa.CriadoEm.Year,
         Categoria = NotificacaoCategoria.Alerta,
         DreId     = atividadeAvaliativa.DreId,
         Mensagem  = mensagem,
         UsuarioId = usuarioId,
         Tipo      = NotificacaoTipo.Notas,
         Titulo    = $"Alteração em Atividade Avaliativa - Turma {turmaNome}",
         TurmaId   = atividadeAvaliativa.TurmaId,
         UeId      = atividadeAvaliativa.UeId,
     });
 }
        private async Task <IEnumerable <NotaConceito> > ValidarEObter(IEnumerable <NotaConceito> notasConceitos, AtividadeAvaliativa atividadeAvaliativa, IEnumerable <AlunoPorTurmaResposta> alunos, string professorRf, string disciplinaId,
                                                                       Usuario usuario, Turma turma)
        {
            var notasMultidisciplina     = new List <NotaConceito>();
            var alunosNotasExtemporaneas = new StringBuilder();
            var nota = notasConceitos.FirstOrDefault();

            var tipoNota = await TipoNotaPorAvaliacao(atividadeAvaliativa, atividadeAvaliativa.DataAvaliacao.Year != DateTime.Now.Year);

            var notaParametro = await repositorioNotaParametro.ObterPorDataAvaliacao(atividadeAvaliativa.DataAvaliacao);

            var dataAtual = DateTime.Now;

            // Verifica Bimestre Atual
            var dataPesquisa      = DateTime.Today;
            var periodosEscolares = await BuscarPeriodosEscolaresDaAtividade(atividadeAvaliativa);

            var periodoEscolarAtual     = periodosEscolares.FirstOrDefault(x => x.PeriodoInicio.Date <= dataPesquisa.Date && x.PeriodoFim.Date >= dataPesquisa.Date);
            var periodoEscolarAvaliacao = periodosEscolares.FirstOrDefault(x => x.PeriodoInicio.Date <= atividadeAvaliativa.DataAvaliacao.Date && x.PeriodoFim.Date >= atividadeAvaliativa.DataAvaliacao.Date);

            if (periodoEscolarAvaliacao == null)
            {
                throw new NegocioException("Período escolar da atividade avaliativa não encontrado");
            }

            var bimestreAvaliacao     = periodoEscolarAvaliacao.Bimestre;
            var existePeriodoEmAberto = periodoEscolarAtual != null && periodoEscolarAtual.Bimestre == periodoEscolarAvaliacao.Bimestre ||
                                        await repositorioPeriodoFechamento.ExistePeriodoPorUeDataBimestre(turma.UeId, DateTime.Today, bimestreAvaliacao);

            foreach (var notaConceito in notasConceitos)
            {
                if (notaConceito.Id > 0)
                {
                    notaConceito.Validar(professorRf);
                }

                var aluno = alunos.FirstOrDefault(a => a.CodigoAluno.Equals(notaConceito.AlunoId));

                if (aluno == null)
                {
                    throw new NegocioException($"Não foi encontrado aluno com o codigo {notaConceito.AlunoId}");
                }

                if (tipoNota.TipoNota == TipoNota.Nota)
                {
                    notaConceito.ValidarNota(notaParametro, aluno.NomeAluno);
                    if (notaParametro == null)
                    {
                        throw new NegocioException("Não foi possível localizar o parâmetro de nota.");
                    }
                }
                else
                {
                    var conceitos = await repositorioConceito.ObterPorData(atividadeAvaliativa.DataAvaliacao);

                    if (conceitos == null)
                    {
                        throw new NegocioException("Não foi possível localizar o parâmetro de conceito.");
                    }
                }

                notaConceito.TipoNota     = (TipoNota)tipoNota.Id;
                notaConceito.DisciplinaId = disciplinaId;
                if (atividadeAvaliativa.Categoria.Equals(CategoriaAtividadeAvaliativa.Interdisciplinar) && notaConceito.Id.Equals(0))
                {
                    var atividadeDisciplinas = repositorioAtividadeAvaliativaDisciplina.ListarPorIdAtividade(atividadeAvaliativa.Id).Result;
                    foreach (var atividade in atividadeDisciplinas)
                    {
                        if (!atividade.DisciplinaId.Equals(disciplinaId))
                        {
                            notasMultidisciplina.Add(new NotaConceito
                            {
                                AlunoId = notaConceito.AlunoId,
                                AtividadeAvaliativaID = notaConceito.AtividadeAvaliativaID,
                                DisciplinaId          = atividade.DisciplinaId,
                                Nota       = notaConceito.Nota,
                                ConceitoId = notaConceito.ConceitoId,
                                TipoNota   = notaConceito.TipoNota
                            });
                        }
                    }
                }

                if ((notaConceito.Id > 0) && (!existePeriodoEmAberto))
                {
                    alunosNotasExtemporaneas.AppendLine($"<li>{aluno.CodigoAluno} - {aluno.NomeAluno}</li>");
                }
            }

            if (alunosNotasExtemporaneas.ToString().Length > 0)
            {
                string mensagem = $"<p>Os resultados da atividade avaliativa '{atividadeAvaliativa.NomeAvaliacao}' da turma {turma.Nome} da {turma.Ue.Nome} (DRE {turma.Ue.Dre.Nome}) no bimestre {bimestreAvaliacao} de {turma.AnoLetivo} foram alterados " +
                                  $"pelo Professor {usuario.Nome} ({usuario.CodigoRf}) em {dataAtual.ToString("dd/MM/yyyy")} às {dataAtual.ToString("HH:mm")} para os seguintes alunos:</p><br/>{alunosNotasExtemporaneas.ToString()}" +
                                  $"<a href='{hostAplicacao}diario-classe/notas/{nota.DisciplinaId}/{bimestreAvaliacao}'>Clique aqui para visualizar os detalhes.</a>";

                foreach (var usuarioCP in usuariosCPs)
                {
                    NotificarUsuarioAlteracaoExtemporanea(atividadeAvaliativa, mensagem, usuarioCP.Id, turma.Nome);
                }

                NotificarUsuarioAlteracaoExtemporanea(atividadeAvaliativa, mensagem, usuarioDiretor.Id, turma.Nome);
            }

            var result = notasConceitos.ToList();

            result.AddRange(notasMultidisciplina);
            return(result);
        }
        private async Task <IEnumerable <PeriodoEscolar> > BuscarPeriodosEscolaresDaAtividade(AtividadeAvaliativa atividadeAvaliativa)
        {
            var dataFinal = atividadeAvaliativa.DataAvaliacao.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
            var aula      = await repositorioAula.ObterAulaIntervaloTurmaDisciplina(atividadeAvaliativa.DataAvaliacao, dataFinal, atividadeAvaliativa.TurmaId, atividadeAvaliativa.Id);

            if (aula == null)
            {
                throw new NegocioException($"Não encontrada aula para a atividade avaliativa '{atividadeAvaliativa.NomeAvaliacao}' no dia {atividadeAvaliativa.DataAvaliacao.Date.ToString("dd/MM/yyyy")}");
            }

            IEnumerable <PeriodoEscolar> periodosEscolares = await repositorioPeriodoEscolar.ObterPorTipoCalendario(aula.TipoCalendarioId);

            return(periodosEscolares);
        }