public async Task validarMediaAlunos(IEnumerable <long> idsAtividadesAvaliativas, IEnumerable <string> alunosId, Usuario usuario, string disciplinaId)
        {
            var dataAtual             = DateTime.Now;
            var notasConceitos        = repositorioNotasConceitos.ObterNotasPorAlunosAtividadesAvaliativas(idsAtividadesAvaliativas, alunosId, disciplinaId);
            var atividadesAvaliativas = repositorioAtividadeAvaliativa.ListarPorIds(idsAtividadesAvaliativas);

            var notasPorAvaliacoes            = notasConceitos.GroupBy(x => x.AtividadeAvaliativaID);
            var percentualAlunosInsuficientes = double.Parse(await mediator.Send(new ObterValorParametroSistemaTipoEAnoQuery(TipoParametroSistema.PercentualAlunosInsuficientes, DateTime.Today.Year)));

            foreach (var notasPorAvaliacao in notasPorAvaliacoes)
            {
                var atividadeAvaliativa = atividadesAvaliativas.FirstOrDefault(x => x.Id == notasPorAvaliacao.Key);
                var valoresConceito     = await repositorioConceito.ObterPorData(atividadeAvaliativa.DataAvaliacao);

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

                var ehTipoNota    = tipoNota.TipoNota == TipoNota.Nota;
                var notaParametro = await repositorioNotaParametro.ObterPorDataAvaliacao(atividadeAvaliativa.DataAvaliacao);

                var quantidadeAlunos            = notasPorAvaliacao.Count();
                var quantidadeAlunosSuficientes = 0;
                var turma = await repositorioTurma.ObterTurmaComUeEDrePorCodigo(atividadeAvaliativa.TurmaId);

                var periodosEscolares = await BuscarPeriodosEscolaresDaAtividade(atividadeAvaliativa);

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

                foreach (var nota in notasPorAvaliacao)
                {
                    var valorConceito = ehTipoNota ? valoresConceito.FirstOrDefault(a => a.Id == nota.ConceitoId):null;
                    quantidadeAlunosSuficientes += ehTipoNota ?
                                                   nota.Nota >= notaParametro.Media ? 1 : 0 :
                                                   valorConceito != null && valorConceito.Aprovado ? 1 : 0;
                }
                string mensagemNotasConceitos = $"<p>Os resultados da atividade avaliativa '{atividadeAvaliativa.NomeAvaliacao}' da turma {turma.Nome} da {turma.Ue.Nome} (DRE {turma.Ue.Dre.Nome}) no bimestre {periodoAtividade.Bimestre} de {turma.AnoLetivo} foram alterados " +
                                                $"pelo Professor {usuario.Nome} ({usuario.CodigoRf}) em {dataAtual.ToString("dd/MM/yyyy")} às {dataAtual.ToString("HH:mm")} estão abaixo da média.</p>" +
                                                $"<a href='{hostAplicacao}diario-classe/notas/{disciplinaId}/{periodoAtividade.Bimestre}'>Clique aqui para visualizar os detalhes.</a>";

                // Avalia se a quantidade de alunos com nota/conceito suficientes esta abaixo do percentual parametrizado para notificação
                if (quantidadeAlunosSuficientes < (quantidadeAlunos * percentualAlunosInsuficientes / 100))
                {
                    // Notifica todos os CPs da UE
                    foreach (var usuarioCP in usuariosCPs)
                    {
                        servicoNotificacao.Salvar(new Notificacao()
                        {
                            Ano       = atividadeAvaliativa.CriadoEm.Year,
                            Categoria = NotificacaoCategoria.Alerta,
                            DreId     = atividadeAvaliativa.DreId,
                            Mensagem  = mensagemNotasConceitos,
                            UsuarioId = usuarioCP.Id,
                            Tipo      = NotificacaoTipo.Notas,
                            Titulo    = $"Resultados de Atividade Avaliativa - Turma {turma.Nome}",
                            TurmaId   = atividadeAvaliativa.TurmaId,
                            UeId      = atividadeAvaliativa.UeId,
                        });
                    }
                }
            }
        }
        public async Task <double> ObterValorArredondado(DateTime data, double nota)
        {
            var notaParametro = await repositorioNotaParametro.ObterPorDataAvaliacao(data);

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

            return(notaParametro.Arredondar(nota));
        }