Subversion Repositories bacoAlunos

Rev

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

Rev Author Line No. Line
112 jmachado 1
package pt.estgp.estgweb.domain;
2
 
1312 jmachado 3
import com.owlike.genson.Genson;
4
import org.apache.log4j.Logger;
995 jmachado 5
import pt.estgp.estgweb.Globals;
1313 jmachado 6
import pt.estgp.estgweb.domain.dao.DaoFactory;
489 jmachado 7
import pt.estgp.estgweb.domain.enums.CourseUnitContentsGrants;
1312 jmachado 8
import pt.estgp.estgweb.domain.test.TestCourseUnit;
9
import pt.estgp.estgweb.domain.utils.SimpleClearanceRuledSupport;
1670 jmachado 10
import pt.estgp.estgweb.utils.StringsUtils;
1312 jmachado 11
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
12
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
489 jmachado 13
 
1312 jmachado 14
import java.io.IOException;
146 jmachado 15
import java.io.Serializable;
1337 jmachado 16
import java.util.*;
146 jmachado 17
 
112 jmachado 18
/**
19
 * Created by IntelliJ IDEA.
20
 * User: Jorge Machado
21
 * Date: 7/Mai/2008
22
 * Time: 20:21:15
23
 * To change this template use File | Settings | File Templates.
24
 */
1312 jmachado 25
public class CourseUnitImpl extends CourseUnit implements ICanManage, ClearanceRuled
146 jmachado 26
{
489 jmachado 27
 
1312 jmachado 28
    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(CourseUnitImpl.class);
29
 
489 jmachado 30
    CourseUnitContentsGrants courseUnitContentsGrants = null;
31
 
146 jmachado 32
    public 1.5.0/docs/api/java/io/Serializable.html">Serializable getSerializable()
33
    {
34
        return getId();
35
    }
204 jmachado 36
 
1670 jmachado 37
    public 1.5.0/docs/api/java/lang/String.html">String getCourseNameInitials()
38
    {
39
        if(getCourseName() != null)
40
        {
41
            return StringsUtils.getInitials(getCourseName());
42
        }
43
        else
44
            return null;
45
    }
489 jmachado 46
 
47
    public CourseUnitContentsGrants getCourseUnitContentsGrants() {
48
        if(courseUnitContentsGrants == null)
49
            courseUnitContentsGrants = CourseUnitContentsGrants.parse(super.getContentsGrants());
50
        return courseUnitContentsGrants;
51
    }
52
 
53
    public void setCourseUnitContentsGrants(CourseUnitContentsGrants courseUnitContentsGrants) {
54
        super.setContentsGrants(courseUnitContentsGrants.name());
55
        this.courseUnitContentsGrants = courseUnitContentsGrants;
56
    }
57
 
204 jmachado 58
    public boolean isValid()
59
    {
60
        return true;  //To change body of implemented methods use File | Settings | File Templates.
61
    }
62
 
1782 jmachado 63
    public boolean checkIsOwnedBy(GenericUser u)
204 jmachado 64
    {
1782 jmachado 65
        return checkIsOwnedBy(u, false);
204 jmachado 66
    }
67
 
1782 jmachado 68
    public boolean checkIsOwnedBy(GenericUser u, boolean transaction)
208 jmachado 69
    {
70
        return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId(),transaction);
71
    }
72
 
204 jmachado 73
    /**
74
     * Not implemented can be variuous teachers
75
     * @return null
1782 jmachado 76
     * use checkIsOwnedBy in this class
204 jmachado 77
     */
78
    public GenericUser getOwner()
79
    {
80
        return null;
81
    }
82
    /**
83
     * Not implemented
84
     * @return
85
     */
86
    public List<String> getOwnerRoles()
87
    {
88
        return null;
89
    }
90
 
91
    /**
92
     * Not implemented
93
     * @return
94
     */
95
    public 1.5.0/docs/api/java/lang/String.html">String getChoosedOwnerRole()
96
    {
97
        return null;
98
    }
99
 
100
    public boolean isInternal()
101
    {
251 jmachado 102
        return true;
204 jmachado 103
    }
208 jmachado 104
 
105
    public CourseUnitBlogImpl getUnitBlog()
106
    {
107
        if(getBlogs()!=null && getBlogs().size() > 0)
108
            return (CourseUnitBlogImpl) getBlogs().iterator().next();
109
        return null;
110
    }
251 jmachado 111
 
1315 jmachado 112
 
