Subversion Repositories bacoAlunos

Rev

Rev 1626 | Rev 1629 | 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 org.hibernate.Query;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.services.questionarios.PedagogicoAlunosProcessor;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.queries.*;
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 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.DecimalFormat;
import java.util.*;
import java.util.List;


/**
 * Created by jorgemachado on 05/11/16.
 */

public class DocenteReportGenerator extends ReportAlunosGenerator
{



    int provavelAvaliadaDuasVezes = 0;


    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 DocenteReportGenerator(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) {
        super(anoLectivo, periodos, degrees);

    }

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


    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
    {


        for(int i = 308 ; i<= 605;i++)
            1.5.0/docs/api/java/lang/System.html">System.out.println("rm " + i);
        AbstractDao.getCurrentSession().beginTransaction();
        //String teacherCode = "44451";
        //String teacherCode = "20122";
        //String teacherCode = "22169";
        1.5.0/docs/api/java/lang/String.html">String teacherCode = "20110";
        1.5.0/docs/api/java/lang/String.html">String anoLectivo = "201516";
        1.5.0/docs/api/java/lang/String.html">String[] periodos = new 1.5.0/docs/api/java/lang/String.html">String[]{"S2","T3","T4","A"};
        //String[] periodos = new String[]{"S2,A,T3,T4"};
        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 DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new 1.5.0/docs/api/java/io/File.html">File(Globals.TMP_DIR));

        /*
        teacherCode = "66587";
        new DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new File(Globals.TMP_DIR));

        teacherCode = "44451";
        new DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new File(Globals.TMP_DIR));

        teacherCode = "20115";
        new DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new File(Globals.TMP_DIR));

        teacherCode = "66623";
        new DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new File(Globals.TMP_DIR));

        teacherCode = "22179";
        new DocenteReportGenerator(anoLectivo,periodos,degrees).processTeacher(teacherCode,new File(Globals.TMP_DIR));
*/

        //teacherCode = "20122";

        //processTeacher(teacherCode,anoLectivo,periodos,degrees);

        //teacherCode = "20051";

        //processTeacher(teacherCode,anoLectivo,periodos,degrees);

        //teacherCode = "66587";

        //processTeacher(teacherCode,anoLectivo,periodos,degrees);

        //teacherCode = "20114";
        //processTeacher(teacherCode,anoLectivo,periodos,degrees);
        AbstractDao.getCurrentSession().getTransaction().commit();
    }

    /**
     * return tmpPath with report
     * @param teacherCode
     * @return
     * @throws IOException
     * @throws DocumentException
     * @throws TransformerException
     * @throws FOPException
     */

    public DocenteReport processTeacher(1.5.0/docs/api/java/lang/String.html">String teacherCode,1.5.0/docs/api/java/io/File.html">File reportDocenteFolder) throws 1.5.0/docs/api/java/io/IOException.html">IOException, DocumentException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, FOPException
    {
        provavelAvaliadaDuasVezes = 0;
        if(anoLectivo == null || periodos == null || degrees == null)
            throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException("O ano letivo, os periodos e os graus não estão definidos");
        //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
        DocenteReport docenteReport = getDocenteReport(teacherCode);
        if(docenteReport == null)
        {
            1.5.0/docs/api/java/lang/String.html">String msg = " Docente " + teacherCode + " nao tem respostas nestas condições ";
            logger.warn(msg);
            serviceLogWarn(msg);
            return null;
        }

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

        //DocenteReport.RespostasChart respostasChart = ChartBuilderUtil.createChartRespostasPergunta("A sua pontualidade", new int[]{2, 4, 5, 3, 1}, "pontualidadeTmp");
        //docenteReport.getRespostasCharts().add(respostasChart);


        1.5.0/docs/api/java/lang/String.html">String tmpPath = generatePdfReport(docenteReport,reportDocenteFolder);
        docenteReport.setPathGeneratedPdfTemp(tmpPath);

        serviceLogInfo("######################################");
        serviceLogInfo("######################################");

        serviceLogInfo("#provavelAvaliadaDuasVezes:" + provavelAvaliadaDuasVezes);
        if(provavelAvaliadaDuasVezes> 0)
            serviceLogInfo("#provavelAvaliadaDuasVezes (procurar por provavelAvaliadaDuasVezes no log):" + provavelAvaliadaDuasVezes);


        logger.info("######################################");
        logger.info("######################################");
        logger.info("#provavelAvaliadaDuasVezes:" + provavelAvaliadaDuasVezes);
        if(provavelAvaliadaDuasVezes> 0)
            logger.info("#provavelAvaliadaDuasVezes (procurar por provavelAvaliadaDuasVezes no log):" + provavelAvaliadaDuasVezes);


        return docenteReport;
    }

