Subversion Repositories bacoAlunos

Rev

Rev 1576 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.queries;

import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import pt.estgp.estgweb.domain.OlapStarFactQuestionario;
import pt.estgp.estgweb.domain.OlapStarFactQuestionarioAnswer;
import pt.estgp.estgweb.services.questionarios.PedagogicoAlunosProcessor;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.reportdomains.DocenteReport;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.reportdomains.EntityEvaluated;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.reportdomains.QuestionariosAlunosReport;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.utils.*;

import java.text.DecimalFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by jorgemachado on 07/12/16.
 */

public class UnidadesQueryDao
{

    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(UnidadesQueryDao.class);






    public static void getMediasCadeira(1.5.0/docs/api/java/lang/String.html">String[] codes,
                                       EntityEvaluated entityEvaluated,
                                       1.5.0/docs/api/java/lang/String.html">String anoLectivo,
                                       QuestionariosAlunosReport report,
                                       1.5.0/docs/api/java/lang/String.html">String grupo,
                                       1.5.0/docs/api/java/lang/String.html">String subGrupo,
                                       MediasGrupo medias,
                                       1.5.0/docs/api/java/lang/String.html">String codigoUnidade,
                                       1.5.0/docs/api/java/lang/String.html">String codigoCurso,
                                       1.5.0/docs/api/java/lang/String.html">String codigoInstituicao,
                                       1.5.0/docs/api/java/lang/String.html">String semestre,
                                       1.5.0/docs/api/java/lang/String.html">String[] periodos,
                                       1.5.0/docs/api/java/lang/String.html">String[] degrees
    )
    {
        1.5.0/docs/api/javax/management/Query.html">Query query;
        1.5.0/docs/api/java/lang/String.html">String whereFragmentEntity = QuestionariosQueryDao.getWhereEntityCodesFragment(codes,entityEvaluated);

        query = AbstractDao.getCurrentSession().createQuery("" +
                "SELECT " +
                "avg(fc.intResposta) as media," +
                "std(fc.intResposta) as desvio," +
                "count(distinct perfil.id) as total " +

                "FROM  " + OlapStarFactQuestionarioAnswer.class.getName() + " fc " +
                "JOIN fc.olapTipologia tipo " +
                "JOIN fc.olapQuestionario quest " +
                "JOIN fc.olapPergunta prgp " +
                "JOIN fc.olapCurso curso " +
                "JOIN fc.olapUnidade unit " +
                "JOIN fc.olapTimeLine timeLine " +
                "JOIN fc.olapPerfilUser perfil " +

                "where " +
                " quest.ano = :ano " +
                whereFragmentEntity +
                "and unit.codigo = :codigoUnidade " +
                "and curso.codigoCurso = :codigoCurso " +
                "and quest.semestre = :semestre " +
                "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                (grupo == null ? "" : " and prgp.grupoCode = :grupoCode ") +
                (subGrupo == null ? "" : " and prgp.subGrupoCode = :subGrupoCode ")
        );
        if(grupo != null)
            query.setString("grupoCode",grupo);
        if(subGrupo != null)
            query.setString("subGrupoCode",subGrupo);
        //query.setString("codigoSiges",teacherCode);
        query.setString("ano",anoLectivo);
        query.setString("semestre",semestre);
        query.setString("codigoUnidade",codigoUnidade);
        query.setString("codigoCurso",codigoCurso);

        DataTable mediasGlobaisTable = new DataTable();
        medias.setMediasGlobaisTable(mediasGlobaisTable);


        DataTable.Row header = mediasGlobaisTable.addRowHeader();
        header.addColTextCenter("Resps.");
        header.addColTextCenter("Média");
        header.addColTextCenter("Desvio Padrão");
        header.addColTextCenter("95% Resps no intervalo");


        header.addColTextCenter("Curso");
        header.addColTextCenter("Escola");


        5+0%2Fdocs%2Fapi+Object">Object[] result = (5+0%2Fdocs%2Fapi+Object">Object[]) query.uniqueResult();