1312 jmachado 113
    public boolean equalsSiges(5+0%2Fdocs%2Fapi+Object">Object anotherInstance,boolean turmasSeparadas)
251 jmachado 114
    {
115
        if(anotherInstance instanceof CourseUnitImpl)
116
        {
117
            CourseUnitImpl anCourseUnit = (CourseUnitImpl) anotherInstance;
1312 jmachado 118
            if(turmasSeparadas)
119
            {
120
                boolean turmaVazia = getCdTurma() == null || getCdTurma().trim().length() == 0;
121
                boolean anotherTurmaVazia = anCourseUnit.getCdTurma() == null || anCourseUnit.getCdTurma().trim().length() == 0;
122
                boolean turmasIguais = (turmaVazia && anotherTurmaVazia) || (!turmaVazia && !anotherTurmaVazia && getCdTurma().equals(anCourseUnit.getCdTurma()));
123
                return equalsIgnoringTurma(anotherInstance)
124
                &&
125
                turmasIguais;
126
            }
127
            else
128
                return equalsIgnoringTurma(anotherInstance);
251 jmachado 129
        }
130
        return false;
131
 
132
    }
489 jmachado 133
 
1204 jmachado 134
    public boolean equalsIgnoringTurma(5+0%2Fdocs%2Fapi+Object">Object anotherInstance)
135
    {
136
        if(anotherInstance instanceof CourseUnitImpl)
137
        {
138
            CourseUnitImpl anCourseUnit = (CourseUnitImpl) anotherInstance;
139
 
140
            return anCourseUnit.getCode() != null && getCode() != null && getCode().equals(anCourseUnit.getCode()) &&
141
                    anCourseUnit.getCourseCode() != null && getCourseCode() != null && getCourseCode().equals(anCourseUnit.getCourseCode()) &&
142
                    anCourseUnit.getSemestre() != null && getSemestre() != null && getSemestre().equals(anCourseUnit.getSemestre()) &&
143
                    anCourseUnit.getImportYear() != null && getImportYear() != null && getImportYear().equals(anCourseUnit.getImportYear());
144
        }
145
        return false;
146
 
147
    }
148
 
973 jmachado 149
    /**
150
     * Means that is teacher os responsable teacher or from course commission
151
     * Only works in open transaction
152
     *
153
     * Needs Course and Responsable Teacher loaded
154
     */
155
    public boolean isFromCourseUnitCommission(UserSession userSession)
156
    {
157
        return userSession.getUser()!= null &&
1782 jmachado 158
                (((UserImpl) userSession.getUser()).checkIsTeacherOfCourseUnit(getId(), true)
973 jmachado 159
                        || (getResponsableTeacher() != null && getResponsableTeacher().getId() == userSession.getUser().getId())
1585 jmachado 160
                        || ((CourseImpl)getCourse()).isFromCourseCommission(userSession)
973 jmachado 161
                );
162
    }
489 jmachado 163
 
1312 jmachado 164
    public boolean isFromCourseCommission(UserSession userSession)
165
    {
166
        return userSession.getUser()!= null &&
167
                userSession.getUser().hasRole(getCourse().getValidationRole());
168
    }
973 jmachado 169
 
1312 jmachado 170
 
995 jmachado 171
    public 1.5.0/docs/api/java/lang/String.html">String getSummariosPathIntranet()
172
    {
173
        return Globals.FTP_IONLINE_START_PATH + "/" + getPathIntranet() + "/" + Globals.INTRANET_DTP + "/" + Globals.INTRANET_DTP_Sumarios;
174
    }
973 jmachado 175
 
1148 jmachado 176
    public 1.5.0/docs/api/java/lang/String.html">String getInqueritosPedagogicosPathIntranet()
177
    {
178
        return Globals.FTP_IONLINE_START_PATH + getPathIntranet() + "/" + Globals.INTRANET_DTP + "/" + Globals.INTRANET_DTP_InqueritoPedagogico;
179
    }
180
 
181
 
995 jmachado 182
    public 1.5.0/docs/api/java/lang/String.html">String getSummariosPathFileIntranet()
183
    {
184
        return getSummariosPathIntranet() + "/" + getSummariosFileNameIntranet();
185
    }
186
 
187
    public 1.5.0/docs/api/java/lang/String.html">String getSummariosFileNameIntranet(){
188
        return getCode() + "_" + getNormalizedName() + "_sumarios.pdf";
189
    }
190
 
191
 
996 jmachado 192
    public 1.5.0/docs/api/java/lang/String.html">String getSigesUniqueIdentifiers()
193
    {
194
        return "SIGES:" + getCode() + ", COURSE: " + getCourseCode() +
1139 jmachado 195
                ", " + getSemestre() + " of " + getImportYear() + " - " + getName() + " Turma - " + getCdTurma();
996 jmachado 196
    }
197
 
1341 jmachado 198
    public int studentsSize()
199
    {
200
        if(getStudents() !=null)
201
            return getStudents().size();
202
        return 0;
203
    }
1312 jmachado 204
 
1341 jmachado 205
    public int studentsTurmaSize()
206
    {
207
        int countTotalStudentsTurmas = 0;
208
        if(getTurmas() == null)
209
            return 0;
210
        for(CourseUnitTurma turma: getTurmas())
211
        {
212
            if(turma.getStudents() != null)
213
                countTotalStudentsTurmas+=turma.getStudents().size();
214
        }
215
        return countTotalStudentsTurmas;
216
    }
217
 
218
 
1312 jmachado 219
    public boolean hasStudent(long studentId, boolean transaction)
220
    {
221
        Set<StudentImpl> students;
222
        if(transaction)
223
            students = getStudents();
224
        else
225
        {
226
            IServiceManager sm;
227
            try {
228
                sm = ServiceManager.getInstance();
229
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
230
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
231
                students = (Set<StudentImpl>) sm.execute(null, "LoadCourseUnitStudents", args, names);
232
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
233
                logger.error(e,e);
234
                return false;
235
            }
236
        }
237
        if(students == null)
238
            return false;
239
        for(Student s: students)
240
        {
241
            if(s.getId() == studentId)
242
                return true;
243
        }
244
        return false;
245
    }
246
 
247
    public boolean hasTeacher(long teacherId, boolean transaction)
248
    {
249
        Set<TeacherImpl> teachers;
250
        if(transaction)
251
            teachers = getTeachers();
252
        else
253
        {
254
            IServiceManager sm;
255
            try {
256
                sm = ServiceManager.getInstance();
257
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
258
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
259
                teachers = (Set<TeacherImpl>) sm.execute(null, "LoadCourseUnitTeachers", args, names);
260
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
261
                logger.error(e,e);
262
                return false;
263
            }
264
        }
265
        if(teachers == null)
266
            return false;
267
        for(Teacher t: teachers)
268
        {
269
            if(t.getId() == teacherId)
270
                return true;
271
        }
272
        return false;
273
    }
274
 
275
    public boolean isResponsibleTeacher(long teacherId, boolean transaction)
276
    {
277
        Teacher t;
278
        if(transaction)
279
            t = getResponsableTeacher();
280
        else
281
        {
282
            IServiceManager sm;
283
            try {
284
                sm = ServiceManager.getInstance();
285
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
286
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
287
                t = (Teacher) sm.execute(null, "LoadCourseUnitResponsibleTeacher", args, names);
288
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
289
                logger.error(e,e);
290
                return false;
291
            }
292
        }
293
        if(t == null)
294
            return false;
295
        if(t.getId() == teacherId)
296
            return true;
297
        return false;
298
    }
299
 
300
    SimpleClearanceRuledSupport clearanceRuledSupport = null;
301
 
302
    public SimpleClearanceRuledSupport getClearanceRuledSupport() {
303
        return clearanceRuledSupport;
304
    }
305
 
306
    public void setClearanceRuledSupport(SimpleClearanceRuledSupport clearanceRuledSupport) {
307
        this.clearanceRuledSupport = clearanceRuledSupport;
308
    }
309
 
310
    @1.5.0/docs/api/java/lang/Override.html">Override
311
    public boolean isClearanceInitialized(UserSessionImpl u) {
312
        return clearanceRuledSupport == null ? false :
313
         clearanceRuledSupport.isClearanceInitialized(u);
314
    }
315
 
316
    @1.5.0/docs/api/java/lang/Override.html">Override
317
    public boolean isClear(UserSessionImpl u, 1.5.0/docs/api/java/lang/String.html">String OP) {
318
 
319
        if(clearanceRuledSupport == null) return false;
320
        if(OP.startsWith("EVALUATION") && !OP.startsWith("EVALUATION_INFO")
321
                && clearanceRuledSupport.isClear(u,CourseUnitClearancesOperation.EVALUATION_ALL.name()))
322
            return true;
323
        return clearanceRuledSupport.isClear(u, OP);
324
    }
325
 
1326 jmachado 326
    @1.5.0/docs/api/java/lang/Override.html">Override
327
    public void initClearances(UserSessionImpl usession,boolean force)
328
    {
329
        CourseUnitImpl c = this;
330
        1.5.0/docs/api/java/lang/String.html">String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
331
        List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegrees();
332
        List<Long> activeCourseIds = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveCourseIds();
333
 
334
        boolean isActiveYear = activeYear != null && c.getImportYear().equals(activeYear);
335
        boolean isActiveDegree = activeDegrees!=null && activeDegrees.contains(c.getCourse().getDegree());
336
        boolean isActiveCourseId = activeCourseIds!=null && activeCourseIds.contains(c.getCourse().getId());
337
 
338
        boolean activePeriod = (isActiveYear && (isActiveCourseId || isActiveDegree));
339
        boolean active = activePeriod || c.isEvaluationOpenByAdmin();
340
 
341
        boolean isComplete = c.getCourseUnitEvaluation() != null && c.getCourseUnitEvaluation().isTeacherComplete() && !c.getCourseUnitEvaluation().isClosed();
342
        boolean isClosed = c.getCourseUnitEvaluation() != null && c.getCourseUnitEvaluation().isClosed();
343
        boolean isEdit = !isClosed && !isComplete;
344
 
345
 
346
        SimpleClearanceRuledSupport s = new SimpleClearanceRuledSupport();
347
        s.setDirty();
348
 
349
        if(isEdit)
350
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_EDIT.name(),usession);
351
        else if(isComplete)
352
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_COMPLETE.name(),usession);
353
        else if(isClosed)
354
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_CLOSED.name(),usession);
355
 
356
        if(activePeriod)
357
        {
358
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE.name(),usession);
359
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE_REGULAR_PERIOD.name(),usession);
360
        }
361
        if(c.isEvaluationOpenByAdmin())
362
        {
363
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE.name(),usession);
364
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE_SPECIAL_ADMIN.name(),usession);
365
        }
366
 
367
 
1554 jmachado 368
        if(usession.getUser() != null && (usession.getUser().isSuperuserOrAdmin() || usession.getUser().hasRole(Globals.SERVICES_PROGRAMS_ROLE)))
1326 jmachado 369
        {
1353 jmachado 370
            s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
1326 jmachado 371
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_ALL.name(),usession);
1365 jmachado 372
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
1350 jmachado 373
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name(),usession);
374
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(),usession);
375
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_COORDINATOR_PART.name(),usession);
1326 jmachado 376
        }
377
 
378
        if(usession.getUser() != null && usession.getUser() instanceof Teacher)
