Subversion Repositories bacoAlunos

Rev

Rev 1401 | Rev 1415 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1327 jmachado 1
package pt.estgp.estgweb.services.questionarios.pedagogico;
2
 
1333 jmachado 3
import com.owlike.genson.TransformationException;
1328 jmachado 4
import org.apache.log4j.Logger;
1327 jmachado 5
import org.json.JSONArray;
1328 jmachado 6
import org.json.JSONException;
1327 jmachado 7
import pt.estgp.estgweb.domain.*;
1328 jmachado 8
import pt.estgp.estgweb.domain.dao.DaoFactory;
1333 jmachado 9
import pt.estgp.estgweb.domain.dao.impl.CourseUnitDaoImpl;
1327 jmachado 10
import pt.estgp.estgweb.services.jobs.JobDeamon;
11
import pt.estgp.estgweb.services.jobs.ServiceJob;
12
import pt.estgp.estgweb.services.logresults.ILogMessages;
1332 jmachado 13
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
14
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
1327 jmachado 15
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
1329 jmachado 16
import pt.estgp.estgweb.services.questionarios.QuestionariosService;
1336 jmachado 17
import pt.estgp.estgweb.utils.ConfigProperties;
1327 jmachado 18
import pt.estgp.estgweb.web.exceptions.NotAuthorizedException;
19
import pt.utl.ist.berserk.logic.serviceManager.IService;
20
 
1333 jmachado 21
import java.io.IOException;
22
import java.util.*;
1327 jmachado 23
 
1328 jmachado 24
 
1327 jmachado 25
/**
26
 * Created by jorgemachado on 22/03/16.
27
 */
28
public class UpdateCoursesAndUnitsJobService extends ServiceJob implements IService
29
{
30
 
1328 jmachado 31
    public 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(UpdateCoursesAndUnitsJobService.class);
32
 
1329 jmachado 33
    //return similar questionarios in same year, semestre and history category
34
    public List<QuestionarioImpl> setAnoSemestre(1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String semestre, long questionarioId, UserSession userSession,QuestionarioImpl questionarioCleared) throws NotAuthorizedException
35
    {
36
        if(questionarioCleared.isClear((UserSessionImpl) userSession,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SET_ANO_SEMESTRE.name()))
37
        {
38
            questionarioCleared.setYear(year);
39
            questionarioCleared.setSemestre(semestre);
40
            questionarioCleared.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED);
41
            List<QuestionarioImpl> similar = DaoFactory.getQuestionarioDaoImpl().findAnoSemestre(year, semestre, questionarioCleared.getQuestionarioHistoryDrive().getId());
42
            new QuestionariosService().loadInit(similar);
43
            return similar;
44
        }
45
        else
46
            throw new NotAuthorizedException("Não pode alterar o formulário porque o questionário está num estado avançado");
47
    }
48
 
49
 
1328 jmachado 50
    public 1.5.0/docs/api/java/lang/String.html">String[] deserializeCoursesList(QuestionarioImpl questionario)
51
    {
52
        JobServiceTaskImpl job = questionario.getCourseSelectionTaskId() > 0 ?
53
                (JobServiceTaskImpl) DaoFactory.getJobServiceTaskDaoImpl().load(questionario.getCourseSelectionTaskId()) :
54
                null;
55
        if(job == null)
56
            return new 1.5.0/docs/api/java/lang/String.html">String[0];
57
 
58
        1.5.0/docs/api/java/lang/String.html">String courses = job.getParameter(ServiceJob.JOB_questionario_courseList_KEY).getObject();
1332 jmachado 59
        return deserializeCoursesList(courses);
60
    }
1328 jmachado 61
 
1332 jmachado 62
    public List<Course> getCoursesList(1.5.0/docs/api/java/lang/String.html">String coursesListJson)
63
    {
64
        List<Course> courses = new ArrayList<Course>();
65
        1.5.0/docs/api/java/lang/String.html">String[] courseIds = deserializeCoursesList(coursesListJson);
66
        for(1.5.0/docs/api/java/lang/String.html">String courseId: courseIds)
67
        {
68
            try
69
            {
70
                Course c = DaoFactory.getCourseDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(courseId));
71
                courses.add(c);
72
            }
73
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
74
            {
75
                logger.info("Course not found in course list with id:" + courseId);
76
            }
77
        }
78
        return courses;
79
    }
80
 
81
    public 1.5.0/docs/api/java/lang/String.html">String[] deserializeCoursesList(1.5.0/docs/api/java/lang/String.html">String json)
