Subversion Repositories bacoAlunos

Rev

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

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

import jomm.dao.impl.AbstractDao;
import jomm.utils.PdfUtils;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.reportdomains.CursoPublicReport;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.reportdomains.EntityEvaluated;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.queries.*;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.utils.*;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.estgp.estgweb.utils.Dom4jUtil;

import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;

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

public class CursoPublicReportGenerator extends ReportAlunosGenerator
{
    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(DocenteReportGenerator.class);



    public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws 1.5.0/docs/api/java/io/IOException.html">IOException, DocumentException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
    {

        //String teacherCode = "44451";
        //String teacherCode = "20122";
        1.5.0/docs/api/java/lang/String.html">String courseCode = "9119";
        //String courseCode = "9104";
        1.5.0/docs/api/java/lang/String.html">String anoLectivo = "201516";
        //String[] periodos = new String[]{"S2","T3","T4","A"};
        1.5.0/docs/api/java/lang/String.html">String[] periodos = new 1.5.0/docs/api/java/lang/String.html">String[]{"S1"};
        1.5.0/docs/api/java/lang/String.html">String[] degrees = new 1.5.0/docs/api/java/lang/String.html">String[]{"L","M","T","E"};
        new CursoPublicReportGenerator(anoLectivo,periodos,degrees,courseCode).processCourse(courseCode);

    }

    public CursoPublicReportGenerator() {
        super(null, null, null);
    }

    public CursoPublicReportGenerator(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 courseCode) {
        super(anoLectivo, periodos, degrees);
    }

