/** * 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.service.services.student.enrolment.bolonha; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.StudentCurricularPlan; import org.fenixedu.academic.domain.candidacy.IngressionType; import org.fenixedu.academic.domain.candidacy.MDCandidacy; import org.fenixedu.academic.domain.degreeStructure.CycleCourseGroup; import org.fenixedu.academic.domain.student.AffinityCyclesManagement; import org.fenixedu.academic.domain.student.Registration; import org.fenixedu.academic.domain.student.RegistrationProtocol; import org.fenixedu.academic.domain.student.Student; import org.fenixedu.academic.domain.student.registrationStates.RegistrationState; import org.fenixedu.academic.domain.student.registrationStates.RegistrationStateType; import org.fenixedu.academic.domain.studentCurriculum.CycleCurriculumGroup; import org.fenixedu.academic.domain.studentCurriculum.StudentCurricularPlanEnrolmentPreConditions; import org.fenixedu.academic.domain.studentCurriculum.StudentCurricularPlanEnrolmentPreConditions.EnrolmentPreConditionResult; import org.fenixedu.academic.dto.student.enrollment.bolonha.CycleEnrolmentBean; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.joda.time.DateTime; import pt.ist.fenixframework.Atomic; //TODO remove in next major @Deprecated public class EnrolInAffinityCycle { /** * This method is used when student is enroling second cycle without * conclude first cycle * */ @Atomic public static void run(final Person person, final CycleEnrolmentBean cycleBean) { final StudentCurricularPlan studentCurricularPlan = cycleBean.getStudentCurricularPlan(); studentCurricularPlan.enrolInAffinityCycle(cycleBean.getCycleCourseGroupToEnrol(), cycleBean.getExecutionPeriod()); } /** * This method is used to create new registrations based on a new cycle. If * second cycle belongs to the same DegreeCurricularPlan then we use * studentCurricularPlan.enrolInAffinityCycle(cycleCourseGroupToEnrol, * executionPeriod). Else we create a new empty registration or we separate * the old second cycle that exists in previous StudentCurricularPlan to a * new registration * * */ @Atomic public static Registration run(final Person person, final StudentCurricularPlan studentCurricularPlan, final CycleCourseGroup cycleCourseGroupToEnrol, final ExecutionSemester executionSemester) throws FenixServiceException { /* * TODO: refactor this code, should be more generic and moved to * AffinityCyclesManagement, while refactoring * SeparationCyclesManagement */ checkConditionsToEnrol(studentCurricularPlan, executionSemester); final CycleCurriculumGroup secondCycle = studentCurricularPlan.getSecondCycle(); if (secondCycle == null) { if (studentCurricularPlanAllowAffinityCycle(studentCurricularPlan, cycleCourseGroupToEnrol)) { studentCurricularPlan.enrolInAffinityCycle(cycleCourseGroupToEnrol, executionSemester); return studentCurricularPlan.getRegistration(); } else { final Student student = studentCurricularPlan.getRegistration().getStudent(); if (student.hasActiveRegistrationFor(cycleCourseGroupToEnrol.getParentDegreeCurricularPlan())) { throw new FenixServiceException("error"); } final MDCandidacy candidacy = createMDCandidacy(student, cycleCourseGroupToEnrol, executionSemester); final Registration newRegistration = new Registration(student.getPerson(), cycleCourseGroupToEnrol.getParentDegreeCurricularPlan(), candidacy, RegistrationProtocol.getDefault(), cycleCourseGroupToEnrol.getCycleType()); newRegistration.setSourceRegistration(studentCurricularPlan.getRegistration()); newRegistration.getActiveState().setResponsiblePerson(null); newRegistration.setIngressionType(IngressionType.findByPredicate(IngressionType::isDirectAccessFrom1stCycle) .orElse(null)); markOldRegistrationWithConcludedState(studentCurricularPlan); return newRegistration; } } else if (secondCycle.isExternal()) { return new AffinityCyclesManagement(studentCurricularPlan).enrol(cycleCourseGroupToEnrol); } else { return studentCurricularPlan.getRegistration(); } } private static void markOldRegistrationWithConcludedState(final StudentCurricularPlan studentCurricularPlan) { if (studentCurricularPlan.getRegistration().hasState(RegistrationStateType.CONCLUDED)) { return; } final Registration registration = studentCurricularPlan.getRegistration(); final RegistrationState state = RegistrationState.createRegistrationState(registration, null, new DateTime(), RegistrationStateType.CONCLUDED); state.setResponsiblePerson(null); } private static boolean studentCurricularPlanAllowAffinityCycle(final StudentCurricularPlan studentCurricularPlan, final CycleCourseGroup cycleCourseGroupToEnrol) { return studentCurricularPlan.getCycleTypes().contains(cycleCourseGroupToEnrol.getCycleType()) && studentCurricularPlan.getDegreeCurricularPlan() == cycleCourseGroupToEnrol.getParentDegreeCurricularPlan(); } private static MDCandidacy createMDCandidacy(final Student student, final CycleCourseGroup cycleCourseGroupToEnrol, final ExecutionSemester executionSemester) { return new MDCandidacy(student.getPerson(), cycleCourseGroupToEnrol.getParentDegreeCurricularPlan() .getExecutionDegreeByAcademicInterval(executionSemester.getExecutionYear().getAcademicInterval())); } private static void checkConditionsToEnrol(final StudentCurricularPlan studentCurricularPlan, final ExecutionSemester executionSemester) throws FenixServiceException { final EnrolmentPreConditionResult result = StudentCurricularPlanEnrolmentPreConditions.checkPreConditionsToEnrol(studentCurricularPlan, executionSemester); if (!result.isValid()) { throw new FenixServiceException(result.message(), result.args()); } } }