Subversion Repositories bacoAlunos

Rev

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

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

import jomm.dao.impl.AbstractDao;
import jomm.utils.MyCalendar;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
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.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.estgp.estgweb.utils.DistritosUtils;

import java.util.*;


/**
 * Created by jorgemachado on 22/03/16.
 */

public class OlapGenerationProcessor extends ServiceJob
{

    //int unidadesNaoUtilizadas = 0;


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

    int unidadesNaoUtilizadas = 0;
    int unidadesUtilizadas = 0;
    //int unidadesMarcadas = 0;
    //int unidadesNaoVistasProf = 0;
    //int unidadesNaoVistasAlunos = 0;
    int cursosUtilizados = 0;
    //int respostasRequisitadas = 0;
    int cursosSemDepartamento = 0;
    int unidadesSemPeriodoNoPlano = 0;



    /**
     * #############  JOB TASK ############
     * #############  JOB TASK ############
     * @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 questionarioId = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
        DefaultLogMessages logMessages = new DefaultLogMessages();

        //unidadesNaoUtilizadas = 0;

        unidadesNaoUtilizadas = 0;
        unidadesUtilizadas = 0;
        //unidadesMarcadas = 0;
        //unidadesNaoVistasProf = 0;
        //unidadesNaoVistasAlunos = 0;
        cursosUtilizados = 0;
        //respostasRequisitadas = 0;

        cursosSemDepartamento = 0;
        unidadesSemPeriodoNoPlano = 0;



        QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
        try{

            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioCurso.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioUnidade.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioTipologia.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionario.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioAnswer.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapStarFactQuestionarioAnswerEsforco.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();

            AbstractDao.getCurrentSession().getTransaction().commit();
            AbstractDao.getCurrentSession().beginTransaction();

            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioUser.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioCurso.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioUnidade.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioPergunta.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioPerguntaEsforco.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();
            AbstractDao.getCurrentSession().createQuery("delete from " + OlapEntityQuestionarioTipologia.class.getName() + " x where x.questionario.id = " + questionarioId).executeUpdate();

            AbstractDao.getCurrentSession().getTransaction().commit();
            AbstractDao.getCurrentSession().beginTransaction();

            q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);

            List<OlapEntityQuestionario> questionarios = AbstractDao.getCurrentSession().createQuery("select x from x in class " + OlapEntityQuestionario.class.getName() + " where x.questionario.id = " + questionarioId).list();
            OlapEntityQuestionario olapQuestionario;
            OlapHistoryDimension olapHistoryDimension;
            if(questionarios.size() > 0)
            {
                olapQuestionario = questionarios.get(0);
                updateOlapQuestionario(olapQuestionario, q);
                List<OlapHistoryDimension> histories = AbstractDao.getCurrentSession().createQuery("select x from x in class " + OlapHistoryDimension.class.getName() + " where x.questionario.id = " + questionarioId).list();
                olapHistoryDimension = histories.get(0);
            }
            else
            {
                //+++++++ todo CRIANDO OLAP Questionario
                olapQuestionario = createQuestionarioOlap(q);
                olapHistoryDimension = new OlapHistoryDimension();
                olapHistoryDimension.setQuestionario(q);
                //+++++++ todo CRIANDO OLAP History
                DaoFactory.getOlapHistoryDimensionDaoImpl().save(olapHistoryDimension);
            }
            olapHistoryDimension.setNome(q.getQuestionarioHistoryDrive().getCodeName());
            olapHistoryDimension.setDescricao(q.getQuestionarioHistoryDrive().getDescription());


            //Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre

            /**logging**/
            1.5.0/docs/api/java/lang/String.html">String msg = "Starting running service OLAP GENERATION generation for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
            serviceLogInfo(msg);
            logger.info(msg);

            List<Long> cursosAfetosIds = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().findCursosAfetosIds(questionarioId);
            int count = 0;
            int size=cursosAfetosIds.size();


            //+++++++ todo CRIANDO OLAP Perguntas
            HashMap<Integer,Long> mapaIdsPerguntasPersistentes = createOlapQuestionarioPergunta(q);
            HashMap<Integer,Long> mapaIdsPerguntasEsforcoPersistentes = createOlapQuestionarioPerguntaEsforco(q);


