/**
* 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.enrolment;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.StudentCurricularPlan;
import org.fenixedu.academic.domain.curricularRules.executors.ruleExecutors.CurricularRuleLevel;
import org.fenixedu.academic.domain.degreeStructure.DegreeModule;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.person.RoleType;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.domain.studentCurriculum.CurriculumModule;
import org.fenixedu.academic.domain.studentCurriculum.NoCourseGroupCurriculumGroup;
import org.fenixedu.academic.domain.studentCurriculum.NoCourseGroupCurriculumGroupType;
import org.fenixedu.academic.dto.administrativeOffice.studentEnrolment.NoCourseGroupEnrolmentBean;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.security.Authenticate;
public class EnrolmentContext {
private StudentCurricularPlan studentCurricularPlan;
private ExecutionSemester executionSemester;
private final Set<IDegreeModuleToEvaluate> degreeModulesToEvaluate;
private final List<CurriculumModule> curriculumModulesToRemove;
private CurricularRuleLevel curricularRuleLevel;
//private Person responsiblePerson;
private final User userView;
public EnrolmentContext(final StudentCurricularPlan studentCurricularPlan, final ExecutionSemester executionSemester,
final Set<IDegreeModuleToEvaluate> degreeModulesToEnrol, final List<CurriculumModule> curriculumModulesToRemove,
final CurricularRuleLevel curricularRuleLevel) {
this.userView = Authenticate.getUser();
this.studentCurricularPlan = studentCurricularPlan;
this.degreeModulesToEvaluate = new HashSet<IDegreeModuleToEvaluate>();
for (final IDegreeModuleToEvaluate moduleToEnrol : degreeModulesToEnrol) {
if (curriculumModulesToRemove.contains(moduleToEnrol.getCurriculumGroup())) {
throw new DomainException(
"error.StudentCurricularPlan.cannot.remove.enrollment.on.curriculum.group.because.other.enrollments.depend.on.it",
moduleToEnrol.getCurriculumGroup().getName().getContent());
}
this.addDegreeModuleToEvaluate(moduleToEnrol);
}
this.executionSemester = executionSemester;
this.curriculumModulesToRemove = curriculumModulesToRemove;
this.curricularRuleLevel = curricularRuleLevel;
}
public Set<IDegreeModuleToEvaluate> getDegreeModulesToEvaluate() {
return degreeModulesToEvaluate;
}
public Set<IDegreeModuleToEvaluate> getAllChildDegreeModulesToEvaluateFor(final DegreeModule degreeModule) {
final Set<IDegreeModuleToEvaluate> result = new HashSet<IDegreeModuleToEvaluate>();
for (final IDegreeModuleToEvaluate degreeModuleToEvaluate : this.degreeModulesToEvaluate) {
if (degreeModule.hasDegreeModule(degreeModuleToEvaluate.getDegreeModule())) {
result.add(degreeModuleToEvaluate);
}
}
return result;
}
public void addDegreeModuleToEvaluate(final IDegreeModuleToEvaluate degreeModuleToEvaluate) {
getDegreeModulesToEvaluate().add(degreeModuleToEvaluate);
}
public boolean hasDegreeModulesToEvaluate() {
return degreeModulesToEvaluate != null && !degreeModulesToEvaluate.isEmpty();
}
public ExecutionSemester getExecutionPeriod() {
return executionSemester;
}
public void setExecutionPeriod(ExecutionSemester executionSemester) {
this.executionSemester = executionSemester;
}
public StudentCurricularPlan getStudentCurricularPlan() {
return studentCurricularPlan;
}
public Registration getRegistration() {
return studentCurricularPlan.getRegistration();
}
public void setStudentCurricularPlan(StudentCurricularPlan studentCurricularPlan) {
this.studentCurricularPlan = studentCurricularPlan;
}
public List<CurriculumModule> getToRemove() {
return curriculumModulesToRemove;
}
public CurricularRuleLevel getCurricularRuleLevel() {
return curricularRuleLevel;
}
public void setCurricularRuleLevel(CurricularRuleLevel curricularRuleLevel) {
this.curricularRuleLevel = curricularRuleLevel;
}
public Person getResponsiblePerson() {
return userView.getPerson();
}
public boolean hasResponsiblePerson() {
return getResponsiblePerson() != null;
}
public boolean isResponsiblePersonStudent() {
return RoleType.STUDENT.isMember(userView.getPerson().getUser());
}
public boolean isRegistrationFromResponsiblePerson() {
return getResponsiblePerson() == getRegistration().getPerson();
}
public boolean isNormal() {
return getCurricularRuleLevel().isNormal();
}
public boolean isImprovement() {
return getCurricularRuleLevel() == CurricularRuleLevel.IMPROVEMENT_ENROLMENT;
}
public boolean isSpecialSeason() {
return getCurricularRuleLevel() == CurricularRuleLevel.SPECIAL_SEASON_ENROLMENT;
}
public boolean isExtra() {
return getCurricularRuleLevel() == CurricularRuleLevel.EXTRA_ENROLMENT;
}
public boolean isPropaeudeutics() {
return getCurricularRuleLevel() == CurricularRuleLevel.PROPAEUDEUTICS_ENROLMENT;
}
public boolean isStandalone() {
return getCurricularRuleLevel() == CurricularRuleLevel.STANDALONE_ENROLMENT
|| getCurricularRuleLevel() == CurricularRuleLevel.STANDALONE_ENROLMENT_NO_RULES;
}
public boolean isEnrolmentWithoutRules() {
return getCurricularRuleLevel() == CurricularRuleLevel.ENROLMENT_NO_RULES;
}
public boolean isPhdDegree() {
return studentCurricularPlan.getDegreeType().isAdvancedSpecializationDiploma();
}
@SuppressWarnings("unchecked")
static public EnrolmentContext createForVerifyWithRules(final StudentCurricularPlan studentCurricularPlan,
final ExecutionSemester executionSemester) {
return createForVerifyWithRules(studentCurricularPlan, executionSemester, Collections.EMPTY_SET);
}
@SuppressWarnings("unchecked")
static public EnrolmentContext createForVerifyWithRules(final StudentCurricularPlan studentCurricularPlan,
final ExecutionSemester executionSemester, final Set<IDegreeModuleToEvaluate> degreeModulesToEvaluate) {
return new EnrolmentContext(studentCurricularPlan, executionSemester, degreeModulesToEvaluate, Collections.EMPTY_LIST,
CurricularRuleLevel.ENROLMENT_WITH_RULES);
}
@SuppressWarnings("unchecked")
static public EnrolmentContext createForNoCourseGroupCurriculumGroupEnrolment(
final StudentCurricularPlan studentCurricularPlan, final NoCourseGroupEnrolmentBean bean) {
final IDegreeModuleToEvaluate moduleToEvaluate =
new ExternalCurricularCourseToEnrol(readOrCreateNoCourseGroupCurriculumGroup(studentCurricularPlan,
bean.getGroupType()), bean.getSelectedCurricularCourse(), bean.getExecutionPeriod());
return new EnrolmentContext(studentCurricularPlan, bean.getExecutionPeriod(), Collections.singleton(moduleToEvaluate),
Collections.EMPTY_LIST, bean.getCurricularRuleLevel());
}
static private NoCourseGroupCurriculumGroup readOrCreateNoCourseGroupCurriculumGroup(
final StudentCurricularPlan studentCurricularPlan, final NoCourseGroupCurriculumGroupType groupType) {
NoCourseGroupCurriculumGroup group = studentCurricularPlan.getNoCourseGroupCurriculumGroup(groupType);
if (group == null) {
group = studentCurricularPlan.createNoCourseGroupCurriculumGroup(groupType);
}
return group;
}
}