    private 1.5.0/docs/api/java/lang/String.html">String generatePdfReport(DocenteReport docenteReport,1.5.0/docs/api/java/io/File.html">File reportDocenteFolder) throws DocumentException, 1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException, 1.5.0/docs/api/java/io/IOException.html">IOException, FOPException
    {
        if(!reportDocenteFolder.exists())
        {
            reportDocenteFolder.mkdirs();
        }
        1.5.0/docs/api/java/lang/String.html">String startPath = reportDocenteFolder.getAbsolutePath()  + 1.5.0/docs/api/java/io/File.html">File.separator + "reportDocente" +  docenteReport.getNumeroDocente();
        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 = docenteReport.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 Docente - " +
                docenteReport.getNomeDocente() + " (" + docenteReport.getNumeroDocente() + " ) " +
                "- Ano letivo " + docenteReport.getAnoLectivo() + " - Periodos " + docenteReport.getSemestres().toString() + "" +
                " Tipos de Curso - " + docenteReport.getDegrees().toString(),
                docenteReport.getNomeDocente(), "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/docenteReport.fo.xsl", out, params);
        out.flush();
        out.close();
        return path;
    }


    private DocenteReport getDocenteReport(1.5.0/docs/api/java/lang/String.html">String teacherCode)
    {

        //AbstractDao.getCurrentSession().beginTransaction();

        User u = DaoFactory.getUserDaoImpl().loadBySigesCode(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(teacherCode));

        DocenteReport docenteReport = new DocenteReport();

        docenteReport.setNomeDocente(u.getName());
        docenteReport.setNumeroDocente(teacherCode);
        docenteReport.setAnoLectivo(DatesUtils.getImportYearFormatted(anoLectivo));
        docenteReport.setSemestres(ReportUtils.getFormatedSemestres(periodos));
        docenteReport.setDegrees(ReportUtils.getFormatedDegrees(degrees));


        int responderam = AlunosQueryDao.countAlunosQueResponderamAoDocente(teacherCode, anoLectivo, docenteReport, periodos, degrees);
        //if(responderam == 0)
        //    return null;
        QuestionariosQueryDao.countQuestionariosRespostasAoDocente(teacherCode, anoLectivo, docenteReport, periodos, degrees);
        if(responderam > 0)
        {
            AlunosQueryDao.countTiposAlunosComRespostasAoDocente(teacherCode, anoLectivo, docenteReport, periodos, degrees);
            AlunosQueryDao.countIdadesAlunosComRespostasAoDocente(teacherCode, anoLectivo, docenteReport, periodos, degrees);

            //TABELAS
            QuestionariosQueryDao.createDataTableIdades(docenteReport, "Alunos");
            QuestionariosQueryDao.createDataTableLocalidadesAoDocente(docenteReport, teacherCode, anoLectivo, periodos, degrees, "Alunos");
        }
        UnidadesQueryDao.createTableTaxaRespostaUnidadeAoDocente(docenteReport, teacherCode, anoLectivo, periodos, degrees);


        if(responderam > 0)
        {
        List<String> codigosCurso = QueryDaoUtils.getCodigosCursoDocente(teacherCode, anoLectivo, periodos, degrees);
        List<String> codigosEscola = QueryDaoUtils.getCodigosEscolaDocente(teacherCode, anoLectivo, periodos, degrees);

        docenteReport.setDocentesNosCursos((int) QueryDaoUtils.countDocentesNosCursos(codigosCurso, anoLectivo, periodos, degrees));
        docenteReport.setDocentesNasEscolas((int) QueryDaoUtils.countDocentesNasEscolas(codigosEscola, anoLectivo, periodos, degrees));

        docenteReport.setUnidadesNosCursos((int) QueryDaoUtils.countUnidadesNosCursos(codigosCurso, anoLectivo, periodos, degrees));
        docenteReport.setUnidadesNasEscolas((int) QueryDaoUtils.countUnidadesNasEscolas(codigosEscola, anoLectivo, periodos, degrees));


        criarGraficosRespostasAgregadas(
                new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoDocente().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoDocente(),
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS, null,
                periodos, degrees, true);

            /*
        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                2000,
                docenteReport.getRespostasAgregadasGrupoDocente().getRespostasAgregadasChartTable2Secs(),
                docenteReport.getRespostasAgregadasGrupoDocente(),
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,null,
                periodos,degrees,false);
                */


        criarGraficosRespostasAgregadas(
                new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoUnidade().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoUnidade(),
                PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null,
                periodos,degrees,true);

        /*NOVO**/
        criarGraficosRespostasAgregadas(
                    new 1.5.0/docs/api/java/lang/String.html">String[]{teacherCode},
                    EntityEvaluated.DOCENTE,
                    anoLectivo,
                    docenteReport,
                    codigosCurso,
                    codigosEscola,
                    0,
                    docenteReport.getRespostasAgregadasGrupoSalas().getRespostasAgregadasChartTable(),
                    docenteReport.getRespostasAgregadasGrupoSalas(),
                    PerguntasGrupoQueryDao.GRUPO_SALAS_CODE_PERGUNTAS,null,
                    periodos,degrees,true);

            /*
        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoProjetoEstagio().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoProjetoEstagio(),
                PerguntasGrupoQueryDao.GRUPO_ESTAGIO_CODE_PERGUNTAS,null,
                periodos,degrees,true);

        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoEnsinoClinico().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoEnsinoClinico(),
                PerguntasGrupoQueryDao.GRUPO_ENSINO_CLINICO_CODE_PERGUNTAS,null,
                periodos,degrees,true);
                */


            /*
        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                2000,
                docenteReport.getRespostasAgregadasGrupoUnidade().getRespostasAgregadasChartTable2Secs(),
                docenteReport.getRespostasAgregadasGrupoUnidade(),
                PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null,
                periodos,degrees,false);
        */

            /*
        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoDrelDocenteAluno().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoDrelDocenteAluno(),
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS,periodos,degrees,true);

        criarGraficosRespostasAgregadas(
                new String[]{teacherCode},
                EntityEvaluated.DOCENTE,
                anoLectivo,
                docenteReport,
                codigosCurso,
                codigosEscola,
                0,
                docenteReport.getRespostasAgregadasGrupoDdocenteProf().getRespostasAgregadasChartTable(),
                docenteReport.getRespostasAgregadasGrupoDdocenteProf(),
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS,periodos,degrees,true);

        */


        UnidadesQueryDao.criarTabelasCadeirasDocente(teacherCode,
                anoLectivo,
                docenteReport,
                0, periodos, degrees, docenteReport.getUnidadesStats());


            criaExtremeCharts(docenteReport);

            criarProgressoesCharts(docenteReport,codigosCurso,codigosEscola,degrees,periodos);

            criarAnaliseConjuntaDeUnidades(docenteReport);

            criarAnaliseDimensionalGeral(docenteReport);

            criarAvaliacaoGuiaoDesempenho(docenteReport);
        }
        //AbstractDao.getCurrentSession().getTransaction().commit();



        return docenteReport;
    }

    private void criarAnaliseDimensionalGeral(DocenteReport report)
    {



        1.5.0/docs/api/java/lang/String.html">String grupoRelAlunopropertyIndex = ConfigProperties.getProperty("questionario.group.inverse." + PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS);
        1.5.0/docs/api/java/lang/String.html">String grupoRelAlunoLabel = ConfigProperties.getProperty("questionario.group" + grupoRelAlunopropertyIndex + ".title");

        1.5.0/docs/api/java/lang/String.html">String grupoProfDocentepropertyIndex = ConfigProperties.getProperty("questionario.group.inverse." + PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS);
        1.5.0/docs/api/java/lang/String.html">String grupoProfDocenteLabel = ConfigProperties.getProperty("questionario.group" + grupoProfDocentepropertyIndex + ".title");

        double valores[][] = new double[][]
        {
                new double[]{
                        report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getAvaliacaoMedia(),
                        report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getMediaGlobalNosCursos() },
                new double[]{
                        report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getAvaliacaoMedia(),
                        report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getMediaGlobalNosCursos() }
        };

        1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat df =new 1.5.0/docs/api/java/text/DecimalFormat.html">DecimalFormat("#,##0.00");
        DataTable tabelaDimensoesGeral = new DataTable();
        DataTable.Row header = tabelaDimensoesGeral.addRowHeader();

        header.addColTextCenter("Dimensão");
        header.addColTextCenter("Média");
        header.addColTextCenter("Desvio");
        header.addColTextCenter("Cursos");
        header.addColTextCenter("Escolas");



        DataTable.Row rowRelAluno = tabelaDimensoesGeral.addRowNormal();
        rowRelAluno.addColTextCenter(grupoRelAlunoLabel);
        rowRelAluno.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getAvaliacaoMedia()),
                report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getPercentAvaliacaoMediaForTables(),true);

        rowRelAluno.addColTextCenter(df.format(report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getDesvioPadrao()));

        rowRelAluno.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getMediaGlobalNosCursos()),
                report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getPercentMediaGlobalNosCursosForTables(), true);

        rowRelAluno.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getMediaGlobalNasEscolas()),
                report.getRespostasAgregadasGrupoDrelDocenteAluno().getMediasGrupo().getPercentMediaGlobalNasEscolasForTables(),true);

        DataTable.Row rowProfissionalismo = tabelaDimensoesGeral.addRowNormal();
        rowProfissionalismo.addColTextCenter(grupoProfDocenteLabel);
        rowProfissionalismo.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getAvaliacaoMedia()),
                report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getPercentAvaliacaoMediaForTables(),true);

        rowProfissionalismo.addColTextCenter(df.format(report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getDesvioPadrao()));

        rowProfissionalismo.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getMediaGlobalNosCursos()),
                report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getPercentMediaGlobalNosCursosForTables(),true);

        rowProfissionalismo.addColPercentageDefinedCenter(
                df.format(report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getMediaGlobalNasEscolas()),
                report.getRespostasAgregadasGrupoDdocenteProf().getMediasGrupo().getPercentMediaGlobalNasEscolasForTables(),true);


        try {
            1.5.0/docs/api/java/lang/String.html">String path = ChartBuilderUtil.createBarChartBarsCategories(
                    new 1.5.0/docs/api/java/lang/String.html">String[]{"Docente","Curso"},
                    new 1.5.0/docs/api/java/lang/String.html">String[]{grupoRelAlunoLabel,grupoProfDocenteLabel},
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{ChartBuilderUtil.COLOR_SECTION_DIM_DARK,ChartBuilderUtil.COLOR_SECTION_DIM},
                    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},
                    valores,
                    0,5, "dimensoesGeral",300,40);
            report.setDimensoesGeralChartAndTable(new ChartWithDataTable("Dimensões Geral", "", path, tabelaDimensoesGeral));
        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
        {
            e.printStackTrace();
        }


    }
    private void criarAnaliseConjuntaDeUnidades(DocenteReport report)
    {

        1.5.0/docs/api/java/lang/String.html">String grupoRelAlunopropertyIndex = ConfigProperties.getProperty("questionario.group.inverse." + PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS);
        1.5.0/docs/api/java/lang/String.html">String grupoRelAlunoLabel = ConfigProperties.getProperty("questionario.group" + grupoRelAlunopropertyIndex + ".title");

        1.5.0/docs/api/java/lang/String.html">String grupoProfDocentepropertyIndex = ConfigProperties.getProperty("questionario.group.inverse." + PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS);
        1.5.0/docs/api/java/lang/String.html">String grupoProfDocenteLabel = ConfigProperties.getProperty("questionario.group" + grupoProfDocentepropertyIndex + ".title");


        DataTable tabelaDocenteUnidade = new DataTable();
        DataTable tabelaRelDocenteProfDocente = new DataTable();
        try {

            1.5.0/docs/api/java/lang/String.html">String docenteUnidadePath = super.criarChartETabelaMediaGruposPorUnidade(
                    400,
                    40,
                    report.getUnidadesStats(),
                    PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                    null,
                    PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,
                    null,
                    tabelaDocenteUnidade,
                    "docenteUnidade",
                    new 1.5.0/docs/api/java/awt/Color.html">Color[]{ChartBuilderUtil.COLOR_SECTION_BLUE_DARK, ChartBuilderUtil.COLOR_SECTION_GREEN_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}
            );

            /*
            String relDocenteProfDocentePath = criarChartETabelaMediaGruposPorUnidade(
                    400,
                    40,
                    report.getUnidadesStats(),
                    PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                    PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS,
                    PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,
                    PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS,
                    tabelaRelDocenteProfDocente,
                    "relAlunoDocenteProfDocentePath",
                    new Color[]{ChartBuilderUtil.COLOR_SECTION_DIM_DARK, ChartBuilderUtil.COLOR_SECTION_DIM},
                    new Color[]{Color.black, Color.black}

            );
            */


            report.setUnidadesAnalGrDocenteGrUnidadeChartAndTable(
                    new ChartWithDataTable(
                            "Analise Conjunta de Unidades",
                            "Docente VS Unidade",
                            docenteUnidadePath,
                            tabelaDocenteUnidade));
            /*
            report.setUnidadesAnalGrRelAlunoGrProfDoceChartAndTable(
                    new ChartWithDataTable("Analise Conjunta de Unidades",
                            grupoRelAlunoLabel + "VS" + grupoProfDocenteLabel,
                            relDocenteProfDocentePath,
                            tabelaRelDocenteProfDocente));
                            */


        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
            e.printStackTrace();
        }

    }



    private void criarAvaliacaoGuiaoDesempenho(DocenteReport docenteReport)
    {
        List<UnidadeStats> unidadeStatses = docenteReport.getUnidadesStats();

        DataTable dataTable = new DataTable();

        DataTable.Row rowHeader = dataTable.addRowHeader();
        rowHeader.addColTextCenter("Cód. Unidade");
        rowHeader.addColTextCenter("Unidade Curricular").setWidth("20%");
        rowHeader.addColTextCenter("Cód. Curso");
        rowHeader.addColTextCenter("Curso").setWidth("20%");
        rowHeader.addColTextCenter("Ano");
        rowHeader.addColTextCenter("Periodo");
        rowHeader.addColTextCenter("resposta média (RM)");
        rowHeader.addColTextCenter("Número de inscritos");//aqui em vez de inscritos deveria ser respostas esperadas quando houver tipologias
        rowHeader.addColTextCenter("Número de respostas");
        rowHeader.addColTextCenter("Taxa de resposta (TR)");
        rowHeader.addColTextCenter("Taxa de resposta (RMxTR)");

        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/util/Collections.html">Collections.sort(unidadeStatses,new Comparator<UnidadeStats>(){

            @1.5.0/docs/api/java/lang/Override.html">Override
            public int compare(UnidadeStats o1, UnidadeStats o2)
            {
                int curso = o1.getNomeCurso().compareTo(o2.getNomeCurso());
                if(curso == 0)
                    return o1.getNomeUnidade().compareTo(o2.getNomeUnidade());
                else return curso;
            }
        });

        double sumRMTR = 0;
        double sumTR = 0;

        for(UnidadeStats stats: unidadeStatses)
        {
            //aqui é igual usar inscritos ou respostas esperadas porque como é apenas para um
            //docente é esperado que os inscritos do docente sejam os mesmos que as respostas esperadas
            //no curso é que pode ser diferente por causa de haver vários docentes
            //caso se use tipologias temos de rever isto porque ai nesse caso o docente pode ter mais que
            //uma resposta por aluno
            if(stats.getInscritos() != stats.getRespostasEsperadas())
            {

                1.5.0/docs/api/java/lang/String.html">String msg = "###UNIDADE: " + stats.getCodigoUnidade() + " " + stats.getNomeUnidade() + " " + stats.getNomeCurso();
                logger.info(msg);
                serviceLogWarn(msg);
                msg = "PROVISORIO #################Docente$$$$$$$$$$$$$$$$$ repostas Esperadas != Inscritos";
                logger.warn(msg);
                serviceLogWarn(msg);
                msg = "#################Docente$$$$$$$$$$$$$$$$$ repostas " + stats.getRespostasEsperadas() + " != " + stats.getInscritos();
                logger.warn(msg);
                serviceLogWarn(msg);
                msg = "#################provavelAvaliadaDuasVezes" + stats.getCodigoUnidade() + " " + stats.getNomeUnidade() + " " + stats.getNomeCurso();
                logger.warn(msg);
                serviceLogWarn(msg);
                provavelAvaliadaDuasVezes++;

            }
            double TR = (((double)stats.getRespostas()/(double)stats.getInscritos()));
            double RM = stats.getUnidadeStatsGrupoDocente().getMediasGrupo().getAvaliacaoMedia();
            double RMTR = RM * TR;
            sumRMTR += RMTR;
            sumTR += TR;
            DataTable.Row rowUnit = dataTable.addRowNormal();
            rowUnit.addColTextCenter(stats.getCodigoUnidade());
            rowUnit.addColTextCenter(stats.getNomeUnidade());
            rowUnit.addColTextCenter(stats.getCodigoCurso());
            rowUnit.addColTextCenter(stats.getNomeCurso());
            rowUnit.addColTextCenter(docenteReport.getAnoLectivo());
            rowUnit.addColTextCenter(stats.getSemestre());
            rowUnit.addColNumberRight(df.format(RM));
            rowUnit.addColNumberRight("" + stats.getRespostasEsperadas());//ou inscritos se nao houver tipologias
            rowUnit.addColNumberRight("" + stats.getRespostas());
            rowUnit.addColNumberRight(df.format(TR));
            rowUnit.addColNumberRight(df.format(RMTR));
        }

        double media = sumRMTR/sumTR;

        DataTable.Row rowFooter = dataTable.addRowFooter();
        DataTable.Row.Col soma = rowFooter.addColTextRight("Somatório das Parcelas");
        soma.setColspan(9);
        soma.setFontWeight("bold");

        DataTable.Row.Col sumTRCol = rowFooter.addColNumberRight(df.format(sumTR));
        sumTRCol.setFontWeight("bold");
        DataTable.Row.Col sumRMTRCol = rowFooter.addColNumberRight(df.format(sumRMTR));
        sumRMTRCol.setFontWeight("bold");


        docenteReport.setDocenteAvaliacaoDesempenhoTR(sumTR);
        docenteReport.setDocenteAvaliacaoDesempenhoRMTR(sumRMTR);
        docenteReport.setDocenteAvaliacaoDesempenhoMediaPeriodo(media);

        docenteReport.setDocenteAvaliacaoDesempenhoTRPrint(df.format(sumTR));
        docenteReport.setDocenteAvaliacaoDesempenhoRMTRPrint(df.format(sumRMTR));
        docenteReport.setDocenteAvaliacaoDesempenhoMediaPeriodoPrint(df.format(media));

        docenteReport.setDocenteAvaliacaoDesempenhoTable(dataTable);
    }

    private void criarProgressoesCharts(DocenteReport docenteReport, List<String> codigosCursos, List<String> codigosEscolas,1.5.0/docs/api/java/lang/String.html">String[] degrees,1.5.0/docs/api/java/lang/String.html">String[] periodos)
    {
        docenteReport.progressaoAgregadasDocentesVsCurso = criarProgressoChartGrupo(docenteReport, codigosCursos,PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,null,degrees,periodos);
        docenteReport.progressaoAgregadasUnidadesVsCurso = criarProgressoChartGrupo(docenteReport, codigosCursos,PerguntasGrupoQueryDao.GRUPO_UNIDADE_CODE_PERGUNTAS,null,degrees,periodos);

        docenteReport.progressaoAgregadasDocentesDrelAlunoVsCurso = criarProgressoChartGrupo(docenteReport, codigosCursos,PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,PerguntasGrupoQueryDao.GRUPO_DOCENTE_REL_ALUNO_CODE_PERGUNTAS,degrees,periodos);
        docenteReport.progressaoAgregadasDocentesDprofDocenteVsCurso = criarProgressoChartGrupo(docenteReport, codigosCursos,PerguntasGrupoQueryDao.GRUPO_DOCENTE_CODE_PERGUNTAS,PerguntasGrupoQueryDao.GRUPO_DOCENTE_PROFISSIONALISMO_DOCENTE_CODE_PERGUNTAS,degrees,periodos);

    }

    private 1.5.0/docs/api/java/lang/String.html">String criarProgressoChartGrupo(DocenteReport docenteReport, List<String> codigosCursos,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[] degrees,1.5.0/docs/api/java/lang/String.html">String[] periodos) {

        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 periodosQuery = QueryDaoUtils.createPeriodosQuery(periodos, "quest", true);
        //Media do Docente face ao curso Docente
        1.5.0/docs/api/javax/management/Query.html">Query query = AbstractDao.getCurrentSession().createQuery("" +
                "SELECT " +
                "avg(fc.intResposta) as media, " +
                "quest.generatedTime as date " +
                "FROM  " + OlapStarFactQuestionarioAnswer.class.getName() + " fc " +
                "JOIN fc.olapPergunta prgp " +
                "JOIN fc.olapTipologia tipo " +
                "JOIN fc.olapQuestionario quest " +
                "JOIN fc.olapCurso curso " +
                "JOIN fc.olapTimeLine timeLine " +

                "where " +
                "tipo.codigoSiges = :codigoSiges " +
                "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                (grupo != null ? " and prgp.grupoCode = :grupoCode " : "" ) +
                (subGrupo != null ? " and prgp.subGrupoCode = :subGrupoCode " : "" ) +
                degreesQuery +
                periodosQuery +
                " group by quest.generatedTime " +
                "order by quest.generatedTime asc ");
        if(grupo != null)
            query.setString("grupoCode",grupo);
        if(subGrupo != null)
            query.setString("subGrupoCode",subGrupo);
        query.setString("codigoSiges",docenteReport.getNumeroDocente());

        List<Object[]> timeSeriesAvgDocente = query.list();
        if(timeSeriesAvgDocente.size()>0)
        {
            5+0%2Fdocs%2Fapi+Date">Date firstOcurrence = (5+0%2Fdocs%2Fapi+Date">Date) timeSeriesAvgDocente.get(0)[1];
            5+0%2Fdocs%2Fapi+Date">Date lastOcurrence = (5+0%2Fdocs%2Fapi+Date">Date) timeSeriesAvgDocente.get(timeSeriesAvgDocente.size()-1)[1];

            1.5.0/docs/api/java/lang/String.html">String cursosQuery = QueryDaoUtils.createCursosQuery(codigosCursos, true);
            1.5.0/docs/api/javax/management/Query.html">Query queryCursos = AbstractDao.getCurrentSession().createQuery("" +
                    "SELECT " +
                    "avg(fc.intResposta) as media, " +
                    "quest.generatedTime as date " +
                    "FROM  " + OlapStarFactQuestionarioAnswer.class.getName() + " fc " +
                    "JOIN fc.olapPergunta prgp " +
                    "JOIN fc.olapTipologia tipo " +
                    "JOIN fc.olapQuestionario quest " +
                    "JOIN fc.olapCurso curso " +
                    "JOIN fc.olapTimeLine timeLine " +

                    "where " +
                    "quest.generatedTime >= :minDate and quest.generatedTime <= :maxDate " +
                    "and timeLine.nome = '" + PedagogicoAlunosProcessor.getHistoryDriveConstraintStatic() + "' " +
                    cursosQuery +
                    degreesQuery +
                    periodosQuery +
                    (grupo != null ? " and prgp.grupoCode = :grupoCode " : "" ) +
                    (subGrupo != null ? " and prgp.subGrupoCode = :subGrupoCode " : "" ) +
                    " group by quest.generatedTime " +
                    "order by quest.generatedTime asc ");
            if(grupo !=  null)
                queryCursos.setString("grupoCode",grupo);
            if(subGrupo !=  null)
                queryCursos.setString("subGrupoCode",subGrupo);
            queryCursos.setTimestamp("minDate", firstOcurrence);
            queryCursos.setTimestamp("maxDate",lastOcurrence);
            List<Object[]> timeSeriesAvgCursosDocente = queryCursos.list();

            try {
                1.5.0/docs/api/java/lang/String.html">String chart = ChartBuilderUtil.createTimeSeriesDiffArea((grupo!=null?grupo:"") + (subGrupo!=null?subGrupo:""), " Docente ", " Curso ", timeSeriesAvgDocente, timeSeriesAvgCursosDocente);
                return chart;
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


    private void criaExtremeCharts(DocenteReport docenteReport)
    {
        {
            DocenteReport.PerguntaUnidadeStatAux perguntaMaxDocente = docenteReport.extremePerguntaMaxDocente();
            DocenteReport.PerguntaUnidadeStatAux perguntaMinDocente = docenteReport.extremePerguntaMinDocente();
            DocenteReport.PerguntaUnidadeStatAux perguntaMaxUnidade = docenteReport.extremePerguntaMaxUnidade();
            DocenteReport.PerguntaUnidadeStatAux perguntaMinUnidade = docenteReport.extremePerguntaMinUnidade();

            try {

                if(perguntaMaxDocente != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaMaxDocente.pergunta.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaMaxDocente");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaMinDocente.pergunta.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaMinDocente");
                    ChartWithTitleTemp chartPerguntaMaxDocenteChart = new ChartWithTitleTemp(perguntaMaxDocente.pergunta.getPergunta(),perguntaMaxDocente.nomeUnidade,pathExtremePerguntaMaxDocente);
                    ChartWithTitleTemp chartPerguntaMinDocenteChart = new ChartWithTitleTemp(perguntaMinDocente.pergunta.getPergunta(),perguntaMinDocente.nomeUnidade,pathExtremePerguntaMinDocente);

                    docenteReport.extremePerguntaAbsolutaAvgMaxDocente = chartPerguntaMaxDocenteChart;
                    docenteReport.extremePerguntaAbsolutaAvgMinDocente = chartPerguntaMinDocenteChart;
                }
                if(perguntaMaxUnidade != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxUnidade = ChartBuilderUtil.createChartRingOneDimension(perguntaMaxUnidade.pergunta.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaMaxUnidade");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinUnidade = ChartBuilderUtil.createChartRingOneDimension(perguntaMinUnidade.pergunta.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaMinUnidade");
                    ChartWithTitleTemp chartPerguntaMaxUnidade = new ChartWithTitleTemp(perguntaMaxUnidade.pergunta.getPergunta(),perguntaMaxUnidade.nomeUnidade,pathExtremePerguntaMaxUnidade);
                    ChartWithTitleTemp chartPerguntaMinUnidade = new ChartWithTitleTemp(perguntaMinUnidade.pergunta.getPergunta(),perguntaMinUnidade.nomeUnidade,pathExtremePerguntaMinUnidade);

                    docenteReport.extremePerguntaAbsolutaAvgMaxUnidade = chartPerguntaMaxUnidade;
                    docenteReport.extremePerguntaAbsolutaAvgMinUnidade = chartPerguntaMinUnidade;
                }
            }
            catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
            {
                logger.error(e,e);
            }
        }

        {
            PerguntaStats perguntaAgregadaMaxDocente = docenteReport.extremeDocentePerguntaAgregadasMax();
            PerguntaStats perguntaAgregadaMinDocente = docenteReport.extremeDocentePerguntaAgregadasMin();
            PerguntaStats perguntaAgregadaMaxUnidade = docenteReport.extremeUnidadePerguntaAgregadaMax();
            PerguntaStats perguntaAgregadaMinUnidade = docenteReport.extremeUnidadePerguntaAgregadaMin();

            try {
                if(perguntaAgregadaMaxDocente != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaAgregadaMaxDocente.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaAgregadaMaxDocente");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaAgregadaMinDocente.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaAgregadaMinDocente");
                    ChartWithTitleTemp chartPerguntaMaxDocente = new ChartWithTitleTemp(perguntaAgregadaMaxDocente.getPergunta(),"",pathExtremePerguntaMaxDocente);
                    ChartWithTitleTemp chartPerguntaMinDocente = new ChartWithTitleTemp(perguntaAgregadaMinDocente.getPergunta(),"",pathExtremePerguntaMinDocente);

                    docenteReport.extremePerguntaAgregadaAvgMaxDocente = chartPerguntaMaxDocente;
                    docenteReport.extremePerguntaAgregadaAvgMinDocente = chartPerguntaMinDocente;
                }
                if(perguntaAgregadaMaxUnidade != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxUnidade = ChartBuilderUtil.createChartRingOneDimension(perguntaAgregadaMaxUnidade.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaAgregadaMaxUnidade");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinUnidade = ChartBuilderUtil.createChartRingOneDimension(perguntaAgregadaMinUnidade.getMediaEntidadeEmAvaliacao(),5,true,true,false,"extremePerguntaAgregadaMinUnidade");
                    ChartWithTitleTemp chartPerguntaMaxUnidade = new ChartWithTitleTemp(perguntaAgregadaMaxUnidade.getPergunta(),"",pathExtremePerguntaMaxUnidade);
                    ChartWithTitleTemp chartPerguntaMinUnidade = new ChartWithTitleTemp(perguntaAgregadaMinUnidade.getPergunta(),"",pathExtremePerguntaMinUnidade);

                    docenteReport.extremePerguntaAgregadaAvgMaxUnidade = chartPerguntaMaxUnidade;
                    docenteReport.extremePerguntaAgregadaAvgMinUnidade = chartPerguntaMinUnidade;
                }

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

        {
            UnidadeStats unidadeMaxDocente = docenteReport.extremeDocenteUnidadeMax();
            UnidadeStats unidadeMinDocente = docenteReport.extremeDocenteUnidadeMin();
            UnidadeStats unidadeMaxUnidade = docenteReport.extremeUnidadeUnidadeMax();
            UnidadeStats unidadeMinUnidade = docenteReport.extremeUnidadeUnidadeMin();

            try {
                if(unidadeMaxDocente != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxDocente = ChartBuilderUtil.createChartRingOneDimension(unidadeMaxDocente.getUnidadeStatsGrupoDocente().getMediasGrupo().getAvaliacaoMedia(),5,true,true,false,"extremeUnidadeMaxDocente");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinDocente = ChartBuilderUtil.createChartRingOneDimension(unidadeMinDocente.getUnidadeStatsGrupoDocente().getMediasGrupo().getAvaliacaoMedia(),5,true,true,false,"extremeUnidadeMinDocente");
                    ChartWithTitleTemp chartPerguntaMaxDocente = new ChartWithTitleTemp(unidadeMaxDocente.getNomeUnidade(),"",pathExtremePerguntaMaxDocente);
                    ChartWithTitleTemp chartPerguntaMinDocente = new ChartWithTitleTemp(unidadeMinDocente.getNomeUnidade(),"",pathExtremePerguntaMinDocente);

                    docenteReport.extremeUnitAvgMaxDocente = chartPerguntaMaxDocente;
                    docenteReport.extremeUnitAvgMinDocente = chartPerguntaMinDocente;
                }
                if(unidadeMaxUnidade != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxUnidade = ChartBuilderUtil.createChartRingOneDimension(unidadeMaxUnidade.getUnidadeStatsGrupoUnidade().getMediasGrupo().getAvaliacaoMedia(),5,true,true,false,"extremeUnidadeMaxUnidade");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinUnidade = ChartBuilderUtil.createChartRingOneDimension(unidadeMinUnidade.getUnidadeStatsGrupoUnidade().getMediasGrupo().getAvaliacaoMedia(),5,true,true,false,"extremeUnidadeMinUnidade");
                    ChartWithTitleTemp chartPerguntaMaxUnidade = new ChartWithTitleTemp(unidadeMaxUnidade.getNomeUnidade(),"",pathExtremePerguntaMaxUnidade);
                    ChartWithTitleTemp chartPerguntaMinUnidade = new ChartWithTitleTemp(unidadeMinUnidade.getNomeUnidade(),"",pathExtremePerguntaMinUnidade);

                    docenteReport.extremeUnitAvgMaxUnidade = chartPerguntaMaxUnidade;
                    docenteReport.extremeUnitAvgMinUnidade = chartPerguntaMinUnidade;
                }
            }
            catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
            {
                logger.error(e,e);
            }
        }

        {
            DocenteReport.PerguntaUnidadeStatAux perguntaDiffMaxDocente = docenteReport.extremeDiffMediaPerguntaMaxDocente();
            DocenteReport.PerguntaUnidadeStatAux perguntaDiffMinDocente = docenteReport.extremeDiffMediaPerguntaMinDocente();
            DocenteReport.PerguntaUnidadeStatAux perguntaDiffMaxUnidade = docenteReport.extremeDiffMediaPerguntaMaxUnidade();
            DocenteReport.PerguntaUnidadeStatAux perguntaDiffMinUnidade = docenteReport.extremeDiffMediaPerguntaMinUnidade();

            try {
                if(perguntaDiffMaxDocente != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxDocente = ChartBuilderUtil.createBarChartTwoBars("Docente","Curso",ChartBuilderUtil.COLOR_SECTION_BLUE_DARK,ChartBuilderUtil.COLOR_SECTION_GREEN, perguntaDiffMaxDocente.pergunta.getMediaEntidadeEmAvaliacao(),perguntaDiffMaxDocente.pergunta.getMediaCursos(),5,"extremeDiffMaxDocente");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinDocente = ChartBuilderUtil.createBarChartTwoBars("Docente", "Curso", ChartBuilderUtil.COLOR_SECTION_BLUE_DARK, ChartBuilderUtil.COLOR_SECTION_GREEN, perguntaDiffMinDocente.pergunta.getMediaEntidadeEmAvaliacao(), perguntaDiffMinDocente.pergunta.getMediaCursos(), 5, "extremeDiffMinDocente");
                    ChartWithTitleTemp chartPerguntaMaxDocente = new ChartWithTitleTemp(perguntaDiffMaxDocente.pergunta.getPergunta() + " ( " + perguntaDiffMaxDocente.pergunta.getDiffMediaCursoPrint() + ")",perguntaDiffMaxDocente.nomeUnidade,pathExtremePerguntaMaxDocente);
                    ChartWithTitleTemp chartPerguntaMinDocente = new ChartWithTitleTemp(perguntaDiffMinDocente.pergunta.getPergunta() + " ( " + perguntaDiffMinDocente.pergunta.getDiffMediaCursoPrint() + ")",perguntaDiffMinDocente.nomeUnidade,pathExtremePerguntaMinDocente);

                    docenteReport.extremePerguntaAbsolutaDiffAvgMaxDocente = chartPerguntaMaxDocente;
                    docenteReport.extremePerguntaAbsolutaDiffAvgMinDocente = chartPerguntaMinDocente;
                }
                if(perguntaDiffMaxUnidade != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxUnidade = ChartBuilderUtil.createBarChartTwoBars("Docente", "Curso", ChartBuilderUtil.COLOR_SECTION_BLUE_DARK, ChartBuilderUtil.COLOR_SECTION_GREEN, perguntaDiffMaxUnidade.pergunta.getMediaEntidadeEmAvaliacao(), perguntaDiffMaxUnidade.pergunta.getMediaCursos(), 5, "extremeDiffMaxUnidade");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinUnidade = ChartBuilderUtil.createBarChartTwoBars("Docente", "Curso", ChartBuilderUtil.COLOR_SECTION_BLUE_DARK, ChartBuilderUtil.COLOR_SECTION_GREEN, perguntaDiffMinUnidade.pergunta.getMediaEntidadeEmAvaliacao(), perguntaDiffMinUnidade.pergunta.getMediaCursos(), 5, "extremeDiffMinUnidade");
                    ChartWithTitleTemp chartPerguntaMaxUnidade = new ChartWithTitleTemp(perguntaDiffMaxUnidade.pergunta.getPergunta() + " ( " + perguntaDiffMaxUnidade.pergunta.getDiffMediaCursoPrint() + ")",perguntaDiffMaxUnidade.nomeUnidade,pathExtremePerguntaMaxUnidade);
                    ChartWithTitleTemp chartPerguntaMinUnidade = new ChartWithTitleTemp(perguntaDiffMinUnidade.pergunta.getPergunta() + " ( " + perguntaDiffMinUnidade.pergunta.getDiffMediaCursoPrint() + ")",perguntaDiffMinUnidade.nomeUnidade,pathExtremePerguntaMinUnidade);

                    docenteReport.extremePerguntaAbsolutaDiffAvgMaxUnidade = chartPerguntaMaxUnidade;
                    docenteReport.extremePerguntaAbsolutaDiffAvgMinUnidade = chartPerguntaMinUnidade;
                }

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


        {
            QuestionariosAlunosReport.ParticipacaoUnidade perguntaDiffMax = docenteReport.extremeParticipacaoUnidadeMax();
            QuestionariosAlunosReport.ParticipacaoUnidade perguntaDiffMin = docenteReport.extremeParticipacaoUnidadeMin();

            try {
                if(perguntaDiffMax != null)
                {
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMaxDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaDiffMax.getRespostas(),perguntaDiffMax.getInscritos(),true,true,false,"extremeParticipacaoMax");
                    1.5.0/docs/api/java/lang/String.html">String pathExtremePerguntaMinDocente = ChartBuilderUtil.createChartRingOneDimension(perguntaDiffMin.getRespostas(),perguntaDiffMin.getInscritos(),true,true,false,"extremeParticipacaoMin");

                    ChartWithTitleTemp chartPerguntaMaxDocente = new ChartWithTitleTemp(perguntaDiffMax.getNomeUnidade() + " (inscritos: " + perguntaDiffMax.getInscritos() + ")","",pathExtremePerguntaMaxDocente);
                    ChartWithTitleTemp chartPerguntaMinDocente = new ChartWithTitleTemp(perguntaDiffMin.getNomeUnidade() + " (inscritos: " + perguntaDiffMin.getInscritos() + ")","",pathExtremePerguntaMinDocente);

                    docenteReport.extremeParticipacaoMax = chartPerguntaMaxDocente;
                    docenteReport.extremeParticipacaoMin = chartPerguntaMinDocente;
                }
            }
            catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
            {
                logger.error(e,e);
            }
        }




    }


    /**
     *
     * GET PARAMETERS
     *    FILE_GROUP_ID
     * LOAD FILE GROUP GET ANO, PERIODOS, DEGREES
     * GET ALL DOCENTES
     *   GENERATE REPORT
     *   UPLOAD FILE REPOSITORY WITH PERMISSIONS
     *      QUESTIONARIOS_FILE_GROUP_DOCENTE_REPORT
     *      DELETE TMP
     * GENERATE CSV FILE
     *   PUT STREAM IN FILE GROUP
     *        QUESTIONARIOS_FILE_GROUP_DOCENTE_ALL
     * CREATE ZIP WITH ALL REPORTS PUT IN FILE GROUP
     * DELETE TMP
     *   PUT STREAM IN FILE GROUP
     *        QUESTIONARIOS_FILE_GROUP_DOCENTE_ALL
     * DELETE TMP
     *
     * @return
     * @throws Throwable
     */

    @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();

        int docentesEncontrados = 0;
        int docentesProcessados = 0;
        int docentesFalhados = 0;
        int docentesSemRespostas = 0;
        int docentesSemUnidadesAfetas = 0;
        int docentesComRespostas = 0;

        QuestionarioReportFileGroupDocentesAnoImpl reportGroup = (QuestionarioReportFileGroupDocentesAnoImpl) DaoFactory.getQuestionarioReportFileGroupDocentesAnoDaoImpl().load(questionarioReportId);
        reportGroup.setActive(false);
        1.5.0/docs/api/java/io/File.html">File reportGroupFolder = new 1.5.0/docs/api/java/io/File.html">File(Globals.TMP_DIR + 1.5.0/docs/api/java/io/File.html">File.separator + "reportGroup" + reportGroup.getId());

        anoLectivo = reportGroup.getImportYear();
        periodos = reportGroup.getPeriodosArray();
        degrees = reportGroup.getDegreesArray();

        1.5.0/docs/api/java/lang/String.html">String msg = "Starting process for Report Docentes (" + questionarioReportId + "): " + reportGroup.getTitle();
        serviceLogInfo(msg);
        logger.info(msg);


        List<String> teacherCodes = QuestionariosQueryDao.findTeachersSigesCodes(reportGroup.getImportYear(),periodos,degrees);

        msg = "Vai processar " + teacherCodes.size() + " Docentes ";
        serviceLogInfo(msg);
        logger.info(msg);

        //todo tirar isto
        teacherCodes.add(0,"20083");

        for(1.5.0/docs/api/java/lang/String.html">String sigesCode: teacherCodes)
        {
            if(sigesCode == null)
            {
                msg = "Found Teacher with siges code null, not known but has units in " + reportGroup.getImportYear();
                serviceLogInfo(msg);
                logger.info(msg);
                continue;
            }
            docentesEncontrados++;

            /** COMMIT OPERATION **/ //Tem mais um para contemplar o zip folder operation
            setProgress((int)((((float)docentesEncontrados)/((float)teacherCodes.size()+1))*100.0f));
            commitPartially();
            reportGroup = (QuestionarioReportFileGroupDocentesAnoImpl) DaoFactory.getQuestionarioReportFileGroupDocentesAnoDaoImpl().load(questionarioReportId);
            /** COMMIT OPERATION **/

            try{
                Teacher t = DaoFactory.getTeacherDaoImpl().loadBySigesCode(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(sigesCode));
                msg = "(" + docentesEncontrados + "/" + teacherCodes.size() + ") Found Teacher sigesCode: " + sigesCode + " " + t.getName() + " will start process";
                serviceLogInfo(msg);
                logger.info(msg);
                DocenteReport docenteReport = processTeacher("" + sigesCode,reportGroupFolder);



                1.5.0/docs/api/java/lang/String.html">String tmpPath = docenteReport.getPathGeneratedPdfTemp();
                //todo criar o docente report File e colocar no repositorio digit
                QuestionarioReportDocenteFile q = DaoFactory.getQuestionarioReportDocenteFileDaoImpl().findBySigesCode(sigesCode,reportGroup.getId());
                if(q == null)
                {
                    q = new QuestionarioReportDocenteFileImpl();
                    q.setReportGroup(reportGroup);
                    q.setEntityCode("" + sigesCode);
                    q.setEntityName(t.getName());
                    //q.setTeacher(t);
                    DaoFactory.getQuestionarioReportDocenteFileDaoImpl().save(q);
                }
                q.setActive(true);
                q.setInquiridos(docenteReport.getInquiridosTotal());
                q.setInquiridosComResposta(docenteReport.getInquiridosComResposta());
                q.setRespostasRequisitadas(docenteReport.getQuestionariosReqTotal());
                q.setRespostas(docenteReport.getQuestionariosReqRespondidos());
                q.setUnidades(docenteReport.getUnidadesRequisitadas());
                q.setPercentagemInquiridos(docenteReport.getInquiridosComRespostaPercent());
                q.setPercentagemRespostas(docenteReport.getQuestionariosReqRespondidosPercentagem());

                //STATS
                if(q.getInquiridos() == 0)
                    docentesSemUnidadesAfetas++;
                else if(q.getRespostas() == 0)
                    docentesSemRespostas++;
                else
                    docentesComRespostas++;

                1.5.0/docs/api/java/io/File.html">File tmpFile = new 1.5.0/docs/api/java/io/File.html">File(tmpPath);
                sendPdfToRepository( q,
                        tmpFile,
                        "Relatório dos Resultados do Inquérito Pedagógico aos Alunos - Relatório de Docente Privado " + t.getName() + " (" + sigesCode + ") " + " periodos:" + 1.5.0/docs/api/java/util/Arrays.html">Arrays.toString(periodos) + " degrees:" + 1.5.0/docs/api/java/util/Arrays.html">Arrays.toString(degrees),
                        ResourceAccessControlEnum.questionariosReportDocente
                );

                //Final
                docentesProcessados++;
            }catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
            {
                msg = "FAIL - Teacher with siges: " + sigesCode;
                serviceLogError(msg,e);
                logger.error(msg,e);
                docentesFalhados++;
            }
        }

        /** COMMIT OPERATION **/   //Tem mais um para contemplar o zip folder operation
        setProgress((int)((((float)docentesEncontrados)/((float)teacherCodes.size()+1))*100.0f));
        commitPartially();
        reportGroup = (QuestionarioReportFileGroupDocentesAnoImpl) DaoFactory.getQuestionarioReportFileGroupDocentesAnoDaoImpl().load(questionarioReportId);
        /** COMMIT OPERATION **/


        serviceLogInfo("######################################");
        serviceLogInfo("######################################");
        serviceLogInfo("#Docentes Encontrados:" + docentesEncontrados);
        serviceLogInfo("#Docentes Processados:" + docentesProcessados);
        serviceLogInfo("#Docentes Com Resposta:" + docentesComRespostas);
        serviceLogInfo("#Docentes Sem Respostas:" + docentesSemRespostas);
        serviceLogInfo("#Docentes Sem Unidades Afetas:" + docentesSemUnidadesAfetas);
        serviceLogInfo("#Docentes Falhados:" + docentesFalhados);

        logger.info("######################################");
        logger.info("######################################");
        logger.info("#Docentes Encontrados:" + docentesEncontrados);
        logger.info("#Docentes Processados:" + docentesProcessados);
        logger.info("#Docentes Falhados:" + docentesFalhados);
        logger.info("#Docentes Com Resposta:" + docentesComRespostas);
        logger.info("#Docentes Sem Respostas:" + docentesSemRespostas);
        logger.info("#Docentes Sem Unidades Afetas:" + docentesSemUnidadesAfetas);

        reportGroup.setEntidadesEncontradas(docentesEncontrados);
        reportGroup.setEntidadesProcessadas(docentesProcessados);
        reportGroup.setEntidadesFalhadas(docentesFalhados);
        reportGroup.setEntidadesComRespostas(docentesComRespostas);
        reportGroup.setEntidadesSemRespostas(docentesSemRespostas);
        reportGroup.setEntidadesSemUnidadesAfetas(docentesSemUnidadesAfetas);



        commitPartially();
        reportGroup = (QuestionarioReportFileGroupDocentesAnoImpl) DaoFactory.getQuestionarioReportFileGroupDocentesAnoDaoImpl().load(questionarioReportId);

        logger.info("ziping files");
        serviceLogInfo("ziping files");
        logMessages.addMessage(new DefaultLogMessage("ziping files", LogMessageTypeEnum.INFO));
        zipFolder(
                reportGroup,
                reportGroupFolder,
                "Relatórios de Docente ZIPADOS " + " ano:" + anoLectivo + " periodos:" + 1.5.0/docs/api/java/util/Arrays.html">Arrays.toString(periodos) + " degrees:" + 1.5.0/docs/api/java/util/Arrays.html">Arrays.toString(degrees),
                ResourceAccessControlEnum.questionariosReportBoardAndPedagogico);

        setProgress(100);
        commitPartially();

        logger.info("terminating docente reports generation");
        serviceLogInfo("terminating docente reports generation");
        logMessages.addMessage(new DefaultLogMessage("report.docente.gen.terminating", LogMessageTypeEnum.INFO));


        return logMessages;
    }
}