• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_destination.php
  • Класс: CSocNetLogDestination
  • Вызов: CSocNetLogDestination::GetDestinationUsers
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;
}