82
    {
1328 jmachado 83
        try {
84
 
1332 jmachado 85
            JSONArray jsonArray = new JSONArray(json);
1328 jmachado 86
            1.5.0/docs/api/java/lang/String.html">String[] coursesList = new 1.5.0/docs/api/java/lang/String.html">String[jsonArray.length()];
87
            for(int i=0;i <jsonArray.length();i++)
88
            {
89
                coursesList[i] = ""+ jsonArray.get(i);
90
            }
91
            return coursesList;
92
        } catch (JSONException e) {
93
            logger.error(e,e);
94
        }
95
        return new 1.5.0/docs/api/java/lang/String.html">String[0];
96
    }
1333 jmachado 97
 
1404 jmachado 98
    /*************
99
     * CRIAR O JOB PARA O RUNNER
100
     * @param questionarioId
101
     * @param coursesList
102
     * @param session
103
     * @param questionarioCleared
104
     * @return
105
     * @throws NotAuthorizedException
106
     */
1327 jmachado 107
    public QuestionarioImpl runJobSelectCourses(long questionarioId,1.5.0/docs/api/java/lang/String.html">String[] coursesList,UserSession session,QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
108
 
109
        if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_SCHEDULLE_SELECT_COURSES.name()))
110
        {
111
            throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos");
112
        }
1404 jmachado 113
 
114
        /*******VERIFICACAO DE RESPOSTAS*********/
115
        long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
116
        if(respostas == 0)
117
        {
118
            (questionarioCleared).setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.ASSIGNING_COURSES);
119
        }
120
        else
121
        {
122
            logger.warn("Vai falhar no serviço, deixar falhar para visar o user");
123
        }
124
 
1327 jmachado 125
        JSONArray jsonArray = new JSONArray();
126
        for(1.5.0/docs/api/java/lang/String.html">String sele: coursesList)
127
        {
128
            jsonArray.put(new 1.5.0/docs/api/java/lang/Long.html">Long(sele));
129
        }
130
 
131
        Set<JobServiceTaskParameter> paramsJob = new HashSet<JobServiceTaskParameter>();
132
 
133
        JobServiceTaskParameterImpl paramJobL = DomainObjectFactory.createJobServiceTaskParameterImpl();
134
        paramJobL.setName(ServiceJob.JOB_questionario_courseList_KEY);
135
        paramJobL.setDescription("lista de cursos a associar");
136
        paramJobL.setObject(jsonArray.toString());
137
        paramsJob.add(paramJobL);
138
 
139
 
140
        JobServiceTaskParameterImpl paramJob = DomainObjectFactory.createJobServiceTaskParameterImpl();
141
        paramJob.setName(ServiceJob.JOB_questionario_id_KEY);
142
        paramJob.setDescription("ID do questionário");
143
        paramJob.setObject("" + questionarioId);
144
        paramsJob.add(paramJob);
145
 
146
        JobServiceTask job = JobDeamon.createServiceJob(UpdateCoursesAndUnitsJobService.class, session.getUser(), paramsJob,
147
                "Service: Atribuição de Cursos e Unidades a um questionário Pedagógico");
148
        questionarioCleared.setCourseSelectionTaskId(job.getId());
149
        return questionarioCleared;
150
    }
151
 
1332 jmachado 152
 
1333 jmachado 153
    /**
154
     *
1336 jmachado 155
     * @param questionarioId
156
     * @param session
157
     * @param questionarioCleared
158
     * @throws NotAuthorizedException
159
     *
160
     */
161
    public ILogMessages revertAllAssignments(long questionarioId, UserSession session,QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
162
 
163
        DefaultLogMessages logMessages = new DefaultLogMessages();
164
        if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_REVERT_ALL_ASSIGNEMENTS.name()))
165
        {
166
            throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos");
167
        }
1404 jmachado 168
        long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
169
        if(respostas > 0)
170
        {
171
            logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
172
                    "Operação não permitida, Existem Respostas"));
173
            logger.warn(logMessages.getLastMessage());
174
            serviceLogError(logMessages.getLastMessage());
175
            return logMessages;
176
        }
1336 jmachado 177
        for(QuestionarioPedagogicoCursoAfeto cu : DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(questionarioId))
178
        {
179
            int unidades = 0;
180
            if(cu.getUnidadesAfetas() != null)
181
            {
182
                unidades = cu.getUnidadesAfetas().size();
183
                for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
184
                {
1401 jmachado 185
                    1.5.0/docs/api/java/lang/String.html">String msg = "Reverting Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome();
186
                    logger.info(msg);
187
                    logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
1336 jmachado 188
                    if(unidadeCurricularAfeta.getTipologiasRequisitadas() != null && unidadeCurricularAfeta.getTipologiasRequisitadas().size() > 0)
189
                    {
1401 jmachado 190
                        msg = "A unidade " + unidadeCurricularAfeta.getCodigoUnidade() + " tem tipologias requisitadas que tem de ser removidas primeiro, iremos remover todas as tipologias e respostas candidatas associadas";
1336 jmachado 191
                        logger.warn(msg);
192
                        logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
193
                        removeTipologiasERespostasCascade(unidadeCurricularAfeta);
194
                    }
1401 jmachado 195
                    unidadeCurricularAfeta.setCursoAfeto(null);
196
                    DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidadeCurricularAfeta);
1336 jmachado 197
                }
198
            }
