/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.domain; import static org.fenixedu.academic.predicate.AccessControl.check; import java.math.BigDecimal; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.function.Predicate; import java.util.stream.Collectors; import org.apache.commons.collections.comparators.ReverseComparator; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.curriculum.CurricularCourseType; import org.fenixedu.academic.domain.degree.DegreeType; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReferenceType; import org.fenixedu.academic.domain.degreeStructure.CompetenceCourseInformation; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.executionCourse.SummariesSearchBean; import org.fenixedu.academic.domain.messaging.ExecutionCourseForum; import org.fenixedu.academic.domain.organizationalStructure.DepartmentUnit; import org.fenixedu.academic.domain.student.Registration; import org.fenixedu.academic.domain.student.Student; import org.fenixedu.academic.domain.student.WeeklyWorkLoad; import org.fenixedu.academic.domain.studentCurriculum.Dismissal; import org.fenixedu.academic.domain.time.calendarStructure.AcademicInterval; import org.fenixedu.academic.dto.GenericPair; import org.fenixedu.academic.dto.teacher.executionCourse.SearchExecutionCourseAttendsBean; import org.fenixedu.academic.predicate.AccessControl; import org.fenixedu.academic.predicate.ExecutionCoursePredicates; import org.fenixedu.academic.service.strategy.groupEnrolment.strategys.GroupEnrolmentStrategyFactory; import org.fenixedu.academic.service.strategy.groupEnrolment.strategys.IGroupEnrolmentStrategy; import org.fenixedu.academic.service.strategy.groupEnrolment.strategys.IGroupEnrolmentStrategyFactory; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.DateFormatUtil; import org.fenixedu.academic.util.MultiLanguageString; import org.fenixedu.academic.util.ProposalState; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.bennu.core.signals.DomainObjectEvent; import org.fenixedu.bennu.core.signals.Signal; import org.fenixedu.commons.StringNormalizer; import org.fenixedu.commons.i18n.I18N; import org.fenixedu.commons.i18n.LocalizedString; import org.fenixedu.spaces.domain.Space; import org.joda.time.DateTime; import org.joda.time.DateTimeFieldType; import org.joda.time.Duration; import org.joda.time.Interval; import org.joda.time.Period; import org.joda.time.YearMonthDay; import pt.ist.fenixframework.Atomic; import pt.ist.fenixframework.dml.runtime.RelationAdapter; public class ExecutionCourse extends ExecutionCourse_Base { public static final String CREATED_SIGNAL = "academic.executionCourse.create"; public static final String ACRONYM_CHANGED_SIGNAL = "academic.executionCourse.acronym.edit"; public static List<ExecutionCourse> readNotEmptyExecutionCourses() { return new ArrayList<ExecutionCourse>(Bennu.getInstance().getExecutionCoursesSet()); } public static final Comparator<ExecutionCourse> EXECUTION_COURSE_EXECUTION_PERIOD_COMPARATOR = new Comparator<ExecutionCourse>() { @Override public int compare(ExecutionCourse o1, ExecutionCourse o2) { return o1.getExecutionPeriod().compareTo(o2.getExecutionPeriod()); } }; public static final Comparator<ExecutionCourse> EXECUTION_COURSE_NAME_COMPARATOR = new Comparator<ExecutionCourse>() { @Override public int compare(ExecutionCourse o1, ExecutionCourse o2) { final int c = Collator.getInstance().compare(o1.getNome(), o2.getNome()); return c == 0 ? DomainObjectUtil.COMPARATOR_BY_ID.compare(o1, o2) : c; } }; public static final Comparator<ExecutionCourse> EXECUTION_COURSE_COMPARATOR_BY_EXECUTION_PERIOD_AND_NAME = new Comparator<ExecutionCourse>() { @Override public int compare(ExecutionCourse o1, ExecutionCourse o2) { final int cep = o1.getExecutionPeriod().compareTo(o2.getExecutionPeriod()); if (cep != 0) { return cep; } final int c = Collator.getInstance().compare(o1.getNome(), o2.getNome()); return c == 0 ? DomainObjectUtil.COMPARATOR_BY_ID.compare(o1, o2) : c; } }; static { getRelationCurricularCourseExecutionCourse().addListener(new CurricularCourseExecutionCourseListener()); getRelationCurricularCourseExecutionCourse().addListener(new RelationAdapter<ExecutionCourse, CurricularCourse>() { @Override public void beforeAdd(final ExecutionCourse executionCourse, final CurricularCourse curricularCourse) { if (executionCourse != null && curricularCourse != null && executionCourse.getAssociatedCurricularCoursesSet().size() == 0) { ExecutionCourse previous = null; for (final ExecutionCourse otherExecutionCourse : curricularCourse.getAssociatedExecutionCoursesSet()) { if (previous == null || otherExecutionCourse.getExecutionPeriod().isAfter(previous.getExecutionPeriod())) { previous = otherExecutionCourse; } } if (previous != null) { executionCourse.setProjectTutorialCourse(previous.getProjectTutorialCourse()); } } } }); } public ExecutionCourse(final String nome, final String sigla, final ExecutionSemester executionSemester, EntryPhase entryPhase) { super(); setRootDomainObject(Bennu.getInstance()); addAssociatedEvaluations(new FinalEvaluation()); setAvailableGradeSubmission(Boolean.TRUE); setNome(nome); setExecutionPeriod(executionSemester); setSigla(sigla); setComment(""); if (entryPhase == null) { entryPhase = EntryPhase.FIRST_PHASE; } setEntryPhase(entryPhase); setProjectTutorialCourse(Boolean.FALSE); setUnitCreditValue(null); ExecutionCourseForum forum = new ExecutionCourseForum(); forum.setName(getNameI18N()); addForum(forum); Signal.emit(ExecutionCourse.CREATED_SIGNAL, new DomainObjectEvent<ExecutionCourse>(this)); } public void editInformation(String nome, String sigla, String comment, Boolean availableGradeSubmission, EntryPhase entryPhase) { setNome(nome); setSigla(sigla); setComment(comment); setAvailableGradeSubmission(availableGradeSubmission); if (entryPhase != null) { setEntryPhase(entryPhase); } } public void editCourseLoad(ShiftType type, BigDecimal unitQuantity, BigDecimal totalQuantity) { CourseLoad courseLoad = getCourseLoadByShiftType(type); if (courseLoad == null) { new CourseLoad(this, type, unitQuantity, totalQuantity); } else { courseLoad.edit(unitQuantity, totalQuantity); } } public List<Grouping> getGroupings() { List<Grouping> result = new ArrayList<Grouping>(); for (final ExportGrouping exportGrouping : this.getExportGroupingsSet()) { if (exportGrouping.getProposalState().getState() == ProposalState.ACEITE || exportGrouping.getProposalState().getState() == ProposalState.CRIADOR) { result.add(exportGrouping.getGrouping()); } } return result; } public Grouping getGroupingByName(String groupingName) { for (final Grouping grouping : this.getGroupings()) { if (grouping.getName().equals(groupingName)) { return grouping; } } return null; } public boolean existsGroupingExecutionCourse(ExportGrouping groupPropertiesExecutionCourse) { return getExportGroupingsSet().contains(groupPropertiesExecutionCourse); } public boolean existsGroupingExecutionCourse() { return getExportGroupingsSet().isEmpty(); } public boolean hasProposals() { boolean result = false; boolean found = false; Collection<ExportGrouping> groupPropertiesExecutionCourseList = getExportGroupingsSet(); Iterator<ExportGrouping> iter = groupPropertiesExecutionCourseList.iterator(); while (iter.hasNext() && !found) { ExportGrouping groupPropertiesExecutionCourseAux = iter.next(); if (groupPropertiesExecutionCourseAux.getProposalState().getState().intValue() == 3) { result = true; found = true; } } return result; } public boolean isMasterDegreeDFAOrDEAOnly() { for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { DegreeType degreeType = curricularCourse.getDegreeCurricularPlan().getDegree().getDegreeType(); if (!degreeType.isPreBolonhaMasterDegree() && !degreeType.isAdvancedFormationDiploma() && !degreeType.isSpecializationDegree() && !degreeType.isAdvancedSpecializationDiploma()) { return false; } } return true; } public void createEvaluationMethod(final MultiLanguageString evaluationElements) { if (evaluationElements == null) { throw new NullPointerException(); } final EvaluationMethod evaluationMethod = new EvaluationMethod(); evaluationMethod.setExecutionCourse(this); evaluationMethod.setEvaluationElements(evaluationElements); } public void copyEvaluationMethodFrom(ExecutionCourse executionCourseFrom) { if (executionCourseFrom.getEvaluationMethod() != null) { final EvaluationMethod evaluationMethodFrom = executionCourseFrom.getEvaluationMethod(); final EvaluationMethod evaluationMethodTo = this.getEvaluationMethod(); if (evaluationMethodTo == null) { this.createEvaluationMethod(evaluationMethodFrom.getEvaluationElements()); } else { evaluationMethodTo.edit(evaluationMethodFrom.getEvaluationElements()); } } } public void createBibliographicReference(final String title, final String authors, final String reference, final String year, final Boolean optional) { if (title == null || authors == null || reference == null || year == null || optional == null) { throw new NullPointerException(); } final BibliographicReference bibliographicReference = new BibliographicReference(); bibliographicReference.setTitle(title); bibliographicReference.setAuthors(authors); bibliographicReference.setReference(reference); bibliographicReference.setYear(year); bibliographicReference.setOptional(optional); bibliographicReference.setExecutionCourse(this); final String type; if (optional) { type = BundleUtil.getString(Bundle.APPLICATION, "option.bibliographicReference.optional"); } else { type = BundleUtil.getString(Bundle.APPLICATION, "option.bibliographicReference.recommended"); } CurricularManagementLog.createLog(this, Bundle.MESSAGING, "log.executionCourse.curricular.bibliographic.created", type, title, this.getName(), this.getDegreePresentationString()); } public List<BibliographicReference> copyBibliographicReferencesFrom(final ExecutionCourse executionCourseFrom) { final List<BibliographicReference> notCopiedBibliographicReferences = new ArrayList<BibliographicReference>(); for (final BibliographicReference bibliographicReference : executionCourseFrom.getAssociatedBibliographicReferencesSet()) { if (canAddBibliographicReference(bibliographicReference)) { this.createBibliographicReference(bibliographicReference.getTitle(), bibliographicReference.getAuthors(), bibliographicReference.getReference(), bibliographicReference.getYear(), bibliographicReference.getOptional()); } else { notCopiedBibliographicReferences.add(bibliographicReference); } } return notCopiedBibliographicReferences; } private boolean canAddBibliographicReference(final BibliographicReference bibliographicReferenceToAdd) { for (final BibliographicReference bibliographicReference : this.getAssociatedBibliographicReferencesSet()) { if (bibliographicReference.getTitle().equals(bibliographicReferenceToAdd.getTitle())) { return false; } } return true; } public List<Professorship> responsibleFors() { return getProfessorshipsSet().stream().filter(Professorship::getResponsibleFor).collect(Collectors.toList()); } public Attends getAttendsByStudent(final Registration registration) { for (final Attends attends : getAttendsSet()) { if (attends.getRegistration() == registration) { return attends; } } return null; } public Attends getAttendsByStudent(final Student student) { for (final Attends attends : getAttendsSet()) { if (attends.isFor(student)) { return attends; } } return null; } public boolean hasAttendsFor(final Student student) { return getAttendsByStudent(student) != null; } public List<Exam> getAssociatedExams() { List<Exam> associatedExams = new ArrayList<Exam>(); for (Evaluation evaluation : this.getAssociatedEvaluationsSet()) { if (evaluation instanceof Exam) { associatedExams.add((Exam) evaluation); } } return associatedExams; } public List<WrittenEvaluation> getAssociatedWrittenEvaluations() { Set<WrittenEvaluation> writtenEvaluations = new HashSet<WrittenEvaluation>(); writtenEvaluations.addAll(this.getAssociatedExams()); writtenEvaluations.addAll(this.getAssociatedWrittenTests()); return new ArrayList<WrittenEvaluation>(writtenEvaluations); } public List<WrittenTest> getAssociatedWrittenTests() { List<WrittenTest> associatedWrittenTests = new ArrayList<WrittenTest>(); for (Evaluation evaluation : this.getAssociatedEvaluationsSet()) { if (evaluation instanceof WrittenTest) { associatedWrittenTests.add((WrittenTest) evaluation); } } return associatedWrittenTests; } // Delete Method public void delete() { DomainException.throwWhenDeleteBlocked(getDeletionBlockers()); if (getSender() != null) { getSender().getRecipientsSet().clear(); getSender().delete(); } if (getEvaluationMethod() != null) { getEvaluationMethod().delete(); } for (; !getExportGroupingsSet().isEmpty(); getExportGroupingsSet().iterator().next().delete()) { ; } for (; !getGroupingSenderExecutionCourseSet().isEmpty(); getGroupingSenderExecutionCourseSet().iterator().next().delete()) { ; } for (; !getCourseLoadsSet().isEmpty(); getCourseLoadsSet().iterator().next().delete()) { ; } for (; !getProfessorshipsSet().isEmpty(); getProfessorshipsSet().iterator().next().delete()) { ; } for (; !getLessonPlanningsSet().isEmpty(); getLessonPlanningsSet().iterator().next().delete()) { ; } for (; !getAttendsSet().isEmpty(); getAttendsSet().iterator().next().delete()) { ; } for (; !getForuns().isEmpty(); getForuns().iterator().next().delete()) { ; } for (; !getExecutionCourseLogsSet().isEmpty(); getExecutionCourseLogsSet().iterator().next().delete()) { ; } removeFinalEvaluations(); getAssociatedCurricularCoursesSet().clear(); getNonAffiliatedTeachersSet().clear(); getTeacherGroupSet().clear(); setExecutionPeriod(null); setRootDomainObject(null); super.deleteDomainObject(); } @Override protected void checkForDeletionBlockers(Collection<String> blockers) { super.checkForDeletionBlockers(blockers); if (!getAssociatedSummariesSet().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } if (!getGroupings().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } if (!getAssociatedBibliographicReferencesSet().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } if (!hasOnlyFinalEvaluations()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } if (!getAssociatedShifts().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } if (!getAttendsSet().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } for (final Professorship professorship : getProfessorshipsSet()) { if (!professorship.isDeletable()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } } for (ExecutionCourseForum forum : getForuns()) { if (forum.getConversationThreadSet().size() != 0) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.execution.course.cant.delete")); } } if (!getStudentGroupSet().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.executionCourse.cannotDeleteExecutionCourseUsedInAccessControl")); } if (!getSpecialCriteriaOverExecutionCourseGroupSet().isEmpty()) { blockers.add(BundleUtil.getString(Bundle.APPLICATION, "error.executionCourse.cannotDeleteExecutionCourseUsedInAccessControl")); } } private void removeFinalEvaluations() { final Iterator<Evaluation> iterator = getAssociatedEvaluationsSet().iterator(); while (iterator.hasNext()) { final Evaluation evaluation = iterator.next(); if (evaluation.isFinal()) { iterator.remove(); evaluation.delete(); } else { throw new DomainException("error.ExecutionCourse.cannot.remove.non.final.evaluation"); } } } private boolean hasOnlyFinalEvaluations() { for (final Evaluation evaluation : getAssociatedEvaluationsSet()) { if (!evaluation.isFinal()) { return false; } } return true; } public boolean teacherLecturesExecutionCourse(Teacher teacher) { for (Professorship professorship : this.getProfessorshipsSet()) { if (professorship.getTeacher() == teacher) { return true; } } return false; } public List<org.fenixedu.academic.domain.Project> getAssociatedProjects() { final List<org.fenixedu.academic.domain.Project> result = new ArrayList<org.fenixedu.academic.domain.Project>(); for (Evaluation evaluation : this.getAssociatedEvaluationsSet()) { if (evaluation instanceof org.fenixedu.academic.domain.Project) { result.add((org.fenixedu.academic.domain.Project) evaluation); } } return result; } private int countAssociatedStudentsByEnrolmentNumber(int enrolmentNumber) { int executionCourseAssociatedStudents = 0; ExecutionSemester courseExecutionPeriod = getExecutionPeriod(); for (CurricularCourse curricularCourseFromExecutionCourseEntry : getAssociatedCurricularCoursesSet()) { for (Enrolment enrolment : curricularCourseFromExecutionCourseEntry.getEnrolments()) { if (enrolment.getExecutionPeriod() == courseExecutionPeriod) { StudentCurricularPlan studentCurricularPlanEntry = enrolment.getStudentCurricularPlan(); int numberOfEnrolmentsForThatExecutionCourse = 0; for (Enrolment enrolmentsFromStudentCPEntry : studentCurricularPlanEntry.getEnrolmentsSet()) { if (enrolmentsFromStudentCPEntry.getCurricularCourse() == curricularCourseFromExecutionCourseEntry && (enrolmentsFromStudentCPEntry.getExecutionPeriod().compareTo(courseExecutionPeriod) <= 0)) { ++numberOfEnrolmentsForThatExecutionCourse; if (numberOfEnrolmentsForThatExecutionCourse > enrolmentNumber) { break; } } } if (numberOfEnrolmentsForThatExecutionCourse == enrolmentNumber) { executionCourseAssociatedStudents++; } } } } return executionCourseAssociatedStudents; } public Integer getTotalEnrolmentStudentNumber() { int executionCourseStudentNumber = 0; for (final CurricularCourse curricularCourseFromExecutionCourseEntry : getAssociatedCurricularCoursesSet()) { for (final Enrolment enrolment : curricularCourseFromExecutionCourseEntry.getEnrolments()) { if (enrolment.getExecutionPeriod() == getExecutionPeriod()) { executionCourseStudentNumber++; } } } return executionCourseStudentNumber; } public Integer getFirstTimeEnrolmentStudentNumber() { return countAssociatedStudentsByEnrolmentNumber(1); } public Integer getSecondOrMoreTimeEnrolmentStudentNumber() { return getTotalEnrolmentStudentNumber() - getFirstTimeEnrolmentStudentNumber(); } public Duration getTotalShiftsDuration() { Duration totalDuration = Duration.ZERO; for (Shift shift : getAssociatedShifts()) { totalDuration = totalDuration.plus(shift.getTotalDuration()); } return totalDuration; } public BigDecimal getAllShiftUnitHours(ShiftType shiftType) { BigDecimal totalTime = BigDecimal.ZERO; for (Shift shift : getAssociatedShifts()) { if (shift.containsType(shiftType)) { totalTime = totalTime.add(shift.getUnitHours()); } } return totalTime; } public BigDecimal getWeeklyCourseLoadTotalQuantityByShiftType(ShiftType type) { CourseLoad courseLoad = getCourseLoadByShiftType(type); return courseLoad != null ? courseLoad.getWeeklyHours() : BigDecimal.ZERO; } public Set<Shift> getAssociatedShifts() { Set<Shift> result = new HashSet<Shift>(); for (CourseLoad courseLoad : getCourseLoadsSet()) { result.addAll(courseLoad.getShiftsSet()); } return result; } public Set<LessonInstance> getAssociatedLessonInstances() { Set<LessonInstance> result = new HashSet<LessonInstance>(); for (CourseLoad courseLoad : getCourseLoadsSet()) { result.addAll(courseLoad.getLessonInstancesSet()); } return result; } public Double getStudentsNumberByShift(ShiftType shiftType) { int numShifts = getNumberOfShifts(shiftType); if (numShifts == 0) { return 0.0; } else { return (double) getTotalEnrolmentStudentNumber() / numShifts; } } public List<Enrolment> getActiveEnrollments() { List<Enrolment> results = new ArrayList<Enrolment>(); for (CurricularCourse curricularCourse : this.getAssociatedCurricularCoursesSet()) { List<Enrolment> enrollments = curricularCourse.getActiveEnrollments(this.getExecutionPeriod()); results.addAll(enrollments); } return results; } public List<Dismissal> getDismissals() { List<Dismissal> results = new ArrayList<Dismissal>(); for (CurricularCourse curricularCourse : this.getAssociatedCurricularCoursesSet()) { List<Dismissal> dismissals = curricularCourse.getDismissals(this.getExecutionPeriod()); results.addAll(dismissals); } return results; } public boolean areAllOptionalCurricularCoursesWithLessTenEnrolments() { int enrolments = 0; for (CurricularCourse curricularCourse : this.getAssociatedCurricularCoursesSet()) { if (curricularCourse.getType() != null && curricularCourse.getType().equals(CurricularCourseType.OPTIONAL_COURSE)) { enrolments += curricularCourse.getEnrolmentsByExecutionPeriod(this.getExecutionPeriod()).size(); if (enrolments >= 10) { return false; } } else { return false; } } return true; } public static final Comparator<Evaluation> EVALUATION_COMPARATOR = new Comparator<Evaluation>() { @Override public int compare(Evaluation evaluation1, Evaluation evaluation2) { final String evaluation1ComparisonString = evaluationComparisonString(evaluation1); final String evaluation2ComparisonString = evaluationComparisonString(evaluation2); return evaluation1ComparisonString.compareTo(evaluation2ComparisonString); } private String evaluationComparisonString(final Evaluation evaluation) { final String evaluationTypeDistinguisher; if (evaluation instanceof AdHocEvaluation) { evaluationTypeDistinguisher = "0"; } else if (evaluation instanceof Project) { evaluationTypeDistinguisher = "1"; } else if (evaluation instanceof WrittenEvaluation) { evaluationTypeDistinguisher = "2"; } else if (evaluation instanceof FinalEvaluation) { evaluationTypeDistinguisher = "Z"; } else { evaluationTypeDistinguisher = "3"; } return DateFormatUtil.format(evaluationTypeDistinguisher + "_yyyy/MM/dd", evaluation.getEvaluationDate()) + evaluation.getExternalId(); } }; public List<Evaluation> getOrderedAssociatedEvaluations() { final List<Evaluation> orderedEvaluations = new ArrayList<Evaluation>(getAssociatedEvaluationsSet()); Collections.sort(orderedEvaluations, EVALUATION_COMPARATOR); return orderedEvaluations; } public Set<Attends> getOrderedAttends() { final Set<Attends> orderedAttends = new TreeSet<Attends>(Attends.COMPARATOR_BY_STUDENT_NUMBER); orderedAttends.addAll(getAttendsSet()); return orderedAttends; } private static class CurricularCourseExecutionCourseListener extends RelationAdapter<ExecutionCourse, CurricularCourse> { @Override public void afterAdd(ExecutionCourse execution, CurricularCourse curricular) { for (final Enrolment enrolment : curricular.getEnrolments()) { if (enrolment.getExecutionPeriod().equals(execution.getExecutionPeriod())) { associateAttend(enrolment, execution); } } fillCourseLoads(execution, curricular); } @Override public void afterRemove(ExecutionCourse execution, CurricularCourse curricular) { if (execution != null) { for (Attends attends : execution.getAttendsSet()) { if ((attends.getEnrolment() != null) && (attends.getEnrolment().getCurricularCourse().equals(curricular))) { attends.setEnrolment(null); } } } } private static void associateAttend(Enrolment enrolment, ExecutionCourse executionCourse) { if (!alreadyHasAttend(enrolment, executionCourse.getExecutionPeriod())) { Attends attends = executionCourse.getAttendsByStudent(enrolment.getStudentCurricularPlan().getRegistration()); if (attends == null) { attends = new Attends(enrolment.getStudentCurricularPlan().getRegistration(), executionCourse); } enrolment.addAttends(attends); } } private static boolean alreadyHasAttend(Enrolment enrolment, ExecutionSemester executionSemester) { for (Attends attends : enrolment.getAttendsSet()) { if (attends.getExecutionCourse().getExecutionPeriod().equals(executionSemester)) { return true; } } return false; } private void fillCourseLoads(ExecutionCourse execution, CurricularCourse curricular) { for (ShiftType shiftType : ShiftType.values()) { BigDecimal totalHours = curricular.getTotalHoursByShiftType(shiftType, execution.getExecutionPeriod()); if (totalHours != null && totalHours.compareTo(BigDecimal.ZERO) == 1) { CourseLoad courseLoad = execution.getCourseLoadByShiftType(shiftType); if (courseLoad == null) { new CourseLoad(execution, shiftType, null, totalHours); } } } } } public class WeeklyWorkLoadView { final Interval executionPeriodInterval; final int numberOfWeeks; final Interval[] intervals; final int[] numberResponses; final int[] contactSum; final int[] autonomousStudySum; final int[] otherSum; final int[] totalSum; public WeeklyWorkLoadView(final Interval executionPeriodInterval) { this.executionPeriodInterval = executionPeriodInterval; final Period period = executionPeriodInterval.toPeriod(); int extraWeek = period.getDays() > 0 ? 1 : 0; numberOfWeeks = (period.getYears() * 12 + period.getMonths()) * 4 + period.getWeeks() + extraWeek + 1; intervals = new Interval[numberOfWeeks]; numberResponses = new int[numberOfWeeks]; contactSum = new int[numberOfWeeks]; autonomousStudySum = new int[numberOfWeeks]; otherSum = new int[numberOfWeeks]; totalSum = new int[numberOfWeeks]; for (int i = 0; i < numberOfWeeks; i++) { final DateTime start = executionPeriodInterval.getStart().plusWeeks(i); final DateTime end = start.plusWeeks(1); intervals[i] = new Interval(start, end); } } public void add(final Attends attends) { for (final WeeklyWorkLoad weeklyWorkLoad : attends.getWeeklyWorkLoadsSet()) { final int weekIndex = weeklyWorkLoad.getWeekOffset(); if (consistentAnswers(attends, weekIndex)) { numberResponses[weekIndex]++; final Integer contact = weeklyWorkLoad.getContact(); contactSum[weekIndex] += contact != null ? contact.intValue() : 0; final Integer autounomousStudy = weeklyWorkLoad.getAutonomousStudy(); autonomousStudySum[weekIndex] += autounomousStudy != null ? autounomousStudy.intValue() : 0; final Integer other = weeklyWorkLoad.getOther(); otherSum[weekIndex] += other != null ? other.intValue() : 0; totalSum[weekIndex] = contactSum[weekIndex] + autonomousStudySum[weekIndex] + otherSum[weekIndex]; } } } private boolean consistentAnswers(final Attends attends, final int weekIndex) { int weeklyTotal = 0; for (final Attends someAttends : attends.getRegistration().getAssociatedAttendsSet()) { for (final WeeklyWorkLoad weeklyWorkLoad : someAttends.getWeeklyWorkLoadsSet()) { if (weeklyWorkLoad.getWeekOffset().intValue() == weekIndex) { weeklyTotal += weeklyWorkLoad.getTotal(); } } } return weeklyTotal <= 140; } public Interval[] getIntervals() { return intervals; } public Interval getExecutionPeriodInterval() { return executionPeriodInterval; } public int[] getContactSum() { return contactSum; } public int[] getAutonomousStudySum() { return autonomousStudySum; } public int[] getOtherSum() { return otherSum; } public int[] getNumberResponses() { return numberResponses; } public double[] getContactAverage() { return average(getContactSum(), getNumberResponses()); } public double[] getAutonomousStudyAverage() { return average(getAutonomousStudySum(), getNumberResponses()); } public double[] getOtherAverage() { return average(getOtherSum(), getNumberResponses()); } public double[] getTotalAverage() { final double[] valuesAverage = new double[numberOfWeeks]; for (int i = 0; i < numberOfWeeks; i++) { valuesAverage[i] = Math.round((0.0 + getContactSum()[i] + getAutonomousStudySum()[i] + getOtherSum()[i]) / getNumberResponses()[i]); } return valuesAverage; } private double[] average(final int[] values, final int[] divisor) { final double[] valuesAverage = new double[numberOfWeeks]; for (int i = 0; i < numberOfWeeks; i++) { valuesAverage[i] = Math.round((0.0 + values[i]) / divisor[i]); } return valuesAverage; } private double add(final double[] values) { double total = 0; for (double value : values) { total += value; } return total; } public double getContactAverageTotal() { return add(getContactAverage()); } public double getAutonomousStudyAverageTotal() { return add(getAutonomousStudyAverage()); } public double getOtherAverageTotal() { return add(getOtherAverage()); } public double getTotalAverageTotal() { return add(getTotalAverage()); } public int getNumberResponsesTotal() { int total = 0; for (int i = 0; i < getNumberResponses().length; i++) { total += getNumberResponses()[i]; } return total; } private int getNumberWeeksForAverageCalculation() { if (!getAttendsSet().isEmpty()) { final Attends attends = findAttendsWithEnrolment(); if (attends != null) { int currentWeekOffset = attends.calculateCurrentWeekOffset(); if (currentWeekOffset > 0 && currentWeekOffset < numberOfWeeks) { return currentWeekOffset; } } } return numberOfWeeks; } public double getContactAverageTotalAverage() { final int numberOfWeeks = getNumberWeeksForAverageCalculation(); return numberOfWeeks > 0 ? Math.round(getContactAverageTotal() / numberOfWeeks) : 0; } public double getAutonomousStudyAverageTotalAverage() { final int numberOfWeeks = getNumberWeeksForAverageCalculation(); return numberOfWeeks > 0 ? Math.round(getAutonomousStudyAverageTotal() / getNumberWeeksForAverageCalculation()) : 0; } public double getOtherAverageTotalAverage() { final int numberOfWeeks = getNumberWeeksForAverageCalculation(); return numberOfWeeks > 0 ? Math.round(getOtherAverageTotal() / getNumberWeeksForAverageCalculation()) : 0; } public double getTotalAverageTotalAverage() { final int numberOfWeeks = getNumberWeeksForAverageCalculation(); return numberOfWeeks > 0 ? Math.round(getTotalAverageTotal() / getNumberWeeksForAverageCalculation()) : 0; } public double getNumberResponsesTotalAverage() { final int numberOfWeeks = getNumberWeeksForAverageCalculation(); return numberOfWeeks > 0 ? Math.round((0.0 + getNumberResponsesTotal()) / getNumberWeeksForAverageCalculation()) : 0; } } public Interval getInterval() { final ExecutionSemester executionSemester = getExecutionPeriod(); final DateTime beginningOfSemester = new DateTime(executionSemester.getBeginDateYearMonthDay()); final DateTime firstMonday = beginningOfSemester.withField(DateTimeFieldType.dayOfWeek(), 1); final DateTime endOfSemester = new DateTime(executionSemester.getEndDateYearMonthDay()); final DateTime nextLastMonday = endOfSemester.withField(DateTimeFieldType.dayOfWeek(), 1).plusWeeks(1); return new Interval(firstMonday, nextLastMonday); } public WeeklyWorkLoadView getWeeklyWorkLoadView() { final Attends attends = findAttendsWithEnrolment(); if (attends != null) { final Interval interval = attends.getWeeklyWorkLoadInterval(); final WeeklyWorkLoadView weeklyWorkLoadView = new WeeklyWorkLoadView(interval); for (final Attends attend : getAttendsSet()) { weeklyWorkLoadView.add(attend); } return weeklyWorkLoadView; } else { return null; } } private Attends findAttendsWithEnrolment() { for (final Attends attends : getAttendsSet()) { if (attends.getEnrolment() != null) { return attends; } } return null; } public boolean hasGrouping(final Grouping grouping) { for (final ExportGrouping exportGrouping : getExportGroupingsSet()) { if (grouping == exportGrouping.getGrouping()) { return true; } } return false; } public Shift findShiftByName(final String shiftName) { for (final Shift shift : getAssociatedShifts()) { if (shift.getNome().equals(shiftName)) { return shift; } } return null; } public Set<Shift> findShiftByType(final ShiftType shiftType) { final Set<Shift> shifts = new HashSet<Shift>(); for (final Shift shift : getAssociatedShifts()) { if (shift.containsType(shiftType)) { shifts.add(shift); } } return shifts; } public Set<SchoolClass> findSchoolClasses() { final Set<SchoolClass> schoolClasses = new HashSet<SchoolClass>(); for (final Shift shift : getAssociatedShifts()) { schoolClasses.addAll(shift.getAssociatedClassesSet()); } return schoolClasses; } public List<Summary> readSummariesOfTeachersWithoutProfessorship() { List<Summary> summaries = new ArrayList<Summary>(); for (Summary summary : this.getAssociatedSummariesSet()) { if (summary.getProfessorship() == null && (summary.getTeacher() != null || (summary.getTeacherName() != null && !summary.getTeacherName().equals("")))) { summaries.add(summary); } } return summaries; } public ExportGrouping getExportGrouping(final Grouping grouping) { for (final ExportGrouping exportGrouping : this.getExportGroupingsSet()) { if (exportGrouping.getGrouping() == grouping) { return exportGrouping; } } return null; } public boolean hasExportGrouping(final Grouping grouping) { return getExportGrouping(grouping) != null; } public boolean hasScopeInGivenSemesterAndCurricularYearInDCP(CurricularYear curricularYear, DegreeCurricularPlan degreeCurricularPlan) { for (CurricularCourse curricularCourse : this.getAssociatedCurricularCoursesSet()) { if (curricularCourse.hasScopeInGivenSemesterAndCurricularYearInDCP(curricularYear, degreeCurricularPlan, getExecutionPeriod())) { return true; } } return false; } public void createForum(MultiLanguageString name, MultiLanguageString description) { if (hasForumWithName(name)) { throw new DomainException("executionCourse.already.existing.forum"); } this.addForum(new ExecutionCourseForum(name, description)); } @Override public void addForum(ExecutionCourseForum executionCourseForum) { checkIfCanAddForum(executionCourseForum.getNormalizedName()); super.addForum(executionCourseForum); } public void checkIfCanAddForum(MultiLanguageString name) { if (hasForumWithName(name)) { throw new DomainException("executionCourse.already.existing.forum"); } } public boolean hasForumWithName(MultiLanguageString name) { return getForumByName(name) != null; } public ExecutionCourseForum getForumByName(MultiLanguageString name) { for (final ExecutionCourseForum executionCourseForum : getForuns()) { if (executionCourseForum.getNormalizedName().equalInAnyLanguage(name)) { return executionCourseForum; } } return null; } public SortedSet<Degree> getDegreesSortedByDegreeName() { final SortedSet<Degree> degrees = new TreeSet<Degree>(Degree.COMPARATOR_BY_DEGREE_TYPE_AND_NAME_AND_ID); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final DegreeCurricularPlan degreeCurricularPlan = curricularCourse.getDegreeCurricularPlan(); degrees.add(degreeCurricularPlan.getDegree()); } return degrees; } public SortedSet<CurricularCourse> getCurricularCoursesSortedByDegreeAndCurricularCourseName() { final SortedSet<CurricularCourse> curricularCourses = new TreeSet<CurricularCourse>(CurricularCourse.CURRICULAR_COURSE_COMPARATOR_BY_DEGREE_AND_NAME); curricularCourses.addAll(getAssociatedCurricularCoursesSet()); return curricularCourses; } public Set<CompetenceCourse> getCompetenceCourses() { final Set<CompetenceCourse> competenceCourses = new HashSet<CompetenceCourse>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { competenceCourses.add(competenceCourse); } } return competenceCourses; } public Set<CompetenceCourseInformation> getCompetenceCoursesInformations() { final Set<CompetenceCourseInformation> competenceCourseInformations = new HashSet<CompetenceCourseInformation>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { final CompetenceCourseInformation competenceCourseInformation = competenceCourse.findCompetenceCourseInformationForExecutionPeriod(getExecutionPeriod()); if (competenceCourseInformation != null) { competenceCourseInformations.add(competenceCourseInformation); } } } return competenceCourseInformations; } public boolean hasAnyDegreeGradeToSubmit(final ExecutionSemester period, final DegreeCurricularPlan degreeCurricularPlan) { for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (degreeCurricularPlan == null || degreeCurricularPlan.equals(curricularCourse.getDegreeCurricularPlan())) { if (curricularCourse.hasAnyDegreeGradeToSubmit(period)) { return true; } } } return false; } public boolean hasAnyDegreeMarkSheetToConfirm(ExecutionSemester period, DegreeCurricularPlan degreeCurricularPlan) { for (final CurricularCourse curricularCourse : this.getAssociatedCurricularCoursesSet()) { if (degreeCurricularPlan == null || degreeCurricularPlan.equals(curricularCourse.getDegreeCurricularPlan())) { if (curricularCourse.hasAnyDegreeMarkSheetToConfirm(period)) { return true; } } } return false; } public String constructShiftName(final Shift shift, final int n) { final String number = n < 10 ? "0" + n : Integer.toString(n); StringBuilder typesName = new StringBuilder(); for (ShiftType shiftType : shift.getSortedTypes()) { typesName.append(shiftType.getSiglaTipoAula()); } return getSigla() + typesName.toString() + number; } public SortedSet<Shift> getShiftsByTypeOrderedByShiftName(final ShiftType shiftType) { final SortedSet<Shift> shifts = new TreeSet<Shift>(Shift.SHIFT_COMPARATOR_BY_NAME); for (final Shift shift : getAssociatedShifts()) { if (shift.containsType(shiftType)) { shifts.add(shift); } } return shifts; } public void setShiftNames() { final SortedSet<Shift> shifts = constructSortedSet(getAssociatedShifts(), Shift.SHIFT_COMPARATOR_BY_TYPE_AND_ORDERED_LESSONS); int counter = 0; for (final Shift shift : shifts) { if(shift.isCustomName()){ continue; } final String name = constructShiftName(shift, ++counter); shift.setNome(name); } } private static <T> SortedSet<T> constructSortedSet(Collection<T> collection, Comparator<? super T> c) { final SortedSet<T> sortedSet = new TreeSet<T>(c); sortedSet.addAll(collection); return sortedSet; } public boolean hasProjectsWithOnlineSubmission() { for (Project project : getAssociatedProjects()) { if (project.getOnlineSubmissionsAllowed() == true) { return true; } } return false; } public List<Project> getProjectsWithOnlineSubmission() { List<Project> result = new ArrayList<Project>(); for (Project project : getAssociatedProjects()) { if (project.getOnlineSubmissionsAllowed() == true) { result.add(project); } } return result; } private Set<SchoolClass> getAllSchoolClassesOrBy(DegreeCurricularPlan degreeCurricularPlan) { final Set<SchoolClass> result = new HashSet<SchoolClass>(); for (final Shift shift : getAssociatedShifts()) { for (final SchoolClass schoolClass : shift.getAssociatedClassesSet()) { if (degreeCurricularPlan == null || schoolClass.getExecutionDegree().getDegreeCurricularPlan() == degreeCurricularPlan) { result.add(schoolClass); } } } return result; } public Set<SchoolClass> getSchoolClassesBy(DegreeCurricularPlan degreeCurricularPlan) { return getAllSchoolClassesOrBy(degreeCurricularPlan); } public Set<SchoolClass> getSchoolClasses() { return getAllSchoolClassesOrBy(null); } public boolean isLecturedIn(final ExecutionYear executionYear) { return getExecutionPeriod().getExecutionYear() == executionYear; } public boolean isLecturedIn(final ExecutionSemester executionSemester) { return getExecutionPeriod() == executionSemester; } public SortedSet<Professorship> getProfessorshipsSortedAlphabetically() { final SortedSet<Professorship> professorhips = new TreeSet<Professorship>(Professorship.COMPARATOR_BY_PERSON_NAME); professorhips.addAll(getProfessorshipsSet()); return professorhips; } public SummariesSearchBean getSummariesSearchBean() { return new SummariesSearchBean(this); } public Set<Lesson> getLessons() { final Set<Lesson> lessons = new HashSet<Lesson>(); for (final Shift shift : getAssociatedShifts()) { lessons.addAll(shift.getAssociatedLessonsSet()); } return lessons; } public boolean hasAnyLesson() { for (CourseLoad courseLoad : getCourseLoadsSet()) { for (final Shift shift : courseLoad.getShiftsSet()) { if (!shift.getAssociatedLessonsSet().isEmpty()) { return true; } } } return false; } public SortedSet<WrittenEvaluation> getWrittenEvaluations() { final SortedSet<WrittenEvaluation> writtenEvaluations = new TreeSet<WrittenEvaluation>(WrittenEvaluation.COMPARATOR_BY_BEGIN_DATE); for (final Evaluation evaluation : getAssociatedEvaluationsSet()) { if (evaluation instanceof WrittenEvaluation) { writtenEvaluations.add((WrittenEvaluation) evaluation); } } return writtenEvaluations; } public SortedSet<Shift> getShiftsOrderedByLessons() { final SortedSet<Shift> shifts = new TreeSet<Shift>(Shift.SHIFT_COMPARATOR_BY_TYPE_AND_ORDERED_LESSONS); shifts.addAll(getAssociatedShifts()); return shifts; } public Map<CompetenceCourse, Set<CurricularCourse>> getCurricularCoursesIndexedByCompetenceCourse() { final Map<CompetenceCourse, Set<CurricularCourse>> curricularCourseMap = new HashMap<CompetenceCourse, Set<CurricularCourse>>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.isBolonhaDegree()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { final Set<CurricularCourse> curricularCourses; if (curricularCourseMap.containsKey(competenceCourse)) { curricularCourses = curricularCourseMap.get(competenceCourse); } else { curricularCourses = new TreeSet<CurricularCourse>(CurricularCourse.CURRICULAR_COURSE_COMPARATOR_BY_DEGREE_AND_NAME); curricularCourseMap.put(competenceCourse, curricularCourses); } curricularCourses.add(curricularCourse); } } } return curricularCourseMap; } public boolean getHasAnySecondaryBibliographicReference() { return hasAnyBibliographicReferenceByBibliographicReferenceType(BibliographicReferenceType.SECONDARY); } public boolean getHasAnyMainBibliographicReference() { return hasAnyBibliographicReferenceByBibliographicReferenceType(BibliographicReferenceType.MAIN); } private boolean hasAnyBibliographicReferenceByBibliographicReferenceType(BibliographicReferenceType referenceType) { for (final BibliographicReference bibliographicReference : getAssociatedBibliographicReferencesSet()) { if ((referenceType.equals(BibliographicReferenceType.SECONDARY) && bibliographicReference.getOptional() .booleanValue()) || (referenceType.equals(BibliographicReferenceType.MAIN) && !bibliographicReference.getOptional() .booleanValue())) { return true; } } for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { final CompetenceCourseInformation competenceCourseInformation = competenceCourse.findCompetenceCourseInformationForExecutionPeriod(getExecutionPeriod()); if (competenceCourseInformation != null) { final org.fenixedu.academic.domain.degreeStructure.BibliographicReferences bibliographicReferences = competenceCourseInformation.getBibliographicReferences(); if (bibliographicReferences != null) { for (final org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReference bibliographicReference : bibliographicReferences .getBibliographicReferencesList()) { if (bibliographicReference.getType() == referenceType) { return true; } } } } } } return false; } public List<LessonPlanning> getLessonPlanningsOrderedByOrder(ShiftType lessonType) { final List<LessonPlanning> lessonPlannings = new ArrayList<LessonPlanning>(); for (LessonPlanning planning : getLessonPlanningsSet()) { if (planning.getLessonType().equals(lessonType)) { lessonPlannings.add(planning); } } Collections.sort(lessonPlannings, LessonPlanning.COMPARATOR_BY_ORDER); return lessonPlannings; } public LessonPlanning getLessonPlanning(ShiftType lessonType, Integer order) { for (LessonPlanning planning : getLessonPlanningsSet()) { if (planning.getLessonType().equals(lessonType) && planning.getOrderOfPlanning().equals(order)) { return planning; } } return null; } public Set<ShiftType> getShiftTypes() { Set<ShiftType> shiftTypes = new TreeSet<ShiftType>(); for (CourseLoad courseLoad : getCourseLoadsSet()) { shiftTypes.add(courseLoad.getType()); } return shiftTypes; } public void copyLessonPlanningsFrom(ExecutionCourse executionCourseFrom) { Set<ShiftType> shiftTypes = getShiftTypes(); for (ShiftType shiftType : executionCourseFrom.getShiftTypes()) { if (shiftTypes.contains(shiftType)) { List<LessonPlanning> lessonPlanningsFrom = executionCourseFrom.getLessonPlanningsOrderedByOrder(shiftType); if (!lessonPlanningsFrom.isEmpty()) { for (LessonPlanning planning : lessonPlanningsFrom) { new LessonPlanning(planning.getTitle(), planning.getPlanning(), planning.getLessonType(), this); } } } } } public void createLessonPlanningsUsingSummariesFrom(Shift shift) { List<Summary> summaries = new ArrayList<Summary>(); summaries.addAll(shift.getAssociatedSummariesSet()); Collections.sort(summaries, new ReverseComparator(Summary.COMPARATOR_BY_DATE_AND_HOUR)); for (Summary summary : summaries) { for (ShiftType shiftType : shift.getTypes()) { new LessonPlanning(summary.getTitle(), summary.getSummaryText(), shiftType, this); } } } public void deleteLessonPlanningsByLessonType(ShiftType shiftType) { List<LessonPlanning> lessonPlanningsOrderedByOrder = getLessonPlanningsOrderedByOrder(shiftType); for (LessonPlanning planning : lessonPlanningsOrderedByOrder) { planning.deleteWithoutReOrder(); } } public Integer getNumberOfShifts(ShiftType shiftType) { int numShifts = 0; for (Shift shiftEntry : getAssociatedShifts()) { if (shiftEntry.containsType(shiftType)) { numShifts++; } } return numShifts; } public Double getCurricularCourseEnrolmentsWeight(CurricularCourse curricularCourse) { Double totalEnrolmentStudentNumber = new Double(getTotalEnrolmentStudentNumber()); if (totalEnrolmentStudentNumber > 0d) { return curricularCourse.getTotalEnrolmentStudentNumber(getExecutionPeriod()) / totalEnrolmentStudentNumber; } else { return 0d; } } public Set<ShiftType> getOldShiftTypesToEnrol() { final List<ShiftType> validShiftTypes = Arrays.asList(new ShiftType[] { ShiftType.TEORICA, ShiftType.PRATICA, ShiftType.LABORATORIAL, ShiftType.TEORICO_PRATICA }); final Set<ShiftType> result = new HashSet<ShiftType>(4); for (final Shift shift : getAssociatedShifts()) { for (ShiftType shiftType : shift.getTypes()) { if (validShiftTypes.contains(shiftType)) { result.add(shiftType); break; } } } return result; } /** * Tells if all the associated Curricular Courses load are the same */ public String getEqualLoad() { for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { for (ShiftType type : ShiftType.values()) { if (!getEqualLoad(type, curricularCourse)) { return Boolean.FALSE.toString(); } } } return Boolean.TRUE.toString(); } public boolean getEqualLoad(ShiftType type, CurricularCourse curricularCourse) { if (type != null) { if (type.equals(ShiftType.DUVIDAS) || type.equals(ShiftType.RESERVA)) { return true; } BigDecimal ccTotalHours = curricularCourse.getTotalHoursByShiftType(type, getExecutionPeriod()); CourseLoad courseLoad = getCourseLoadByShiftType(type); if ((courseLoad == null && ccTotalHours == null) || (courseLoad == null && ccTotalHours != null && ccTotalHours.compareTo(BigDecimal.ZERO) == 0) || (courseLoad != null && ccTotalHours != null && courseLoad.getTotalQuantity().compareTo(ccTotalHours) == 0)) { return true; } } return false; } public List<Summary> getSummariesByShiftType(ShiftType shiftType) { List<Summary> summaries = new ArrayList<Summary>(); for (Summary summary : getAssociatedSummariesSet()) { if (summary.getSummaryType() != null && summary.getSummaryType().equals(shiftType)) { summaries.add(summary); } } return summaries; } public List<Summary> getSummariesWithoutProfessorshipButWithTeacher(Teacher teacher) { List<Summary> summaries = new ArrayList<Summary>(); if (teacher != null) { for (Summary summary : getAssociatedSummariesSet()) { if (summary.getTeacher() != null && summary.getTeacher().equals(teacher)) { summaries.add(summary); } } } return summaries; } public void moveSummariesFromTeacherToProfessorship(Teacher teacher, Professorship professorship) { List<Summary> summaries = getSummariesWithoutProfessorshipButWithTeacher(teacher); for (Summary summary : summaries) { summary.moveFromTeacherToProfessorship(professorship); } } @Override public String getNome() { if (I18N.getLocale().getLanguage().equals("en") && !getAssociatedCurricularCoursesSet().isEmpty()) { final StringBuilder stringBuilder = new StringBuilder(); final Set<String> names = new HashSet<String>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (!curricularCourse.getActiveDegreeModuleScopesInExecutionPeriod(getExecutionPeriod()).isEmpty()) { final String name = curricularCourse.getNameEn(); if (!names.contains(name)) { names.add(name); if (stringBuilder.length() > 0) { stringBuilder.append(" / "); } stringBuilder.append(name); } } } if (stringBuilder.length() > 0) { return stringBuilder.toString(); } boolean unique = true; final String nameEn = getAssociatedCurricularCoursesSet().iterator().next().getNameEn(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.getNameEn() == null || !curricularCourse.getNameEn().equals(nameEn)) { unique = false; break; } } if (unique) { return nameEn; } else { return super.getNome(); } } return super.getNome(); } public String getName() { return getNome(); } public String getPrettyAcronym() { return getSigla().replaceAll("[0-9]", ""); } public String getDegreePresentationString() { SortedSet<Degree> degrees = this.getDegreesSortedByDegreeName(); String result = ""; int i = 0; for (Degree degree : degrees) { if (i > 0) { result += ", "; } result += degree.getSigla(); i++; } return result; } public Registration getRegistration(Person person) { for (Registration registration : person.getStudents()) { for (StudentCurricularPlan studentCurricularPlan : registration.getStudentCurricularPlansSet()) { for (Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { for (ExecutionCourse course : enrolment.getExecutionCourses()) { if (course.equals(this)) { return registration; } } } } } return null; } public ExecutionYear getExecutionYear() { return getExecutionPeriod().getExecutionYear(); } public CurricularCourse getCurricularCourseFor(final DegreeCurricularPlan degreeCurricularPlan) { for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.getDegreeCurricularPlan() == degreeCurricularPlan) { return curricularCourse; } } return null; } public SortedSet<BibliographicReference> getOrderedBibliographicReferences() { TreeSet<BibliographicReference> references = new TreeSet<BibliographicReference>(BibliographicReference.COMPARATOR_BY_ORDER); references.addAll(getAssociatedBibliographicReferencesSet()); return references; } public void setBibliographicReferencesOrder(List<BibliographicReference> references) { for(int i = 0; i < references.size(); i++) { references.get(i).setReferenceOrder(i); } } public List<BibliographicReference> getMainBibliographicReferences() { List<BibliographicReference> references = new ArrayList<BibliographicReference>(); for (BibliographicReference reference : getAssociatedBibliographicReferencesSet()) { if (!reference.isOptional()) { references.add(reference); } } return references; } public List<BibliographicReference> getSecondaryBibliographicReferences() { List<BibliographicReference> references = new ArrayList<BibliographicReference>(); for (BibliographicReference reference : getAssociatedBibliographicReferencesSet()) { if (reference.isOptional()) { references.add(reference); } } return references; } public boolean isCompentenceCourseMainBibliographyAvailable() { for (CompetenceCourseInformation information : getCompetenceCoursesInformations()) { BibliographicReferences bibliographicReferences = information.getBibliographicReferences(); if (bibliographicReferences != null && !bibliographicReferences.getMainBibliographicReferences().isEmpty()) { return true; } } return false; } public boolean isCompentenceCourseSecondaryBibliographyAvailable() { for (CompetenceCourseInformation information : getCompetenceCoursesInformations()) { BibliographicReferences bibliographicReferences = information.getBibliographicReferences(); if (bibliographicReferences != null && !bibliographicReferences.getSecondaryBibliographicReferences().isEmpty()) { return true; } } return false; } public Collection<Curriculum> getCurriculums(final ExecutionYear executionYear) { final Collection<Curriculum> result = new HashSet<Curriculum>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final Curriculum curriculum = executionYear == null ? curricularCourse.findLatestCurriculum() : curricularCourse .findLatestCurriculumModifiedBefore(executionYear.getEndDate()); if (curriculum != null) { result.add(curriculum); } } return result; } public boolean isInExamPeriod() { final YearMonthDay yearMonthDay = new YearMonthDay(); final ExecutionSemester executionSemester = getExecutionPeriod(); final ExecutionYear executionYear = getExecutionPeriod().getExecutionYear(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final DegreeCurricularPlan degreeCurricularPlan = curricularCourse.getDegreeCurricularPlan(); final ExecutionDegree executionDegree = degreeCurricularPlan.getExecutionDegreeByYear(executionYear); final YearMonthDay startExamsPeriod; if (executionSemester.getSemester().intValue() == 1) { startExamsPeriod = executionDegree.getPeriodExamsFirstSemester().getStartYearMonthDay(); } else if (executionSemester.getSemester().intValue() == 2) { startExamsPeriod = executionDegree.getPeriodExamsSecondSemester().getStartYearMonthDay(); } else { throw new DomainException("unsupported.execution.period.semester"); } if (!startExamsPeriod.minusDays(2).isAfter(yearMonthDay)) { return true; } } return false; } public List<Grouping> getGroupingsToEnrol() { final List<Grouping> result = new ArrayList<Grouping>(); for (final Grouping grouping : getGroupings()) { if (checkPeriodEnrollmentFor(grouping)) { result.add(grouping); } } return result; } private boolean checkPeriodEnrollmentFor(final Grouping grouping) { final IGroupEnrolmentStrategyFactory enrolmentGroupPolicyStrategyFactory = GroupEnrolmentStrategyFactory.getInstance(); final IGroupEnrolmentStrategy strategy = enrolmentGroupPolicyStrategyFactory.getGroupEnrolmentStrategyInstance(grouping); return strategy.checkEnrolmentDate(grouping, Calendar.getInstance()); } public SortedSet<ExecutionDegree> getFirsExecutionDegreesByYearWithExecutionIn(ExecutionYear executionYear) { SortedSet<ExecutionDegree> result = new TreeSet<ExecutionDegree>(ExecutionDegree.EXECUTION_DEGREE_COMPARATORY_BY_YEAR); for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { ExecutionDegree executionDegree = curricularCourse.getDegreeCurricularPlan().getExecutionDegreeByYear(executionYear); if (executionDegree != null) { result.add(executionDegree); } } return result; } public Set<ExecutionDegree> getExecutionDegrees() { Set<ExecutionDegree> result = new HashSet<ExecutionDegree>(); for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { ExecutionDegree executionDegree = curricularCourse.getDegreeCurricularPlan().getExecutionDegreeByYear(getExecutionYear()); if (executionDegree != null) { result.add(executionDegree); } } return result; } @Override public Boolean getAvailableGradeSubmission() { if (super.getAvailableGradeSubmission() != null) { return super.getAvailableGradeSubmission(); } return Boolean.TRUE; } @Override public void setUnitCreditValue(BigDecimal unitCreditValue) { setUnitCreditValue(unitCreditValue, getUnitCreditValueNotes()); } public void setUnitCreditValue(BigDecimal unitCreditValue, String justification) { if (unitCreditValue != null && (unitCreditValue.compareTo(BigDecimal.ZERO) < 0 || unitCreditValue.compareTo(BigDecimal.ONE) > 0)) { throw new DomainException("error.executionCourse.unitCreditValue.range"); } if (unitCreditValue != null && unitCreditValue.compareTo(BigDecimal.ZERO) != 0 && getEffortRate() == null) { throw new DomainException("error.executionCourse.unitCreditValue.noEffortRate"); } if (getEffortRate() != null && (unitCreditValue != null && unitCreditValue.compareTo(BigDecimal.valueOf(Math.min(getEffortRate().doubleValue(), 1.0))) < 0 && StringUtils .isBlank(justification))) { throw new DomainException("error.executionCourse.unitCreditValue.lower.effortRate.withoutJustification"); } super.setUnitCreditValueNotes(justification); super.setUnitCreditValue(unitCreditValue); } public Set<Department> getDepartments() { final ExecutionSemester executionSemester = getExecutionPeriod(); final Set<Department> departments = new TreeSet<Department>(Department.COMPARATOR_BY_NAME); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { final DepartmentUnit departmentUnit = competenceCourse.getDepartmentUnit(executionSemester); if (departmentUnit != null) { final Department department = departmentUnit.getDepartment(); if (department != null) { departments.add(department); } } } } return departments; } public String getDepartmentNames() { final ExecutionSemester executionSemester = getExecutionPeriod(); final Set<String> departments = new TreeSet<String>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final CompetenceCourse competenceCourse = curricularCourse.getCompetenceCourse(); if (competenceCourse != null) { final DepartmentUnit departmentUnit = competenceCourse.getDepartmentUnit(executionSemester); if (departmentUnit != null) { final Department department = departmentUnit.getDepartment(); if (department != null) { departments.add(department.getName()); } } } } return StringUtils.join(departments, ", "); } public boolean isFromDepartment(final Department departmentToCheck) { for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (departmentToCheck == curricularCourse.getCompetenceCourse().getDepartmentUnit().getDepartment()) { return true; } } return false; } public GenericPair<YearMonthDay, YearMonthDay> getMaxLessonsPeriod() { YearMonthDay minBeginDate = null, maxEndDate = null; Integer semester = getExecutionPeriod().getSemester(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final ExecutionDegree executionDegree = curricularCourse.getExecutionDegreeFor(getExecutionYear()); if (semester.intValue() == 1) { final OccupationPeriod periodLessonsFirstSemester = executionDegree.getPeriodLessonsFirstSemester(); if (periodLessonsFirstSemester != null) { if (minBeginDate == null || minBeginDate.isAfter(periodLessonsFirstSemester.getStartYearMonthDay())) { minBeginDate = periodLessonsFirstSemester.getStartYearMonthDay(); } if (maxEndDate == null || maxEndDate.isBefore(periodLessonsFirstSemester.getEndYearMonthDayWithNextPeriods())) { maxEndDate = periodLessonsFirstSemester.getEndYearMonthDayWithNextPeriods(); } } } else { final OccupationPeriod periodLessonsSecondSemester = executionDegree.getPeriodLessonsSecondSemester(); if (periodLessonsSecondSemester != null) { if (minBeginDate == null || minBeginDate.isAfter(periodLessonsSecondSemester.getStartYearMonthDay())) { minBeginDate = periodLessonsSecondSemester.getStartYearMonthDay(); } if (maxEndDate == null || maxEndDate.isBefore(periodLessonsSecondSemester.getEndYearMonthDayWithNextPeriods())) { maxEndDate = periodLessonsSecondSemester.getEndYearMonthDayWithNextPeriods(); } } } } if (minBeginDate != null && maxEndDate != null) { return new GenericPair<YearMonthDay, YearMonthDay>(minBeginDate, maxEndDate); } return null; } public Map<ShiftType, CourseLoad> getCourseLoadsMap() { Map<ShiftType, CourseLoad> result = new HashMap<ShiftType, CourseLoad>(); Collection<CourseLoad> courseLoads = getCourseLoadsSet(); for (CourseLoad courseLoad : courseLoads) { result.put(courseLoad.getType(), courseLoad); } return result; } public CourseLoad getCourseLoadByShiftType(ShiftType type) { if (type != null) { for (CourseLoad courseLoad : getCourseLoadsSet()) { if (courseLoad.getType().equals(type)) { return courseLoad; } } } return null; } public boolean hasCourseLoadForType(ShiftType type) { CourseLoad courseLoad = getCourseLoadByShiftType(type); return courseLoad != null && !courseLoad.isEmpty(); } public boolean verifyNameEquality(String[] nameWords) { if (nameWords != null) { String courseName = getNome() + " " + getSigla(); if (courseName != null) { String[] courseNameWords = StringNormalizer.normalize(courseName).trim().split(" "); int j, i; for (i = 0; i < nameWords.length; i++) { if (!nameWords[i].equals("")) { for (j = 0; j < courseNameWords.length; j++) { if (courseNameWords[j].equals(nameWords[i])) { break; } } if (j == courseNameWords.length) { return false; } } } if (i == nameWords.length) { return true; } } } return false; } public Set<Space> getAllRooms() { Set<Space> result = new HashSet<Space>(); Set<Lesson> lessons = getLessons(); for (Lesson lesson : lessons) { Space room = lesson.getSala(); if (room != null) { result.add(room); } } return result; } public String getLocalizedEvaluationMethodText() { final EvaluationMethod evaluationMethod = getEvaluationMethod(); if (evaluationMethod != null) { final MultiLanguageString evaluationElements = evaluationMethod.getEvaluationElements(); return evaluationElements.getContent(); } for (final CompetenceCourse competenceCourse : getCompetenceCourses()) { final LocalizedString lstring = competenceCourse.getLocalizedEvaluationMethod(getExecutionPeriod()); if (lstring != null) { return lstring.getContent(); } } return ""; } public String getEvaluationMethodText() { if (getEvaluationMethod() != null) { final MultiLanguageString evaluationElements = getEvaluationMethod().getEvaluationElements(); return evaluationElements != null && evaluationElements.hasContent(MultiLanguageString.pt) ? evaluationElements .getContent(MultiLanguageString.pt) : !getCompetenceCourses().isEmpty() ? getCompetenceCourses().iterator() .next().getEvaluationMethod() : ""; } else { return !getCompetenceCourses().isEmpty() ? getCompetenceCourses().iterator().next().getEvaluationMethod() : ""; } } public String getEvaluationMethodTextEn() { if (getEvaluationMethod() != null) { final MultiLanguageString evaluationElements = getEvaluationMethod().getEvaluationElements(); return evaluationElements != null && evaluationElements.hasContent(MultiLanguageString.en) ? evaluationElements .getContent(MultiLanguageString.en) : !getCompetenceCourses().isEmpty() ? getCompetenceCourses().iterator() .next().getEvaluationMethod() : ""; } else { return !getCompetenceCourses().isEmpty() ? getCompetenceCourses().iterator().next().getEvaluationMethod() : ""; } } public Set<ExecutionCourseForum> getForuns() { return getForumSet(); } public AcademicInterval getAcademicInterval() { return getExecutionPeriod().getAcademicInterval(); } public static ExecutionCourse readBySiglaAndExecutionPeriod(final String sigla, ExecutionSemester executionSemester) { for (ExecutionCourse executionCourse : executionSemester.getAssociatedExecutionCoursesSet()) { if (sigla.equalsIgnoreCase(executionCourse.getSigla())) { return executionCourse; } } return null; } public static ExecutionCourse readLastByExecutionYearAndSigla(final String sigla, ExecutionYear executionYear) { SortedSet<ExecutionCourse> result = new TreeSet<ExecutionCourse>(EXECUTION_COURSE_EXECUTION_PERIOD_COMPARATOR); for (final ExecutionSemester executionSemester : executionYear.getExecutionPeriodsSet()) { for (ExecutionCourse executionCourse : executionSemester.getAssociatedExecutionCoursesSet()) { if (sigla.equalsIgnoreCase(executionCourse.getSigla())) { result.add(executionCourse); } } } return result.isEmpty() ? null : result.last(); } public static ExecutionCourse readLastBySigla(final String sigla) { SortedSet<ExecutionCourse> result = new TreeSet<ExecutionCourse>(EXECUTION_COURSE_EXECUTION_PERIOD_COMPARATOR); for (ExecutionCourse executionCourse : Bennu.getInstance().getExecutionCoursesSet()) { if (sigla.equalsIgnoreCase(executionCourse.getSigla())) { result.add(executionCourse); } } return result.isEmpty() ? null : result.last(); } public static ExecutionCourse readLastByExecutionIntervalAndSigla(final String sigla, ExecutionInterval executionInterval) { return executionInterval instanceof ExecutionSemester ? readBySiglaAndExecutionPeriod(sigla, (ExecutionSemester) executionInterval) : readLastByExecutionYearAndSigla(sigla, (ExecutionYear) executionInterval); } @Override public void setSigla(String sigla) { final String code = sigla.replace(' ', '_').replace('/', '-'); final String uniqueCode = findUniqueCode(code); if (uniqueCode.equals(this.getSigla())) { return; } super.setSigla(uniqueCode); Signal.emit(ExecutionCourse.ACRONYM_CHANGED_SIGNAL, new DomainObjectEvent<>(this)); } private String findUniqueCode(final String code) { if (!existsMatchingCode(code)) { return code; } int c; for (c = 0; existsMatchingCode(code + "-" + c); c++) { ; } return code + "-" + c; } private boolean existsMatchingCode(final String code) { for (final ExecutionCourse executionCourse : getExecutionPeriod().getAssociatedExecutionCoursesSet()) { if (executionCourse != this && executionCourse.getSigla().equalsIgnoreCase(code)) { return true; } } return false; } public Collection<MarkSheet> getAssociatedMarkSheets() { Collection<MarkSheet> markSheets = new HashSet<MarkSheet>(); for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { markSheets.addAll(curricularCourse.getMarkSheetsByPeriod(getExecutionPeriod())); } return markSheets; } public Set<Exam> getPublishedExamsFor(final CurricularCourse curricularCourse) { final Set<Exam> result = new HashSet<Exam>(); for (final WrittenEvaluation eachEvaluation : getWrittenEvaluations()) { if (eachEvaluation.isExam()) { final Exam exam = (Exam) eachEvaluation; if (exam.isExamsMapPublished() && exam.contains(curricularCourse)) { result.add(exam); } } } return result; } public List<AdHocEvaluation> getAssociatedAdHocEvaluations() { final List<AdHocEvaluation> result = new ArrayList<AdHocEvaluation>(); for (Evaluation evaluation : this.getAssociatedEvaluationsSet()) { if (evaluation instanceof AdHocEvaluation) { result.add((AdHocEvaluation) evaluation); } } return result; } public List<AdHocEvaluation> getOrderedAssociatedAdHocEvaluations() { List<AdHocEvaluation> associatedAdHocEvaluations = getAssociatedAdHocEvaluations(); Collections.sort(associatedAdHocEvaluations, AdHocEvaluation.AD_HOC_EVALUATION_CREATION_DATE_COMPARATOR); return associatedAdHocEvaluations; } public boolean functionsAt(final Space campus) { final ExecutionYear executionYear = getExecutionYear(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { final DegreeCurricularPlan degreeCurricularPlan = curricularCourse.getDegreeCurricularPlan(); for (final ExecutionDegree executionDegree : degreeCurricularPlan.getExecutionDegreesSet()) { if (executionDegree.getCampus() == campus && executionDegree.getExecutionYear() == executionYear) { return true; } } } return false; } public Set<DegreeCurricularPlan> getAttendsDegreeCurricularPlans() { final Set<DegreeCurricularPlan> dcps = new HashSet<DegreeCurricularPlan>(); for (final Attends attends : this.getAttendsSet()) { dcps.add(attends.getStudentCurricularPlanFromAttends().getDegreeCurricularPlan()); } return dcps; } public void searchAttends(SearchExecutionCourseAttendsBean attendsBean) { check(this, ExecutionCoursePredicates.executionCourseLecturingTeacherOrDegreeCoordinator); final Predicate<Attends> filter = attendsBean.getFilters(); final Collection<Attends> validAttends = new HashSet<Attends>(); final Map<Integer, Integer> enrolmentNumberMap = new HashMap<Integer, Integer>(); for (final Attends attends : getAttendsSet()) { if (filter.test(attends)) { validAttends.add(attends); addAttendsToEnrolmentNumberMap(attends, enrolmentNumberMap); } } attendsBean.setAttendsResult(validAttends); attendsBean.setEnrolmentsNumberMap(enrolmentNumberMap); } public void addAttendsToEnrolmentNumberMap(final Attends attends, Map<Integer, Integer> enrolmentNumberMap) { Integer enrolmentsNumber; if (attends.getEnrolment() == null) { enrolmentsNumber = 0; } else { enrolmentsNumber = attends.getEnrolment().getNumberOfTotalEnrolmentsInThisCourse(attends.getEnrolment().getExecutionPeriod()); } Integer mapValue = enrolmentNumberMap.get(enrolmentsNumber); if (mapValue == null) { mapValue = 1; } else { mapValue += 1; } enrolmentNumberMap.put(enrolmentsNumber, mapValue); } public Collection<DegreeCurricularPlan> getAssociatedDegreeCurricularPlans() { Collection<DegreeCurricularPlan> result = new HashSet<DegreeCurricularPlan>(); for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { result.add(curricularCourse.getDegreeCurricularPlan()); } return result; } public List<WrittenEvaluation> getAssociatedWrittenEvaluationsForScopeAndContext(List<Integer> curricularYears, DegreeCurricularPlan degreeCurricularPlan) { List<WrittenEvaluation> result = new ArrayList<WrittenEvaluation>(); for (WrittenEvaluation writtenEvaluation : getWrittenEvaluations()) { if (writtenEvaluation.hasScopeOrContextFor(curricularYears, degreeCurricularPlan)) { result.add(writtenEvaluation); } } return result; } public static List<ExecutionCourse> filterByAcademicIntervalAndDegreeCurricularPlanAndCurricularYearAndName( AcademicInterval academicInterval, DegreeCurricularPlan degreeCurricularPlan, CurricularYear curricularYear, String name) { // FIXME (PERIODS) must be changed when ExecutionCourse is linked to // ExecutionInterval ExecutionSemester executionSemester = (ExecutionSemester) ExecutionInterval.getExecutionInterval(academicInterval); return executionSemester == null ? Collections.EMPTY_LIST : executionSemester .getExecutionCoursesByDegreeCurricularPlanAndSemesterAndCurricularYearAndName(degreeCurricularPlan, curricularYear, name); } public static Collection<ExecutionCourse> filterByAcademicInterval(AcademicInterval academicInterval) { // FIXME (PERIODS) must be changed when ExecutionCourse is linked to // ExecutionInterval ExecutionSemester executionSemester = (ExecutionSemester) ExecutionInterval.getExecutionInterval(academicInterval); return executionSemester == null ? Collections.<ExecutionCourse> emptyList() : executionSemester .getAssociatedExecutionCoursesSet(); } public static ExecutionCourse getExecutionCourseByInitials(AcademicInterval academicInterval, String courseInitials) { // FIXME (PERIODS) must be changed when ExecutionCourse is linked to // ExecutionInterval ExecutionSemester executionSemester = (ExecutionSemester) ExecutionInterval.getExecutionInterval(academicInterval); return executionSemester.getExecutionCourseByInitials(courseInitials); } public static List<ExecutionCourse> searchByAcademicIntervalAndExecutionDegreeYearAndName(AcademicInterval academicInterval, ExecutionDegree executionDegree, CurricularYear curricularYear, String name) { // FIXME (PERIODS) must be changed when ExecutionCourse is linked to // ExecutionInterval ExecutionSemester executionSemester = (ExecutionSemester) ExecutionInterval.getExecutionInterval(academicInterval); return executionSemester.getExecutionCoursesByDegreeCurricularPlanAndSemesterAndCurricularYearAndName( executionDegree.getDegreeCurricularPlan(), curricularYear, name); } public boolean isSplittable() { if (getAssociatedCurricularCoursesSet().size() < 2) { return false; } return true; } public boolean isDeletable() { return getDeletionBlockers().isEmpty(); } public Professorship getProfessorship(final Person person) { for (final Professorship professorship : getProfessorshipsSet()) { if (professorship.getPerson() == person) { return professorship; } } return null; } public boolean isHasSender() { return getSender() != null; } /* * This method returns the portuguese name and the english name with the * rules implemented in getNome() method */ public MultiLanguageString getNameI18N() { MultiLanguageString nameI18N = new MultiLanguageString(); nameI18N = nameI18N.with(MultiLanguageString.pt, super.getNome()); final StringBuilder stringBuilder = new StringBuilder(); final Set<String> names = new HashSet<String>(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (!curricularCourse.getActiveDegreeModuleScopesInExecutionPeriod(getExecutionPeriod()).isEmpty()) { final String name = curricularCourse.getNameEn(); if (!names.contains(name)) { names.add(name); if (stringBuilder.length() > 0) { stringBuilder.append(" / "); } stringBuilder.append(name); } } } if (stringBuilder.length() > 0) { nameI18N = nameI18N.with(MultiLanguageString.en, stringBuilder.toString()); return nameI18N; } boolean unique = true; final String nameEn = getAssociatedCurricularCoursesSet().isEmpty() ? null : getAssociatedCurricularCoursesSet().iterator().next() .getNameEn(); for (final CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.getNameEn() == null || !curricularCourse.getNameEn().equals(nameEn)) { unique = false; break; } } if (unique && nameEn != null) { nameI18N = nameI18N.with(MultiLanguageString.en, nameEn); return nameI18N; } else { nameI18N = nameI18N.with(MultiLanguageString.en, super.getNome()); return nameI18N; } } public Professorship getProfessorshipForCurrentUser() { return this.getProfessorship(AccessControl.getPerson()); } public boolean hasAnyEnrolment(ExecutionDegree executionDegree) { for (Attends attend : getAttendsSet()) { if (attend.getEnrolment() != null) { StudentCurricularPlan scp = attend.getRegistration().getStudentCurricularPlan(getExecutionPeriod()); if (scp != null) { ExecutionDegree studentExecutionDegree = scp.getDegreeCurricularPlan().getExecutionDegreeByYearAndCampus(getExecutionYear(), scp.getCampus(getExecutionYear())); if (studentExecutionDegree == executionDegree) { return true; } } } } return false; } public boolean hasEnrolmentsInAnyCurricularCourse() { for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.hasEnrolmentForPeriod(getExecutionPeriod())) { return true; } if (curricularCourse.isAnual() && getExecutionPeriod().getPreviousExecutionPeriod().getExecutionYear() == getExecutionYear()) { if (curricularCourse.hasEnrolmentForPeriod(getExecutionPeriod().getPreviousExecutionPeriod())) { return true; } } } return false; } public int getEnrolmentCount() { int result = 0; for (final Attends attends : getAttendsSet()) { if (attends.getEnrolment() != null) { result++; } } return result; } public boolean isDissertation() { for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.isDissertation()) { return true; } } return false; } @Atomic public void changeProjectTutorialCourse() { setProjectTutorialCourse(!getProjectTutorialCourse()); } @Override public void addAssociatedCurricularCourses(final CurricularCourse curricularCourse) { Collection<ExecutionCourse> executionCourses = curricularCourse.getAssociatedExecutionCoursesSet(); for (ExecutionCourse executionCourse : executionCourses) { if (this != executionCourse && executionCourse.getExecutionPeriod() == getExecutionPeriod()) { throw new DomainException("error.executionCourse.curricularCourse.already.associated"); } } super.addAssociatedCurricularCourses(curricularCourse); } @Atomic public void associateCurricularCourse(final CurricularCourse curricularCourse) { addAssociatedCurricularCourses(curricularCourse); } @Atomic public void dissociateCurricularCourse(final CurricularCourse curricularCourse) { super.removeAssociatedCurricularCourses(curricularCourse); } public Double getEctsCredits() { Double ects = null; for (CurricularCourse curricularCourse : getAssociatedCurricularCoursesSet()) { if (curricularCourse.isActive(getExecutionPeriod())) { if (ects == null) { ects = curricularCourse.getEctsCredits(); } else if (!ects.equals(curricularCourse.getEctsCredits())) { throw new DomainException("error.invalid.ectsCredits"); } } } return ects; } public Set<OccupationPeriod> getLessonPeriods() { final Set<OccupationPeriod> result = new TreeSet<OccupationPeriod>(new Comparator<OccupationPeriod>() { @Override public int compare(final OccupationPeriod op1, final OccupationPeriod op2) { final int i = op1.getPeriodInterval().getStart().compareTo(op2.getPeriodInterval().getStart()); return i == 0 ? op1.getExternalId().compareTo(op2.getExternalId()) : i; } }); for (final ExecutionDegree executionDegree : getExecutionDegrees()) { result.add(executionDegree.getPeriodLessons(getExecutionPeriod())); } return result; } }