7use Bitrix\Socialnetwork\Item\Workgroup\Type;
14 private const USERS_STEP_COUNT = 500;
22 static $resultCache =
array();
24 $userId = intval(CurrentUser::get()->getId());
26 if(!isset($resultCache[
$userId]))
28 $arLastSelected = CUserOptions::GetOption(
"socialnetwork",
"log_destination",
array());
30 is_array($arLastSelected)
31 && $arLastSelected[
'users'] <>
''
32 && $arLastSelected[
'users'] !==
'"{}"'
33 ? array_reverse(CUtil::JsObjectToPhp($arLastSelected[
'users']))
37 if (is_array($arLastSelected))
39 if (!isset($arLastSelected[
$userId]))
41 $arLastSelected[
'U'.$userId] =
'U'.$userId;
46 $arLastSelected[
'U'.$userId] =
'U'.$userId;
51 foreach ($arLastSelected as
$userId)
64 $resultCache[
$userId] = array_reverse($arUsers);
76 $arLastSelected = CUserOptions::GetOption(
"socialnetwork",
"log_destination",
array());
78 is_array($arLastSelected)
79 && $arLastSelected[
'sonetgroups'] <>
''
80 && $arLastSelected[
'sonetgroups'] !==
'"{}"'
81 ? array_reverse(CUtil::JsObjectToPhp($arLastSelected[
'sonetgroups']))
86 $arSocnetGroups = Array();
87 foreach ($arLastSelected as $sgId)
98 $arSocnetGroups[$sgId] = $sgId;
100 return array_reverse($arSocnetGroups);
109 $arLastSelected = CUserOptions::GetOption(
"socialnetwork",
"log_destination",
array());
111 is_array($arLastSelected)
112 && $arLastSelected[
'department'] <>
''
113 && $arLastSelected[
'department'] !==
'"{}"'
114 ? array_reverse(CUtil::JsObjectToPhp($arLastSelected[
'department']))
119 $arDepartment = Array();
120 foreach ($arLastSelected as $depId)
131 $arDepartment[$depId] = $depId;
134 return array_reverse($arDepartment);
139 $bIntranetEnabled =
false;
145 $bIntranetEnabled =
true;
149 "department" =>
array(),
150 "department_relation" =>
array(),
151 "department_relation_head" =>
array(),
156 && intval(
$arParams[
"DEPARTMENT_ID"]) > 0
161 if($bIntranetEnabled)
163 if (!(CModule::IncludeModule(
'extranet') && !CExtranet::IsIntranetUser()))
165 if(($iblock_id = COption::GetOptionInt(
'intranet',
'iblock_structure', 0)) > 0)
170 defined(
"BX_COMP_MANAGED_CACHE")
175 $cache_id =
'sonet_structure_new4_'.$iblock_id.(intval($department_id) > 0 ?
"_".$department_id :
"");
177 $cache_dir =
'/sonet/structure';
179 if($obCache->InitCache($ttl, $cache_id, $cache_dir))
185 CModule::IncludeModule(
'iblock');
187 if(defined(
"BX_COMP_MANAGED_CACHE"))
193 "IBLOCK_ID" => $iblock_id,
197 if (intval($department_id) > 0)
199 $rsSectionDepartment = CIBlockSection::GetList(
202 "ID" => intval($department_id)
205 array(
"ID",
"LEFT_MARGIN",
"RIGHT_MARGIN")
208 if ($arSectionDepartment = $rsSectionDepartment->Fetch())
210 $arFilter[
">=LEFT_MARGIN"] = $arSectionDepartment[
"LEFT_MARGIN"];
211 $arFilter[
"<=RIGHT_MARGIN"] = $arSectionDepartment[
"RIGHT_MARGIN"];
215 $dbRes = CIBlockSection::GetList(
216 array(
"left_margin"=>
"asc"),
219 array(
"ID",
"IBLOCK_SECTION_ID",
"NAME")
224 'id' =>
'DR'.
$ar[
'ID'],
225 'entityId' =>
$ar[
"ID"],
227 'parent' =>
'DR'.intval(
$ar[
'IBLOCK_SECTION_ID']),
230 if(defined(
"BX_COMP_MANAGED_CACHE"))
236 if($obCache->StartDataCache())
238 $obCache->EndDataCache(
$result);
250 $result[
"department_relation"] = self::GetTreeList(
'DR'.(intval($department_id) > 0 ? $department_id : 0),
$result[
"department"],
true);
251 if ((
int) (
$arParams[
"HEAD_DEPT"] ?? 0) > 0)
253 $result[
"department_relation_head"] = self::GetTreeList(
'DR'.intval(
$arParams[
"HEAD_DEPT"]),
$result[
"department"],
true);
264 static $resultCache =
array();
266 $userId = (int)CurrentUser::get()->getId();
268 if(!isset($resultCache[
$userId]))
272 if (CModule::IncludeModule(
'extranet') && !CExtranet::IsIntranetUser())
275 $cacheId =
'socnet_destination_getusers_'.md5(serialize(
$arParams)).
'_'.
$userId;
276 $cacheDir =
'/socnet/dest_extranet/' . (int)(
$userId / 100) .
'/' .
$userId .
'/';
279 if($obCache->initCache($cacheTtl, $cacheId, $cacheDir))
281 $arUsers = $obCache->getVars();
285 $obCache->startDataCache();
286 if(defined(
"BX_COMP_MANAGED_CACHE"))
291 if(defined(
"BX_COMP_MANAGED_CACHE"))
296 $workgroupIdList = [];
297 $res = CSocNetUserToGroup::getList(
302 "GROUP_SITE_ID" =>
's1',
303 "GROUP_ACTIVE" =>
"Y",
304 "!GROUP_CLOSED" =>
"Y"
308 array(
"ID",
"GROUP_ID")
310 while($relationFields =
$res->fetch())
312 $workgroupIdList[] = (int)$relationFields[
"GROUP_ID"];
313 if(defined(
"BX_COMP_MANAGED_CACHE"))
315 $CACHE_MANAGER->registerTag(
"sonet_user2group_G".$relationFields[
"GROUP_ID"]);
321 if (!empty($workgroupIdList))
323 $arUsers = self::getUsersAll([
324 'RETURN_FULL_LIST' =>
'Y'
327 if (defined(
"BX_COMP_MANAGED_CACHE"))
329 foreach($arUsers as $userData)
331 $CACHE_MANAGER->registerTag(
"USER_NAME_".(
int)$userData[
'entityId']);
336 $obCache->endDataCache($arUsers);
340 $resultCache[
$userId] = $arUsers;
350 $userId = (int)CurrentUser::get()->getId();
364 unset($arParamsNew[
"all"]);
387 $arExternalAuthId = self::getExternalAuthIdBlackList([
391 if (!empty($arExternalAuthId))
393 $filter[
'!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
403 || COption::GetOptionString(
"main",
"new_user_registration_email_confirmation",
"N") ===
"Y"
407 $filter[
"=CONFIRM_CODE"] =
false;
410 $select = [
"ID",
"LAST_NAME",
"NAME",
"SECOND_NAME",
"LOGIN",
"EMAIL",
"PERSONAL_PHOTO",
"WORK_POSITION",
"PERSONAL_PROFESSION",
"IS_ONLINE",
"EXTERNAL_AUTH_ID" ];
415 && ModuleManager::isModuleInstalled(
'crm')
418 $select[] =
'UF_USER_CRM_ENTITY';
421 if (ModuleManager::isModuleInstalled(
'intranet'))
440 && !in_array($value, $arSelect)
443 $arSelect[] = intval($value);
452 if (is_array(
$arParams[
'deportament_id']))
458 if (
$arParams[
'deportament_id'] ===
'EX')
470 "width" => (intval(
$arParams[
"THUMBNAIL_SIZE_WIDTH"] ?? 0) > 0 ?
$arParams[
"THUMBNAIL_SIZE_WIDTH"] : 100),
471 "height" => (intval(
$arParams[
"THUMBNAIL_SIZE_HEIGHT"] ?? 0) > 0 ?
$arParams[
"THUMBNAIL_SIZE_HEIGHT"] : 100)
475 $cacheId =
'socnet_destination_getusers_'.md5(serialize(
$filter)).$bSelf.CSocNetUser::IsCurrentUserModuleAdmin().($bExtranet ?
'_ex_'.$userId :
'').md5(serialize($avatarSize));
476 $cacheDir =
'/socnet/dest/'.(
480 ) .
'/' . mb_substr(md5($cacheId), 0, 2) .
'/';
483 if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
485 $arUsers = $obCache->GetVars();
489 $obCache->StartDataCache();
490 if(defined(
"BX_COMP_MANAGED_CACHE"))
497 && CModule::IncludeModule(
"extranet")
500 $extranetSiteId = CExtranet::GetExtranetSiteID();
503 $rsSonetGroup = CSocNetUserToGroup::GetList(
507 "GROUP_SITE_ID" => $extranetSiteId
513 while($arSonetGroup = $rsSonetGroup->Fetch())
515 $CACHE_MANAGER->RegisterTag(
"sonet_user2group_G".$arSonetGroup[
"GROUP_ID"]);
521 $arExtranetUsers = CExtranet::GetMyGroupsUsersFull($extranetSiteId, $bSelf);
522 foreach($arExtranetUsers as $arUserTmp)
524 if (!empty($arUserTmp[
'UF_DEPARTMENT']))
529 $sName = trim(CUser::FormatName(empty(
$arParams[
"NAME_TEMPLATE"]) ? CSite::GetNameFormat(
false) :
$arParams[
"NAME_TEMPLATE"], $arUserTmp,
true,
false));
532 $sName = $arUserTmp[
"~LOGIN"];
535 $arFileTmp = CFile::ResizeImageGet(
536 $arUserTmp[
"PERSONAL_PHOTO"],
542 $arUsers[
'U'.$arUserTmp[
"ID"]] = Array(
543 'id' =>
'U'.$arUserTmp[
"ID"],
544 'entityId' => $arUserTmp[
"ID"],
545 'email' => $arUserTmp[
"EMAIL"] ? $arUserTmp[
"EMAIL"] :
'',
547 'avatar' => empty($arFileTmp[
'src'])?
'': $arFileTmp[
'src'],
548 'desc' => self::getUserDescription($arUserTmp, [
549 'showEmail' => !empty(
$arParams[
"ONLY_WITH_EMAIL"])
552 if (defined(
"BX_COMP_MANAGED_CACHE"))
554 $CACHE_MANAGER->RegisterTag(
"USER_NAME_".intval($arUserTmp[
"ID"]));
560 $bExtranetInstalled = CModule::IncludeModule(
"extranet");
564 !isset(
$filter[
'UF_DEPARTMENT'])
565 && $bExtranetInstalled
568 $arUserIdVisible = CExtranet::getMyGroupsUsersSimple(CExtranet::getExtranetSiteId());
571 $order = [
'LAST_NAME' =>
'ASC' ];
576 $res = $className::getList([
584 while ($arUser =
$res->fetch())
586 foreach($arUser as
$key => $value)
588 if (is_string($value))
604 !isset(
$filter[
'UF_DEPARTMENT'])
605 && $bExtranetInstalled
609 isset($arUser[
"UF_DEPARTMENT"])
610 && $arUser[
'EXTERNAL_AUTH_ID'] !==
'email'
612 $arUser[
'EXTERNAL_AUTH_ID'] !==
'bot'
617 !is_array($arUser[
"UF_DEPARTMENT"])
618 || empty($arUser[
"UF_DEPARTMENT"])
619 || (
int)$arUser[
"UF_DEPARTMENT"][0] <= 0
622 empty($arUserIdVisible)
623 || !is_array($arUserIdVisible)
624 || !in_array($arUser[
"ID"], $arUserIdVisible)
632 $sName = trim(CUser::FormatName(empty(
$arParams[
"NAME_TEMPLATE"]) ? CSite::GetNameFormat(
false) :
$arParams[
"NAME_TEMPLATE"], $arUser,
true,
false));
636 $sName = htmlspecialcharsBack($arUser[
"LOGIN"]);
639 $arFileTmp = CFile::ResizeImageGet(
640 $arUser[
"PERSONAL_PHOTO"],
646 $arUsers[
'U'.$arUser[
"ID"]] = Array(
647 'id' =>
'U'.$arUser[
"ID"],
648 'entityId' => $arUser[
"ID"],
649 'email' => $arUser[
"EMAIL"],
651 'avatar' => empty($arFileTmp[
'src'])?
'': $arFileTmp[
'src'],
652 'desc' => self::getUserDescription($arUser, [
653 'showEmail' => !empty(
$arParams[
"ONLY_WITH_EMAIL"])
655 'isExtranet' => (isset($arUser[
'USER_TYPE']) && $arUser[
'USER_TYPE'] ===
'extranet' ?
"Y" :
"N"),
656 'isEmail' => ($arUser[
'EXTERNAL_AUTH_ID'] ===
'email' ?
'Y' :
'N'),
658 $arUser[
'EXTERNAL_AUTH_ID'] ===
'email'
659 && !empty($arUser[
'UF_USER_CRM_ENTITY'])
665 if ($arUser[
'EXTERNAL_AUTH_ID'] ===
'email')
667 $arUsers[
'U'.$arUser[
"ID"]][
'email'] = $arUser[
'EMAIL'];
670 $arUsers[
'U'.$arUser[
"ID"]][
'checksum'] = md5(serialize($arUsers[
'U'.$arUser[
"ID"]]));
672 if (defined(
"BX_COMP_MANAGED_CACHE"))
679 if (defined(
"BX_COMP_MANAGED_CACHE"))
682 if (!empty(
$filter[
'UF_DEPARTMENT']))
689 $obCache->EndDataCache($arUsers);
697 static $resultCache =
array();
699 $userId = intval(CurrentUser::get()->getId());
701 if(!isset($resultCache[
$userId]))
703 $arSubordinateDepts =
array();
705 if (CModule::IncludeModule(
"intranet"))
707 $arSubordinateDepts = CIntranetUtils::GetSubordinateDepartments(
$userId,
true);
712 "!UF_DEPARTMENT" =>
false
715 $arExtParams = Array(
716 "FIELDS" => Array(
"ID",
"LAST_NAME",
"NAME",
"SECOND_NAME",
"LOGIN",
"EMAIL",
"PERSONAL_PHOTO",
"WORK_POSITION",
"PERSONAL_PROFESSION",
"IS_ONLINE"),
717 "SELECT" => Array(
"UF_DEPARTMENT")
731 $arSelect[] = intval($value);
733 $arFilter[
"ID"] = implode(
"|", $arSelect);
737 $arGratUsers = Array();
738 $arMedalUsers = Array();
740 $dbUsers = CUser::GetList(Array(
"last_name" =>
"asc",
"IS_ONLINE" =>
"desc"),
'',
$arFilter, $arExtParams);
741 while ($arUser = $dbUsers->GetNext())
743 $sName = trim(CUser::FormatName(empty(
$arParams[
"NAME_TEMPLATE"]) ? CSite::GetNameFormat(
false) :
$arParams[
"NAME_TEMPLATE"], $arUser));
747 $sName = $arUser[
"~LOGIN"];
750 $arFileTmp = CFile::ResizeImageGet(
751 $arUser[
"PERSONAL_PHOTO"],
752 array(
"width" => 100,
"height" => 100),
757 $arGratUsers[
'U'.$arUser[
"ID"]] = Array(
758 "id" =>
"U".$arUser[
"ID"],
759 "entityId" => $arUser[
"ID"],
760 "email" => $arUser[
"EMAIL"],
762 "avatar" => empty($arFileTmp[
"src"]) ?
'' : $arFileTmp[
"src"],
763 "desc" => $arUser[
"WORK_POSITION"] ? $arUser[
"WORK_POSITION"] : ($arUser[
"PERSONAL_PROFESSION"] ? $arUser[
"PERSONAL_PROFESSION"] :
" "),
767 count($arSubordinateDepts) > 0
768 &&
count(array_intersect($arSubordinateDepts, $arUser[
"UF_DEPARTMENT"])) > 0
771 $arMedalUsers[
'U'.$arUser[
"ID"]] = $arGratUsers[
'U'.$arUser[
"ID"]];
774 $resultCache[
$userId] =
array(
"GRAT" => $arGratUsers,
"MEDAL" => $arMedalUsers);
782 $val = str_replace(
'%',
'',
$val).
"%";
785 public static function searchUsers($search, &$nt =
"", $bSelf =
true, $bEmployeesOnly =
false, $bExtranetOnly =
false, $departmentId =
false)
790 $bEmailUsers =
false;
791 $bCrmEmailUsers =
false;
793 $bNetworkSearch =
false;
794 $bSearchOnlyWithEmail =
false;
796 $showAllExtranetContacts =
false;
798 if (is_array($search))
802 $nameTemplate = (
$arParams[
"NAME_TEMPLATE"] ??
'');
804 $bEmployeesOnly = (
$arParams[
"EMPLOYEES_ONLY"] ??
false);
805 $bExtranetOnly = (
$arParams[
"EXTRANET_ONLY"] ??
false);
806 $departmentId = (
$arParams[
"DEPARTAMENT_ID"] ??
false);
807 $bEmailUsers = (
$arParams[
"EMAIL_USERS"] ??
false);
808 $bCrmEmailUsers = (isset(
$arParams[
"CRMEMAIL_USERS"]) && ModuleManager::isModuleInstalled(
'crm') ?
$arParams[
"CRMEMAIL_USERS"] :
false);
810 $bNetworkSearch = (
$arParams[
"NETWORK_SEARCH"] ??
false);
811 $bSearchOnlyWithEmail = (
$arParams[
"ONLY_WITH_EMAIL"] ??
false);
812 $allowBots = (
$arParams[
'ALLOW_BOTS'] ??
false);
813 $showAllExtranetContacts = (
$arParams[
'SHOW_ALL_EXTRANET_CONTACTS'] ??
false);
817 $search = trim($search);
826 $bSearchByEmail =
false;
828 if (preg_match(
'/^([^<]+)\s<([^>]+)>$/i', $search,
$matches))
832 $bSearchByEmail =
true;
836 $bExtranetEnabled = CModule::IncludeModule(
'extranet');
841 $bExtranetUser = ($bExtranetEnabled && !CExtranet::IsIntranetUser());
843 $current_user_id = (int)CurrentUser::get()->getId();
845 if ($bExtranetEnabled)
850 $arSearchValue = preg_split(
'/\s+/', trim(mb_strtoupper($search)));
851 array_walk($arSearchValue,
array(
'CSocNetLogDestination',
'__percent_walk'));
853 $arMyUserId =
array();
857 $useFulltextIndex = class_exists(
'\Bitrix\Main\UserIndexTable');
859 if ($useFulltextIndex)
865 if (
count($arSearchValue) == 2)
867 $arLogicFilter =
array(
869 array(
'LOGIC' =>
'AND',
'NAME' => $arSearchValue[0],
'LAST_NAME' => $arSearchValue[1]),
870 array(
'LOGIC' =>
'AND',
'NAME' => $arSearchValue[1],
'LAST_NAME' => $arSearchValue[0]),
875 $arLogicFilter =
array(
877 'NAME' => $arSearchValue,
878 'LAST_NAME' => $arSearchValue,
883 &&
count($arSearchValue) == 1
884 && mb_strlen($arSearchValue[0]) > 2
887 $arLogicFilter[
'LOGIN'] = $arSearchValue[0];
899 if ($bIntranetEnabled)
901 $arExternalAuthId = self::getExternalAuthIdBlackList(
array(
902 'NETWORK_SEARCH' => $bNetworkSearch,
903 'ALLOW_BOTS' => $allowBots
906 if (!empty($arExternalAuthId))
908 $filter[
'!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
912 ($bEmailUsers || $bCrmEmailUsers)
917 $finderDestFilter =
array(
918 "USER_ID" => $current_user_id,
920 "=CODE_USER.EXTERNAL_AUTH_ID" =>
'email'
922 $finderDestSelect =
array(
928 $finderDestFilter[
'!=CODE_USER.UF_USER_CRM_ENTITY'] =
false;
929 $finderDestSelect[] =
'CODE_USER.UF_USER_CRM_ENTITY';
934 'filter' => $finderDestFilter,
935 'group' =>
array(
"CODE_USER_ID"),
936 'select' => $finderDestSelect
939 while ($arUser = $rsUser->fetch())
941 $arMyUserId[] = $arUser[
'CODE_USER_ID'];
950 || COption::GetOptionString(
"main",
"new_user_registration_email_confirmation",
"N") ===
"Y"
954 $filter[
"CONFIRM_CODE"] =
false;
957 $bFilteredByMyUserId =
false;
965 CExtranet::fillUserListFilterORM(
967 "CURRENT_USER_ID" => $current_user_id,
968 "EXTRANET_USER" => $bExtranetUser,
969 "INTRANET_ONLY" => ($bEmployeesOnly || ($bBitrix24Enabled && !$bExtranetEnabled)),
970 "EXTRANET_ONLY" => $bExtranetOnly,
971 "EMAIL_USERS_ALL" => $bEmailUsersAll,
972 "MY_USERS" => $arMyUserId,
973 'ALLOW_BOTS' => $allowBots,
974 'SHOW_ALL_EXTRANET_CONTACTS' => $showAllExtranetContacts
994 && !$bFilteredByMyUserId
999 '!=EXTERNAL_AUTH_ID' =>
'email',
1000 'ID' => $arMyUserId,
1004 if ($bSearchOnlyWithEmail)
1018 "PERSONAL_PROFESSION",
1022 new \
Bitrix\Main\Entity\ExpressionField(
'MAX_LAST_USE_DATE',
'MAX(%s)',
array(
'\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE'))
1025 if ($bCrmEmailUsers)
1027 $select[] =
"UF_USER_CRM_ENTITY";
1035 if ($useFulltextIndex)
1037 $select[
'SEARCH_USER_CONTENT'] =
'INDEX.SEARCH_USER_CONTENT';
1040 $db_events =
GetModuleEvents(
"socialnetwork",
"OnSocNetLogDestinationSearchUsers");
1041 while ($arEvent = $db_events->Fetch())
1047 if ($useFulltextIndex)
1051 "MAX_LAST_USE_DATE" =>
'DESC',
1052 'LAST_NAME' =>
'ASC'
1057 new \
Bitrix\Main\Entity\ExpressionField(
'MAX_LAST_USE_DATE',
'MAX(%s)',
array(
'\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE'))
1060 'data_doubling' =>
false
1065 while ($arUser = $rsUserFulltext->fetch())
1067 $userIdList[] = $arUser[
'ID'];
1070 if (!empty($userIdList))
1074 "MAX_LAST_USE_DATE" =>
'DESC',
1075 'LAST_NAME' =>
'ASC'
1078 '@ID' => $userIdList
1088 "MAX_LAST_USE_DATE" =>
'DESC',
1089 'LAST_NAME' =>
'ASC'
1094 'data_doubling' =>
false
1098 $queryResultCnt = 0;
1099 if ($rsUser !==
null)
1101 $bUseLogin = (mb_strlen($search) > 3 && mb_strpos($search,
'@') > 0);
1103 "NAME_TEMPLATE" => $nameTemplate,
1104 "USE_EMAIL" => $bSearchByEmail,
1105 "USE_LOGIN" => $bUseLogin,
1106 "ONLY_WITH_EMAIL" => $bSearchOnlyWithEmail
1108 while ($arUser = $rsUser->fetch())
1113 && $current_user_id === (
int)$arUser[
'ID']
1119 if ((
int)$departmentId > 0)
1121 $arUserGroupCode = CAccess::GetUserCodesArray($arUser[
"ID"]);
1123 if (!in_array(
"DR" . (
int)$departmentId, $arUserGroupCode,
true))
1130 $arUser[
"EXTERNAL_AUTH_ID"] ===
"replica"
1131 ? self::formatNetworkUser($arUser,
$params)
1132 : self::formatUser($arUser,
$params)
1135 $arUsers[$arUser[
"id"]] = $arUser;
1140 ($bEmailUsers || $bCrmEmailUsers || $bSearchOnlyWithEmail)
1145 $arEmailFilter =
array(
1150 if (!empty($arExternalAuthId))
1152 $arEmailFilter[
'!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
1157 'filter' => $arEmailFilter,
1166 "PERSONAL_PROFESSION",
1171 new \
Bitrix\Main\Entity\ExpressionField(
'EMAIL_OK',
'CASE WHEN UPPER(%s) = \''.
$DB->ForSql(mb_strtoupper(str_replace(
'%',
'%%', $search))).
'\' THEN 1 ELSE 0 END
', ['EMAIL'])
1176 while ($arUser = $rsUser->fetch())
1178 $arUsers['U
'.$arUser["ID"]] = self::formatUser($arUser, array(
1179 "NAME_TEMPLATE" => $nameTemplate,
1180 "USE_EMAIL" => true,
1181 "ONLY_WITH_EMAIL" => $bSearchOnlyWithEmail
1189 public static function searchSonetGroups($params = array())
1193 $search = is_array($params) && isset($params['SEARCH
']) ? trim($params['SEARCH
']) : '';
1201 || !getFilterQuery("TEST", $search)
1214 $currentUserAdmin = CSocNetUser::isCurrentUserModuleAdmin($siteId);
1220 "SITE_ID" => $siteId,
1225 !empty($params['LANDING
'])
1226 && $params['LANDING
'] === 'Y
'
1229 $filter['LANDING
'] = 'Y
';
1232 if (!$currentUserAdmin)
1234 $filter["CHECK_PERMISSIONS"] = (int)CurrentUser::get()->getId();
1237 if (!CollabFeature::isFeatureEnabledInPortalSettings())
1239 $filter['!TYPE
'] = Type::Collab->value;
1242 $res = CSocnetGroup::getList(
1243 array("NAME" => "ASC"),
1246 array("nTopCount" => 50),
1247 array("ID", "NAME", "DESCRIPTION", "IMAGE_ID")
1250 $extranetGroupsIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetSonetGroupIdList();
1252 while ($group = $res->fetch())
1255 "id" => $group["ID"],
1256 "entityId" => $group["ID"],
1257 "name" => htmlspecialcharsbx(Emoji::decode($group["NAME"])),
1258 "desc" => htmlspecialcharsbx(Emoji::decode($group["DESCRIPTION"])),
1259 "isExtranet" => (in_array($group["ID"], $extranetGroupsIdList) ? 'Y
' : 'N
')
1262 if($group["IMAGE_ID"])
1264 $imageFile = CFile::getFileArray($group["IMAGE_ID"]);
1265 if ($imageFile !== false)
1267 $arFileTmp = CFile::resizeImageGet(
1270 "width" => ((int)($params["THUMBNAIL_SIZE_WIDTH"] ?? null) > 0 ? $params["THUMBNAIL_SIZE_WIDTH"] : 100),
1271 "height" => ((int)($params["THUMBNAIL_SIZE_HEIGHT"] ?? null) > 0 ? $params["THUMBNAIL_SIZE_HEIGHT"] : 100),
1273 BX_RESIZE_IMAGE_PROPORTIONAL,
1276 $tmp["avatar"] = $arFileTmp["src"];
1279 unset($group["IMAGE_ID"]);
1280 $tmpList[$tmp['id']] = $tmp;
1285 && isset($params['FEATURES
'])
1286 && is_array($params['FEATURES
'])
1287 && !empty($params['FEATURES
'])
1290 self::getSocnetGroupFilteredByFeaturePerms($tmpList, $params['FEATURES
']);
1295 && isset($params['INITIATE
'])
1296 && $params['INITIATE
'] === 'Y
'
1299 self::getSocnetGroupFilteredByInitiatePerms($tmpList);
1302 foreach ($tmpList as $value)
1304 $value['id'] = 'SG
'.$value['id'];
1305 $result[$value['id']] = $value;
1311 public static function SearchCrmEntities($arParams)
1315 $search = (!empty($arParams['SEARCH
']) ? $arParams['SEARCH
'] : false);
1318 && CModule::IncludeModule('crm
')
1321 if (check_email($search, true))
1326 empty($arParams['ENTITIES
'])
1327 || in_array('CONTACT
', $arParams['ENTITIES
'])
1330 $dbRes = CCrmContact::GetListEx(
1333 'CHECK_PERMISSIONS
' => 'Y
',
1334 '@CATEGORY_ID
' => 0,
1343 array('ID
', 'NAME
', 'SECOND_NAME
', 'LAST_NAME
', 'PHOTO
')
1345 while($ar = $dbRes->Fetch())
1347 $formatted = self::formatCrmEmailEntity($ar, array(
1348 'TYPE
' => 'CONTACT
',
1349 'NAME_TEMPLATE
' => $arParams["NAME_TEMPLATE"],
1352 if (!empty($formatted))
1354 $result[$formatted['id']] = $formatted;
1360 empty($arParams['ENTITIES
'])
1361 || in_array('COMPANY
', $arParams['ENTITIES
'])
1364 $dbRes = CCrmCompany::GetListEx(
1367 'CHECK_PERMISSIONS
' => 'Y
',
1368 '@CATEGORY_ID
' => 0,
1377 array('ID
', 'TITLE
', 'LOGO
')
1379 while($ar = $dbRes->Fetch())
1381 $formatted = self::formatCrmEmailEntity($ar, array(
1382 'TYPE
' => 'COMPANY
',
1385 if (!empty($formatted))
1387 $result[$formatted['id']] = $formatted;
1393 empty($arParams['ENTITIES
'])
1394 || in_array('LEAD
', $arParams['ENTITIES
'])
1397 $dbRes = CCrmLead::GetListEx(
1400 'CHECK_PERMISSIONS
' => 'Y
',
1409 array('ID
', 'TITLE
', 'NAME
', 'SECOND_NAME
', 'LAST_NAME
')
1411 while($ar = $dbRes->Fetch())
1413 $formatted = self::formatCrmEmailEntity($ar, array(
1417 if (!empty($formatted))
1419 $result[$formatted['id']] = $formatted;
1425 !isset($arParams['SEARCH_BY_EMAIL_ONLY
'])
1426 || $arParams['SEARCH_BY_EMAIL_ONLY
'] !== 'Y
'
1429 $keysList = array();
1430 $contacts = CCrmActivity::FindContactCommunications($search, 'EMAIL', 50);
1431 foreach($contacts as $contact)
1433 $keysList[] = $contact['ENTITY_ID
'].'_
'.$contact['ENTITY_TYPE_ID
'];
1436 $contactsByName = CCrmActivity::FindContactCommunications($search, '', 50);
1437 foreach($contactsByName as $contact)
1440 in_array($contact['ENTITY_ID
'].'_
'.$contact['ENTITY_TYPE_ID
'], $keysList)
1441 || empty($contact["VALUE"])
1446 $contacts[] = $contact;
1449 if (!empty($contacts))
1451 $arId = $arEmail = array();
1452 foreach($contacts as $contact)
1454 $arEmail[intval($contact["ENTITY_ID"])] = $contact["VALUE"];
1455 $arId[] = intval($contact["ENTITY_ID"]);
1458 $dbRes = CCrmContact::GetListEx(
1461 'CHECK_PERMISSIONS
' => 'Y
',
1465 array('nTopCount
' => 10),
1466 array('ID
', 'NAME
', 'SECOND_NAME
', 'LAST_NAME
', 'PHOTO
')
1468 while($ar = $dbRes->fetch())
1470 $formatted = self::formatCrmEmailEntity($ar, array(
1471 'TYPE
' => 'CONTACT
',
1472 'NAME_TEMPLATE
' => $arParams["NAME_TEMPLATE"],
1473 'EMAIL' => $arEmail[$ar['ID
']]
1475 if (!empty($formatted))
1477 $result[$formatted['id']] = $formatted;
1482 $companies = CCrmActivity::FindCompanyCommunications($search, 'EMAIL', 50);
1483 foreach($companies as $company)
1485 $keysList[] = $company['ENTITY_ID
'].'_
'.$company['ENTITY_TYPE_ID
'];
1488 $companiesByName = CCrmActivity::FindCompanyCommunications($search, '', 50);
1489 foreach($companiesByName as $company)
1492 in_array($company['ENTITY_ID
'].'_
'.$company['ENTITY_TYPE_ID
'], $keysList)
1493 || empty($company["VALUE"])
1498 $companies[] = $company;
1501 if (!empty($companies))
1503 $arId = $arEmail = array();
1504 foreach($companies as $company)
1506 $arEmail[intval($company["ENTITY_ID"])] = $company["VALUE"];
1507 $arId[] = intval($company["ENTITY_ID"]);
1509 $dbRes = CCrmCompany::GetListEx(
1512 'CHECK_PERMISSIONS
' => 'Y
',
1516 array('nTopCount
' => 10),
1517 array('ID
', 'TITLE
', 'LOGO
')
1519 while($ar = $dbRes->Fetch())
1521 $formatted = self::formatCrmEmailEntity($ar, array(
1522 'TYPE
' => 'COMPANY
',
1523 'EMAIL' => $arEmail[$ar['ID
']]
1525 if (!empty($formatted))
1527 $result[$formatted['id']] = $formatted;
1532 $leads = CCrmActivity::FindLeadCommunications($search, 'EMAIL', 50);
1533 foreach($leads as $lead)
1535 $keysList[] = $lead['ENTITY_ID
'].'_
'.$lead['ENTITY_TYPE_ID
'];
1538 $leadsByName = CCrmActivity::FindLeadCommunications($search, '', 50);
1539 foreach($leadsByName as $lead)
1542 in_array($lead['ENTITY_ID
'].'_
'.$lead['ENTITY_TYPE_ID
'], $keysList)
1543 || empty($lead["VALUE"])
1553 $arId = $arEmail = array();
1554 foreach($leads as $lead)
1556 $arEmail[intval($lead["ENTITY_ID"])] = $lead["VALUE"];
1557 $arId[] = intval($lead["ENTITY_ID"]);
1560 $dbRes = CCrmLead::GetListEx(
1563 'CHECK_PERMISSIONS
' => 'Y
',
1567 array('nTopCount
' => 10),
1568 array('ID
', 'TITLE
', 'NAME
', 'SECOND_NAME
', 'LAST_NAME
')
1570 while($ar = $dbRes->Fetch())
1572 $formatted = self::formatCrmEmailEntity($ar, array(
1574 'EMAIL' => $arEmail[$ar['ID
']]
1576 if (!empty($formatted))
1578 $result[$formatted['id']] = $formatted;
1588 public static function getSocnetGroup($arParams = array(), &$limitReached = false)
1590 static $staticCache = array();
1592 $userId = (int)CurrentUser::get()->getId();
1594 $arSocnetGroups = [];
1596 if (isset($arParams['id']))
1598 if (empty($arParams['id']))
1600 return $arSocnetGroups;
1603 foreach ($arParams['id'] as $value)
1605 $arSelect[] = intval($value);
1610 isset($arParams['site_id
'])
1611 && $arParams['site_id
'] <> ''
1612 ? $arParams['site_id
']
1616 $limit = (isset($arParams["limit"]) && intval($arParams["limit"]) > 0 ? intval($arParams["limit"]) : 500);
1618 $hash = md5(serialize($arParams).$userId.$siteId);
1619 if (isset($staticCache[$hash]))
1621 $arSocnetGroups = $staticCache[$hash];
1625 $arSocnetGroupsTmp = array();
1628 $extranetGroupsIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetSonetGroupIdList();
1631 !isset($arParams["ALL"])
1632 || $arParams["ALL"] !== "Y"
1636 "USER_ID" => $userId,
1637 "GROUP_ID" => $arSelect,
1638 "<=ROLE" => UserToGroupTable::ROLE_USER,
1639 "GROUP_SITE_ID" => $siteId,
1640 "GROUP_ACTIVE" => "Y"
1643 if (!CollabFeature::isFeatureEnabledInPortalSettings())
1645 $filter['!GROUP_TYPE
'] = Type::Collab->value;
1649 !empty($arParams['landing
'])
1650 && $arParams['landing
'] === 'Y
'
1653 $filter["GROUP_LANDING"] = $arParams['landing
'];
1656 if(isset($arParams['GROUP_CLOSED
']))
1658 $filter['GROUP_CLOSED
'] = $arParams['GROUP_CLOSED
'];
1661 $res = CSocNetUserToGroup::getList(
1662 array("GROUP_NAME" => "ASC"),
1665 array("nTopCount" => $limit),
1666 array("ID", "GROUP_ID", "GROUP_NAME", "GROUP_DESCRIPTION", "GROUP_IMAGE_ID", "GROUP_PROJECT")
1668 while($relation = $res->fetch())
1671 "id" => $relation["GROUP_ID"],
1672 "entityId" => $relation["GROUP_ID"],
1673 "name" => htmlspecialcharsbx(Emoji::decode($relation["GROUP_NAME"])),
1674 "desc" => htmlspecialcharsbx(Emoji::decode($relation["GROUP_DESCRIPTION"])),
1675 "imageId" => $relation["GROUP_IMAGE_ID"],
1676 "project" => ($relation["GROUP_PROJECT"] === 'Y
' ? 'Y
' : 'N
'),
1677 "isExtranet" => (in_array($relation["GROUP_ID"], $extranetGroupsIdList) ? 'Y
' : 'N
')
1684 "CHECK_PERMISSIONS" => (int)CurrentUser::get()->getId(),
1685 "SITE_ID" => $siteId,
1690 if (!CollabFeature::isFeatureEnabledInPortalSettings())
1692 $filter['!GROUP_TYPE
'] = Type::Collab->value;
1695 if(isset($arParams['GROUP_CLOSED
']))
1697 $filter['CLOSED
'] = $arParams['GROUP_CLOSED
'];
1700 !empty($arParams['landing
'])
1701 && $arParams['landing
'] === 'Y
'
1704 $filter['LANDING
'] = $arParams['landing
'];
1707 $res = CSocnetGroup::getList(
1708 array("NAME" => "ASC"),
1711 array("nTopCount" => $limit),
1712 array("ID", "NAME", "DESCRIPTION", "IMAGE_ID", "PROJECT")
1715 while ($group = $res->Fetch())
1718 "id" => $group["ID"],
1719 "entityId" => $group["ID"],
1720 "name" => htmlspecialcharsbx(Emoji::decode($group["NAME"])),
1721 "desc" => htmlspecialcharsbx(Emoji::decode($group["DESCRIPTION"])),
1722 "imageId" => $group["IMAGE_ID"],
1723 "project" => ($group["PROJECT"] === 'Y
' ? 'Y
' : 'N
'),
1724 "isExtranet" => (in_array($group["ID"], $extranetGroupsIdList) ? 'Y
' : 'N
')
1729 $limitReached = (count($tmpList) == $limit);
1731 foreach ($tmpList as $group)
1733 if($group["imageId"])
1735 $imageFile = CFile::GetFileArray($group["imageId"]);
1736 if ($imageFile !== false)
1738 $arFileTmp = CFile::ResizeImageGet(
1741 "width" => ((int) ($arParams["THUMBNAIL_SIZE_WIDTH"] ?? 0) > 0
1742 ? $arParams["THUMBNAIL_SIZE_WIDTH"]
1745 "height" => ((int) ($arParams["THUMBNAIL_SIZE_HEIGHT"] ?? 0) > 0
1746 ? $arParams["THUMBNAIL_SIZE_HEIGHT"]
1751 $group["avatar"] = $arFileTmp["src"];
1754 unset($group["imageId"]);
1755 $arSocnetGroupsTmp[$group['id']] = $group;
1758 if (isset($arParams['features
']) && !empty($arParams['features
']))
1760 self::getSocnetGroupFilteredByFeaturePerms($arSocnetGroupsTmp, $arParams['features
']);
1763 if (isset($arParams['initiate
']) && $arParams['initiate
'] === 'Y
')
1765 self::getSocnetGroupFilteredByInitiatePerms($arSocnetGroupsTmp);
1768 foreach ($arSocnetGroupsTmp as $value)
1770 $value['id'] = 'SG
'.$value['id'];
1771 $arSocnetGroups[$value['id']] = $value;
1774 $staticCache[$hash] = $arSocnetGroups;
1777 if (isset($arParams['useProjects
']) && $arParams['useProjects
'] === 'Y
')
1779 $groupsList = $projectsList = array();
1780 foreach($arSocnetGroups as $key => $value)
1783 isset($value['project
'])
1784 && $value['project
'] === 'Y
'
1787 $projectsList[$key] = $value;
1791 $groupsList[$key] = $value;
1796 'SONETGROUPS
' => $groupsList,
1797 'PROJECTS
' => $projectsList
1801 return $arSocnetGroups;
1804 public static function GetTreeList($id, $relation, $compat = false)
1809 foreach($relation as $iid => $rel)
1811 $p = $rel["parent"];
1812 if (!isset($tmp[$p]))
1821 $arRelations = Array();
1822 if (is_array($relation[$id] ?? null))
1824 foreach ($relation[$id] as $relId)
1828 isset($relation[$relId])
1829 && !empty($relation[$relId])
1832 $arItems = self::GetTreeList($relId, $relation);
1835 $arRelations[$relId] = Array('id'=>$relId, 'type
' => 'category
', 'items
' => $arItems);
1839 return $arRelations;
1842 private static function GetSocnetGroupFilteredByFeaturePerms(&$arGroups, $arFeaturePerms)
1844 $arGroupsIDs = array();
1845 foreach($arGroups as $value)
1847 $arGroupsIDs[] = $value["id"];
1850 if (count($arGroupsIDs) <= 0)
1855 $feature = $arFeaturePerms[0];
1856 $operations = $arFeaturePerms[1];
1857 if (!is_array($operations))
1859 $operations = explode(",", $operations);
1861 $arGroupsPerms = array();
1862 foreach($operations as $operation)
1864 $tmpOps = CSocNetFeaturesPerms::CurrentUserCanPerformOperation(SONET_ENTITY_GROUP, $arGroupsIDs, $feature, $operation);
1865 if (is_array($tmpOps))
1867 foreach ($tmpOps as $key=>$val)
1869 if (!($arGroupsPerms[$key] ?? null))
1871 $arGroupsPerms[$key] = $val;
1876 $arGroupsActive = CSocNetFeatures::IsActiveFeature(SONET_ENTITY_GROUP, $arGroupsIDs, $arFeaturePerms[0]);
1877 foreach ($arGroups as $key=>$group)
1880 !$arGroupsActive[$group["id"]]
1881 || !$arGroupsPerms[$group["id"]]
1884 unset($arGroups[$key]);
1889 private static function GetSocnetGroupFilteredByInitiatePerms(&$arGroups)
1891 $arGroupsIDs = array();
1892 foreach($arGroups as $value)
1894 $arGroupsIDs[] = $value["id"];
1897 if (count($arGroupsIDs) <= 0)
1903 CurrentUser::get()->isAdmin()
1904 || CSocNetUser::IsCurrentUserModuleAdmin(CSite::GetDefSite())
1910 $groupsList = array();
1911 $userRolesList = array();
1913 $res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array(
1915 '@ID
' => $arGroupsIDs
1917 'select' => array('ID
', 'OWNER_ID
', 'INITIATE_PERMS
')
1920 while ($group = $res->fetch())
1922 $groupsList[$group['ID
']] = array(
1923 'OWNER_ID
' => $group['OWNER_ID
'],
1924 'INITIATE_PERMS
' => $group['INITIATE_PERMS
']
1928 $res = UserToGroupTable::getList(array(
1930 'USER_ID
' => (int)CurrentUser::get()->getId(),
1931 '@GROUP_ID
' => $arGroupsIDs
1933 'select' => array('GROUP_ID
', 'ROLE
')
1936 while ($relation = $res->fetch())
1938 $userRolesList[$relation['GROUP_ID
']] = $relation['ROLE
'];
1941 $userId = (int)CurrentUser::get()->getId();
1943 foreach ($arGroups as $key => $group)
1945 $groupId = $group["id"];
1949 isset($groupsList[$groupId])
1950 && $groupsList[$groupId]["INITIATE_PERMS"] == UserToGroupTable::ROLE_OWNER
1951 && $userId == $groupsList[$groupId]["OWNER_ID"]
1954 isset($groupsList[$groupId])
1955 && $groupsList[$groupId]["INITIATE_PERMS"] == UserToGroupTable::ROLE_MODERATOR
1956 && isset($userRolesList[$groupId])
1957 && in_array($userRolesList[$groupId], array(
1958 UserToGroupTable::ROLE_OWNER,
1959 UserToGroupTable::ROLE_MODERATOR
1963 isset($groupsList[$groupId])
1964 && $groupsList[$groupId]["INITIATE_PERMS"] == UserToGroupTable::ROLE_USER
1965 && isset($userRolesList[$groupId])
1966 && in_array($userRolesList[$groupId], array(
1967 UserToGroupTable::ROLE_OWNER,
1968 UserToGroupTable::ROLE_MODERATOR,
1969 UserToGroupTable::ROLE_USER
1976 unset($arGroups[$key]);
1981 public static function GetDestinationUsers($accessCodes, $fetchUsers = false)
1985 $fields = $fetchUsers
1986 ? ['ID
', 'LOGIN
', 'NAME
', 'LAST_NAME
', 'SECOND_NAME
', 'EMAIL', 'PERSONAL_PHOTO
', 'WORK_POSITION
', 'EXTERNAL_AUTH_ID
']
1991 if (is_array($accessCodes))
1993 foreach($accessCodes as $code)
1998 $dbRes = CUser::GetList(
2001 ['INTRANET_USERS
' => true],
2002 ['FIELDS
' => $fields]
2005 while ($user = $dbRes->Fetch())
2007 if (array_key_exists($user['ID
'], $userIds))
2012 $userIds[$user['ID
']] = $user['ID
'];
2015 $user['USER_ID
'] = $user['ID
'];
2021 elseif (mb_substr($code, 0, 1) === 'U
')
2023 $userId = (int)mb_substr($code, 1);
2024 if (!array_key_exists($userId, $userIds))
2026 $usersToFetch[] = $userId;
2029 $userIds[$userId] = $userId;
2033 elseif (mb_substr($code, 0, 2) === 'SG
')
2035 $groupId = intval(mb_substr($code, 2));
2037 $isProjectRoles = preg_match('/^SG([0-9]+)_?([AEKMO])?$/
', $code, $match) && isset($match[2]);
2039 if ($isProjectRoles)
2041 // todo remove after new system the project roles.
2042 [$users, $userIds] = self::getUsersByRole($groupId, $match[2], $users, $userIds);
2047 $dbMembers = CSocNetUserToGroup::GetList(
2049 ["GROUP_ID" => $groupId, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y"],
2052 ["ID", "USER_ID", "ROLE", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "USER_EMAIL", "USER_PERSONAL_PHOTO", "USER_WORK_POSITION"]
2057 while ($user = $dbMembers->GetNext())
2059 if (array_key_exists($user['USER_ID
'], $userIds))
2063 $userIds[$user['USER_ID
']] = $user["USER_ID"];
2065 'ID
' => $user["USER_ID"],
2066 'USER_ID
' => $user["USER_ID"],
2067 'LOGIN
' => $user["USER_LOGIN"],
2068 'NAME
' => $user["USER_NAME"],
2069 'LAST_NAME
' => $user["USER_LAST_NAME"],
2070 'SECOND_NAME
' => $user["USER_SECOND_NAME"],
2071 'EMAIL' => $user["USER_EMAIL"],
2072 'PERSONAL_PHOTO
' => $user["USER_PERSONAL_PHOTO"],
2073 'WORK_POSITION
' => $user["USER_WORK_POSITION"]
2078 elseif (mb_substr($code, 0, 2) === 'DR
')
2080 $depId = (int)mb_substr($code, 2);
2082 $res = \Bitrix\Intranet\Util::getDepartmentEmployees([
2083 'DEPARTMENTS
' => $depId,
2089 while ($user = $res->Fetch())
2091 if (!array_key_exists($user['ID
'], $userIds))
2093 $userIds[$user['ID
']] = $user['ID
'];
2096 $user['USER_ID
'] = $user['ID
'];
2106 !empty($usersToFetch)
2110 $usersToFetch = array_chunk(array_values($usersToFetch), self::USERS_STEP_COUNT);
2112 foreach ($usersToFetch as $chunk)
2114 $usersRes = \Bitrix\Main\UserTable::getList([
2117 '@ID
' => array_values($chunk)
2124 foreach ($usersRes as $user)
2126 if (array_key_exists($user['ID
'], $userIds))
2131 $userIds[$user['ID
']] = $user['ID
'];
2132 $user['USER_ID
'] = $user['ID
'];
2138 return $fetchUsers ? $users : $userIds;
2141 private static function getUsersByRole(int $groupId, $role, array $users, array $userIds): array
2143 $isScrumCustomRole = false;
2144 $scrumCustomRole = '';
2148 SONET_ROLES_MODERATOR,
2152 // todo maybe remove 'M
' role after new system the project roles.
2153 $customScrumRoles = ['M
'];
2154 $availableRoles = array_merge($availableRoles, $customScrumRoles);
2156 $group = Bitrix\Socialnetwork\Item\Workgroup::getById($groupId);
2158 $role = in_array($role, $availableRoles) ? $role : SONET_ROLES_USER;
2160 if (in_array($role, $customScrumRoles))
2162 $isScrumCustomRole = true;
2163 $scrumCustomRole = $role;
2164 $role = SONET_ROLES_MODERATOR;
2167 $dbMembers = CSocNetUserToGroup::GetList(
2170 "GROUP_ID" => $groupId,
2171 "=ROLE" => $isScrumCustomRole ? [SONET_ROLES_OWNER, SONET_ROLES_MODERATOR] : $role,
2172 "USER_ACTIVE" => "Y"
2185 "USER_PERSONAL_PHOTO",
2186 "USER_WORK_POSITION",
2192 while ($user = $dbMembers->GetNext())
2194 if ($group && $group->isScrumProject())
2196 if ($role === SONET_ROLES_MODERATOR)
2198 $scrumMasterId = $group->getScrumMaster();
2200 if ($isScrumCustomRole)
2202 if ($scrumCustomRole === 'M
' && $user["USER_ID"] != $scrumMasterId)
2209 if ($user["USER_ID"] == $scrumMasterId)
2217 if (!array_key_exists($user["USER_ID"], $userIds))
2219 $userIds[$user["USER_ID"]] = $user["USER_ID"];
2221 'ID
' => $user["USER_ID"],
2222 'USER_ID
' => $user["USER_ID"],
2223 'LOGIN
' => $user["USER_LOGIN"],
2224 'NAME
' => $user["USER_NAME"],
2225 'LAST_NAME
' => $user["USER_LAST_NAME"],
2226 'SECOND_NAME
' => $user["USER_SECOND_NAME"],
2227 'EMAIL' => $user["USER_EMAIL"],
2228 'PERSONAL_PHOTO
' => $user["USER_PERSONAL_PHOTO"],
2229 'WORK_POSITION
' => $user["USER_WORK_POSITION"]
2235 return [$users, $userIds];
2238 public static function GetDestinationSort($arParams = array(), &$dataAdditional = false)
2240 $res = \Bitrix\Main\UI\Selector\Entities::getLastSort($arParams);
2241 $dataAdditional = $res['DATA_ADDITIONAL
'];
2243 return $res['DATA
'];
2246 public static function fillLastDestination($arDestinationSort, &$arLastDestination, $arParams = array())
2248 $res = \Bitrix\Main\UI\Selector\Entities::fillLastDestination($arDestinationSort, $arParams);
2249 $arLastDestination = $res['LAST_DESTINATIONS
'];
2251 return $res['DATA
'];
2254 public static function fillEmails(&$arDest)
2256 $arDest["EMAILS"] = array();
2257 $arDest["LAST"]["EMAILS"] = array();
2261 && !empty($arDest["LAST"])
2262 && !empty($arDest["LAST"]["USERS"])
2263 && !empty($arDest["USERS"])
2266 foreach($arDest["LAST"]["USERS"] as $key => $value)
2269 isset($arDest["USERS"][$key])
2270 && is_array($arDest["USERS"][$key])
2271 && isset($arDest["USERS"][$key]["isEmail"])
2272 && $arDest["USERS"][$key]["isEmail"] === "Y"
2275 $arDest["EMAILS"][$key] = $arDest["USERS"][$key];
2276 $arDest["LAST"]["EMAILS"][$key] = $value;
2282 public static function fillCrmEmails(&$arDest)
2284 $arDest["CRMEMAILS"] = array();
2285 $arDest["LAST"]["CRMEMAILS"] = array();
2289 && !empty($arDest["LAST"])
2290 && !empty($arDest["LAST"]["USERS"])
2291 && !empty($arDest["USERS"])
2294 foreach($arDest["LAST"]["USERS"] as $key => $value)
2297 isset($arDest["USERS"][$key])
2298 && is_array($arDest["USERS"][$key])
2299 && isset($arDest["USERS"][$key]["isCrmEmail"])
2300 && $arDest["USERS"][$key]["isCrmEmail"] === "Y"
2303 $arDest["CRMEMAILS"][$key] = $arDest["USERS"][$key];
2304 $arDest["LAST"]["CRMEMAILS"][$key] = $value;
2310 public static function getUsersAll($arParams = [])
2313 $connection = \Bitrix\Main\Application::getConnection();
2314 $helper = $connection->getSqlHelper();
2316 static $arFieldsStatic = array(
2317 "ID" => Array("FIELD" => "U.ID", "TYPE" => "int"),
2318 "ACTIVE" => Array("FIELD" => "U.ACTIVE", "TYPE" => "string"),
2319 "NAME" => Array("FIELD" => "U.NAME", "TYPE" => "string"),
2320 "EMAIL" => Array("FIELD" => "U.EMAIL", "TYPE" => "string"),
2321 "LAST_NAME" => Array("FIELD" => "U.LAST_NAME", "TYPE" => "string"),
2322 "SECOND_NAME" => Array("FIELD" => "U.SECOND_NAME", "TYPE" => "string"),
2323 "LOGIN" => Array("FIELD" => "U.LOGIN", "TYPE" => "string"),
2324 "PERSONAL_PHOTO" => Array("FIELD" => "U.PERSONAL_PHOTO", "TYPE" => "int"),
2325 "WORK_POSITION" => Array("FIELD" => "U.WORK_POSITION", "TYPE" => "string"),
2326 "CONFIRM_CODE" => Array("FIELD" => "U.CONFIRM_CODE", "TYPE" => "string"),
2327 "PERSONAL_PROFESSION" => Array("FIELD" => "U.PERSONAL_PROFESSION", "TYPE" => "string"),
2328 "EXTERNAL_AUTH_ID" => Array("FIELD" => "U.EXTERNAL_AUTH_ID", "TYPE" => "string")
2331 $arFields = $arFieldsStatic;
2332 $arFields["IS_ONLINE"] = Array(
2333 "FIELD" => "case when U.LAST_ACTIVITY_DATE > " . $helper->addSecondsToDateTime(-CUser::getSecondsForLimitOnline()) . " then 'Y
' else 'N
' end"
2336 $currentUserId = (int)CurrentUser::get()->getId();
2338 if (!$currentUserId)
2343 $bExtranetEnabled = CModule::includeModule("extranet");
2347 && !CExtranet::IsIntranetUser()
2350 $bExtranetWorkgroupsAllowed = (
2352 && CExtranet::WorkgroupsAllowed()
2355 $bShowAllContactsAllowed = (
2357 && CExtranet::ShowAllContactsAllowed()
2360 $rsData = CUserTypeEntity::GetList(
2361 array("ID" => "ASC"),
2363 "FIELD_NAME" => "UF_DEPARTMENT",
2364 "ENTITY_ID" => "USER"
2367 if($arRes = $rsData->Fetch())
2369 $UFId = (int)$arRes["ID"];
2378 && !$bExtranetWorkgroupsAllowed
2379 ) // limited extranet
2384 $arOrder = array("ID" => "ASC");
2385 $arFilter = array('ACTIVE
' => 'Y
');
2388 IsModuleInstalled("intranet")
2389 || COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") === "Y"
2392 $arFilter["CONFIRM_CODE"] = false;
2395 $arExternalAuthId = self::getExternalAuthIdBlackList([
2396 'ALLOW_BOTS
' => (isset($arParams['ALLOW_BOTS
']) && $arParams['ALLOW_BOTS
'] === true)
2398 $arExternalAuthId[] = 'email
';
2399 $arFilter['!EXTERNAL_AUTH_ID
'] = $arExternalAuthId;
2402 $arSelectFields = array("ID", "NAME", "LAST_NAME", "SECOND_NAME", "LOGIN", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "EXTERNAL_AUTH_ID", "EMAIL", "IS_ONLINE");
2404 $arSqls = CSocNetGroup::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
2405 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "DISTINCT", $arSqls["SELECT"]);
2406 $strJoin = $strJoin2 = $arSqls2 = false;
2408 if ($bExtranetEnabled)
2410 if ($bExtranetWorkgroupsAllowed)
2412 if (!$bExtranetUser)
2415 INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId)."
2420 $arSqls["WHERE"] .= ($arSqls["WHERE"] <> '' ? " AND " : "")."
2421 (UM.VALUE_INT > 0)";
2423 if (!$bShowAllContactsAllowed)
2425 // select all the users (intranet and extranet from my groups)
2427 INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID AND UG.ROLE <= '".SONET_ROLES_USER."'
2428 INNER JOIN b_sonet_user2group UG_MY
2429 ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".(int)$currentUserId."
2430 AND UG_MY.ROLE <= '".UserToGroupTable::ROLE_USER."'
2431 LEFT JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".(int)$UFId."
2439 INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID AND UG.ROLE <= '".SONET_ROLES_USER."'
2440 INNER JOIN b_sonet_user2group UG_MY
2441 ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".(int)$currentUserId."
2442 AND UG_MY.ROLE <= '".UserToGroupTable::ROLE_USER."'
2443 LEFT JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".(int)$UFId."
2447 elseif (!$bShowAllContactsAllowed) // limited extranet, only for intranet users, don't show extranet
2449 $strJoin =
"INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId);
2450 $arSqls[
"WHERE"] .= ($arSqls[
"WHERE"] <>
'' ?
" AND " :
"").
"UM.VALUE_INT > 0";
2458 ? $arSqls[
"SELECT"].
", CASE WHEN UM.VALUE_INT > 0 THEN 'employee' WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'extranet' END USER_TYPE"
2459 : $arSqls[
"SELECT"].
", CASE WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'employee' END USER_TYPE"
2462 ".$arSqls[
"FROM"].
" ";
2466 $strSql .= $strJoin.
" ";
2469 if ($arSqls[
"WHERE"] <>
'')
2471 $strSql .=
"WHERE ".$arSqls[
"WHERE"].
" ";
2474 $strSql .=
"GROUP BY U.ID".($bExtranetEnabled ?
",UM.VALUE_INT" :
"").
" ";
2480 ".$arSqls2[
"SELECT"].
", CASE WHEN UM.VALUE_INT > 0 THEN 'employee' WHEN EXTERNAL_AUTH_ID = 'email' THEN 'email' ELSE 'extranet' END USER_TYPE
2482 ".$arSqls2[
"FROM"].
" ";
2484 $strSql .= $strJoin2.
" ";
2486 if ($arSqls2[
"WHERE"] <>
'')
2488 $strSql .=
"WHERE ".$arSqls2[
"WHERE"].
" ";
2491 $strSql .=
"GROUP BY U.ID".($bExtranetEnabled ?
",UM.VALUE_INT" :
"").
" ";
2493 $strSql .=
"ORDER BY ID ASC";
2497 if ($arSqls[
"ORDERBY"] <>
'')
2499 $strSql .=
"ORDER BY ".$arSqls[
"ORDERBY"].
" ";
2509 $countExceeded =
false;
2512 if ($bExtranetEnabled)
2517 while ($arUser =
$dbRes->GetNext())
2524 $countExceeded =
true;
2528 $sName = trim(CUser::FormatName(empty(
$arParams[
"NAME_TEMPLATE"]) ? CSite::GetNameFormat(
false) :
$arParams[
"NAME_TEMPLATE"], $arUser,
true,
false));
2532 $sName = $arUser[
"~LOGIN"];
2536 $arUser[
"PERSONAL_PHOTO"],
2537 array(
'width' => 100,
'height' => 100),
2542 $arUsers[
'U'.$arUser[
"ID"]] = Array(
2543 'id' =>
'U'.$arUser[
"ID"],
2544 'entityId' => $arUser[
"ID"],
2545 'email' => $arUser[
"EMAIL"],
2547 'avatar' => empty($arFileTmp[
'src'])?
'': $arFileTmp[
'src'],
2548 'desc' => $arUser[
'WORK_POSITION'] ? $arUser[
'WORK_POSITION'] : ($arUser[
'PERSONAL_PROFESSION'] ? $arUser[
'PERSONAL_PROFESSION'] :
' '),
2549 'isExtranet' => (isset($arUser[
'USER_TYPE']) && $arUser[
'USER_TYPE'] ===
'extranet' ?
"Y" :
"N"),
2550 'isEmail' => ($arUser[
'EXTERNAL_AUTH_ID'] ===
'email' ?
'Y' :
'N'),
2554 if ($arUser[
'EXTERNAL_AUTH_ID'] ===
'email')
2556 $arUsers[
'U'.$arUser[
"ID"]][
'email'] = $arUser[
'EMAIL'];
2559 $arUsers[
'U'.$arUser[
"ID"]][
'checksum'] = md5(serialize($arUsers[
'U'.$arUser[
"ID"]]));
2560 $arUsers[
'U'.$arUser[
"ID"]][
'login'] =
'';
2569 "id" =>
array($currentUserId)
2580 static $siteNameFormat =
false;
2581 static $isIntranetInstalled =
false;
2582 static $extranetUserIdList =
false;
2584 if ($siteNameFormat ===
false)
2586 $siteNameFormat = CSite::GetNameFormat(
false);
2589 if ($isIntranetInstalled ===
false)
2594 if ($extranetUserIdList ===
false)
2599 $arFileTmp = CFile::ResizeImageGet(
2600 $arUser[
"PERSONAL_PHOTO"],
2601 array(
'width' => 100,
'height' => 100),
2607 'id' =>
'U'.$arUser[
"ID"],
2608 'entityId' => $arUser[
"ID"]
2611 if (ModuleManager::isModuleInstalled(
'intranet'))
2613 $arRes[
"email"] = $arUser[
'EMAIL'];
2617 'name' => CUser::FormatName(
2628 empty($arFileTmp[
'src'])
2632 'desc' => self::getUserDescription($arUser, [
2633 'showEmail' => !empty(
$arParams[
"ONLY_WITH_EMAIL"])
2636 in_array($arUser[
"ID"], $extranetUserIdList)
2641 isset($arUser[
'EXTERNAL_AUTH_ID'])
2642 && $arUser[
'EXTERNAL_AUTH_ID'] ===
'email'
2648 if (!empty($arUser[
"UF_USER_CRM_ENTITY"]))
2650 $arRes[
'crmEntity'] = $arUser[
"UF_USER_CRM_ENTITY"];
2653 if (!empty($arUser[
"ACTIVE"]))
2655 $arRes[
'active'] = $arUser[
"ACTIVE"];
2663 ||
$arRes[
'isEmail'] ===
'Y'
2666 if ($arUser[
"NAME"] <>
'')
2668 $arRes[
'showEmail'] =
"Y";
2672 $db_events =
GetModuleEvents(
"socialnetwork",
"OnSocNetLogDestinationFormatUser");
2673 while ($arEvent = $db_events->Fetch())
2678 $checksum = md5(serialize(
$arRes));
2679 $arRes[
'checksum'] = $checksum;
2682 $isIntranetInstalled ===
'Y'
2690 isset($arUser[
"SEARCH_USER_CONTENT"])
2691 ? $arUser[
"SEARCH_USER_CONTENT"]
2700 static $siteNameFormat =
false;
2703 $userParams =
array();
2708 && in_array(
$params[
"TYPE"],
array(
'CONTACT',
'COMPANY',
'LEAD'))
2711 if ($siteNameFormat ===
false)
2714 !empty(
$params[
"NAME_TEMPLATE"])
2716 : CSite::GetNameFormat(
false)
2721 if (
$params[
"TYPE"] ===
'CONTACT')
2724 $imageField =
'PHOTO';
2725 $userParams =
array(
2727 'lastName' =>
$fields[
'LAST_NAME']
2729 $name = CUser::FormatName(
2739 $imageField =
'LOGO';
2741 $userParams =
array(
2743 'lastName' =>
$fields[
'TITLE']
2749 $imageField =
false;
2751 $userParams =
array(
2753 'lastName' =>
$fields[
'LAST_NAME']
2755 $username = CUser::FormatName(
2761 if (!empty($username))
2763 $name .=
', '.$username;
2769 && isset(
$fields[$imageField])
2772 $arFileTmp = CFile::ResizeImageGet(
2774 array(
'width' => 100,
'height' => 100),
2781 $arFileTmp =
array();
2785 'id' => $prefix.$fields[
"ID"],
2786 'crmEntity' => $prefix.$fields[
"ID"],
2790 empty($arFileTmp[
'src'])
2796 'isExtranet' =>
'N',
2798 'isCrmEmail' =>
'Y',
2799 'params' => $userParams
2808 static $siteNameFormat =
false;
2810 if ($siteNameFormat ===
false)
2813 !empty(
$params[
"NAME_TEMPLATE"])
2815 : CSite::GetNameFormat(
false)
2819 $name = CUser::FormatName(
2826 if (isset(
$fields[
"EXTERNAL_AUTH_ID"]) &&
$fields[
"EXTERNAL_AUTH_ID"] ===
"replica")
2827 [,$domain] = explode(
"@",
$fields[
"LOGIN"], 2);
2829 $domain =
$fields[
"CLIENT_DOMAIN"];
2831 if (
$fields[
"PERSONAL_PHOTO"])
2833 $arFileTmp = CFile::ResizeImageGet(
2835 array(
'width' => 32,
'height' => 32),
2841 $userParams =
array(
2843 'lastName' =>
$fields[
'LAST_NAME'],
2844 'domain' => $domain,
2851 'avatar' =>
$fields[
"PERSONAL_PHOTO"] && !empty($arFileTmp[
'src'])? $arFileTmp[
'src']:
'',
2855 'networkId' =>
$fields[
'NETWORK_ID'],
2856 'isExtranet' =>
'N',
2859 'params' => $userParams
2865 private static function getExternalAuthIdBlackList(
$params =
array())
2873 || !isset(
$params[
"NETWORK_SEARCH"])
2882 || !isset(
$params[
'ALLOW_BOTS'])
2894 $showEmail = (!empty(
$params[
'showEmail']) ? !!
$params[
'showEmail'] :
false);
2898 && ModuleManager::isModuleInstalled(
'intranet')
2900 isset($userFields[
"EMAIL"])
2901 && $userFields[
"EMAIL"] <>
''
2902 ? $userFields[
"EMAIL"]
2906 isset($userFields[
'WORK_POSITION'])
2907 && $userFields[
'WORK_POSITION'] <>
''
2908 ? $userFields[
'WORK_POSITION']
2910 isset($userFields[
'PERSONAL_PROFESSION'])
2911 && $userFields[
'PERSONAL_PROFESSION'] <>
''
2912 ? $userFields[
'PERSONAL_PROFESSION']
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static get($moduleId, $name, $default="", $siteId=false)
static includeModule($moduleName)
static getList(array $parameters=array())
static prepareStringToken($token)
static encode($string, $flags=ENT_COMPAT, $doubleEncode=true)
static getExtranetUserIdList()
static ResizeImageGet($file, $arSize, $resizeType=BX_RESIZE_IMAGE_PROPORTIONAL, $bInitSizes=false, $arFilters=false, $bImmediate=false, $jpgQuality=false)
static GetLastDepartment()
static GetExtranetUser(array $arParams=array())
static getUserDescription(array $userFields=[], array $params=[])
static GetGratMedalUsers($arParams=Array())
static formatUser($arUser, $arParams=array())
static formatCrmEmailEntity($fields, $params=array())
static searchUsers($search, &$nt="", $bSelf=true, $bEmployeesOnly=false, $bExtranetOnly=false, $departmentId=false)
static GetStucture($arParams=Array())
static formatNetworkUser($fields, $params=array())
static GetLastSocnetGroup()
static GetUsers($arParams=Array(), $bSelf=true)
static __percent_walk(&$val)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
const BX_RESIZE_IMAGE_EXACT
ExecuteModuleEventEx($arEvent, $arParams=[])
IsModuleInstalled($module_id)
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
check_email($email, $strict=false, $domainCheck=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']