9namespace Bitrix\Socialnetwork\Item;
12use Bitrix\Main\ArgumentException;
13use Bitrix\Main\Config\Option;
14use Bitrix\Main\Engine\CurrentUser;
15use Bitrix\Main\Localization\Loc;
16use Bitrix\Main\ModuleManager;
17use Bitrix\Main\ObjectPropertyException;
18use Bitrix\Main\SystemException;
19use Bitrix\Socialnetwork\Integration\UI\EntitySelector\Config;
20use Bitrix\Socialnetwork\Internals\Registry\GroupRegistry;
21use Bitrix\Socialnetwork\Item\Workgroup\Type;
22use Bitrix\Socialnetwork\Integration\Intranet\Structure\WorkgroupDepartmentsSynchronizer;
23use Bitrix\Socialnetwork\WorkgroupTable;
24use Bitrix\Socialnetwork\UserToGroupTable;
25use Bitrix\Socialnetwork\Helper;
27Loc::loadMessages(__FILE__);
36 return new static([
'ID' => $groupId]);
51 public static function getById($groupId = 0, $useCache =
true): bool|static
53 $groupId = (int)$groupId;
60 $useCache = (bool)$useCache;
62 $registry = GroupRegistry::getInstance();
66 $registry->invalidate($groupId);
69 $group = $registry->get($groupId);
91 return (
int)($this->fields[
'ID'] ?? 0);
96 return (
string)($this->fields[
'NAME'] ??
'');
101 return (
string)($this->fields[
'DESCRIPTION'] ??
'');
106 return (
int)($this->fields[
'CHAT_ID'] ?? 0);
111 return (
string)($this->fields[
'DIALOG_ID'] ??
'');
116 return (
int)($this->fields[
'IMAGE_ID'] ?? 0);
121 return (
int)($this->fields[
'OWNER_ID'] ?? 0);
126 return (
string)($this->fields[
'SITE_ID'] ??
'');
131 return (
array)($this->fields[
'SITE_IDS'] ?? []);
136 return ($this->fields[
'VISIBLE'] ??
null) ===
'Y';
141 $type = $this->fields[
'TYPE'] ??
null;
147 return Type::tryFrom(
$type);
152 return $this->fields[
'AVATAR_TYPE'] ??
null;
157 $avatar = Helper\Workgroup::getAvatarEntitySelectorUrl($this->
getAvatarType());
163 $extranetSiteId = Option::get(
'extranet',
'extranet_site');
164 $extranetSiteId = ($extranetSiteId && ModuleManager::isModuleInstalled(
'extranet') ? $extranetSiteId :
false);
165 $isExtranet = in_array($extranetSiteId, $this->fields[
'SITE_IDS'] ?? [],
true);
168 $avatarTypes = Config::getProjectAvatarTypes();
170 return $avatarTypes[
$type ??
'default'] ?? $avatarTypes[
'default'];
175 $departments = $this->fields[
'UF_SG_DEPT'] ?? [];
176 if ($departments === [])
181 $departmentIds = $departments[
'VALUE'] ?? [];
182 if (empty($departmentIds))
189 return $departmentIds;
194 $memberIds = $this->fields[
'MEMBERS'] ?? [];
195 if ($memberIds === [])
207 $requestedIds = $this->fields[
'INVITED_MEMBERS'] ?? [];
208 if ($requestedIds === [])
215 return $requestedIds;
220 $moderatorIds = $this->fields[
'MODERATOR_MEMBERS'] ?? [];
221 if ($moderatorIds === [])
228 return $moderatorIds;
233 $ordinaryMemberIds = $this->fields[
'ORDINARY_MEMBERS'] ?? [];
234 if ($ordinaryMemberIds === [])
241 return $ordinaryMemberIds;
251 return $invited + $ordinary + $moderators + $owner;
257 isset($this->fields[
'PROJECT'])
258 && $this->fields[
'PROJECT'] ===
'Y'
264 return (!empty($this->fields[
'SCRUM_MASTER_ID']));
269 return $this->
getType() === Type::Collab;
274 return ($this->fields[
'SCRUM_SPRINT_DURATION'] ? : 0);
279 return ($this->fields[
'SCRUM_MASTER_ID'] ? : 0);
284 if ($this->fields[
'SCRUM_TASK_RESPONSIBLE'])
286 $scrumTaskResponsible = $this->fields[
'SCRUM_TASK_RESPONSIBLE'];
287 $availableResponsibleTypes = [
'A',
'M'];
289 in_array($scrumTaskResponsible, $availableResponsibleTypes,
true) ? $scrumTaskResponsible :
'A'
302 $currentUserId = (int)CurrentUser::get()->getId();
309 static $cache =
array();
316 && !empty($cache[$groupFields[
"ID"]])
319 $groupUrlTemplate = $cache[$groupFields[
'ID']][
'URL_TEMPLATE'];
320 $groupSiteId = $cache[$groupFields[
'ID']][
'SITE_ID'];
324 $groupSiteId = \CSocNetGroup::getDefaultSiteId($groupFields[
"ID"], $groupFields[
"SITE_ID"]);
325 $workgroupsPage = Option::get(
"socialnetwork",
"workgroups_page",
"/workgroups/",
SITE_ID);
326 $groupUrlTemplate = Helper\Path::get(
'group_path_template');
327 $groupUrlTemplate =
"#GROUPS_PATH#".mb_substr($groupUrlTemplate, mb_strlen($workgroupsPage), mb_strlen($groupUrlTemplate) - mb_strlen($workgroupsPage));
329 $cache[$groupFields[
"ID"]] =
array(
330 'URL_TEMPLATE' => $groupUrlTemplate ,
331 'SITE_ID' => $groupSiteId,
335 $groupUrl = str_replace(
array(
"#group_id#",
"#GROUP_ID#"), $groupFields[
"ID"], $groupUrlTemplate);
336 $serverName = $domainName =
'';
340 $tmp = \CSocNetLogTools::processPath(
342 'GROUP_URL' => $groupUrl,
348 $groupUrl =
$tmp[
"URLS"][
"GROUP_URL"];
349 $serverName = (mb_strpos($groupUrl,
"http://") === 0 || mb_strpos($groupUrl,
"https://") === 0 ?
"" :
$tmp[
"SERVER_NAME"]);
350 $domainName = (mb_strpos($groupUrl,
"http://") === 0 || mb_strpos($groupUrl,
"https://") === 0 ?
"" : (isset(
$tmp[
"DOMAIN"]) && !empty(
$tmp[
"DOMAIN"]) ?
"//".$tmp[
"DOMAIN"] :
""));
355 'SERVER_NAME' => $serverName,
356 'DOMAIN' => $domainName,
362 return ($this->
getFields()[
'LANDING'] ??
null) ===
'Y';
367 return $this->fields[
'INITIATE_PERMS'] ??
null;
383 !isset($section[
'ID'], $section[
'IBLOCK_ID'])
384 || (
int)$section[
'ID'] <= 0
385 || (
int)$section[
'IBLOCK_ID'] <= 0
387 isset($section[
'ACTIVE'])
388 && $section[
'ACTIVE'] ===
'N'
390 || (
int)$section[
'IBLOCK_ID'] !== (
int)Option::get(
'intranet',
'iblock_structure', 0)
396 $rootSectionIdList = [];
397 $res = \CIBlockSection::getNavChain($section[
'IBLOCK_ID'], $section[
'ID'],
array(
'ID'));
398 while ($rootSection =
$res->fetch())
400 if ((
int)$rootSection[
'ID'] !== (
int)$section[
'ID'])
402 $rootSectionIdList[] = $rootSection[
'ID'];
406 if (!empty($rootSectionIdList))
409 self::$groupsIdToCheckList = array_merge(self::$groupsIdToCheckList, $groupList);
418 !isset($section[
'ID'], $section[
'IBLOCK_ID'])
419 || (
int)$section[
'ID'] <= 0
420 || (
int)$section[
'IBLOCK_ID'] <= 0
421 || (
int)$section[
'IBLOCK_ID'] !== (
int)Option::get(
'intranet',
'iblock_structure', 0)
427 $oldGroupsIdToCheckList = self::$groupsIdToCheckList;
428 $newGroupsIdToCheckList = [];
431 isset($section[
'ACTIVE'])
432 && $section[
'ACTIVE'] ===
'N'
435 self::disconnectSection($section[
'ID']);
439 $res = \CIBlockSection::getNavChain($section[
'IBLOCK_ID'], $section[
'ID'],
array(
'ID'));
440 while ($rootSection =
$res->fetch())
442 if ((
int)$rootSection[
'ID'] !== (
int)$section[
'ID'])
444 $rootSectionIdList[] = $rootSection[
'ID'];
448 if (!empty($rootSectionIdList))
454 if (!empty($oldGroupsIdToCheckList))
456 $oldGroupsIdToCheckList = array_unique($oldGroupsIdToCheckList);
457 foreach($oldGroupsIdToCheckList as $groupId)
459 $groupItem = self::getById($groupId,
false);
460 $groupItem->syncDeptConnection(
true);
464 if (!empty($newGroupsIdToCheckList))
466 $newGroupsIdToCheckList = array_unique($newGroupsIdToCheckList);
467 foreach($newGroupsIdToCheckList as $groupId)
469 $groupItem = self::getById($groupId,
false);
470 $groupItem->syncDeptConnection();
479 if ((
int)$sectionId <= 0)
484 $res = \CIBlockSection::getList(
486 [
'ID' => $sectionId ],
488 [
'ID',
'IBLOCK_ID' ]
491 !($section =
$res->fetch())
492 || !isset($section[
'IBLOCK_ID'])
493 || (
int)$section[
'IBLOCK_ID'] <= 0
495 isset($section[
'ACTIVE'])
496 && $section[
'ACTIVE'] ===
'N'
498 || (
int)$section[
'IBLOCK_ID'] !== (
int)Option::get(
'intranet',
'iblock_structure', 0)
504 $rootSectionIdList = [];
505 $res = \CIBlockSection::getNavChain($section[
'IBLOCK_ID'], $section[
'ID'],
array(
'ID'));
506 while ($rootSection =
$res->fetch())
508 if ((
int)$rootSection[
'ID'] !== (
int)$section[
'ID'])
510 $rootSectionIdList[] = $rootSection[
'ID'];
514 if (!empty($rootSectionIdList))
517 self::$groupsIdToCheckList = array_merge(self::$groupsIdToCheckList, $groupList);
526 !isset($section[
'ID'], $section[
'IBLOCK_ID'])
527 || (
int)$section[
'ID'] <= 0
528 || (
int)$section[
'IBLOCK_ID'] <= 0
529 || (
int)$section[
'IBLOCK_ID'] !== (
int)Option::get(
'intranet',
'iblock_structure', 0)
535 self::disconnectSection($section[
'ID']);
537 if (!empty(self::$groupsIdToCheckList))
539 $groupsToCheck = array_unique(self::$groupsIdToCheckList);
540 foreach($groupsToCheck as $groupId)
542 $groupItem = self::getById($groupId,
false);
543 $groupItem->syncDeptConnection();
550 private static function disconnectSection($sectionId): void
552 $groupList =
array();
555 '=UF_SG_DEPT' => $sectionId,
557 'select' =>
array(
'ID',
'UF_SG_DEPT'),
559 while($group =
$res->fetch())
561 $groupList[] = $group;
564 foreach($groupList as $group)
566 $departmentListOld = array_map(
'intval', $group[
'UF_SG_DEPT']);
567 $departmentListNew = array_diff($departmentListOld,
array($sectionId));
569 \CSocNetGroup::update($group[
'ID'],
array(
570 'UF_SG_DEPT' => $departmentListNew,
573 $groupItem = self::getById($group[
'ID'],
false);
574 $groupItem->syncDeptConnection(
true);
580 return Helper\Workgroup::getTypes(
$params);
585 return Helper\Workgroup::getPresets(
$params);
588 private static function getGroupContent(
$params =
array()): string
590 static $fieldsList =
null;;
594 $groupId = (int)(
$params[
'id'] ?? 0);
601 if ($fieldsList ===
null)
603 $fieldsList = self::getContentFieldsList();
609 && ($diff = array_diff($fieldsList, array_keys(
$params[
'fields'])))
613 $groupFieldsList =
$params[
'fields'];
621 'select' => $fieldsList,
623 $groupFieldsList =
$res->fetch();
626 if (!empty($groupFieldsList))
628 $content .= $groupFieldsList[
'NAME'];
629 if (!empty($groupFieldsList[
'DESCRIPTION']))
631 $content .=
' '.$groupFieldsList[
'DESCRIPTION'];
634 if (!empty($groupFieldsList[
'KEYWORDS']))
636 $keywordList = explode(
",", $groupFieldsList[
"KEYWORDS"]);
638 foreach($keywordList as $keyword)
640 $tagList[] = trim($keyword);
641 $tagList[] =
'#'.trim($keyword);
643 if (!empty($tagList))
645 $content .=
' '.implode(
' ', $tagList);
650 !empty($groupFieldsList[
'OWNER_ID'])
651 && (
int)$groupFieldsList[
'OWNER_ID'] > 0
656 'ID' => (
int)$groupFieldsList[
'OWNER_ID'],
658 'select' =>
array(
'ID',
'NAME',
'LAST_NAME',
'SECOND_NAME',
'LOGIN',
'EMAIL'),
660 if ($userFields =
$res->fetch())
662 $content .=
' '.\CUser::formatName(\CSite::getNameFormat(
null, $groupFieldsList[
'SITE_ID']), $userFields,
true);
707 'onWorkgroupIndexGetContent',
709 'groupId' => $groupId,
714 foreach(
$event->getResults() as $eventResult)
716 if ($eventResult->getType() == \
Bitrix\
Main\EventResult::SUCCESS)
718 $eventParams = $eventResult->getParameters();
721 is_array($eventParams)
722 && isset($eventParams[
'content'])
725 $eventContent = $eventParams[
'content'];
726 if (
Main\Loader::includeModule(
'search'))
728 $eventContent = \CSearch::killTags($eventContent);
730 $eventContent = trim(str_replace(
731 array(
"\r",
"\n",
"\t"),
736 $eventContent = self::prepareToken($eventContent);
737 if (!empty($eventContent))
761 return [
'NAME',
'DESCRIPTION',
'OWNER_ID',
'KEYWORDS',
'SITE_ID' ];
766 return str_rot13(
$str);
771 $ownerValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_OWNER');
772 $moderatorsValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_MOD');
773 $userValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_USER');
780 $ownerValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_OWNER_SCRUM2');
781 $moderatorsValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_MOD_SCRUM2');
782 $userValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_USER_SCRUM');
789 $ownerValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_OWNER_PROJECT');
790 $moderatorsValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_MOD_PROJECT');
791 $userValue = Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_USER_PROJECT');
807 SONET_ROLES_ALL => Loc::getMessage(
'SOCIALNETWORK_ITEM_WORKGROUP_IP_ALL'),
818 return Helper\Workgroup::getByFeatureOperation(
$params);
823 return Helper\Workgroup::getListSprintDuration();
828 return Helper\Workgroup::getScrumTaskResponsibleList();
833 return Helper\Workgroup::getTypeCodeByParams(
$params);
838 return Helper\Workgroup::getTypeByCode(
$params);
843 return Helper\Workgroup::getEditFeaturesAvailability();
851 $optionValue = Option::get(
'socialnetwork',
'work_with_closed_groups',
'N');
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static normalizeArrayValuesByInt(&$map, $sorted=true)
static getConnectedGroups($departmentList)
static canWorkWithClosedWorkgroups()
static onBeforeIBlockSectionDelete($sectionId)
static getTypes($params=[])
static onAfterIBlockSectionDelete($section)
static getListSprintDuration()
__construct(array $fields=[])
static onBeforeIBlockSectionUpdate($section)
getDefaultSprintDuration()
static getContentFieldsList()
static getSpamPermOptionsList()
static getById($groupId=0, $useCache=true)
getScrumTaskResponsible()
static onAfterIBlockSectionUpdate($section)
getSynchronizedDepartmentIds()
static createFromId(int $groupId=0)
static getTypeCodeByParams($params)
static getByFeatureOperation(array $params=[])
static $groupsIdToCheckList
static getInitiatePermOptionsList(array $params=[])
getGroupUrlData($params=array())
static getPresets($params=array())
static prepareToken($str)
syncDeptConnection($exclude=false)
static getTypeByCode($params=[])
static getEditFeaturesAvailability()
static getScrumTaskResponsibleList()
setFields(array $fields=[])
static setIndex($params=array())
if(!is_array($prop["VALUES"])) $tmp
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']