    public void processCourse(1.5.0/docs/api/java/lang/String.html">String courseCode) throws 1.5.0/docs/api/java/io/IOException.html">IOException, DocumentException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
    {


        //todo ver se ha ocorrencias de respostas do docente neste ano se não houver devolver questionario com info de nao haver resultados para este docente
        CursoPublicReport cursoReport = getCoursePublicReport(courseCode);
        if(cursoReport == null)
        {
            1.5.0/docs/api/java/lang/System.html">System.out.println(" Curso " + courseCode + " nao tem respostas nestas condições ");
            return;
        }

        ChartBuilderUtil.createChartTiposAlunos(cursoReport, "tiposAlunosTmp");
        ChartBuilderUtil.createChartTaxaRespostas(cursoReport, "taxaRespostasTmp");
        ChartBuilderUtil.createChartTaxaParticipacao(cursoReport, "taxaParticipacaoTmp");
        ChartBuilderUtil.createChartUnidadesContribuicao(cursoReport,"unidadesContribuicao");


        1.5.0/docs/api/java/lang/String.html">String path = generatePdfReport(cursoReport);

    }

    private 1.5.0/docs/api/java/lang/String.html">String generatePdfReport(CursoPublicReport cursoReport) throws DocumentException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException {
        1.5.0/docs/api/java/lang/String.html">String startPath = Globals.TMP_DIR + 1.5.0/docs/api/java/io/File.html">File.separator  + "reportCurso" +  cursoReport.getCursoStats().getCodigoCurso();
        1.5.0/docs/api/java/lang/String.html">String path = startPath + ".pdf";

        1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream out = new 1.5.0/docs/api/java/io/FileOutputStream.html">FileOutputStream(path);
        Map<String,Object> params = new HashMap<String,Object>();
        params.put("site", Globals.SITE_URL);
        params.put("updateDate", pt.estgp.estgweb.web.utils.DatesUtils.getStringFromDate(new 5+0%2Fdocs%2Fapi+Date">Date() ));


        org.w3c.dom.5+0%2Fdocs%2Fapi+Document">Document dom2 = cursoReport.serialize();
        Dom4jUtil.writeSout(dom2);
        Dom4jUtil.write(dom2,new java.io.1.5.0/docs/api/java/io/File.html">File(startPath + ".xml"));

        PdfUtils.setAuthority("Relatório de Avaliação Pedagógica - Relatório Público de Curso - " +
                cursoReport.getCursoStats().getNomeCurso() + " (" + cursoReport.getCursoStats().getCodigoCurso() + " ) " +
                "- Ano letivo " + cursoReport.getAnoLectivo() + " - Periodos " + cursoReport.getSemestres().toString() + "" +
                " Tipos de Curso - " + cursoReport.getDegrees().toString(),
                cursoReport.getCursoStats().getNomeCurso(), "Avaliação Pedagógica Docentes, Inqueritos aos Alunos");
        PdfUtils.createPdfFromXml(new 1.5.0/docs/api/javax/xml/transform/dom/DOMSource.html">DOMSource(dom2), "pt/estgp/estgweb/services/questionarios/pedagogico/reportprocessors/xsl/cursoPublicReport.fo.xsl", out, params);
        out.flush();
        out.close();
        return path;
    }

    private CursoPublicReport getCoursePublicReport(1.5.0/docs/api/java/lang/String.html">String courseCode) throws 1.5.0/docs/api/java/io/IOException.html">IOException {

        AbstractDao.getCurrentSession().beginTransaction();

        Course c = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);

        CursoPublicReport cursoReport = new CursoPublicReport();

        //dados relativos ao questionario
        cursoReport.setAnoLectivo(DatesUtils.getImportYearFormatted(anoLectivo));
        cursoReport.setSemestres(ReportUtils.getFormatedSemestres(periodos));
        cursoReport.setDegrees(ReportUtils.getFormatedDegrees(degrees));


        //dados relativos ao curso
        cursoReport.getCursoStats().setCodigoCurso(courseCode);
        cursoReport.getCursoStats().setNomeCurso(c.getName());
        cursoReport.getCursoStats().setCodigoCurso(c.getCode());
        cursoReport.getCursoStats().setNomeInstituicao(ConfigProperties.getProperty("institution.code." + c.getInstitutionalCode()));
        cursoReport.getCursoStats().setCodigoInstituicao(c.getInstitutionalCode());
        cursoReport.getCursoStats().setCodigoNacionalInstituicao(ConfigProperties.getProperty("institution.national.code." + c.getInstitutionalCode()));
        cursoReport.getCursoStats().setAbreviaturaInstituicao(ConfigProperties.getProperty("institution.code.prefix." + c.getInstitutionalCode()));
        cursoReport.setAnoLectivo(anoLectivo);





        AlunosQueryDao.countAlunosQueResponderamAoCurso(courseCode, anoLectivo, cursoReport, periodos, degrees);
        if(cursoReport.getInquiridosTotal() == 0)
        {
            return null;
        }
        QuestionariosQueryDao.countQuestionariosRespostasAoCurso(courseCode, anoLectivo, cursoReport, periodos, degrees);
        AlunosQueryDao.countTiposAlunosComRespostasAoCurso(courseCode, anoLectivo, cursoReport, periodos, degrees);
        AlunosQueryDao.countIdadesAlunosComRespostasAoCurso(courseCode, anoLectivo, cursoReport, periodos, degrees);

        //TABELAS
        QuestionariosQueryDao.createDataTableIdades(cursoReport, "Alunos");
        QuestionariosQueryDao.createDataTableLocalidadesAoCurso(cursoReport, courseCode, anoLectivo, periodos, degrees, "Alunos");
        UnidadesQueryDao.createTableTaxaRespostaUnidadeAoCurso(cursoReport, courseCode, anoLectivo, periodos, degrees);

        //EVOLUCAO DAS RESPOSTAS
        List<Object[]> semanaContagemCurso = QuestionariosQueryDao.obtainEvolucaoRespostas(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode}, EntityEvaluated.CURSO,anoLectivo,periodos,degrees);
        List<Object[]> semanaContagemEscola = QuestionariosQueryDao.obtainEvolucaoRespostas(new 1.5.0/docs/api/java/lang/String.html">String[]{cursoReport.getCursoStats().getCodigoInstituicao()},EntityEvaluated.ESCOLA,anoLectivo,periodos,degrees);
        1.5.0/docs/api/java/lang/String.html">String distRespostas = ChartBuilderUtil.createTimeSeriesCursoRepostas("distribuicaoRespostasSemanal",cursoReport.getCursoStats().getNomeCurso(),cursoReport.getCursoStats().getAbreviaturaInstituicao(),semanaContagemCurso,semanaContagemEscola);
        cursoReport.setPathDistribuicaoRespostasSemanalChart(distRespostas);

        DataTable tableEvolucaoRespostas = criarEvolucaoTaxasRespostas(semanaContagemCurso,cursoReport.getQuestionariosReqTotal());
        cursoReport.setTabelaEvolucaoRespostas(tableEvolucaoRespostas);


        //Os cursos na Escola são todos os cursos, na pratica nao serve para nada porque
        //A media de todos os cursos na escola é a media da escola considerando a restricao de graus e periodos
        //media nas Escolas por pergunta e media nos Cursos por pergunta é igual
        //A media da entidade neste caso é a do curso
        List<String> codigosTodosCursosDaEscola = QueryDaoUtils.getCodigosCursosEscola(cursoReport.getCursoStats().getCodigoInstituicao(),anoLectivo, periodos, degrees);

        //List<String> codigosEscola = QueryDaoUtils.getCodigosEscolaDocente(teacherCode, anoLectivo, periodos, degrees);
        List<String> codigosEscola = new ArrayList<String>();
        codigosEscola.add(cursoReport.getCursoStats().getCodigoInstituicao());


        cursoReport.getCursoStats().setDocentesDoCurso((int) QueryDaoUtils.countDocentesNosCursos(courseCode, anoLectivo, periodos, degrees));
        cursoReport.getCursoStats().setDocentesDaEscola((int) QueryDaoUtils.countDocentesNasEscolas(cursoReport.getCursoStats().getCodigoInstituicao(), anoLectivo, periodos, degrees));

        //todo vai buscar às cadeiras temos de fazer override do metodo e puxa-lo para o QuestionarioAlunos
        //ou nao porque o UnidadesDaEscola foi introduzido dentro do Curso ão se puxou para o QuestionarioAlunos
        //o xsl vai ter de usar este caso o use
        cursoReport.getCursoStats().setUnidadesDoCurso((int) QueryDaoUtils.countUnidadesNosCursos(courseCode, anoLectivo, periodos, degrees));
        cursoReport.getCursoStats().setUnidadesDaEscola((int) QueryDaoUtils.countUnidadesNasEscolas(cursoReport.getCursoStats().getCodigoInstituicao(), anoLectivo, periodos, degrees));


        ReportAlunosGenerator.criarGraficosRespostasAgregadas(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},
                EntityEvaluated.CURSO,
                anoLectivo,
                cursoReport,
                codigosTodosCursosDaEscola,
                codigosEscola,
                0,
                cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade().getRespostasAgregadasChartTable(),
                cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade(),
                PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS, null,
                periodos, degrees, true);

        ReportAlunosGenerator.criarGraficosRespostasAgregadas(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},
                EntityEvaluated.CURSO,
                anoLectivo,
                cursoReport,
                codigosTodosCursosDaEscola,
                codigosEscola,
                4000,
                cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade().getRespostasAgregadasChartTable2Secs(),
                cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade(),
                PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS, null,
                periodos, degrees, false);


        ReportAlunosGenerator.criarGraficosRespostasAgregadas(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},
                EntityEvaluated.CURSO,
                anoLectivo,
                cursoReport,
                codigosTodosCursosDaEscola,
                codigosEscola,
                0,
                cursoReport.getCursoStats().getRespostasAgregadasGrupoSalas().getRespostasAgregadasChartTable(),
                cursoReport.getCursoStats().getRespostasAgregadasGrupoSalas(),
                PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS, null,
                periodos, degrees, true);

        ReportAlunosGenerator.criarGraficosRespostasAgregadas(new 1.5.0/docs/api/java/lang/String.html">String[]{courseCode},
                EntityEvaluated.CURSO,
                anoLectivo,
                cursoReport,
                codigosTodosCursosDaEscola,
                codigosEscola,
                9000,
                cursoReport.getCursoStats().getRespostasAgregadasGrupoSalas().getRespostasAgregadasChartTable2Secs(),
                cursoReport.getCursoStats().getRespostasAgregadasGrupoSalas(),
                PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS, null,
                periodos, degrees, false);



        UnidadesQueryDao.criarTabelasCadeirasCurso(courseCode,
                anoLectivo,
                cursoReport,
                0, periodos, degrees,cursoReport.getCursoStats().getUnidadesStats());

        ChartWithDataTable analiseConjuntaChartWithTable = criarAnaliseConjuntaDeUnidades(cursoReport.getCursoStats().getUnidadesStats());
        cursoReport.setAnaliseConjuntaChartWithTable(analiseConjuntaChartWithTable);

        1.5.0/docs/api/java/lang/String.html">String pathOrdenadaMediaUnidades = criarAnaliseConjuntaDeUnidadesOrdenadaMediaUnidades(cursoReport.getCursoStats().getUnidadesStats());
        cursoReport.setAnaliseConjuntaChartOrderMediaUnidades(pathOrdenadaMediaUnidades);

        1.5.0/docs/api/java/lang/String.html">String pathOrdenadaMediaSalas = criarAnaliseConjuntaDeUnidadesOrdenadaMediaSalas(cursoReport.getCursoStats().getUnidadesStats());
        cursoReport.setAnaliseConjuntaChartOrderMediaSalas(pathOrdenadaMediaSalas);

        ArrayList<TabelaPerguntaComparativosUnidades> listaTabelasComparativasUnidadesPergunta = criarAnaliseConjuntaDeUnidadesAPergunta(cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade().getPerguntasStats(), cursoReport.getCursoStats().getUnidadesStats(),PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null);
        cursoReport.setListaUnidadesComprativasPergunta(listaTabelasComparativasUnidadesPergunta);

        ArrayList<TabelaPerguntaComparativosUnidades> listaTabelasComparativasUnidadesPerguntaSalas = criarAnaliseConjuntaDeUnidadesAPergunta(cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade().getPerguntasStats(), cursoReport.getCursoStats().getUnidadesStats(),PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,null);
        cursoReport.setListaUnidadesComprativasPerguntaSalas(listaTabelasComparativasUnidadesPerguntaSalas);

        DataTable dataTableTodasAsUndiadesTodasPerguntas = criarTabelaComRespostasATodasAsPerguntas(cursoReport);
        cursoReport.setTodasAsRespostasMediasGruposUnidadesESalas(dataTableTodasAsUndiadesTodasPerguntas);


        AbstractDao.getCurrentSession().getTransaction().commit();
        return cursoReport;
    }

    private DataTable criarTabelaComRespostasATodasAsPerguntas(CursoPublicReport cursoReport) {
        DataTable tabelaComRespostasATodasAsPerguntasUnidadesSalas = new DataTable();

        DataTable.Row headerHidden = tabelaComRespostasATodasAsPerguntasUnidadesSalas.addRowHeader();
        headerHidden.setInvisible(true);
        DataTable.Row headerGroups = tabelaComRespostasATodasAsPerguntasUnidadesSalas.addRowHeader();
        DataTable.Row header = tabelaComRespostasATodasAsPerguntasUnidadesSalas.addRowHeader();


        headerHidden.addColTextCenter("Inv " + "Unidade Curricular");
        headerGroups.addColInvisible();
        header.addColTextCenter("Unidade Curricular");




        headerHidden.addColTextCenter("Inv " + "Curso");
        headerGroups.addColInvisible();
        header.addColTextCenter("Curso");

        //CABECALHOS UNIDADES
        List<PerguntaStats> perguntaStatsesUnidadeHeader = cursoReport.getCursoStats().getRespostasAgregadasGrupoUnidade().getPerguntasStats();
        if(perguntaStatsesUnidadeHeader.size() > 0)
        {
            DataTable.Row.Col c = headerGroups.addColTextCenter("Unidade Curricular");
            c.setColspan(perguntaStatsesUnidadeHeader.size());
            c.setBackgroundColor(ChartBuilderUtil.getRgbXslColor(ChartBuilderUtil.COLOR_SECTION_GREEN));
            1.5.0/docs/api/java/util/Collections.html">Collections.sort(perguntaStatsesUnidadeHeader,new Comparator<PerguntaStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(PerguntaStats o1, PerguntaStats o2) {
                    return 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o1.getNumero()) - 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o2.getNumero());
                }
            });
            for(PerguntaStats perguntaStats : perguntaStatsesUnidadeHeader)
            {
                headerHidden.addColTextCenter("Inv " + perguntaStats.getNumero());
                header.addColTextCenter(perguntaStats.getNumero()).setBackgroundColor(ChartBuilderUtil.getRgbXslColor(ChartBuilderUtil.COLOR_SECTION_GREEN));
            }
        }

        //CABECALHOS SALAS
        List<PerguntaStats> perguntaStatsesSalasHeader = cursoReport.getCursoStats().getRespostasAgregadasGrupoSalas().getPerguntasStats();
        if(perguntaStatsesSalasHeader.size() > 0)
        {
            DataTable.Row.Col c = headerGroups.addColTextCenter("Instalações");
            c.setColspan(perguntaStatsesSalasHeader.size());
            c.setBackgroundColor(ChartBuilderUtil.getRgbXslColor(ChartBuilderUtil.COLOR_SECTION_ROSE));
            1.5.0/docs/api/java/util/Collections.html">Collections.sort(perguntaStatsesSalasHeader,new Comparator<PerguntaStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(PerguntaStats o1, PerguntaStats o2) {
                    return 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o1.getNumero()) - 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o2.getNumero());
                }
            });
            for(PerguntaStats perguntaStats : perguntaStatsesSalasHeader)
            {
                header.addColTextCenter(perguntaStats.getNumero());
                headerHidden.addColTextCenter("Inv " + perguntaStats.getNumero()).setBackgroundColor(ChartBuilderUtil.getRgbXslColor(ChartBuilderUtil.COLOR_SECTION_ROSE));
            }
        }




        header.addColTextCenter("Insc.");
        headerHidden.addColTextCenter("Inv Insc.");
        headerGroups.addColInvisible();

        headerHidden.addColTextCenter("Inv Resps.");
        header.addColTextCenter("Resps.");
        headerGroups.addColInvisible();

        for(UnidadeStats unidadeStats: cursoReport.getCursoStats().getUnidadesStats())
        {
            DataTable.Row unidadeRow = tabelaComRespostasATodasAsPerguntasUnidadesSalas.addRowNormal();
            unidadeRow.addColTextCenter(unidadeStats.getNomeUnidade());
            unidadeRow.addColTextCenter(unidadeStats.getNomeCurso());


            //COLUNA POR CADA MEDIA DE CADA PERGUNTA NAS UNIDADES
            List<PerguntaStats> perguntaStatsesUnidades = unidadeStats.getUnidadeStatsGrupoUnidade().getPerguntasStats();
            1.5.0/docs/api/java/util/Collections.html">Collections.sort(perguntaStatsesUnidades,new Comparator<PerguntaStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(PerguntaStats o1, PerguntaStats o2) {
                    return 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o1.getNumero()) - 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o2.getNumero());
                }
            });

            for(PerguntaStats guiaHeader: perguntaStatsesUnidadeHeader)
            {
                boolean found = false;
                for(PerguntaStats perguntaStats : perguntaStatsesUnidades)
                {
                    if(perguntaStats.getNumero().equals(guiaHeader.getNumero()))
                    {
                        unidadeRow.addColPercentageDefinedCenter(perguntaStats.getMediaEntidadeEmAvaliacaoPrint(), perguntaStats.getPercentMediaEntidadeEmAvaliacao(), true);
                        found = true;
                        break;
                    }
                }
                if(!found)
                    unidadeRow.addColTextCenter("--");
            }


            //COLUNA POR CADA MEDIA DE CADA PERGUNTA NAS SALAS
            List<PerguntaStats> perguntaStatsSalas = unidadeStats.getUnidadeStatsGrupoSalas().getPerguntasStats();
            1.5.0/docs/api/java/util/Collections.html">Collections.sort(perguntaStatsSalas,new Comparator<PerguntaStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(PerguntaStats o1, PerguntaStats o2) {
                    return 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o1.getNumero()) - 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(o2.getNumero());
                }
            });
            for(PerguntaStats guiaHeader: perguntaStatsesSalasHeader)
            {
                boolean found = false;
                for(PerguntaStats perguntaStats : perguntaStatsSalas)
                {
                    if(perguntaStats.getNumero().equals(guiaHeader.getNumero()))
                    {
                        unidadeRow.addColPercentageDefinedCenter(perguntaStats.getMediaEntidadeEmAvaliacaoPrint(), perguntaStats.getPercentMediaEntidadeEmAvaliacao(), true);
                        found = true;
                        break;
                    }
                }
                if(!found)
                    unidadeRow.addColTextCenter("--");
            }


            unidadeRow.addColTextCenter("" + unidadeStats.getInscritos());
            unidadeRow.addColTextCenter("" + unidadeStats.getRespostas());
        }
        return tabelaComRespostasATodasAsPerguntasUnidadesSalas;
    }

    private ArrayList<TabelaPerguntaComparativosUnidades> criarAnaliseConjuntaDeUnidadesAPergunta(List<PerguntaStats> perguntasAgregadasGrupo, ArrayList<UnidadeStats> unidadesStats, 1.5.0/docs/api/java/lang/String.html">String grupo, 1.5.0/docs/api/java/lang/String.html">String subgrupo)
    {
        Map<String, List<UnidadePergunta>> unidadesPerguntas = new HashMap<String, List<UnidadePergunta>>();
        for(UnidadeStats unidadeStats: unidadesStats)
        {
            for(PerguntaStats prgStatUnidade :unidadeStats.findUnidadeStatsGrupo(grupo,subgrupo).getPerguntasStats())
            {
                List<UnidadePergunta> unidadesPerguntasList = unidadesPerguntas.get(prgStatUnidade.getPergunta());
                if(unidadesPerguntasList == null)
                {
                    unidadesPerguntasList = new ArrayList<UnidadePergunta>();
                    unidadesPerguntas.put(prgStatUnidade.getPergunta(),unidadesPerguntasList);
                }
                unidadesPerguntasList.add(new UnidadePergunta(unidadeStats,prgStatUnidade));
            }
        }
        ArrayList<TabelaPerguntaComparativosUnidades> tabelas = new ArrayList<TabelaPerguntaComparativosUnidades>();


        for(1.5.0/docs/api/java/lang/String.html">String pergunta: unidadesPerguntas.keySet())
        {
            TabelaPerguntaComparativosUnidades tabelaPerguntaComparativosUnidades = new TabelaPerguntaComparativosUnidades();
            tabelas.add(tabelaPerguntaComparativosUnidades);
            tabelaPerguntaComparativosUnidades.setPergunta(pergunta);

            DataTable perguntaUnidadesTable = new DataTable();
            tabelaPerguntaComparativosUnidades.setTabelaComparativaUnidades(perguntaUnidadesTable);
            DataTable.Row header = perguntaUnidadesTable.addRowHeader();
            header.addColTextCenter("Unidade Curricular");
            header.addColTextCenter("Curso");
            header.addColTextCenter("Insc.");
            header.addColTextCenter("Resp.");
            header.addColTextCenter("% Resposta");
            header.addColTextCenter("Média");
            header.addColTextCenter("Desvio");

            List<UnidadePergunta> unidadesPergunta = unidadesPerguntas.get(pergunta);

            //SUPOSTAMENTE VEM SEMPRE PREENCHIDO
            if(unidadesPergunta != null && unidadesPergunta.size() > 0)
                tabelaPerguntaComparativosUnidades.setPerguntaNumero(unidadesPergunta.get(0).getPerguntaStats().getNumero());

            1.5.0/docs/api/java/util/Collections.html">Collections.sort(unidadesPergunta,new Comparator<UnidadePergunta>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(UnidadePergunta o1, UnidadePergunta o2) {
                    double sub = o2.getPerguntaStats().getMediaEntidadeEmAvaliacao() - o1.getPerguntaStats().getMediaEntidadeEmAvaliacao();
                    if(sub < 0.0)
                        return -1;
                    else if (sub > 0.0)
                        return 1;
                    else return 0;
                }
            });
            for(UnidadePergunta unidadePergunta: unidadesPergunta)
            {
                DataTable.Row rowUnidade = perguntaUnidadesTable.addRowNormal();

                rowUnidade.addColLabelCenter(unidadePergunta.getUnidadeStats().getNomeUnidade());
                rowUnidade.addColLabelCenter(unidadePergunta.getUnidadeStats().getNomeCurso());
                rowUnidade.addColTextRight("" + unidadePergunta.getUnidadeStats().getInscritos());
                rowUnidade.addColTextRight("" + unidadePergunta.getUnidadeStats().getRespostas());
                rowUnidade.addColTextRight("" + unidadePergunta.getUnidadeStats().getTaxaRespostaPrint0Slots());
                rowUnidade.addColPercentageDefinedCenter("" + unidadePergunta.getPerguntaStats().getMediaEntidadeEmAvaliacaoPrint(), unidadePergunta.getPerguntaStats().getPercentMediaEntidadeEmAvaliacao(), true);
                rowUnidade.addColTextRight(unidadePergunta.getPerguntaStats().getDesvio());
            }

        }

        return tabelas;
    }

    private ChartWithDataTable criarAnaliseConjuntaDeUnidades(List<UnidadeStats> unidadesStats)
    {
        DataTable tabelaDocenteUnidade = new DataTable();
        try {

            1.5.0/docs/api/java/util/Collections.html">Collections.sort(unidadesStats, new Comparator<UnidadeStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(UnidadeStats o1, UnidadeStats o2) {
                    return o1.getNomeUnidade().compareTo(o2.getNomeUnidade());
                }
            });
            1.5.0/docs/api/java/lang/String.html">String unidadeSalasPath = criarChartETabelaMediaGruposPorUnidade(500,30, unidadesStats,
                    PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,
                    null,
                    PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,
                    null,
                    tabelaDocenteUnidade,
                    "unidadeSalas",
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{ChartBuilderUtil.COLOR_SECTION_GREEN_DARK,ChartBuilderUtil.COLOR_SECTION_ROSE_DARK},
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{1.5.0/docs/api/java/awt/Color.html">Color.black,1.5.0/docs/api/java/awt/Color.html">Color.black}
            );

            return
                    new ChartWithDataTable(
                            "Analise Conjunta de Unidades",
                            "Unidade VS Instalações/Equipamentos/Outros Recursos",
                            unidadeSalasPath,
                            tabelaDocenteUnidade);

        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
            logger.error(e,e);
        }
        return null;

    }

    private 1.5.0/docs/api/java/lang/String.html">String criarAnaliseConjuntaDeUnidadesOrdenadaMediaUnidades(List<UnidadeStats> unidadesStats)
    {
        try {

            1.5.0/docs/api/java/util/Collections.html">Collections.sort(unidadesStats,new Comparator<UnidadeStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(UnidadeStats o1, UnidadeStats o2) {

                    double sub = (o2.getUnidadeStatsGrupoUnidade().getMediasGrupo().getAvaliacaoMedia()
                            -
                            o1.getUnidadeStatsGrupoUnidade().getMediasGrupo().getAvaliacaoMedia());
                    if(sub > 0.0)
                        return 1;
                    else if (sub < 0.0)
                        return -1;
                    return 0;
                }
            });
            1.5.0/docs/api/java/lang/String.html">String unidadeSalasPath = criarChartETabelaMediaGruposPorUnidade(500,30, unidadesStats,
                    PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,
                    null,
                    PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,
                    null,
                    null,
                    "unidadeSalasOrderMediaUnidades",
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{ChartBuilderUtil.COLOR_SECTION_GREEN_DARK,ChartBuilderUtil.COLOR_SECTION_ROSE_DARK},
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{1.5.0/docs/api/java/awt/Color.html">Color.black,1.5.0/docs/api/java/awt/Color.html">Color.black}
            );

            return unidadeSalasPath;

        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
            logger.error(e,e);
        }
        return null;

    }

    private 1.5.0/docs/api/java/lang/String.html">String criarAnaliseConjuntaDeUnidadesOrdenadaMediaSalas(List<UnidadeStats> unidadesStats)
    {
        try {

            1.5.0/docs/api/java/util/Collections.html">Collections.sort(unidadesStats,new Comparator<UnidadeStats>() {
                @1.5.0/docs/api/java/lang/Override.html">Override
                public int compare(UnidadeStats o1, UnidadeStats o2) {

                    double sub = (o2.getUnidadeStatsGrupoSalas().getMediasGrupo().getAvaliacaoMedia()
                            -
                            o1.getUnidadeStatsGrupoSalas().getMediasGrupo().getAvaliacaoMedia());
                    if(sub > 0.0)
                        return 1;
                    else if (sub < 0.0)
                        return -1;
                    return 0;
                }
            });
            1.5.0/docs/api/java/lang/String.html">String unidadeSalasPath = criarChartETabelaMediaGruposPorUnidade(500,30, unidadesStats,
                    PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,
                    null,
                    PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,
                    null,
                    null,
                    "unidadeSalasOrderMediaSalas",
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{ChartBuilderUtil.COLOR_SECTION_GREEN_DARK,ChartBuilderUtil.COLOR_SECTION_ROSE_DARK},
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{1.5.0/docs/api/java/awt/Color.html">Color.black,1.5.0/docs/api/java/awt/Color.html">Color.black}
            );

            return unidadeSalasPath;

        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
            logger.error(e,e);
        }
        return null;

    }


    /**
     *
     * @param semanaContagemCurso List<[count,Week,Year]>
     */

    private DataTable criarEvolucaoTaxasRespostas(List<Object[]> semanaContagemCurso, int respostasRequisitadas)
    {
        DataTable tableEvolucaoRespostas = new DataTable();

        DataTable.Row header = tableEvolucaoRespostas.addRowHeader();

        header.addColTextCenter("Semana");
        header.addColTextCenter("Respostas obtidas na semana");
        header.addColTextCenter("Respostas Acumuladas");
        header.addColTextCenter("Por Responder");
        header.addColTextCenter("Esperadas");
        header.addColTextCenter("%");

        int acumuladas = 0;

        1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat dateFormat = new 1.5.0/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat( "dd-MMM-yyyy" );

        if(semanaContagemCurso.size() > 0)
        {
            for(5+0%2Fdocs%2Fapi+Object">Object[] semanaObj :  semanaContagemCurso)
            {
                1.5.0/docs/api/java/lang/Long.html">Long count = (1.5.0/docs/api/java/lang/Long.html">Long) semanaObj[0];
                acumuladas += count;
                int faltam = respostasRequisitadas - acumuladas;
                1.5.0/docs/api/java/lang/Integer.html">Integer semana = (1.5.0/docs/api/java/lang/Integer.html">Integer) semanaObj[1];
                1.5.0/docs/api/java/lang/Integer.html">Integer ano = (1.5.0/docs/api/java/lang/Integer.html">Integer) semanaObj[2];
                1.5.0/docs/api/java/lang/String.html">String percentagemPrt = ChartBuilderUtil.getPercentagemPrint0Slots(acumuladas,respostasRequisitadas);
                double percentagem = ChartBuilderUtil.getPercentagem(acumuladas,respostasRequisitadas);

                1.5.0/docs/api/java/util/Calendar.html">Calendar calendar = 1.5.0/docs/api/java/util/Calendar.html">Calendar.getInstance();
                calendar.clear();

                calendar.set(1.5.0/docs/api/java/util/Calendar.html">Calendar.YEAR, ano);
                calendar.set(1.5.0/docs/api/java/util/Calendar.html">Calendar.WEEK_OF_YEAR, semana);
                calendar.set(1.5.0/docs/api/java/util/Calendar.html">Calendar.DAY_OF_WEEK, 7);
                1.5.0/docs/api/java/lang/String.html">String dataFinalDaSemana = dateFormat.format(calendar.getTime());

                DataTable.Row rowSemana = tableEvolucaoRespostas.addRowNormal();
                rowSemana.addColTextCenter(dataFinalDaSemana);
                rowSemana.addColNumberRight(count + "");
                rowSemana.addColNumberRight(acumuladas + "").setBackgroundColor(DataTable.getColorGradientForPercentage(percentagem/100.0));
                rowSemana.addColNumberRight(faltam + "");
                rowSemana.addColNumberRight(""+ respostasRequisitadas);
                rowSemana.addColPercentageProgressCenter(percentagemPrt);
            }
        }
        return tableEvolucaoRespostas;
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
    {
        long questionarioReportId = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_report_id_KEY).getObject());
        DefaultLogMessages logMessages = new DefaultLogMessages();
        return logMessages;
    }
}