@Override
protected RuleResult executeEnrolmentWithRulesAndTemporaryEnrolment(final ICurricularRule curricularRule,
final IDegreeModuleToEvaluate sourceDegreeModuleToEvaluate, final EnrolmentContext enrolmentContext) {
final RestrictionDoneDegreeModule rule = (RestrictionDoneDegreeModule) curricularRule;
final ExecutionSemester executionSemester = enrolmentContext.getExecutionPeriod();
if (!canApplyRule(enrolmentContext, rule)) {
return RuleResult.createNA(sourceDegreeModuleToEvaluate.getDegreeModule());
}
final CurricularCourse curricularCourse = rule.getPrecedenceDegreeModule();
if (isEnrolling(enrolmentContext, curricularCourse) || isEnroled(enrolmentContext, curricularCourse, executionSemester)) {
return RuleResult
.createFalse(
sourceDegreeModuleToEvaluate.getDegreeModule(),
"curricularRules.ruleExecutors.RestrictionDoneDegreeModuleExecutor.cannot.enrol.simultaneously.to.degreeModule.and.precedenceDegreeModule",
rule.getDegreeModuleToApplyRule().getName(), rule.getPrecedenceDegreeModule().getName());
}
if (isApproved(enrolmentContext, curricularCourse)) {
return RuleResult.createTrue(sourceDegreeModuleToEvaluate.getDegreeModule());
}
if (hasEnrolmentWithEnroledState(enrolmentContext, curricularCourse, executionSemester.getPreviousExecutionPeriod())) {
return RuleResult.createTrue(EnrolmentResultType.TEMPORARY, sourceDegreeModuleToEvaluate.getDegreeModule());
}
/*
* CurricularCourse is not approved and is not enroled in previous
* semester If DegreeModule is Enroled in current semester then
* Enrolment must be impossible
*/
if (isEnroled(enrolmentContext, rule.getDegreeModuleToApplyRule(), executionSemester)) {
return createImpossibleRuleResult(rule, sourceDegreeModuleToEvaluate);
}
return createFalseRuleResult(rule, sourceDegreeModuleToEvaluate);
}