Subversion Repositories bacoAlunos

Rev

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