private static void AtualizarAlunosRelatorioTurma(RelatorioPortuguesTurmaDto relatorio, AlunosNaTurmaDTO aluno)
        {
            var relatorioAluno = relatorio.Alunos.FirstOrDefault(ra => ra.CodigoAluno.Equals(aluno.CodigoAluno.ToString()));

            relatorioAluno.CodigoAluno   = aluno.CodigoAluno.ToString();
            relatorioAluno.NomeAluno     = aluno.NomeAlunoRelatorio;
            relatorioAluno.NumeroChamada = aluno.NumeroAlunoChamada;

            return;
        }
        private static void PreencherAlunosSemRespostas(RelatorioPortuguesTurmaDto relatorio, IEnumerable <AlunosNaTurmaDTO> alunos)
        {
            alunos.ForEach(aluno =>
            {
                if (relatorio.Alunos?.Any(r => r.CodigoAluno.Equals(aluno.CodigoAluno.ToString())) ?? false)
                {
                    AtualizarAlunosRelatorioTurma(relatorio, aluno);
                    return;
                }

                relatorio.Alunos.Add(new RelatorioPortuguesTurmaAluno
                {
                    CodigoAluno   = aluno.CodigoAluno.ToString(),
                    NomeAluno     = aluno.NomeAlunoRelatorio,
                    NumeroChamada = aluno.NumeroAlunoChamada,
                });
            });
        }
        public async Task <RelatorioPortuguesTurmaDto> ObterRelatorioPorTurmasPortugues(RelatorioPortuguesFiltroDto relatorioPortuguesFiltroDto)
        {
            IEnumerable <SondagemAluno> dados     = null;
            PeriodoFixoAnual            periodo   = null;
            IEnumerable <Pergunta>      perguntas = null;
            Grupo grupo     = null;
            var   relatorio = new RelatorioPortuguesTurmaDto();

            using (var contexto = new SMEManagementContextData())
            {
                grupo = await ObterGrupo(relatorioPortuguesFiltroDto, grupo, contexto);

                periodo = await ObterPeriodo(relatorioPortuguesFiltroDto, contexto);

                perguntas = await ObterPerguntas(relatorioPortuguesFiltroDto, perguntas, contexto);

                dados = await ObterDadosRelatorioPorTurma(relatorioPortuguesFiltroDto, dados, contexto);
            }

            var alunos = await ObterAlunosTurma(relatorioPortuguesFiltroDto, periodo);

            if (dados == null)
            {
                PreencherAlunosSemRespostas(relatorio, alunos);
                PreencherGraficoSemRespostas(perguntas, grupo, relatorio, alunos);
            }
            else
            {
                MapearRelatorioPorTurma(dados, perguntas, relatorio, alunos);
                MapearGraficoPorTurma(dados, perguntas, grupo, alunos, relatorio);
            }

            relatorio.Alunos = relatorio.Alunos.OrderBy(x => x.NomeAluno).ToList();

            return(relatorio);
        }
        private static void MapearGraficoPorTurma(IEnumerable <SondagemAluno> dados, IEnumerable <Pergunta> perguntas, Grupo grupo, IEnumerable <AlunosNaTurmaDTO> alunos, RelatorioPortuguesTurmaDto relatorio)
        {
            var perguntasRespondidas = dados.SelectMany(x => x.ListaRespostas);

            var grafico = new Grafico
            {
                NomeGrafico = grupo.Descricao
            };

            perguntas.ForEach(pergunta =>
            {
                var barra = new GraficoBarra
                {
                    Label = pergunta.Descricao,
                    Value = perguntasRespondidas.Count(x => x.PerguntaId.Equals(pergunta.Id))
                };

                grafico.Barras.Add(barra);
            });

            grafico.Barras.Add(new GraficoBarra
            {
                Label = "Sem Preenchimento",
                Value = ObterTotalSemPreenchimento(dados, alunos)
            });

            relatorio.Graficos.Add(grafico);
        }
        private static void MapearRelatorioPorTurma(IEnumerable <SondagemAluno> dados, IEnumerable <Pergunta> perguntas, RelatorioPortuguesTurmaDto relatorio, IEnumerable <AlunosNaTurmaDTO> alunos)
        {
            relatorio.Perguntas = perguntas.Select(pergunta => (PerguntaSimplificadaDto)pergunta);

            relatorio.Alunos = dados.Select(dado => new RelatorioPortuguesTurmaAluno
            {
                CodigoAluno = dado.CodigoAluno,
                NomeAluno   = dado.NomeAluno,
                Perguntas   = dado.ListaRespostas.Select(x => x.PerguntaId)
            }).ToList();

            PreencherAlunosSemRespostas(relatorio, alunos);
        }
        private static void PreencherGraficoSemRespostas(IEnumerable <Pergunta> perguntas, Grupo grupo, RelatorioPortuguesTurmaDto relatorio, IEnumerable <AlunosNaTurmaDTO> alunos)
        {
            var grafico = new Grafico
            {
                NomeGrafico = grupo.Descricao,
                Barras      = perguntas.Select(pergunta => new GraficoBarra
                {
                    Label = pergunta.Descricao,
                    Value = 0,
                }).ToList()
            };

            grafico.Barras.Add(new GraficoBarra
            {
                Label = "Sem preenchimento",
                Value = alunos.Count()
            });

            relatorio.Graficos.Add(grafico);
        }