static function GetUserData($arParams = Array())
{
$paramsDepartment = $arParams['DEPARTMENT'] ?? null;
$paramsHrPhoto = $arParams['HR_PHOTO'] ?? null;
$paramsPhones = $arParams['PHONES'] ?? null;
$paramsUseCache = $arParams['USE_CACHE'] ?? null;
$paramsShowOnline = $arParams['SHOW_ONLINE'] ?? null;
$paramsExtraFields = $arParams['EXTRA_FIELDS'] ?? null;
$paramsCacheTtl = $arParams['CACHE_TTL'] ?? null;
$getDepartment = !($paramsDepartment === 'N');
$getHrPhoto = $paramsHrPhoto === 'Y';
$getPhones = $paramsPhones === 'Y' && IsModuleInstalled('intranet');
$useCache = !($paramsUseCache === 'N');
$showOnline = !($paramsShowOnline === 'N');
$extraFields = $paramsExtraFields === 'Y';
$arFilter = Array();
if (isset($arParams['ID']) && is_array($arParams['ID']) && !empty($arParams['ID']))
{
foreach ($arParams['ID'] as $key => $value)
{
if (intval($value) > 0)
{
$arParams['ID'][$key] = intval($value);
}
}
$arFilter['=ID'] = $arParams['ID'];
}
else if (isset($arParams['ID']) && intval($arParams['ID']) > 0)
{
$arFilter['=ID'] = Array(intval($arParams['ID']));
}
if (empty($arFilter))
return false;
$nameTemplate = self::GetUserNameTemplate(SITE_ID);
$nameTemplateSite = CSite::GetNameFormat(false);
$bIntranetEnable = false;
if(IsModuleInstalled('intranet') && CModule::IncludeModule('intranet'))
$bIntranetEnable = true;
$bVoximplantEnable = IsModuleInstalled('voximplant');
$bColorEnabled = IMColor::isEnabled();
if ($useCache)
{
$obCache = new CPHPCache;
$cache_ttl = (int)$paramsCacheTtl;
if ($cache_ttl <= 0)
{
$cache_ttl = defined("BX_COMP_MANAGED_CACHE") ? 18144000 : 1800;
}
$uid = md5(implode('|', $arFilter['=ID']));
$cache_id = 'user_data_v39_'.$uid.'_'.$nameTemplate.'_'.$nameTemplateSite.'_'.$extraFields.'_'.$getPhones.'_'.$getDepartment.'_'.$bIntranetEnable.'_'.$bVoximplantEnable.'_'.LANGUAGE_ID.'_'.$bColorEnabled;
$cache_dir = '/bx/imc/userdata/' . mb_substr($uid, 0, 2) . '/' . mb_substr($uid, 2, 2) . '/' . $uid;
if ($obCache->initCache($cache_ttl, $cache_id, $cache_dir))
{
$arCacheResult = $obCache->getVars();
if ($showOnline)
{
$onlineUserId = array_keys(array_filter($arCacheResult['users'], function($user) {
return !$user['bot'];
}));
if (!empty($onlineUserId))
{
$arOnline = CIMStatus::GetList(Array('ID' => $onlineUserId));
}
}
foreach ($arCacheResult['users'] as $userId => $value)
{
if ($showOnline)
{
$arCacheResult['users'][$userId]['status'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['status']: 'offline';
$arCacheResult['users'][$userId]['idle'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['idle']: false;
$arCacheResult['users'][$userId]['mobile_last_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['mobile_last_date']: false;
$arCacheResult['users'][$userId]['desktop_last_date'] = $arOnline['users'][$userId]['desktop_last_date'] ?? false;
$arCacheResult['users'][$userId]['last_activity_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['last_activity_date']: false;
$arCacheResult['users'][$userId]['absent'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['absent']: false;
}
if ($getHrPhoto && !isset($arCacheResult['hrphoto']))
{
$arCacheResult['hrphoto'][$userId] = $arCacheResult['users'][$userId]['avatar'];
}
}
return $arCacheResult;
}
}
$arSelect = array("ID", "LAST_NAME", "NAME", "EMAIL", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", "TIME_ZONE_OFFSET", "PERSONAL_WWW", "ACTIVE", "LAST_ACTIVITY_DATE"); // TODO , "TIME_ZONE_OFFSET"
if ($getPhones)
{
$arSelect[] = 'WORK_PHONE';
$arSelect[] = 'PERSONAL_PHONE';
$arSelect[] = 'PERSONAL_MOBILE';
}
if($bIntranetEnable)
{
$arSelect[] = 'UF_ZOOM';
$arSelect[] = 'UF_SKYPE';
$arSelect[] = 'UF_SKYPE_LINK';
$arSelect[] = 'UF_PHONE_INNER';
$arSelect[] = 'UF_DEPARTMENT';
}
if ($bVoximplantEnable)
{
$arSelect[] = 'UF_VI_PHONE';
}
$arUsers = array();
$arUserInGroup = array();
$arPhones = array();
$arHrPhoto = array();
$arSource = array();
$query = new BitrixMainEntityQuery(BitrixMainUserTable::getEntity());
$query->registerRuntimeField('', new BitrixMainEntityReferenceField('ref', 'BitrixImModelStatusTable', array('=this.ID' => 'ref.USER_ID')));
$query->addSelect('ref.COLOR', 'COLOR')
->addSelect('ref.STATUS', 'STATUS')
->addSelect('ref.IDLE', 'IDLE')
->addSelect('ref.MOBILE_LAST_DATE', 'MOBILE_LAST_DATE')
->addSelect('ref.DESKTOP_LAST_DATE', 'DESKTOP_LAST_DATE');
foreach ($arSelect as $value)
{
$query->addSelect($value);
}
foreach ($arFilter as $key => $value)
{
$query->addFilter($key, $value);
}
$resultQuery = $query->exec();
$bots = BitrixImBot::getListCache();
while ($arUser = $resultQuery->fetch())
{
$arUser = CIMStatus::prepareLastDate($arUser);
foreach ($arUser as $key => $value)
{
$arUser[$key] = !is_array($value) && !is_object($value)? htmlspecialcharsEx($value): $value;
}
$arSource[$arUser["ID"]]["PERSONAL_PHOTO"] = $arUser["PERSONAL_PHOTO"];
$color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M'? 'M': 'F');
if (isset($arUser['COLOR']) && $arUser['COLOR'] <> '')
{
$color = IMColor::getColor($arUser['COLOR']);
}
if (!$color)
{
$color = self::GetUserColor($arUser["ID"], $arUser['PERSONAL_GENDER'] == 'M'? 'M': 'F');
}
$arUser['PERSONAL_BIRTHDAY'] = $arUser['PERSONAL_BIRTHDAY'] instanceof BitrixMainTypeDate? $arUser['PERSONAL_BIRTHDAY']->format('d-m'): false;
$arUser['LAST_ACTIVITY_DATE'] = $arUser['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $arUser['LAST_ACTIVITY_DATE']: false;
$userExternalAuthId = $arUser['EXTERNAL_AUTH_ID']? $arUser['EXTERNAL_AUTH_ID']: 'default';
if (
$userExternalAuthId == BitrixImBot::EXTERNAL_AUTH_ID
&& $bots[$arUser["ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK
&& (
$bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotSupport24::class
|| $bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotPartner24::class
|| $bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotSaleSupport24::class
)
)
{
$userExternalAuthId = 'support24';
}
$arUsers[$arUser["ID"]] = Array(
'id' => $arUser["ID"],
'name' => BitrixImUser::formatFullNameFromDatabase($arUser),
'active' => $arUser['ACTIVE'] == 'Y',
'first_name' => BitrixImUser::formatNameFromDatabase($arUser),
'last_name' => $arUser['LAST_NAME'],
'work_position' => $arUser['WORK_POSITION'],
'color' => $color,
'avatar' => CIMChat::GetAvatarImage($arUser["PERSONAL_PHOTO"]),
'avatar_id' => $arUser["PERSONAL_PHOTO"],
'birthday' => $arUser['PERSONAL_BIRTHDAY'],
'gender' => $arUser['PERSONAL_GENDER'] == 'F'? 'F': 'M',
'phone_device' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y',
'phones' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y',
'extranet' => self::IsExtranet($arUser),
'tz_offset' => intval($arUser['TIME_ZONE_OFFSET']),
'network' => $arUser['EXTERNAL_AUTH_ID'] == self::NETWORK_AUTH_ID || $arUser['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID && $bots[$arUser["ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK,
'bot' => $arUser['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID,
'connector' => $arUser['EXTERNAL_AUTH_ID'] == "imconnector",
'profile' => CIMContactList::GetUserPath($arUser["ID"]),
'external_auth_id' => $userExternalAuthId,
'status' => $arUser['STATUS'],
'idle' => $arUser['IDLE']?: false,
'last_activity_date' => $arUser['LAST_ACTIVITY_DATE']?: false,
'mobile_last_date' => $arUser['MOBILE_LAST_DATE']?: false,
'desktop_last_date' => $arUser['DESKTOP_LAST_DATE']?: false,
'departments' => $getDepartment && is_array($arUser["UF_DEPARTMENT"]) && !empty($arUser["UF_DEPARTMENT"])? array_values($arUser["UF_DEPARTMENT"]): Array(),
'absent' => self::formatAbsentResult($arUser["ID"]),
);
$services = [];
if (!empty($arUser['UF_ZOOM']))
{
$services['zoom'] = $arUser['UF_ZOOM'];
}
if (!empty($arUser['UF_SKYPE_LINK']))
{
$services['skype'] = $arUser['UF_SKYPE_LINK'];
}
else if (!empty($arUser['UF_SKYPE']))
{
$services['skype'] = 'skype://'.$arUser['UF_SKYPE'];
}
$arUsers[$arUser["ID"]]['services'] = empty($services)? null: array_change_key_case($services, CASE_LOWER);
if ($extraFields)
{
$arUsers[$arUser["ID"]]['website'] = $arUser['PERSONAL_WWW'];
$arUsers[$arUser["ID"]]['email'] = $arUser['EMAIL'];
}
foreach($arUsers[$arUser["ID"]]["departments"] as $dep_id)
{
if (isset($arUserInGroup[$dep_id]))
$arUserInGroup[$dep_id]['users'][] = $arUser["ID"];
else
$arUserInGroup[$dep_id] = Array('id' => $dep_id, 'users' => Array($arUser["ID"]));
}
if ($getHrPhoto)
{
$arHrPhoto[$arUser["ID"]] = $arUsers[$arUser["ID"]]['avatar'];
}
if ($getPhones)
{
if (CModule::IncludeModule('voximplant'))
{
$result = CVoxImplantPhone::Normalize($arUser["WORK_PHONE"]);
if ($result)
{
$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
}
$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_MOBILE"]);
if ($result)
{
$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
}
$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_PHONE"]);
if ($result)
{
$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
}
$result = preg_replace("/[^0-9#*]/i", "", $arUser["UF_PHONE_INNER"]);
if ($result)
{
$arPhones[$arUser["ID"]]['INNER_PHONE'] = $result;
}
}
else
{
$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
$arPhones[$arUser["ID"]]['INNER_PHONE'] = $arUser['UF_PHONE_INNER'];
}
if (isset($arPhones[$arUser["ID"]]))
{
$arUsers[$arUser["ID"]]['phones'] = array_change_key_case($arPhones[$arUser["ID"]], CASE_LOWER);
}
}
}
$result = array('users' => $arUsers, 'hrphoto' => $arHrPhoto, 'userInGroup' => $arUserInGroup, 'phones' => $arPhones, 'source' => $arSource);
if($useCache)
{
$cacheTag = array();
if($obCache->StartDataCache())
{
if(defined("BX_COMP_MANAGED_CACHE"))
{
global $CACHE_MANAGER;
$CACHE_MANAGER->StartTagCache($cache_dir);
if(is_array($arParams['ID']))
{
foreach ($arParams['ID'] as $id)
{
$tag = 'USER_NAME_'.intval($id);
if(!in_array($tag, $cacheTag))
{
$cacheTag[] = $tag;
$CACHE_MANAGER->RegisterTag($tag);
}
}
}
elseif (isset($arParams['ID']) && intval($arParams['ID']) > 0)
{
$tag = 'USER_NAME_'.intval($arParams['ID']);
$CACHE_MANAGER->RegisterTag($tag);
}
$CACHE_MANAGER->EndTagCache();
}
$obCache->EndDataCache($result);
unset($cacheTag);
}
}
unset($result['source']);
return $result;
}