379
        {
1350 jmachado 380
            Teacher t = ((Teacher)(usession.getUser()));
1782 jmachado 381
            boolean teacher = ((Teacher)(usession.getUser())).checkIsTeacherOfCourseUnit(c.getId(), true);
1326 jmachado 382
            boolean responsable = c.getResponsableTeacher()!=null && usession.getUser().getId() == c.getResponsableTeacher().getId();
1585 jmachado 383
            boolean isCoordinator = ((CourseImpl) DaoFactory.getCourseDaoImpl().narrow(c.getCourse())).isFromCourseCommission(t);
384
 
1326 jmachado 385
            if(teacher)
1350 jmachado 386
            {
1326 jmachado 387
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_TEACHER.name(), usession);
1350 jmachado 388
            }
1326 jmachado 389
            if(responsable)
1350 jmachado 390
            {
1326 jmachado 391
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_RESP_TEACHER.name(), usession);
1350 jmachado 392
            }
1326 jmachado 393
            if(teacher || responsable)
394
            {
1353 jmachado 395
                s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
1326 jmachado 396
                //s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_TEACHER.name(), usession);
397
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITION.name(),usession);
398
                if(active && isEdit)
399
                {
400
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
401
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
402
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_COMPLETE.name(),usession);
403
                }
404
            }
405
 
1350 jmachado 406
            if(isCoordinator)
1326 jmachado 407
            {
1353 jmachado 408
                s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
1350 jmachado 409
                s.addClearance(CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name(),usession);
410
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_COMMISSION.name(), usession);
411
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITION.name(), usession);
412
                if(active && isEdit)
413
                {
414
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
415
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
416
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_COMISSION_PART.name(),usession);
417
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_COMPLETE.name(),usession);
418
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_CLOSE.name(),usession);
419
                }
420
                else if(active && isComplete)
421
                {
422
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
423
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
424
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_COMISSION_PART.name(),usession);
425
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_CLOSE.name(),usession);
426
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_EDIT.name(),usession);
427
                }
428
                else if(active && isClosed)
429
                {
430
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_EDIT.name(),usession);
431
                }
1326 jmachado 432
            }
1350 jmachado 433
 
434
 
435
            if(!c.isValidProgram())
1326 jmachado 436
            {
1350 jmachado 437
                if(teacher)
1365 jmachado 438
                {
439
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
1350 jmachado 440
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(), usession);
1365 jmachado 441
                }
1350 jmachado 442
                if(isCoordinator)
443
                {
1365 jmachado 444
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
1350 jmachado 445
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(), usession);
446
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_COORDINATOR_PART.name(), usession);
447
                }
1326 jmachado 448
            }
1350 jmachado 449
            else
1326 jmachado 450
            {
1350 jmachado 451
                s.addClearance(CourseUnitClearancesOperation.PROGRAM_INFO_VALID_NOT_ACTIVE.name(), usession);
1326 jmachado 452
            }
1350 jmachado 453
 
1326 jmachado 454
        }
1350 jmachado 455
 
1326 jmachado 456
        c.setClearanceRuledSupport(s);
457
    }
458
 
1312 jmachado 459
    public static enum CourseUnitClearancesOperation
460
    {
461
        EVALUATION_ALL, //SPECIAL OPERATION FOR DENY AND PERMIT REPLACE FULL CONTROL
462
 
463
        //COURSE UNIT EVALUATION
464
        EVALUATION_PERSIST_TEACHER_PART, //SERVICE PERSIST THIS PART
465
        EVALUATION_PERSIST_COMISSION_PART, //SERVICE PERSIST THIS PART
466
 
467
        EVALUATION_EDITION, //CAN SEE EDITION SCREEN
468
        EVALUATION_EDITSAVE, //CAN PRESS SAVE
469
        EVALUATION_TRANSITATE_TO_COMPLETE, //CAN_TRANSITATE
470
        EVALUATION_TRANSITATE_TO_CLOSE, //CAN CLOSE
471
        EVALUATION_TRANSITATE_TO_EDIT, //CAN REVERT
472
 
473
        EVALUATION_INFO_ACTIVE, //INFO CLEARANCE WHEN ACTIVE
474
        EVALUATION_INFO_ACTIVE_SPECIAL_ADMIN, //INFO CLEARANCE REASON OF BEING ACTIVE
475
        EVALUATION_INFO_ACTIVE_REGULAR_PERIOD, //INFO CLEARANCE REASON OF BEING ACTIVE
476
 
477
        EVALUATION_INFO_STATE_EDIT, //INFO CLEARANCE
478
        EVALUATION_INFO_STATE_COMPLETE, //INFO CLEARANCE
479
        EVALUATION_INFO_STATE_CLOSED, //INFO CLEARANCE
480
 
481
        EVALUATION_INFO_USER_TEACHER, //INFO CLEARANCE
482
        EVALUATION_INFO_USER_RESP_TEACHER, //INFO CLEARANCE
483
        EVALUATION_INFO_USER_COMMISSION, //INFO CLEARANCE
484
 
1350 jmachado 485
 
1365 jmachado 486
        PROGRAM_EDIT_PROGRAM,
1350 jmachado 487
        PROGRAM_COORDINATOR_PART,
488
        PROGRAM_TEACHER_PART,
1365 jmachado 489
 
1350 jmachado 490
        PROGRAM_CAN_VALIDATE,
1353 jmachado 491
        PROGRAM_INFO_VALID_NOT_ACTIVE,
1350 jmachado 492
 
1353 jmachado 493
        STATISTICS_CAN_VIEW,
494
 
495
 
1312 jmachado 496
        ;
497
 
498
        public static CourseUnitClearancesOperation parse(1.5.0/docs/api/java/lang/String.html">String clearance)
499
        {
500
            if(clearance == null)
501
                return null;
502
            for(CourseUnitClearancesOperation op: CourseUnitClearancesOperation.values())
503
            {
504
                if(op.name().equals(clearance))
505
                    return op;
506
            }
507
            return null;
508
        }
509
    }
510
 
511
 
1776 jmachado 512
    public Tipologias getTipologiasClass() throws 1.5.0/docs/api/java/io/IOException.html">IOException
1312 jmachado 513
    {
514
        return Tipologias.deserialize(getTipologias());
515
    }
516
 
1776 jmachado 517
    public void setTipologiasClass(Tipologias tipologias) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1312 jmachado 518
    {
519
        if(tipologias != null)
520
            setTipologias(tipologias.serialize());
521
    }
522
 
1406 jmachado 523
    public static class TipologiaLoadExeption extends 1.5.0/docs/api/java/lang/Exception.html">Exception
1313 jmachado 524
    {
1406 jmachado 525
        boolean teacherFail = false;
526
        boolean turmaFail = false;
527
 
528
        public TipologiaLoadExeption(boolean teacherFail, boolean turmaFail) {
529
            this.teacherFail = teacherFail;
530
            this.turmaFail = turmaFail;
531
        }
532
 
533
        public boolean isTeacherFail() {
534
            return teacherFail;
535
        }
536
 
537
        public boolean isTurmaFail() {
538
            return turmaFail;
539
        }
540
 
541
        @1.5.0/docs/api/java/lang/Override.html">Override
542
        public 1.5.0/docs/api/java/lang/String.html">String getMessage() {
543
            return "Professor: " + (teacherFail? "Falhou" : "OK") + " Turma: " + (turmaFail? "Falhou" : "OK");
544
        }
545
    }
546
    /**
547
     *
548
     * @param myTipo
549
     * @return
550
     */
551
    public TipologiaPersistent loadPersistent(Tipologia myTipo) throws TipologiaLoadExeption
552
    {
1313 jmachado 553
        TipologiaPersistent tipologiaPersistent = new TipologiaPersistent();
1626 jmachado 554
        tipologiaPersistent.tipologiaOriginal = myTipo;
1313 jmachado 555
        tipologiaPersistent.setTeacher(DaoFactory.getTeacherDaoImpl().loadBySigesCode(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(myTipo.getCdDocente())));
556
        tipologiaPersistent.setCourseUnitTurma(findTurma(myTipo.getCdTurma()));
557
        if(tipologiaPersistent.getCourseUnitTurma() == null || tipologiaPersistent.getTeacher() == null)
558
        {
1338 jmachado 559
            logger.error("Turma ou professor nao encontrados enquanto fazia uma tipologia persistente: turma:" + myTipo.getCdTurma() + " teacher code: " + myTipo.getCdDocente());
1406 jmachado 560
            throw new TipologiaLoadExeption(tipologiaPersistent.getTeacher() == null,tipologiaPersistent.getCourseUnitTurma() == null);
1313 jmachado 561
        }
562
        return tipologiaPersistent;
563
    }
