private async Task TrataUes(IEnumerable <RelatorioParecerConclusivoRetornoDto> parecesParaTratar, RelatorioParecerConclusivoDreDto dreParaAdicionar, int anoLetivo,
                                    long dreId, string ueCodigoEnviado, long cicloIdEnviado, int modalidadeId, int?semestre, string[] anos, long parecerConclusivoId)
        {
            List <Ue> uesDaDre = new List <Ue>();

            if (string.IsNullOrEmpty(ueCodigoEnviado))
            {
                uesDaDre = (await mediator.Send(new ObterUesPorDreSemestreModadalidadeAnoIdQuery(dreId, semestre, modalidadeId, anos))).ToList();
            }
            else
            {
                var ue = await mediator.Send(new ObterUePorCodigoQuery(ueCodigoEnviado));

                uesDaDre.Add(ue);
            }

            foreach (var ueDaDre in uesDaDre)
            {
                var ueParaAdicionar = new RelatorioParecerConclusivoUeDto();
                ueParaAdicionar.Nome   = ueDaDre.NomeComTipoEscola;
                ueParaAdicionar.Codigo = ueDaDre.Codigo;

                await TrataCiclosDaUe(parecesParaTratar, ueDaDre.Id, ueParaAdicionar, anoLetivo, modalidadeId, cicloIdEnviado, anos, parecerConclusivoId);

                dreParaAdicionar.Ues.Add(ueParaAdicionar);
            }
        }
        private async Task TrataCiclosDaUe(IEnumerable <RelatorioParecerConclusivoRetornoDto> parecesParaTratar, long ueId, RelatorioParecerConclusivoUeDto ueParaAdicionar, int anoLetivo, int modalidadeId, long cicloIdEnviado,
                                           string[] anosEnviado, long parecerConclusivoId)
        {
            var ciclosDaUe = await mediator.Send(new ObterCiclosPorUeIdQuery(ueId));

            if (cicloIdEnviado > 0)
            {
                ciclosDaUe = ciclosDaUe.Where(a => a.Id == cicloIdEnviado).ToList();
            }

            if (anosEnviado != null && anosEnviado.Length > 0)
            {
                ciclosDaUe = ciclosDaUe.Where(a => anosEnviado.Contains(a.Ano.ToString())).ToList();
            }

            if (modalidadeId > 0)
            {
                ciclosDaUe = ciclosDaUe.Where(a => (int)a.Modalidade == modalidadeId).ToList();
            }

            foreach (var cicloDaUeAgrupado in ciclosDaUe.OrderBy(a => a.Id).GroupBy(a => a.Descricao))
            {
                var cicloParaAdicionar = new RelatorioParecerConclusivoCicloDto();
                cicloParaAdicionar.Codigo = "";
                cicloParaAdicionar.Nome   = cicloDaUeAgrupado.Key;

                foreach (var cicloAgrupado in cicloDaUeAgrupado.ToList())
                {
                    var anoParaIncluir = new RelatorioParecerConclusivoAnoDto();

                    anoParaIncluir.Nome = cicloAgrupado.Ano + "º Ano";

                    var turmasFiltradas = await mediator.Send(new ObterTurmasPorUeCicloAnoQuery(cicloAgrupado.Id, cicloAgrupado.Ano.ToString(), ueId, anoLetivo));

                    var alunosDasTurmas = await turmaRepository.ObterAlunosPorTurmas(turmasFiltradas.Select(a => long.Parse(a.Codigo)));

                    foreach (var turma in turmasFiltradas)
                    {
                        foreach (var alunoDaTurma in alunosDasTurmas.Where(a => a.CodigoTurma == int.Parse(turma.Codigo)).OrderBy(a => a.ObterNomeFinal()))
                        {
                            var parecerParaIncluir           = new RelatorioParecerConclusivoAlunoDto();
                            var numeroAlunoChamadaConvertido = String.IsNullOrEmpty(alunoDaTurma.NumeroAlunoChamada) ? "" : Int32.Parse(alunoDaTurma.NumeroAlunoChamada).ToString();
                            parecerParaIncluir.AlunoCodigo        = alunoDaTurma.CodigoAluno.ToString();
                            parecerParaIncluir.AlunoNomeCompleto  = alunoDaTurma.ObterNomeFinal();
                            parecerParaIncluir.AlunoNumeroChamada = numeroAlunoChamadaConvertido;
                            parecerParaIncluir.TurmaNome          = turma.Nome;

                            var parecerFiltradoParaIncluir = parecesParaTratar.FirstOrDefault(a => a.TurmaId.ToString() == turma.Codigo &&
                                                                                              a.AlunoCodigo == alunoDaTurma.CodigoAluno && a.Ano == cicloAgrupado.Ano.ToString() &&
                                                                                              a.CicloId == cicloAgrupado.Id);

                            if (parecerFiltradoParaIncluir != null || parecerConclusivoId == 0 ||
                                (parecerFiltradoParaIncluir == null && parecerConclusivoId < 0))
                            {
                                parecerParaIncluir.ParecerConclusivoDescricao = parecerFiltradoParaIncluir == null ?
                                                                                "Sem Parecer" : parecerFiltradoParaIncluir.ParecerConclusivo;
                                anoParaIncluir.PareceresConclusivos.Add(parecerParaIncluir);
                            }
                        }
                    }

                    if (anoParaIncluir.PareceresConclusivos.Any())
                    {
                        cicloParaAdicionar.Anos.Add(anoParaIncluir);
                    }
                }

                if (cicloParaAdicionar.Anos.Any())
                {
                    ueParaAdicionar.Ciclos.Add(cicloParaAdicionar);
                }
            }
        }