199
            1.5.0/docs/api/java/lang/String.html">String msg = "Removendo curso afeto:" + cu.getNome() + " e " + unidades + " uniades afetas";
200
            logger.info(msg);
201
            logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.INFO,msg));
202
 
203
            cu.setUnidadesAfetas(null);
204
            DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().delete(cu);
205
        }
206
        questionarioCleared.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.YEAR_SEMESTRE_ASSIGNED);
207
        return logMessages;
208
    }
209
 
1387 jmachado 210
 
1399 jmachado 211
    public static ILogMessages revertAllRespostasCandidatas(long questionarioId, ServiceJob serviceJob) throws NotAuthorizedException {
1387 jmachado 212
 
213
        DefaultLogMessages logMessages = new DefaultLogMessages();
1404 jmachado 214
 
215
        long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
216
        if(respostas > 0)
217
        {
218
            logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
219
                    "Operação não permitida, Existem Respostas"));
220
            logger.warn(logMessages.getLastMessage());
221
            serviceJob.serviceLogError(logMessages.getLastMessage());
222
            throw new NotAuthorizedException(logMessages.getLastMessage());
223
        }
224
 
1387 jmachado 225
        1.5.0/docs/api/java/lang/String.html">String msg = "Revertendo respostas candidatas do questionario " + questionarioId;
1399 jmachado 226
        logger.info(msg);
227
        serviceJob.serviceLogInfo(msg);
1387 jmachado 228
 
229
        for(QuestionarioPedagogicoCursoAfeto cu : DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(questionarioId))
230
        {
231
            msg = "Revertendo respostas do curso " + cu.getCodigoCurso() + " , iremos remover todas as tipologias e respostas candidatas associadas";
1399 jmachado 232
            logger.info(msg);
233
            serviceJob.serviceLogInfo(msg);
1394 jmachado 234
            ((QuestionarioPedagogicoCursoAfetoImpl)cu).resetAnswerStats();
1387 jmachado 235
 
236
            int unidades = 0;
237
            if(cu.getUnidadesAfetas() != null)
238
            {
239
                unidades = cu.getUnidadesAfetas().size();
240
                for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeCurricularAfeta: cu.getUnidadesAfetas())
241
                {
1394 jmachado 242
                    ((QuestionarioPedagogicoUnidadeCurricularAfetaImpl)unidadeCurricularAfeta).resetAnswerStats();
1387 jmachado 243
                    logger.info("Reverting Respostas Unidade Curricular Afeta " + unidadeCurricularAfeta.getCodigoUnidade() + " - " + unidadeCurricularAfeta.getNome());
244
                    if(unidadeCurricularAfeta.getTipologiasRequisitadas() != null && unidadeCurricularAfeta.getTipologiasRequisitadas().size() > 0)
245
                    {
246
                        msg = "A unidade " + unidadeCurricularAfeta.getCodigoUnidade() + " tem tipologias requisitadas que tem de ser removidas primeiro, iremos remover todas as tipologias e respostas candidatas associadas";
1399 jmachado 247
                        logger.info(msg);
248
                        serviceJob.serviceLogWarn(msg);
1387 jmachado 249
                        logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
250
                        removeTipologiasERespostasCascade(unidadeCurricularAfeta);
251
                    }
252
                }
253
            }
254
            logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.INFO,msg));
255
        }
256
        return logMessages;
257
    }
258
 
1336 jmachado 259
    /**
260
     *
261
     */
1399 jmachado 262
    protected static void removeTipologiasERespostasCascade(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeAfeta)
1336 jmachado 263
    {
264
        for(QuestionarioPedagogicoTipologiaRequisitada tr: unidadeAfeta.getTipologiasRequisitadas())
265
        {
266
            logger.warn("deleting: " + tr);
267
            if(tr.getAlunosRequisitados() != null)
268
            {
269
                for(QuestionarioPedagogicoAlunoRequisitado ar: tr.getAlunosRequisitados())
270
                {
271
                    logger.warn("deleting: " + ar);
272
                    if(ar.getRespostaRequisitada() != null)
273
                    {
274
                        logger.warn("deleting: Resposta Requisitada " + ar.getRespostaRequisitada().getId());
275
                        if(ar.getRespostaRequisitada().getResposta() != null)
276
                        {
277
                            logger.warn("deleting resposta: " + ar.getRespostaRequisitada().getResposta());
278
                            DaoFactory.getQuestionarioRespostaDaoImpl().delete(ar.getRespostaRequisitada().getResposta());
279
                            ar.getRespostaRequisitada().setResposta(null);
280
                        }
281
                        DaoFactory.getQuestionarioRespostaRequisitadaDaoImplImpl().delete(ar.getRespostaRequisitada());
282
                        ar.setRespostaRequisitada(null);
283
                    }
284
                    DaoFactory.getQuestionarioPedagogicoAlunoRequisitadoDaoImpl().delete(ar);
285
                }
286
                tr.setAlunosRequisitados(null);
287
            }
288
            DaoFactory.getQuestionarioPedagogicoTipologiaRequisitadaDaoImpl().delete(tr);
289
        }
290
        unidadeAfeta.setTipologiasRequisitadas(null);
291
    }
