/**
* 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;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.fenixedu.academic.domain.CurricularCourseScope.DegreeModuleScopeCurricularCourseScope;
import org.fenixedu.academic.domain.degreeStructure.Context;
import org.fenixedu.academic.domain.degreeStructure.Context.DegreeModuleScopeContext;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.person.RoleType;
import org.fenixedu.academic.domain.space.SpaceUtils;
import org.fenixedu.academic.domain.space.WrittenEvaluationSpaceOccupation;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.domain.student.Student;
import org.fenixedu.academic.domain.util.icalendar.EvaluationEventBean;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.DateFormatUtil;
import org.fenixedu.academic.util.DiaSemana;
import org.fenixedu.academic.util.EvaluationType;
import org.fenixedu.academic.util.HourMinuteSecond;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.security.Authenticate;
import org.fenixedu.bennu.core.util.CoreConfiguration;
import org.fenixedu.spaces.domain.Space;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.YearMonthDay;
abstract public class WrittenEvaluation extends WrittenEvaluation_Base {
public static final Comparator<WrittenEvaluation> COMPARATOR_BY_BEGIN_DATE = new Comparator<WrittenEvaluation>() {
@Override
public int compare(WrittenEvaluation o1, WrittenEvaluation o2) {
final int c1 = o1.getDayDateYearMonthDay().compareTo(o2.getDayDateYearMonthDay());
if (c1 != 0) {
return c1;
}
final int c2 = o1.getBeginningDateHourMinuteSecond().compareTo(o2.getBeginningDateHourMinuteSecond());
return c2 == 0 ? DomainObjectUtil.COMPARATOR_BY_ID.compare(o1, o2) : c2;
}
};
public static List<WrittenEvaluation> readWrittenEvaluations() {
List<WrittenEvaluation> result = new ArrayList<WrittenEvaluation>();
for (Evaluation evaluation : Bennu.getInstance().getEvaluationsSet()) {
if (evaluation instanceof Evaluation) {
result.add((WrittenEvaluation) evaluation);
}
}
return result;
}
protected WrittenEvaluation() {
super();
}
public String getName() {
Collection<ExecutionCourse> courses = this.getAssociatedExecutionCoursesSet();
String name = "";
int i = 0;
for (ExecutionCourse course : courses) {
if (i > 0) {
name = name + ", ";
}
name = name + " " + course.getSigla();
i++;
}
return name;
}
public String getFullName() {
Collection<ExecutionCourse> courses = this.getAssociatedExecutionCoursesSet();
String fullName = "";
int i = 0;
for (ExecutionCourse course : courses) {
if (i > 0) {
fullName = fullName + ", ";
}
fullName = fullName + " " + course.getNome();
i++;
}
return fullName;
}
public Space getCampus() {
List<Space> rooms = getAssociatedRooms();
if (rooms.size() > 0) {
return SpaceUtils.getSpaceCampus(rooms.iterator().next());
} else {
return null;
}
}
public ExecutionYear getExecutionYear() {
return this.getAssociatedExecutionCoursesSet().iterator().next().getExecutionYear();
}
public ExecutionDegree getExecutionDegree() {
for (ExecutionCourse cource : getAssociatedExecutionCoursesSet()) {
for (CurricularCourse curricularCource : cource.getAssociatedCurricularCoursesSet()) {
return curricularCource.getExecutionDegreeFor(getExecutionYear().getAcademicInterval());
}
}
return null;
}
public Boolean getIsAfterCurrentDate() {
DateTime currentDate = new DateTime();
return currentDate.isBefore(this.getBeginningDateTime());
}
public DateTime getBeginningDateTime() {
HourMinuteSecond begin = this.getBeginningDateHourMinuteSecond();
YearMonthDay yearMonthDay = this.getDayDateYearMonthDay();
return new DateTime(yearMonthDay.getYear(), yearMonthDay.getMonthOfYear(), yearMonthDay.getDayOfMonth(), begin.getHour(),
begin.getMinuteOfHour(), 0, 0);
}
public DateTime getEndDateTime() {
HourMinuteSecond end = this.getEndDateHourMinuteSecond();
YearMonthDay yearMonthDay = this.getDayDateYearMonthDay();
return new DateTime(yearMonthDay.getYear(), yearMonthDay.getMonthOfYear(), yearMonthDay.getDayOfMonth(), end.getHour(),
end.getMinuteOfHour(), 0, 0);
}
@Override
public EvaluationType getEvaluationType() {
return EvaluationType.EXAM_TYPE;
}
public Calendar getBeginning() {
if (this.getBeginningDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getBeginningDate());
return result;
}
return null;
}
public void setBeginning(Calendar calendar) {
if (calendar != null) {
this.setBeginningDate(calendar.getTime());
} else {
this.setBeginningDate(null);
}
}
public Calendar getDay() {
if (this.getDayDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getDayDate());
return result;
}
return null;
}
public void setDay(Calendar calendar) {
if (calendar != null) {
this.setDayDate(calendar.getTime());
} else {
this.setDayDate(null);
}
}
public List<Space> getAssociatedRooms() {
final List<Space> result = new ArrayList<Space>();
for (final WrittenEvaluationSpaceOccupation roomOccupation : getWrittenEvaluationSpaceOccupationsSet()) {
result.add(roomOccupation.getRoom());
}
return result;
}
protected void checkIntervalBetweenEvaluations() {
final User userView = Authenticate.getUser();
if (userView == null || !RoleType.RESOURCE_ALLOCATION_MANAGER.isMember(userView.getPerson().getUser())) {
checkIntervalBetweenEvaluationsCondition();
}
}
public void checkIntervalBetweenEvaluationsCondition() {
if (getDayDateYearMonthDay() != null && getBeginningDateHourMinuteSecond() != null) {
for (final ExecutionCourse executionCourse : getAssociatedExecutionCoursesSet()) {
for (final Evaluation evaluation : executionCourse.getAssociatedEvaluationsSet()) {
if (evaluation != this && evaluation instanceof WrittenEvaluation) {
final WrittenEvaluation writtenEvaluation = (WrittenEvaluation) evaluation;
if (isIntervalBetweenEvaluationsIsLessThan48Hours(this, writtenEvaluation)
&& hasMatchingCurricularCourseScopeOrContext(writtenEvaluation)) {
throw new DomainException("two.evaluations.cannot.occur.withing.48.hours");
}
}
}
}
}
}
private boolean hasMatchingCurricularCourseScopeOrContext(WrittenEvaluation writtenEvaluation) {
for (final CurricularCourseScope curricularCourseScope : getAssociatedCurricularCourseScopeSet()) {
if (writtenEvaluation.getAssociatedCurricularCourseScopeSet().contains(curricularCourseScope)) {
return true;
}
}
for (final Context context : getAssociatedContextsSet()) {
if (writtenEvaluation.getAssociatedContextsSet().contains(context)) {
return true;
}
}
return false;
}
private boolean isIntervalBetweenEvaluationsIsLessThan48Hours(final WrittenEvaluation writtenEvaluation1,
final WrittenEvaluation writtenEvaluation2) {
if (writtenEvaluation1.getBeginningDateTime().isBefore(writtenEvaluation2.getBeginningDateTime())) {
return !writtenEvaluation1.getBeginningDateTime().plusHours(48).isBefore(writtenEvaluation2.getBeginningDateTime());
} else {
return !writtenEvaluation2.getBeginningDateTime().plusHours(48).isBefore(writtenEvaluation1.getBeginningDateTime());
}
}
public Calendar getEnd() {
if (this.getEndDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getEndDate());
return result;
}
return null;
}
public void setEnd(Calendar calendar) {
if (calendar != null) {
this.setEndDate(calendar.getTime());
} else {
this.setEndDate(null);
}
}
public Calendar getEnrollmentBeginDay() {
if (this.getEnrollmentBeginDayDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getEnrollmentBeginDayDate());
return result;
}
return null;
}
public void setEnrollmentBeginDay(Calendar calendar) {
if (calendar != null) {
this.setEnrollmentBeginDayDate(calendar.getTime());
} else {
this.setEnrollmentBeginDayDate(null);
}
}
public Calendar getEnrollmentBeginTime() {
if (this.getEnrollmentBeginTimeDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getEnrollmentBeginTimeDate());
return result;
}
return null;
}
public void setEnrollmentBeginTime(Calendar calendar) {
if (calendar != null) {
this.setEnrollmentBeginTimeDate(calendar.getTime());
} else {
this.setEnrollmentBeginTimeDate(null);
}
}
public Calendar getEnrollmentEndDay() {
if (this.getEnrollmentEndDayDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getEnrollmentEndDayDate());
return result;
}
return null;
}
public void setEnrollmentEndDay(Calendar calendar) {
if (calendar != null) {
this.setEnrollmentEndDayDate(calendar.getTime());
} else {
this.setEnrollmentEndDayDate(null);
}
}
public Calendar getEnrollmentEndTime() {
if (this.getEnrollmentEndTimeDate() != null) {
Calendar result = Calendar.getInstance();
result.setTime(this.getEnrollmentEndTimeDate());
return result;
}
return null;
}
public void setEnrollmentEndTime(Calendar calendar) {
if (calendar != null) {
this.setEnrollmentEndTimeDate(calendar.getTime());
} else {
this.setEnrollmentEndTimeDate(null);
}
}
protected void setAttributesAndAssociateRooms(Date day, Date beginning, Date end,
List<ExecutionCourse> executionCoursesToAssociate, List<DegreeModuleScope> curricularCourseScopesToAssociate,
List<Space> rooms) {
if (rooms == null) {
rooms = new ArrayList<Space>(0);
}
checkValidHours(beginning, end);
// Associate ExecutionCourses and Context/Scopes
getAssociatedExecutionCoursesSet().addAll(executionCoursesToAssociate);
for (DegreeModuleScope degreeModuleScope : curricularCourseScopesToAssociate) {
if (degreeModuleScope instanceof DegreeModuleScopeCurricularCourseScope) {
addAssociatedCurricularCourseScope(((DegreeModuleScopeCurricularCourseScope) degreeModuleScope)
.getCurricularCourseScope());
} else if (degreeModuleScope instanceof DegreeModuleScopeContext) {
addAssociatedContexts(((DegreeModuleScopeContext) degreeModuleScope).getContext());
}
}
setDayDate(day);
setBeginningDate(beginning);
setEndDate(end);
// Associate New Rooms
List<WrittenEvaluationSpaceOccupation> newOccupations = associateNewRooms(rooms);
// Edit Existent Rooms
final Set<WrittenEvaluationSpaceOccupation> roomOccupationsToDelete = new HashSet<WrittenEvaluationSpaceOccupation>();
for (final WrittenEvaluationSpaceOccupation roomOccupation : getWrittenEvaluationSpaceOccupationsSet()) {
if (!newOccupations.contains(roomOccupation)) {
final Space room = roomOccupation.getRoom();
if (!rooms.contains(room)) {
roomOccupationsToDelete.add(roomOccupation);
} else {
roomOccupation.edit(this);
}
}
}
// Delete Rooms
for (Iterator<WrittenEvaluationSpaceOccupation> iter = roomOccupationsToDelete.iterator(); iter.hasNext();) {
WrittenEvaluationSpaceOccupation occupation = iter.next();
occupation.removeWrittenEvaluations(this);
iter.remove();
occupation.delete();
}
}
private boolean checkValidHours(Date beginning, Date end) {
if (beginning.after(end)) {
throw new DomainException("error.data.exame.invalida");
}
return true;
}
private void deleteAllRoomOccupations() {
while (!getWrittenEvaluationSpaceOccupationsSet().isEmpty()) {
WrittenEvaluationSpaceOccupation occupation = getWrittenEvaluationSpaceOccupationsSet().iterator().next();
occupation.removeWrittenEvaluations(this);
occupation.delete();
}
}
public void removeRoomOccupation(Space room) {
if (hasOccupationForRoom(room)) {
WrittenEvaluationSpaceOccupation occupation =
(WrittenEvaluationSpaceOccupation) SpaceUtils.getFirstOccurrenceOfResourceAllocationByClass(room, this);
removeWrittenEvaluationSpaceOccupations(occupation);
}
}
protected List<WrittenEvaluationSpaceOccupation> associateNewRooms(final List<Space> rooms) {
List<WrittenEvaluationSpaceOccupation> newInsertedOccupations = new ArrayList<WrittenEvaluationSpaceOccupation>();
for (final Space room : rooms) {
WrittenEvaluationSpaceOccupation spaceOccupation = associateNewRoom(room);
if (spaceOccupation != null) {
newInsertedOccupations.add(spaceOccupation);
}
}
return newInsertedOccupations;
}
protected WrittenEvaluationSpaceOccupation associateNewRoom(Space room) {
if (!hasOccupationForRoom(room)) {
WrittenEvaluationSpaceOccupation occupation =
(WrittenEvaluationSpaceOccupation) SpaceUtils.getFirstOccurrenceOfResourceAllocationByClass(room, this);
occupation = occupation == null ? new WrittenEvaluationSpaceOccupation(room) : occupation;
occupation.edit(this);
return occupation;
} else {
return null;
}
}
private boolean hasOccupationForRoom(Space room) {
for (final WrittenEvaluationSpaceOccupation roomOccupation : this.getWrittenEvaluationSpaceOccupationsSet()) {
if (roomOccupation.getRoom() == room) {
return true;
}
}
return false;
}
protected void edit(Date day, Date beginning, Date end, List<ExecutionCourse> executionCoursesToAssociate,
List<DegreeModuleScope> curricularCourseScopesToAssociate, List<Space> rooms, GradeScale gradeScale) {
setAttributesAndAssociateRooms(day, beginning, end, executionCoursesToAssociate, curricularCourseScopesToAssociate, rooms);
if (getGradeScale() != gradeScale) {
if (gradeScale != null) {
setGradeScale(gradeScale);
} else {
setGradeScale(GradeScale.TYPE20);
}
}
checkIntervalBetweenEvaluations();
}
@Override
public void delete() {
if (!getWrittenEvaluationEnrolmentsSet().isEmpty()) {
throw new DomainException("error.notAuthorizedWrittenEvaluationDelete.withStudent");
}
logRemove();
deleteAllRoomOccupations();
getAssociatedCurricularCourseScopeSet().clear();
getAssociatedContextsSet().clear();
super.delete();
}
public void editEnrolmentPeriod(Date enrolmentBeginDay, Date enrolmentEndDay, Date enrolmentBeginTime, Date enrolmentEndTime)
throws DomainException {
checkEnrolmentDates(enrolmentBeginDay, enrolmentEndDay, enrolmentBeginTime, enrolmentEndTime);
this.setEnrollmentBeginDayDate(enrolmentBeginDay);
this.setEnrollmentEndDayDate(enrolmentEndDay);
this.setEnrollmentBeginTimeDate(enrolmentBeginTime);
this.setEnrollmentEndTimeDate(enrolmentEndTime);
for (ExecutionCourse ec : getAssociatedExecutionCoursesSet()) {
EvaluationManagementLog.createLog(ec, Bundle.MESSAGING, "log.executionCourse.evaluation.generic.edited.enrolment",
getPresentationName(), ec.getName(), ec.getDegreePresentationString());
}
}
private void checkEnrolmentDates(final Date enrolmentBeginDay, final Date enrolmentEndDay, final Date enrolmentBeginTime,
final Date enrolmentEndTime) throws DomainException {
final DateTime enrolmentBeginDate = createDate(enrolmentBeginDay, enrolmentBeginTime);
final DateTime enrolmentEndDate = createDate(enrolmentEndDay, enrolmentEndTime);
if (getEnrollmentBeginDayDate() == null && enrolmentBeginDate.isBeforeNow()) {
throw new DomainException("error.beginDate.sooner.today");
}
if (enrolmentEndDate.isBefore(enrolmentBeginDate)) {
throw new DomainException("error.endDate.sooner.beginDate");
}
if (getBeginningDateTime().isBefore(enrolmentEndDate)) {
throw new DomainException("error.examDate.sooner.endDate");
}
}
private DateTime createDate(Date dateDay, Date dateTime) {
final Calendar day = Calendar.getInstance();
day.setTime(dateDay);
final Calendar time = Calendar.getInstance();
time.setTime(dateTime);
return new DateTime(day.get(Calendar.YEAR), day.get(Calendar.MONTH) + 1, day.get(Calendar.DAY_OF_MONTH),
time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE), 0, 0);
}
public void enrolStudent(Registration registration) {
for (WrittenEvaluationEnrolment writtenEvaluationEnrolment : registration.getWrittenEvaluationEnrolmentsSet()) {
if (writtenEvaluationEnrolment.getWrittenEvaluation() == this) {
throw new DomainException("error.alreadyEnrolledError");
}
}
new WrittenEvaluationEnrolment(this, registration);
}
public void unEnrolStudent(Registration registration) {
if (!this.validUnEnrollment()) {
throw new DomainException("error.notAuthorizedUnEnrollment");
}
WrittenEvaluationEnrolment writtenEvaluationEnrolmentToDelete = this.getWrittenEvaluationEnrolmentFor(registration);
if (writtenEvaluationEnrolmentToDelete == null) {
throw new DomainException("error.studentNotEnroled");
}
writtenEvaluationEnrolmentToDelete.delete();
}
private boolean validUnEnrollment() {
if (this.getEnrollmentEndDay() != null && this.getEnrollmentEndTime() != null) {
DateTime enrolmentEnd = createDate(this.getEnrollmentEndDayDate(), this.getEnrollmentEndTimeDate());
if (enrolmentEnd.isAfterNow()) {
return true;
}
}
return false;
}
public void distributeStudentsByRooms(List<Registration> studentsToDistribute, List<Space> selectedRooms) {
this.checkIfCanDistributeStudentsByRooms();
this.checkRoomsCapacityForStudents(selectedRooms, studentsToDistribute.size());
for (final Space room : selectedRooms) {
Integer examCapacity = room.<Integer> getMetadata("examCapacity").orElse(0);
for (int numberOfStudentsInserted = 0; numberOfStudentsInserted < examCapacity && !studentsToDistribute.isEmpty(); numberOfStudentsInserted++) {
final Registration registration = getRandomStudentFromList(studentsToDistribute);
final WrittenEvaluationEnrolment writtenEvaluationEnrolment = this.getWrittenEvaluationEnrolmentFor(registration);
if (writtenEvaluationEnrolment == null) {
new WrittenEvaluationEnrolment(this, registration, room);
} else {
writtenEvaluationEnrolment.setRoom(room);
}
}
if (studentsToDistribute.isEmpty()) {
break;
}
}
for (ExecutionCourse ec : getAssociatedExecutionCoursesSet()) {
EvaluationManagementLog.createLog(ec, Bundle.MESSAGING,
"log.executionCourse.evaluation.generic.edited.rooms.distributed", getPresentationName(), ec.getName(),
ec.getDegreePresentationString());
}
}
public void checkIfCanDistributeStudentsByRooms() {
if (this.getWrittenEvaluationSpaceOccupationsSet().isEmpty()) {
throw new DomainException("error.no.roms.associated");
}
final Date todayDate = Calendar.getInstance().getTime();
final Date evaluationDateAndTime;
try {
evaluationDateAndTime =
DateFormatUtil.parse("yyyy/MM/dd HH:mm", DateFormatUtil.format("yyyy/MM/dd ", this.getDayDate())
+ DateFormatUtil.format("HH:mm", this.getBeginningDate()));
} catch (ParseException e) {
// This should never happen, the string where obtained from other
// dates.
throw new Error(e);
}
DateTime enrolmentEndDate = null;
// This can happen if the Enrolment OccupationPeriod for Evaluation
// wasn't defined
if (this.getEnrollmentEndDayDate() != null && this.getEnrollmentEndTimeDate() != null) {
enrolmentEndDate = createDate(this.getEnrollmentEndDayDate(), this.getEnrollmentEndTimeDate());
}
if (DateFormatUtil.isBefore("yyyy/MM/dd HH:mm", evaluationDateAndTime, todayDate)
|| (enrolmentEndDate != null && enrolmentEndDate.isAfterNow())) {
throw new DomainException("error.out.of.period.enrollment.period");
}
}
private void checkRoomsCapacityForStudents(final List<Space> selectedRooms, int studentsToDistributeSize) {
int totalCapacity = selectedRooms.stream().mapToInt(room -> room.<Integer> getMetadata("examCapacity").orElse(0)).sum();
if (studentsToDistributeSize > totalCapacity) {
throw new DomainException("error.not.enough.room.space");
}
}
private Registration getRandomStudentFromList(List<Registration> studentsToDistribute) {
final Random randomizer = new Random();
int pos = randomizer.nextInt(Math.abs(randomizer.nextInt()));
return studentsToDistribute.remove(pos % studentsToDistribute.size());
}
public WrittenEvaluationEnrolment getWrittenEvaluationEnrolmentFor(final Registration registration) {
for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : registration.getWrittenEvaluationEnrolmentsSet()) {
if (writtenEvaluationEnrolment.getWrittenEvaluation() == this) {
return writtenEvaluationEnrolment;
}
}
return null;
}
public WrittenEvaluationEnrolment getWrittenEvaluationEnrolmentFor(final Student student) {
for (Registration registration : student.getActiveRegistrations()) {
final WrittenEvaluationEnrolment evaluationEnrolment = getWrittenEvaluationEnrolmentFor(registration);
if (evaluationEnrolment != null) {
return evaluationEnrolment;
}
}
return null;
}
public boolean isInEnrolmentPeriod() {
if (this.getEnrollmentBeginDayDate() == null || this.getEnrollmentBeginTimeDate() == null
|| this.getEnrollmentEndDayDate() == null || this.getEnrollmentEndTimeDate() == null) {
throw new DomainException("error.enrolmentPeriodNotDefined");
}
final DateTime enrolmentBeginDate = createDate(this.getEnrollmentBeginDayDate(), this.getEnrollmentBeginTimeDate());
final DateTime enrolmentEndDate = createDate(this.getEnrollmentEndDayDate(), this.getEnrollmentEndTimeDate());
return enrolmentBeginDate.isBeforeNow() && enrolmentEndDate.isAfterNow();
}
public boolean getIsInEnrolmentPeriod() {
try { // Used for sorting purpose
return isInEnrolmentPeriod();
} catch (final DomainException e) {
return false;
}
}
public Integer getCountStudentsEnroledAttendingExecutionCourses() {
int i = 0;
for (final ExecutionCourse executionCourse : getAssociatedExecutionCoursesSet()) {
for (final Attends attends : executionCourse.getAttendsSet()) {
if (attends.getEnrolment() != null) {
i++;
}
}
}
return i;
}
public Integer getCountNumberReservedSeats() {
return getWrittenEvaluationSpaceOccupationsSet().stream()
.mapToInt(occupation -> occupation.getRoom().<Integer> getMetadata("examCapacity").orElse(0)).sum();
}
public Integer getCountVacancies() {
final int writtenEvaluationEnrolmentsCount = getWrittenEvaluationEnrolmentsSet().size();
final int countNumberReservedSeats = getCountNumberReservedSeats().intValue();
return Integer.valueOf(countNumberReservedSeats - writtenEvaluationEnrolmentsCount);
}
public List<DegreeModuleScope> getDegreeModuleScopes() {
return DegreeModuleScope.getDegreeModuleScopes(this);
}
public String getDegreesAsString() {
Set<Degree> degrees = new HashSet<Degree>();
for (ExecutionCourse course : this.getAssociatedExecutionCoursesSet()) {
degrees.addAll(course.getDegreesSortedByDegreeName());
}
String degreesAsString = "";
int i = 0;
for (Degree degree : degrees) {
if (i > 0) {
degreesAsString += ", ";
}
degreesAsString += degree.getSigla();
i++;
}
return degreesAsString;
}
public String getAssociatedRoomsAsString() {
String rooms = "";
for (Space room : getAssociatedRooms()) {
rooms += room.getName() + "\n";
}
return rooms;
}
public boolean hasScopeFor(final Integer year, final Integer semester, DegreeCurricularPlan degreeCurricularPlan) {
for (final DegreeModuleScope degreeModuleScope : getDegreeModuleScopes()) {
if (degreeModuleScope.getCurricularYear().equals(year) && degreeModuleScope.getCurricularSemester().equals(semester)
&& degreeModuleScope.getCurricularCourse().getDegreeCurricularPlan().equals(degreeCurricularPlan)) {
return true;
}
}
return false;
}
public boolean hasScopeOrContextFor(List<Integer> curricularYears, DegreeCurricularPlan degreeCurricularPlan) {
if (curricularYears != null && degreeCurricularPlan != null) {
for (final DegreeModuleScope scope : getDegreeModuleScopes()) {
if (curricularYears.contains(scope.getCurricularYear())
&& degreeCurricularPlan.equals(scope.getCurricularCourse().getDegreeCurricularPlan())) {
return true;
}
}
}
return false;
}
public DiaSemana getDayOfWeek() {
return new DiaSemana(DiaSemana.getDiaSemana(getDayDateYearMonthDay()));
}
@jvstm.cps.ConsistencyPredicate
protected boolean checkRequiredParameters() {
HourMinuteSecond beginTime = getBeginningDateHourMinuteSecond();
HourMinuteSecond endTime = getEndDateHourMinuteSecond();
return getDayDateYearMonthDay() != null && beginTime != null && endTime != null && endTime.isAfter(beginTime);
}
public boolean isExam() {
return false;
}
public boolean contains(final CurricularCourse curricularCourse) {
for (final DegreeModuleScope each : getDegreeModuleScopes()) {
if (each.getCurricularCourse() == curricularCourse) {
return true;
}
}
return false;
}
public Set<DegreeModuleScope> getDegreeModuleScopesFor(CurricularCourse curricularCourse) {
final Set<DegreeModuleScope> result = new HashSet<DegreeModuleScope>();
for (final DegreeModuleScope each : getDegreeModuleScopes()) {
if (each.getCurricularCourse() == curricularCourse) {
result.add(each);
}
}
return result;
}
public abstract boolean canBeAssociatedToRoom(Space room);
// couldn't find a smarter way to conver ymdhms to DateTiem
private DateTime convertTimes(YearMonthDay yearMonthDay, HourMinuteSecond hourMinuteSecond) {
return new DateTime(yearMonthDay.getYear(), yearMonthDay.getMonthOfYear(), yearMonthDay.getDayOfMonth(),
hourMinuteSecond.getHour(), hourMinuteSecond.getMinuteOfHour(), hourMinuteSecond.getSecondOfMinute(), 0);
}
protected List<EvaluationEventBean> getAllEvents(String description, Registration registration) {
List<EvaluationEventBean> result = new ArrayList<EvaluationEventBean>();
String url = CoreConfiguration.getConfiguration().applicationUrl();
Set<ExecutionCourse> executionCourses = new HashSet<ExecutionCourse>();
executionCourses.addAll(this.getAttendingExecutionCoursesFor(registration));
if (this.getEnrollmentBeginDayDateYearMonthDay() != null) {
DateTime enrollmentBegin =
convertTimes(this.getEnrollmentBeginDayDateYearMonthDay(), this.getEnrollmentBeginTimeDateHourMinuteSecond());
DateTime enrollmentEnd =
convertTimes(this.getEnrollmentEndDayDateYearMonthDay(), this.getEnrollmentEndTimeDateHourMinuteSecond());
result.add(new EvaluationEventBean("Inicio das inscrições para " + description, enrollmentBegin, enrollmentBegin
.plusHours(1), false, null, url + "/login", null, executionCourses));
result.add(new EvaluationEventBean("Fim das inscrições para " + description, enrollmentEnd.minusHours(1),
enrollmentEnd, false, null, url + "/login", null, executionCourses));
}
Set<Space> rooms = new HashSet<>();
if (registration.getRoomFor(this) != null) {
rooms.add(registration.getRoomFor(this));
} else {
for (WrittenEvaluationSpaceOccupation weSpaceOcupation : this.getWrittenEvaluationSpaceOccupationsSet()) {
rooms.add(weSpaceOcupation.getRoom());
}
}
WrittenEvaluationEnrolment writtenEvaluationEnrolment = getWrittenEvaluationEnrolmentFor(registration);
Space assignedRoom = null;
if (writtenEvaluationEnrolment != null) {
assignedRoom = writtenEvaluationEnrolment.getRoom();
}
result.add(new EvaluationEventBean(description, this.getBeginningDateTime(), this.getEndDateTime(), false, assignedRoom,
rooms, executionCourses.iterator().next().getSiteUrl(), null, executionCourses));
return result;
}
public Set<Person> getTeachers() {
Set<Person> persons = new HashSet<Person>();
for (ExecutionCourse course : getAssociatedExecutionCoursesSet()) {
for (Professorship professorship : course.getProfessorshipsSet()) {
persons.add(professorship.getPerson());
}
}
return persons;
}
public abstract List<EvaluationEventBean> getAllEvents(Registration registration);
public String getAssociatedRoomsAsStringList() {
StringBuilder builder = new StringBuilder("(");
Iterator<Space> iterator = getAssociatedRooms().iterator();
while (iterator.hasNext()) {
builder.append(iterator.next().getName());
if (iterator.hasNext()) {
builder.append(", ");
}
}
builder.append(")");
return builder.toString();
}
/**
*
* @deprecated Use getInterval instead.
*/
@Deprecated
public Interval getDurationInterval() {
return new Interval(getBeginningDateTime(), getEndDateTime());
}
@Deprecated
public java.util.Date getBeginningDate() {
org.fenixedu.academic.util.HourMinuteSecond hms = getBeginningDateHourMinuteSecond();
return (hms == null) ? null : new java.util.Date(0, 0, 1, hms.getHour(), hms.getMinuteOfHour(), hms.getSecondOfMinute());
}
@Deprecated
public void setBeginningDate(java.util.Date date) {
if (date == null) {
setBeginningDateHourMinuteSecond(null);
} else {
setBeginningDateHourMinuteSecond(org.fenixedu.academic.util.HourMinuteSecond.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getDayDate() {
org.joda.time.YearMonthDay ymd = getDayDateYearMonthDay();
return (ymd == null) ? null : new java.util.Date(ymd.getYear() - 1900, ymd.getMonthOfYear() - 1, ymd.getDayOfMonth());
}
@Deprecated
public void setDayDate(java.util.Date date) {
if (date == null) {
setDayDateYearMonthDay(null);
} else {
setDayDateYearMonthDay(org.joda.time.YearMonthDay.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getEndDate() {
org.fenixedu.academic.util.HourMinuteSecond hms = getEndDateHourMinuteSecond();
return (hms == null) ? null : new java.util.Date(0, 0, 1, hms.getHour(), hms.getMinuteOfHour(), hms.getSecondOfMinute());
}
@Deprecated
public void setEndDate(java.util.Date date) {
if (date == null) {
setEndDateHourMinuteSecond(null);
} else {
setEndDateHourMinuteSecond(org.fenixedu.academic.util.HourMinuteSecond.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getEnrollmentBeginDayDate() {
org.joda.time.YearMonthDay ymd = getEnrollmentBeginDayDateYearMonthDay();
return (ymd == null) ? null : new java.util.Date(ymd.getYear() - 1900, ymd.getMonthOfYear() - 1, ymd.getDayOfMonth());
}
@Deprecated
public void setEnrollmentBeginDayDate(java.util.Date date) {
if (date == null) {
setEnrollmentBeginDayDateYearMonthDay(null);
} else {
setEnrollmentBeginDayDateYearMonthDay(org.joda.time.YearMonthDay.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getEnrollmentBeginTimeDate() {
org.fenixedu.academic.util.HourMinuteSecond hms = getEnrollmentBeginTimeDateHourMinuteSecond();
return (hms == null) ? null : new java.util.Date(0, 0, 1, hms.getHour(), hms.getMinuteOfHour(), hms.getSecondOfMinute());
}
@Deprecated
public void setEnrollmentBeginTimeDate(java.util.Date date) {
if (date == null) {
setEnrollmentBeginTimeDateHourMinuteSecond(null);
} else {
setEnrollmentBeginTimeDateHourMinuteSecond(org.fenixedu.academic.util.HourMinuteSecond.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getEnrollmentEndDayDate() {
org.joda.time.YearMonthDay ymd = getEnrollmentEndDayDateYearMonthDay();
return (ymd == null) ? null : new java.util.Date(ymd.getYear() - 1900, ymd.getMonthOfYear() - 1, ymd.getDayOfMonth());
}
@Deprecated
public void setEnrollmentEndDayDate(java.util.Date date) {
if (date == null) {
setEnrollmentEndDayDateYearMonthDay(null);
} else {
setEnrollmentEndDayDateYearMonthDay(org.joda.time.YearMonthDay.fromDateFields(date));
}
}
@Deprecated
public java.util.Date getEnrollmentEndTimeDate() {
org.fenixedu.academic.util.HourMinuteSecond hms = getEnrollmentEndTimeDateHourMinuteSecond();
return (hms == null) ? null : new java.util.Date(0, 0, 1, hms.getHour(), hms.getMinuteOfHour(), hms.getSecondOfMinute());
}
@Deprecated
public void setEnrollmentEndTimeDate(java.util.Date date) {
if (date == null) {
setEnrollmentEndTimeDateHourMinuteSecond(null);
} else {
setEnrollmentEndTimeDateHourMinuteSecond(org.fenixedu.academic.util.HourMinuteSecond.fromDateFields(date));
}
}
public DateTime getEnrolmentPeriodStart() {
final YearMonthDay yearMonthDay = getEnrollmentBeginDayDateYearMonthDay();
final HourMinuteSecond hourMinuteSecond = getEnrollmentBeginTimeDateHourMinuteSecond();
return toDateTime(yearMonthDay, hourMinuteSecond);
}
public DateTime getEnrolmentPeriodEnd() {
final YearMonthDay yearMonthDay = getEnrollmentEndDayDateYearMonthDay();
final HourMinuteSecond hourMinuteSecond = getEnrollmentEndTimeDateHourMinuteSecond();
return toDateTime(yearMonthDay, hourMinuteSecond);
}
private DateTime toDateTime(final YearMonthDay yearMonthDay, final HourMinuteSecond hourMinuteSecond) {
if (yearMonthDay == null || hourMinuteSecond == null) {
return null;
}
return new DateTime(yearMonthDay.getYear(), yearMonthDay.getMonthOfYear(), yearMonthDay.getDayOfMonth(),
hourMinuteSecond.getHour(), hourMinuteSecond.getMinuteOfHour(), hourMinuteSecond.getSecondOfMinute(), 0);
}
public Interval getInterval() {
return new Interval(getBeginningDateTime(), getEndDateTime());
}
@Override
public Date getEvaluationDate() {
return getDayDate();
}
}