@Atomic
  private Map<ExecutionDegree, Integer> setFirstYearShiftsCapacity(
      Boolean toBlock, ExecutionYear executionYear) {

    final ExecutionSemester executionSemester = executionYear.getFirstExecutionPeriod();

    final Map<Shift, Set<ExecutionDegree>> shiftsDegrees =
        new HashMap<Shift, Set<ExecutionDegree>>();
    final Set<Shift> shifts = new HashSet<Shift>();
    final Map<ExecutionDegree, Integer> modified = new HashMap<ExecutionDegree, Integer>();

    for (final Degree degree :
        Degree.readAllByDegreeType(
            DegreeType.BOLONHA_DEGREE, DegreeType.BOLONHA_INTEGRATED_MASTER_DEGREE)) {
      for (final DegreeCurricularPlan degreeCurricularPlan :
          degree.getActiveDegreeCurricularPlans()) {
        final ExecutionDegree executionDegree =
            degreeCurricularPlan.getExecutionDegreeByAcademicInterval(
                executionSemester.getExecutionYear().getAcademicInterval());

        if (executionDegree != null) {
          for (final SchoolClass schoolClass : executionDegree.getSchoolClassesSet()) {
            if (schoolClass.getAnoCurricular().equals(FIRST_CURRICULAR_YEAR)
                && schoolClass.getExecutionPeriod() == executionSemester) {
              for (final Shift shift : schoolClass.getAssociatedShiftsSet()) {
                Set<ExecutionDegree> executionDegrees = shiftsDegrees.get(shift);
                if (executionDegrees == null) {
                  executionDegrees = new HashSet<ExecutionDegree>();
                }
                executionDegrees.add(executionDegree);
                shiftsDegrees.put(shift, executionDegrees);
                shifts.add(shift);
              }
            }
          }
        }
      }
    }

    for (final Shift shift : shifts) {
      int capacity = shift.getLotacao().intValue();

      if (toBlock && capacity > 0) {
        shift.setLotacao(capacity * -1);
      } else if (!toBlock && capacity < 0) {
        shift.setLotacao(capacity * -1);
      } else {
        continue;
      }

      for (ExecutionDegree executionDegree : shiftsDegrees.get(shift)) {
        if (modified.containsKey(executionDegree)) {
          modified.put(executionDegree, modified.get(executionDegree) + 1);
        } else {
          modified.put(executionDegree, 1);
        }
      }
    }

    if (modified.size() > 0) {
      new FirstYearShiftsCapacityToggleLog(
          executionYear.getFirstExecutionPeriod(), Authenticate.getUser().getPerson().getUser());
    }

    return modified;
  }