private static void buildTeacherServiceDistributionOptionEntriesRec(
      List<TeacherServiceDistributionDTOEntry> tsdOptionEntries,
      int level,
      TeacherServiceDistribution grouping,
      Person person,
      boolean testCoursesManagementGroupPermission,
      boolean testTeachersManagementGroupPermission,
      boolean testTeachersValuationManagerPermission,
      boolean testCoursesValuationManagerPermission) {

    if (person == null
        || (testCoursesValuationManagerPermission
            && grouping.isMemberOfCoursesValuationManagers(person))
        || (testTeachersValuationManagerPermission
            && grouping.isMemberOfTeachersValuationManagers(person))
        || (testCoursesManagementGroupPermission
            && grouping.isMemberOfCoursesManagementGroup(person))
        || (testTeachersManagementGroupPermission
            && grouping.isMemberOfTeachersManagementGroup(person))
        || grouping.getTSDProcessPhase().getTSDProcess().getHasSuperUserPermission(person)) {
      tsdOptionEntries.add(new TeacherServiceDistributionDTOEntry(grouping, level));
      person = null;
    }

    List<TeacherServiceDistribution> childsList =
        new ArrayList<TeacherServiceDistribution>(grouping.getChilds());
    Collections.sort(childsList, new BeanComparator("name"));

    for (TeacherServiceDistribution tsd : childsList) {
      buildTeacherServiceDistributionOptionEntriesRec(
          tsdOptionEntries,
          level + 1,
          tsd,
          person,
          testCoursesManagementGroupPermission,
          testTeachersManagementGroupPermission,
          testTeachersValuationManagerPermission,
          testCoursesValuationManagerPermission);
    }
  }