292
 
293
    /**
294
     *
1404 jmachado 295
     * #############  JOB TASK ############
296
     * #############  JOB TASK ############
1333 jmachado 297
     * @return
298
     * @throws Throwable
299
     */
1327 jmachado 300
    @1.5.0/docs/api/java/lang/Override.html">Override
1329 jmachado 301
    protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
302
    {
1333 jmachado 303
 
1332 jmachado 304
        DefaultLogMessages logMessages = new DefaultLogMessages();
1329 jmachado 305
        long questionarioId = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(getParametersMap().get(ServiceJob.JOB_questionario_id_KEY).getObject());
306
        QuestionarioImpl q = (QuestionarioImpl) DaoFactory.getQuestionarioDaoImpl().load(questionarioId);
307
 
1404 jmachado 308
        /********VERIFICACAO DE RESPOSTAS***********/
309
        long respostas = DaoFactory.getQuestionarioDaoImpl().getNumeroRespostas(questionarioId);
310
        if(respostas > 0)
311
        {
312
            logMessages.addMessage(new DefaultLogMessage("error.questionario.com.respostas.nao.pode.efetuar.op", LogMessageTypeEnum.WARNING,
313
                    "Operação não permitida, Existem Respostas"));
314
            logger.warn(logMessages.getLastMessage());
315
            serviceLogError(logMessages.getLastMessage());
316
            throw new NotAuthorizedException("Nao tem autorização para agendar atribuições de cursos num questioário com respostas");
317
        }
318
 
1332 jmachado 319
        1.5.0/docs/api/java/lang/String.html">String[] coursesList = deserializeCoursesList(q);
1329 jmachado 320
        //Colocamos já aqui o estado para nao se poder mudar o Ano e o Semestre
321
 
1333 jmachado 322
        /**logging**/
323
        1.5.0/docs/api/java/lang/String.html">String msg = "Starting running service for questionario: " + q.getId() + " - " + q.getiAnswersProcessorClass().getTitle();
324
        serviceLogInfo(msg);
325
        logger.info(msg);
326
        /**logging**/
1332 jmachado 327
 
1399 jmachado 328
        revertAllRespostasCandidatas(questionarioId,this);
1387 jmachado 329
 
1333 jmachado 330
        List<String> newCourseCodesList = new ArrayList<String>();
1332 jmachado 331
        int count = 0;
332
        int totalCourses = coursesList.length;
333
        for(1.5.0/docs/api/java/lang/String.html">String courseStrId: coursesList)
1328 jmachado 334
        {
1332 jmachado 335
            count++;
336
            try{
337
                1.5.0/docs/api/java/lang/Long.html">Long courseLong = 1.5.0/docs/api/java/lang/Long.html">Long.parseLong(courseStrId);
338
                /** logging **/
1333 jmachado 339
                msg = "Loading Course BACO ID: " + courseStrId;
1332 jmachado 340
                serviceLogInfo(msg);
341
                logger.info(msg);
342
                /** logging **/
343
 
344
                Course c = DaoFactory.getCourseDaoImpl().load(courseLong);
1333 jmachado 345
                newCourseCodesList.add(c.getCode());
1332 jmachado 346
                /** logging **/
347
                msg = "(" + count + " of " + totalCourses + ")-> Course loaded: " + c.getName() + "(" + c.getCode() + ")";
348
                serviceLogInfo(msg);
349
                logger.info(msg);
350
                /** logging **/
351
 
1333 jmachado 352
                createCursoAfeto(q, c, logMessages);
1332 jmachado 353
 
1333 jmachado 354
                /** COMMIT OPERATION **/
1332 jmachado 355
                setProgress((int)((((float)count)/((float)totalCourses))*100.0f));
356
                commitPartially();
1333 jmachado 357
                DaoFactory.getQuestionarioDaoImpl().update(q);
358
                /** COMMIT OPERATION **/
1332 jmachado 359
            }
360
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable t)
361
            {
362
                logger.error(t,t);
363
                serviceLogError(t.toString(),t);
364
                logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.ERROR,t.toString()));
365
            }
366
 
1328 jmachado 367
        }
1333 jmachado 368
 
369
        removeUnselectedCourses(q, newCourseCodesList);
370
 
