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 async Task <int> ObterQuantidadeAlunosAtivos(RelatorioPortuguesFiltroDto filtroRelatorioSondagem, PeriodoFixoAnual periodo)
        {
            var filtro = new FiltroTotalAlunosAtivos
            {
                AnoLetivo  = filtroRelatorioSondagem.AnoLetivo,
                AnoTurma   = filtroRelatorioSondagem.AnoEscolar,
                DreId      = filtroRelatorioSondagem.CodigoDre,
                UeId       = filtroRelatorioSondagem.CodigoUe,
                DataInicio = periodo.DataInicio,
                DataFim    = periodo.DataFim,
            };

            return(await alunoAPI.ObterTotalAlunosAtivosPorPeriodo(filtro));
        }
        public async Task <RelatorioAutoralLeituraProducaoDto> ObterRelatorioConsolidadoPortugues(RelatorioPortuguesFiltroDto filtroRelatorioSondagem)
        {
            var dados = new List <SondagemAlunoRespostas>();
            PeriodoFixoAnual       periodo   = null;
            Grupo                  grupo     = null;
            IEnumerable <Pergunta> perguntas = null;
            var relatorio = new RelatorioAutoralLeituraProducaoDto();

            using (var contexto = new SMEManagementContextData())
            {
                dados = await contexto.SondagemAlunoRespostas.Include(x => x.SondagemAluno).Include(x => x.Pergunta).Include(x => x.Resposta)
                        .FromSql(ObterConsultaCompleta(filtroRelatorioSondagem),
                                 ObterParametros(filtroRelatorioSondagem)).ToListAsync();

                periodo = await contexto.PeriodoFixoAnual.FirstOrDefaultAsync(x => x.PeriodoId == filtroRelatorioSondagem.PeriodoId && x.Ano == filtroRelatorioSondagem.AnoLetivo);

                grupo = await contexto.Grupo.FirstOrDefaultAsync(x => x.Id == filtroRelatorioSondagem.GrupoId);

                perguntas = await contexto.OrdemPergunta.Include(x => x.Pergunta).Where(x => x.GrupoId.Equals(filtroRelatorioSondagem.GrupoId)).OrderBy(p => p.OrdenacaoNaTela).Select(x => x.Pergunta).ToListAsync();
            }

            if (grupo == null)
            {
                throw new Exception($"Não encontrado grupo com o id '{filtroRelatorioSondagem.GrupoId}'");
            }

            relatorio.GrupoDescricao = grupo.Descricao;

            int quantidade = await ObterQuantidadeAlunosAtivos(filtroRelatorioSondagem, periodo);

            if (quantidade == 0)
            {
                throw new Exception("Não foi possivel obter os alunos ativos para o filtro especificado");
            }

            relatorio.Totais = new RelatorioPortuguesTotalizadores {
                Quantidade = quantidade
            };
            if (filtroRelatorioSondagem.GrupoId != GrupoEnum.ProducaoTexto.Name())
            {
                relatorio.Totais.Porcentagem = 100;
            }

            var listaRetorno = new List <RelatorioPortuguesPerguntasDto>();

            if (dados == null || !dados.Any())
            {
                PreencherPerguntasForaLista(listaRetorno, perguntas);

                ObterSemPreenchimento(dados, quantidade, listaRetorno);

                relatorio.Perguntas = listaRetorno;

                MapearGrafico(grupo, relatorio);

                return(relatorio);
            }

            PopularListaRetorno(dados, quantidade, perguntas, listaRetorno);

            relatorio.Perguntas = listaRetorno;

            MapearGrafico(grupo, relatorio);

            return(relatorio);
        }
        private async Task <IEnumerable <AlunosNaTurmaDTO> > ObterAlunosTurma(RelatorioPortuguesFiltroDto relatorioPortuguesFiltroDto, PeriodoFixoAnual periodo)
        {
            var alunos = await alunoAPI.ObterAlunosAtivosPorTurmaEPeriodo(relatorioPortuguesFiltroDto.CodigoTurma, periodo.DataFim);

            if (alunos == null || !alunos.Any())
            {
                throw new Exception("Não encontrado alunos para a turma informda");
            }

            return(alunos);
        }