/** * 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; import pt.ist.fenixframework.Atomic; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Formatter; import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.apache.commons.collections.comparators.ComparatorChain; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.FenixEduAcademicConfiguration; import org.fenixedu.academic.domain.Attends; import org.fenixedu.academic.domain.CurricularCourse; import org.fenixedu.academic.domain.Degree; import org.fenixedu.academic.domain.DegreeCurricularPlan; import org.fenixedu.academic.domain.DegreeCurricularPlanEquivalencePlan; import org.fenixedu.academic.domain.DomainObjectUtil; import org.fenixedu.academic.domain.Enrolment; import org.fenixedu.academic.domain.Evaluation; import org.fenixedu.academic.domain.Exam; import org.fenixedu.academic.domain.ExecutionCourse; import org.fenixedu.academic.domain.ExecutionDegree; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Grade; import org.fenixedu.academic.domain.GratuitySituation; import org.fenixedu.academic.domain.GratuityValues; import org.fenixedu.academic.domain.GuideEntry; import org.fenixedu.academic.domain.IEnrolment; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.Project; import org.fenixedu.academic.domain.SchoolClass; import org.fenixedu.academic.domain.SchoolLevelType; import org.fenixedu.academic.domain.Shift; import org.fenixedu.academic.domain.ShiftType; import org.fenixedu.academic.domain.StudentCurricularPlan; import org.fenixedu.academic.domain.WrittenEvaluation; import org.fenixedu.academic.domain.WrittenEvaluationEnrolment; import org.fenixedu.academic.domain.WrittenTest; import org.fenixedu.academic.domain.accessControl.academicAdministration.AcademicAccessRule; import org.fenixedu.academic.domain.accessControl.academicAdministration.AcademicOperationType; import org.fenixedu.academic.domain.accounting.events.AdministrativeOfficeFeeAndInsuranceEvent; import org.fenixedu.academic.domain.accounting.events.EnrolmentOutOfPeriodEvent; import org.fenixedu.academic.domain.accounting.events.gratuity.GratuityEvent; import org.fenixedu.academic.domain.accounting.events.insurance.InsuranceEvent; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOffice; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOfficeType; import org.fenixedu.academic.domain.candidacy.IngressionType; import org.fenixedu.academic.domain.candidacy.PersonalInformationBean; import org.fenixedu.academic.domain.candidacy.StudentCandidacy; import org.fenixedu.academic.domain.degree.DegreeType; import org.fenixedu.academic.domain.degreeStructure.CycleCourseGroup; import org.fenixedu.academic.domain.degreeStructure.CycleType; import org.fenixedu.academic.domain.degreeStructure.ProgramConclusion; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.gratuity.ReimbursementGuideState; import org.fenixedu.academic.domain.log.CurriculumLineLog; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.reimbursementGuide.ReimbursementGuideEntry; import org.fenixedu.academic.domain.serviceRequests.AcademicServiceRequest; import org.fenixedu.academic.domain.serviceRequests.AcademicServiceRequestSituationType; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DiplomaRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DiplomaSupplementRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentRequestType; import org.fenixedu.academic.domain.serviceRequests.documentRequests.PastDiplomaRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.RegistryDiplomaRequest; import org.fenixedu.academic.domain.student.curriculum.ConclusionProcess; import org.fenixedu.academic.domain.student.curriculum.Curriculum; import org.fenixedu.academic.domain.student.curriculum.ICurriculum; import org.fenixedu.academic.domain.student.registrationStates.RegistrationState; import org.fenixedu.academic.domain.student.registrationStates.RegistrationStateType; import org.fenixedu.academic.domain.studentCurricularPlan.Specialization; import org.fenixedu.academic.domain.studentCurriculum.CurriculumGroup; import org.fenixedu.academic.domain.studentCurriculum.CurriculumLine; import org.fenixedu.academic.domain.studentCurriculum.CurriculumModule; import org.fenixedu.academic.domain.studentCurriculum.CycleCurriculumGroup; import org.fenixedu.academic.domain.studentCurriculum.Dismissal; import org.fenixedu.academic.domain.studentCurriculum.ExternalEnrolment; import org.fenixedu.academic.domain.studentCurriculum.StandaloneCurriculumGroup; import org.fenixedu.academic.domain.thesis.Thesis; import org.fenixedu.academic.domain.transactions.InsuranceTransaction; import org.fenixedu.academic.predicate.AccessControl; import org.fenixedu.academic.predicate.RegistrationPredicates; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.PeriodState; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.bennu.core.security.Authenticate; import org.fenixedu.commons.i18n.I18N; import org.fenixedu.spaces.domain.Space; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.joda.time.ReadableInstant; import org.joda.time.YearMonthDay; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Strings; import static org.fenixedu.academic.predicate.AccessControl.check; public class Registration extends Registration_Base { private static final Logger logger = LoggerFactory.getLogger(Registration.class); @Deprecated static private final java.util.function.Predicate<DegreeType> DEGREE_TYPES_TO_ENROL_BY_STUDENT = DegreeType.oneOf( DegreeType::isBolonhaDegree, DegreeType::isIntegratedMasterDegree, DegreeType::isBolonhaMasterDegree, DegreeType::isAdvancedSpecializationDiploma); static final public Comparator<Registration> NUMBER_COMPARATOR = new Comparator<Registration>() { @Override public int compare(Registration o1, Registration o2) { return o1.getNumber().compareTo(o2.getNumber()); } }; static final public Comparator<Registration> COMPARATOR_BY_START_DATE = new Comparator<Registration>() { @Override public int compare(Registration o1, Registration o2) { final int comparationResult = o1.getStartDate().compareTo(o2.getStartDate()); return comparationResult == 0 ? o1.getExternalId().compareTo(o2.getExternalId()) : comparationResult; } }; static public final ComparatorChain COMPARATOR_BY_NUMBER_AND_ID = new ComparatorChain(); static { COMPARATOR_BY_NUMBER_AND_ID.addComparator(NUMBER_COMPARATOR); COMPARATOR_BY_NUMBER_AND_ID.addComparator(DomainObjectUtil.COMPARATOR_BY_ID); } private Registration() { super(); setRootDomainObject(Bennu.getInstance()); setRegistrationProtocol(RegistrationProtocol.getDefault()); } private Registration(final Person person, final DateTime start, final Integer registrationNumber, final Degree degree) { this(); setStudent(person.getStudent() != null ? person.getStudent() : new Student(person, registrationNumber)); setNumber(registrationNumber == null ? getStudent().getNumber() : registrationNumber); setStartDate(start.toYearMonthDay()); setDegree(degree); RegistrationState.createRegistrationState(this, AccessControl.getPerson(), start, RegistrationStateType.REGISTERED); } public Registration(final Person person, final StudentCandidacy studentCandidacy) { this(person, null, RegistrationProtocol.getDefault(), null, studentCandidacy); } public Registration(final Person person, final Integer studentNumber, final Degree degree) { this(person, studentNumber, RegistrationProtocol.getDefault(), null, degree); } public Registration(final Person person, final DegreeCurricularPlan degreeCurricularPlan) { this(person, degreeCurricularPlan, RegistrationProtocol.getDefault(), null, null); } public Registration(final Person person, final DegreeCurricularPlan degreeCurricularPlan, final CycleType cycleType) { this(person, degreeCurricularPlan, RegistrationProtocol.getDefault(), cycleType, null); } public Registration(final Person person, final DegreeCurricularPlan degreeCurricularPlan, final RegistrationProtocol protocol, final CycleType cycleType, final ExecutionYear executionYear) { this(person, null, protocol, executionYear, degreeCurricularPlan != null ? degreeCurricularPlan.getDegree() : null); createStudentCurricularPlan(degreeCurricularPlan, executionYear, cycleType); } public static Registration createRegistrationWithCustomStudentNumber(final Person person, final DegreeCurricularPlan degreeCurricularPlan, final StudentCandidacy studentCandidacy, final RegistrationProtocol protocol, final CycleType cycleType, final ExecutionYear executionYear, Integer studentNumber) { final Degree degree = degreeCurricularPlan == null ? null : degreeCurricularPlan.getDegree(); Registration registration = new Registration(person, calculateStartDate(executionYear), studentNumber, degree); registration.setRegistrationYear(executionYear == null ? ExecutionYear.readCurrentExecutionYear() : executionYear); registration.setRequestedChangeDegree(false); registration.setRequestedChangeBranch(false); registration.setRegistrationProtocol(protocol == null ? RegistrationProtocol.getDefault() : protocol); registration.createStudentCurricularPlan(degreeCurricularPlan, executionYear, cycleType); registration.setStudentCandidacyInformation(studentCandidacy); return registration; } public Registration(final Person person, final DegreeCurricularPlan degreeCurricularPlan, final StudentCandidacy candidacy, final RegistrationProtocol protocol, final CycleType cycleType) { this(person, degreeCurricularPlan, candidacy, protocol, cycleType, null); } public Registration(final Person person, final DegreeCurricularPlan degreeCurricularPlan, final StudentCandidacy studentCandidacy, final RegistrationProtocol protocol, final CycleType cycleType, final ExecutionYear executionYear) { this(person, degreeCurricularPlan, protocol, cycleType, executionYear); setStudentCandidacyInformation(studentCandidacy); EventGenerator.generateNecessaryEvents(getLastStudentCurricularPlan(), person, executionYear); } private Registration(final Person person, final Integer registrationNumber, final RegistrationProtocol protocol, final ExecutionYear executionYear, final StudentCandidacy studentCandidacy) { this(person, registrationNumber, protocol, executionYear, getDegreeFromCandidacy(studentCandidacy)); setStudentCandidacyInformation(studentCandidacy); } private static Degree getDegreeFromCandidacy(StudentCandidacy studentCandidacy) { return studentCandidacy == null ? null : studentCandidacy.getExecutionDegree().getDegree(); } private Registration(final Person person, final Integer registrationNumber, final RegistrationProtocol protocol, final ExecutionYear executionYear, final Degree degree) { this(person, calculateStartDate(executionYear), registrationNumber, degree); setRegistrationYear(executionYear == null ? ExecutionYear.readCurrentExecutionYear() : executionYear); setRequestedChangeDegree(false); setRequestedChangeBranch(false); setRegistrationProtocol(protocol == null ? RegistrationProtocol.getDefault() : protocol); } private void setStudentCandidacyInformation(final StudentCandidacy studentCandidacy) { setStudentCandidacy(studentCandidacy); if (studentCandidacy != null) { super.setEntryPhase(studentCandidacy.getEntryPhase()); super.setIngressionType(studentCandidacy.getIngressionType()); if (studentCandidacy.getIngressionType() != null && studentCandidacy.getIngressionType().isReIngression()) { final Degree sourceDegree = studentCandidacy.getDegreeCurricularPlan().getEquivalencePlan().getSourceDegree(); Registration registration = getStudent().readRegistrationByDegree(sourceDegree); if (registration == null) { final Collection<Registration> registrations = getStudent().getRegistrationsMatchingDegreeType(DegreeType::isPreBolonhaDegree); registrations.remove(this); registration = registrations.size() == 1 ? registrations.iterator().next() : null; } setSourceRegistration(registration); } } } public StudentCurricularPlan createStudentCurricularPlan(final DegreeCurricularPlan degreeCurricularPlan, final ExecutionYear executionYear) { return createStudentCurricularPlan(degreeCurricularPlan, executionYear, (CycleType) null); } private StudentCurricularPlan createStudentCurricularPlan(final DegreeCurricularPlan degreeCurricularPlan, final ExecutionYear executionYear, final CycleType cycleType) { final YearMonthDay startDay; final ExecutionSemester executionSemester; if (executionYear == null || executionYear.isCurrent()) { startDay = new YearMonthDay(); executionSemester = ExecutionSemester.readActualExecutionSemester(); } else { startDay = executionYear.getBeginDateYearMonthDay(); executionSemester = executionYear.getFirstExecutionPeriod(); } return StudentCurricularPlan.createBolonhaStudentCurricularPlan(this, degreeCurricularPlan, startDay, executionSemester, cycleType); } private static DateTime calculateStartDate(final ExecutionYear executionYear) { DateTime now = new DateTime(); return executionYear == null || (executionYear.isCurrent() && executionYear.getAcademicInterval().contains(now)) ? now : executionYear .getBeginDateYearMonthDay().toDateTimeAtMidnight(); } @Override final public void setNumber(Integer number) { super.setNumber(number); if (number == null && getRegistrationNumber() != null) { getRegistrationNumber().delete(); } else if (number != null) { if (getRegistrationNumber() != null) { getRegistrationNumber().setNumber(number); } else { new RegistrationNumber(this); } } } @Deprecated public void delete() { checkRulesToDelete(); for (; !getRegistrationStatesSet().isEmpty(); getRegistrationStatesSet().iterator().next().delete()) { ; } for (; !getStudentCurricularPlansSet().isEmpty(); getStudentCurricularPlansSet().iterator().next().delete()) { ; } for (; !getAssociatedAttendsSet().isEmpty(); getAssociatedAttendsSet().iterator().next().delete()) { ; } for (; !getExternalEnrolmentsSet().isEmpty(); getExternalEnrolmentsSet().iterator().next().delete()) { ; } for (; !getRegistrationDataByExecutionYearSet().isEmpty(); getRegistrationDataByExecutionYearSet().iterator().next() .delete()) { ; } for (; !getAcademicServiceRequestsSet().isEmpty(); getAcademicServiceRequestsSet().iterator().next().delete()) { ; } for (; !getRegistrationRegimesSet().isEmpty(); getRegistrationRegimesSet().iterator().next().delete()) { ; } for (; !getCurriculumLineLogsSet().isEmpty(); getCurriculumLineLogsSet().iterator().next().delete()) { ; } for (; !getRegistrationStateLogsSet().isEmpty(); getRegistrationStateLogsSet().iterator().next().delete()) { ; } if (getRegistrationNumber() != null) { getRegistrationNumber().delete(); } if (getExternalRegistrationData() != null) { getExternalRegistrationData().delete(); } if (getSenior() != null) { getSenior().delete(); } if (getStudentCandidacy() != null) { getStudentCandidacy().delete(); } setIndividualCandidacy(null); setSourceRegistration(null); setRegistrationYear(null); setDegree(null); setStudent(null); setRegistrationProtocol(null); setRootDomainObject(null); getDestinyRegistrationsSet().clear(); getShiftsSet().clear(); super.deleteDomainObject(); } private void checkRulesToDelete() { if (getDfaRegistrationEventsSet().size() > 0) { throw new DomainException("error.student.Registration.cannot.delete.because.is.associated.to.dfa.registration.event"); } } public StudentCurricularPlan getActiveStudentCurricularPlan() { return isActive() ? getLastStudentCurricularPlan() : null; } public StudentCurricularPlan getLastStudentCurricularPlan() { final Set<StudentCurricularPlan> studentCurricularPlans = getStudentCurricularPlansSet(); if (studentCurricularPlans.isEmpty()) { return null; } return Collections.max(studentCurricularPlans, StudentCurricularPlan.STUDENT_CURRICULAR_PLAN_COMPARATOR_BY_START_DATE); } public StudentCurricularPlan getFirstStudentCurricularPlan() { return !getStudentCurricularPlansSet().isEmpty() ? (StudentCurricularPlan) Collections.min( getStudentCurricularPlansSet(), StudentCurricularPlan.STUDENT_CURRICULAR_PLAN_COMPARATOR_BY_START_DATE) : null; } public List<StudentCurricularPlan> getSortedStudentCurricularPlans() { final ArrayList<StudentCurricularPlan> sortedStudentCurricularPlans = new ArrayList<StudentCurricularPlan>(super.getStudentCurricularPlansSet()); Collections.sort(sortedStudentCurricularPlans, StudentCurricularPlan.STUDENT_CURRICULAR_PLAN_COMPARATOR_BY_START_DATE); return sortedStudentCurricularPlans; } final public List<StudentCurricularPlan> getStudentCurricularPlansExceptPast() { List<StudentCurricularPlan> result = new ArrayList<StudentCurricularPlan>(); for (StudentCurricularPlan studentCurricularPlan : super.getStudentCurricularPlansSet()) { if (!studentCurricularPlan.isPast()) { result.add(studentCurricularPlan); } } return result; } public boolean attends(final ExecutionCourse executionCourse) { for (final Attends attends : getAssociatedAttendsSet()) { if (attends.isFor(executionCourse)) { return true; } } return false; } final public List<WrittenEvaluation> getWrittenEvaluations(final ExecutionSemester executionSemester) { final List<WrittenEvaluation> result = new ArrayList<WrittenEvaluation>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.isFor(executionSemester)) { for (final Evaluation evaluation : attend.getExecutionCourse().getAssociatedEvaluationsSet()) { if (evaluation instanceof WrittenEvaluation && !result.contains(evaluation)) { result.add((WrittenEvaluation) evaluation); } } } } return result; } final public List<Exam> getEnroledExams(final ExecutionSemester executionSemester) { final List<Exam> result = new ArrayList<Exam>(); for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : this.getWrittenEvaluationEnrolmentsSet()) { if (writtenEvaluationEnrolment.getWrittenEvaluation() instanceof Exam && writtenEvaluationEnrolment.isForExecutionPeriod(executionSemester)) { result.add((Exam) writtenEvaluationEnrolment.getWrittenEvaluation()); } } return result; } final public List<Exam> getUnenroledExams(final ExecutionSemester executionSemester) { final List<Exam> result = new ArrayList<Exam>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.isFor(executionSemester)) { for (final Evaluation evaluation : attend.getExecutionCourse().getAssociatedEvaluationsSet()) { if (evaluation instanceof Exam && !this.isEnroledIn(evaluation)) { result.add((Exam) evaluation); } } } } return result; } final public List<WrittenTest> getEnroledWrittenTests(final ExecutionSemester executionSemester) { final List<WrittenTest> result = new ArrayList<WrittenTest>(); for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : this.getWrittenEvaluationEnrolmentsSet()) { if (writtenEvaluationEnrolment.getWrittenEvaluation() instanceof WrittenTest && writtenEvaluationEnrolment.isForExecutionPeriod(executionSemester)) { result.add((WrittenTest) writtenEvaluationEnrolment.getWrittenEvaluation()); } } return result; } final public List<WrittenTest> getUnenroledWrittenTests(final ExecutionSemester executionSemester) { final List<WrittenTest> result = new ArrayList<WrittenTest>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.getExecutionCourse().getExecutionPeriod() == executionSemester) { for (final Evaluation evaluation : attend.getExecutionCourse().getAssociatedEvaluationsSet()) { if (evaluation instanceof WrittenTest && !this.isEnroledIn(evaluation)) { result.add((WrittenTest) evaluation); } } } } return result; } public List<Project> getProjects(final ExecutionSemester executionSemester) { final List<Project> result = new ArrayList<Project>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.isFor(executionSemester)) { for (final Evaluation evaluation : attend.getExecutionCourse().getAssociatedEvaluationsSet()) { if (evaluation instanceof Project) { result.add((Project) evaluation); } } } } return result; } final public boolean isEnroledIn(final Evaluation evaluation) { for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : this.getWrittenEvaluationEnrolmentsSet()) { if (writtenEvaluationEnrolment.getWrittenEvaluation() == evaluation) { return true; } } return false; } final public Space getRoomFor(final WrittenEvaluation writtenEvaluation) { for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : this.getWrittenEvaluationEnrolmentsSet()) { if (writtenEvaluationEnrolment.getWrittenEvaluation() == writtenEvaluation) { return writtenEvaluationEnrolment.getRoom(); } } return null; } final public Stream<StudentCurricularPlan> getStudentCurricularPlanStream() { return getStudentCurricularPlansSet().stream().sorted(StudentCurricularPlan .STUDENT_CURRICULAR_PLAN_COMPARATOR_BY_START_DATE.reversed()); } final private CycleCurriculumGroup getCycleCurriculumGroup(CycleType cycleType) { return getStudentCurricularPlanStream().map(scp -> scp.getCycle(cycleType)).filter (Objects::nonNull).findFirst().orElse(null); } final public ICurriculum getCurriculum() { return getCurriculum(new DateTime(), (ExecutionYear) null, (CycleType) null); } final public ICurriculum getCurriculum(final DateTime when) { return getCurriculum(when, (ExecutionYear) null, (CycleType) null); } final public ICurriculum getCurriculum(final ExecutionYear executionYear) { return getCurriculum(new DateTime(), executionYear, (CycleType) null); } final public ICurriculum getCurriculum(final CycleType cycleType) { return getCurriculum(new DateTime(), (ExecutionYear) null, cycleType); } final public ICurriculum getCurriculum(final ExecutionYear executionYear, final CycleType cycleType) { return getCurriculum(new DateTime(), executionYear, cycleType); } final public ICurriculum getCurriculum(final DateTime when, final ExecutionYear executionYear, final CycleType cycleType) { if (getStudentCurricularPlansSet().isEmpty()) { return Curriculum.createEmpty(executionYear); } if (getDegreeType().isBolonhaType()) { final StudentCurricularPlan studentCurricularPlan = getLastStudentCurricularPlan(); if (studentCurricularPlan == null) { return Curriculum.createEmpty(executionYear); } if (cycleType == null) { return studentCurricularPlan.getCurriculum(when, executionYear); } final CycleCurriculumGroup cycleCurriculumGroup = getCycleCurriculumGroup(cycleType); if (cycleCurriculumGroup == null) { return Curriculum.createEmpty(executionYear); } return cycleCurriculumGroup.getCurriculum(when, executionYear); } else { final List<StudentCurricularPlan> sortedSCPs = getSortedStudentCurricularPlans(); final ListIterator<StudentCurricularPlan> sortedSCPsIterator = sortedSCPs.listIterator(sortedSCPs.size()); final StudentCurricularPlan lastStudentCurricularPlan = sortedSCPsIterator.previous(); final ICurriculum curriculum; curriculum = lastStudentCurricularPlan.getCurriculum(when, executionYear); for (; sortedSCPsIterator.hasPrevious();) { final StudentCurricularPlan studentCurricularPlan = sortedSCPsIterator.previous(); if (executionYear == null || studentCurricularPlan.getStartExecutionYear().isBeforeOrEquals(executionYear)) { ((Curriculum) curriculum).add(studentCurricularPlan.getCurriculum(when, executionYear)); } } return curriculum; } } public int getNumberOfCurriculumEntries() { return getCurriculum().getCurriculumEntries().size(); } final public Grade getRawGrade() { return ProgramConclusion.getConclusionProcess(getLastStudentCurricularPlan()).map(ConclusionProcess::getRawGrade) .orElseGet(this::calculateRawGrade); } final public Grade calculateRawGrade() { return getCurriculum().getRawGrade(); } final public BigDecimal getEctsCredits(final ExecutionYear executionYear, final CycleType cycleType) { return getCurriculum(executionYear, cycleType).getSumEctsCredits(); } final public Grade getFinalGrade() { return ProgramConclusion.getConclusionProcess(getLastStudentCurricularPlan()).map(ConclusionProcess::getFinalGrade) .orElse(null); } final public Grade getFinalGrade(ProgramConclusion programConclusion) { return programConclusion.groupFor(this).map(CurriculumGroup::getFinalGrade).orElse(null); } final public boolean isInFinalDegreeYear() { return getCurricularYear() == getLastStudentCurricularPlan().getDegreeCurricularPlan().getDurationInYears(); } final public boolean isQualifiedForSeniority() { return isDegreeOrBolonhaDegreeOrBolonhaIntegratedMasterDegree() && (isConcluded() || (isActive() && isInFinalDegreeForSeniority())); } public boolean isInFinalDegreeForSeniority() { int years = 0; final StudentCurricularPlan studentCurricularPlan = getLastStudentCurricularPlan(); for (final CycleType type : getDegreeType().getCycleTypes()) { if (studentCurricularPlan.hasCycleCurriculumGroup(type)) { years += studentCurricularPlan.getDegreeCurricularPlan().getDurationInYears(type); } } return getCurricularYear() == years; } final public Collection<CurricularCourse> getCurricularCoursesApprovedByEnrolment() { final Collection<CurricularCourse> result = new HashSet<CurricularCourse>(); for (final Enrolment enrolment : getApprovedEnrolments()) { result.add(enrolment.getCurricularCourse()); } return result; } final public Collection<Enrolment> getLatestCurricularCoursesEnrolments(final ExecutionYear executionYear) { return getStudentCurricularPlan(executionYear).getLatestCurricularCoursesEnrolments(executionYear); } final public boolean hasEnrolments(final Enrolment enrolment) { if (enrolment == null) { return false; } for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasEnrolments(enrolment)) { return true; } } return false; } final public boolean hasAnyEnrolments() { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyEnrolments()) { return true; } } return false; } final public boolean hasAnyCurriculumLines() { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyCurriculumLines()) { return true; } } return false; } final public boolean hasAnyCurriculumLines(final ExecutionYear executionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyCurriculumLines(executionYear)) { return true; } } return false; } final public boolean hasAnyCurriculumLines(final ExecutionSemester executionSemester) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyCurriculumLines(executionSemester)) { return true; } } return false; } final public Collection<Enrolment> getEnrolments(final ExecutionYear executionYear) { final StudentCurricularPlan studentCurricularPlan = getStudentCurricularPlan(executionYear); return studentCurricularPlan != null ? studentCurricularPlan.getEnrolmentsByExecutionYear(executionYear) : Collections.EMPTY_LIST; } final public Collection<Enrolment> getEnrolments(final ExecutionSemester executionSemester) { final StudentCurricularPlan studentCurricularPlan = getStudentCurricularPlan(executionSemester.getExecutionYear()); return studentCurricularPlan != null ? studentCurricularPlan.getEnrolmentsByExecutionPeriod(executionSemester) : Collections.EMPTY_LIST; } final public void addApprovedEnrolments(final Collection<Enrolment> enrolments) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { studentCurricularPlan.addApprovedEnrolments(enrolments); } } final public Collection<Enrolment> getApprovedEnrolments() { final Collection<Enrolment> result = new HashSet<Enrolment>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { result.addAll(studentCurricularPlan.getAprovedEnrolments()); } return result; } final public Collection<ExternalEnrolment> getApprovedExternalEnrolments() { final Collection<ExternalEnrolment> result = new HashSet<ExternalEnrolment>(); for (final ExternalEnrolment externalEnrolment : getExternalEnrolmentsSet()) { if (externalEnrolment.isApproved()) { result.add(externalEnrolment); } } return result; } final public Collection<CurriculumLine> getExtraCurricularCurriculumLines() { final Collection<CurriculumLine> result = new HashSet<CurriculumLine>(); final Collection<StudentCurricularPlan> toInspect = (isBolonha() ? Collections.singleton(getLastStudentCurricularPlan()) : getStudentCurricularPlansSet()); for (final StudentCurricularPlan studentCurricularPlan : toInspect) { result.addAll(studentCurricularPlan.getExtraCurricularCurriculumLines()); } return result; } final public Collection<CurriculumLine> getStandaloneCurriculumLines() { final Collection<CurriculumLine> result = new HashSet<CurriculumLine>(); final Collection<StudentCurricularPlan> toInspect = (isBolonha() ? Collections.singleton(getLastStudentCurricularPlan()) : getStudentCurricularPlansSet()); for (final StudentCurricularPlan studentCurricularPlan : toInspect) { result.addAll(studentCurricularPlan.getStandaloneCurriculumLines()); } return result; } public void assertConclusionDate(final Collection<CurriculumModule> result) { for (final CurriculumLine curriculumLine : getApprovedCurriculumLines()) { if (curriculumLine.calculateConclusionDate() == null) { result.add(curriculumLine); } } } final public Collection<Enrolment> getPropaedeuticEnrolments() { final Collection<Enrolment> result = new HashSet<Enrolment>(); final Collection<StudentCurricularPlan> toInspect = (isBolonha() ? Collections.singleton(getLastStudentCurricularPlan()) : getStudentCurricularPlansSet()); for (final StudentCurricularPlan studentCurricularPlan : toInspect) { result.addAll(studentCurricularPlan.getPropaedeuticEnrolments()); } return result; } final public Collection<CurriculumLine> getPropaedeuticCurriculumLines() { final Collection<CurriculumLine> result = new HashSet<CurriculumLine>(); final Collection<StudentCurricularPlan> toInspect = (isBolonha() ? Collections.singleton(getLastStudentCurricularPlan()) : getStudentCurricularPlansSet()); for (final StudentCurricularPlan studentCurricularPlan : toInspect) { result.addAll(studentCurricularPlan.getPropaedeuticCurriculumLines()); } return result; } public YearMonthDay getLastExternalApprovedEnrolmentEvaluationDate() { if (getExternalEnrolmentsSet().isEmpty()) { return null; } ExternalEnrolment externalEnrolment = Collections.max(getExternalEnrolmentsSet(), ExternalEnrolment.COMPARATOR_BY_EXECUTION_PERIOD_AND_EVALUATION_DATE); return externalEnrolment.getApprovementDate() != null ? externalEnrolment.getApprovementDate() : externalEnrolment .hasExecutionPeriod() ? externalEnrolment.getExecutionPeriod().getEndDateYearMonthDay() : null; } final public Collection<CurriculumLine> getApprovedCurriculumLines() { if (isBolonha()) { return getLastStudentCurricularPlan().getApprovedCurriculumLines(); } else { final Collection<CurriculumLine> result = new HashSet<CurriculumLine>(); for (final StudentCurricularPlan plan : getStudentCurricularPlansSet()) { result.addAll(plan.getApprovedCurriculumLines()); } return result; } } final public boolean hasAnyApprovedCurriculumLines() { return getLastStudentCurricularPlan().hasAnyApprovedCurriculumLines(); } final public Collection<IEnrolment> getApprovedIEnrolments() { final Collection<IEnrolment> result = new HashSet<IEnrolment>(); for (final CurriculumLine curriculumLine : getApprovedCurriculumLines()) { if (curriculumLine.isEnrolment()) { result.add((Enrolment) curriculumLine); } else if (curriculumLine.isDismissal()) { result.addAll(((Dismissal) curriculumLine).getSourceIEnrolments()); } } result.addAll(getExternalEnrolmentsSet()); return result; } final public boolean hasAnyApprovedEnrolment() { return getLastStudentCurricularPlan().hasAnyApprovedEnrolment() || hasAnyExternalApprovedEnrolment(); } final public boolean hasAnyApprovedEnrolments(final ExecutionYear executionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { if (enrolment.isApproved() && enrolment.getExecutionPeriod().getExecutionYear() == executionYear) { return true; } } } return false; } public boolean hasAnyEnroledEnrolments(final ExecutionYear year) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { if (enrolment.isEnroled() && enrolment.isValid(year)) { return true; } } } return false; } final public boolean hasAnyEnrolmentsIn(final ExecutionYear executionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { if (enrolment.getExecutionPeriod().getExecutionYear() == executionYear) { return true; } } } return false; } final public boolean hasAnyEnrolmentsIn(final ExecutionSemester executionSemester) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { if (enrolment.getExecutionPeriod() == executionSemester) { return true; } } } return false; } final public boolean hasAnyStandaloneEnrolmentsIn(final ExecutionYear executionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { StandaloneCurriculumGroup standaloneCurriculumGroup = studentCurricularPlan.getStandaloneCurriculumGroup(); if ((standaloneCurriculumGroup != null) && (standaloneCurriculumGroup.hasEnrolment(executionYear))) { return true; } } return false; } final public boolean hasAnyExternalApprovedEnrolment() { for (final ExternalEnrolment externalEnrolment : this.getExternalEnrolmentsSet()) { if (externalEnrolment.isApproved()) { return true; } } return false; } final public Double getDismissalsEctsCredits() { return getLastStudentCurricularPlan().getDismissalsEctsCredits(); } final public boolean getHasExternalEnrolments() { return !getExternalEnrolmentsSet().isEmpty(); } final public Collection<ExecutionYear> getEnrolmentsExecutionYears() { final Set<ExecutionYear> result = new HashSet<ExecutionYear>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { result.add(enrolment.getExecutionPeriod().getExecutionYear()); } } return result; } final public int getNumberOfYearsEnrolledUntil(ExecutionYear executionYear) { int count = 0; for (ExecutionYear year : getEnrolmentsExecutionYears()) { if (year.isBeforeOrEquals(executionYear)) { count++; } } return count; } final public SortedSet<ExecutionYear> getSortedEnrolmentsExecutionYears() { final SortedSet<ExecutionYear> result = new TreeSet<ExecutionYear>(ExecutionYear.COMPARATOR_BY_YEAR); result.addAll(getEnrolmentsExecutionYears()); return result; } public Set<ExecutionYear> getAllRelatedRegistrationsEnrolmentsExecutionYears(Set<ExecutionYear> result) { if (result == null) { result = new HashSet<ExecutionYear>(); } result.addAll(getEnrolmentsExecutionYears()); if (this.isBolonha()) { Registration source = getSourceRegistration() != null ? getSourceRegistration() : getSourceRegistrationForTransition(); if (source != null) { source.getAllRelatedRegistrationsEnrolmentsExecutionYears(result); } } else { Collection<Registration> registrations = getStudent().getRegistrationsSet(); for (Registration registration : registrations) { if (registration != this && !registration.isBolonha()) { if (!registration.isConcluded()) { result.addAll(registration.getEnrolmentsExecutionYears()); } } } } return result; } public Collection<ExecutionYear> getCurriculumLinesExecutionYears() { final Collection<ExecutionYear> result = new ArrayList<ExecutionYear>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final CurriculumLine curriculumLine : studentCurricularPlan.getAllCurriculumLines()) { if (curriculumLine.hasExecutionPeriod()) { result.add(curriculumLine.getExecutionYear()); } } } return result; } public SortedSet<ExecutionYear> getSortedCurriculumLinesExecutionYears() { final SortedSet<ExecutionYear> result = new TreeSet<ExecutionYear>(ExecutionYear.COMPARATOR_BY_YEAR); result.addAll(getCurriculumLinesExecutionYears()); return result; } final public ExecutionYear getFirstEnrolmentExecutionYear() { final SortedSet<ExecutionYear> sortedEnrolmentsExecutionYears = getSortedEnrolmentsExecutionYears(); return sortedEnrolmentsExecutionYears.isEmpty() ? null : sortedEnrolmentsExecutionYears.first(); } public ExecutionYear getFirstCurriculumLineExecutionYear() { final SortedSet<ExecutionYear> executionYears = getSortedCurriculumLinesExecutionYears(); return executionYears.isEmpty() ? null : executionYears.first(); } final public ExecutionYear getLastEnrolmentExecutionYear() { SortedSet<ExecutionYear> sorted = getSortedEnrolmentsExecutionYears(); if (!sorted.isEmpty()) { return sorted.last(); } else { return null; } } public ExecutionYear getLastApprovementExecutionYear() { if (isBolonha()) { return getLastStudentCurricularPlan().getLastApprovementExecutionYear(); } else { ExecutionYear result = null; for (final StudentCurricularPlan plan : getStudentCurricularPlansSet()) { final ExecutionYear year = plan.getLastApprovementExecutionYear(); if (year != null && (result == null || result.isBefore(year))) { result = year; } } return result; } } final public Collection<ExecutionSemester> getEnrolmentsExecutionPeriods() { final Set<ExecutionSemester> result = new HashSet<ExecutionSemester>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final Enrolment enrolment : studentCurricularPlan.getEnrolmentsSet()) { result.add(enrolment.getExecutionPeriod()); } } return result; } final public SortedSet<ExecutionSemester> getSortedEnrolmentsExecutionPeriods() { final SortedSet<ExecutionSemester> result = new TreeSet<ExecutionSemester>(ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR); result.addAll(getEnrolmentsExecutionPeriods()); return result; } final public Set<Attends> getOrderedAttends() { final Set<Attends> result = new TreeSet<Attends>(Attends.ATTENDS_COMPARATOR); result.addAll(getAssociatedAttendsSet()); return result; } final public int countCompletedCoursesForActiveUndergraduateCurricularPlan() { return getActiveStudentCurricularPlan().getAprovedEnrolments().size(); } public List<StudentCurricularPlan> getStudentCurricularPlansBySpecialization(Specialization specialization) { List<StudentCurricularPlan> result = new ArrayList<StudentCurricularPlan>(); for (StudentCurricularPlan studentCurricularPlan : this.getStudentCurricularPlansSet()) { if (studentCurricularPlan.getSpecialization() != null && studentCurricularPlan.getSpecialization().equals(specialization)) { result.add(studentCurricularPlan); } } return result; } final public List<StudentCurricularPlan> getStudentCurricularPlansByDegree(Degree degree) { final List<StudentCurricularPlan> result = new ArrayList<StudentCurricularPlan>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.getDegree() == degree) { result.add(studentCurricularPlan); } } return result; } final public StudentCurricularPlan getPastStudentCurricularPlanByDegree(Degree degree) { for (StudentCurricularPlan studentCurricularPlan : this.getStudentCurricularPlansSet()) { if (studentCurricularPlan.getDegree() == degree && studentCurricularPlan.isPast()) { return studentCurricularPlan; } } return null; } public List<Attends> readAttendsInCurrentExecutionPeriod() { final List<Attends> attends = new ArrayList<Attends>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.getExecutionCourse().getExecutionPeriod().getState().equals(PeriodState.CURRENT)) { attends.add(attend); } } return attends; } public List<Attends> readAttendsByExecutionPeriod(final ExecutionSemester executionSemester) { final List<Attends> attends = new ArrayList<Attends>(); for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.isFor(executionSemester)) { attends.add(attend); } } return attends; } @Deprecated final public static Registration readByUsername(String username) { final Person person = Person.readPersonByUsername(username); if (person != null) { for (final Registration registration : person.getStudentsSet()) { return registration; } } return null; } @Deprecated final public static Registration readStudentByNumberAndDegreeType(Integer number, DegreeType degreeType) { Registration nonActiveRegistration = null; for (Registration registration : Bennu.getInstance().getRegistrationsSet()) { if (registration.getNumber().intValue() == number.intValue() && registration.getDegreeType().equals(degreeType)) { if (registration.isActive()) { return registration; } nonActiveRegistration = registration; } } return nonActiveRegistration; } final public static Registration readByNumberAndDegreeCurricularPlan(Integer number, DegreeCurricularPlan degreeCurricularPlan) { Registration nonActiveRegistration = null; for (Registration registration : Bennu.getInstance().getRegistrationsSet()) { if (registration.getNumber().intValue() == number.intValue() && registration.getDegreeCurricularPlans().contains(degreeCurricularPlan)) { if (registration.isActive()) { return registration; } nonActiveRegistration = registration; } } return nonActiveRegistration; } final public static Registration readRegisteredRegistrationByNumberAndDegreeType(Integer number, DegreeType degreeType) { for (Registration registration : Bennu.getInstance().getRegistrationsSet()) { if (registration.getNumber().intValue() == number.intValue() && registration.getDegreeType().equals(degreeType) && registration.isInRegisteredState()) { return registration; } } return null; } final public static Collection<Registration> readRegistrationsByNumberAndDegreeTypes(Integer number, DegreeType... degreeTypes) { List<Registration> result = new ArrayList<Registration>(); final List<DegreeType> degreeTypesList = Arrays.asList(degreeTypes); for (RegistrationNumber registrationNumber : Bennu.getInstance().getRegistrationNumbersSet()) { if (registrationNumber.getNumber().intValue() == number.intValue()) { final Registration registration = registrationNumber.getRegistration(); if (degreeTypesList.contains(registration.getDegreeType())) { result.add(registration); } } } return result; } final public static List<Registration> readByNumber(Integer number) { final List<Registration> registrations = new ArrayList<Registration>(); for (RegistrationNumber registrationNumber : Bennu.getInstance().getRegistrationNumbersSet()) { if (registrationNumber.getNumber().intValue() == number.intValue()) { registrations.add(registrationNumber.getRegistration()); } } return registrations; } final public static List<Registration> readByNumberAndDegreeType(Integer number, DegreeType degreeType) { final List<Registration> registrations = new ArrayList<Registration>(); for (RegistrationNumber registrationNumber : Bennu.getInstance().getRegistrationNumbersSet()) { if (registrationNumber.getNumber().intValue() == number.intValue() && registrationNumber.getRegistration().getDegreeType() == degreeType) { registrations.add(registrationNumber.getRegistration()); } } return registrations; } final public static List<Registration> readByNumberAndDegreeTypeAndAgreement(Integer number, DegreeType degreeType, boolean normalAgreement) { final List<Registration> registrations = new ArrayList<Registration>(); for (RegistrationNumber registrationNumber : Bennu.getInstance().getRegistrationNumbersSet()) { if (registrationNumber.getNumber().intValue() == number.intValue() && registrationNumber.getRegistration().getDegreeType() == degreeType && (registrationNumber.getRegistration().getRegistrationProtocol() == RegistrationProtocol.getDefault()) == normalAgreement) { registrations.add(registrationNumber.getRegistration()); } } return registrations; } final public static List<Registration> readAllStudentsBetweenNumbers(Integer fromNumber, Integer toNumber) { int fromNumberInt = fromNumber.intValue(); int toNumberInt = toNumber.intValue(); final List<Registration> students = new ArrayList<Registration>(); for (final Registration registration : Bennu.getInstance().getRegistrationsSet()) { int studentNumberInt = registration.getNumber().intValue(); if (studentNumberInt >= fromNumberInt && studentNumberInt <= toNumberInt) { students.add(registration); } } return students; } final public static List<Registration> readRegistrationsByDegreeType(DegreeType degreeType) { final List<Registration> students = new ArrayList<Registration>(); for (final Registration registration : Bennu.getInstance().getRegistrationsSet()) { if (registration.getDegreeType().equals(degreeType)) { students.add(registration); } } return students; } final public GratuitySituation readGratuitySituationByExecutionDegree(ExecutionDegree executionDegree) { GratuityValues gratuityValues = executionDegree.getGratuityValues(); for (StudentCurricularPlan studentCurricularPlan : this.getStudentCurricularPlansSet()) { GratuitySituation gratuitySituation = studentCurricularPlan.getGratuitySituationByGratuityValues(gratuityValues); if (gratuitySituation != null) { return gratuitySituation; } } return null; } final public List<InsuranceTransaction> readAllInsuranceTransactionByExecutionYear(ExecutionYear executionYear) { List<InsuranceTransaction> insuranceTransactions = new ArrayList<InsuranceTransaction>(); for (InsuranceTransaction insuranceTransaction : this.getInsuranceTransactionsSet()) { if (insuranceTransaction.getExecutionYear().equals(executionYear)) { insuranceTransactions.add(insuranceTransaction); } } return insuranceTransactions; } final public List<InsuranceTransaction> readAllNonReimbursedInsuranceTransactionsByExecutionYear(ExecutionYear executionYear) { List<InsuranceTransaction> nonReimbursedInsuranceTransactions = new ArrayList<InsuranceTransaction>(); for (InsuranceTransaction insuranceTransaction : this.getInsuranceTransactionsSet()) { if (insuranceTransaction.getExecutionYear().equals(executionYear)) { GuideEntry guideEntry = insuranceTransaction.getGuideEntry(); if (guideEntry == null || guideEntry.getReimbursementGuideEntriesSet().isEmpty()) { nonReimbursedInsuranceTransactions.add(insuranceTransaction); } else { boolean isReimbursed = false; for (ReimbursementGuideEntry reimbursementGuideEntry : guideEntry.getReimbursementGuideEntriesSet()) { if (reimbursementGuideEntry.getReimbursementGuide().getActiveReimbursementGuideSituation() .getReimbursementGuideState().equals(ReimbursementGuideState.PAYED)) { isReimbursed = true; break; } } if (!isReimbursed) { nonReimbursedInsuranceTransactions.add(insuranceTransaction); } } } } return nonReimbursedInsuranceTransactions; } final public Enrolment findEnrolmentByEnrolmentID(final String enrolmentID) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { final Enrolment enrolment = studentCurricularPlan.findEnrolmentByEnrolmentID(enrolmentID); if (enrolment != null) { return enrolment; } } return null; } final public Set<ExecutionCourse> getAttendingExecutionCoursesForCurrentExecutionPeriod() { final Set<ExecutionCourse> result = new HashSet<ExecutionCourse>(); for (final Attends attends : getAssociatedAttendsSet()) { if (attends.getExecutionCourse().getExecutionPeriod().getState().equals(PeriodState.CURRENT)) { result.add(attends.getExecutionCourse()); } } return result; } final public Set<ExecutionCourse> getAttendingExecutionCoursesFor() { final Set<ExecutionCourse> result = new HashSet<ExecutionCourse>(); for (final Attends attends : getAssociatedAttendsSet()) { result.add(attends.getExecutionCourse()); } return result; } final public List<ExecutionCourse> getAttendingExecutionCoursesFor(final ExecutionSemester executionSemester) { final List<ExecutionCourse> result = new ArrayList<ExecutionCourse>(); for (final Attends attends : getAssociatedAttendsSet()) { if (attends.isFor(executionSemester)) { result.add(attends.getExecutionCourse()); } } return result; } final public List<ExecutionCourse> getAttendingExecutionCoursesFor(final ExecutionYear executionYear) { final List<ExecutionCourse> result = new ArrayList<ExecutionCourse>(); for (final Attends attends : getAssociatedAttendsSet()) { if (attends.isFor(executionYear)) { result.add(attends.getExecutionCourse()); } } return result; } final public List<Attends> getAttendsForExecutionPeriod(final ExecutionSemester executionSemester) { final List<Attends> result = new ArrayList<Attends>(); for (final Attends attends : getAssociatedAttendsSet()) { if (attends.isFor(executionSemester)) { result.add(attends); } } return result; } final public List<Shift> getShiftsForCurrentExecutionPeriod() { final List<Shift> result = new ArrayList<Shift>(); for (final Shift shift : getShiftsSet()) { if (shift.getExecutionCourse().getExecutionPeriod().getState().equals(PeriodState.CURRENT)) { result.add(shift); } } return result; } final public List<Shift> getShiftsFor(final ExecutionSemester executionSemester) { final List<Shift> result = new ArrayList<Shift>(); for (final Shift shift : getShiftsSet()) { if (shift.getExecutionCourse().getExecutionPeriod() == executionSemester) { result.add(shift); } } return result; } final public List<Shift> getShiftsFor(final ExecutionCourse executionCourse) { final List<Shift> result = new ArrayList<Shift>(); for (final Shift shift : getShiftsSet()) { if (shift.getExecutionCourse() == executionCourse) { result.add(shift); } } return result; } final public Shift getShiftFor(final ExecutionCourse executionCourse, final ShiftType shiftType) { for (final Shift shift : getShiftsSet()) { if (shift.getExecutionCourse() == executionCourse && shift.hasShiftType(shiftType)) { return shift; } } return null; } private int countNumberOfDistinctExecutionCoursesOfShiftsFor(final ExecutionSemester executionSemester) { final Set<ExecutionCourse> result = new HashSet<ExecutionCourse>(); for (final Shift shift : getShiftsSet()) { if (shift.getExecutionCourse().getExecutionPeriod() == executionSemester) { result.add(shift.getExecutionCourse()); } } return result.size(); } final public Integer getNumberOfExecutionCoursesWithEnroledShiftsFor(final ExecutionSemester executionSemester) { return getAttendingExecutionCoursesFor(executionSemester).size() - countNumberOfDistinctExecutionCoursesOfShiftsFor(executionSemester); } final public Integer getNumberOfExecutionCoursesHavingNotEnroledShiftsFor(final ExecutionSemester executionSemester) { int result = 0; final List<Shift> enroledShifts = getShiftsFor(executionSemester); for (final ExecutionCourse executionCourse : getAttendingExecutionCoursesFor(executionSemester)) { for (final ShiftType shiftType : executionCourse.getOldShiftTypesToEnrol()) { if (!enroledShiftsContainsShiftWithSameExecutionCourseAndShiftType(enroledShifts, executionCourse, shiftType)) { result++; break; } } } return Integer.valueOf(result); } private boolean enroledShiftsContainsShiftWithSameExecutionCourseAndShiftType(final List<Shift> enroledShifts, final ExecutionCourse executionCourse, final ShiftType shiftType) { return enroledShifts.stream().anyMatch( enroledShift -> enroledShift.getExecutionCourse() == executionCourse && enroledShift.containsType(shiftType)); } final public Set<SchoolClass> getSchoolClassesToEnrol() { final Set<SchoolClass> result = new HashSet<SchoolClass>(); for (final Attends attends : getAssociatedAttendsSet()) { final ExecutionCourse executionCourse = attends.getExecutionCourse(); if (executionCourse.getExecutionPeriod().getState().equals(PeriodState.CURRENT)) { result.addAll(getSchoolClassesToEnrolBy(executionCourse)); } } return result; } final public Set<SchoolClass> getSchoolClassesToEnrolBy(final ExecutionCourse executionCourse) { Set<SchoolClass> schoolClasses = executionCourse.getSchoolClassesBy(getActiveStudentCurricularPlan().getDegreeCurricularPlan()); return schoolClasses.isEmpty() ? executionCourse.getSchoolClasses() : schoolClasses; } public void addAttendsTo(final ExecutionCourse executionCourse) { checkIfReachedAttendsLimit(); if (getStudent().readAttendByExecutionCourse(executionCourse) == null) { final Enrolment enrolment = findEnrolment(getActiveStudentCurricularPlan(), executionCourse, executionCourse.getExecutionPeriod()); if (enrolment != null) { enrolment.createAttends(this, executionCourse); } else { Attends attends = getAttendsForExecutionCourse(executionCourse); if (attends != null) { attends.delete(); } new Attends(this, executionCourse); } } } private Attends getAttendsForExecutionCourse(ExecutionCourse executionCourse) { List<Attends> attendsInExecutionPeriod = getAttendsForExecutionPeriod(executionCourse.getExecutionPeriod()); for (Attends attends : attendsInExecutionPeriod) { for (CurricularCourse curricularCourse : attends.getExecutionCourse().getAssociatedCurricularCoursesSet()) { if (executionCourse.getAssociatedCurricularCoursesSet().contains(curricularCourse)) { return attends; } } } return null; } private Enrolment findEnrolment(final StudentCurricularPlan studentCurricularPlan, final ExecutionCourse executionCourse, final ExecutionSemester executionSemester) { for (final CurricularCourse curricularCourse : executionCourse.getAssociatedCurricularCoursesSet()) { final Enrolment enrolment = studentCurricularPlan.getEnrolmentByCurricularCourseAndExecutionPeriod(curricularCourse, executionSemester); if (enrolment != null) { return enrolment; } } return null; } private static final int MAXIMUM_STUDENT_ATTENDS_PER_EXECUTION_PERIOD = 10; // ; private void checkIfReachedAttendsLimit() { final User userView = Authenticate.getUser(); if (userView == null || !AcademicAccessRule.isProgramAccessibleToFunction(AcademicOperationType.STUDENT_ENROLMENTS, getDegree(), userView.getPerson().getUser())) { if (readAttendsInCurrentExecutionPeriod().size() >= MAXIMUM_STUDENT_ATTENDS_PER_EXECUTION_PERIOD) { throw new DomainException("error.student.reached.attends.limit", String.valueOf(MAXIMUM_STUDENT_ATTENDS_PER_EXECUTION_PERIOD)); } } } @Atomic final public void removeAttendFor(final ExecutionCourse executionCourse) { final Attends attend = readRegistrationAttendByExecutionCourse(executionCourse); if (attend != null) { checkIfHasEnrolmentFor(attend); checkIfHasShiftsFor(executionCourse); attend.delete(); } } public void checkIfHasEnrolmentFor(final Attends attend) { if (attend.getEnrolment() != null) { throw new DomainException("errors.student.already.enroled"); } } public void checkIfHasShiftsFor(final ExecutionCourse executionCourse) { if (!getShiftsFor(executionCourse).isEmpty()) { throw new DomainException("errors.student.already.enroled.in.shift"); } } @Override final public Integer getNumber() { return (super.getNumber() != null) ? super.getNumber() : getStudent().getNumber(); } final public Person getPerson() { return getStudent().getPerson(); } final public String getName() { return getPerson().getName(); } final public String getEmail() { return getPerson().getEmail(); } final public Double getEntryGrade() { return getStudentCandidacy() != null ? getStudentCandidacy().getEntryGrade() : null; } final public void setEntryGrade(Double entryGrade) { if (getStudentCandidacy() != null) { getStudentCandidacy().setEntryGrade(entryGrade); } else { throw new DomainException("error.registration.withou.student.candidacy"); } } final public String getPrecedentDegreeConclusionGrade(final SchoolLevelType levelType) { return hasPrecedentDegreeInformation(levelType) ? getPrecedentDegreeInformation(levelType).getConclusionGrade() : null; } public boolean hasPrecedentDegreeInformation(SchoolLevelType levelType) { return getPrecedentDegreeInformation(levelType) != null; } public PrecedentDegreeInformation getPrecedentDegreeInformation(final SchoolLevelType levelType) { return (super.getPrecedentDegreeInformation() != null && super.getPrecedentDegreeInformation().getSchoolLevel() == levelType) ? super .getPrecedentDegreeInformation() : null; } public boolean isFirstCycleAtributionIngression() { return getIngressionType().isFirstCycleAttribution(); } public boolean isSecondCycleInternalCandidacyIngression() { return getIngressionType() != null ? getIngressionType().isInternal2ndCycleAccess() : false; } @Override public void setIngressionType(IngressionType ingressionType) { checkIngressionType(ingressionType); super.setIngressionType(ingressionType); } private void checkIngressionType(final IngressionType ingressionType) { checkIngression(ingressionType, getPerson(), getFirstStudentCurricularPlan().getDegreeCurricularPlan()); } public static void checkIngression(IngressionType ingressionType, Person person, DegreeCurricularPlan degreeCurricularPlan) { if (ingressionType.isReIngression()) { if (person == null || person.getStudent() == null) { throw new DomainException("error.registration.preBolonhaSourceDegreeNotFound"); } if (degreeCurricularPlan.getEquivalencePlan() != null) { final Student student = person.getStudent(); final Degree sourceDegree = degreeCurricularPlan.getEquivalencePlan().getSourceDegreeCurricularPlan().getDegree(); Registration sourceRegistration = person.getStudent().readRegistrationByDegree(sourceDegree); if (sourceRegistration == null) { final Collection<Registration> registrations = student.getRegistrationsMatchingDegreeType(DegreeType::isPreBolonhaDegree); registrations.removeAll(student.getRegistrationsFor(degreeCurricularPlan)); sourceRegistration = registrations.size() == 1 ? registrations.iterator().next() : null; } if (sourceRegistration == null) { throw new DomainException("error.registration.preBolonhaSourceDegreeNotFound"); } else if (!sourceRegistration.getActiveStateType().canReingress()) { throw new DomainException("error.registration.preBolonhaSourceRegistrationCannotReingress"); } } } } final public ExecutionYear getIngressionYear() { return calculateIngressionYear(); } public ExecutionYear calculateIngressionYear() { return inspectIngressionYear(this); } private ExecutionYear inspectIngressionYear(final Registration registration) { if (registration.getSourceRegistration() == null) { return registration.getStartExecutionYear(); } return inspectIngressionYear(registration.getSourceRegistration()); } final public String getContigent() { return getStudentCandidacy() != null ? getStudentCandidacy().getContigent() : null; } public String getDegreeNameWithDegreeCurricularPlanName() { final StudentCurricularPlan toAsk = getStudentCurricularPlan(getStartExecutionYear()) == null ? getFirstStudentCurricularPlan() : getStudentCurricularPlan(getStartExecutionYear()); if (toAsk == null) { return StringUtils.EMPTY; } return toAsk.getPresentationName(getStartExecutionYear()); } public String getDegreeNameWithDescription() { return getDegree().getPresentationName(getStartExecutionYear()); } public String getDegreeName() { return getDegree().getNameFor(getStartExecutionYear()).getContent(); } final public String getDegreeDescription() { final DegreeType degreeType = getDegreeType(); return getDegreeDescription(degreeType.hasExactlyOneCycleType() ? degreeType.getCycleType() : getLastConcludedCycleType()); } @Deprecated final public String getDegreeDescription(final CycleType cycleType) { return getDegreeDescription(cycleType, I18N.getLocale()); } @Deprecated final public String getDegreeDescription(ExecutionYear executionYear, final CycleType cycleType) { return getDegreeDescription(executionYear, cycleType, I18N.getLocale()); } @Deprecated final public String getDegreeDescription(final CycleType cycleType, final Locale locale) { return getDegreeDescription(this.getStartExecutionYear(), cycleType, locale); } final public String getDegreeDescription(ExecutionYear executionYear, ProgramConclusion programConclusion, final Locale locale) { final StringBuilder res = new StringBuilder(); final Degree degree = getDegree(); final DegreeType degreeType = degree.getDegreeType(); if (programConclusion != null && !programConclusion.isTerminal() && !Strings.isNullOrEmpty(programConclusion.getName().getContent(locale))) { res.append(programConclusion.getName().getContent(locale)); res.append(", ").append(BundleUtil.getString(Bundle.ACADEMIC, locale, "label.of.the.male")).append(" "); } // the degree type description is always given by the program conclusion of a course group matching available degree cycle types // if no cycle types available, choose any program conclusion if (programConclusion == null) { programConclusion = degreeType.getCycleTypes().stream() .map(cycleType -> getLastStudentCurricularPlan().getCycleCourseGroup(cycleType)) .filter(Objects::nonNull).map(CycleCourseGroup::getProgramConclusion).filter(Objects::nonNull) .findAny().orElseGet(() -> ProgramConclusion.conclusionsFor(this).findAny().orElse(null)); } if (!isEmptyDegree() && !degreeType.isEmpty()) { res.append(degreeType.getPrefix(locale)); if (programConclusion != null && !Strings.isNullOrEmpty(programConclusion.getDescription().getContent(locale))) { res.append(programConclusion.getDescription().getContent(locale).toUpperCase()); res.append(" ").append(BundleUtil.getString(Bundle.ACADEMIC, locale, "label.in")).append(" "); } } res.append(degree.getFilteredName(executionYear, locale).toUpperCase()); return res.toString(); } @Deprecated final public String getDegreeDescription(ExecutionYear executionYear, final CycleType cycleType, final Locale locale) { CycleCourseGroup cycleCourseGroup = getLastStudentCurricularPlan().getCycleCourseGroup(cycleType); ProgramConclusion programConclusion = cycleCourseGroup != null ? cycleCourseGroup.getProgramConclusion() : null; return getDegreeDescription(executionYear, programConclusion, locale); } public String getDegreeCurricularPlanName() { return getLastDegreeCurricularPlan().getName(); } @Override final public Degree getDegree() { return super.getDegree() != null ? super.getDegree() : (!getStudentCurricularPlansSet().isEmpty() ? getLastStudentCurricularPlan() .getDegree() : null); } final public DegreeType getDegreeType() { return getDegree() == null ? null : getDegree().getDegreeType(); } final public boolean isBolonha() { DegreeType degreeType = getDegreeType(); return degreeType != null && degreeType.isBolonhaType(); } final public boolean isActiveForOffice(Unit office) { return isActive() && isForOffice(office.getAdministrativeOffice()); } @Deprecated public boolean isDegreeAdministrativeOffice() { return getDegree().getAdministrativeOffice().getAdministrativeOfficeType() == AdministrativeOfficeType.DEGREE; } final public boolean isForOffice(final AdministrativeOffice administrativeOffice) { return getDegree().getAdministrativeOffice().equals(administrativeOffice); } final public boolean isAllowedToManageRegistration() { final Degree degree = getDegree(); final User user = Authenticate.getUser(); return AcademicAccessRule.getProgramsAccessibleToFunction(AcademicOperationType.MANAGE_REGISTRATIONS, user) .anyMatch(ap -> ap == degree) || AcademicAccessRule .getProgramsAccessibleToFunction(AcademicOperationType.VIEW_FULL_STUDENT_CURRICULUM, user) .anyMatch(ap -> ap == degree); } public boolean isCurricularCourseApproved(final CurricularCourse curricularCourse) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.isCurricularCourseApproved(curricularCourse)) { return true; } } return false; } final public Set<RegistrationStateType> getRegistrationStatesTypes(final ExecutionYear executionYear) { final Set<RegistrationStateType> result = new HashSet<RegistrationStateType>(); for (final RegistrationState registrationState : getRegistrationStates(executionYear)) { result.add(registrationState.getStateType()); } return result; } final public Set<RegistrationStateType> getRegistrationStatesTypes(final ExecutionSemester executionSemester) { final Set<RegistrationStateType> result = new HashSet<RegistrationStateType>(); for (final RegistrationState registrationState : getRegistrationStates(executionSemester)) { result.add(registrationState.getStateType()); } return result; } public boolean isRegistered(final DateTime when) { final RegistrationState stateInDate = getStateInDate(when); return (stateInDate != null && stateInDate.isActive()) || hasAnyEnrolmentsIn(ExecutionSemester.readByDateTime(when)); } public boolean isRegistered(final ExecutionSemester executionSemester) { return hasAnyActiveState(executionSemester) || hasAnyEnrolmentsIn(executionSemester); } final public boolean isRegistered(final ExecutionYear executionYear) { return hasAnyActiveState(executionYear) || hasAnyEnrolmentsIn(executionYear); } final public RegistrationState getActiveState() { if (!getRegistrationStatesSet().isEmpty()) { RegistrationState activeState = null; for (RegistrationState state : getRegistrationStatesSet()) { if (!state.getStateDate().isAfterNow()) { if (activeState == null || RegistrationState.DATE_COMPARATOR.compare(activeState, state) < 0) { activeState = state; } } } return activeState; } else { return null; } } public RegistrationState getLastState() { RegistrationState result = null; for (final RegistrationState state : getRegistrationStatesSet()) { if (result == null || state.getStateDate().isAfter(result.getStateDate())) { result = state; } } return result; } public RegistrationStateType getLastStateType() { final RegistrationState registrationState = getLastState(); return registrationState == null ? null : registrationState.getStateType(); } final public RegistrationState getFirstState() { return getFirstRegistrationState(); } final public RegistrationStateType getActiveStateType() { final RegistrationState activeState = getActiveState(); return activeState != null ? activeState.getStateType() : RegistrationStateType.REGISTERED; } final public boolean isActive() { return getActiveStateType().isActive(); } public boolean hasAnyActiveState(final ExecutionSemester executionSemester) { for (RegistrationState registrationState : getRegistrationStates(executionSemester)) { if (registrationState.isActive()) { return true; } } return false; } public boolean hasAnyActiveState(final ExecutionYear executionYear) { for (RegistrationState registrationState : getRegistrationStates(executionYear)) { if (registrationState.isActive()) { return true; } } return false; } public boolean hasActiveFirstState(final ExecutionYear period) { final Set<RegistrationState> states = getRegistrationStates(period); return states.isEmpty() ? false : Collections.min(states, RegistrationState.DATE_COMPARATOR).isActive(); } public boolean hasActiveLastState(final ExecutionSemester executionSemester) { final Set<RegistrationState> states = getRegistrationStates(executionSemester); return states.isEmpty() ? false : Collections.max(states, RegistrationState.DATE_COMPARATOR).isActive(); } public boolean hasRegistrationState(final RegistrationStateType stateType) { for (final RegistrationState state : getRegistrationStatesSet()) { if (state.getStateType() == stateType) { return true; } } return false; } final public boolean isInRegisteredState() { return getActiveStateType() == RegistrationStateType.REGISTERED; } final public boolean isInternalAbandon() { return getActiveStateType() == RegistrationStateType.INTERNAL_ABANDON; } final public boolean getInterruptedStudies() { return isInterrupted(); } public boolean isInterrupted() { return getActiveStateType() == RegistrationStateType.INTERRUPTED; } final public boolean getFlunked() { return isFlunked(); } public boolean isFlunked() { return getActiveStateType() == RegistrationStateType.FLUNKED; } final public boolean isInMobilityState() { return getActiveStateType() == RegistrationStateType.MOBILITY; } public boolean isSchoolPartConcluded() { return getActiveStateType() == RegistrationStateType.SCHOOLPARTCONCLUDED; } public boolean isConcluded() { return getActiveStateType() == RegistrationStateType.CONCLUDED; } public boolean isTransited() { return getActiveStateType() == RegistrationStateType.TRANSITED; } public boolean isCanceled() { return getActiveStateType() == RegistrationStateType.CANCELED; } final public boolean isTransited(final DateTime when) { final RegistrationState stateInDate = getStateInDate(when); return stateInDate != null && stateInDate.getStateType() == RegistrationStateType.TRANSITED; } final public boolean isTransited(final ExecutionYear executionYear) { return hasStateType(executionYear, RegistrationStateType.TRANSITED); } final public boolean isTransition() { return getActiveStateType() == RegistrationStateType.TRANSITION; } final public boolean isTransition(final ExecutionYear executionYear) { return hasStateType(executionYear, RegistrationStateType.TRANSITION); } final public boolean getWasTransition() { return hasState(RegistrationStateType.TRANSITION); } final public RegistrationState getStateInDate(DateTime dateTime) { List<RegistrationState> sortedRegistrationStates = new ArrayList<RegistrationState>(getRegistrationStatesSet()); Collections.sort(sortedRegistrationStates, RegistrationState.DATE_COMPARATOR); for (ListIterator<RegistrationState> iterator = sortedRegistrationStates.listIterator(sortedRegistrationStates.size()); iterator .hasPrevious();) { RegistrationState registrationState = iterator.previous(); if (!dateTime.isBefore(registrationState.getStateDate())) { return registrationState; } } return null; } final public RegistrationState getStateInDate(final LocalDate localDate) { final List<RegistrationState> sortedRegistrationStates = new ArrayList<RegistrationState>(getRegistrationStatesSet()); Collections.sort(sortedRegistrationStates, RegistrationState.DATE_COMPARATOR); for (ListIterator<RegistrationState> iterator = sortedRegistrationStates.listIterator(sortedRegistrationStates.size()); iterator .hasPrevious();) { RegistrationState registrationState = iterator.previous(); if (!localDate.isBefore(registrationState.getStateDate().toLocalDate())) { return registrationState; } } return null; } public Set<RegistrationState> getRegistrationStates(final ExecutionYear executionYear) { return getRegistrationStates(executionYear.getBeginDateYearMonthDay().toDateTimeAtMidnight(), executionYear .getEndDateYearMonthDay().toDateTimeAtMidnight()); } public Set<RegistrationState> getRegistrationStates(final ExecutionSemester executionSemester) { return getRegistrationStates(executionSemester.getBeginDateYearMonthDay().toDateTimeAtMidnight(), executionSemester .getEndDateYearMonthDay().toDateTimeAtMidnight()); } public Set<RegistrationState> getRegistrationStates(final ReadableInstant beginDateTime, final ReadableInstant endDateTime) { final Set<RegistrationState> result = new HashSet<RegistrationState>(); populateRegistrationStates(beginDateTime, endDateTime, result); return result; } public List<RegistrationState> getRegistrationStatesList(final ExecutionYear executionYear) { return getRegistrationStatesList(executionYear.getBeginDateYearMonthDay().toDateTimeAtMidnight(), executionYear .getEndDateYearMonthDay().toDateTimeAtMidnight()); } public List<RegistrationState> getRegistrationStatesList(final ExecutionSemester executionSemester) { return getRegistrationStatesList(executionSemester.getBeginDateYearMonthDay().toDateTimeAtMidnight(), executionSemester .getEndDateYearMonthDay().toDateTimeAtMidnight()); } public List<RegistrationState> getRegistrationStatesList(final ReadableInstant beginDateTime, final ReadableInstant endDateTime) { final List<RegistrationState> result = new ArrayList<RegistrationState>(); populateRegistrationStates(beginDateTime, endDateTime, result); return result; } private void populateRegistrationStates(final ReadableInstant beginDateTime, final ReadableInstant endDateTime, final Collection<RegistrationState> result) { List<RegistrationState> sortedRegistrationsStates = new ArrayList<RegistrationState>(getRegistrationStatesSet()); Collections.sort(sortedRegistrationsStates, RegistrationState.DATE_COMPARATOR); for (ListIterator<RegistrationState> iter = sortedRegistrationsStates.listIterator(sortedRegistrationsStates.size()); iter .hasPrevious();) { RegistrationState state = iter.previous(); if (state.getStateDate().isAfter(endDateTime)) { continue; } result.add(state); if (!state.getStateDate().isAfter(beginDateTime)) { break; } } } public RegistrationState getFirstRegistrationState() { return getRegistrationStatesSet().stream().min(RegistrationState.DATE_COMPARATOR).orElse(null); } final public RegistrationState getLastRegistrationState(final ExecutionYear executionYear) { return getRegistrationStatesSet().stream().sorted(RegistrationState.DATE_COMPARATOR.reversed()).filter(state -> !state .getStateDate() .isAfter(executionYear.getEndDateYearMonthDay().toDateTimeAtMidnight())).findFirst().orElse(null); } public boolean hasState(final RegistrationStateType stateType) { return hasAnyState(Collections.singletonList(stateType)); } public boolean hasAnyState(final Collection<RegistrationStateType> stateTypes) { for (final RegistrationState registrationState : getRegistrationStatesSet()) { if (stateTypes.contains(registrationState.getStateType())) { return true; } } return false; } final public boolean hasStateType(final ExecutionSemester executionSemester, final RegistrationStateType registrationStateType) { return getRegistrationStatesTypes(executionSemester).contains(registrationStateType); } final public boolean hasStateType(final ExecutionYear executionYear, final RegistrationStateType registrationStateType) { return getRegistrationStatesTypes(executionYear).contains(registrationStateType); } public boolean hasFlunkedState(final ExecutionYear executionYear) { return hasStateType(executionYear, RegistrationStateType.FLUNKED); } public boolean hasRegisteredActiveState() { return getActiveStateType() == RegistrationStateType.REGISTERED; } public Collection<RegistrationState> getRegistrationStates(final RegistrationStateType registrationStateType) { return getRegistrationStates(Collections.singletonList(registrationStateType)); } public Collection<RegistrationState> getRegistrationStates(final Collection<RegistrationStateType> registrationStateTypes) { final Collection<RegistrationState> result = new HashSet<RegistrationState>(); for (final RegistrationState registrationState : getRegistrationStatesSet()) { if (registrationStateTypes.contains(registrationState.getStateType())) { result.add(registrationState); } } return result; } final public double getEctsCredits() { return calculateCredits(); } public double calculateCredits() { return getTotalEctsCredits((ExecutionYear) null).doubleValue(); } final public BigDecimal getTotalEctsCredits(final ExecutionYear executionYear) { return getCurriculum(executionYear).getSumEctsCredits(); } public double getEnrolmentsEcts(final ExecutionYear executionYear) { return getLastStudentCurricularPlan().getEnrolmentsEctsCredits(executionYear); } final public int getCurricularYear() { return getCurricularYear(ExecutionYear.readCurrentExecutionYear()); } final public int getCurricularYear(ExecutionYear executionYear) { return getCurriculum(executionYear).getCurricularYear(); } final public int getCurricularYear(final DateTime when, final ExecutionYear executionYear) { return getCurriculum(when, executionYear, (CycleType) null).getCurricularYear(); } final public Person getConclusionProcessResponsible() { return isRegistrationConclusionProcessed() ? getConclusionProcess().getResponsible() : null; } final public Person getConclusionProcessLastResponsible() { return isRegistrationConclusionProcessed() ? getConclusionProcess().getLastResponsible() : null; } public boolean isRegistrationConclusionProcessed() { return getLastStudentCurricularPlan().isConclusionProcessed(); } public boolean isQualifiedToRegistrationConclusionProcess() { return isActive() || isConcluded() || isSchoolPartConcluded(); } public ExecutionYear calculateConclusionYear() { ExecutionYear result = getLastApprovementExecutionYear(); if (result == null) { if (hasState(RegistrationStateType.CONCLUDED)) { return getFirstRegistrationState(RegistrationStateType.CONCLUDED).getExecutionYear(); } else if (isOldMasterDegree() && hasState(RegistrationStateType.SCHOOLPARTCONCLUDED)) { return getFirstRegistrationState(RegistrationStateType.SCHOOLPARTCONCLUDED).getExecutionYear(); } } return result; } private RegistrationState getFirstRegistrationState(final RegistrationStateType stateType) { final SortedSet<RegistrationState> states = new TreeSet<RegistrationState>(RegistrationState.DATE_COMPARATOR); states.addAll(getRegistrationStates(stateType)); return states.first(); } private boolean isOldMasterDegree() { return getDegreeType().isPreBolonhaMasterDegree(); } public YearMonthDay getConclusionDate() { return ProgramConclusion.getConclusionProcess(getLastStudentCurricularPlan()) .map(ConclusionProcess::getConclusionYearMonthDay).orElse(null); } @Deprecated public YearMonthDay getConclusionDateForBolonha() { return getConclusionDate(); } final public YearMonthDay getConclusionDate(final CycleType cycleType) { if (!getDegreeType().hasAnyCycleTypes()) { return getConclusionDate(); } if (!hasConcludedCycle(cycleType)) { throw new DomainException("Registration.hasnt.finished.given.cycle"); } final StudentCurricularPlan lastStudentCurricularPlan = getLastStudentCurricularPlan(); if (lastStudentCurricularPlan == null) { throw new DomainException("Registration.has.no.student.curricular.plan"); } return lastStudentCurricularPlan.getConclusionDate(cycleType); } public YearMonthDay calculateConclusionDate() { return getLastStudentCurricularPlan().getLastApprovementDate(); } public YearMonthDay calculateConclusionDate(final CycleType cycleType) { if (!getDegreeType().hasAnyCycleTypes()) { return calculateConclusionDate(); } if (!hasConcludedCycle(cycleType)) { throw new DomainException("Registration.hasnt.finished.given.cycle"); } final StudentCurricularPlan lastStudentCurricularPlan = getLastStudentCurricularPlan(); if (lastStudentCurricularPlan == null) { throw new DomainException("Registration.has.no.student.curricular.plan"); } return lastStudentCurricularPlan.calculateConclusionDate(cycleType); } final public String getConclusionProcessNotes() { return isRegistrationConclusionProcessed() ? getConclusionProcess().getNotes() : null; } final public DateTime getConclusionProcessCreationDateTime() { return isRegistrationConclusionProcessed() ? getConclusionProcess().getCreationDateTime() : null; } final public DateTime getConclusionProcessLastModificationDateTime() { return isRegistrationConclusionProcessed() ? getConclusionProcess().getLastModificationDateTime() : null; } final public String getGraduateTitle(final ProgramConclusion programConclusion, final Locale locale) { if (programConclusion.isConclusionProcessed(this)) { final ExecutionYear conclusionYear = programConclusion.groupFor(this).map(CurriculumGroup::getConclusionYear).orElse(null); return getLastDegreeCurricularPlan().getGraduateTitle(conclusionYear, programConclusion, locale); } throw new DomainException("Registration.hasnt.concluded.requested.cycle"); } final public boolean hasConcludedFirstCycle() { return hasConcludedCycle(CycleType.FIRST_CYCLE); } final public boolean hasConcludedSecondCycle() { return hasConcludedCycle(CycleType.SECOND_CYCLE); } final public boolean hasConcludedCycle(final CycleType cycleType) { return getLastStudentCurricularPlan().hasConcludedCycle(cycleType); } final public boolean hasConcludedCycle(final CycleType cycleType, final ExecutionYear executionYear) { return getLastStudentCurricularPlan().hasConcludedCycle(cycleType, executionYear); } public boolean hasConcluded() { final StudentCurricularPlan lastStudentCurricularPlan = getLastStudentCurricularPlan(); return lastStudentCurricularPlan.isConcluded(); } public boolean getHasConcluded() { return hasConcluded(); } final public Collection<CycleType> getConcludedCycles() { if (!getDegreeType().hasAnyCycleTypes()) { return Collections.EMPTY_SET; } final Collection<CycleType> result = new TreeSet<CycleType>(CycleType.COMPARATOR_BY_LESS_WEIGHT); for (final CycleType cycleType : getDegreeType().getCycleTypes()) { if (hasConcludedCycle(cycleType)) { result.add(cycleType); } } return result; } final public Collection<CycleCurriculumGroup> getConclusionProcessedCycles(final ExecutionYear executionYear) { final Collection<CycleCurriculumGroup> result = new HashSet<CycleCurriculumGroup>(); for (final CycleCurriculumGroup group : getLastStudentCurricularPlan().getInternalCycleCurriculumGrops()) { if (group.isConclusionProcessed() && group.getConclusionYear() == executionYear) { result.add(group); } } return result; } final public Collection<CycleType> getConcludedCycles(final ExecutionYear executionYear) { if (!getDegreeType().hasAnyCycleTypes()) { return Collections.emptySet(); } final Collection<CycleType> result = new TreeSet<CycleType>(CycleType.COMPARATOR_BY_LESS_WEIGHT); for (final CycleType cycleType : getDegreeType().getCycleTypes()) { if (hasConcludedCycle(cycleType, executionYear)) { result.add(cycleType); } } return result; } final public CycleType getCurrentCycleType() { return getCycleType(ExecutionYear.readCurrentExecutionYear()); } final public CycleType getCycleType(final ExecutionYear executionYear) { if (!isBolonha() || isEmptyDegree() || getDegreeType().isEmpty()) { return null; } final SortedSet<CycleType> concludedCycles = new TreeSet<CycleType>(getConcludedCycles(executionYear)); if (concludedCycles.isEmpty()) { CycleCurriculumGroup cycleGroup = getLastStudentCurricularPlan().getFirstOrderedCycleCurriculumGroup(); return cycleGroup != null ? cycleGroup.getCycleType() : null; } else { CycleType result = null; for (CycleType cycleType : concludedCycles) { final CycleCurriculumGroup group = getLastStudentCurricularPlan().getCycle(cycleType); if (group.hasEnrolment(executionYear)) { result = cycleType; } } if (result != null) { return result; } final CycleType last = concludedCycles.last(); return last.hasNext() && getDegreeType().hasCycleTypes(last.getNext()) ? last.getNext() : last; } } private boolean isEmptyDegree() { return (getLastStudentCurricularPlan() != null ? getLastStudentCurricularPlan().isEmpty() : true); } final public CycleType getLastConcludedCycleType() { final SortedSet<CycleType> concludedCycles = new TreeSet<CycleType>(getConcludedCycles()); return concludedCycles.isEmpty() ? null : concludedCycles.last(); } public boolean canRepeatConclusionProcess(Person person) { return AcademicAccessRule.isProgramAccessibleToFunction(AcademicOperationType.REPEAT_CONCLUSION_PROCESS, getDegree(), person.getUser()); } public void conclude(final CurriculumGroup curriculumGroup) { check(this, RegistrationPredicates.MANAGE_CONCLUSION_PROCESS); if (curriculumGroup == null || getStudentCurricularPlansSet().stream().noneMatch(scp -> scp.hasCurriculumModule (curriculumGroup))) { throw new DomainException("error.Registration.invalid.cycleCurriculumGroup"); } curriculumGroup.conclude(); ProgramConclusion conclusion = curriculumGroup.getDegreeModule().getProgramConclusion(); if (conclusion != null && conclusion.getTargetState() != null && !conclusion.getTargetState().equals(getActiveStateType())) { RegistrationState.createRegistrationState(this, AccessControl.getPerson(), new DateTime(), conclusion.getTargetState()); } } final public boolean hasApprovement(ExecutionYear executionYear) { int curricularYearInTheBegin = getCurricularYear(executionYear); int curricularYearAtTheEnd = getCurricularYear(executionYear.getNextExecutionYear()); if (curricularYearInTheBegin > curricularYearAtTheEnd) { throw new DomainException("Registration.curricular.year.has.decreased"); } return curricularYearAtTheEnd > curricularYearInTheBegin; } final public boolean isDegreeOrBolonhaDegreeOrBolonhaIntegratedMasterDegree() { return getDegreeType().isDegreeOrBolonhaDegreeOrBolonhaIntegratedMasterDegree(); } final public boolean isMasterDegreeOrBolonhaMasterDegree() { final DegreeType degreeType = getDegreeType(); return (degreeType.isPreBolonhaMasterDegree() || degreeType.isBolonhaMasterDegree()); } final public boolean isDEA() { return getDegreeType().isAdvancedSpecializationDiploma(); } final public EnrolmentModel getEnrolmentModelForCurrentExecutionYear() { return getEnrolmentModelForExecutionYear(ExecutionYear.readCurrentExecutionYear()); } final public EnrolmentModel getEnrolmentModelForExecutionYear(ExecutionYear year) { RegistrationDataByExecutionYear registrationData = getRegistrationDataByExecutionYear(year); return registrationData != null ? registrationData.getEnrolmentModel() : null; } final public void setEnrolmentModelForCurrentExecutionYear(EnrolmentModel model) { setEnrolmentModelForExecutionYear(ExecutionYear.readCurrentExecutionYear(), model); } final public void setEnrolmentModelForExecutionYear(ExecutionYear year, EnrolmentModel model) { RegistrationDataByExecutionYear registrationData = RegistrationDataByExecutionYear.getOrCreateRegistrationDataByYear(this, year); registrationData.setEnrolmentModel(model); } private RegistrationDataByExecutionYear getRegistrationDataByExecutionYear(ExecutionYear year) { for (RegistrationDataByExecutionYear registrationData : getRegistrationDataByExecutionYearSet()) { if (registrationData.getExecutionYear().equals(year)) { return registrationData; } } return null; } @Override final public ExecutionYear getRegistrationYear() { return super.getRegistrationYear() == null ? getFirstEnrolmentExecutionYear() : super.getRegistrationYear(); } final public boolean isFirstTime(ExecutionYear executionYear) { return getRegistrationYear() == executionYear; } final public boolean isFirstTime() { return isFirstTime(ExecutionYear.readCurrentExecutionYear()); } final public StudentCurricularPlan getStudentCurricularPlan(final ExecutionYear executionYear) { return executionYear == null ? getStudentCurricularPlan(new YearMonthDay()) : getStudentCurricularPlan(executionYear .getEndDateYearMonthDay()); } final public StudentCurricularPlan getStudentCurricularPlanForCurrentExecutionYear() { return getStudentCurricularPlan(ExecutionYear.readCurrentExecutionYear()); } final public StudentCurricularPlan getStudentCurricularPlan(final ExecutionSemester executionSemester) { return executionSemester == null ? getStudentCurricularPlan(new YearMonthDay()) : getStudentCurricularPlan(executionSemester .getEndDateYearMonthDay()); } final public StudentCurricularPlan getStudentCurricularPlan(final YearMonthDay date) { StudentCurricularPlan result = null; for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { final YearMonthDay startDate = studentCurricularPlan.getStartDateYearMonthDay(); if (!startDate.isAfter(date) && (result == null || startDate.isAfter(result.getStartDateYearMonthDay()))) { result = studentCurricularPlan; } } return result; } final public StudentCurricularPlan getStudentCurricularPlan(final DegreeCurricularPlan degreeCurricularPlan) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.getDegreeCurricularPlan().equals(degreeCurricularPlan)) { return studentCurricularPlan; } } return null; } final public StudentCurricularPlan getStudentCurricularPlan(final CycleType cycleType) { if (cycleType == null) { return getLastStudentCurricularPlan(); } return getStudentCurricularPlansSet().stream() .filter(scp -> scp.getRoot().getCycleCurriculumGroup(cycleType) != null) .max(StudentCurricularPlan.STUDENT_CURRICULAR_PLAN_COMPARATOR_BY_START_DATE) .orElse(getLastStudentCurricularPlan()); } final public Set<DegreeCurricularPlan> getDegreeCurricularPlans() { Set<DegreeCurricularPlan> result = new HashSet<DegreeCurricularPlan>(); for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { result.add(studentCurricularPlan.getDegreeCurricularPlan()); } return result; } @Override final public YearMonthDay getStartDate() { if (super.getStartDate() != null) { return super.getStartDate(); } if (getStudentCandidacy() != null) { return getStudentCandidacy().getActiveCandidacySituation().getSituationDate().toYearMonthDay(); } if (getRegistrationYear() != null) { return getRegistrationYear().getBeginDateYearMonthDay(); } return null; } final public ExecutionYear getStartExecutionYear() { return ExecutionYear.readByDateTime(getStartDate().toDateTimeAtMidnight()); } final public boolean hasStartedBeforeFirstBolonhaExecutionYear() { return getStartExecutionYear().isBefore(ExecutionYear.readFirstBolonhaExecutionYear()); } final public boolean hasStudentCurricularPlanInExecutionPeriod(ExecutionSemester executionSemester) { return getStudentCurricularPlan(executionSemester) != null; } final public boolean isCustomEnrolmentModel(final ExecutionYear executionYear) { return getEnrolmentModelForExecutionYear(executionYear) == EnrolmentModel.CUSTOM; } final public boolean isCustomEnrolmentModel() { return isCustomEnrolmentModel(ExecutionYear.readCurrentExecutionYear()); } final public boolean isCompleteEnrolmentModel(final ExecutionYear executionYear) { return getEnrolmentModelForExecutionYear(executionYear) == EnrolmentModel.COMPLETE; } final public boolean isCompleteEnrolmentModel() { return isCompleteEnrolmentModel(ExecutionYear.readCurrentExecutionYear()); } final public DegreeCurricularPlan getActiveDegreeCurricularPlan() { return (getActiveStudentCurricularPlan() != null ? getActiveStudentCurricularPlan().getDegreeCurricularPlan() : null); } final public DegreeCurricularPlan getLastDegreeCurricularPlan() { return (getLastStudentCurricularPlan() != null ? getLastStudentCurricularPlan().getDegreeCurricularPlan() : null); } public Degree getLastDegree() { return getLastDegreeCurricularPlan().getDegree(); } private boolean hasAnyNotPayedGratuityEvents() { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyNotPayedGratuityEvents()) { return true; } } return false; } private boolean hasAnyNotPayedInsuranceEvents() { for (final InsuranceEvent event : getPerson().getNotCancelledInsuranceEvents()) { if (event.isInDebt()) { return true; } } return false; } private boolean hasAnyNotPayedAdministrativeOfficeFeeAndInsuranceEvents(final AdministrativeOffice office) { for (final AdministrativeOfficeFeeAndInsuranceEvent event : getPerson() .getNotCancelledAdministrativeOfficeFeeAndInsuranceEvents(office)) { if (event.isInDebt()) { return true; } } return false; } private boolean hasAnyNotPayedGratuityEventUntil(final ExecutionYear executionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyNotPayedGratuityEventsUntil(executionYear)) { return true; } } return false; } private boolean hasAnyNotPayedInsuranceEventUntil(final ExecutionYear executionYear) { for (final InsuranceEvent event : getPerson().getNotCancelledInsuranceEventsUntil(executionYear)) { if (event.isInDebt()) { return true; } } return false; } private boolean hasAnyNotPayedAdministrativeOfficeFeeAndInsuranceEventUntil(final AdministrativeOffice office, final ExecutionYear executionYear) { for (final AdministrativeOfficeFeeAndInsuranceEvent event : getPerson() .getNotCancelledAdministrativeOfficeFeeAndInsuranceEventsUntil(office, executionYear)) { if (event.isInDebt()) { return true; } } return false; } public boolean hasAnyNotPayedGratuityEventsForPreviousYears(final ExecutionYear limitExecutionYear) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasAnyNotPayedGratuityEventsForPreviousYears(limitExecutionYear)) { return true; } } return false; } final public boolean hasToPayGratuityOrInsurance() { return getInterruptedStudies() ? false : getRegistrationProtocol().isToPayGratuity(); } final public DiplomaRequest getDiplomaRequest(final CycleType cycleType) { return getDiplomaRequest(getLastStudentCurricularPlan().getCycleCourseGroup(cycleType).getProgramConclusion()); } final public DiplomaRequest getDiplomaRequest(final ProgramConclusion programConclusion) { for (final DocumentRequest documentRequest : getDocumentRequests()) { if (documentRequest.isDiploma() && !documentRequest.finishedUnsuccessfully()) { final DiplomaRequest diplomaRequest = (DiplomaRequest) documentRequest; if (programConclusion == null || programConclusion.equals(diplomaRequest.getProgramConclusion())) { return diplomaRequest; } } } return null; } final public PastDiplomaRequest getPastDiplomaRequest() { for (final DocumentRequest documentRequest : getDocumentRequests()) { if (documentRequest.isPastDiploma() && !documentRequest.finishedUnsuccessfully()) { return (PastDiplomaRequest) documentRequest; } } return null; } final public RegistryDiplomaRequest getRegistryDiplomaRequest(final CycleType cycleType) { return getRegistryDiplomaRequest(getLastStudentCurricularPlan().getCycleCourseGroup(cycleType).getProgramConclusion()); } final public RegistryDiplomaRequest getRegistryDiplomaRequest(final ProgramConclusion programConclusion) { for (final DocumentRequest documentRequest : getDocumentRequests()) { if (documentRequest.isRegistryDiploma() && !documentRequest.finishedUnsuccessfully()) { final RegistryDiplomaRequest registryDiplomaRequest = (RegistryDiplomaRequest) documentRequest; if (programConclusion == null || programConclusion.equals(registryDiplomaRequest.getProgramConclusion())) { return registryDiplomaRequest; } } } return null; } final public DiplomaSupplementRequest getDiplomaSupplementRequest(final ProgramConclusion programConclusion) { for (final DocumentRequest documentRequest : getDocumentRequests()) { if (documentRequest.isDiplomaSupplement() && !documentRequest.finishedUnsuccessfully()) { final DiplomaSupplementRequest diplomaSupplementRequest = (DiplomaSupplementRequest) documentRequest; if (programConclusion == null || programConclusion.equals(diplomaSupplementRequest.getProgramConclusion())) { return diplomaSupplementRequest; } } } return null; } final public Collection<DocumentRequest> getDocumentRequests() { final Set<DocumentRequest> result = new HashSet<DocumentRequest>(); for (AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest.isDocumentRequest()) { result.add((DocumentRequest) academicServiceRequest); } } return result; } final public Set<DocumentRequest> getDocumentRequests(DocumentRequestType documentRequestType, AcademicServiceRequestSituationType academicServiceRequestSituationType, ExecutionYear executionYear, boolean collectDocumentsMarkedAsFreeProcessed) { final Set<DocumentRequest> result = new HashSet<DocumentRequest>(); for (final DocumentRequest documentRequest : getDocumentRequests()) { if (documentRequest.getDocumentRequestType() == documentRequestType && documentRequest.getAcademicServiceRequestSituationType() == academicServiceRequestSituationType && executionYear.containsDate(documentRequest.getCreationDate()) && (!collectDocumentsMarkedAsFreeProcessed || documentRequest.isFreeProcessed())) { result.add(documentRequest); } } return result; } final public Set<DocumentRequest> getSucessfullyFinishedDocumentRequestsBy(ExecutionYear executionYear, DocumentRequestType documentRequestType, boolean collectDocumentsMarkedAsFreeProcessed) { final Set<DocumentRequest> result = new HashSet<DocumentRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest instanceof DocumentRequest) { final DocumentRequest documentRequest = (DocumentRequest) academicServiceRequest; if (documentRequest.getDocumentRequestType() == documentRequestType && documentRequest.finishedSuccessfully() && executionYear.containsDate(documentRequest.getCreationDate()) && (!collectDocumentsMarkedAsFreeProcessed || documentRequest.isFreeProcessed())) { result.add((DocumentRequest) academicServiceRequest); } } } return result; } final public Collection<DocumentRequest> getSucessfullyFinishedDocumentRequests(final DocumentRequestType documentRequestType) { final Collection<DocumentRequest> result = new HashSet<DocumentRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest instanceof DocumentRequest) { final DocumentRequest documentRequest = (DocumentRequest) academicServiceRequest; if (documentRequest.getDocumentRequestType() == documentRequestType && documentRequest.finishedSuccessfully()) { result.add((DocumentRequest) academicServiceRequest); } } } return result; } final public Collection<? extends AcademicServiceRequest> getAcademicServiceRequests( final Class<? extends AcademicServiceRequest> clazz) { final Set<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (clazz != null && academicServiceRequest.getClass().equals(clazz)) { result.add(academicServiceRequest); } } return result; } public Collection<? extends AcademicServiceRequest> getAcademicServiceRequests( final Class<? extends AcademicServiceRequest> clazz, final ExecutionYear executionYear) { final Set<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (clazz != null && academicServiceRequest.getClass().equals(clazz) && academicServiceRequest.isFor(executionYear)) { result.add(academicServiceRequest); } } return result; } final public Collection<? extends AcademicServiceRequest> getAcademicServiceRequests( final AcademicServiceRequestSituationType academicServiceRequestSituationType) { final Set<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if ((academicServiceRequestSituationType == null && academicServiceRequest.isNewRequest()) || academicServiceRequest.getAcademicServiceRequestSituationType() == academicServiceRequestSituationType) { result.add(academicServiceRequest); } } return result; } final public Collection<AcademicServiceRequest> getNewAcademicServiceRequests() { return (Collection<AcademicServiceRequest>) getAcademicServiceRequests(AcademicServiceRequestSituationType.NEW); } final public Collection<AcademicServiceRequest> getProcessingAcademicServiceRequests() { final Collection<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest.hasProcessed() && !academicServiceRequest.isConcluded() && !academicServiceRequest.isDelivered() && !academicServiceRequest.finishedUnsuccessfully()) { result.add(academicServiceRequest); } } return result; } public Collection<AcademicServiceRequest> getToDeliverAcademicServiceRequests() { final Collection<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest.isDeliveredSituationAccepted()) { result.add(academicServiceRequest); } } return result; } final public Collection<AcademicServiceRequest> getConcludedAcademicServiceRequests() { return (Collection<AcademicServiceRequest>) getAcademicServiceRequests(AcademicServiceRequestSituationType.CONCLUDED); } final public Collection<AcademicServiceRequest> getHistoricalAcademicServiceRequests() { final Set<AcademicServiceRequest> result = new HashSet<AcademicServiceRequest>(); for (final AcademicServiceRequest academicServiceRequest : getAcademicServiceRequestsSet()) { if (academicServiceRequest.isHistorical()) { result.add(academicServiceRequest); } } return result; } final public boolean isInactive() { return getActiveStateType().isInactive(); } public Space getCampus() { return getLastStudentCurricularPlan().getLastCampus(); } public Space getCampus(final ExecutionYear executionYear) { final StudentCurricularPlan scp = getStudentCurricularPlan(executionYear); return scp == null ? getLastStudentCurricularPlan().getCampus(executionYear) : scp.getCampus(executionYear); } final public String getIstUniversity() { return getCampus().getName(); } @Override final public void setStudentCandidacy(StudentCandidacy studentCandidacy) { if (getStudentCandidacy() != null) { throw new DomainException( "error.org.fenixedu.academic.domain.student.Registration.studentCandidacy.cannot.be.modified"); } super.setStudentCandidacy(studentCandidacy); } final public void removeStudentCandidacy() { super.setStudentCandidacy(null); } final public Boolean getPayedTuition() { return !hasAnyNotPayedGratuityEventsForPreviousYears(ExecutionYear.readCurrentExecutionYear()); } final public boolean getHasGratuityDebtsCurrently() { return hasGratuityDebtsCurrently(); } final public boolean hasGratuityDebtsCurrently() { return hasAnyNotPayedGratuityEvents(); } final public boolean hasInsuranceDebtsCurrently() { return hasAnyNotPayedInsuranceEvents(); } final public boolean hasAdministrativeOfficeFeeAndInsuranceDebtsCurrently(final AdministrativeOffice administrativeOffice) { return hasAnyNotPayedAdministrativeOfficeFeeAndInsuranceEvents(administrativeOffice); } final public boolean hasGratuityDebts(final ExecutionYear executionYear) { return hasAnyNotPayedGratuityEventUntil(executionYear); } final public boolean hasInsuranceDebts(final ExecutionYear executionYear) { return hasAnyNotPayedInsuranceEventUntil(executionYear); } final public boolean hasAdministrativeOfficeFeeAndInsuranceDebts(final AdministrativeOffice office, final ExecutionYear executionYear) { return hasAnyNotPayedAdministrativeOfficeFeeAndInsuranceEventUntil(office, executionYear); } final public Attends readAttendByExecutionCourse(ExecutionCourse executionCourse) { return getStudent().readAttendByExecutionCourse(executionCourse); } final public Attends readRegistrationAttendByExecutionCourse(final ExecutionCourse executionCourse) { for (final Attends attend : this.getAssociatedAttendsSet()) { if (attend.isFor(executionCourse)) { return attend; } } return null; } @Override public void setRegistrationProtocol(RegistrationProtocol registrationProtocol) { if (registrationProtocol == null) { registrationProtocol = RegistrationProtocol.getDefault(); } super.setRegistrationProtocol(registrationProtocol); if (registrationProtocol != null && registrationProtocol.isEnrolmentByStudentAllowed() && !registrationProtocol.isAlien() && getExternalRegistrationData() == null) { new ExternalRegistrationData(this); } } final public boolean hasGratuityEvent(final ExecutionYear executionYear, final Class<? extends GratuityEvent> type) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { if (studentCurricularPlan.hasGratuityEvent(executionYear, type)) { return true; } } return false; } final public boolean hasDissertationThesis() { return getDissertationEnrolment() != null && getDissertationEnrolment().getThesis() != null; } final public String getDissertationThesisTitle() { String result = null; if (hasDissertationThesis()) { result = getDissertationEnrolment().getThesis().getFinalFullTitle().getContent().trim(); } return result; } final public LocalDate getDissertationThesisDiscussedDate() { if (hasDissertationThesis()) { final Thesis thesis = getDissertationEnrolment().getThesis(); return thesis.hasCurrentDiscussedDate() ? thesis.getCurrentDiscussedDate().toLocalDate() : null; } return null; } final public Enrolment getDissertationEnrolment() { return getDissertationEnrolment(null); } final public Enrolment getDissertationEnrolment(DegreeCurricularPlan degreeCurricularPlan) { for (StudentCurricularPlan scp : getStudentCurricularPlansSet()) { if (degreeCurricularPlan != null && scp.getDegreeCurricularPlan() != degreeCurricularPlan) { continue; } Enrolment enrolment = scp.getLatestDissertationEnrolment(); if (enrolment != null) { return enrolment; } } return null; } public Set<Enrolment> getDissertationEnrolments(DegreeCurricularPlan degreeCurricularPlan) { final Set<Enrolment> enrolments = new HashSet<Enrolment>(); for (StudentCurricularPlan scp : getStudentCurricularPlansSet()) { if (degreeCurricularPlan != null && scp.getDegreeCurricularPlan() != degreeCurricularPlan) { continue; } enrolments.addAll(scp.getDissertationEnrolments()); } return enrolments; } final public StudentCurricularPlan getLastStudentDegreeCurricularPlansByDegree(Degree degree) { final SortedSet<StudentCurricularPlan> result = new TreeSet<StudentCurricularPlan>(StudentCurricularPlan.DATE_COMPARATOR); for (DegreeCurricularPlan degreeCurricularPlan : this.getDegreeCurricularPlans()) { if (degreeCurricularPlan.getDegree() == degree) { result.add(this.getStudentCurricularPlan(degreeCurricularPlan)); } } return result.last(); } final public ExternalEnrolment findExternalEnrolment(Unit university, ExecutionSemester period, String code) { for (final ExternalEnrolment externalEnrolment : this.getExternalEnrolmentsSet()) { if (externalEnrolment.getExecutionPeriod() == period && externalEnrolment.getExternalCurricularCourse().getCode().equals(code) && externalEnrolment.getExternalCurricularCourse().getUnit() == university) { return externalEnrolment; } } return null; } final public SortedSet<ExternalEnrolment> getSortedExternalEnrolments() { final SortedSet<ExternalEnrolment> result = new TreeSet<ExternalEnrolment>(ExternalEnrolment.COMPARATOR_BY_NAME); result.addAll(getExternalEnrolmentsSet()); return result; } public Registration getSourceRegistrationForTransition() { if (getLastDegreeCurricularPlan().getEquivalencePlan() == null) { return null; } final DegreeCurricularPlanEquivalencePlan equivalencePlan = getLastDegreeCurricularPlan().getEquivalencePlan(); final List<Registration> registrations = getStudent().getRegistrationsFor(equivalencePlan.getSourceDegreeCurricularPlan()); return registrations.isEmpty() ? null : registrations.iterator().next(); } public List<Registration> getTargetTransitionRegistrations() { final List<Registration> result = new ArrayList<Registration>(); for (final DegreeCurricularPlanEquivalencePlan equivalencePlan : getLastDegreeCurricularPlan() .getTargetEquivalencePlans()) { final Registration transitionRegistration = getStudent().getTransitionRegistrationFor(equivalencePlan.getDegreeCurricularPlan()); if (transitionRegistration != null) { result.add(transitionRegistration); } } return result; } public void transitToBolonha(final Person person, final DateTime when) { if (!isActive()) { throw new DomainException("error.student.Registration.cannot.transit.non.active.registrations"); } RegistrationState.createRegistrationState(this, person, when, RegistrationStateType.TRANSITED); for (final Registration registration : getTargetTransitionRegistrations()) { if (registration.getDegreeType().isBolonhaDegree()) { RegistrationState.createRegistrationState(registration, person, when, registration.hasConcluded() ? RegistrationStateType.CONCLUDED : RegistrationStateType.REGISTERED); } else { RegistrationState.createRegistrationState(registration, person, when, RegistrationStateType.REGISTERED); } registration.setRegistrationProtocol(getRegistrationProtocol()); registration.setSourceRegistration(this); changeAttends(registration, when); } if (!getTargetTransitionRegistrations().isEmpty()) { // change remaining attends to any target transition registration changeAttends(getTargetTransitionRegistrations().iterator().next(), when); } } private void changeAttends(final Registration newRegistration, final DateTime when) { final ExecutionSemester executionSemester = ExecutionSemester.readByDateTime(when); if (executionSemester == null) { throw new DomainException("error.Registration.invalid.when.date"); } for (final Attends attends : getAssociatedAttendsSet()) { if (attends.getExecutionPeriod().isAfterOrEquals(executionSemester)) { for (final CurricularCourse curricularCourse : attends.getExecutionCourse().getAssociatedCurricularCoursesSet()) { if (curricularCourse.getDegreeCurricularPlan() == newRegistration.getLastDegreeCurricularPlan()) { attends.setRegistration(newRegistration); break; } } } } } public boolean isEnrolmentByStudentAllowed() { return isActive() && getRegistrationProtocol().isEnrolmentByStudentAllowed(); } @Deprecated public boolean isEnrolmentByStudentAllowed(DegreeType type) { return DEGREE_TYPES_TO_ENROL_BY_STUDENT.test(type); } public boolean isEnrolmentByStudentInShiftsAllowed() { return isActive(); } public void editStartDates(final LocalDate startDate, final LocalDate homologationDate, final LocalDate studiesStartDate) { editStartDates(new YearMonthDay(startDate), new YearMonthDay(homologationDate), new YearMonthDay(studiesStartDate)); } public void editStartDates(final YearMonthDay startDate, final YearMonthDay homologationDate, final YearMonthDay studiesStartDate) { setStartDate(startDate); // edit RegistrationState start date final RegistrationState firstRegistrationState = getFirstRegistrationState(); firstRegistrationState.setStateDate(startDate); if (firstRegistrationState != getFirstRegistrationState()) { throw new DomainException("error.Registration.startDate.changes.first.registration.state"); } // edit Scp start date final StudentCurricularPlan first = getFirstStudentCurricularPlan(); first.setStartDate(startDate); if (first != getFirstStudentCurricularPlan()) { throw new DomainException("error.Registration.startDate.changes.first.scp"); } setHomologationDate(homologationDate); setStudiesStartDate(studiesStartDate); } @Override public void setStartDate(YearMonthDay startDate) { String[] args = {}; if (startDate == null) { throw new DomainException("error.Registration.null.startDate", args); } super.setStartDate(startDate); final ExecutionYear year = ExecutionYear.readByDateTime(startDate.toLocalDate()); String[] args1 = {}; if (year == null) { throw new DomainException("error.Registration.invalid.execution.year", args1); } setRegistrationYear(year); } @Atomic public StudentStatute grantSeniorStatute(ExecutionYear executionYear) { return new SeniorStatute(getStudent(), this, StatuteType.findSeniorStatuteType().orElse(null), executionYear.getFirstExecutionPeriod(), executionYear.getLastExecutionPeriod()); } public void setHomologationDate(final LocalDate homologationDate) { setHomologationDate(new YearMonthDay(homologationDate)); } public void setStudiesStartDate(final LocalDate studiesStartDate) { setStudiesStartDate(new YearMonthDay(studiesStartDate)); } public Collection<CurriculumLineLog> getCurriculumLineLogs(final ExecutionSemester executionSemester) { final Collection<CurriculumLineLog> res = new HashSet<CurriculumLineLog>(); for (final CurriculumLineLog curriculumLineLog : getCurriculumLineLogsSet()) { if (curriculumLineLog.isFor(executionSemester)) { res.add(curriculumLineLog); } } return res; } public boolean containsEnrolmentOutOfPeriodEventFor(ExecutionSemester executionSemester) { for (final StudentCurricularPlan studentCurricularPlan : getStudentCurricularPlansSet()) { for (final EnrolmentOutOfPeriodEvent event : studentCurricularPlan.getEnrolmentOutOfPeriodEventsSet()) { if (event.getExecutionPeriod() == executionSemester) { return true; } } } return false; } public boolean hasStartedBetween(final ExecutionYear firstExecutionYear, final ExecutionYear finalExecutionYear) { return getStartExecutionYear().isAfterOrEquals(firstExecutionYear) && getStartExecutionYear().isBeforeOrEquals((finalExecutionYear)); } public boolean hasRegistrationRegime(final ExecutionYear executionYear, final RegistrationRegimeType type) { for (final RegistrationRegime regime : getRegistrationRegimesSet()) { if (regime.isFor(executionYear) && regime.hasRegime(type)) { return true; } } return false; } public RegistrationRegimeType getRegimeType(final ExecutionYear executionYear) { for (final RegistrationRegime regime : getRegistrationRegimesSet()) { if (regime.isFor(executionYear)) { return regime.getRegimeType(); } } // if not specified, use the default regime return RegistrationRegimeType.defaultType(); } public boolean isPartialRegime(final ExecutionYear executionYear) { return getRegimeType(executionYear) == RegistrationRegimeType.PARTIAL_TIME; } public boolean isFullRegime(final ExecutionYear executionYear) { return getRegimeType(executionYear) == RegistrationRegimeType.FULL_TIME; } public void changeShifts(final Attends attend, final Registration newRegistration) { for (final Shift shift : getShiftsSet()) { if (attend.isFor(shift)) { shift.removeStudents(this); shift.addStudents(newRegistration); } } } public boolean hasMissingPersonalInformation(ExecutionYear executionYear) { // If this registration is linked to a Phd Process, // the personal information should be linked to the // PhdIndividualProgramProcess only. if (getPhdIndividualProgramProcess() != null) { return false; } if (getPrecedentDegreeInformation(executionYear) != null && getPersonalInformationBean(executionYear).isValid()) { return false; } return true; } public boolean hasMissingPersonalInformationForAcademicService(ExecutionYear executionYear) { // If this registration is linked to a Phd Process, // the personal information should be linked to the // PhdIndividualProgramProcess only. if (getPhdIndividualProgramProcess() != null) { return false; } if (getPrecedentDegreeInformation(executionYear) != null && !getPersonalInformationBean(executionYear).isEditableByAcademicService()) { return false; } return true; } @Atomic public void createReingression(ExecutionYear executionYear, LocalDate reingressionDate) { RegistrationDataByExecutionYear dataByYear = RegistrationDataByExecutionYear.getOrCreateRegistrationDataByYear(this, executionYear); dataByYear.createReingression(reingressionDate); } public boolean hasReingression(ExecutionYear executionYear) { RegistrationDataByExecutionYear data = getRegistrationDataByExecutionYear(executionYear); if (data != null) { return data.isReingression(); } return false; } public Set<RegistrationDataByExecutionYear> getReingressions() { Set<RegistrationDataByExecutionYear> reingressions = new HashSet<RegistrationDataByExecutionYear>(); for (RegistrationDataByExecutionYear year : getRegistrationDataByExecutionYearSet()) { if (year.isReingression()) { reingressions.add(year); } } return reingressions; } @Atomic public void deleteReingression(ExecutionYear executionYear) { RegistrationDataByExecutionYear dataByExecutionYear = getRegistrationDataByExecutionYear(executionYear); if ((dataByExecutionYear == null) || (dataByExecutionYear.getExecutionYear() != executionYear)) { throw new DomainException("error.Registration.reingression.not.marked.in.execution.year"); } dataByExecutionYear.deleteReingression(); } public PersonalInformationBean getPersonalInformationBean(ExecutionYear executionYear) { PrecedentDegreeInformation precedentInformation = getPrecedentDegreeInformation(executionYear); if (precedentInformation == null) { precedentInformation = getLatestPrecedentDegreeInformation(); } if (precedentInformation == null) { return new PersonalInformationBean(this); } return new PersonalInformationBean(precedentInformation); } public PrecedentDegreeInformation getPrecedentDegreeInformation(ExecutionYear executionYear) { for (PrecedentDegreeInformation precedentDegreeInfo : getPrecedentDegreesInformationsSet()) { if (precedentDegreeInfo.getPersonalIngressionData().getExecutionYear().equals(executionYear)) { return precedentDegreeInfo; } } return null; } public PrecedentDegreeInformation getLatestPrecedentDegreeInformation() { TreeSet<PrecedentDegreeInformation> degreeInformations = new TreeSet<PrecedentDegreeInformation>( Collections.reverseOrder(PrecedentDegreeInformation.COMPARATOR_BY_EXECUTION_YEAR)); ExecutionYear currentExecutionYear = ExecutionYear.readCurrentExecutionYear(); for (PrecedentDegreeInformation pdi : getPrecedentDegreesInformationsSet()) { if (!pdi.getExecutionYear().isAfter(currentExecutionYear)) { degreeInformations.add(pdi); } } if (degreeInformations.isEmpty()) { return null; } return degreeInformations.iterator().next(); } public int getNumberEnroledCurricularCoursesInCurrentYear() { return getLastStudentCurricularPlan() == null ? 0 : getLastStudentCurricularPlan().countEnrolments( ExecutionYear.readCurrentExecutionYear()); } public List<CycleCurriculumGroup> getInternalCycleCurriculumGrops() { return getLastStudentCurricularPlan().getInternalCycleCurriculumGrops(); } public Collection<CurriculumGroup> getAllCurriculumGroups() { Collection<CurriculumGroup> result = new TreeSet<CurriculumGroup>(CurriculumGroup.COMPARATOR_BY_NAME_AND_ID); for (final StudentCurricularPlan plan : getStudentCurricularPlansSet()) { result.addAll(plan.getAllCurriculumGroups()); } return result; } public Collection<CurriculumGroup> getAllCurriculumGroupsWithoutNoCourseGroupCurriculumGroups() { Collection<CurriculumGroup> result = new TreeSet<CurriculumGroup>(CurriculumGroup.COMPARATOR_BY_NAME_AND_ID); for (final StudentCurricularPlan plan : getStudentCurricularPlansSet()) { result.addAll(plan.getAllCurriculumGroupsWithoutNoCourseGroupCurriculumGroups()); } return result; } public Boolean hasIndividualCandidacyFor(final ExecutionYear executionYear) { return getIndividualCandidacy() != null && getIndividualCandidacy().getCandidacyProcess().getCandidacyExecutionInterval().equals(executionYear); } public void updateEnrolmentDate(final ExecutionYear executionYear) { final RegistrationDataByExecutionYear registrationData = RegistrationDataByExecutionYear.getOrCreateRegistrationDataByYear(this, executionYear); final Collection<Enrolment> executionYearEnrolments = getEnrolments(executionYear); if (executionYearEnrolments.isEmpty()) { registrationData.setEnrolmentDate(null); } else if (registrationData.getEnrolmentDate() == null) { final Enrolment firstEnrolment = Collections.min(executionYearEnrolments, new Comparator<Enrolment>() { @Override public int compare(Enrolment left, Enrolment right) { return left.getCreationDateDateTime().compareTo(right.getCreationDateDateTime()); } }); registrationData.edit(firstEnrolment.getCreationDateDateTime().toLocalDate()); } } public void exportValues(StringBuilder result) { Formatter formatter = new Formatter(result); final Student student = getStudent(); formatter.format("%s: %s\n", BundleUtil.getString(Bundle.ACADEMIC, "label.ingression"), getIngressionType() == null ? " - " : getIngressionType().getDescription().getContent()); formatter.format("%s: %d\n", BundleUtil.getString(Bundle.ACADEMIC, "label.studentNumber"), student.getNumber()); formatter.format("%s: %s\n", BundleUtil.getString(Bundle.ACADEMIC, "label.Student.Person.name"), student.getPerson() .getName()); formatter.format("%s: %s\n", BundleUtil.getString(Bundle.ACADEMIC, "label.degree"), getDegree().getPresentationName()); formatter.close(); } public RegistrationState getLastActiveState() { List<RegistrationState> activeStateList = new ArrayList<RegistrationState>(); CollectionUtils.select(getRegistrationStatesSet(), new Predicate() { @Override public boolean evaluate(Object arg0) { return ((RegistrationState) arg0).getStateType().isActive(); } }, activeStateList); return !activeStateList.isEmpty() ? Collections.max(activeStateList, RegistrationState.DATE_COMPARATOR) : null; } public boolean hasDissertationEnrolment(final ExecutionDegree executionDegree) { final ExecutionYear previousExecutionYear = executionDegree.getExecutionYear(); if (previousExecutionYear.hasNextExecutionYear()) { final ExecutionYear executionYear = previousExecutionYear.getNextExecutionYear(); for (final Attends attends : getAssociatedAttendsSet()) { if (attends.getExecutionYear() == executionYear && attends.getEnrolment() != null) { final Enrolment enrolment = attends.getEnrolment(); if (enrolment.isDissertation() && enrolment.getDegreeCurricularPlanOfDegreeModule() == executionDegree.getDegreeCurricularPlan()) { return true; } } } } return false; } public boolean isValidForRAIDES() { return FenixEduAcademicConfiguration.getConfiguration().getRaidesRequestInfo() && isActive() && isBolonha() && !getDegreeType().isEmpty() && getRegistrationProtocol().isForOfficialMobilityReporting(); } }