371
        /** COMMIT OPERATION **/
1328 jmachado 372
        setProgress(100);
1332 jmachado 373
        commitPartially();
1333 jmachado 374
        DaoFactory.getQuestionarioDaoImpl().update(q);
375
        /** COMMIT OPERATION **/
1328 jmachado 376
 
1333 jmachado 377
 
378
        msg = "Set courses state as " + QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED.name();
1332 jmachado 379
        serviceLogInfo(msg);
380
        logger.info(msg);
1329 jmachado 381
        q.setSubStatePedagogicoClass(QuestionarioImpl.SubStatePedagogico.COURSES_ASSIGNED);
382
        commitPartially();
1332 jmachado 383
 
384
        return logMessages;
1327 jmachado 385
    }
1333 jmachado 386
 
387
    /**
388
     *
389
     * @param q
390
     * @param newCourseCodesList
391
     */
392
    private void removeUnselectedCourses(QuestionarioImpl q, List<String> newCourseCodesList) {
393
        /** logging **/
394
        1.5.0/docs/api/java/lang/String.html">String msg = "Removing unselected courses ";
395
        serviceLogInfo(msg);
396
        logger.info(msg);
397
        /** logging **/
398
        List<QuestionarioPedagogicoCursoAfeto> allCoursesInQuestionario =  DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(q.getId());
399
        for(QuestionarioPedagogicoCursoAfeto cursoAfeto: allCoursesInQuestionario)
400
        {
401
            if(!newCourseCodesList.contains(cursoAfeto.getCodigoCurso()))
402
            {
403
                removeCursoAfeto(cursoAfeto);
404
            }
405
        }
406
    }
407
 
408
    private void removeCursoAfeto(QuestionarioPedagogicoCursoAfeto cursoAfeto) {
409
        1.5.0/docs/api/java/lang/String.html">String msg; /** logging **/
410
        msg = "Deleting course: " + cursoAfeto.getCodigoCurso();
411
        serviceLogInfo(msg);
412
        logger.info(msg);
413
        /** logging **/
414
        for(QuestionarioPedagogicoUnidadeCurricularAfeta unidade: cursoAfeto.getUnidadesAfetas())
415
        {
416
            /** logging **/
417
            msg = "--->Deleting unit from course: " + unidade.getCodigoUnidade();
418
            serviceLogInfo(msg);
419
            logger.info(msg);
420
            /** logging **/
421
            DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidade);
422
        }
423
        cursoAfeto.setUnidadesAfetas(null);
424
        DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().delete(cursoAfeto);
425
    }
426
 
427
    private void removeUnselectedUnits(QuestionarioPedagogicoCursoAfeto cursoAfetado, List<String> newUnidadesCodesList) {
428
        /** logging **/
429
        1.5.0/docs/api/java/lang/String.html">String msg = "Removing unselected units from course: " + cursoAfetado.getCodigoCurso();
430
        serviceLogInfo(msg);
431
        logger.info(msg);
432
        /** logging **/
433
        Set<QuestionarioPedagogicoUnidadeCurricularAfeta> allUnidades =  cursoAfetado.getUnidadesAfetas();
434
        for(QuestionarioPedagogicoUnidadeCurricularAfeta unidadeAfeta: allUnidades)
435
        {
436
            if(!newUnidadesCodesList.contains(unidadeAfeta.getCodigoUnidade()))
437
            {
438
                /** logging **/
439
                msg = "--->Deleting unidade: " + unidadeAfeta.getCodigoUnidade();
440
                serviceLogInfo(msg);
441
                logger.info(msg);
442
                /** logging **/
443
                DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidadeAfeta);
444
            }
445
        }
446
    }
447
 
448
 
449
    /**
450
     *
451
     * @param q
452
     * @param c
453
     * @throws IOException
454
     * @throws TransformationException
455
     */
456
    private void createCursoAfeto(QuestionarioImpl q, Course c, DefaultLogMessages logMessages) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException
457
    {
458
        1.5.0/docs/api/java/lang/String.html">String msg;
459
        QuestionarioPedagogicoCursoAfetoImpl cursoAfeto = null;
1335 jmachado 460
        //todo fazer aqui um teste a ver se na lista de unidades found vem as unidades do curso afeto
461
        //reativar o set e testar isso
1333 jmachado 462
        List<QuestionarioPedagogicoCursoAfeto> cursosFound = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().find(q.getId(),c.getCode());
463
        if(cursosFound != null && cursosFound.size() > 1)
464
        {
465
            msg = "Encontrados mais que um curso nos mesmos códigos:" + c.getCode() + " apagando um";
466
            serviceLogWarn(msg);
467
            logger.warn(msg);
468
            logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
469
            cursoAfeto = (QuestionarioPedagogicoCursoAfetoImpl) cursosFound.get(0);
470
            cursosFound.remove(0);
471
            for(QuestionarioPedagogicoCursoAfeto ca: cursosFound)
472
                removeCursoAfeto(ca);
473
        }
474
        else if(cursosFound != null && cursosFound.size() == 1)
475
        {
476
            msg = "Curso " + c.getCode() + " encontrado, vai atualizar";
477
            serviceLogInfo(msg);
478
            logger.info(msg);
479
            cursoAfeto = (QuestionarioPedagogicoCursoAfetoImpl) cursosFound.get(0);
480
        }
481
        else
482
        {
483
            msg = "Criando novo curso para o código " + c.getCode();
484
            serviceLogInfo(msg);
485
            logger.info(msg);
486
            cursoAfeto = DomainObjectFactory.createQuestionarioPedagogicoCursoAfeto();
487
            DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().save(cursoAfeto);
1335 jmachado 488
            cursoAfeto.setUnidadesAfetas(new HashSet<QuestionarioPedagogicoUnidadeCurricularAfeta>());
1333 jmachado 489
        }
490
 
491
        cursoAfeto.resetStats();
492
 
493
        cursoAfeto.setCourse(c);
1336 jmachado 494
        cursoAfeto.setCodigoInstituicao(c.getInstitutionalCode());
495
        cursoAfeto.setNomeInstituicao(ConfigProperties.getProperty("institution.code."+c.getInstitutionalCode()));
1333 jmachado 496
        cursoAfeto.setAno(q.getYear());
497
        cursoAfeto.setCodigoCurso(c.getCode());
498
        cursoAfeto.setNome(c.getName());
499
        cursoAfeto.setQuestionario(q);
500
        cursoAfeto.setSemestre(q.getSemestre());
501
 
502
 
503
 
1335 jmachado 504
 
1333 jmachado 505
        List<String> newUnitCodesList = new ArrayList<String>();
506
        int countUnits = 0;
507
        List<CourseUnitDaoImpl.CourseUnitResult> results = DaoFactory.getCourseUnitDaoImpl().loadCourseUnits(c.getId(), q.getSemestre(), q.getYear());
508
        int totalUnits =  results.size();
509
        for(CourseUnitDaoImpl.CourseUnitResult cur : results)
510
        {
511
            countUnits++;
512
            CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().load(cur.id);
513
            newUnitCodesList.add(cu.getCode());
514
            /** logging **/
515
            msg = "---->(" + countUnits + " of " + totalUnits  +") CourseUnit loaded: " + cu.getName() + "(" + cu.getCode() + ")";
516
            serviceLogInfo(msg);
517
            logger.info(msg);
518
            /** logging **/
519
            createUnidadeAfeta(cursoAfeto, cur,cu, logMessages);
520
            DaoFactory.getCourseUnitDaoImpl().evict(cu);
521
        }
522
 
523
        removeUnselectedUnits(cursoAfeto,newUnitCodesList);
524
    }
525
 
526
    /**
527
     *
528
     * @param cursoAfeto
529
     * @param cur
530
     * @throws IOException
531
     * @throws TransformationException
532
     */
533
    private void createUnidadeAfeta(QuestionarioPedagogicoCursoAfetoImpl cursoAfeto, CourseUnitDaoImpl.CourseUnitResult cur, CourseUnit cu, DefaultLogMessages logMessages) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException {
534
 
535
        1.5.0/docs/api/java/lang/String.html">String msg;
536
        QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta = null;
537
        List<QuestionarioPedagogicoUnidadeCurricularAfeta> unidadesFound = DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().find(cursoAfeto.getQuestionario().getId(), cursoAfeto.getCodigoCurso(), cu.getCode());
538
        if(unidadesFound != null && unidadesFound.size() > 1)
539
        {
540
            msg = "Encontradas mais que uma unidade nos mesmos códigos: curso:" +cursoAfeto.getCodigoCurso() + ", unidade " + cu.getCode() + " apagando um";
541
            serviceLogWarn(msg);
542
            logger.warn(msg);
543
            logMessages.addMessage(new DefaultLogMessage("questionario.courses.selection", LogMessageTypeEnum.WARNING,msg));
544
            unidadeAfeta = (QuestionarioPedagogicoUnidadeCurricularAfetaImpl) unidadesFound.get(0);
545
            unidadesFound.remove(0);
546
            DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().delete(unidadesFound);
547
        }
548
        else if(unidadesFound != null && unidadesFound.size() == 1)
549
        {
550
            msg = "Unidade " +  cu.getCode() + " encontrada, vai atualizar";
551
            serviceLogInfo(msg);
552
            logger.info(msg);
553
            unidadeAfeta = (QuestionarioPedagogicoUnidadeCurricularAfetaImpl) unidadesFound.get(0);
554
        }
555
        else
556
        {
557
            msg = "Criando nova unidade para o código " + cu.getCode();
558
            serviceLogInfo(msg);
559
            logger.info(msg);
560
            unidadeAfeta = DomainObjectFactory.createQuestionarioPedagogicoUnidadeCurricularAfeta();
1338 jmachado 561
            unidadeAfeta.setUsar(true);
562
            unidadeAfeta.setVista(false);
1333 jmachado 563
            DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().save(unidadeAfeta);
564
        }
565
 
566
        unidadeAfeta.resetStats();
567
        unidadeAfeta.setCursoAfeto(cursoAfeto);//so metemos de um dos lados
568
        unidadeAfeta.setCourseUnit(cu);
569
        unidadeAfeta.setCodigoUnidade(cu.getCode());
1396 jmachado 570
        unidadeAfeta.addObs("");
1336 jmachado 571
        unidadeAfeta.setNome(cu.getName());
1333 jmachado 572
 
573
        unidadeAfeta.setMarked(false);
574
 
575
        ArrayList<CourseUnitImpl.Tipologia> mergedTipologias = copiarTipologias(cu, unidadeAfeta);
576
 
577
 
578
        checkTurmaAndProfs(cu, unidadeAfeta, mergedTipologias);
579
        checkProfs(cur, unidadeAfeta);
580
        checkTurmas(cur, unidadeAfeta);
581
        checkStudents(cur, unidadeAfeta);
582
 
1338 jmachado 583
 
1333 jmachado 584
        if(unidadeAfeta.isMarked())
585
            cursoAfeto.incMarcadas();
586
 
587
 
588
    }
