/** * Copyright © 2011 Instituto Superior Técnico * * This file is part of FenixEdu GIAF Contracts. * * FenixEdu GIAF Contracts 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 GIAF Contracts 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 GIAF Contracts. If not, see <http://www.gnu.org/licenses/>. */ package pt.ist.fenixedu.contracts.domain.personnelSection.contracts; import java.util.Collections; import java.util.List; import org.apache.commons.collections.comparators.ReverseComparator; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.OccupationPeriod; import org.fenixedu.academic.domain.Teacher; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.bennu.core.domain.Bennu; import org.joda.time.LocalDate; import pt.ist.fenixedu.contracts.domain.util.CategoryType; import pt.ist.fenixframework.Atomic; import pt.utl.ist.fenix.tools.util.i18n.MultiLanguageString; public class ProfessionalCategory extends ProfessionalCategory_Base implements Comparable<ProfessionalCategory> { public ProfessionalCategory(final String giafId, final MultiLanguageString name, final CategoryType categoryType) { super(); String[] args1 = {}; if (giafId == null || giafId.isEmpty()) { throw new DomainException("", args1); } String[] args = {}; if (name == null) { throw new DomainException("", args); } setRootDomainObject(Bennu.getInstance()); setGiafId(giafId); setName(name); setCategoryType(categoryType); } @Atomic public void edit(final MultiLanguageString name, final CategoryType categoryType) { String[] args = {}; if (name == null) { throw new DomainException("", args); } setName(name); setCategoryType(categoryType); } @Override public int compareTo(ProfessionalCategory otherProfessionalCategory) { int categoryTypeCompare = getCategoryType().compareTo(otherProfessionalCategory.getCategoryType()); if (categoryTypeCompare == 0) { if (getWeight() == null) { return otherProfessionalCategory.getWeight() == null ? getName().compareTo(otherProfessionalCategory.getName()) : -1; } else { if (otherProfessionalCategory.getWeight() == null) { return 1; } else { final int weightCompare = getWeight().compareTo(otherProfessionalCategory.getWeight()); return weightCompare == 0 ? getName().compareTo(otherProfessionalCategory.getName()) : weightCompare; } } } return categoryTypeCompare; } protected boolean isTeacherCategoryType() { return getCategoryType().equals(CategoryType.TEACHER); } public boolean isTeacherCareerCategory() { return isTeacherCategoryType() && !isTeacherMonitorCategory(); } public boolean isTeacherMonitorCategory() { return isTeacherCategoryType() && getName().getContent(MultiLanguageString.pt).matches("(?i).*Monitor.*"); } public boolean isTeacherProfessorCategory() { return isTeacherCategoryType() && !isTeacherMonitorCategory() && !isTeacherInvitedCategory(); } public boolean isTeacherInvitedCategory() { return isTeacherCategoryType() && !isTeacherMonitorCategory() && (getName().getContent(MultiLanguageString.pt).matches("(?i).*Convidado.*") || getName().getContent( MultiLanguageString.pt).matches("(?i).*Equip.*")); } public boolean isTeacherInvitedProfessorCategory() { return isTeacherCategoryType() && !isTeacherMonitorCategory() && !isTeacherInvitedAssistantCategory() && isTeacherInvitedCategory(); } public boolean isTeacherInvitedAssistantCategory() { return isTeacherCategoryType() && isTeacherAssistantCategory() && isTeacherInvitedCategory(); } public boolean isTeacherProfessorCategoryAboveAssistant() { return isTeacherCategoryType() && !isTeacherMonitorCategory() && !isTeacherAssistantCategory() && isTeacherProfessorCategory(); } public boolean isTeacherAssistantCategory() { return isTeacherCategoryType() && !isTeacherMonitorCategory() && !isTeacherInvitedCategory() && getName().getContent(MultiLanguageString.pt).matches("(?i).*Assistente.*"); } public static ProfessionalCategory find(final String string, final CategoryType categoryType) { for (final ProfessionalCategory professionalCategory : Bennu.getInstance().getProfessionalCategoriesSet()) { if (professionalCategory.getCategoryType() == categoryType && professionalCategory.getName().getContent().equalsIgnoreCase(string)) { return professionalCategory; } } return null; } public static boolean isMonitor(Teacher teacher, ExecutionSemester executionSemester) { if (executionSemester != null) { ProfessionalCategory category = getCategoryByPeriod(teacher, executionSemester); return (category != null && category.isTeacherMonitorCategory()); } return false; } public static boolean isAssistant(Teacher teacher, ExecutionSemester executionSemester) { if (executionSemester != null) { ProfessionalCategory category = getCategoryByPeriod(teacher, executionSemester); return (category != null && category.isTeacherAssistantCategory()); } return false; } public static boolean isTeacherCareerCategory(Teacher teacher, ExecutionSemester executionSemester) { if (executionSemester != null) { ProfessionalCategory category = getCategoryByPeriod(teacher, executionSemester); return (category != null && category.isTeacherCareerCategory()); } return false; } public static boolean isTeacherProfessorCategory(Teacher teacher, ExecutionSemester executionSemester) { if (executionSemester != null) { ProfessionalCategory category = getCategoryByPeriod(teacher, executionSemester); return (category != null && category.isTeacherProfessorCategory()); } return false; } public static ProfessionalCategory getCategory(Teacher teacher) { ProfessionalCategory category = ProfessionalCategory.getCurrentCategory(teacher); if (category == null) { PersonProfessionalData personProfessionalData = teacher.getPerson().getPersonProfessionalData(); return personProfessionalData == null ? null : personProfessionalData .getLastProfessionalCategoryByCategoryType(CategoryType.TEACHER); } return category; } public static ProfessionalCategory getCurrentCategory(Teacher teacher) { ProfessionalCategory professionalCategory = null; PersonProfessionalData personProfessionalData = teacher.getPerson().getPersonProfessionalData(); if (personProfessionalData != null) { professionalCategory = personProfessionalData.getProfessionalCategoryByCategoryType(CategoryType.TEACHER, new LocalDate()); } if (professionalCategory == null) { professionalCategory = teacher.getTeacherAuthorization().map(a -> a.getTeacherCategory().getProfessionalCategory()).orElse(null); } return professionalCategory; } public static ProfessionalCategory getLastCategory(Teacher teacher, LocalDate begin, LocalDate end) { ProfessionalCategory professionalCategory = null; PersonProfessionalData personProfessionalData = teacher.getPerson().getPersonProfessionalData(); if (personProfessionalData != null) { professionalCategory = personProfessionalData.getLastProfessionalCategoryByCategoryType(CategoryType.TEACHER, begin, end); } if (professionalCategory == null) { List<ExecutionSemester> executionSemesters = ExecutionSemester.readExecutionPeriodsInTimePeriod(begin, end); Collections.sort(executionSemesters, new ReverseComparator(ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR)); for (ExecutionSemester executionSemester : executionSemesters) { professionalCategory = teacher.getTeacherAuthorization(executionSemester.getAcademicInterval()) .map(a -> a.getTeacherCategory().getProfessionalCategory()).orElse(null); if (professionalCategory != null) { return professionalCategory; } } } return professionalCategory; } public static ProfessionalCategory getCategoryByPeriod(Teacher teacher, ExecutionSemester executionSemester) { OccupationPeriod lessonsPeriod = executionSemester.getLessonsPeriod(); return getLastCategory(teacher, lessonsPeriod.getStartYearMonthDay().toLocalDate(), lessonsPeriod .getEndYearMonthDayWithNextPeriods().toLocalDate()); } }