25 if (isset($cache[$workgroupId]))
27 return $cache[$workgroupId];
33 'OLD_RELATIONS' => [],
37 !Loader::includeModule(
'socialnetwork')
38 || !Loader::includeModule(
'intranet')
46 $oldRelationList = [];
48 $groupItem = GroupRegistry::getInstance()->get($workgroupId);
49 if ($groupItem ===
null)
54 $groupFields = $groupItem->getFields();
57 isset($groupFields[
'UF_SG_DEPT'][
'VALUE'])
58 && !empty($groupFields[
'UF_SG_DEPT'][
'VALUE'])
61 $newDeptList = array_map(
'intval', $groupFields[
'UF_SG_DEPT'][
'VALUE']);
63 $res = \CIntranetUtils::getDepartmentEmployees($newDeptList,
true,
false,
'Y', [
'ID' ]);
64 while ($departmentMember =
$res->fetch())
66 if ((
int)$departmentMember[
'ID'] !== (
int)$groupFields[
'OWNER_ID'])
68 $newUserList[] = (int)$departmentMember[
'ID'];
72 foreach ($newDeptList as $deptId)
74 $managerId = (int)\CIntranetUtils::getDepartmentManagerId($deptId);
77 $newUserList[] = $managerId;
82 $res = UserToGroupTable::getList([
84 '=GROUP_ID' => (
int) ($groupFields[
'ID'] ?? 0),
86 '=AUTO_MEMBER' =>
'Y',
88 'select' => [
'ID',
'USER_ID' ]
90 while ($relation =
$res->fetch())
92 $oldUserList[] = (int)$relation[
'USER_ID'];
93 $oldRelationList[$relation[
'USER_ID']] = $relation[
'ID'];
97 $res = UserToGroupTable::getList([
99 '=GROUP_ID' => (
int)$groupFields[
'ID'],
102 'select' => [
'ID',
'USER_ID' ]
104 while ($relation =
$res->fetch())
106 $membersList[] = (int)$relation[
'USER_ID'];
110 'PLUS' => array_unique(array_diff($newUserList, $membersList)),
111 'MINUS' => array_unique(array_diff($oldUserList, $newUserList)),
112 'OLD_RELATIONS' => $oldRelationList,
115 $cache[$workgroupId] =
$result;
124 $workgroupsToSync = Option::get(
'socialnetwork',
'workgroupsToSync');
125 $workgroupsToSync = ($workgroupsToSync !==
'' ? @unserialize($workgroupsToSync, [
'allowed_classes' =>
false ]) : []);
128 is_array($workgroupsToSync)
129 && !empty($workgroupsToSync)
134 $nonEmptyWorkgroupList = [];
136 foreach ($workgroupsToSync as $workgroupData)
138 $workgroupId = $workgroupData[
'groupId'];
145 && is_array(
$data[
'PLUS'])
152 isset(
$data[
'MINUS'])
153 && is_array(
$data[
'MINUS'])
165 if ($groupCounter > 0)
167 $nonEmptyWorkgroupList[] = [
168 'groupId' => $workgroupId,
169 'initiatorId' => $workgroupData[
'initiatorId'],
170 'exclude' => ($workgroupData[
'exclude'] ??
false),
176 Option::set(
'socialnetwork',
'workgroupsToSync', serialize($nonEmptyWorkgroupList));
185 Loader::includeModule(
'socialnetwork')
186 && Loader::includeModule(
'intranet')
194 $params = Option::get(
'socialnetwork',
'workgroupdeptsync');
203 'count' => $countRemain,
207 if ($countRemain > 0)
209 $result[
'title'] = Loc::getMessage(
'FUPD_WORKGROUP_DEPT_SYNC_TITLE');
217 $workgroupsToSync = Option::get(
'socialnetwork',
'workgroupsToSync');
218 $workgroupsToSync = ($workgroupsToSync !==
'' ? @unserialize($workgroupsToSync, [
'allowed_classes' =>
false ]) : []);
221 is_array($workgroupsToSync)
222 && !empty($workgroupsToSync)
227 foreach ($workgroupsToSync as $workgroupData)
229 $workgroupId = $workgroupData[
'groupId'];
239 && is_array(
$data[
'PLUS'])
245 isset(
$data[
'MINUS'])
246 && is_array(
$data[
'MINUS'])
252 isset(
$data[
'OLD_RELATIONS'])
253 && is_array(
$data[
'OLD_RELATIONS'])
254 ?
$data[
'OLD_RELATIONS']
258 foreach ($userListMinus as
$userId)
260 if (isset($oldRelationList[
$userId]))
269 isset($workgroupData[
'exclude'])
270 && $workgroupData[
'exclude']
273 \CSocNetUserToGroup::delete($oldRelationList[
$userId]);
277 UserToGroup::changeRelationAutoMembership([
278 'RELATION_ID' => $oldRelationList[
$userId],
291 && !empty($userListPlus)
295 $res = UserToGroupTable::getList([
297 '=GROUP_ID' => $workgroupId,
298 '@USER_ID' => $userListPlus,
301 'select' => [
'ID',
'USER_ID' ],
303 while ($relation =
$res->fetch())
305 $memberList[] = $relation[
'USER_ID'];
307 $userListPlus = array_diff($userListPlus, $memberList);
308 if (!empty($userListPlus))
310 $res = UserToGroupTable::getList([
312 '=GROUP_ID' => $workgroupId,
313 '@USER_ID' => $userListPlus,
315 '=AUTO_MEMBER' =>
'N',
317 'select' => [
'ID',
'USER_ID',
'GROUP_ID' ]
319 while ($relation =
$res->fetch())
327 $changeList[] = (int)$relation[
'USER_ID'];
328 UserToGroup::changeRelationAutoMembership([
329 'RELATION_ID' => (
int)$relation[
'ID'],
330 'USER_ID' => (
int)$relation[
'USER_ID'],
331 'GROUP_ID' => (
int)$relation[
'GROUP_ID'],
339 $addList = array_diff($userListPlus, $changeList);
343 foreach ($addList as $addUserId)
351 UserToGroup::addRelationAutoMembership([
352 'CURRENT_USER_ID' => $workgroupData[
'initiatorId'],
353 'USER_ID' => $addUserId,
354 'GROUP_ID' => $workgroupId,
365 \CSocNetGroup::setStat($workgroupId);
370 Option::set(
'socialnetwork',
'workgroupdeptsync', serialize(
$params));
375 Option::delete(
'socialnetwork', [
'name' =>
'workgroupdeptsync' ]);
383 Option::delete(
'socialnetwork', [
'name' =>
'workgroupdeptsync' ]);