589
 
590
    /**
591
     *
592
     * @param cur
593
     * @param unidadeAfeta
594
     */
595
    private void checkTurmas(CourseUnitDaoImpl.CourseUnitResult cur, QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta) {
596
        if(cur.turmas == 0)
597
        {
598
            unidadeAfeta.setTurmas(0);
599
            unidadeAfeta.setMarked(true); //WARNING
600
            unidadeAfeta.addObs("Não tem turmas");
601
        }
602
        else
603
            unidadeAfeta.setTurmas(cur.turmas);
604
    }
605
 
606
    /**
607
     *
608
     * @param cur
609
     * @param unidadeAfeta
610
     */
611
    private void checkProfs(CourseUnitDaoImpl.CourseUnitResult cur, QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta) {
612
        if(cur.teachers == 0)
613
        {
614
            unidadeAfeta.setProfs(0);
615
            unidadeAfeta.setMarked(true); //WARNING
616
            unidadeAfeta.addObs("Não tem professores");
617
        }
618
        else
619
            unidadeAfeta.setProfs(cur.teachers);
620
    }
621
 
622
    /**
623
     *
624
     * @param cur
625
     * @param unidadeAfeta
626
     */
627
    private void checkStudents(CourseUnitDaoImpl.CourseUnitResult cur, QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta) {
628
        if(cur.students == 0)
629
        {
630
            unidadeAfeta.setStudents(0);
631
            unidadeAfeta.setMarked(true); //WARNING
632
            unidadeAfeta.addObs("Não tem estudantes");
633
        }
634
        else
635
            unidadeAfeta.setStudents(cur.students);
636
    }
637
 
638
    /**
639
     *
640
     * @param cu
641
     * @param unidadeAfeta
642
     * @return
643
     * @throws IOException
644
     * @throws TransformationException
645
     */
