private RuleResult hasAnyCurricularCoursesToEnrolInPreviousYears(final EnrolmentContext enrolmentContext,
final Map<Integer, Set<CurricularCourse>> curricularCoursesToEnrolByYear,
final Map<Integer, Set<CurricularCourse>> curricularCoursesToEnrolByYearWithTemporaries,
final IDegreeModuleToEvaluate sourceDegreeModuleToEvaluate) {
RuleResult result = RuleResult.createTrue(sourceDegreeModuleToEvaluate.getDegreeModule());
for (final IDegreeModuleToEvaluate degreeModuleToEvaluate : enrolmentContext
.getAllChildDegreeModulesToEvaluateFor(sourceDegreeModuleToEvaluate.getDegreeModule())) {
if (degreeModuleToEvaluate.isLeaf()) {
if (degreeModuleToEvaluate.isAnnualCurricularCourse(enrolmentContext.getExecutionPeriod().getExecutionYear())
&& degreeModuleToEvaluate.getContext() == null) {
continue;
}
if (degreeModuleToEvaluate.getContext() == null) {
throw new DomainException("error.degreeModuleToEvaluate.has.invalid.context",
degreeModuleToEvaluate.getName(), degreeModuleToEvaluate.getExecutionPeriod().getQualifiedName());
}
if (hasCurricularCoursesToEnrolInPreviousYears(curricularCoursesToEnrolByYearWithTemporaries,
degreeModuleToEvaluate.getContext().getCurricularYear())) {
if (degreeModuleToEvaluate.isEnroled()) {
result = result.and(createImpossibleRuleResult(sourceDegreeModuleToEvaluate, degreeModuleToEvaluate));
} else {
result = result.and(createFalseRuleResult(sourceDegreeModuleToEvaluate, degreeModuleToEvaluate));
}
} else {
if (isAnyPreviousYearCurricularCoursesTemporary(curricularCoursesToEnrolByYear,
curricularCoursesToEnrolByYearWithTemporaries, degreeModuleToEvaluate.getContext()
.getCurricularYear())) {
result =
result.and(RuleResult.createTrue(EnrolmentResultType.TEMPORARY,
degreeModuleToEvaluate.getDegreeModule()));
}
}
}