564
 
565
    public CourseUnitTurma findTurma(1.5.0/docs/api/java/lang/String.html">String turma)
566
    {
567
        if(getTurmas() == null)
568
            return null;
569
        for(CourseUnitTurma t: getTurmas())
570
        {
571
            if(t.getTurma().equals(turma))
572
                return t;
573
        }
574
        return null;
575
    }
576
 
577
 
578
    public static class TipologiaPersistent
579
    {
580
        private Teacher teacher;
581
        private CourseUnitTurma courseUnitTurma;
1626 jmachado 582
        Tipologia tipologiaOriginal;
583
 
584
        /*private String cdTipologia;
1313 jmachado 585
        private Integer ocorrencias = 0;
586
        protected boolean extra;
587
        protected boolean horRef;
1326 jmachado 588
        protected boolean use;   //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
589
        //por omissão apenas as que têm sumários
1626 jmachado 590
        protected boolean markWarning; //camp*/
1313 jmachado 591
 
1626 jmachado 592
 
1326 jmachado 593
        public boolean isUse() {
1626 jmachado 594
            return tipologiaOriginal.isUse();
1326 jmachado 595
        }
596
 
597
        public void setUse(boolean use) {
1626 jmachado 598
            tipologiaOriginal.use = use;
1326 jmachado 599
        }
600
 
601
        public boolean isMarkWarning() {
1626 jmachado 602
            return tipologiaOriginal.markWarning;
1326 jmachado 603
        }
604
 
605
        public void setMarkWarning(boolean markWarning) {
1626 jmachado 606
            tipologiaOriginal.markWarning = markWarning;
1326 jmachado 607
        }
608
 
1313 jmachado 609
        public boolean isExtra() {
1626 jmachado 610
            return tipologiaOriginal.extra;
1313 jmachado 611
        }
612
 
613
        public boolean isHorRef() {
1626 jmachado 614
            return tipologiaOriginal.horRef;
1313 jmachado 615
        }
616
 
617
        public boolean isSumario() {
1626 jmachado 618
            return tipologiaOriginal.ocorrencias != null && tipologiaOriginal.ocorrencias > 0;
1313 jmachado 619
        }
620
 
621
        public void setExtra(boolean extra) {
1626 jmachado 622
            tipologiaOriginal.extra = extra;
1313 jmachado 623
        }
624
 
625
        public void setHorRef(boolean horRef) {
1626 jmachado 626
            tipologiaOriginal.horRef = horRef;
1313 jmachado 627
        }
628
 
629
        public Teacher getTeacher() {
630
            return teacher;
631
        }
632
 
633
        public void setTeacher(Teacher teacher) {
634
            this.teacher = teacher;
635
        }
636
 
637
        public CourseUnitTurma getCourseUnitTurma() {
638
            return courseUnitTurma;
639
        }
640
 
641
        public void setCourseUnitTurma(CourseUnitTurma courseUnitTurma) {
642
            this.courseUnitTurma = courseUnitTurma;
643
        }
644
 
645
        public 1.5.0/docs/api/java/lang/String.html">String getCdTipologia() {
1626 jmachado 646
            return tipologiaOriginal.cdTipologia;
1313 jmachado 647
        }
648
 
649
        public void setCdTipologia(1.5.0/docs/api/java/lang/String.html">String cdTipologia) {
1626 jmachado 650
            tipologiaOriginal.cdTipologia = cdTipologia;
1313 jmachado 651
        }
652
 
653
        public 1.5.0/docs/api/java/lang/Integer.html">Integer getOcorrencias() {
1626 jmachado 654
            return tipologiaOriginal.ocorrencias == null ? 0:tipologiaOriginal.ocorrencias;
1313 jmachado 655
        }
656
 
657
        public void setOcorrencias(1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias) {
1626 jmachado 658
            tipologiaOriginal.ocorrencias = ocorrencias;
1313 jmachado 659
        }
1626 jmachado 660
 
661
        public boolean isExclude() {
662
            return tipologiaOriginal.exclude;
663
        }
664
 
665
        public void setExclude(boolean exclude) {
666
            tipologiaOriginal.exclude = exclude;
667
        }
1313 jmachado 668
    }
1312 jmachado 669
    /**
670
     * Os codigos de tipologia devem ser limitados a T TP OT etc
671
     */
672
    public static class Tipologia
673
    {
1313 jmachado 674
        protected 1.5.0/docs/api/java/lang/String.html">String cdDocente;
675
        protected 1.5.0/docs/api/java/lang/String.html">String cdTurma;
676
        protected 1.5.0/docs/api/java/lang/String.html">String cdTipologia;
677
        protected 1.5.0/docs/api/java/lang/String.html">String dsTipologia;
1338 jmachado 678
        protected 1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias = 0; // apenas faz sentido nos sumarios. no horario ref nao.
1312 jmachado 679
 
1325 jmachado 680
        protected boolean use;   //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
681
                                //por omissão apenas as que têm sumários
682
        protected boolean markWarning; //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
683
 
1313 jmachado 684
        protected boolean extra;
685
        protected boolean horRef;
1422 jmachado 686
        protected boolean tdocturma = false;
1313 jmachado 687
 
1626 jmachado 688
        //NOVO
689
        protected boolean exclude = false;
690
 
1422 jmachado 691
        public boolean isTdocturma() {
692
            return tdocturma;
693
        }
694
 
695
        public void setTdocturma(boolean tdocturma) {
696
            this.tdocturma = tdocturma;
697
        }
698
 
1325 jmachado 699
        public boolean isUse() {
700
            return use;
701
        }
702
 
1626 jmachado 703
        public boolean isExclude() {
704
            return exclude;
705
        }
706
 
707
        public void setExclude(boolean exclude) {
708
            this.exclude = exclude;
709
        }
710
 
1325 jmachado 711
        public void setUse(boolean use) {
712
            this.use = use;
713
        }
714
 
715
        public boolean isMarkWarning() {
716
            return markWarning;
717
        }
718
 
719
        public void setMarkWarning(boolean markWarning) {
720
            this.markWarning = markWarning;
721
        }
722
 
1312 jmachado 723
        public 1.5.0/docs/api/java/lang/Integer.html">Integer getOcorrencias() {
1338 jmachado 724
            return ocorrencias == null ? 0:ocorrencias;
1312 jmachado 725
        }
726
 
1338 jmachado 727
        public boolean hasOcorrencias() {
728
            return ocorrencias != null && ocorrencias > 0;
729
        }
730
 
1312 jmachado 731
        public void setOcorrencias(1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias) {
732
            this.ocorrencias = ocorrencias;
733
        }
734
 
735
        public 1.5.0/docs/api/java/lang/String.html">String getCdDocente() {
736
            return cdDocente;
737
        }
738
 
739
        public void setCdDocente(1.5.0/docs/api/java/lang/String.html">String cdDocente) {
740
            this.cdDocente = cdDocente;
741
        }
742
 
743
        public 1.5.0/docs/api/java/lang/String.html">String getCdTurma() {
744
            return cdTurma;
745
        }
746
 
747
        public void setCdTurma(1.5.0/docs/api/java/lang/String.html">String cdTurma) {
748
            this.cdTurma = cdTurma;
749
        }
750
 
751
        public 1.5.0/docs/api/java/lang/String.html">String getCdTipologia() {
752
            return cdTipologia;
753
        }
754
 
755
        public void setCdTipologia(1.5.0/docs/api/java/lang/String.html">String cdTipologia) {
756
            this.cdTipologia = cdTipologia;
757
        }
758
 
1313 jmachado 759
        public 1.5.0/docs/api/java/lang/String.html">String getDsTipologia() {
760
            return dsTipologia;
761
        }
762
 