646
    private ArrayList<CourseUnitImpl.Tipologia> copiarTipologias(CourseUnit cu, QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException {
647
        try
648
        {
649
            CourseUnitImpl.Tipologias tipologias = ((CourseUnitImpl)cu).getTipologiasClass();
650
            ArrayList<CourseUnitImpl.Tipologia> mergedTipologias = tipologias.obtainMergeTipologias();
651
            unidadeAfeta.setTipologias(mergedTipologias.size());
652
            unidadeAfeta.setTipologiasJson(CourseUnitImpl.Tipologias.serializeMergedList(mergedTipologias));
653
            unidadeAfeta.setAddedTipologias(tipologias.getTipologiasExtraAdicionadas().size());
654
            return mergedTipologias;
655
        }
656
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
657
        {
658
            ArrayList<CourseUnitImpl.Tipologia> tipologias = new ArrayList<CourseUnitImpl.Tipologia>();
659
            unidadeAfeta.setMarked(true);
660
            unidadeAfeta.addObs("Erro a descodificar tipologias");
661
            unidadeAfeta.setTipologiasJson(CourseUnitImpl.Tipologias.serializeMergedList(tipologias));
662
            return tipologias;
663
        }
664
    }
665
 
666
    /**
667
     *
668
     * @param cu
669
     * @param unidadeAfeta
670
     * @param mergedTipologias
671
     */
672
    private void checkTurmaAndProfs(CourseUnit cu, QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidadeAfeta, ArrayList<CourseUnitImpl.Tipologia> mergedTipologias) {
673
        if(cu.getTeachers() != null)
674
        {
675
            HashMap<String,Boolean> turmaWithProfs = new HashMap<String, Boolean>();
676
            HashMap<String,Boolean> profsWithTurma = new HashMap<String, Boolean>();
677
            for(CourseUnitImpl.Tipologia t: mergedTipologias)
678
            {
679
                turmaWithProfs.put(t.getCdTurma(),true);
680
                profsWithTurma.put(t.getCdDocente(),true);
681
            }
682
            for(Teacher t: cu.getTeachers())
683
            {
684
                if(profsWithTurma.get(""+t.getSigesCode())==null)
685
                {
686
                    unidadeAfeta.setProfsWithoutTurma(unidadeAfeta.getProfsWithoutTurma()+1);
687
                    unidadeAfeta.setMarked(true);
688
                }
689
                DaoFactory.getTeacherDaoImpl().evict(t);
690
            }
691
 
692
            for(CourseUnitTurma t: cu.getTurmas())
693
            {
694
                if(turmaWithProfs.get(t.getTurma())==null)
695
                {
696
                    unidadeAfeta.setTurmaWithoutProf(unidadeAfeta.getTurmaWithoutProf() + 1);
697
                    unidadeAfeta.setMarked(true);
698
                }
699
                DaoFactory.getCourseUnitTurmaDaoImpl().evict(t);
700
            }
701
        }
702
    }
1337 jmachado 703
 
704
 
705
    /**
706
     * SERVIÇO
707
     * @param questionarioId
708
     * @param cursosAfetos
709
     * @param session
710
     * @param questionarioCleared
711
     * @throws IOException
712
     * @throws TransformationException
713
     * @throws NotAuthorizedException
714
     */
715
    public void updateTipologiasPedagogico(long questionarioId, List<QuestionarioPedagogicoCursoAfeto> cursosAfetos, UserSession session,QuestionarioImpl questionarioCleared) throws 1.5.0/docs/api/java/io/IOException.html">IOException, TransformationException, NotAuthorizedException {
716
 
717
        if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_TIPOLOGIES.name()))
718
        {
719
            throw new NotAuthorizedException("Nao tem autorização para alterar as tipologias");
720
        }
721
        for(QuestionarioPedagogicoCursoAfeto cursoAfeto: cursosAfetos)
722
        {
723
            QuestionarioPedagogicoCursoAfeto cuAfetoPersistent = DaoFactory.getQuestionarioPedagogicoCursoAfetoDaoImpl().load(cursoAfeto.getId());
724
            if(cuAfetoPersistent.getQuestionario().getId() == questionarioId)
725
            {
726
                cuAfetoPersistent.setUsarTipologias(cursoAfeto.isUsarTipologias());
727
            }
728
            else
729
                logger.warn("Curso pedido no serviço não faz parte do questionario requisitado: " + cursoAfeto.getId() + " " + cursoAfeto.getQuestionario().getId() + " != " + questionarioId);
730
 
731
        }
732
 
733
    }
1338 jmachado 734
 
735
    public void updateCheckVarPedagogico(long questionarioId,long unidadeAfetaId, 1.5.0/docs/api/java/lang/String.html">String op,1.5.0/docs/api/java/lang/String.html">String val,UserSession session, QuestionarioImpl questionarioCleared) throws NotAuthorizedException {
736
 
1395 jmachado 737
        if(!questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_USE_UNIT.name()) &&
738
                !questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS_CHECK_TEACHERS.name()) &&
1378 jmachado 739
                !questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_ASSIGNEMENTS.name()) &&
740
                !questionarioCleared.isClear((UserSessionImpl) session,QuestionarioImpl.QuestionarioClearancesOperation.QUESTIONARIO_CHANGE_TIPOLOGIES.name()))
1338 jmachado 741
        {
742
            throw new NotAuthorizedException("Nao tem autorização para alterar as tipologias");
743
        }
744
        QuestionarioPedagogicoUnidadeCurricularAfetaImpl unidade = (QuestionarioPedagogicoUnidadeCurricularAfetaImpl) DaoFactory.getQuestionarioPedagogicoUnidadeCurricularAfetaDaoImpl().load(unidadeAfetaId);
745
        if(op.equals("usar"))
746
        {
747
            unidade.setUsar(1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(val));
748
        }
749
        else if(op.equals("vista"))
750
        {
751
            unidade.setVista(1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(val));
752
        }
1378 jmachado 753
        else if(op.equals("vistaProfs"))
754
        {
755
            unidade.setVistaProfs(1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(val));
756
        }
1338 jmachado 757
        else if(op.equals("observacoes"))
758
        {
759
            unidade.setObs(val);
760
        }
761
    }
1378 jmachado 762
 
1327 jmachado 763
}