/** * 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.organizationalStructure; import java.util.Collection; import java.util.GregorianCalendar; import org.fenixedu.academic.domain.Degree; import org.fenixedu.academic.domain.Department; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOffice; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.util.MultiLanguageString; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.spaces.domain.Space; import org.joda.time.DateTime; import org.joda.time.YearMonthDay; public class UniversityUnit extends UniversityUnit_Base { private UniversityUnit() { super(); super.setType(PartyTypeEnum.UNIVERSITY); } @Override public boolean isUniversityUnit() { return true; } public static UniversityUnit createNewUniversityUnit(MultiLanguageString name, Unit parentUnit, Boolean official, String code, AcademicalInstitutionType institutionType) { UniversityUnit universityUnit = new UniversityUnit(); universityUnit.setPartyName(name); universityUnit.setOfficial(official); universityUnit.setCode(code); universityUnit.setInstitutionType(institutionType); universityUnit.setBeginDateYearMonthDay(YearMonthDay.fromDateFields(new GregorianCalendar().getTime())); universityUnit.setCanBeResponsibleOfSpaces(Boolean.FALSE); return createNewUnit(parentUnit, universityUnit); } public static UniversityUnit createNewUniversityUnit(MultiLanguageString universityName, String universityNameCard, Integer costCenterCode, String universityAcronym, YearMonthDay beginDate, YearMonthDay endDate, Unit parentUnit, String webAddress, UnitClassification classification, Boolean canBeResponsibleOfSpaces, Space campus) { UniversityUnit universityUnit = new UniversityUnit(); universityUnit.init(universityName, universityNameCard, costCenterCode, universityAcronym, beginDate, endDate, webAddress, classification, null, canBeResponsibleOfSpaces, campus); return createNewUnit(parentUnit, universityUnit); } private static UniversityUnit createNewUnit(Unit parentUnit, UniversityUnit universityUnit) { universityUnit.addParentUnit(parentUnit, AccountabilityType.readByType(AccountabilityTypeEnum.GEOGRAPHIC)); checkIfAlreadyExistsOneUniversityWithSameAcronymAndName(universityUnit); return universityUnit; } @Override public void edit(MultiLanguageString name, String acronym) { super.edit(name, acronym); checkIfAlreadyExistsOneUniversityWithSameAcronymAndName(this); } @Override public void edit(MultiLanguageString unitName, String unitNameCard, Integer unitCostCenter, String acronym, YearMonthDay beginDate, YearMonthDay endDate, String webAddress, UnitClassification classification, Department department, Degree degree, AdministrativeOffice administrativeOffice, Boolean canBeResponsibleOfSpaces, Space campus) { super.edit(unitName, unitNameCard, unitCostCenter, acronym, beginDate, endDate, webAddress, classification, department, degree, administrativeOffice, canBeResponsibleOfSpaces, campus); checkIfAlreadyExistsOneUniversityWithSameAcronymAndName(this); } protected static void checkIfAlreadyExistsOneUniversityWithSameAcronymAndName(AcademicalInstitutionUnit universityUnit) { for (Unit parentUnit : universityUnit.getParentUnits()) { for (Unit unit : parentUnit.getAllSubUnits()) { if (!unit.equals(universityUnit) && unit.isUniversityUnit() && ((universityUnit.getAcronym() != null && universityUnit.getAcronym().equalsIgnoreCase( unit.getAcronym())) || universityUnit.getName().equalsIgnoreCase(unit.getName()))) { throw new DomainException("error.unit.already.exists.unit.with.same.name.or.acronym"); } } } } @SuppressWarnings("unchecked") final static public UniversityUnit getInstitutionsUniversityUnit() { /*final Unit institutionUnit = Bennu.getInstance().getInstitutionUnit(); final Collection<UniversityUnit> parentUniversityUnits = (Collection<UniversityUnit>) institutionUnit.getParentParties(AccountabilityTypeEnum.ORGANIZATIONAL_STRUCTURE, UniversityUnit.class); if (parentUniversityUnits.size() != 1) { throw new DomainException("UniversityUnit.unable.to.determine.single.university.unit.for.institution.unit"); }*/ /* return parentUniversityUnits.iterator().next();*/ return getInstitutionsUniversityUnitByDate(new DateTime()); } @SuppressWarnings("unchecked") final static public UniversityUnit getInstitutionsUniversityUnitByDate(DateTime dateTime) { final Unit institutionUnit = Bennu.getInstance().getInstitutionUnit(); final Collection<UniversityUnit> parentUniversityUnits = (Collection<UniversityUnit>) institutionUnit.getParentPartiesByDates( AccountabilityTypeEnum.ORGANIZATIONAL_STRUCTURE, UniversityUnit.class, dateTime); /*for (Object element : parentUniversityUnits) { UniversityUnit universityUnit = (UniversityUnit) element; DateTime beginDate = new DateTime(universityUnit.getBeginDateYearMonthDay().toDateTimeAtCurrentTime()); if (universityUnit.getEndDateYearMonthDay() != null) { DateTime endDate = new DateTime(universityUnit.getEndDateYearMonthDay()); if (beginDate.isBefore(dateTime) || endDate.isAfter(dateTime)) { return universityUnit; } } else { if (beginDate.isBefore(dateTime)) { return universityUnit; } } }*/ if (parentUniversityUnits.size() != 1) { throw new DomainException("UniversityUnit.unable.to.determine.single.university.unit.for.institution.unit"); } return parentUniversityUnits.iterator().next(); } public final Person getCurrentPresident() { final Unit institutionUnit = Bennu.getInstance().getInstitutionUnit(); if (!getChildParties(Unit.class).contains(institutionUnit)) { throw new DomainException("UniversityUnit.not.parent.of.institution.unit"); } return getPresident() != null ? getPresident().getPerson() : null; } public final Person getCurrentPrincipal() { final Unit institutionUnit = Bennu.getInstance().getInstitutionUnit(); if (!getChildParties(Unit.class).contains(institutionUnit)) { throw new DomainException("UniversityUnit.not.parent.of.institution.unit"); } return getPrincipal() != null ? getPrincipal().getPerson() : null; } @Override public Accountability addParentUnit(Unit parentUnit, AccountabilityType accountabilityType) { if (parentUnit != null && (!parentUnit.isOfficialExternal() || (!parentUnit.isPlanetUnit() && !parentUnit.isCountryUnit()))) { throw new DomainException("error.unit.invalid.parentUnit"); } return super.addParentUnit(parentUnit, accountabilityType); } @Override public String getFullPresentationName() { return getName(); } }