ロール階層取得

in #side7apex5 years ago

ユーザより下の階層のロールに所属するユーザの取得

public with sharing class TestSFDC {

  public static Set<ID> getRoleSubordinateUsers(Id userId) {
    Id roleId = [select UserRoleId from User where Id = :userId].UserRoleId;
    Set<Id> allSubRoleIds = getAllSubRoleIds(new Set<ID>{roleId});
    Map<Id,User> users = new Map<Id, User>([Select Id, Name From User where  UserRoleId IN :allSubRoleIds]);
    return users.keySet();
  }

  private static Set<ID> getAllSubRoleIds(Set<ID> roleIds) {
    Set<ID> currentRoleIds = new Set<ID>();
    for(UserRole userRole :[select Id from UserRole where ParentRoleId  IN :roleIds AND ParentRoleID != null])
      currentRoleIds.add(userRole.Id);
    if(currentRoleIds.size() > 0)
      currentRoleIds.addAll(getAllSubRoleIds(currentRoleIds));
    return currentRoleIds;
  }
}

指定ユーザの上位ロールたどる

Set<ID> allSuperRoleIds = new Set<ID>();
Id userID = '00590000002sz4p';
Id roleId = [select UserRoleId from User where Id = :userId].UserRoleId;

while (roleId != Null){ 
    list<UserRole> ur = [select ParentRoleId from UserRole where Id = :roleId];
    if(ur.size() > 0 && ur[0].ParentRoleId  != null){
        roleId = ur[0].ParentRoleId ;
        allSuperRoleIds.add(roleId);
        System.debug('###### roleId'+ roleId);
    } else {
        break;
    }
}
Map<Id,User> users = new Map<Id, User>([Select Id, Name From User where UserRoleId IN :allSuperRoleIds]);
System.debug('############'+ allSuperRoleIds );
System.debug('############'+ users.keySet() );