            for(1.5.0/docs/api/java/lang/Long.html">Long cursoAfetoId : cursosAfetosIds)
            {
                count++;

                /** COMMIT OPERATION **/
                setProgress((int)((((float)count)/((float)size))*100.0f));
                commitPartially();
                q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
                /** COMMIT OPERATION **/



                QuestionarioPedagogicoCursoAfeto cu = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().get(cursoAfetoId);
                msg = "(+) Iniciando geração OLAP para o curso " + cu.getNome() + " (" + cu.getCodigoCurso() + ") escola " + cu.getNomeInstituicao() + "(" + cu.getCodigoInstituicao() + ")";
                logger.info(msg);
                serviceLogInfo(msg);

                //+++++++ todo CRIANDO OLAP Curso
                int unidadesCurso = 0;
                int tipologiasCurso = 0;
                int respostasCandidatasCurso = 0;
                int respostasObtidasCurso = 0;
                OlapEntityQuestionarioCurso olapQuestionarioCurso = createQuestionarioCursoOlap(logMessages, q, cu);

                int unidades;
                if(cu.getUnidadesAfetas() != null)
                {
                    unidades = cu.getUnidadesAfetas().size();
                    unidadesCurso = unidades;
                    int countUnidades = 0;
                    for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
                    {
                        countUnidades++;
                        msg = unidadeCurricularAfeta.isUsar() ? "(+)" : "(----IGNORADA-----)";
                        msg += "(" + countUnidades + "/" + unidades + ") Iniciando OLAP de Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome();
                        logger.info(msg);
                        serviceLogInfo(msg);


                        if(!unidadeCurricularAfeta.isUsar() || !unidadeCurricularAfeta.isUsarOlap())
                        {
                            unidadesNaoUtilizadas++;
                            msg = "!!! A unidade está marcada para NÃO SER UTILIZADA, passando à próxima";
                            serviceLogWarn(msg);
                            logger.warn(msg);
                            logMessages.addMessage(new DefaultLogMessage("questionario.olap", LogMessageTypeEnum.WARNING,msg));
                        }
                        else
                        {
                            CourseUnitImpl cuImpl = (CourseUnitImpl) DaoFactory.getCourseUnitDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit());
                            CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(unidadeCurricularAfeta.getCourseUnit().getCourse());

                            //TODO CRIANDO ENTIDADE OLAP UNIDADE
                            int tipologiasUnidade = unidadeCurricularAfeta.getTipologiasRequisitadas().size();
                            int respostasCandidatasUnidade = 0;
                            int respostasObtidasUnidade = 0;
                            tipologiasCurso += tipologiasUnidade;
                            OlapEntityQuestionarioUnidade olapQuestionarioUnidade = createOlapQuestionarioUnidade(logMessages, q, unidadeCurricularAfeta, cuImpl);

                            unidadesUtilizadas++;

                            for(QuestionarioPedagogicoTipologiaRequisitada tipologiaRequisitada: unidadeCurricularAfeta.getTipologiasRequisitadas())
                            {
                                msg ="Iniciando OLAP de Tipologia Requisitada " + tipologiaRequisitada.getDsTipologia() + " " + tipologiaRequisitada.getCdTipologia()
                                        + " docente: " + tipologiaRequisitada.getCdDocente() + "(" + tipologiaRequisitada.getNomeDocente() + ")"
                                        + " turma: " + tipologiaRequisitada.getCdTurma();
                                serviceLogInfo(msg);
                                logger.info(msg);


                                //TODO CRIANDO ENTIDADE OLAP TIPOLOGIA
                                int respostasCandidatasTipologia = tipologiaRequisitada.getAlunosRequisitados().size();
                                int respostasObtidasTipologia = 0;
                                respostasCandidatasCurso += respostasCandidatasTipologia;
                                respostasCandidatasUnidade += respostasCandidatasTipologia;
                                OlapEntityQuestionarioTipologia olapQuestionarioTipologia = createOlapQuestionarioTipologia(q, tipologiaRequisitada);

                                for(QuestionarioPedagogicoAlunoRequisitado alunoRequisitado: tipologiaRequisitada.getAlunosRequisitados())
                                {
                                    QuestionarioRespostaRequisitada respostaRequisitada = alunoRequisitado.getRespostaRequisitada();

                                    //TODO CRIANDO NESTE QUESTIONARIO ENTIDADE PERFIL UTILIZADOR
                                    OlapEntityQuestionarioUser olapQuestionarioUser = createOlapQuestionarioUser(q, alunoRequisitado);


                                    //TODO CRIANDO ENTIDADE FACTO RESPOSTA RESPONDIDA/NAO RESPONDIDA
                                    createOlapStarFactQuestionario(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, olapQuestionarioUnidade, olapQuestionarioTipologia, respostaRequisitada, olapQuestionarioUser);


                                    //TODO USAR ENTIDADES RESPOSTAPERGUNTA COM BASE NO QUESTIONARIO EM QUESTAO
                                    if(respostaRequisitada.getResposta() != null)
                                    {
                                        QuestionarioResposta resposta = respostaRequisitada.getResposta();
                                        respostasObtidasCurso++;
                                        respostasObtidasUnidade++;
                                        respostasObtidasTipologia++;
                                        //TODO CRIAR FACTOS RESPOSTA COM BASE NA RESPOSTA




                                        List<OlapStarFactQuestionarioAnswer> factRespostas = new ArrayList<OlapStarFactQuestionarioAnswer>();
                                        for(1.5.0/docs/api/java/util/Map.html">Map.Entry<Integer,Long> entryPergunta : mapaIdsPerguntasPersistentes.entrySet())
                                        {
                                            int numeroPergunta = entryPergunta.getKey();
                                            1.5.0/docs/api/java/lang/Long.html">Long idPerguntaBd = entryPergunta.getValue();
                                            OlapEntityQuestionarioPergunta olapPergunta = DaoFactory.getOlapEntityQuestionarioPerguntaDaoImpl().load(idPerguntaBd);



                                            1.5.0/docs/api/java/lang/Long.html">Long timeTakenRN = (1.5.0/docs/api/java/lang/Long.html">Long) QuestionarioResposta.class.getMethod("getTimeTakenR" + numeroPergunta).invoke(resposta);
                                            1.5.0/docs/api/java/lang/Long.html">Long timeEventRN = (1.5.0/docs/api/java/lang/Long.html">Long) QuestionarioResposta.class.getMethod("getTimeEventR" + numeroPergunta).invoke(resposta);
                                            1.5.0/docs/api/java/lang/String.html">String respostaN = (1.5.0/docs/api/java/lang/String.html">String) QuestionarioResposta.class.getMethod("getR" + numeroPergunta).invoke(resposta);


                                            if(respostaN != null)
                                            {
                                                createOlapQuestionarioAnswer(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, olapQuestionarioUnidade, olapQuestionarioTipologia, olapQuestionarioUser, factRespostas, olapPergunta, timeTakenRN, timeEventRN, respostaN);
                                            }
                                        }
                                        1.5.0/docs/api/java/util/Collections.html">Collections.sort(factRespostas,new Comparator<OlapStarFactQuestionarioAnswer>() {
                                            @1.5.0/docs/api/java/lang/Override.html">Override
                                            public int compare(OlapStarFactQuestionarioAnswer o1, OlapStarFactQuestionarioAnswer o2) {
                                                return (int) (o1.getDataEvento().getTime() - o2.getDataEvento().getTime());
                                            }
                                        });
                                        int i = 1;
                                        for(OlapStarFactQuestionarioAnswer fact: factRespostas)
                                        {
                                            fact.setOrdemResposta(i);
                                            i++;
                                        }


                                        //PERGUNTAS DE ESFORCO Tudo Igual mas para Esforco-------------------------------------------
                                        List<OlapStarFactQuestionarioAnswerEsforco> factRespostasEsforco = new ArrayList<OlapStarFactQuestionarioAnswerEsforco>();
                                        for(1.5.0/docs/api/java/util/Map.html">Map.Entry<Integer,Long> entryPerguntaEsforco : mapaIdsPerguntasEsforcoPersistentes.entrySet())
                                        {
                                            int numeroPergunta = entryPerguntaEsforco.getKey();
                                            1.5.0/docs/api/java/lang/Long.html">Long idPerguntaBd = entryPerguntaEsforco.getValue();
                                            OlapEntityQuestionarioPerguntaEsforco olapPerguntaEsforco = DaoFactory.getOlapEntityQuestionarioPerguntaEsforcoDaoImpl().load(idPerguntaBd);



                                            1.5.0/docs/api/java/lang/Long.html">Long timeTakenRN = (1.5.0/docs/api/java/lang/Long.html">Long) QuestionarioResposta.class.getMethod("getTimeTakenRe" + numeroPergunta).invoke(resposta);
                                            1.5.0/docs/api/java/lang/Long.html">Long timeEventRN = (1.5.0/docs/api/java/lang/Long.html">Long) QuestionarioResposta.class.getMethod("getTimeEventRe" + numeroPergunta).invoke(resposta);
                                            1.5.0/docs/api/java/lang/String.html">String respostaN = (1.5.0/docs/api/java/lang/String.html">String) QuestionarioResposta.class.getMethod("getRe" + numeroPergunta).invoke(resposta);


                                            if(respostaN != null)
                                            {
                                                createOlapQuestionarioAnswerEsforco(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, olapQuestionarioUnidade, olapQuestionarioTipologia, olapQuestionarioUser, factRespostasEsforco, olapPerguntaEsforco, timeTakenRN, timeEventRN, respostaN);
                                            }
                                        }
                                        1.5.0/docs/api/java/util/Collections.html">Collections.sort(factRespostasEsforco,new Comparator<OlapStarFactQuestionarioAnswerEsforco>() {
                                            @1.5.0/docs/api/java/lang/Override.html">Override
                                            public int compare(OlapStarFactQuestionarioAnswerEsforco o1, OlapStarFactQuestionarioAnswerEsforco o2) {
                                                return (int) (o1.getDataEvento().getTime() - o2.getDataEvento().getTime());
                                            }
                                        });
                                        i = 1;
                                        for(OlapStarFactQuestionarioAnswerEsforco fact: factRespostasEsforco)
                                        {
                                            fact.setOrdemResposta(i);
                                            i++;
                                        }

                                    }
                                }

                                //TODO CRIANDO FACTO TIPOLOGIA
                                createOlapStarFactTipologia(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, olapQuestionarioUnidade, respostasCandidatasTipologia, respostasObtidasTipologia, olapQuestionarioTipologia);


                            }

                            //TODO CRIANDO FACTO UNIDADE
                            createOlapStarFactUnidade(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, olapQuestionarioUnidade, tipologiasUnidade, respostasCandidatasUnidade, respostasObtidasUnidade);

                        }
                    }
                }
                //TODO CRIANDO FACTO CURSO
                createOlapStarFactCurso(q, olapQuestionario, olapHistoryDimension, olapQuestionarioCurso, tipologiasCurso, unidadesCurso, respostasCandidatasCurso, respostasObtidasCurso);

            }

            /** COMMIT OPERATION **/
            setProgress(100);
            commitPartially();
            DaoFactory.getQuestionarioDaoImpl().update(q);
            /** COMMIT OPERATION **/

            msg = "Set courses state as " + QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.OLAP.name();
            serviceLogInfo(msg);
            logger.info(msg);
            q.setStateClass(QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.OLAP);
            commitPartially();


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


            logger.info("######################################");
            logger.info("######################################");
        }
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            logger.error(e,e);
            q.setStateClass(QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.CLOSED);
            throw e;
        }
        return logMessages;
    }

    private void createOlapStarFactCurso(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso,int unidadesCurso, int tipologiasCurso, int respostasCandidatasCurso, int respostasObtidasCurso)
    {
        OlapStarFactQuestionarioCurso factQuestionarioCurso = new OlapStarFactQuestionarioCurso();
        factQuestionarioCurso.setUnidades(unidadesCurso);
        factQuestionarioCurso.setTipologias(tipologiasCurso);
        factQuestionarioCurso.setRespostasCandidatas(respostasCandidatasCurso);
        factQuestionarioCurso.setRespostasObtidas(respostasObtidasCurso);
        factQuestionarioCurso.setQuestionario(q);
        factQuestionarioCurso.setOlapTimeLine(olapHistoryDimension);
        factQuestionarioCurso.setOlapQuestionario(olapQuestionario);
        factQuestionarioCurso.setOlapCurso(olapQuestionarioCurso);
        DaoFactory.getOlapStarFactQuestionarioCursoDaoImpl().save(factQuestionarioCurso);
    }

    private void createOlapStarFactUnidade(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso, OlapEntityQuestionarioUnidade olapQuestionarioUnidade,int tipologiasUnidade, int respostasCandidatasUnidade, int respostasObtidasUnidade)
    {
        OlapStarFactQuestionarioUnidade factQuestionarioUnidade = new OlapStarFactQuestionarioUnidade();
        factQuestionarioUnidade.setTipologias(tipologiasUnidade);
        factQuestionarioUnidade.setRespostasCandidatas(respostasCandidatasUnidade);
        factQuestionarioUnidade.setRespostasObtidas(respostasObtidasUnidade);
        factQuestionarioUnidade.setQuestionario(q);
        factQuestionarioUnidade.setOlapTimeLine(olapHistoryDimension);
        factQuestionarioUnidade.setOlapQuestionario(olapQuestionario);
        factQuestionarioUnidade.setOlapCurso(olapQuestionarioCurso);
        factQuestionarioUnidade.setOlapUnidade(olapQuestionarioUnidade);
        DaoFactory.getOlapStarFactQuestionarioUnidadeDaoImpl().save(factQuestionarioUnidade);
    }

    private void createOlapStarFactTipologia(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso, OlapEntityQuestionarioUnidade olapQuestionarioUnidade, int respostasCandidatasTipologia, int respostasObtidasTipologia, OlapEntityQuestionarioTipologia olapQuestionarioTipologia) {
        OlapStarFactQuestionarioTipologia factQuestionarioTipologia = new OlapStarFactQuestionarioTipologia();
        factQuestionarioTipologia.setRespostasCandidatas(respostasCandidatasTipologia);
        factQuestionarioTipologia.setRespostasObtidas(respostasObtidasTipologia);
        factQuestionarioTipologia.setQuestionario(q);
        factQuestionarioTipologia.setOlapTimeLine(olapHistoryDimension);
        factQuestionarioTipologia.setOlapQuestionario(olapQuestionario);
        factQuestionarioTipologia.setOlapCurso(olapQuestionarioCurso);
        factQuestionarioTipologia.setOlapUnidade(olapQuestionarioUnidade);
        factQuestionarioTipologia.setOlapTipologia(olapQuestionarioTipologia);
        DaoFactory.getOlapStarFactQuestionarioTipologiaDaoImpl().save(factQuestionarioTipologia);
    }

    private void createOlapQuestionarioAnswer(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso, OlapEntityQuestionarioUnidade olapQuestionarioUnidade, OlapEntityQuestionarioTipologia olapQuestionarioTipologia, OlapEntityQuestionarioUser olapQuestionarioUser, List<OlapStarFactQuestionarioAnswer> factRespostas, OlapEntityQuestionarioPergunta olapPergunta, 1.5.0/docs/api/java/lang/Long.html">Long timeTakenRN, 1.5.0/docs/api/java/lang/Long.html">Long timeEventRN, 1.5.0/docs/api/java/lang/String.html">String respostaN) {
        OlapStarFactQuestionarioAnswer factQuestionarioAnswer = new OlapStarFactQuestionarioAnswer();
        factQuestionarioAnswer.setQuestionario(q);
        factQuestionarioAnswer.setOlapTimeLine(olapHistoryDimension);
        factQuestionarioAnswer.setOlapQuestionario(olapQuestionario);
        factQuestionarioAnswer.setOlapUnidade(olapQuestionarioUnidade);
        factQuestionarioAnswer.setOlapPerfilUser(olapQuestionarioUser);
        factQuestionarioAnswer.setOlapTipologia(olapQuestionarioTipologia);
        factQuestionarioAnswer.setOlapCurso(olapQuestionarioCurso);

        factQuestionarioAnswer.setOlapPergunta(olapPergunta);
        factQuestionarioAnswer.setDataEvento(new 5+0%2Fdocs%2Fapi+Date">Date(timeEventRN));
        factQuestionarioAnswer.setTempoLevado(timeTakenRN);
        factQuestionarioAnswer.setIntResposta(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(respostaN));
        factRespostas.add(factQuestionarioAnswer);
        DaoFactory.getOlapStarFactQuestionarioAnswerDaoImpl().save(factQuestionarioAnswer);
    }

    private void createOlapQuestionarioAnswerEsforco(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso, OlapEntityQuestionarioUnidade olapQuestionarioUnidade, OlapEntityQuestionarioTipologia olapQuestionarioTipologia, OlapEntityQuestionarioUser olapQuestionarioUser, List<OlapStarFactQuestionarioAnswerEsforco> factRespostasEsforco, OlapEntityQuestionarioPerguntaEsforco olapPergunta, 1.5.0/docs/api/java/lang/Long.html">Long timeTakenRN, 1.5.0/docs/api/java/lang/Long.html">Long timeEventRN, 1.5.0/docs/api/java/lang/String.html">String respostaN) {
        OlapStarFactQuestionarioAnswerEsforco factQuestionarioAnswerEsforco = new OlapStarFactQuestionarioAnswerEsforco();
        factQuestionarioAnswerEsforco.setQuestionario(q);
        factQuestionarioAnswerEsforco.setOlapTimeLine(olapHistoryDimension);
        factQuestionarioAnswerEsforco.setOlapQuestionario(olapQuestionario);
        factQuestionarioAnswerEsforco.setOlapUnidade(olapQuestionarioUnidade);
        factQuestionarioAnswerEsforco.setOlapPerfilUser(olapQuestionarioUser);
        factQuestionarioAnswerEsforco.setOlapTipologia(olapQuestionarioTipologia);
        factQuestionarioAnswerEsforco.setOlapCurso(olapQuestionarioCurso);

        factQuestionarioAnswerEsforco.setOlapPerguntaEsforco(olapPergunta);
        factQuestionarioAnswerEsforco.setDataEvento(new 5+0%2Fdocs%2Fapi+Date">Date(timeEventRN));
        factQuestionarioAnswerEsforco.setTempoLevado(timeTakenRN);
        factQuestionarioAnswerEsforco.setIntResposta(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(respostaN));
        factRespostasEsforco.add(factQuestionarioAnswerEsforco);
        DaoFactory.getOlapStarFactQuestionarioAnswerEsforcoDaoImpl().save(factQuestionarioAnswerEsforco);
    }

    private OlapStarFactQuestionario createOlapStarFactQuestionario(QuestionarioImpl q, OlapEntityQuestionario olapQuestionario, OlapHistoryDimension olapHistoryDimension, OlapEntityQuestionarioCurso olapQuestionarioCurso, OlapEntityQuestionarioUnidade olapQuestionarioUnidade, OlapEntityQuestionarioTipologia olapQuestionarioTipologia, QuestionarioRespostaRequisitada respostaRequisitada, OlapEntityQuestionarioUser olapQuestionarioUser) {
        QuestionarioResposta resposta = respostaRequisitada.getResposta();

        OlapStarFactQuestionario factQuestionario = new OlapStarFactQuestionario();
        factQuestionario.setQuestionario(q);
        factQuestionario.setOlapTimeLine(olapHistoryDimension);
        factQuestionario.setOlapQuestionario(olapQuestionario);
        factQuestionario.setOlapUnidade(olapQuestionarioUnidade);
        factQuestionario.setOlapPerfilUser(olapQuestionarioUser);
        factQuestionario.setOlapTipologia(olapQuestionarioTipologia);
        factQuestionario.setOlapCurso(olapQuestionarioCurso);
        factQuestionario.setRespondido(resposta != null);
        if(resposta != null)
        {
            factQuestionario.setDataInicio(new 5+0%2Fdocs%2Fapi+Date">Date(resposta.getTimeStart()));
            factQuestionario.setDataFim(new 5+0%2Fdocs%2Fapi+Date">Date(resposta.getTimeEnd()));
            factQuestionario.setTempoTotal(resposta.getTotalTime());
        }
        DaoFactory.getOlapStarFactQuestionarioDaoImpl().save(factQuestionario);
        return factQuestionario;
    }

    private OlapEntityQuestionarioUser createOlapQuestionarioUser(QuestionarioImpl q, QuestionarioPedagogicoAlunoRequisitado alunoRequisitado) {
        OlapEntityQuestionarioUser questionarioUser = new OlapEntityQuestionarioUser();
        questionarioUser.setQuestionario(q);
        questionarioUser.setSigesCode("" + alunoRequisitado.getAluno().getSigesCode());
        questionarioUser.setBirthDate(alunoRequisitado.getAluno().getBirthDate());
        questionarioUser.setCountry(alunoRequisitado.getAluno().getCountry());
        questionarioUser.setNacionalidade(alunoRequisitado.getAluno().getNacionalidade());

        questionarioUser.setScholarDegree(alunoRequisitado.getAluno().getScholarDegree());
        questionarioUser.setSex(alunoRequisitado.getAluno().getSex());

        if(!alunoRequisitado.isTipoAlunoFoiExtraido())
        {
            //este procedimento aplica-se a casos de importacao anteriores a criacao
            //dos campos tipo de aluno no aluno requisitado
            alunoRequisitado.setPropinasEmDia(alunoRequisitado.getAluno().isPropinasEmDia());
            alunoRequisitado.setTipoAlunoBolseiro(alunoRequisitado.getAluno().isTipoAlunoBolseiro());
            alunoRequisitado.setTipoAlunoNormal(alunoRequisitado.getAluno().isTipoAlunoNormal());
            alunoRequisitado.setTipoAlunoVascodagama(alunoRequisitado.getAluno().isTipoAlunoVascodagama());
            alunoRequisitado.setTipoAlunoMilitar(alunoRequisitado.getAluno().isTipoAlunoMilitar());
            alunoRequisitado.setTipoAlunoDirigenteAssociativo(alunoRequisitado.getAluno().isTipoAlunoDirigenteAssociativo());
            alunoRequisitado.setTipoAlunoBombeiro(alunoRequisitado.getAluno().isTipoAlunoBombeiro());
            alunoRequisitado.setTipoAlunoDeficiente(alunoRequisitado.getAluno().isTipoAlunoDeficiente());
            alunoRequisitado.setTipoAlunoErasmus(alunoRequisitado.getAluno().isTipoAlunoErasmus());
            alunoRequisitado.setTipoAlunoTrabalhadorEstudante(alunoRequisitado.getAluno().isTipoAlunoTrabalhadorEstudante());
            alunoRequisitado.setTipoAlunoFoiExtraido(true);
        }
        questionarioUser.setPropinasEmDia(alunoRequisitado.isPropinasEmDia());
        questionarioUser.setTipoAlunoBolseiro(alunoRequisitado.isTipoAlunoBolseiro());
        questionarioUser.setTipoAlunoNormal(alunoRequisitado.isTipoAlunoNormal());
        questionarioUser.setTipoAlunoVascodagama(alunoRequisitado.isTipoAlunoVascodagama());
        questionarioUser.setTipoAlunoMilitar(alunoRequisitado.isTipoAlunoMilitar());
        questionarioUser.setTipoAlunoDirigenteAssociativo(alunoRequisitado.isTipoAlunoDirigenteAssociativo());
        questionarioUser.setTipoAlunoBombeiro(alunoRequisitado.isTipoAlunoBombeiro());
        questionarioUser.setTipoAlunoDeficiente(alunoRequisitado.isTipoAlunoDeficiente());
        questionarioUser.setTipoAlunoErasmus(alunoRequisitado.isTipoAlunoErasmus());
        questionarioUser.setTipoAlunoTrabalhadorEstudante(alunoRequisitado.isTipoAlunoTrabalhadorEstudante());


        questionarioUser.setZip(alunoRequisitado.getAluno().getZip());
        1.5.0/docs/api/java/lang/String.html">String zipCandidate = alunoRequisitado.getAluno().getZip();
        if(alunoRequisitado.getAluno().getZip()!= null && alunoRequisitado.getAluno().getZip().indexOf("-")>=0)
        {
            zipCandidate = alunoRequisitado.getAluno().getZip().substring(0, alunoRequisitado.getAluno().getZip().indexOf("-"));
        }
        if(zipCandidate!=null)
        {
            try
            {
                questionarioUser.setZipInt(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(zipCandidate));
                questionarioUser.setDistrito(DistritosUtils.getDistrito(alunoRequisitado.getAluno().getZip()));
                questionarioUser.setConcelho(DistritosUtils.getConselho(alunoRequisitado.getAluno().getZip()));
            }
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
            {
                questionarioUser.setZipInt(0);
                questionarioUser.setDistrito("DESCONHECIDO");
                questionarioUser.setConcelho("DESCONHECIDO");
                logger.info("Zip code error in student (siges code): " + alunoRequisitado.getAluno().getSigesCode());
            }
        }



        DaoFactory.getOlapEntityQuestionarioUserDaoImpl().save(questionarioUser);
        return questionarioUser;
    }

    private OlapEntityQuestionarioTipologia createOlapQuestionarioTipologia(QuestionarioImpl q, QuestionarioPedagogicoTipologiaRequisitada tipologiaRequisitada) {
        OlapEntityQuestionarioTipologia questionarioTipologia = new OlapEntityQuestionarioTipologia();
        questionarioTipologia.setQuestionario(q);

        questionarioTipologia.setCodigoTipologia(tipologiaRequisitada.getCdTipologia());
        questionarioTipologia.setCodigoTurma(tipologiaRequisitada.getCdTurma());
        questionarioTipologia.setDescricao(tipologiaRequisitada.getDsTipologia());
        //DOCENTE
        questionarioTipologia.setNome(tipologiaRequisitada.getNomeDocente());
        questionarioTipologia.setCodigoSiges(tipologiaRequisitada.getCdDocente());
        questionarioTipologia.setBi(tipologiaRequisitada.getDocenteAfeto().getBi());
        questionarioTipologia.setEmail(tipologiaRequisitada.getDocenteAfeto().getEmail());
        questionarioTipologia.setUsername(tipologiaRequisitada.getDocenteAfeto().getUsername());

        DaoFactory.getOlapEntityQuestionarioTipologiaDaoImpl().save(questionarioTipologia);
        return questionarioTipologia;
    }

    private OlapEntityQuestionarioUnidade createOlapQuestionarioUnidade(DefaultLogMessages logMessages, QuestionarioImpl q, QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta, CourseUnitImpl cuImpl) {
        1.5.0/docs/api/java/lang/String.html">String msg;
        OlapEntityQuestionarioUnidade olapEntityQuestionarioUnidade = new OlapEntityQuestionarioUnidade();

        olapEntityQuestionarioUnidade.setQuestionario(q);
        olapEntityQuestionarioUnidade.setNome(unidadeCurricularAfeta.getNome());
        olapEntityQuestionarioUnidade.setCodigo(unidadeCurricularAfeta.getCodigoUnidade());

        olapEntityQuestionarioUnidade.setPeriodoPlanoS1T8(cuImpl.getPeriodoPlanoFromStudiesPlan());
        olapEntityQuestionarioUnidade.setSemestrePlanoAbsoluto1ou2(cuImpl.getSemestrePlanoAbsoluto());
        olapEntityQuestionarioUnidade.setPeriodoSigesS1ouS2ouAouT1aT4(cuImpl.getSemestre());
        //Semestre S1 a T8 ainda nao sao usados em lado nenhum neste sistema, era pensado para se usar nas estatisticas
        //de forma a juntar unidades nos mesmos semestres mas ainda nao esta em uso
        if(olapEntityQuestionarioUnidade.getPeriodoPlanoS1T8() == null)
        {
            unidadesSemPeriodoNoPlano++;
            msg = "!!! A unidade " + cuImpl.getCode() + " não tem periodo atribuido no Plano";
            serviceLogWarn(msg);
            logger.warn(msg);
            logMessages.addMessage(new DefaultLogMessage("questionario.olap", LogMessageTypeEnum.WARNING,msg));
        }
        else
        {
            olapEntityQuestionarioUnidade.setAnoPlano1a4(cuImpl.getAnoPlanoFromStudiesPlan());
            if(olapEntityQuestionarioUnidade.getAnoPlano1a4() <= 0)
            {
                msg = "!!! A unidade " + cuImpl.getCode() + " tem periodo atribuido no Plano MAS O ANO ESTA MAL";
                serviceLogWarn(msg);
                logger.warn(msg);
            }
            //tem de ser igual ao semestre.getId() rever situação com um if e warn se falhar
            olapEntityQuestionarioUnidade.setSemestrePlanoConvertido1a6(cuImpl.getSemestrePlanoConvertido());
            if(olapEntityQuestionarioUnidade.getSemestrePlanoConvertido1a6() <=  0)
            {
                msg = "!!! A unidade " + cuImpl.getCode() + " tem getPeriodoPlanoS1T8 atribuido no Plano MAS ESTA MAL";
                serviceLogWarn(msg);
                logger.warn(msg);
            }
        }
        DaoFactory.getOlapEntityQuestionarioUnidadeDaoImpl().save(olapEntityQuestionarioUnidade);
        return olapEntityQuestionarioUnidade;
    }


    private OlapEntityQuestionarioCurso createQuestionarioCursoOlap(DefaultLogMessages logMessages, QuestionarioImpl q, QuestionarioPedagogicoCursoAfeto cu) {
        OlapEntityQuestionarioCurso questionarioCurso;
        1.5.0/docs/api/java/lang/String.html">String msg;
        questionarioCurso = new OlapEntityQuestionarioCurso();
        questionarioCurso.setQuestionario(q);
        questionarioCurso.setCodigoCurso(cu.getCodigoCurso());
        questionarioCurso.setDegree(cu.getCourse().getDegree());
        if(cu.getCourse().getDepartment() == null)
        {
            msg = "Curso sem departamento corrigir situação: " + cu.getNome();
            logger.warn(msg);
            serviceLogWarn(msg);
            logMessages.addMessage(new DefaultLogMessage("questionario.olap", LogMessageTypeEnum.WARNING,msg));
        }
        else
        {
            cursosSemDepartamento++;
            questionarioCurso.setDepartament(cu.getCourse().getDepartment().getSigla());
        }
        questionarioCurso.setNomeCurso(cu.getNome());
        questionarioCurso.setNomeInstituicao(cu.getNomeInstituicao());
        questionarioCurso.setCodigoInstituicao(cu.getCodigoInstituicao());
        questionarioCurso.setCodigoNacionalInstituicao(ConfigProperties.getProperty("institution.national.code."+cu.getCodigoInstituicao()));
        DaoFactory.getOlapEntityQuestionarioCursoDaoImpl().save(questionarioCurso);
        return questionarioCurso;
    }
    private OlapEntityQuestionario createQuestionarioUnidadeOlap(QuestionarioImpl q)
    {

        return null;
    }
    private OlapEntityQuestionario createQuestionarioOlap(QuestionarioImpl q)
    {
        OlapEntityQuestionario olapEntityQuestionario = new OlapEntityQuestionario();
        DaoFactory.getOlapEntityQuestionarioDaoImpl().save(olapEntityQuestionario);
        return updateOlapQuestionario(olapEntityQuestionario, q);
    }

    private OlapEntityQuestionario updateOlapQuestionario(OlapEntityQuestionario olapEntityQuestionario, QuestionarioImpl q)
    {
        olapEntityQuestionario.setQuestionario(q);
        olapEntityQuestionario.setAno(q.getYear());
        olapEntityQuestionario.setSemestre(q.getSemestre());
        int firstYear = DatesUtils.getFirstFromImportYear(q.getYear());
        int secondYear = DatesUtils.getSecondFromImportYear(q.getYear());

        if(q.getSemestre().equals("T1"))
        {
        olapEntityQuestionario.setGeneratedTime(new MyCalendar(firstYear,11,1).getTime());
        }
        else if(q.getSemestre().equals("S1") || q.getSemestre().equals("T2"))
        {
            olapEntityQuestionario.setGeneratedTime(new MyCalendar(secondYear,2,1).getTime());
        }
        else if(q.getSemestre().equals("T3"))
        {
            olapEntityQuestionario.setGeneratedTime(new MyCalendar(secondYear,5,1).getTime());
        }
        else if(q.getSemestre().equals("S2") || q.getSemestre().equals("T4") || q.getSemestre().equals("A"))
        {
            olapEntityQuestionario.setGeneratedTime(new MyCalendar(secondYear,8,1).getTime());
        }
        else
        {
            logger.error("AVISO, DATA Não tem semestre correcto");
        }
        return olapEntityQuestionario;
    }

    /**
     * Return a map of ID's given the question number
     * @param q
     * @return
     */

    private HashMap<Integer,Long> createOlapQuestionarioPergunta(QuestionarioImpl q)
    {

        /**
         * Numero da Pergunta VS Id na base de dados da dimensão
         */

        HashMap<Integer,Long> mapaIdsPerguntasPersistentes = new HashMap<Integer, Long>();

        for(int i = 1; i <= 40;i++)
        {
            OlapEntityQuestionarioPergunta pergunta = new OlapEntityQuestionarioPergunta();
            pergunta.setNumero("" + i);
            pergunta.setPergunta(q.getPergunta("" + i));
            if(pergunta.getPergunta() == null || pergunta.getPergunta().trim().length() == 0)
                continue;
            pergunta.setGrupoCode(q.getGrupoCode("" + i));
            if(pergunta.getGrupoCode() == null || pergunta.getGrupoCode().trim().length() == 0)
                continue;
            pergunta.setGrupoTitle(q.getGrupoTitle("" + i));

            1.5.0/docs/api/java/lang/String.html">String subGroupCode = q.getSubGrupoCode("" + i);
            if(subGroupCode != null)
            {
                pergunta.setSubGrupoCode(subGroupCode);
                pergunta.setSubGrupoTitle(q.getSubGrupoTitle("" + i));
            }

            pergunta.setQuestionario(q);

            DaoFactory.getOlapEntityQuestionarioPerguntaDaoImpl().save(pergunta);

            mapaIdsPerguntasPersistentes.put(i,pergunta.getId());

            1.5.0/docs/api/java/lang/System.html">System.out.println("Pergunta OLAP Entity " + i + " ID: " + pergunta.getId());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getNumero());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getPergunta());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getGrupoCode());
            1.5.0/docs/api/java/lang/System.html">System.out.println(pergunta.getGrupoTitle());


        }

        return mapaIdsPerguntasPersistentes;


    }

    private HashMap<Integer,Long> createOlapQuestionarioPerguntaEsforco(QuestionarioImpl q)
    {

        /**
         * Numero da Pergunta VS Id na base de dados da dimensão
         */

        HashMap<Integer,Long> mapaIdsPerguntasEsforcoPersistentes = new HashMap<Integer, Long>();

        for(int i = 1; i <= 10;i++)
        {
            OlapEntityQuestionarioPerguntaEsforco perguntaEsforco = new OlapEntityQuestionarioPerguntaEsforco();
            perguntaEsforco.setNumero("" + i);
            perguntaEsforco.setPergunta(q.getPerguntaE("" + i));
            if(perguntaEsforco.getPergunta() == null || perguntaEsforco.getPergunta().trim().length() == 0)
                continue;
            perguntaEsforco.setGrupoCode(q.getGrupoCodeE("" + i));
            if(perguntaEsforco.getGrupoCode() == null || perguntaEsforco.getGrupoCode().trim().length() == 0)
                continue;
            perguntaEsforco.setGrupoTitle(q.getGrupoTitleE("" + i));

            1.5.0/docs/api/java/lang/String.html">String subGroupCode = q.getSubGrupoCodeE("" + i);
            if(subGroupCode != null)
            {
                perguntaEsforco.setSubGrupoCode(subGroupCode);
                perguntaEsforco.setSubGrupoTitle(q.getSubGrupoTitleE("" + i));
            }

            perguntaEsforco.setQuestionario(q);

            DaoFactory.getOlapEntityQuestionarioPerguntaEsforcoDaoImpl().save(perguntaEsforco);

            mapaIdsPerguntasEsforcoPersistentes.put(i,perguntaEsforco.getId());

            1.5.0/docs/api/java/lang/System.html">System.out.println("Pergunta Esforco OLAP Entity " + i + " ID: " + perguntaEsforco.getId());
            1.5.0/docs/api/java/lang/System.html">System.out.println(perguntaEsforco.getNumero());
            1.5.0/docs/api/java/lang/System.html">System.out.println(perguntaEsforco.getPergunta());
            1.5.0/docs/api/java/lang/System.html">System.out.println(perguntaEsforco.getGrupoCode());
            1.5.0/docs/api/java/lang/System.html">System.out.println(perguntaEsforco.getGrupoTitle());


        }

        return mapaIdsPerguntasEsforcoPersistentes;


    }


}