/** * 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.student.curriculum; import java.util.HashSet; import java.util.Set; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.student.Student; import org.fenixedu.bennu.core.domain.Bennu; import org.joda.time.DateTime; import org.joda.time.DateTimeFieldType; import org.joda.time.Interval; import org.joda.time.Partial; import pt.ist.fenixframework.Atomic; /** * Extra curricular activity performed by a student during some period of time. * * This information is printed in the student's diploma supplement. The set of * acceptable activities is defined by a candidacy process managed by the * directive council, the students that are accounted to have had a particular * activity are defined by someone responsible in that activity. * * @author Pedro Santos (pedro.miguel.santos@ist.utl.pt) */ public class ExtraCurricularActivity extends ExtraCurricularActivity_Base { private static final int MAX_ACTIVITIES = 5; public ExtraCurricularActivity(Student student, ExtraCurricularActivityType type, Interval interval) { super(); checkParameters(student, type, interval); setRootDomainObject(Bennu.getInstance()); setStudent(student); setType(type); setActivityInterval(interval); } public ExtraCurricularActivity(Student student, ExtraCurricularActivityType type, Partial start, Partial end) { this(student, type, new Interval(start.toDateTime(new DateTime(0)), end.toDateTime(new DateTime(0)))); } private void checkParameters(Student student, ExtraCurricularActivityType type, Interval interval) { Set<ExtraCurricularActivityType> existing = new HashSet<ExtraCurricularActivityType>(); for (ExtraCurricularActivity activity : student.getExtraCurricularActivitySet()) { existing.add(activity.getType()); if (activity.getType().equals(type) && activity.getActivityInterval().overlaps(interval)) { throw new DomainException("error.extraCurricularActivity.overlaping"); } } if (existing.size() == MAX_ACTIVITIES) { throw new DomainException("error.extraCurricularActivity.maxActivitiesLimitReached", Integer.toString(MAX_ACTIVITIES)); } } public boolean getIsDeletable() { return getFeaturedDiploma() == null; } @Override public void setStudent(Student student) { if (!getIsDeletable()) { throw new DomainException("information.already.featured.in.official.document"); } super.setStudent(student); } @Override public void setType(ExtraCurricularActivityType type) { if (!getIsDeletable()) { throw new DomainException("information.already.featured.in.official.document"); } super.setType(type); } @Override public void setActivityInterval(Interval interval) { if (!getIsDeletable()) { throw new DomainException("information.already.featured.in.official.document"); } super.setActivityInterval(interval); } public Partial getStart() { DateTime start = getActivityInterval().getStart(); return new Partial().with(DateTimeFieldType.year(), start.getYear()).with(DateTimeFieldType.monthOfYear(), start.getMonthOfYear()); } public void setStart(Partial start) { setActivityInterval(new Interval(start.toDateTime(new DateTime(0)), getActivityInterval().getEnd())); } public Partial getEnd() { DateTime end = getActivityInterval().getEnd(); return new Partial().with(DateTimeFieldType.year(), end.getYear()).with(DateTimeFieldType.monthOfYear(), end.getMonthOfYear()); } public void setEnd(Partial end) { setActivityInterval(new Interval(getActivityInterval().getStart(), end.toDateTime(new DateTime(0)))); } @Atomic public void delete() { if (!getIsDeletable()) { throw new DomainException("information.already.featured.in.official.document"); } setType(null); setStudent(null); setRootDomainObject(null); deleteDomainObject(); } }