- Модуль: socialnetwork
- Путь к файлу: ~/bitrix/modules/socialnetwork/lib/update/workgroupdeptsync.php
- Класс: BitrixSocialnetworkUpdateWorkgroupDeptSync
- Вызов: WorkgroupDeptSync::execute
public function execute(array &$result)
{
if (!(
Loader::includeModule('socialnetwork')
&& Loader::includeModule('intranet')
))
{
return false;
}
$return = false;
$params = Option::get('socialnetwork', 'workgroupdeptsync');
$params = ($params !== '' ? @unserialize($params, [ 'allowed_classes' => false ]) : []);
$params = (is_array($params) ? $params : []);
$countRemain = self::getCount();
if (empty($params))
{
$params = [
'number' => 0,
'count' => $countRemain,
];
}
if ($countRemain > 0)
{
$result['title'] = Loc::getMessage('FUPD_WORKGROUP_DEPT_SYNC_TITLE');
$result['progress'] = 1;
$result['steps'] = '';
$result['count'] = $params['count'];
$counter = 0;
$breakFlag = false;
$workgroupsToSync = Option::get('socialnetwork', 'workgroupsToSync');
$workgroupsToSync = ($workgroupsToSync !== '' ? @unserialize($workgroupsToSync, [ 'allowed_classes' => false ]) : []);
if (
is_array($workgroupsToSync)
&& !empty($workgroupsToSync)
)
{
$workgroupsToSync = self::reduceList($workgroupsToSync);
foreach ($workgroupsToSync as $workgroupData)
{
$workgroupId = $workgroupData['groupId'];
if ($breakFlag)
{
break;
}
$data = self::getUsers($workgroupId);
$userListPlus = (
isset($data['PLUS'])
&& is_array($data['PLUS'])
? $data['PLUS']
: []
);
$userListMinus = (
isset($data['MINUS'])
&& is_array($data['MINUS'])
? $data['MINUS']
: []
);
$oldRelationList = (
isset($data['OLD_RELATIONS'])
&& is_array($data['OLD_RELATIONS'])
? $data['OLD_RELATIONS']
: []
);
foreach ($userListMinus as $userId)
{
if (isset($oldRelationList[$userId]))
{
if ($counter >= self::STEP_SIZE)
{
$breakFlag = true;
break;
}
if (
isset($workgroupData['exclude'])
&& $workgroupData['exclude']
)
{
CSocNetUserToGroup::delete($oldRelationList[$userId]);
}
else
{
UserToGroup::changeRelationAutoMembership([
'RELATION_ID' => $oldRelationList[$userId],
'VALUE' => 'N',
]);
}
$counter++;
}
}
$changeList = [];
if (
!$breakFlag
&& !empty($userListPlus)
)
{
$memberList = [];
$res = UserToGroupTable::getList([
'filter' => [
'=GROUP_ID' => $workgroupId,
'@USER_ID' => $userListPlus,
'@ROLE' => UserToGroupTable::getRolesMember(),
],
'select' => [ 'ID', 'USER_ID' ],
]);
while ($relation = $res->fetch())
{
$memberList[] = $relation['USER_ID'];
}
$userListPlus = array_diff($userListPlus, $memberList);
if (!empty($userListPlus))
{
$res = UserToGroupTable::getList([
'filter' => [
'=GROUP_ID' => $workgroupId,
'@USER_ID' => $userListPlus,
'@ROLE' => [ UserToGroupTable::ROLE_REQUEST, UserToGroupTable::ROLE_BAN ],
'=AUTO_MEMBER' => 'N',
],
'select' => [ 'ID', 'USER_ID', 'GROUP_ID' ]
]);
while ($relation = $res->fetch())
{
if ($counter >= self::STEP_SIZE)
{
$breakFlag = true;
break;
}
$changeList[] = (int)$relation['USER_ID'];
UserToGroup::changeRelationAutoMembership([
'RELATION_ID' => (int)$relation['ID'],
'USER_ID' => (int)$relation['USER_ID'],
'GROUP_ID' => (int)$relation['GROUP_ID'],
'ROLE' => UserToGroupTable::ROLE_USER,
'VALUE' => 'Y',
]);
$counter++;
}
$addList = array_diff($userListPlus, $changeList);
if (!$breakFlag)
{
foreach ($addList as $addUserId)
{
if ($counter >= self::STEP_SIZE)
{
$breakFlag = true;
break;
}
UserToGroup::addRelationAutoMembership([
'CURRENT_USER_ID' => $workgroupData['initiatorId'],
'USER_ID' => $addUserId,
'GROUP_ID' => $workgroupId,
'ROLE' => UserToGroupTable::ROLE_USER,
'VALUE' => 'Y',
]);
$counter++;
}
}
}
}
CSocNetGroup::setStat($workgroupId);
}
$params['number'] += $counter;
Option::set('socialnetwork', 'workgroupdeptsync', serialize($params));
$return = true;
}
else
{
Option::delete('socialnetwork', [ 'name' => 'workgroupdeptsync' ]);
}
$result['progress'] = (int)($params['number'] * 100 / $params['count']);
$result['steps'] = $params['number'];
}
else
{
Option::delete('socialnetwork', [ 'name' => 'workgroupdeptsync' ]);
}
return $return;
}