@Atomic
  private static void deleteMaximumNumberOfCreditsForEnrolmentPeriod(
      final DegreeCurricularPlan input) {
    final List<? extends ICurricularRule> rules =
        input
            .getRoot()
            .getCurricularRules(
                CurricularRuleType.MAXIMUM_NUMBER_OF_CREDITS_FOR_ENROLMENT_PERIOD,
                (ExecutionYear) null);

    if (rules.size() > 1) {

      logger.error(
          "Update failed: found {} {} rules to update for DCP {}",
          rules.size(),
          MaximumNumberOfCreditsForEnrolmentPeriod.class.getSimpleName(),
          input.getPresentationName());

    } else if (!rules.isEmpty()) {

      final MaximumNumberOfCreditsForEnrolmentPeriod rule =
          (MaximumNumberOfCreditsForEnrolmentPeriod) rules.iterator().next();
      rule.delete();
      logger.warn(
          "Deleted {} for DCP {}",
          MaximumNumberOfCreditsForEnrolmentPeriod.class.getSimpleName(),
          input.getPresentationName());
    }
  }
  @Atomic
  private static void createEnrolmentPeriodRestrictions(final DegreeCurricularPlan input) {
    final RootCourseGroup root = input.getRoot();
    List<? extends ICurricularRule> rules =
        root.getCurricularRules(
            CurricularRuleType.ENROLMENT_PERIOD_RESTRICTIONS, (ExecutionYear) null);

    if (rules.isEmpty()) {

      new EnrolmentPeriodRestrictions(root, getBeginExecutionSemester(input, root));
      logger.info(
          "Created {} for DCP {}",
          EnrolmentPeriodRestrictions.class.getSimpleName(),
          input.getPresentationName());

    } else if (rules.size() > 1) {

      logger.error(
          "Possible error: found {} {} rules for DCP {}",
          rules.size(),
          EnrolmentPeriodRestrictions.class.getSimpleName(),
          input.getPresentationName());
    }
  }