• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/update/chatconfigconverter.php
  • Класс: BitrixImUpdateChatConfigConverter
  • Вызов: ChatConfigConverter::execute
public function execute(array &$option)
{
	if (!Loader::includeModule(self::$moduleId))
	{
		return false;
	}

	$configTruncate = Option::get(self::$moduleId, 'config_truncate', 'N');
	if ($configTruncate !== 'Y')
	{
		Option::set(self::$moduleId, 'migration_to_new_settings', 'N');

		$connection = Application::getConnection();
		$connection->query("TRUNCATE TABLE b_im_option_user");
		$connection->query("TRUNCATE TABLE b_im_option_state");
		$connection->query("TRUNCATE TABLE b_im_option_access");
		$connection->query("TRUNCATE TABLE b_im_option_group");

		Option::set(self::$moduleId, 'config_truncate', 'Y');
	}

	$params = Option::get(self::$moduleId, self::OPTION_NAME, '');
	$params = ($params !== '' ? @unserialize($params, ['allowed_classes' => false]) : []);
	$params = is_array($params) ? $params : [];

	$unconvertedUsers = Option::get(self::$moduleId, 'unconverted_settings_users', '');
	$unconvertedUsers = $unconvertedUsers !== '' ? @unserialize($unconvertedUsers, ['allowed_classes' => false]) : [];
	$unconvertedUsers = is_array($unconvertedUsers) ? $unconvertedUsers : [];

	if (empty($params))
	{
		Option::set(self::$moduleId, 'migration_to_new_settings', 'N');
		Configuration::cleanAllCache();
		$unconvertedUsers = [];

		$isIntranetIncluded = Loader::includeModule('intranet');

		$defaultGroupId = $this->getDefaultGroupId();
		if (!$defaultGroupId)
		{
			$defaultGroupId = $this->createDefaultPreset($isIntranetIncluded);
		}
		elseif ($isIntranetIncluded)
		{
			$this->updateDefaultAccessCode($defaultGroupId);
		}

		$userCount = UserTable::getCount([
			'=IS_REAL_USER' => 'Y'
		]);
		$convertedUserCount = OptionUserTable::getCount();

		$unconvertedUserCount = $userCount - $convertedUserCount;

		if ($unconvertedUserCount < 1)
		{
			if (empty($unconvertedUsers))
			{
				Option::delete(self::$moduleId, ['name' => 'unconverted_settings_users']);
			}

			Option::set(self::$moduleId, 'migration_to_new_settings', 'Y');
			Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);

			return false;
		}

		$params = [
			'lastId' => 0,
			'number' => 0,
			'defaultGroup' => $defaultGroupId,
			'includeIntranet' => $isIntranetIncluded,
			'count' => $unconvertedUserCount
		];
	}

	$query =
		UserTable::query()
			->addSelect('ID')
			->registerRuntimeField(
				'OPTION_USER',
				new Reference(
					'OPTION_USER',
					OptionUserTable::class,
					Join::on('this.ID', '=', 'ref.USER_ID'),
					['join_type' => Join::TYPE_LEFT]
				)
			)
			->where('IS_REAL_USER', 'Y')
			->where('OPTION_USER.USER_ID', null)
			->where('ID', '>', $params['lastId'])
			->setOrder(['ID' => 'ASC'])
			->setLimit(self::ITERATION_LIMIT)
	;

	$userIds = [];
	foreach ($query->exec() as $row)
	{
		$userIds[] = (int)$row['ID'];
	}

	if (empty($userIds))
	{
		if (empty($unconvertedUsers))
		{
			Option::delete(self::$moduleId, ['name' => 'unconverted_settings_users']);
		}

		Option::set(self::$moduleId, 'migration_to_new_settings', 'Y');
		Option::delete(self::$moduleId, ['name' => 'last_converted_user']);
		Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);

		return false;
	}

	$lastKeyId = array_key_last($userIds);
	$params['lastId']  = $userIds[$lastKeyId];

	foreach ($userIds as $userId)
	{
		try
		{
			$groupId = $this->isUserGroupExist($userId);
			if ($groupId)
			{
				$this->bindExistingGroupToUser($userId, $groupId, $params['defaultGroup']);

				continue;
			}
			$notifySettings = CUserOptions::GetOption('im', 'notify', [], $userId);
			$generalSettings = CUserOptions::GetOption('im', 'settings', [], $userId);

			if (empty($notifySettings) && empty($generalSettings))
			{
				OptionUserTable::add([
					'USER_ID' => $userId,
					'NOTIFY_GROUP_ID' => $params['defaultGroup'],
					'GENERAL_GROUP_ID' => $params['defaultGroup']
				]);
			}
			else
			{
				$this->createPersonalPreset($userId, $notifySettings, $generalSettings, $params['defaultGroup']);
			}
			$params['lastConvertedUser'] = $userId;
		}
		catch (Exception $e)
		{
			$unconvertedUsers[] = $userId;
		}
		$params['number']++;
	}

	$option['count'] = $params['count'];
	$option['progress'] = ($params['number'] * 100) / (int)$params['count'];
	$option['steps'] = $params['number'];

	Option::set(self::$moduleId, 'last_converted_user', $params['lastConvertedUser']);
	Option::set(self::$moduleId, 'unconverted_settings_users', serialize($unconvertedUsers));
	Option::set(self::$moduleId, self::OPTION_NAME, serialize($params));

	return true;

}