Subversion Repositories bacoAlunos

Rev

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