763
        public void setDsTipologia(1.5.0/docs/api/java/lang/String.html">String dsTipologia) {
764
            this.dsTipologia = dsTipologia;
765
        }
766
 
767
        public boolean isExtra() {
768
            return extra;
769
        }
770
 
771
        public boolean isSumario() {
772
            return ocorrencias != null && ocorrencias > 0;
773
        }
774
 
775
        public boolean isHorRef() {
776
            return horRef;
777
        }
778
 
779
 
780
 
1312 jmachado 781
        @1.5.0/docs/api/java/lang/Override.html">Override
782
        public boolean equals(5+0%2Fdocs%2Fapi+Object">Object o)
783
        {
1626 jmachado 784
            if(o instanceof Tipologia){
785
                boolean equalTurma = (
786
                        (((Tipologia)o).getCdTurma() == null && getCdTurma() == null)
787
                        ||
788
                        (((Tipologia)o).getCdTurma().equals(getCdTurma()))
789
                );
790
                boolean equalDocente = (
791
                        (((Tipologia)o).getCdDocente() == null && getCdDocente() == null)
792
                        ||
793
                        (((Tipologia)o).getCdDocente().equals(getCdDocente()))
794
                );
795
                if(equalTurma && equalDocente)
796
                {
1312 jmachado 797
 
1626 jmachado 798
                    if(((Tipologia)o).getCdTipologia() == null && getCdTipologia() == null)
799
                        return true;
800
                    if(((Tipologia)o).getCdTipologia().equals(getCdTipologia()))
801
                        return true;
802
                    //Se uma das tipologias é simples virtual tem de ser sempre igual à outra seja ela qual for
803
                    //pois a simples tem de fazer match em todas
804
                    if(((Tipologia)o).getCdTipologia().equals(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE)
1312 jmachado 805
                            ||
1626 jmachado 806
                            getCdTipologia().equals(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE))
807
                        return true;
808
                }
809
            }
810
            return false;
1312 jmachado 811
        }
1313 jmachado 812
 
813
        public boolean equalsIncDsFields(5+0%2Fdocs%2Fapi+Object">Object o)
814
        {
815
            return o instanceof Tipologia &&
816
                    equals(o)
817
                    &&
818
                    (
819
                            (((Tipologia)o).getDsTipologia() == null && getDsTipologia() == null)
820
                                    ||
821
                                    (((Tipologia)o).getDsTipologia().equals(getDsTipologia())))
822
                    &&
823
 
824
                    (
825
                            (((Tipologia)o).getOcorrencias() == null && getOcorrencias() == null)
826
                                    ||
827
                                    (((Tipologia)o).getOcorrencias().equals(getOcorrencias())))
828
                    ;
829
        }
1312 jmachado 830
    }
831
 
1626 jmachado 832
    public void canUse(1.5.0/docs/api/java/lang/String.html">String cdDocente,1.5.0/docs/api/java/lang/String.html">String cdTipologia,1.5.0/docs/api/java/lang/String.html">String cdTurma)
833
    {
834
 
835
    }
836
    /**
837
     * Marca uma tipologia como excluida em todas as Listas
838
     * @param cdDocente
839
     * @param cdTipologia
840
     * @param cdTurma
841
     */
842
    public void setExcludedTipologia(boolean excluded, 1.5.0/docs/api/java/lang/String.html">String cdDocente,1.5.0/docs/api/java/lang/String.html">String cdTipologia,1.5.0/docs/api/java/lang/String.html">String cdTurma)
843
    {
844
        try {
1627 jmachado 845
            boolean found = false;
1626 jmachado 846
            Tipologias tipoClass = getTipologiasClass();
847
 
848
            Tipologia proto = new Tipologia();
849
            proto.setCdDocente(cdDocente);
850
            proto.setCdTipologia(cdTipologia);
851
            proto.setCdTurma(cdTurma);
852
            if(tipoClass.getTipologiasSumarios() != null)
853
                for(Tipologia tipo: tipoClass.getTipologiasSumarios())
854
                {
855
                    if(tipo.equals(proto))
856
                    {
857
                        tipo.setExclude(excluded);
1627 jmachado 858
                        found = true;
1626 jmachado 859
                    }
860
                }
861
            if(tipoClass.getTipologiasHorarioReferencia() != null)
862
                for(Tipologia tipo: tipoClass.getTipologiasHorarioReferencia())
863
                {
864
                    if(tipo.equals(proto))
865
                    {
866
                        tipo.setExclude(excluded);
1627 jmachado 867
                        found = true;
1626 jmachado 868
                    }
869
                }
870
            if(tipoClass.getTipologiasExtraAdicionadas() != null)
871
                for(Tipologia tipo: tipoClass.getTipologiasExtraAdicionadas())
872
                {
873
                    if(tipo.equals(proto))
874
                    {
875
                        tipo.setExclude(excluded);
1627 jmachado 876
                        found = true;
1626 jmachado 877
                    }
878
                }
879
            if(tipoClass.getTipologiasTdocTurma() != null)
880
                for(Tipologia tipo: tipoClass.getTipologiasTdocTurma())
881
                {
882
                    if(tipo.equals(proto))
883
                    {
884
                        tipo.setExclude(excluded);
1627 jmachado 885
                        found = true;
1626 jmachado 886
                    }
887
                }
1627 jmachado 888
            if(!found)
889
            {
890
                logger.info("Tipologia não encontrada para excluir, provavelmente é uma tipologia que foi carregada da lista de docentes por não pertencer às tipologias");
891
                logger.info("Vamos adicionar tipologia Extra à lista de tipologias da unidade");
892
                Tipologia tipoExtra = new Tipologia();
893
                tipoExtra.cdDocente = cdDocente;
894
                tipoExtra.cdTurma = cdTurma;
895
                tipoExtra.cdTipologia = Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE;
896
                tipoExtra.dsTipologia = Globals.BACO_TIPOLOGIA_SIMPLES_DS;
897
                tipoExtra.extra = true;
898
                tipoExtra.exclude = true;
899
                if(tipoClass.getTipologiasExtraAdicionadas() == null)
900
                    tipoClass.setTipologiasExtraAdicionadas(new ArrayList<Tipologia>());
901
                tipoClass.getTipologiasExtraAdicionadas().add(tipoExtra);
902
            }
1626 jmachado 903
 
904
            setTipologiasClass(tipoClass);
905
 
906
        } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
907
            logger.error(e,e);
908
        }
909
    }
910
 
1326 jmachado 911
    public static class MergedTipologias
912
    {
913
        ArrayList<Tipologia> tipologiasWithMarkedAndUsed = new ArrayList<Tipologia>();
914
 
915
        public ArrayList<Tipologia> getTipologiasWithMarkedAndUsed() {
916
            return tipologiasWithMarkedAndUsed;
917
        }
918
 
919
        public void setTipologiasWithMarkedAndUsed(ArrayList<Tipologia> tipologiasWithMarkedAndUsed) {
920
            this.tipologiasWithMarkedAndUsed = tipologiasWithMarkedAndUsed;
921
        }
922
    }
1312 jmachado 923
    public static class Tipologias
924
    {
1313 jmachado 925
        ArrayList<Tipologia> tipologiasHorarioReferencia = new ArrayList<Tipologia>();
926
        ArrayList<Tipologia> tipologiasSumarios = new ArrayList<Tipologia>();
927
        ArrayList<Tipologia> tipologiasExtraAdicionadas = new ArrayList<Tipologia>();
1326 jmachado 928
        ArrayList<Tipologia> tipologiasUsadas = new ArrayList<Tipologia>();
929
        ArrayList<Tipologia> tipologiasMarcadas = new ArrayList<Tipologia>();
1422 jmachado 930
        ArrayList<Tipologia> tipologiasTdocTurma = new ArrayList<Tipologia>();
1312 jmachado 931
 
1422 jmachado 932
        public ArrayList<Tipologia> getTipologiasTdocTurma() {
933
            return tipologiasTdocTurma == null ? new ArrayList<Tipologia>() : tipologiasTdocTurma;
934
        }
935
 
936
        public void setTipologiasTdocTurma(ArrayList<Tipologia> tipologiasTdocTurma) { this.tipologiasTdocTurma = tipologiasTdocTurma; }
937
 
1312 jmachado 938
        public ArrayList<Tipologia> getTipologiasHorarioReferencia() {
1333 jmachado 939
 
940
            return tipologiasHorarioReferencia == null ? new ArrayList<Tipologia>() : tipologiasHorarioReferencia;
941
 
1312 jmachado 942
        }
943
 
944
        public void setTipologiasHorarioReferencia(ArrayList<Tipologia> tipologiasHorarioReferencia) {
945
            this.tipologiasHorarioReferencia = tipologiasHorarioReferencia;
946
        }
947
 
948
        public ArrayList<Tipologia> getTipologiasSumarios() {
1333 jmachado 949
            return tipologiasSumarios == null ? new ArrayList<Tipologia>() : tipologiasSumarios;
1312 jmachado 950
        }
951
 
952
        public void setTipologiasSumarios(ArrayList<Tipologia> tipologiasSumarios) {
953
            this.tipologiasSumarios = tipologiasSumarios;
954
        }
955
 
956
        public ArrayList<Tipologia> getTipologiasExtraAdicionadas() {
1333 jmachado 957
            return tipologiasExtraAdicionadas == null ? new ArrayList<Tipologia>() : tipologiasExtraAdicionadas;
1312 jmachado 958
        }
959
 
960
        public void setTipologiasExtraAdicionadas(ArrayList<Tipologia> tipologiasExtraAdicionadas) {
961
            this.tipologiasExtraAdicionadas = tipologiasExtraAdicionadas;
962
        }
963
 
1333 jmachado 964
        public ArrayList<Tipologia> getTipologiasUsadas() {
965
            return tipologiasUsadas == null ? new ArrayList<Tipologia>() : tipologiasUsadas;
966
        }
1326 jmachado 967
 
968
        public void setTipologiasUsadas(ArrayList<Tipologia> tipologiasUsadas) { this.tipologiasUsadas = tipologiasUsadas; }
969
 
1333 jmachado 970
        public ArrayList<Tipologia> getTipologiasMarcadas() {
971
            return tipologiasMarcadas == null ? new ArrayList<Tipologia>() : tipologiasMarcadas;
972
        }
1326 jmachado 973
 
974
        public void setTipologiasMarcadas(ArrayList<Tipologia> tipologiasMarcadas) { this.tipologiasMarcadas = tipologiasMarcadas; }
975
 
1312 jmachado 976
        private static Genson getGenson(){
977
            Genson genson = new Genson.Builder()
978
                    .exclude(5+0%2Fdocs%2Fapi+Object">Object.class)
1778 jmachado 979
                    .include(1.5.0/docs/api/java/lang/Boolean.html">Boolean.class)
980
                    .include(1.5.0/docs/api/java/lang/Integer.html">Integer.class)
981
                    .include(1.5.0/docs/api/java/lang/Long.html">Long.class)
982
                    .include(1.5.0/docs/api/java/lang/Double.html">Double.class)
983
                    .include(1.5.0/docs/api/java/lang/Float.html">Float.class)
1312 jmachado 984
                    .include("tipologiasExtraAdicionadas", Tipologias.class)
985
                    .include("tipologiasSumarios", Tipologias.class)
986
                    .include("tipologiasHorarioReferencia", Tipologias.class)
1326 jmachado 987
                    .include("tipologiasUsadas", Tipologias.class)
988
                    .include("tipologiasMarcadas", Tipologias.class)
1422 jmachado 989
                    .include("tipologiasTdocTurma", Tipologias.class)
1312 jmachado 990
                    .include("cdTipologia", Tipologia.class)
991
                    .include("cdDocente", Tipologia.class)
992
                    .include("cdTurma", Tipologia.class)
1313 jmachado 993
                    .include("dsTipologia",Tipologia.class)
1312 jmachado 994
                    .include("ocorrencias", Tipologia.class)
1422 jmachado 995
                    .include("tdocturma", Tipologia.class)
1626 jmachado 996
                    .include("exclude", Tipologia.class)
1312 jmachado 997
                    .create();
998
            return genson;
999
        }
1000
 
1326 jmachado 1001
        private static Genson getGensonMergedTipologiasComplete(){
1002
            Genson genson = new Genson.Builder()
1003
                    .exclude(5+0%2Fdocs%2Fapi+Object">Object.class)
1778 jmachado 1004
                    .include(1.5.0/docs/api/java/lang/Boolean.html">Boolean.class)
1005
                    .include(1.5.0/docs/api/java/lang/Integer.html">Integer.class)
1006
                    .include(1.5.0/docs/api/java/lang/Long.html">Long.class)
1007
                    .include(1.5.0/docs/api/java/lang/Double.html">Double.class)
1008
                    .include(1.5.0/docs/api/java/lang/Float.html">Float.class)
1326 jmachado 1009
                    .include("tipologiasWithMarkedAndUsed", MergedTipologias.class)
1010
                    .include("cdTipologia", Tipologia.class)
1011
                    .include("cdDocente", Tipologia.class)
1012
                    .include("cdTurma", Tipologia.class)
1013
                    .include("dsTipologia",Tipologia.class)
1014
                    .include("ocorrencias", Tipologia.class)
1015
                    .include("horRef", Tipologia.class)
1626 jmachado 1016
                    .include("exclude", Tipologia.class)
1326 jmachado 1017
                    .include("extra", Tipologia.class)
1018
                    .include("use", Tipologia.class)
1422 jmachado 1019
                    .include("tdocturma", Tipologia.class)
1326 jmachado 1020
                    .include("markWarning", Tipologia.class)
1021
                    .create();
1022
            return genson;
1023
        }
1024
 
1776 jmachado 1025
        public 1.5.0/docs/api/java/lang/String.html">String serialize() throws 1.5.0/docs/api/java/io/IOException.html">IOException
1312 jmachado 1026
        {
1027
            Genson genson = getGenson();
1776 jmachado 1028
 
1312 jmachado 1029
                return genson.serialize(this);
1776 jmachado 1030
 
1312 jmachado 1031
        }
1776 jmachado 1032
        public static Tipologias deserialize(1.5.0/docs/api/java/lang/String.html">String serial) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1312 jmachado 1033
        {
1034
            if(serial == null)
1333 jmachado 1035
                return new Tipologias();
1776 jmachado 1036
 
1312 jmachado 1037
                return getGenson().deserialize(serial, Tipologias.class);
1776 jmachado 1038
 
1312 jmachado 1039
        }
1040
 
1041
        public static void main(1.5.0/docs/api/java/lang/String.html">String [] args)
1042
        {
1043
            new TestCourseUnit().testTipologias();
1044
        }
1313 jmachado 1045
 
1776 jmachado 1046
        public static 1.5.0/docs/api/java/lang/String.html">String serializeMergedList(ArrayList<Tipologia> tipologias) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1313 jmachado 1047
        {
1326 jmachado 1048
            MergedTipologias mergedTipologias = new MergedTipologias();
1333 jmachado 1049
            if(tipologias != null)
1050
            {
1051
                mergedTipologias.setTipologiasWithMarkedAndUsed(tipologias);
1052
            }
1326 jmachado 1053
            Genson genson = getGensonMergedTipologiasComplete();
1776 jmachado 1054
 
1326 jmachado 1055
                return genson.serialize(mergedTipologias);
1776 jmachado 1056
 
1326 jmachado 1057
        }
1776 jmachado 1058
        public static ArrayList<Tipologia> deserializeMergedTipologias(1.5.0/docs/api/java/lang/String.html">String serial) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1326 jmachado 1059
        {
1060
            if(serial == null)
1333 jmachado 1061
                return new ArrayList<Tipologia>();
1776 jmachado 1062
 
1326 jmachado 1063
                MergedTipologias mergedTipologias = getGensonMergedTipologiasComplete().deserialize(serial, MergedTipologias.class);
1064
                if(mergedTipologias.getTipologiasWithMarkedAndUsed() == null)
1065
                    return new ArrayList<Tipologia>();
1066
                return mergedTipologias.getTipologiasWithMarkedAndUsed();
1776 jmachado 1067
 
1068
 
1326 jmachado 1069
        }
1776 jmachado 1070
        public 1.5.0/docs/api/java/lang/String.html">String obtainMergeTipologiasSerialized() throws 1.5.0/docs/api/java/io/IOException.html">IOException
1332 jmachado 1071
        {
1072
            return serializeMergedList(obtainMergeTipologias());
1073
        }
1337 jmachado 1074
 
1387 jmachado 1075
 
1626 jmachado 1076
 
1077
 
1387 jmachado 1078
        /**
1623 jmachado 1079
         * Junta todas as tipologias obtidas dos
1080
         * sumarios, horario(ref+trab) + extra + tdoc turma
1626 jmachado 1081
         * As restantes  listas são as marcadas e as usadas
1623 jmachado 1082
         * que apenas estarão disponiveis quando houver gestão de marcação de tipologias
1387 jmachado 1083
         * e coloca todas numa lista de unicas
1084
         * Marca-as com isHorario, isSumario, isExtra
1085
         * @return
1086
         */
1087
 
1326 jmachado 1088
        public ArrayList<Tipologia> obtainMergeTipologias()
1089
        {
1090
            ArrayList<Tipologia> merge = new ArrayList<Tipologia>();
1315 jmachado 1091
            if(getTipologiasSumarios() != null)
1092
                merge.addAll(getTipologiasSumarios());
1313 jmachado 1093
 
1623 jmachado 1094
 
1095
            /**
1096
             * OBTER TODAS DAS LISTAS SUMARIOS HORARIOS EXTRA E TDOC TURMA
1097
             */
1315 jmachado 1098
            if(getTipologiasHorarioReferencia() != null)
1099
                for(Tipologia tipo: getTipologiasHorarioReferencia())
1313 jmachado 1100
                {
1315 jmachado 1101
                    if(!merge.contains(tipo))
1102
                    {
1103
                        merge.add(tipo);
1104
                    }
1313 jmachado 1105
                }
1315 jmachado 1106
            if(getTipologiasExtraAdicionadas() != null)
1107
                for(Tipologia tipo: getTipologiasExtraAdicionadas())
1313 jmachado 1108
                {
1315 jmachado 1109
                    if(!merge.contains(tipo))
1110
                    {
1111
                        merge.add(tipo);
1112
                    }
1313 jmachado 1113
                }
1623 jmachado 1114
            if(getTipologiasTdocTurma() != null)
1115
                for(Tipologia tipo: getTipologiasTdocTurma())
1116
                {
1117
                    if(!merge.contains(tipo))
1118
                    {
1119
                        merge.add(tipo);
1120
                    }
1121
                }
1122
 
1123
            /**
1124
             * FIM DE OBTER TODAS DAS LISTAS SUMARIOS HORARIOS EXTRA E TDOC TURMA
1125
             */
1126
 
1127
 
1128
 
1313 jmachado 1129
            for(Tipologia tipo: merge)
1130
            {
1326 jmachado 1131
                tipo.setMarkWarning(false);
1132
                tipo.setUse(false);
1315 jmachado 1133
                if(getTipologiasHorarioReferencia() != null && getTipologiasHorarioReferencia().contains(tipo))
1313 jmachado 1134
                {
1135
                    tipo.horRef = true;
1136
                }
1137
 
1315 jmachado 1138
                if(getTipologiasExtraAdicionadas() != null && getTipologiasExtraAdicionadas().contains(tipo))
1313 jmachado 1139
                {
1140
                    tipo.extra = true;
1141
                }
1623 jmachado 1142
                //NOVO
1143
                if(getTipologiasTdocTurma() != null && getTipologiasTdocTurma().contains(tipo))
1144
                {
1145
                    tipo.tdocturma = true;
1146
                }
1313 jmachado 1147
            }
1326 jmachado 1148
 
1149
            if(getTipologiasMarcadas() != null)
1150
                for(Tipologia t: getTipologiasMarcadas())
1151
                {
1152
                    for(Tipologia tMerge: merge)
1153
                    {
1154
                        if(tMerge.equals(t))
1155
                        {
1156
                            tMerge.setMarkWarning(true);
1157
                            break;
1158
                        }
1159
                    }
1160
                }
1161
            if(getTipologiasUsadas() != null)
1162
                for(Tipologia t: getTipologiasUsadas())
1163
                {
1164
                    for(Tipologia tMerge: merge)
1165
                    {
1166
                        if(tMerge.equals(t))
1167
                        {
1168
                            tMerge.setUse(true);
1169
                            break;
1170
                        }
1171
                    }
1172
                }
1626 jmachado 1173
            //NAO SERVE PARA NADA
1422 jmachado 1174
            if(getTipologiasTdocTurma() != null)
1175
                for(Tipologia t: getTipologiasTdocTurma())
1176
                {
1177
                    for(Tipologia tMerge: merge)
1178
                    {
1179
                        if(tMerge.equals(t))
1180
                        {
1181
                            tMerge.setUse(true);
1182
                            break;
1183
                        }
1184
                    }
1185
                }
1313 jmachado 1186
            return merge;
1187
        }
1188
 
1387 jmachado 1189
        /**
1190
         *
1191
         *
1192
         * @param courseUnit
1193
         * @return
1194
         */
1337 jmachado 1195
        public ArrayList<Tipologia> obtainTipologiasSimples(CourseUnit courseUnit)
1196
        {
1197
            ArrayList<Tipologia> merge = new ArrayList<Tipologia>();
1198
 
1199
            Map<String,Map<String,Tipologia>> docenteTurmas = new HashMap<String,Map<String,Tipologia>>();
1200
 
1201
            fullfillTipologiasSimples(getTipologiasSumarios(), docenteTurmas);
1202
            fullfillTipologiasSimples(getTipologiasExtraAdicionadas(), docenteTurmas);
1203
            fullfillTipologiasSimples(getTipologiasHorarioReferencia(), docenteTurmas);
1204
            fullfillTipologiasSimples(getTipologiasMarcadas(), docenteTurmas);
1205
            fullfillTipologiasSimples(getTipologiasUsadas(), docenteTurmas);
1422 jmachado 1206
            fullfillTipologiasSimples(getTipologiasTdocTurma(), docenteTurmas);
1337 jmachado 1207
 
1208
 
1209
            if(docenteTurmas.size() == 0)
1210
            {
1211
                //NAO Há sumários vamos associar todos os docentes a todas as turmas
1779 jmachado 1212
                obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(courseUnit, new HashSet<Teacher>(courseUnit.getTeachers()), merge);
1337 jmachado 1213
            }
1214
            else
1215
            {
1216
                for(1.5.0/docs/api/java/util/Map.html">Map.Entry<String,Map<String,Tipologia>> docentes: docenteTurmas.entrySet())
1217
                {
1218
                    for(Tipologia tipologia: docentes.getValue().values())
1219
                    {
1220
                        merge.add(tipologia);
1221
                    }
1222
                }
1622 jmachado 1223
                //NOVO
1224
                //FRAGMENTO PARA OS QUE FALTAM APENAS POR SEGURANÇA JA DEVIAM TER VINDO DO T_DOC_TURMA
1225
                //DO SINC
1226
                //NO LOCAL ONDE AS TIPOLOGIAS SAO INCIALIZADAS NO IMPORT
1227
                //ISTO E MAU PORQUE SE HOUVER TURMAS OS DOCENTES SAO ASSOCIADOS
1228
                //A TODAS E SO DEVERIAM SER ASSOCIADOS AS QUE ESTAO ASSOCAIDOS NO SIGES
1229
                //POR ISSO E QUE ISTO SO SE RESOLVE NO DisciplinaDao durante a Sincronizacao
1230
                //para saber as relacoes TDOC TURMA
1231
                Map<String,Teacher> professoresEsperados = new HashMap<String, Teacher>();
1232
                for(Teacher t: courseUnit.getTeachers())
1233
                {
1234
                    professoresEsperados.put(t.getSigesCode() + "", t);
1235
                }
1236
 
1237
                for(CourseUnitImpl.Tipologia tMerge: merge)
1238
                {
1239
                    professoresEsperados.remove(tMerge.getCdDocente());
1240
                }
1779 jmachado 1241
                obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(courseUnit, professoresEsperados.values(), merge);
1622 jmachado 1242
                //FRAGMENTO EM FALTA PARA INTRODUZIR PROFS SEM SUMARIO
1243
 
1244
 
1245
 
1337 jmachado 1246
            }
1622 jmachado 1247
 
1248
 
1337 jmachado 1249
            return merge;
1250
        }
1251
 
1779 jmachado 1252
        private void obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(CourseUnit courseUnit, Collection<Teacher> teachers, ArrayList<Tipologia> merge) {
1622 jmachado 1253
            if(courseUnit.getTurmas() != null && courseUnit.getTeachers() != null)
1254
            {
1255
                for(CourseUnitTurma turma: courseUnit.getTurmas())
1256
                {
1257
                    for(Teacher t : teachers)
1258
                    {
1259
                        Tipologia simples = new Tipologia();
1260
                        simples.setMarkWarning(true);
1261
                        //simples.setUse(true);
1262
                        simples.setCdDocente(""+t.getSigesCode());
1263
                        simples.setCdTurma(turma.getTurma());
1264
                        simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
1265
                        simples.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
1266
                        merge.add(simples);
1267
                    }
1268
                }
1269
            }
1270
        }
1271
 
1387 jmachado 1272
        /**
1273
         * Cria uma tipologia Simples para cada par Docente-Turma nesta cadeira olhando para
1274
         * todas as tipologias existentes, uma vez que o Baco não guarda associações entre
1275
         * Docentes e Turmas isso será retirado das tipologias importadas
1276
         *
1277
         * @param tipologias
1278
         * @param docenteTurmas
1279
         */
1337 jmachado 1280
        private void fullfillTipologiasSimples(ArrayList<Tipologia> tipologias, Map<String, Map<String, Tipologia>> docenteTurmas) {
1281
            if(tipologias != null)
1282
                for(Tipologia tipo: tipologias)
1283
                {
1284
                    Map<String,Tipologia> turmasDocente = docenteTurmas.get(tipo.getCdDocente());
1285
                    if(turmasDocente == null)
1286
                        turmasDocente = new HashMap<String,Tipologia>();
1287
                    docenteTurmas.put(tipo.getCdDocente(),turmasDocente);
1288
                    Tipologia simples = turmasDocente.get(tipo.getCdTurma());
1623 jmachado 1289
                    //Se nao tiver entrado o sumario vai entrar aqui como TDOC Turma com 0 ocorrencias
1337 jmachado 1290
                    if(simples==null)
1291
                    {
1292
                        simples = new Tipologia();
1293
                        simples.setCdDocente(tipo.getCdDocente());
1294
                        simples.setCdTurma(tipo.getCdTurma());
1295
                        simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
1296
                        simples.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
1387 jmachado 1297
                        //simples.setUse(true);//TODAS USADAS
1338 jmachado 1298
                        if(tipo.hasOcorrencias())
1337 jmachado 1299
                        {
1300
                            simples.setOcorrencias(tipo.getOcorrencias());
1301
                        }
1623 jmachado 1302
                        turmasDocente.put(tipo.getCdTurma(), simples);
1626 jmachado 1303
                        if(tipo.isHorRef())
1304
                            simples.horRef = true;
1305
                        if(tipo.isExtra())
1306
                            simples.extra = true;
1422 jmachado 1307
                        if(tipo.isTdocturma())
1308
                            simples.setTdocturma(true);
1626 jmachado 1309
                        if(tipo.isExclude())
1310
                            simples.setExclude(true);
1337 jmachado 1311
                    }
1623 jmachado 1312
                    //se for tDocturma e ja tiver entrado como sumário nao entra aqui sequer
1313
                    //Nunca entra primeiro como TDOC Turma se já entrou como sumário 
1387 jmachado 1314
                    else if(tipo.hasOcorrencias())
1337 jmachado 1315
                    {
1626 jmachado 1316
                        if(tipo.isHorRef())
1317
                            simples.horRef = true;
1318
                        if(tipo.isExtra())
1319
                            simples.extra = true;
1338 jmachado 1320
                        if(simples.getOcorrencias() == null)
1321
                            simples.setOcorrencias(0);
1337 jmachado 1322
                        simples.setOcorrencias(simples.getOcorrencias()+tipo.getOcorrencias());
1422 jmachado 1323
                        if(tipo.isTdocturma())
1324
                            simples.setTdocturma(true);
1626 jmachado 1325
                        //Nao devera fazer falta porque quando excluimos uma simples excluimos todas
1326
                        if(tipo.isExclude())
1327
                            simples.setExclude(true);
1337 jmachado 1328
                    }
1329
 
1330
                }
1331
        }
1332
 
1333
 
1312 jmachado 1334
    }
1335
 
1336
 
1546 jmachado 1337
    /**Services**/
1312 jmachado 1338
 
1546 jmachado 1339
    /**
1340
     * Require Open Transaction
1341
     * @return 1, 2, 3, 4
1342
     */
1343
    public int getAnoPlanoFromStudiesPlan()
1344
    {
1345
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
1781 jmachado 1346
        1.5.0/docs/api/java/lang/Integer.html">Integer ano = courseImpl.getUnidadeAnoPlano(getSemestre(),getCode());
1347
        if(ano == null)
1348
            return -1;
1349
        else
1350
            return ano;
1546 jmachado 1351
    }
1312 jmachado 1352
 
1546 jmachado 1353
    /**
1354
     * Require Open Transaction
1355
     * @return S1, .., S8, T1 .. T8, A1 .. A4
1356
     */
1357
    public 1.5.0/docs/api/java/lang/String.html">String getPeriodoPlanoFromStudiesPlan()
1358
    {
1359
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
1547 jmachado 1360
        return courseImpl.getUnidadePeriodoPlano(getSemestre(), getCode());
1546 jmachado 1361
    }
1312 jmachado 1362
 
1546 jmachado 1363
    /**
1364
     * Require Open Transaction
1365
     * @return  S1 = 1, S2 = 2,S3 = 3,S4 = 4 ...T1 e T2 = 1, T2 e T3 = 2, T4 e T5 = 3 ...
1366
     */
1367
    public int getSemestrePlanoConvertido()
1368
    {
1369
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
1781 jmachado 1370
        1.5.0/docs/api/java/lang/Integer.html">Integer semestre = courseImpl.getUnidadeSemestrePlanoConvertido(getSemestre(), getCode());
1371
        if(semestre == null)
1372
            return -1;
1373
        else
1374
            return semestre;
1546 jmachado 1375
    }
1376
 
1377
    /**
1378
     * Require Open Transaction
1379
     * @return S1 = 1, S2 = 2, S3 = 1, S4 = 2 ... T1 e T2 = 1,  T2 e T3 = 2, T4 e T5 = 1, T6 e T7 = 2
1380
     */
1381
    public int getSemestrePlanoAbsoluto()
1382
    {
1547 jmachado 1383
        1.5.0/docs/api/java/lang/String.html">String id = getSemestre();
1384
        if(id.equals("S1"))
1385
            return 1;
1386
        else if(id.equals("S2"))
1387
            return 2;
1388
        else if(id.equals("A"))
1389
            return -1;
1546 jmachado 1390
 
1547 jmachado 1391
        else if(id.equals("T1"))
1392
            return 1;
1393
        else if(id.equals("T2"))
1394
            return 1;
1395
        else if(id.equals("T3"))
1396
            return 2;
1397
        else if(id.equals("T4"))
1398
            return 2;
1546 jmachado 1399
 
1400
 
1547 jmachado 1401
        return -1;
1546 jmachado 1402
 
1547 jmachado 1403
    }
1546 jmachado 1404
 
1547 jmachado 1405
 
112 jmachado 1406
}