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;
}