        1.5.0/docs/api/java/lang/Double.html">Double mediaGrupo = (1.5.0/docs/api/java/lang/Double.html">Double) result[0];
        if(mediaGrupo == null || mediaGrupo == 0.0)
        {
            mediaGrupo = 0.0;
            DataTable.Row row = mediasGlobaisTable.addRowNormal();
            row.addColTextCenter("Sem resultados para apresentar").setColspan(6);
            return;
        }
        1.5.0/docs/api/java/lang/Double.html">Double desvio = (1.5.0/docs/api/java/lang/Double.html">Double) result[1];
        long total = (1.5.0/docs/api/java/lang/Long.html">Long) result[2];
        double min = mediaGrupo - (desvio*2);
        double max = mediaGrupo + (desvio*2);
        if(max > 5) max = 5;
        1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat df = new 1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat("#.##");
        1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat df2 = new 1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat("#.#");
        1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat df4 = new 1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat("#.####");

        DataTable.Row row = mediasGlobaisTable.addRowNormal();
        row.addColTextCenter(""+total);
        row.addColPercentageDefinedCenter(df4.format(mediaGrupo),"" + ((int)((mediaGrupo/5.0)*100.0)), true);
        row.addColTextCenter(df.format(desvio));
        row.addColTextCenter("[" + df2.format(min) + "<->" + df2.format(max) + "]");



        PerguntasGrupoQueryDao.MediaGlobalEscolaGrupo mediaGlobalEscolaGrupo = PerguntasGrupoQueryDao.getMediaEscolaGrupo(report, codigoInstituicao, anoLectivo, grupo, subGrupo, periodos, degrees);
        PerguntasGrupoQueryDao.MediaGlobalCursoGrupo mediaGlobalCursoGrupo = PerguntasGrupoQueryDao.getMediaCursoGrupo(report,  codigoCurso, anoLectivo, grupo, subGrupo, periodos);
        medias.setAvaliacaoMediaArredondada((int) ReportUtils.round(mediaGrupo, 0));
        medias.setAvaliacaoMedia(mediaGrupo);
        medias.setDesvioPadrao(desvio);

        medias.setMediaGlobalNosCursos(mediaGlobalCursoGrupo.media);
        medias.setMediaGlobalNasEscolas(mediaGlobalEscolaGrupo.media);
        medias.setTotal((int) total);

        row.addColPercentageDefinedCenter(df.format(mediaGlobalCursoGrupo.media),"" + ((int)((mediaGlobalCursoGrupo.media/5.0)*100.0)), true);
        row.addColPercentageDefinedCenter(df.format(mediaGlobalEscolaGrupo.media),"" + ((int)((mediaGlobalEscolaGrupo.media/5.0)*100.0)), true);


        if(medias.getAvaliacaoMediaArredondada() == 1)
            medias.setColorMedia(ChartBuilderUtil.COLOR_1_HEX);
        else if(medias.getAvaliacaoMediaArredondada() == 2)
            medias.setColorMedia(ChartBuilderUtil.COLOR_2_HEX);
        else if(medias.getAvaliacaoMediaArredondada() == 3)
            medias.setColorMedia(ChartBuilderUtil.COLOR_3_HEX);
        else if(medias.getAvaliacaoMediaArredondada() == 4)
            medias.setColorMedia(ChartBuilderUtil.COLOR_4_HEX);
        else if(medias.getAvaliacaoMediaArredondada() == 5)
            medias.setColorMedia(ChartBuilderUtil.COLOR_5_HEX);
    }

    public static void criarTabelasCadeirasCurso(1.5.0/docs/api/java/lang/String.html">String courseCode, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, QuestionariosAlunosReport cursoReport, int tempoLevadoMinimo,
                                                   1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees,List<UnidadeStats> unidadeStatsList)
    {
        criarTabelasCadeiras(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},EntityEvaluated.CURSO,anoLectivo,cursoReport,tempoLevadoMinimo,
                periodos,degrees,unidadeStatsList);
    }

    public static void criarTabelasCadeirasDocente(1.5.0/docs/api/java/lang/String.html">String teacherCode, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, QuestionariosAlunosReport docenteReport, int tempoLevadoMinimo,
                                                   1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees,List<UnidadeStats> unidadeStatsList)
    {
        criarTabelasCadeiras(new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},EntityEvaluated.DOCENTE,anoLectivo,docenteReport,tempoLevadoMinimo,
                periodos,degrees,unidadeStatsList);
    }

    /**
     *
     * @param codes
     * @param entityEvaluated
     * @param anoLectivo
     * @param report
     * @param tempoLevadoMinimo
     * @param periodos
     * @param degrees
     */


    public static void criarTabelasCadeiras(1.5.0/docs/api/java/lang/String.html">String[] codes,EntityEvaluated entityEvaluated, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, QuestionariosAlunosReport report, int tempoLevadoMinimo,
                                            1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees,List<UnidadeStats> unidadeStatsList)
    {
        1.5.0/docs/api/java/lang/String.html">String periodosQuery = QueryDaoUtils.createPeriodosQuery(periodos, "quest", true);
        1.5.0/docs/api/java/lang/String.html">String degreesQuery = QueryDaoUtils.createDegreesQuery(degrees, "curso", true);
        1.5.0/docs/api/java/lang/String.html">String whereFragmentEntity = QuestionariosQueryDao.getWhereEntityCodesFragment(codes,entityEvaluated);

        1.5.0/docs/api/javax/management/Query.html">Query query = AbstractDao.getCurrentSession().createQuery(
                "select  unit.nome, " +
                        "unit.codigo, " +
                        "quest.semestre, " +
                        "curso.codigoCurso, " +
                        "curso.nomeCurso, " +
                        "curso.codigoInstituicao, " +
                        "curso.nomeInstituicao, " +
                        "sum(case when fc.respondido = true then 1 else 0 end) as respondido, " +
                        "sum(case when fc.respondido = false then 1 else 0 end) as naoRespondido, " +
                        "count(user.sigesCode) " +

                        "from " + OlapStarFactQuestionario.class.getName() + " fc " +
                        "JOIN fc.olapQuestionario quest " +
                        "JOIN fc.olapTipologia tipo " +
                        "JOIN fc.olapCurso curso " +
                        "JOIN fc.olapUnidade unit " +
                        "JOIN fc.olapPerfilUser user " +
                        "JOIN fc.olapTimeLine timeLine " +

                        "where " +
                        "quest.ano = :ano " +
                        "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                        whereFragmentEntity +
                        periodosQuery +
                        degreesQuery +
                        " group by unit.codigo, quest.semestre, curso.codigoCurso");

        //query.setString("codigoSiges",teacherCode);
        query.setString("ano",anoLectivo);
        List<Object[]> cadeiras = query.list();
        for(5+0%2Fdocs%2Fapi+Object">Object[] cadeira : cadeiras)
        {
            1.5.0/docs/api/java/lang/String.html">String nomeUnidade = (1.5.0/docs/api/java/lang/String.html">String) cadeira[0];
            1.5.0/docs/api/java/lang/String.html">String codigoUnidade = (1.5.0/docs/api/java/lang/String.html">String) cadeira[1];
            1.5.0/docs/api/java/lang/String.html">String semestreUnidade = (1.5.0/docs/api/java/lang/String.html">String) cadeira[2];
            1.5.0/docs/api/java/lang/String.html">String codigoCurso = (1.5.0/docs/api/java/lang/String.html">String) cadeira[3];
            1.5.0/docs/api/java/lang/String.html">String nomeCurso = (1.5.0/docs/api/java/lang/String.html">String) cadeira[4];
            1.5.0/docs/api/java/lang/String.html">String codigoInstituicao = (1.5.0/docs/api/java/lang/String.html">String) cadeira[5];
            1.5.0/docs/api/java/lang/String.html">String nomeInstituicao = (1.5.0/docs/api/java/lang/String.html">String) cadeira[6];
            1.5.0/docs/api/java/lang/Long.html">Long respostas = (1.5.0/docs/api/java/lang/Long.html">Long) cadeira[7];
            1.5.0/docs/api/java/lang/Long.html">Long inscritos = (1.5.0/docs/api/java/lang/Long.html">Long) cadeira[9];


            logger.info("Encontrada cadeira: " + nomeUnidade + " de " + nomeCurso + " (" + codigoUnidade + ";" + semestreUnidade + ";" + codigoCurso + ")");

            UnidadeStats statsUnidade = new UnidadeStats();
            statsUnidade.setNomeCurso(nomeCurso);
            statsUnidade.setNomeUnidade(nomeUnidade);
            statsUnidade.setSemestre(semestreUnidade);
            statsUnidade.setCodigoCurso(codigoCurso);
            statsUnidade.setCodigoUnidade(codigoUnidade);
            statsUnidade.setNomeEscola(nomeInstituicao);
            statsUnidade.setCodigoEscola(codigoInstituicao);
            statsUnidade.setInscritos(inscritos.intValue());
            statsUnidade.setRespostas(respostas.intValue());


            if(entityEvaluated == EntityEvaluated.DOCENTE)
            {
                UnidadeStats.UnidadeStatsGrupo dataDocente = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);

                UnidadeStats.UnidadeStatsGrupo dataUnidade = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);

                UnidadeStats.UnidadeStatsGrupo dataDrelDocenteAluno = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                        PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);

                UnidadeStats.UnidadeStatsGrupo dataDdocenteProf = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                        PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);
                UnidadeStats.UnidadeStatsGrupo dataEstagio = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_ESTAGIO_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);

                UnidadeStats.UnidadeStatsGrupo dataEnsinoClinico = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_ENSINO_CLINICO_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);
                statsUnidade.setUnidadeStatsGrupoDocente(dataDocente);
                statsUnidade.setUnidadeStatsGrupoUnidade(dataUnidade);
                statsUnidade.setUnidadeStatsGrupoDrelDocenteAluno(dataDrelDocenteAluno);
                statsUnidade.setUnidadeStatsGrupoDdocenteProf(dataDdocenteProf);
                statsUnidade.setUnidadeStatsGrupoEstagio(dataEstagio);
                statsUnidade.setUnidadeStatsGrupoPraticaEnsinoClinico(dataEnsinoClinico);
            }else if(entityEvaluated == EntityEvaluated.CURSO)
            {
                UnidadeStats.UnidadeStatsGrupo dataSalas = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);
                UnidadeStats.UnidadeStatsGrupo dataUnidade = criarTabelasRespostasCadeira(codes,entityEvaluated,anoLectivo,report,tempoLevadoMinimo,
                        PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null,
                        codigoUnidade,codigoCurso,semestreUnidade,codigoInstituicao,periodos,degrees);
                statsUnidade.setUnidadeStatsGrupoUnidade(dataUnidade);
                statsUnidade.setUnidadeStatsGrupoSalas(dataSalas);

            }else
            {
                throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException("Nao implementado");
            }

            unidadeStatsList.add(statsUnidade);

        }
    }

    public static UnidadeStats.UnidadeStatsGrupo criarTabelasRespostasCadeira(1.5.0/docs/api/java/lang/String.html">String teacherCode,
                                                                              1.5.0/docs/api/java/lang/String.html">String anoLectivo,
                                                                              DocenteReport docenteReport,
                                                                              double tempoMinimo,
                                                                              1.5.0/docs/api/java/lang/String.html">String grupo,
                                                                              1.5.0/docs/api/java/lang/String.html">String subGrupo,
                                                                              1.5.0/docs/api/java/lang/String.html">String codigoUnidade,
                                                                              1.5.0/docs/api/java/lang/String.html">String codigoCurso,
                                                                              1.5.0/docs/api/java/lang/String.html">String semestre,
                                                                              1.5.0/docs/api/java/lang/String.html">String codigoInstituicao,
                                                                              1.5.0/docs/api/java/lang/String.html">String[] periodos,
                                                                              1.5.0/docs/api/java/lang/String.html">String[] degrees)
    {
        return criarTabelasRespostasCadeira(new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},EntityEvaluated.DOCENTE, anoLectivo,
                docenteReport,tempoMinimo,grupo,subGrupo,codigoUnidade,codigoCurso,semestre,codigoInstituicao,
                periodos,degrees);
    }
    /**
     * Gera um gráfico com todas as respostas agregadas por questao para um professor
     *
     * Gera as medias por pergunta em cada cadeira e as medias dos seu curso e
     * da sua escola
     * @param codes
     * @param entityEvaluated
     * @param anoLectivo
     * @param docenteReport
     */

    public static UnidadeStats.UnidadeStatsGrupo criarTabelasRespostasCadeira(
                1.5.0/docs/api/java/lang/String.html">String[] codes,
                EntityEvaluated entityEvaluated,
                1.5.0/docs/api/java/lang/String.html">String anoLectivo,
                QuestionariosAlunosReport docenteReport,
                double tempoMinimo,
                1.5.0/docs/api/java/lang/String.html">String grupo,
                1.5.0/docs/api/java/lang/String.html">String subGrupo,
                1.5.0/docs/api/java/lang/String.html">String codigoUnidade,
                1.5.0/docs/api/java/lang/String.html">String codigoCurso,
                1.5.0/docs/api/java/lang/String.html">String semestre,
                1.5.0/docs/api/java/lang/String.html">String codigoInstituicao,
                1.5.0/docs/api/java/lang/String.html">String[] periodos,
                1.5.0/docs/api/java/lang/String.html">String[] degrees)
    {
        1.5.0/docs/api/java/lang/String.html">String whereFragmentEntity = QuestionariosQueryDao.getWhereEntityCodesFragment(codes, entityEvaluated);
        UnidadeStats.UnidadeStatsGrupo unidadeData = new UnidadeStats.UnidadeStatsGrupo(grupo,subGrupo);

        1.5.0/docs/api/javax/management/Query.html">Query query;//*****CRIAR REPOSTAS DO GRUPO DOCENTE*****///



        query = AbstractDao.getCurrentSession().createQuery("" +
                "SELECT " +
                "avg(fc.intResposta) as media," +
                "sum(case when fc.intResposta = 1 then 1 else 0 end) as r1," +
                "sum(case when fc.intResposta = 2 then 1 else 0 end) as r2," +
                "sum(case when fc.intResposta = 3 then 1 else 0 end) as r3," +
                "sum(case when fc.intResposta = 4 then 1 else 0 end) as r4," +
                "sum(case when fc.intResposta = 5 then 1 else 0 end) as r5," +
                "std(fc.intResposta) as desvio," +
                "count(fc.id) as total, " +
                "prgp.pergunta as pergunta, " +
                "prgp.numero as numero, " +
                "avg(fc.tempoLevado) as tempoMedioLevado " +

                "FROM  " + OlapStarFactQuestionarioAnswer.class.getName() + " fc " +
                "JOIN fc.olapPergunta prgp " +
                "JOIN fc.olapTipologia tipo " +
                "JOIN fc.olapQuestionario quest " +
                "JOIN fc.olapCurso curso " +
                "JOIN fc.olapUnidade unit " +
                "JOIN fc.olapTimeLine timeLine " +

                "where " +
                " quest.ano = :ano " +
                whereFragmentEntity +
                "and unit.codigo = :codigoUnidade " +
                "and curso.codigoCurso = :codigoCurso " +
                "and quest.semestre = :semestre " +
                "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                (tempoMinimo > 0 ?  " and fc.tempoLevado > :tempoLevado " : "" ) +
                (grupo == null ? "" : " and prgp.grupoCode = :grupoCode ") +
                (subGrupo == null ? "" : " and prgp.subGrupoCode = :subGrupoCode ") +
                "group by prgp.numero " +
                "order by prgp.numero ");
        if(grupo != null)
            query.setString("grupoCode",grupo);
        if(subGrupo != null)
            query.setString("subGrupoCode",subGrupo);
        //query.setString("codigoSiges",teacherCode);
        query.setString("ano",anoLectivo);
        query.setString("codigoUnidade",codigoUnidade);
        query.setString("codigoCurso",codigoCurso);
        query.setString("semestre",semestre);

        if(tempoMinimo > 0)
        {
            query.setDouble("tempoLevado",tempoMinimo);
        }


        DataTable tableRespostasAgregadas = new DataTable();

        unidadeData.setRespostasTable(tableRespostasAgregadas);

        getMediasCadeira(codes, entityEvaluated, anoLectivo, docenteReport, grupo, subGrupo, unidadeData.getMediasGrupo(), codigoUnidade, codigoCurso, codigoInstituicao, semestre, periodos, degrees);


        DataTable.Row header = tableRespostasAgregadas.addRowHeader();
        header.addColTextCenter("Questão");
        header.addColTextCenter("Resps.");
        header.addColTextCenter("Tempo Médio de Resposta (seg.)");
        header.addColTextCenter("Nada Satisf. %");
        header.addColTextCenter("Pouco Satisf. %");
        header.addColTextCenter("Satisf. %");
        header.addColTextCenter("Bastante Satisf. %");
        header.addColTextCenter("Muito Satisf. %");
        header.addColTextCenter("Média");
        header.addColTextCenter("Desvio Padrão");
        header.addColTextCenter("Curso");
        header.addColTextCenter("Diff Curso");
        header.addColTextCenter("Escola");
        header.addColTextCenter("Diff Escola");


        List<Object[]> resultsTest = query.list();
        for(5+0%2Fdocs%2Fapi+Object">Object[] resultTest : resultsTest)
        {
            1.5.0/docs/api/java/lang/Double.html">Double tempoMedioLevado = (1.5.0/docs/api/java/lang/Double.html">Double) resultTest[10];
            1.5.0/docs/api/java/lang/Double.html">Double mediaDocente = (1.5.0/docs/api/java/lang/Double.html">Double) resultTest[0];
            1.5.0/docs/api/java/lang/Double.html">Double desvio = (1.5.0/docs/api/java/lang/Double.html">Double) resultTest[6];
            1.5.0/docs/api/java/lang/Long.html">Long total = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[7];
            double min = mediaDocente - (desvio*2);
            double max = mediaDocente + (desvio*2);
            if(max > 5) max = 5;
            1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat df = new 1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat("#.##");
            1.5.0/docs/api/java/lang/String.html">String pergunta = resultTest[8].toString();
            1.5.0/docs/api/java/lang/String.html">String numero = resultTest[9].toString();


            DataTable.Row rowUnidade = tableRespostasAgregadas.addRowNormal();
            rowUnidade.addColLabelCenter(pergunta);
            rowUnidade.addColTextCenter(""+total);
            rowUnidade.addColTextCenter(df.format(tempoMedioLevado/1000.0));
            DataTable.Row.Col colResposta1 = rowUnidade.addColTextCenter(resultTest[1].toString());
            DataTable.Row.Col colResposta2 = rowUnidade.addColTextCenter(resultTest[2].toString());
            DataTable.Row.Col colResposta3 = rowUnidade.addColTextCenter(resultTest[3].toString());
            DataTable.Row.Col colResposta4 = rowUnidade.addColTextCenter(resultTest[4].toString());
            DataTable.Row.Col colResposta5 = rowUnidade.addColTextCenter(resultTest[5].toString());

            1.5.0/docs/api/java/lang/Long.html">Long respostas1 = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[1];
            1.5.0/docs/api/java/lang/Long.html">Long respostas2 = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[2];
            1.5.0/docs/api/java/lang/Long.html">Long respostas3 = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[3];
            1.5.0/docs/api/java/lang/Long.html">Long respostas4 = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[4];
            1.5.0/docs/api/java/lang/Long.html">Long respostas5 = (1.5.0/docs/api/java/lang/Long.html">Long) resultTest[5];

            if(respostas1 >= respostas2 && respostas1 >= respostas3 && respostas1 >= respostas4 && respostas1 >= respostas5)
            {
                colResposta1.setBackgroundColor(ChartBuilderUtil.COLOR_1_HEX);
            }else if(respostas2 >= respostas1  && respostas2 >= respostas3 && respostas2 >= respostas4 && respostas2 >= respostas5)
            {
                colResposta2.setBackgroundColor(ChartBuilderUtil.COLOR_2_HEX);
            }else if(respostas3 >= respostas1  && respostas3 >= respostas2 && respostas3 >= respostas4 && respostas3 >= respostas5)
            {
                colResposta3.setBackgroundColor(ChartBuilderUtil.COLOR_3_HEX);
            }else if(respostas4 >= respostas1  && respostas4 >= respostas2 && respostas4 >= respostas3 && respostas4 >= respostas5)
            {
                colResposta4.setBackgroundColor(ChartBuilderUtil.COLOR_4_HEX);
            }else if(respostas5 >= respostas1  && respostas5 >= respostas2 && respostas5 >= respostas3 && respostas5 >= respostas4)
            {
                colResposta5.setBackgroundColor(ChartBuilderUtil.COLOR_5_HEX);
            }

            1.5.0/docs/api/java/lang/String.html">String percentagemDocente = ChartBuilderUtil.getPercentagemPrint0Slots(mediaDocente, 5);
            1.5.0/docs/api/java/lang/String.html">String mediaDocentePrint = df.format(mediaDocente);
            rowUnidade.addColPercentageDefinedCenter(mediaDocentePrint,percentagemDocente,true);
            rowUnidade.addColTextCenter(df.format(desvio));


            //So preenchemos as perguntas para o
            PerguntaStats perguntaStats = new PerguntaStats();
            perguntaStats.setGrupo(grupo);
            perguntaStats.setDesvio(df.format(desvio));
            perguntaStats.setMediaEntidadeEmAvaliacaoPrint(mediaDocentePrint);
            perguntaStats.setMediaEntidadeEmAvaliacao(mediaDocente);
            perguntaStats.setPercentMediaEntidadeEmAvaliacao(ChartBuilderUtil.getPercentagemPrint0Slots(mediaDocente, 5));
            perguntaStats.setNumero(numero);
            perguntaStats.setPergunta(pergunta);
            //Aqui a media dos cursos é a media do curso da Unidade, curso unico
            //A PerguntaStats é usada também nas respostas agregadas ai a media dos cursos é a de todos os cursos do docente
            //onde ele tem participacao
            PerguntasGrupoQueryDao.MediaGlobalEscolaPergunta mediaGlobalEscolaPergunta = PerguntasGrupoQueryDao.getMediaEscolaPergunta(docenteReport, codigoInstituicao, anoLectivo, numero,periodos,degrees);
            PerguntasGrupoQueryDao.MediaGlobalCursoPergunta mediaGlobalCursoPergunta = PerguntasGrupoQueryDao.getMediaCursoPergunta(docenteReport, codigoCurso, anoLectivo, numero,periodos);

            if(unidadeData.getUnidadesNaEscola() <= 0)
            {
                //so faz na primeira passagem e igual para todas
                unidadeData.setUnidadesNaEscola(mediaGlobalEscolaPergunta.numeroUnidades);
                unidadeData.setUnidadesNoCurso(mediaGlobalCursoPergunta.numeroUnidades);
            }

            perguntaStats.setMediaCursos(mediaGlobalCursoPergunta.media);
            perguntaStats.setMediaCursosPrint(df.format(mediaGlobalCursoPergunta.media));
            perguntaStats.setMediaEscolas(mediaGlobalEscolaPergunta.media);
            perguntaStats.setMediaEscolasPrint(df.format(mediaGlobalEscolaPergunta.media));
            perguntaStats.setPercentMediaCursos(ChartBuilderUtil.getPercentagemPrint0Slots(mediaGlobalCursoPergunta.media, 5));
            perguntaStats.setPercentMediaEscolas(ChartBuilderUtil.getPercentagemPrint0Slots(mediaGlobalEscolaPergunta.media, 5));
            perguntaStats.setPercentMediaEntidadeEmAvaliacao(ChartBuilderUtil.getPercentagemPrint0Slots(mediaDocente, 5));
            perguntaStats.setDiffMediaCurso((mediaDocente - mediaGlobalCursoPergunta.media));
            perguntaStats.setDiffMediaEscola((mediaDocente - mediaGlobalEscolaPergunta.media));
            double diffCurso = mediaDocente - mediaGlobalCursoPergunta.media;
            double diffEscola = mediaDocente - mediaGlobalEscolaPergunta.media;

            perguntaStats.setDiffMediaCursoPrint(df.format(mediaDocente - mediaGlobalCursoPergunta.media));
            unidadeData.getPerguntasStats().add(perguntaStats);

            rowUnidade.addColPercentageDefinedCenter(perguntaStats.getMediaCursosPrint(),perguntaStats.getPercentMediaCursos(),true);
            DataTable.Row.Col difCurso = rowUnidade.addColNumberCenter(perguntaStats.getDiffMediaCursoPrint());

            difCurso.setBackgroundColor(ChartBuilderUtil.getBackgroundColorDiff(diffCurso));


            rowUnidade.addColPercentageDefinedCenter(perguntaStats.getMediaEscolasPrint(),perguntaStats.getPercentMediaEscolas(),true);

            DataTable.Row.Col difEscola = rowUnidade.addColNumberCenter(df.format(diffEscola));
            difEscola.setBackgroundColor(ChartBuilderUtil.getBackgroundColorDiff(diffEscola));

        }
        return unidadeData;
    }

    public static void createTableTaxaRespostaUnidadeAoDocente(QuestionariosAlunosReport docenteReport, 1.5.0/docs/api/java/lang/String.html">String teacherCode, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, 1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees) {
        createTableTaxaRespostaUnidadeGen(docenteReport,new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},EntityEvaluated.DOCENTE,anoLectivo,periodos,degrees);
    }
    public static void createTableTaxaRespostaUnidadeAoCurso(QuestionariosAlunosReport report, 1.5.0/docs/api/java/lang/String.html">String courseCode, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, 1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees) {
        createTableTaxaRespostaUnidadeGen(report,new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},EntityEvaluated.CURSO,anoLectivo,periodos,degrees);
    }
    public static void createTableTaxaRespostaUnidadeAoCurso(QuestionariosAlunosReport report, 1.5.0/docs/api/java/lang/String.html">String[] courseCodes, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, 1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees) {
        createTableTaxaRespostaUnidadeGen(report,courseCodes,EntityEvaluated.CURSOS,anoLectivo,periodos,degrees);
    }
    public static void createTableTaxaRespostaUnidadeAoCurso(QuestionariosAlunosReport report, List<String> courseCodes, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, 1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees) {
        createTableTaxaRespostaUnidadeGen(report, (1.5.0/docs/api/java/lang/String.html">String[]) courseCodes.toArray(),EntityEvaluated.CURSOS,anoLectivo,periodos,degrees);
    }

    /**REFATORIZAR ISTO, este metodo não precisa de uma query pode perfeitamente usar a lista de UnitStats*/
    public static void createTableTaxaRespostaUnidadeGen(QuestionariosAlunosReport report, 1.5.0/docs/api/java/lang/String.html">String[] codes, EntityEvaluated entityEvaluated, 1.5.0/docs/api/java/lang/String.html">String anoLectivo, 1.5.0/docs/api/java/lang/String.html">String[] periodos, 1.5.0/docs/api/java/lang/String.html">String[] degrees) {


        1.5.0/docs/api/java/lang/String.html">String periodosQuery = QueryDaoUtils.createPeriodosQuery(periodos, "quest", true);
        1.5.0/docs/api/java/lang/String.html">String degreesQuery = QueryDaoUtils.createDegreesQuery(degrees, "curso", true);
        1.5.0/docs/api/java/lang/String.html">String whereFragmentEntity = QuestionariosQueryDao.getWhereEntityCodesFragment(codes, entityEvaluated);

        1.5.0/docs/api/javax/management/Query.html">Query query = AbstractDao.getCurrentSession().createQuery("" +
                "SELECT " +
                "unidade.nome, " +
                "sum(case when fc.respondido = true then 1 else 0 end) as respondido, " +
                "sum(case when fc.respondido = false then 1 else 0 end) as naoRespondido, " +
                "count(user.sigesCode), " +
                "unidade.codigo " +

                "FROM  " + OlapStarFactQuestionario.class.getName() + " fc " +
                "JOIN fc.olapQuestionario quest " +
                "JOIN fc.olapTipologia tipo " +
                "JOIN fc.olapPerfilUser user " +
                "JOIN fc.olapUnidade unidade " +
                "JOIN fc.olapCurso curso " +
                "JOIN fc.olapTimeLine timeLine " +

                "where quest.ano = :ano " +
                whereFragmentEntity +
                "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                periodosQuery +
                degreesQuery +
                " group by unidade.codigo, quest.semestre, curso.codigoCurso " +
                "order by unidade.nome asc");

        //query.setString("codigoSiges",teacherCode);
        query.setString("ano",anoLectivo);
        List<Object[]> result = (List<Object[]>) query.list();

        report.setUnidadesRequisitadas(result.size());


        DataTable dTableOrderByNome = criarTabelaTaxas(report,result,report.getQuestionariosReqRespondidos(),true);

        report.setTabelaTaxaRespostaUnidade( dTableOrderByNome);

        1.5.0/docs/api/java/util/Collections.html">Collections.sort(result,new Comparator<Object[]>() {
            @1.5.0/docs/api/java/lang/Override.html">Override
            public int compare(5+0%2Fdocs%2Fapi+Object">Object[] o1, 5+0%2Fdocs%2Fapi+Object">Object[] o2)
            {
                1.5.0/docs/api/java/lang/Long.html">Long respondidos2 = (1.5.0/docs/api/java/lang/Long.html">Long) o2[1];
                1.5.0/docs/api/java/lang/Long.html">Long inscritos2 = (1.5.0/docs/api/java/lang/Long.html">Long) o2[3];
                int respondidosInt2 = respondidos2 != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) respondidos2).intValue() : 0;
                int inscritosInt2 = inscritos2 != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) inscritos2).intValue() : 0;

                1.5.0/docs/api/java/lang/Long.html">Long respondidos1 = (1.5.0/docs/api/java/lang/Long.html">Long) o1[1];
                1.5.0/docs/api/java/lang/Long.html">Long inscritos1 = (1.5.0/docs/api/java/lang/Long.html">Long) o1[3];
                int respondidosInt1 = respondidos1 != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) respondidos1).intValue() : 0;
                int inscritosInt1 = inscritos1 != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) inscritos1).intValue() : 0;

                int percentage1 = (int)(((float)(respondidosInt1) / ((float)inscritosInt1) * 100.0));
                int percentage2 = (int)(((float)(respondidosInt2) / ((float)inscritosInt2) * 100.0));

                return percentage2 - percentage1;
            }
        });
        DataTable dTableOrderByTaxa = criarTabelaTaxas(report,result,report.getQuestionariosReqRespondidos(),false);

        report.setTabelaTaxaRespostaUnidadeOrderTaxa(dTableOrderByTaxa);

    }

    /**REFATORIZAR ISTO, este metodo não precisa de uma query pode perfeitamente usar a lista de UnitStats*/

    private static DataTable criarTabelaTaxas(QuestionariosAlunosReport alunosReport, List<Object[]> result,int totalRespondidosCadeirasTodas,boolean fillParticipacoesEmUnidades)
    {
        DataTable tableTaxaRespostaUnidade = new DataTable();
        DataTable.Row header = tableTaxaRespostaUnidade.addRowHeader();
        header.addColTextCenter("Unidade Curricular");
        header.addColTextCenter("Insc.");
        header.addColTextCenter("Resp.");
        header.addColTextCenter("% Respostas");
        int totalParticiparam = 0;
        int totalInscritos = 0;
        for(5+0%2Fdocs%2Fapi+Object">Object[] unidade: result)
        {


            DataTable.Row rowUnidade = tableTaxaRespostaUnidade.addRowNormal();
            1.5.0/docs/api/java/lang/String.html">String unidadeNome = (1.5.0/docs/api/java/lang/String.html">String) unidade[0];
            1.5.0/docs/api/java/lang/Long.html">Long respondidos = (1.5.0/docs/api/java/lang/Long.html">Long) unidade[1];
            1.5.0/docs/api/java/lang/Long.html">Long naoRespondidos = (1.5.0/docs/api/java/lang/Long.html">Long) unidade[2];
            1.5.0/docs/api/java/lang/Long.html">Long inscritos = (1.5.0/docs/api/java/lang/Long.html">Long) unidade[3];
            1.5.0/docs/api/java/lang/String.html">String codigo = (1.5.0/docs/api/java/lang/String.html">String) unidade[4];


            int respondidosInt = respondidos != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) respondidos).intValue() : 0;
            int inscritosInt = inscritos != null ? ((1.5.0/docs/api/java/lang/Long.html">Long) inscritos).intValue() : 0;

            totalInscritos += inscritosInt;
            totalParticiparam += respondidosInt;

            rowUnidade.addColLabelCenter(unidadeNome);
            rowUnidade.addColTextCenter(""+inscritosInt);
            rowUnidade.addColTextCenter(""+respondidosInt);

            int percentage = (int)(((float)(respondidosInt) / ((float)inscritosInt) * 100.0));
            rowUnidade.addColPercentageCenter("" + percentage,true);

            if(fillParticipacoesEmUnidades)
            {
                QuestionariosAlunosReport.ParticipacaoUnidade participacoesUnidades = new QuestionariosAlunosReport.ParticipacaoUnidade();
                participacoesUnidades.setCodigoUnidade(codigo);
                participacoesUnidades.setNomeUnidade(unidadeNome);
                participacoesUnidades.setInscritos(inscritosInt);
                participacoesUnidades.setParticiparam(respondidosInt);
                participacoesUnidades.setParticiparamPercentagem(percentage);

                participacoesUnidades
                        .setPercentagemContribuicaoDaUnidadeNoUniversoUnidades(
                                ChartBuilderUtil.getPercentagem(
                                        respondidosInt,
                                        totalRespondidosCadeirasTodas)
                        );
                participacoesUnidades
                        .setPercentagemContribuicaoDaUnidadeNoUniversoUnidadesPrint(
                                ChartBuilderUtil.getPercentagemPrint1Slots(
                                        respondidosInt,
                                        totalRespondidosCadeirasTodas)
                        );

                alunosReport.getParticipacoesUnidades().add(participacoesUnidades);
            }
        }
        return tableTaxaRespostaUnidade;
    }
}