• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/item/usertogroup.php
  • Класс: BitrixSocialnetworkItemUserToGroup
  • Вызов: UserToGroup::onAfterUserUpdate
static function onAfterUserUpdate(&$userFields): void
{
	if (!self::checkUF())
	{
		return;
	}

	if (
		(int)$userFields['ID'] <= 0
		|| !isset($userFields['UF_DEPARTMENT'])
		|| !ModuleManager::isModuleInstalled('intranet')
		|| !Loader::includeModule('iblock')
	)
	{
		return;
	}

	$oldGroupList = [];
	$oldGroupAutoList = [];
	$newGroupList = [];

	$res = UserToGroupTable::getList([
		'filter' => [
			'USER_ID' => (int)$userFields['ID']
		],
		'select' => [ 'GROUP_ID', 'AUTO_MEMBER' ]
	]);

	while($relation = $res->fetch())
	{
		$oldGroupList[] = $relation['GROUP_ID'];
		if ($relation['AUTO_MEMBER'] === 'Y')
		{
			$oldGroupAutoList[] = $relation['GROUP_ID'];
		}
	}
	$oldGroupList = array_unique($oldGroupList);
	$oldGroupAutoList = array_unique($oldGroupAutoList);

	if (
		!empty($userFields['UF_DEPARTMENT'])
		&& is_array($userFields['UF_DEPARTMENT'])
	)
	{
		$userFields['UF_DEPARTMENT'] = array_values($userFields['UF_DEPARTMENT']);
	}

	$departmentList = (
		!is_array($userFields['UF_DEPARTMENT'])
		|| empty($userFields['UF_DEPARTMENT'])
		|| (int)$userFields['UF_DEPARTMENT'][0] <= 0
			? []
			: $userFields['UF_DEPARTMENT']
	);

	if (Loader::includeModule('intranet'))
	{
		$departmentList = array_merge($departmentList, CIntranetUtils::getSubordinateDepartments($userFields['ID'], false));
	}
	$departmentList = array_unique($departmentList);

	if (!empty($departmentList))
	{
		$newGroupList = self::getConnectedGroups($departmentList);
	}
	$groupListPlus = array_diff($newGroupList, $oldGroupList);
	$groupListMinus = array_diff($oldGroupAutoList, $newGroupList);
	$groupListMinus = array_diff($groupListMinus, $groupListPlus);

	if (!empty($groupListMinus))
	{
		$res = UserToGroupTable::getList([
			'filter' => [
				'=USER_ID' => (int)$userFields['ID'],
				'@GROUP_ID' => $groupListMinus,
				'@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
				'AUTO_MEMBER' => 'Y'
			],
			'select' => [ 'ID' ],
		]);
		while($relation = $res->fetch())
		{
			CSocNetUserToGroup::delete($relation['ID']);
		}
	}

	$changeList = $addList = $noChangeList = [];
	if (!empty($groupListPlus))
	{
		$res = UserToGroupTable::getList([
			'filter' => [
				'=USER_ID' => (int)$userFields["ID"],
				'@GROUP_ID' => $groupListPlus,
				'@ROLE' => [ UserToGroupTable::ROLE_OWNER, UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER ],
			],
			'select' => [ 'ID', 'GROUP_ID', 'AUTO_MEMBER' ],
		]);

		while ($relation = $res->fetch())
		{
			if (
				$relation['AUTO_MEMBER'] === 'Y'
				|| $relation['ROLE'] === UserToGroupTable::ROLE_OWNER
			)
			{
				$noChangeList[] = $relation['GROUP_ID'];
			}
			else // UserToGroupTable::ROLE_MODERATOR, UserToGroupTable::ROLE_USER, AUTO_MEMBER = 'N'
			{
				$noChangeList[] = $relation['GROUP_ID'];
				self::changeRelationAutoMembership([
					'RELATION_ID' => (int)$relation['ID'],
					'USER_ID' => (int)$userFields["ID"],
					'GROUP_ID' => (int)$relation['GROUP_ID'],
					'ROLE' => $relation['ROLE'],
					'VALUE' => 'Y',
					'NOTIFY' => 'N',
				]);
			}
		}

		$groupListPlus = array_diff($groupListPlus, $noChangeList);
	}

	if (!empty($groupListPlus))
	{
		$res = UserToGroupTable::getList([
			'filter' => [
				'=USER_ID' => (int)$userFields['ID'],
				'@GROUP_ID' => $groupListPlus,
				'@ROLE' => [ UserToGroupTable::ROLE_REQUEST, UserToGroupTable::ROLE_BAN ],
				'AUTO_MEMBER' => 'N',
			],
			'select' => [ 'ID', 'USER_ID', 'GROUP_ID' ],
		]);

		while ($relation = $res->fetch())
		{
			$changeList[] = (int)$relation['GROUP_ID'];
			self::changeRelationAutoMembership([
				'RELATION_ID' => (int)$relation['ID'],
				'USER_ID' => (int)$relation['USER_ID'],
				'GROUP_ID' => (int)$relation['GROUP_ID'],
				'ROLE' => UserToGroupTable::ROLE_USER,
				'VALUE' => 'Y',
			]);
		}
		$addList = array_diff($groupListPlus, $changeList);
	}

	foreach ($addList as $addGroupId)
	{
		self::addRelationAutoMembership([
			'USER_ID' => (int)$userFields['ID'],
			'GROUP_ID' => $addGroupId,
			'ROLE' => UserToGroupTable::ROLE_USER,
			'VALUE' => 'Y',
		]);
	}
}