247 $deparmentIdList = [];
249 isset(
$fields[
'UF_DEPARTMENT'])
250 && is_array(
$fields[
'UF_DEPARTMENT'])
251 && (
int)(
$fields[
'UF_DEPARTMENT'][0] ?? 0) > 0
254 $deparmentIdList =
$fields[
'UF_DEPARTMENT'];
257 if (Loader::includeModule(
'intranet'))
259 $deparmentIdList = array_merge($deparmentIdList, \CIntranetUtils::getSubordinateDepartments(
$fields[
'ID'],
false));
262 $deparmentIdList = array_unique($deparmentIdList);
265 empty($deparmentIdList)
266 || !ModuleManager::isModuleInstalled(
'intranet')
267 || !Loader::includeModule(
'iblock')
273 $groupList = self::getConnectedGroups($deparmentIdList);
274 if (empty($groupList))
279 foreach($groupList as $groupId)
281 self::addRelationAutoMembership([
283 'GROUP_ID' => $groupId,
291 if (!self::checkUF())
297 (
int)$userFields[
'ID'] <= 0
298 || !isset($userFields[
'UF_DEPARTMENT'])
299 || !ModuleManager::isModuleInstalled(
'intranet')
300 || !Loader::includeModule(
'iblock')
307 $oldGroupAutoList = [];
310 $res = UserToGroupTable::getList([
312 'USER_ID' => (
int)$userFields[
'ID']
314 'select' => [
'GROUP_ID',
'AUTO_MEMBER' ]
317 while($relation =
$res->fetch())
319 $oldGroupList[] = $relation[
'GROUP_ID'];
320 if ($relation[
'AUTO_MEMBER'] ===
'Y')
322 $oldGroupAutoList[] = $relation[
'GROUP_ID'];
325 $oldGroupList = array_unique($oldGroupList);
326 $oldGroupAutoList = array_unique($oldGroupAutoList);
329 !empty($userFields[
'UF_DEPARTMENT'])
330 && is_array($userFields[
'UF_DEPARTMENT'])
333 $userFields[
'UF_DEPARTMENT'] = array_values($userFields[
'UF_DEPARTMENT']);
337 !is_array($userFields[
'UF_DEPARTMENT'])
338 || empty($userFields[
'UF_DEPARTMENT'])
339 || (int)$userFields[
'UF_DEPARTMENT'][0] <= 0
341 : $userFields[
'UF_DEPARTMENT']
344 if (Loader::includeModule(
'intranet'))
346 $departmentList = array_merge($departmentList, \CIntranetUtils::getSubordinateDepartments($userFields[
'ID'],
false));
348 $departmentList = array_unique($departmentList);
350 if (!empty($departmentList))
352 $newGroupList = self::getConnectedGroups($departmentList);
354 $groupListPlus = array_diff($newGroupList, $oldGroupList);
355 $groupListMinus = array_diff($oldGroupAutoList, $newGroupList);
356 $groupListMinus = array_diff($groupListMinus, $groupListPlus);
358 if (!empty($groupListMinus))
360 $res = UserToGroupTable::getList([
362 '=USER_ID' => (
int)$userFields[
'ID'],
363 '@GROUP_ID' => $groupListMinus,
367 'select' => [
'ID' ],
369 while($relation =
$res->fetch())
371 \CSocNetUserToGroup::delete($relation[
'ID']);
375 $changeList = $addList = $noChangeList = [];
376 if (!empty($groupListPlus))
378 $res = UserToGroupTable::getList([
380 '=USER_ID' => (
int)$userFields[
"ID"],
381 '@GROUP_ID' => $groupListPlus,
384 'select' => [
'ID',
'GROUP_ID',
'AUTO_MEMBER' ],
387 while ($relation =
$res->fetch())
390 $relation[
'AUTO_MEMBER'] ===
'Y'
394 $noChangeList[] = $relation[
'GROUP_ID'];
398 $noChangeList[] = $relation[
'GROUP_ID'];
399 self::changeRelationAutoMembership([
400 'RELATION_ID' => (
int)$relation[
'ID'],
401 'USER_ID' => (
int)$userFields[
"ID"],
402 'GROUP_ID' => (
int)$relation[
'GROUP_ID'],
403 'ROLE' => $relation[
'ROLE'],
410 $groupListPlus = array_diff($groupListPlus, $noChangeList);
413 if (!empty($groupListPlus))
415 $res = UserToGroupTable::getList([
417 '=USER_ID' => (
int)$userFields[
'ID'],
418 '@GROUP_ID' => $groupListPlus,
420 'AUTO_MEMBER' =>
'N',
422 'select' => [
'ID',
'USER_ID',
'GROUP_ID' ],
425 while ($relation =
$res->fetch())
427 $changeList[] = (int)$relation[
'GROUP_ID'];
428 self::changeRelationAutoMembership([
429 'RELATION_ID' => (
int)$relation[
'ID'],
430 'USER_ID' => (
int)$relation[
'USER_ID'],
431 'GROUP_ID' => (
int)$relation[
'GROUP_ID'],
436 $addList = array_diff($groupListPlus, $changeList);
439 foreach ($addList as $addGroupId)
441 self::addRelationAutoMembership([
442 'USER_ID' => (
int)$userFields[
'ID'],
443 'GROUP_ID' => $addGroupId,
452 static $structureIBlockId =
false;
453 static $departmentChainCache = [];
457 if ($structureIBlockId ===
false)
459 $structureIBlockId = (int)Option::get(
'intranet',
'iblock_structure', 0);
462 if ((
int)$structureIBlockId <= 0)
467 $userDepartmentList = [];
469 foreach($departmentList as $departmentId)
471 $departmentChain = [];
472 if (isset($departmentChainCache[$departmentId]))
474 $departmentChain = $departmentChainCache[$departmentId];
478 $res = \CIBlockSection::getNavChain($structureIBlockId, $departmentId, [
'ID' ]);
479 while ($section =
$res->fetch())
481 if ((
int)$section[
'ID'] > 0)
483 $departmentChain[] = (int)$section[
'ID'];
486 $departmentChainCache[$departmentId] = $departmentChain;
488 $userDepartmentList = array_merge($userDepartmentList, $departmentChain);
491 $userDepartmentList = array_unique($userDepartmentList);
493 if (!empty($userDepartmentList))
495 $res = WorkgroupTable::getList([
497 '@UF_SG_DEPT' => $userDepartmentList,
499 'select' => [
'ID' ],
501 while ($group =
$res->fetch())
503 if ((
int)$group[
'ID'] > 0)
527 || (
int)
$params[
'group_id'] <= 0
528 || (
int)
$params[
'user_id'] <= 0
529 || !Loader::includeModule(
'im')
535 $groupId = (int)
$params[
'group_id'];
539 $group = GroupRegistry::getInstance()->get($groupId);
546 if (!$group->isCollab() && !Integration\
Im\Chat\Workgroup::getUseChat())
551 if ($group->isCollab() && ActionType::isValid(
$action))
553 $factory = ActionMessageFactory::getInstance();
561 if (!in_array(
$action, self::getChatActionList(),
true))
566 $role = (
$params[
'role'] ??
false);
574 'group_id' => $groupId,
575 'skipAvailabilityCheck' =>
true,
580 || empty($chatData[$groupId])
581 || (
int)$chatData[$groupId] <= 0
593 isset(
$user[
'ACTIVE'])
594 &&
$user[
'ACTIVE'] ===
'N'
601 $suffix = static::getChatMessageCodeSuffix($group);
603 $userName = \CUser::formatName(\CSite::getNameFormat(),
$user,
true,
false);
604 switch(
$user[
'PERSONAL_GENDER'])
607 $genderSuffix =
'_M';
610 $genderSuffix =
'_F';
616 $chatId = $chatData[$groupId];
617 $chat = new \CIMChat(0);
621 case self::CHAT_ACTION_IN:
622 if ($chat->addUser($chatId,
$userId,
false,
true,
true))
629 $chatMessage = str_replace(
'#USER_NAME#',
$userName, Loc::getMessage(
'SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_ADD' . $suffix . $genderSuffix));
633 $sendMessage =
false;
636 case self::CHAT_ACTION_OUT:
637 if ($chat->deleteUser($chatId,
$userId,
false,
true))
639 $chatMessage = str_replace(
'#USER_NAME#',
$userName, Loc::getMessage(
'SOCIALNETWORK_ITEM_USERTOGROUP_CHAT_USER_DELETE' . $suffix . $genderSuffix));
643 $sendMessage =
false;
649 $sendMessage =
false;
654 $chatMessageFields = [
655 "MESSAGE" => $chatMessage,
657 "INCREMENT_COUNTER" =>
"N",
662 'group_id' => $groupId,
666 !empty($availableChatData)
667 && !empty($availableChatData[$groupId])
668 && (
int)$availableChatData[$groupId] > 0
671 return \CIMChat::addMessage(array_merge(
672 $chatMessageFields, [
673 'TO_CHAT_ID' => $chatId,
709 || (
int)
$params[
'group_id'] <= 0
716 $groupId = (int)
$params[
'group_id'];
723 isset(
$params[
'current_user_id'])
724 && (int)
$params[
'current_user_id'] > 0
725 ? (
int)
$params[
'current_user_id']
728 &&
$USER->isAuthorized()
739 $ownerRelationIdList = [];
740 $memberRelationIdList = [];
741 $otherRelationIdList = [];
743 $resRelation = UserToGroupTable::getList([
745 'GROUP_ID' => $groupId,
746 '@USER_ID' => $userIdList
748 'select' => [
'ID',
'USER_ID',
'ROLE' ],
751 while ($relation = $resRelation->fetch())
755 $memberRelationIdList[$relation[
'USER_ID']] = $relation[
'ID'];
759 $ownerRelationIdList[$relation[
'USER_ID']] = $relation[
'ID'];
763 $otherRelationIdList[$relation[
'USER_ID']] = $relation[
'ID'];
767 if (!empty($memberRelationIdList))
769 \CSocNetUserToGroup::transferMember2Moderator($currentUserId, $groupId, $memberRelationIdList);
772 foreach ($userIdList as
$userId)
775 !array_key_exists(
$userId, $memberRelationIdList)
776 && !array_key_exists(
$userId, $ownerRelationIdList)
779 if (array_key_exists(
$userId, $otherRelationIdList))
781 $relationId = \CSocNetUserToGroup::update($otherRelationIdList[
$userId], [
783 '=DATE_UPDATE' => \CDatabase::CurrentTimeFunction(),
788 $relationId = \CSocNetUserToGroup::add([
790 'GROUP_ID' => $groupId,
792 '=DATE_CREATE' => \CDatabase::CurrentTimeFunction(),
793 '=DATE_UPDATE' => \CDatabase::CurrentTimeFunction(),
796 'INITIATED_BY_USER_ID' => $currentUserId,
803 \CSocNetUserToGroup::notifyModeratorAdded([
804 'userId' => $currentUserId,
805 'groupId' => $groupId,
806 'relationId' => $relationId