/**
* 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.enrollment.shift;
import java.util.ArrayList;
import java.util.List;
import org.fenixedu.academic.domain.Attends;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.Shift;
import org.fenixedu.academic.domain.ShiftType;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.dto.ShiftToEnrol;
import org.fenixedu.academic.service.filter.enrollment.ClassEnrollmentAuthorizationFilter;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.service.services.exceptions.NotAuthorizedException;
import pt.ist.fenixframework.Atomic;
public class ReadShiftsToEnroll {
protected List run(Registration registration, ExecutionSemester executionSemester) throws FenixServiceException {
checkStudentRestrictionsForShiftsEnrolments(registration);
final List<ShiftToEnrol> result = new ArrayList<ShiftToEnrol>();
for (final Attends attends : registration.readAttendsByExecutionPeriod(executionSemester)) {
result.add(buildShiftToEnrol(attends));
}
return result;
}
private void checkStudentRestrictionsForShiftsEnrolments(Registration registration) throws FenixServiceException {
if (registration == null) {
throw new FenixServiceException("errors.impossible.operation");
}
if (registration.getPayedTuition() == null || registration.getPayedTuition().equals(Boolean.FALSE)) {
if (!registration.getInterruptedStudies()) {
throw new FenixServiceException("error.exception.notAuthorized.student.warningTuition");
}
}
if (registration.getFlunked()) {
throw new FenixServiceException("error.exception.notAuthorized.student.warningTuition");
}
}
private ShiftToEnrol buildShiftToEnrol(Attends attends) {
final ShiftToEnrol result = new ShiftToEnrol();
findShiftTypesFromExecutionCourse(attends, result);
findShiftsForExecutionCourseShiftTypesFromStudentEnroledShifts(attends, result);
result.setExecutionCourse(attends.getExecutionCourse());
result.setEnrolled(attends.getEnrolment() != null);
return result;
}
private void findShiftsForExecutionCourseShiftTypesFromStudentEnroledShifts(Attends attend, ShiftToEnrol result) {
for (final Shift shift : attend.getRegistration().getShiftsSet()) {
setShiftInformation(attend, result, shift);
}
}
private void findShiftTypesFromExecutionCourse(Attends attend, ShiftToEnrol result) {
for (final Shift shift : attend.getExecutionCourse().getAssociatedShifts()) {
setShiftTypeInformation(result, shift);
}
}
private void setShiftTypeInformation(ShiftToEnrol result, final Shift shift) {
if (shift.containsType(ShiftType.TEORICA)) {
result.setTheoricType(ShiftType.TEORICA);
} else if (shift.containsType(ShiftType.PRATICA)) {
result.setPraticType(ShiftType.PRATICA);
} else if (shift.containsType(ShiftType.LABORATORIAL)) {
result.setLaboratoryType(ShiftType.LABORATORIAL);
} else if (shift.containsType(ShiftType.TEORICO_PRATICA)) {
result.setTheoricoPraticType(ShiftType.TEORICO_PRATICA);
} else if (shift.containsType(ShiftType.FIELD_WORK)) {
result.setFieldWorkType(ShiftType.FIELD_WORK);
} else if (shift.containsType(ShiftType.PROBLEMS)) {
result.setProblemsType(ShiftType.PROBLEMS);
} else if (shift.containsType(ShiftType.SEMINARY)) {
result.setSeminaryType(ShiftType.SEMINARY);
} else if (shift.containsType(ShiftType.TRAINING_PERIOD)) {
result.setTrainingType(ShiftType.TRAINING_PERIOD);
} else if (shift.containsType(ShiftType.TUTORIAL_ORIENTATION)) {
result.setTutorialOrientationType(ShiftType.TUTORIAL_ORIENTATION);
}
}
private void setShiftInformation(Attends attend, ShiftToEnrol result, final Shift shift) {
if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.TEORICA)) {
result.setTheoricShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.PRATICA)) {
result.setPraticShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.LABORATORIAL)) {
result.setLaboratoryShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.TEORICO_PRATICA)) {
result.setTheoricoPraticShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.FIELD_WORK)) {
result.setFieldWorkShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.PROBLEMS)) {
result.setProblemsShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.SEMINARY)) {
result.setSeminaryShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse() && shift.containsType(ShiftType.TRAINING_PERIOD)) {
result.setTrainingShift(shift);
} else if (shift.getExecutionCourse() == attend.getExecutionCourse()
&& shift.containsType(ShiftType.TUTORIAL_ORIENTATION)) {
result.setTutorialOrientationShift(shift);
}
}
// Service Invokers migrated from Berserk
private static final ReadShiftsToEnroll serviceInstance = new ReadShiftsToEnroll();
@Atomic
public static List runReadShiftsToEnroll(Registration registration) throws FenixServiceException, NotAuthorizedException {
ClassEnrollmentAuthorizationFilter.instance.execute(registration);
return serviceInstance.run(registration, ExecutionSemester.readActualExecutionSemester());
}
@Atomic
public static List runReadShiftsToEnroll(Registration registration, ExecutionSemester executionSemester)
throws FenixServiceException, NotAuthorizedException {
ClassEnrollmentAuthorizationFilter.instance.execute(registration, executionSemester);
return serviceInstance.run(registration, executionSemester);
}
}