static function GetDestinationUsers($accessCodes, $fetchUsers = false)
{
$userIds = [];
$users = [];
$fields = $fetchUsers
? ['ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL', 'PERSONAL_PHOTO', 'WORK_POSITION', 'EXTERNAL_AUTH_ID']
: ['ID'];
$usersToFetch = [];
if (is_array($accessCodes))
{
foreach($accessCodes as $code)
{
// All users
if ($code === 'UA')
{
$dbRes = CUser::GetList(
'ID',
'ASC',
['INTRANET_USERS' => true],
['FIELDS' => $fields]
);
while ($user = $dbRes->Fetch())
{
if (array_key_exists($user['ID'], $userIds))
{
continue;
}
$userIds[$user['ID']] = $user['ID'];
if ($fetchUsers)
{
$user['USER_ID'] = $user['ID'];
$users[] = $user;
}
}
break;
}
elseif (mb_substr($code, 0, 1) === 'U')
{
$userId = (int)mb_substr($code, 1);
if (!array_key_exists($userId, $userIds))
{
$usersToFetch[] = $userId;
if (!$fetchUsers)
{
$userIds[$userId] = $userId;
}
}
}
elseif (mb_substr($code, 0, 2) === 'SG')
{
$groupId = intval(mb_substr($code, 2));
$isProjectRoles = preg_match('/^SG([0-9]+)_?([AEKMO])?$/', $code, $match) && isset($match[2]);
if ($isProjectRoles)
{
// todo remove after new system the project roles.
list($users, $userIds) = self::getUsersByRole($groupId, $match[2], $users, $userIds);
continue;
}
$dbMembers = CSocNetUserToGroup::GetList(
["RAND" => "ASC"],
["GROUP_ID" => $groupId, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y"],
false,
false,
["ID", "USER_ID", "ROLE", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "USER_EMAIL", "USER_PERSONAL_PHOTO", "USER_WORK_POSITION"]
);
if ($dbMembers)
{
while ($user = $dbMembers->GetNext())
{
if (array_key_exists($user['USER_ID'], $userIds))
{
continue;
}
$userIds[$user['USER_ID']] = $user["USER_ID"];
$users[] = [
'ID' => $user["USER_ID"],
'USER_ID' => $user["USER_ID"],
'LOGIN' => $user["USER_LOGIN"],
'NAME' => $user["USER_NAME"],
'LAST_NAME' => $user["USER_LAST_NAME"],
'SECOND_NAME' => $user["USER_SECOND_NAME"],
'EMAIL' => $user["USER_EMAIL"],
'PERSONAL_PHOTO' => $user["USER_PERSONAL_PHOTO"],
'WORK_POSITION' => $user["USER_WORK_POSITION"]
];
}
}
}
elseif (mb_substr($code, 0, 2) === 'DR')
{
$depId = (int)mb_substr($code, 2);
$res = BitrixIntranetUtil::getDepartmentEmployees([
'DEPARTMENTS' => $depId,
'RECURSIVE' => 'Y',
'ACTIVE' => 'Y',
'SELECT' => $fields
]);
while ($user = $res->Fetch())
{
if (!array_key_exists($user['ID'], $userIds))
{
$userIds[$user['ID']] = $user['ID'];
if ($fetchUsers)
{
$user['USER_ID'] = $user['ID'];
$users[] = $user;
}
}
}
}
}
}
if (
!empty($usersToFetch)
&& $fetchUsers
)
{
$usersToFetch = array_chunk(array_values($usersToFetch), self::USERS_STEP_COUNT);
foreach ($usersToFetch as $chunk)
{
$usersRes = BitrixMainUserTable::getList([
'select' => $fields,
'filter' => [
'@ID' => array_values($chunk)
],
'order' => [
'ID' => 'ASC'
]
])->fetchAll();
foreach ($usersRes as $user)
{
if (array_key_exists($user['ID'], $userIds))
{
continue;
}
$userIds[$user['ID']] = $user['ID'];
$user['USER_ID'] = $user['ID'];
$users[] = $user;
}
}
}
return $fetchUsers ? $users : $userIds;
}