47 private static function getAllowedSelectFields():
array
50 'ID',
'ACTIVE',
'SUBJECT_ID',
'NAME',
'DESCRIPTION',
'KEYWORDS',
51 'CLOSED',
'VISIBLE',
'OPENED',
'PROJECT',
'LANDING',
52 'DATE_CREATE',
'DATE_UPDATE',
'DATE_ACTIVITY',
53 'IMAGE_ID',
'AVATAR_TYPE',
55 'NUMBER_OF_MEMBERS',
'NUMBER_OF_MODERATORS',
57 'PROJECT_DATE_START',
'PROJECT_DATE_FINISH',
58 'SCRUM_OWNER_ID',
'SCRUM_MASTER_ID',
'SCRUM_SPRINT_DURATION',
'SCRUM_TASK_RESPONSIBLE',
65 $groupId = (int)(
$params[
'groupId'] ?? 0);
69 $this->addEmptyGroupIdError();
77 if (!\CSocNetUser::isCurrentUserModuleAdmin(
SITE_ID,
false))
79 $filter[
'CHECK_PERMISSIONS'] = $this->getCurrentUser()->getId();
82 $result = \CSocNetGroup::getList([],
$filter,
false,
false, [
'ID']);
85 $groupItem = \Bitrix\Socialnetwork\Item\Workgroup::getById($group[
'ID']);
86 $groupFields = $groupItem->getFields();
88 if (in_array(
'DATE_CREATE',
$select,
true))
90 $culture = Context::getCurrent()->getCulture();
91 $longDateFormat =
$culture->getLongDateFormat();
92 $shortTimeFormat =
$culture->getShortTimeFormat();
94 $groupFields[
'DATE_CREATE'] = \CComponentUtil::getDateTimeFormatted([
96 'TZ_OFFSET' => \CTimeZone::getOffset(),
97 ],
"$longDateFormat, $shortTimeFormat");
99 if (in_array(
'AVATAR',
$select,
true))
101 $groupFields[
'AVATAR'] = File::getFileSource((
int)$groupFields[
'IMAGE_ID'], 100, 100);
103 if (in_array(
'AVATAR_TYPES',
$select,
true))
105 $groupFields[
'AVATAR_TYPES'] = Helper\Workgroup::getAvatarTypes();
107 if (in_array(
'AVATAR_DATA',
$select,
true))
109 $imageId = (int) $groupFields[
'IMAGE_ID'];
110 $avatarType = $groupFields[
'AVATAR_TYPE'] ??
'';
111 $groupFields[
'AVATAR_DATA'] = $this->getAvatarData($imageId, $avatarType);
113 if (in_array(
'OWNER_DATA',
$select,
true))
115 $groupFields[
'OWNER_DATA'] = $this->getOwnerData($groupFields[
'OWNER_ID']);
117 if (in_array(
'SUBJECT_DATA',
$select,
true))
119 $groupFields[
'SUBJECT_DATA'] = $this->getSubjectData($groupFields[
'SUBJECT_ID']);
121 if (in_array(
'TAGS',
$select,
true))
123 $groupFields[
'TAGS'] = $this->getTags($groupId);
125 if (in_array(
'THEME_DATA',
$select,
true))
127 $groupFields[
'THEME_DATA'] = $this->getThemeData($groupId);
129 if (in_array(
'ACTIONS',
$select,
true))
131 $groupFields[
'ACTIONS'] = $this->getActions($groupId);
133 if (in_array(
'USER_DATA',
$select,
true))
135 $groupFields[
'USER_DATA'] = $this->getUserData($groupId);
137 if (in_array(
'DEPARTMENTS',
$select,
true))
139 $groupFields[
'DEPARTMENTS'] = $this->getDepartments($groupFields[
'UF_SG_DEPT'][
'VALUE']);
141 if (in_array(
'PIN',
$select,
true))
143 $groupFields[
'IS_PIN'] = $this->isPin($groupId, $this->getCurrentUser()->getId());
145 if (in_array(
'PRIVACY_TYPE',
$select,
true))
147 $groupFields[
'PRIVACY_CODE'] = Helper\Workgroup::getConfidentialityTypeCodeByParams([
149 'OPENED' => $groupFields[
'OPENED'],
150 'VISIBLE' => $groupFields[
'VISIBLE'],
154 if (in_array(
'LIST_OF_MEMBERS',
$select,
true))
156 $groupFields[
'LIST_OF_MEMBERS'] = $this->getListOfMembers(
158 $groupItem->getScrumMaster()
161 if (in_array(
'FEATURES',
$select,
true))
163 $groupFields[
'FEATURES'] = $this->prepareFeatures($groupId);
165 $needListOfAwaiting = in_array(
'LIST_OF_MEMBERS_AWAITING_INVITE',
$select,
true);
166 $needMembersList = in_array(
'GROUP_MEMBERS_LIST',
$select,
true);
167 if ($needListOfAwaiting || $needMembersList)
169 $permissions = Helper\Workgroup::getPermissions(
170 [
'groupId' => $groupId],
173 if ($needListOfAwaiting)
175 $groupFields[
'LIST_OF_MEMBERS_AWAITING_INVITE'] = [];
176 if ($permissions[
'UserCanModifyGroup'] || $permissions[
'UserCanInitiate'])
178 $groupFields[
'LIST_OF_MEMBERS_AWAITING_INVITE'] = $this->getListOfAwaitingMembers($groupId);
181 if ($needMembersList)
183 $groupFields[
'GROUP_MEMBERS_LIST'] = [];
184 if ($permissions[
'UserCanModifyGroup'] || $permissions[
'UserCanInitiate'])
187 $groupFields[
'GROUP_MEMBERS_LIST'] = $membersManager->getGroupMembersList($groupId);
191 if (in_array(
'COUNTERS',
$select,
true))
193 $groupFields[
'COUNTERS'] = $this->getCounters($groupId);
196 if ($groupFields[
'NUMBER_OF_MEMBERS'])
198 $groupFields[
'NUMBER_OF_MEMBERS_PLURAL'] = Loc::getPluralForm($groupFields[
'NUMBER_OF_MEMBERS']);
200 if ($groupFields[
'PROJECT_DATE_START'] || $groupFields[
'PROJECT_DATE_FINISH'])
202 $culture = Context::getCurrent()->getCulture();
203 $format =
$culture->getDayMonthFormat();
206 $dateStart = $groupFields[
'PROJECT_DATE_START'];
208 $dateFinish = $groupFields[
'PROJECT_DATE_FINISH'];
212 $groupFields[
'FORMATTED_PROJECT_DATE_START'] =
FormatDate(
214 MakeTimeStamp(DateTime::createFromTimestamp($dateStart->getTimestamp()))
219 $groupFields[
'FORMATTED_PROJECT_DATE_FINISH'] =
FormatDate(
221 MakeTimeStamp(DateTime::createFromTimestamp($dateFinish->getTimestamp()))
228 &&
$params[
'mode'] ===
'mobile'
231 $additionalData = Helper\Workgroup::getAdditionalData([
232 'ids' => [ $groupId ],
233 'features' => (
$params[
'features'] ?? []),
234 'mandatoryFeatures' => (
$params[
'mandatoryFeatures'] ?? []),
235 'currentUserId' => (
int)$this->getCurrentUser()->getId(),
238 $groupFields[
'ADDITIONAL_DATA'] = ($additionalData[$groupId] ?? []) ;
241 $isScrum = !empty($groupFields[
'SCRUM_MASTER_ID']);
242 if (!$isScrum && in_array(
'EFFICIENCY',
$select,
true) && Loader::includeModule(
'tasks'))
244 $efficiencies = Effective::getAverageEfficiencyForGroups(
251 $groupFields[
'EFFICIENCY'] = $efficiencies[$group[
'ID']] ??
null;
259 Loc::getMessage(
'SONET_CONTROLLER_WORKGROUP_NOT_FOUND'),
260 'SONET_CONTROLLER_WORKGROUP_NOT_FOUND'
283 if (!in_array(
'ID',
$select,
true))
292 && !\CSocNetUser::isCurrentUserModuleAdmin(
SITE_ID,
false)
298 if (
$params[
'IS_ADMIN'] !==
'Y')
300 $filter[
'CHECK_PERMISSIONS'] = $this->getCurrentUser()->getId();
311 $filter[
'SITE_ID'] = $extranetSiteId;
318 if ((
$key = array_search(
'AVATAR',
$select,
true)) !==
false)
330 $res = \CSocNetGroup::getList([],
$filter,
false,
false, [
'ID' ]);
331 while ($groupFields =
$res->fetch())
333 $queryIdFilter[] = (int)$groupFields[
'ID'];
336 if (!empty($queryIdFilter))
340 $query = WorkgroupTable::query();
344 ->setOffset($pageNavigation->
getOffset())
345 ->setLimit(($pageNavigation->
getLimit()))
347 'ID' => $queryIdFilter,
353 $avatarTypes = Helper\Workgroup::getAvatarTypes();
355 while ($groupFields =
$res->fetch())
357 if (in_array(
'AVATAR', $originalSelect,
true))
359 if ((
int)$groupFields[
'IMAGE_ID'] > 0)
361 $groupFields[
'AVATAR'] = File::getFileSource((
int)$groupFields[
'IMAGE_ID'], 100, 100);
364 !empty($groupFields[
'AVATAR_TYPE'])
366 &&
$params[
'mode'] ===
'mobile'
369 $groupFields[
'AVATAR'] = $avatarTypes[$groupFields[
'AVATAR_TYPE']][
'mobileUrl'];
373 $groupFields[
'AVATAR'] =
'';
377 $workgroups[(int)$groupFields[
'ID']] = $groupFields;
383 $ids = array_keys($workgroups);
387 &&
$params[
'mode'] ===
'mobile'
390 $additionalData = Helper\Workgroup::getAdditionalData([
392 'features' => (
$params[
'features'] ?? []),
393 'mandatoryFeatures' => (
$params[
'mandatoryFeatures'] ?? []),
394 'currentUserId' => (
int)$this->getCurrentUser()->getId(),
397 foreach (array_keys($workgroups) as $id)
399 if (!isset($additionalData[$id]))
404 $workgroups[$id][
'ADDITIONAL_DATA'] = ($additionalData[$id] ?? []) ;
408 if ((
$params[
'shouldSelectDialogId'] ??
'N') ===
'Y')
410 $chatData = Chat\Workgroup::getChatData([
412 'skipAvailabilityCheck' =>
true,
415 foreach ($workgroups as $id =>
$fields)
421 $workgroups = $this->convertKeysToCamelCase($workgroups);
432 'exists' => GroupProvider::getInstance()->isExistingGroup(
$name),
438 return array_filter(
$select,
static function (
$key) {
439 return in_array(mb_strtoupper(
$key), static::getAllowedSelectFields(),
true);
443 private function getAvatarData(
int $imageId,
string $avatarType):
array
445 $avatarManager =
new AvatarManager();
449 $avatarData = $avatarManager->getImageAvatar($imageId)->toArray();
453 $avatarData = $avatarManager->getIconAvatar($avatarType)->toArray();
459 private function getOwnerData(
int $ownerId):
array
461 $owner = UserTable::getList([
462 'select' => [
'NAME',
'LAST_NAME',
'SECOND_NAME',
'LOGIN',
'PERSONAL_PHOTO'],
463 'filter' => [
'ID' => $ownerId],
468 'PHOTO' => ($owner[
'PERSONAL_PHOTO'] ? File::getFileSource($owner[
'PERSONAL_PHOTO']) : null),
471 \CSite::getNameFormat(),
473 'NAME' => $owner[
'NAME'],
474 'LAST_NAME' => $owner[
'LAST_NAME'],
475 'SECOND_NAME' => $owner[
'SECOND_NAME'],
476 'LOGIN' => $owner[
'LOGIN'],
484 private function getSubjectData(
int $subjectId):
array
486 $subject = WorkgroupSubjectTable::getList([
487 'select' => [
'NAME'],
488 'filter' => [
'ID' => $subjectId],
493 'NAME' => $subject[
'NAME'],
497 private function getTags(
int $groupId):
array
499 $tags = WorkgroupTagTable::getList([
500 'select' => [
'NAME'],
501 'filter' => [
'GROUP_ID' => $groupId],
505 static function($tag) {
508 array_column($tags,
'NAME')
512 private function getThemeData(
int $groupId): ?
array
514 if (!Loader::includeModule(
'intranet'))
519 $themePicker =
new ThemePicker(
522 $this->getCurrentUser()->
getId(),
523 ThemePicker::ENTITY_TYPE_SONET_GROUP,
527 $themeUserId =
false;
528 $themeId = $themePicker->getCurrentThemeId();
531 $res = ThemeTable::getList([
532 'select' => [
'USER_ID'],
534 '=ENTITY_TYPE' => $themePicker->getEntityType(),
535 'ENTITY_ID' => $themePicker->getEntityId(),
536 '=CONTEXT' => $themePicker->getContext(),
539 if (($themeFields =
$res->fetch()) && (
int)$themeFields[
'USER_ID'] > 0)
541 $themeUserId = (int)$themeFields[
'USER_ID'];
545 return $themePicker->getTheme($themeId, $themeUserId);
548 private function getActions(
int $groupId):
array
550 $permissions = Helper\Workgroup::getPermissions([
'groupId' => $groupId]);
552 $canEditFeatures = $permissions[
'UserCanModifyGroup'];
553 if (!\Bitrix\Socialnetwork\Helper\Workgroup::getEditFeaturesAvailability())
555 $canEditFeatures =
false;
559 'EDIT' => $permissions[
'UserCanModifyGroup'],
560 'DELETE' => $permissions[
'UserCanModifyGroup'],
561 'INVITE' => $permissions[
'UserCanInitiate'],
563 !$permissions[
'UserIsMember']
564 && !$permissions[
'UserRole']
567 $permissions[
'UserIsMember']
568 && !$permissions[
'UserIsAutoMember']
569 && !$permissions[
'UserIsOwner']
570 && !$permissions[
'UserIsScrumMaster']
572 'FOLLOW' => $permissions[
'UserIsMember'],
573 'PIN' => $permissions[
'UserIsMember'],
574 'EDIT_FEATURES' => $canEditFeatures,
578 private function getUserData(
int $groupId):
array
580 $permissions = Helper\Workgroup::getPermissions([
'groupId' => $groupId]);
583 'ROLE' => $permissions[
'UserRole'],
584 'INITIATED_BY_TYPE' => $permissions[
'InitiatedByType'],
587 && \CSocNetSubscription::isUserSubscribed($this->getCurrentUser()->
getId(),
'SG' . $groupId)
592 private function getDepartments($ufDepartments):
array
597 empty($ufDepartments)
598 || !is_array($ufDepartments)
599 || !Loader::includeModule(
'intranet')
605 $departmentsList = \CIntranetUtils::getDepartmentsData($ufDepartments);
606 if (empty($departmentsList))
611 foreach ($departmentsList as $id =>
$name)
613 if (($id = (
int)$id) <= 0)
627 private function isPin(
int $groupId,
int $currentUserId,
string $context =
''): bool
629 $query =
new Query(WorkgroupPinTable::getEntity());
637 ->where(
'GROUP_ID', $groupId)
638 ->where(
'USER_ID', $currentUserId)
644 ->whereNull(
'CONTEXT')
645 ->where(
'CONTEXT',
'')
653 $pin =
$query->setLimit(1)->exec()->fetchObject();
658 private function getListOfMembers(
int $groupId,
int $scrumMasterId):
array
662 $records = UserToGroupTable::query()
669 'NAME' =>
'USER.NAME',
670 'LAST_NAME' =>
'USER.LAST_NAME',
671 'SECOND_NAME' =>
'USER.SECOND_NAME',
672 'WORK_POSITION' =>
'USER.WORK_POSITION',
673 'LOGIN' =>
'USER.LOGIN',
674 'PERSONAL_PHOTO' =>
'USER.PERSONAL_PHOTO',
676 ->whereIn(
'GROUP_ID', $groupId)
678 ->exec()->fetchCollection()
683 foreach ($records as $record)
685 $user = $record->get(
'USER');
686 $imageIdList[$record->get(
'USER_ID')] =
$user->get(
'PERSONAL_PHOTO');
687 $members[] = $record;
689 $imageIdList = array_filter(
691 static function ($id) {
692 return (
int) $id > 0;
695 $avatars = $this->getUserAvatars($imageIdList);
697 foreach ($members as $member)
699 $memberId = (int) $member[
'USER_ID'];
703 $isScrumMaster = ($scrumMasterId === $memberId);
704 $memberUser = $member->getUser();
708 'isOwner' => $isOwner,
709 'isModerator' => $isModerator,
710 'isScrumMaster' => $isScrumMaster,
711 'isAutoMember' => $member[
'AUTO_MEMBER'],
712 'name' => $memberUser->getName(),
713 'lastName' => $memberUser->getLastName(),
714 'position' => $memberUser->getWorkPosition(),
715 'photo' => ($avatars[($imageIdList[$memberId] ??
'')] ??
''),
722 private function prepareFeatures(
int $groupId):
array
726 $baseFeatures = $this->getBaseFeatures($groupId);
728 foreach ($this->getAllowedFeatures() as $featureId => $feature)
730 if (array_key_exists($featureId, $baseFeatures))
733 'featureName' => $featureId,
734 'name' => Loc::getMessage(
'SOCIALNETWORK_WORKGROUP_'.strtoupper($featureId)),
735 'customName' => $baseFeatures[$featureId][
'FEATURE_NAME'] ??
'',
736 'id' => $baseFeatures[$featureId][
'ID'],
737 'active' => $baseFeatures[$featureId][
'ACTIVE'] ===
'Y',
745 private function getBaseFeatures(
int $groupId):
array
749 $queryObject = \CSocNetFeatures::getList(
752 'ENTITY_ID' => $groupId,
756 while ($featureFields = $queryObject->fetch())
758 $features[$featureFields[
'FEATURE']]= $featureFields;
764 private function getAllowedFeatures():
array
766 $allowedFeatures = \CSocNetAllowed::getAllowedFeatures();
779 'content_search' => 11,
783 uksort($allowedFeatures,
static function(
$a, $b) use ($sampleKeysList) {
785 $valA = ($sampleKeysList[
$a] ?? 100);
786 $valB = ($sampleKeysList[$b] ?? 100);
801 return array_filter($allowedFeatures,
function($feature) {
803 is_array($feature[
'allowed'])
809 private function getListOfAwaitingMembers(
int $groupId,
int $limit = 10,
int $offset = 0):
array
813 $records = UserToGroupTable::query()
819 'NAME' =>
'USER.NAME',
820 'LAST_NAME' =>
'USER.LAST_NAME',
821 'SECOND_NAME' =>
'USER.SECOND_NAME',
822 'LOGIN' =>
'USER.LOGIN',
823 'PERSONAL_PHOTO' =>
'USER.PERSONAL_PHOTO',
825 ->whereIn(
'GROUP_ID', $groupId)
830 ->exec()->fetchCollection()
835 foreach ($records as $record)
837 $user = $record->get(
'USER');
838 $imageIdList[$record->get(
'USER_ID')] =
$user->get(
'PERSONAL_PHOTO');
840 $members[] = $record;
842 $imageIdList = array_filter(
844 static function ($id) {
845 return (
int) $id > 0;
848 $avatars = $this->getUserAvatars($imageIdList);
850 foreach ($members as $member)
852 $memberId = (int) $member[
'USER_ID'];
854 $userNameFormatted = \CUser::formatName(\CSite::getNameFormat(), [
855 'NAME' => $member->get(
'USER')->get(
'NAME'),
856 'LAST_NAME' => $member->get(
'USER')->get(
'LAST_NAME'),
857 'SECOND_NAME' => $member->get(
'USER')->get(
'SECOND_NAME'),
858 'LOGIN' => $member->get(
'USER')->get(
'LOGIN'),
859 ], ModuleManager::isModuleInstalled(
'intranet'));
863 'name' => $userNameFormatted,
864 'photo' => ($avatars[($imageIdList[$memberId] ??
'')] ??
''),
871 private function getCounters(
int $groupId):
array
875 $counterProvider = Counter::getInstance($this->getCurrentUser()->
getId());
877 $availableCounters = [
878 CounterDictionary::COUNTER_WORKGROUP_REQUESTS_OUT,
879 CounterDictionary::COUNTER_WORKGROUP_REQUESTS_IN,
881 foreach ($availableCounters as
$counter)
892 'groupId' => $groupId,
893 'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
896 $this->addEmptyGroupIdError();
911 if (!in_array(
$key, $whiteList,
true))
922 Loc::getMessage(
'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'),
923 'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED')
941 Loc::getMessage(
'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'),
942 'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED')
947 $this->sendPush(PushEventDictionary::EVENT_WORKGROUP_UPDATE, [
949 'GROUP_ID' => $groupId,
964 return \CSocNetUserToGroup::DeleteRelation($this->userId, $groupId);
971 'groupId' => $groupId,
972 'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
976 $this->addEmptyGroupIdError();
983 $deleteResult = \CSocNetGroup::Delete($groupId);
984 if (!$deleteResult && ($e =
$APPLICATION->GetException()))
986 return $e->GetString();
994 return Helper\Workgroup::getAvatarTypes();
999 foreach ($departmentIds as $id)
1001 Helper\Workgroup::disconnectDepartment([
1002 'groupId' => $groupId,
1003 'departmentId' => $id,
1010 $groupId = (int)(
$params[
'groupId'] ?? 0);
1011 $getAdditionalResultData = (bool)(
$params[
'getAdditionalResultData'] ??
false);
1015 $this->addEmptyGroupIdError();
1021 $this->addIncorrectValueError();
1028 'GROUP_ID' => $groupId,
1029 'USER_ID' => $this->getCurrentUser()->getId(),
1035 $this->
addError(
new Error($e->getMessage(), $e->getCode()));
1041 $this->
addError(
new Error(Loc::getMessage(
'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'),
'SONET_CONTROLLER_WORKGROUP_ACTION_FAILED'));
1050 if ($getAdditionalResultData)
1052 $groupItem = \Bitrix\Socialnetwork\Item\Workgroup::getById($groupId);
1053 $groupFields = $groupItem->getFields();
1054 $groupUrlData = $groupItem->getGroupUrlData([
1055 'USER_ID' => $this->getCurrentUser()->getId(),
1058 $groupSiteList = [];
1059 $resSite = WorkgroupSiteTable::getList([
1061 '=GROUP_ID' => $groupId
1063 'select' => [
'SITE_ID' ],
1065 while ($groupSite = $resSite->fetch())
1067 $groupSiteList[] = $groupSite[
'SITE_ID'];
1070 $result[
'NAME'] = $groupFields[
'NAME'];
1071 $result[
'URL'] = $groupUrlData[
"URL"];
1073 Loader::includeModule(
'extranet')
1074 && CExtranet::isIntranetUser()
1075 && in_array(CExtranet::getExtranetSiteId(), $groupSiteList,
true)
1081 $this->sendPush(PushEventDictionary::EVENT_WORKGROUP_FAVORITES_CHANGED, [
'GROUP_ID' => $groupId]);
1088 $groupId = (int)(
$params[
'groupId'] ?? 0);
1091 $this->addEmptyGroupIdError();
1095 if (!in_array(
$params[
'value'] ??
null, Subscription::AVAILABLE_VALUES,
true))
1097 $this->addIncorrectValueError();
1104 'GROUP_ID' => $groupId,
1105 'USER_ID' => $this->getCurrentUser()->getId(),
1111 $this->
addError(
new Error($e->getMessage(), $e->getCode()));
1115 $this->sendPush(PushEventDictionary::EVENT_WORKGROUP_SUBSCRIBE_CHANGED, [
'GROUP_ID' => $groupId]);
1118 'RESULT' =>
$result ?
'Y' :
'N',
1124 $groupId = $this->getRequest()->get(
'groupId');
1128 $this->
addError(
new Error(
'SOCIALNETWORK_GROUP_AJAX_NO_UPDATE_PERMS'));
1132 $workgroupData = WorkgroupTable::getList([
1133 'select' => [
'ID',
'IMAGE_ID' ],
1139 $newPhotoFile = $this->getRequest()->getFile(
'newPhoto');
1141 if ($workgroupData[
'IMAGE_ID'])
1143 $newPhotoFile[
'old_file'] = $workgroupData[
'IMAGE_ID'];
1144 $newPhotoFile[
'del'] = $workgroupData[
'IMAGE_ID'];
1147 $res = \CSocNetGroup::update(
1149 [
'IMAGE_ID' => $newPhotoFile ],
1157 $this->
addError(
new Error(
'SOCIALNETWORK_GROUP_AJAX_FAILED'));
1161 $this->sendPush(PushEventDictionary::EVENT_WORKGROUP_UPDATE, [
1163 'GROUP_ID' => $groupId,
1172 $groupName = $this->getRequest()->get(
'groupName');
1173 $viewMode = $this->getRequest()->get(
'viewMode');
1174 $groupImage = $this->getRequest()->getFile(
'groupImage');
1175 $avatarColor = $this->getRequest()->get(
'avatarColor');
1179 return [
'groupId' => 0];
1182 $ownerId = $this->getCurrentUser()->getId();
1186 'NAME' => $groupName,
1187 'SUBJECT_ID' => $this->getDefaultSubjectId(),
1190 'VISIBLE' => $viewMode !==
'secret' ?
'Y' :
'N',
1191 'OPENED' => $viewMode ===
'open' ?
'Y' :
'N',
1194 if (is_array($groupImage))
1199 $result = $avatarManager->loadAvatar($groupImage);
1200 $groupParams[
'IMAGE_ID'] = $avatarManager->getAvatar(
$result[
'fileId']);
1202 catch (\RuntimeException)
1204 unset($groupParams[
'IMAGE_ID']);
1208 if (!isset($groupParams[
'IMAGE_ID']))
1210 $groupParams[
'AVATAR_TYPE'] = $this->getColoredDefaultAvatar($avatarColor);
1213 $groupId = (int)\CSocNetGroup::createGroup($ownerId, $groupParams);
1222 $this->setDefaultGroupFeatures($groupId);
1225 'groupId' => $groupId,
1244 $feature = $scrum ? Helper\Feature::SCRUM_CREATE : Helper\Feature::PROJECTS_GROUPS;
1251 Helper\Feature::turnOnTrial($feature);
1263 private function getColoredDefaultAvatar(
string $color): string
1265 if (in_array($color,
Helper\Workgroup::getAvatarColors(),
true))
1267 return "space_$color";
1270 return array_rand(
Helper\Workgroup::getColoredAvatarTypes());
1273 private function setDefaultGroupFeatures(
int $groupId): void
1275 $allowedFeatures = array_keys(\CSocNetAllowed::getAllowedFeatures());
1276 $inactiveFeaturesList = [
'forum',
'photo',
'search',
'group_lists',
'wiki'];
1279 foreach ($allowedFeatures as $featureName)
1281 $features[$featureName] = !in_array($featureName, $inactiveFeaturesList,
true);
1284 foreach ($features as $featureName => $isActive)
1286 \CSocNetFeatures::setFeature(
1295 private function getDefaultSubjectId(): int
1297 $subject = \CSocNetGroupSubject::GetList(
1298 [
"SORT"=>
"ASC",
"NAME" =>
"ASC"],
1305 return (
int)($subject[
'ID'] ?? 0);
1310 return Helper\Workgroup\Access::canCreate([
1311 'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
1319 if (!$membersManager->canInviteUsers($spaceId))
1324 $membersManager->updateInvitedUsers($spaceId, array_map(
static fn(
$userId) => (
int)
$userId, $users));
1332 string $signedParameters =
''
1337 $this->addEmptyGroupIdError();
1344 'groupId' => $groupId,
1345 'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
1354 $unsignedParameters = [];
1357 && $signedParameters !==
''
1364 if (!is_array($unsignedParameters))
1366 $unsignedParameters = [];
1390 $query = UserToGroupTable::query();
1397 'INITIATED_BY_TYPE',
1399 'NAME' =>
'USER.NAME',
1400 'LAST_NAME' =>
'USER.LAST_NAME',
1401 'SECOND_NAME' =>
'USER.SECOND_NAME',
1402 'LOGIN' =>
'USER.LOGIN',
1403 'PERSONAL_PHOTO' =>
'USER.PERSONAL_PHOTO',
1405 ->where(
'GROUP_ID', $groupId)
1406 ->whereIn(
'ROLE', $rolesMap[
$type])
1408 ->setOffset((
$page - 1) * $limit)
1409 ->exec()->fetchCollection();
1411 $isScrumMembers = (
$type ===
'scrumTeam');
1412 if ($isScrumMembers)
1414 $query->addSelect(
'GROUP.SCRUM_MASTER_ID',
'SCRUM_MASTER_ID');
1418 $resultMembers = [];
1420 foreach ($records as $member)
1422 $imageIds[$member->get(
'USER_ID')] = $member->get(
'USER')->get(
'PERSONAL_PHOTO');
1423 $resultMembers[] = $member;
1426 $imageIds = array_filter(
1428 static function ($id) {
return (
int)$id > 0; }
1430 $avatars = Helper\UI\Grid\Workgroup\Members::getUserAvatars($imageIds);
1431 $pathToUser = ($unsignedParameters[
'PATH_TO_USER'] ?? Helper\Path::get(
'user_profile'));
1432 $userNameTemplate = ($unsignedParameters[
'NAME_TEMPLATE'] ?? \CSite::getNameFormat());
1433 $isIntranetInstalled = ModuleManager::isModuleInstalled(
'intranet');
1437 foreach ($resultMembers as $member)
1439 $id = $member->get(
'USER_ID');
1440 $userNameFormatted = \CUser::formatName($userNameTemplate, [
1441 'NAME' => $member->get(
'USER')->get(
'NAME'),
1442 'LAST_NAME' => $member->get(
'USER')->get(
'LAST_NAME'),
1443 'SECOND_NAME' => $member->get(
'USER')->get(
'SECOND_NAME'),
1444 'LOGIN' => $member->get(
'USER')->get(
'LOGIN'),
1445 ], $isIntranetInstalled);
1454 'PHOTO' => $avatars[$imageIds[$id] ??
null] ??
'',
1456 'FORMATTED_NAME' => $userNameFormatted,
1457 'ROLE' => ($isScrumMembers ? $this->getScrumRole($member) : $member->get(
'ROLE')),
1460 if ($isScrumMembers)
1464 && $member->get(
'USER_ID') === $member->get(
'GROUP')->get(
'SCRUM_MASTER_ID')
1469 'PHOTO' => $avatars[$imageIds[$id] ??
null] ??
'',
1471 'FORMATTED_NAME' => $userNameFormatted,
1481 private function getScrumRole(EO_UserToGroup $member): string
1484 $member->get(
'USER_ID') === $member->get(
'GROUP')->get(
'SCRUM_MASTER_ID')
1491 return $member->get(
'ROLE');
1501 string $signedParameters =
''
1504 $unsignedParameters = [];
1507 && $signedParameters !==
''
1511 if (!is_array($unsignedParameters))
1513 $unsignedParameters = [];
1517 $mode = ($unsignedParameters[
'MODE'] ??
'');
1521 foreach ($groupIdList as $groupId)
1523 $groupId = (int)$groupId;
1528 'groupId' => $groupId,
1537 $pin =
new Pin($this->userId, $groupId, $mode);
1546 $this->sendPush(PushEventDictionary::EVENT_WORKGROUP_PIN_CHANGED, [
1547 'GROUP_ID' => $groupId,
1555 $this->addEmptyGroupIdError();
1571 'groupId' => $groupId,
1579 EventDictionary::EVENT_WORKGROUP_MEMBER_REQUEST_CONFIRM,
1581 'GROUP_ID' => $groupId,
1582 'RECEPIENTS' => array_map(
function ($row) {
return $row[
'USER_ID']; }, $moderators),
1605 'groupId' => $groupId,
1613 EventDictionary::EVENT_WORKGROUP_MEMBER_REQUEST_CONFIRM,
1615 'GROUP_ID' => $groupId,
1616 'RECEPIENTS' => array_map(
function ($row) {
return $row[
'USER_ID']; }, $moderators),
1632 $permissions = Helper\Workgroup::getPermissions(
1633 [
'groupId' => $groupId]
1635 if (!$permissions[
'UserCanModifyGroup'] && !$permissions[
'UserCanInitiate'])
1643 $offset = ($pageNum - 1) * $limit;
1645 return $this->getListOfAwaitingMembers($groupId, $limit, $offset);
1652 if (!Loader::includeModule(
'im'))
1659 'group_id' => $groupId,
1660 'skipAvailabilityCheck' =>
true,
1663 if (!empty($chatData[$groupId]) && intval($chatData[$groupId]) > 0)
1665 $chatId = $chatData[$groupId];
1671 'group_id' => $groupId,
1683 'groupId' => $groupId,
1684 'checkAdminSession' => ($this->getScope() !== Controller::SCOPE_REST),
1688 $this->addEmptyGroupIdError();
1693 $allowedFeatures = array_keys(\CSocNetAllowed::getAllowedFeatures());
1695 $featureId = is_string($feature[
'featureName'] ??
null) ? $feature[
'featureName'] :
'';
1696 $customName = is_string($feature[
'customName'] ??
null) ? $feature[
'customName'] :
false;
1697 $featureActive = is_string($feature[
'active'] ??
null) && $feature[
'active'] ===
'true';
1701 if (in_array($featureId, $allowedFeatures,
true))
1703 \CSocNetFeatures::setFeature(
1714 if ($featureActive === in_array($featureId ,$activeFeatures))
1719 if ($featureActive && !in_array($featureId ,$activeFeatures))
1724 if (!$featureActive && in_array($featureId ,$activeFeatures))
1729 $this->sendPush(PushEventDictionary::EVENT_SPACE_FEATURE_CHANGE, [
1730 'GROUP_ID' => $groupId,
1731 'FEATURE' => $feature,
1739 private function getUserAvatars(
array $imageIds):
array
1742 if (empty($imageIds))
1747 $result = array_fill_keys($imageIds,
'');
1749 $res = \CFile::getList([], [
'@ID' => implode(
',', $imageIds)]);
1750 while ($file =
$res->fetch())
1752 $file[
'SRC'] = \CFile::getFileSRC($file);
1753 $fileInfo = \CFile::resizeImageGet(
1765 $result[$file[
'ID']] = $fileInfo[
'src'];
1771 private function sendPush(
string $command,
array $parameters = []): void
1774 PushService::addEvent(
1777 'module_id' =>
'socialnetwork',
1778 'command' => $command,
1779 'params' => $parameters,
1784 private function addEmptyGroupIdError(): void
1788 Loc::getMessage(
'SONET_CONTROLLER_WORKGROUP_EMPTY'),
1789 'SONET_CONTROLLER_WORKGROUP_EMPTY'
1794 private function addIncorrectValueError(): void
1797 'SONET_CONTROLLER_WORKGROUP_INCORRECT_VALUE',
1798 'SONET_CONTROLLER_WORKGROUP_INCORRECT_VALUE'