public async Task<IEnumerable<PeriodoEscolar>> Handle(ObterPeriodosEscolaresPorTipoCalendarioQuery request, CancellationToken cancellationToken)
     => await periodoEscolarRepository.ObterPeriodosEscolaresPorTipoCalendario(request.TipoCalendarioId);
        public async Task <FrequenciaAluno> Handle(ObterFrequenciaAlunoQuery request, CancellationToken cancellationToken)
        {
            var tipoCalendarioId = await tipoCalendarioRepository.ObterPorAnoLetivoEModalidade(
                request.Turma.AnoLetivo,
                request.Turma.ModalidadeTipoCalendario,
                request.Turma.Semestre);

            var frequenciaAluno = new FrequenciaAluno();

            if (request.PeriodoEscolar != null)
            {
                // Frequencia do bimestre
                frequenciaAluno = await frequenciaRepository.ObterPorAlunoDataDisciplina(request.CodigoAluno,
                                                                                         request.PeriodoEscolar.PeriodoFim,
                                                                                         TipoFrequenciaAluno.PorDisciplina,
                                                                                         request.ComponenteCurricularCodigo,
                                                                                         request.Turma.Codigo);

                if (frequenciaAluno != null)
                {
                    return(frequenciaAluno);
                }

                return(new FrequenciaAluno()
                {
                    TotalAulas = await aulaRepository.ObterAulasDadas(request.Turma.Codigo,
                                                                      request.ComponenteCurricularCodigo,
                                                                      tipoCalendarioId,
                                                                      request.PeriodoEscolar.Bimestre)
                });
            }
            else
            {
                var periodosEscolaresTurma = await periodoEscolarRepository.ObterPeriodosEscolaresPorTipoCalendario(tipoCalendarioId);

                foreach (var periodoEscolarTurma in periodosEscolaresTurma)
                {
                    var frequenciaAlunoPeriodo = await frequenciaRepository.ObterPorAlunoBimestreAsync(request.CodigoAluno,
                                                                                                       periodoEscolarTurma.Bimestre,
                                                                                                       TipoFrequenciaAluno.PorDisciplina,
                                                                                                       request.ComponenteCurricularCodigo,
                                                                                                       request.Turma.Codigo);

                    frequenciaAluno.AdicionarFrequenciaBimestre(periodoEscolarTurma.Bimestre, frequenciaAlunoPeriodo != null ? frequenciaAlunoPeriodo.PercentualFrequencia : 100);

                    if (frequenciaAlunoPeriodo != null)
                    {
                        frequenciaAluno.Id                 = frequenciaAlunoPeriodo.Id;
                        frequenciaAluno.TotalAulas        += frequenciaAlunoPeriodo.TotalAulas;
                        frequenciaAluno.TotalAusencias    += frequenciaAlunoPeriodo.TotalAusencias;
                        frequenciaAluno.TotalCompensacoes += frequenciaAlunoPeriodo.TotalCompensacoes;
                    }
                    else
                    {
                        // Se não tem ausencia não vai ter registro de frequencia então soma apenas aulas do bimestre
                        frequenciaAluno.TotalAulas += await aulaRepository.ObterAulasDadas(request.Turma.Codigo,
                                                                                           request.ComponenteCurricularCodigo,
                                                                                           tipoCalendarioId,
                                                                                           periodoEscolarTurma.Bimestre);
                    }
                }

                return(frequenciaAluno);
            }
        }