4use Bitrix\Im\Model\StatusTable;
5use Bitrix\Main\Localization\Loc;
6use Bitrix\Main\Type\DateTime;
8Loc::loadMessages(__FILE__);
12 private static $instance = Array();
14 private $userData =
null;
34 $this->userId = (int)$userId;
35 if ($this->userId <= 0 && is_object(
$USER) &&
$USER->GetID() > 0)
37 $this->userId = (int)
$USER->GetID();
49 $userId = (int)$userId;
50 if ($userId <= 0 && is_object(
$USER) &&
$USER->GetID() > 0)
52 $userId = (int)
$USER->GetID();
55 if (!isset(self::$instance[$userId]))
57 self::$instance[$userId] =
new self($userId);
60 return self::$instance[$userId];
174 return $this->getOnlineFields()[
'last_activity_date'];
272 if (
$type == self::PHONE_ANY)
274 if (isset(
$fields[self::PHONE_MOBILE]))
278 else if (isset(
$fields[self::PHONE_PERSONAL]))
282 else if (isset(
$fields[self::PHONE_WORK]))
304 if (
$type == self::SERVICE_ANY)
306 if (isset(
$fields[self::SERVICE_SKYPE]))
310 else if (isset(
$fields[self::SERVICE_ZOOM]))
367 return \CIMContactList::formatAbsentResult($this->
getId());
467 $hrPhotoOption =
$options[
'HR_PHOTO'] ??
null;
468 $livechatOption =
$options[
'LIVECHAT'] ??
null;
469 $jsonOption =
$options[
'JSON'] ??
null;
470 $skipOnlineOption =
$options[
'SKIP_ONLINE'] ??
null;
473 ->getArray([
'WITHOUT_ONLINE' => $skipOnlineOption ===
'Y'])
479 in_array(
$key, [
'LAST_ACTIVITY_DATE',
'MOBILE_LAST_DATE',
'DESKTOP_LAST_DATE',
'ABSENT'])
481 && DateTime::isCorrect($value, \DateTimeInterface::RFC3339)
492 $lineId = \Bitrix\ImOpenLines\Queue::getActualLineId([
'LINE_ID' => $livechatOption,
'USER_CODE' =>
$options[
'USER_CODE']]);
494 $imolUserData = \Bitrix\ImOpenLines\Queue::getUserData($lineId, $this->
getId());
519 else if (is_string($value) && is_string(
$key) && in_array(
$key, [
'AVATAR',
'AVATAR_HR']) && is_string($value) && $value && mb_strpos($value,
'http') !== 0)
525 return array_change_key_case(
$result, CASE_LOWER);
536 foreach ($users as
$user)
548 $statuses = StatusTable::query()
549 ->setSelect([
'USER_ID',
'IDLE',
'MOBILE_LAST_DATE',
'DESKTOP_LAST_DATE',
'LAST_ACTIVITY_DATE' =>
'USER.LAST_ACTIVITY_DATE'])
550 ->whereIn(
'USER_ID', $ids)
557 $result[$id][
'last_activity_date'] =
$status[
'LAST_ACTIVITY_DATE'] ?
$status[
'LAST_ACTIVITY_DATE']->format(
'c') :
false;
558 $result[$id][
'desktop_last_date'] =
$status[
'DESKTOP_LAST_DATE'] ?
$status[
'DESKTOP_LAST_DATE']->format(
'c') :
false;
559 $result[$id][
'mobile_last_date'] =
$status[
'MOBILE_LAST_DATE'] ?
$status[
'MOBILE_LAST_DATE']->format(
'c') :
false;
569 private function getParams()
571 if (is_null($this->userData))
573 $userData = \CIMContactList::GetUserData(Array(
574 'ID' => $this->getId(),
576 'EXTRA_FIELDS' =>
'Y',
578 'SHOW_ONLINE' =>
'N',
580 if (isset($userData[
'users'][$this->getId()]))
582 $this->userData[
'user'] = $userData[
'users'][$this->getId()];
585 return $this->userData;
596 if (!
$ar = parse_url($avatarUrl))
601 if (!preg_match(
'#\.(png|jpg|jpeg|gif|webp)$#i',
$ar[
'path'],
$matches))
608 $orm = \Bitrix\Im\Model\ExternalAvatarTable::getList([
609 'select' => [
'*',
'FILE_EXISTS' =>
'FILE.ID'],
610 'filter' => [
'=LINK_MD5' =>
$hash]
612 if ($cache = $orm->fetch())
614 if ((
int)$cache[
'FILE_EXISTS'] > 0)
616 return (
int)$cache[
'AVATAR_ID'];
620 \Bitrix\Im\Model\ExternalAvatarTable::delete((
int)$cache[
'ID']);
628 $http = new \Bitrix\Main\Web\HttpClient();
631 ->setStreamTimeout(10);
633 if (!defined(
'BOT_CLIENT_URL'))
635 $http->setPrivateIp(
false);
637 if ($http->download($avatarUrl, $tempPath))
639 $recordFile = \CFile::MakeFileArray($tempPath);
651 if (!\CFile::IsImage($recordFile[
'name'], $recordFile[
'type']))
656 if (is_array($recordFile) && $recordFile[
'size'] && $recordFile[
'size'] > 0 && $recordFile[
'size'] < 1000000)
658 $recordFile = array_merge($recordFile, [
'MODULE_ID' =>
'imbot']);
667 $recordFile = \CFile::SaveFile($recordFile,
'botcontroller',
true);
670 if ((
int)$recordFile > 0)
672 \Bitrix\Im\Model\ExternalAvatarTable::add([
674 'AVATAR_ID' => (
int)$recordFile
686 self::$instance = Array();
698 return \Bitrix\ImOpenLines\Config::isOperator($userId);
701 private function getOnlineFields()
703 $online = \CIMStatus::GetList(Array(
'ID' => $this->getId()));
704 if (!$online || !isset($online[
'users'][$this->getId()]))
709 $online = $online[
'users'][$this->getId()];
712 'id' => $this->getId(),
713 'color' => $online[
'color']?:
'',
714 'idle' => $online[
'idle']?:
false,
715 'last_activity_date' => $online[
'last_activity_date']?:
false,
716 'mobile_last_date' => $online[
'mobile_last_date']?:
false,
731 $userId =
$params[
'CURRENT_USER'];
737 $enableLimit =
false;
740 $filterLimit = intval(
$params[
'LIMIT']);
741 $filterLimit = $filterLimit <= 0? self::FILTER_LIMIT: $filterLimit;
743 $filterOffset = intval(
$params[
'OFFSET']);
749 $filterLimit =
false;
750 $filterOffset =
false;
753 $ormParams = self::getListParams(
$params);
754 if (is_null($ormParams))
759 $filter = $ormParams[
'filter'];
766 "ID",
"LAST_NAME",
"NAME",
"LOGIN",
"PERSONAL_PHOTO",
"SECOND_NAME",
"PERSONAL_BIRTHDAY",
"WORK_POSITION",
"PERSONAL_GENDER",
"EXTERNAL_AUTH_ID",
"WORK_PHONE",
"PERSONAL_PHONE",
"PERSONAL_MOBILE",
"ACTIVE",
"LAST_ACTIVITY_DATE",
767 "COLOR" =>
"ST.COLOR",
"STATUS" =>
"ST.STATUS",
"IDLE" =>
"ST.IDLE",
"MOBILE_LAST_DATE" =>
"ST.MOBILE_LAST_DATE",
769 if($intranetInstalled)
774 if ($voximplantInstalled)
785 '\Bitrix\Im\Model\StatusTable',
787 "=ref.USER_ID" =>
"this.ID",
789 array(
"join_type"=>
"LEFT")
795 $ormParams[
'offset'] = $filterOffset;
796 $ormParams[
'limit'] = $filterLimit;
800 $bots = \Bitrix\Im\Bot::getListCache();
803 while (
$user = $orm->fetch())
805 if (\CIMContactList::IsExtranet(
$user))
811 if (isset(
$user[
'COLOR']) &&
$user[
'COLOR'] <>
'')
817 $color = \CIMContactList::GetUserColor(
$user[
"ID"],
$user[
'PERSONAL_GENDER'] ==
'M'?
'M':
'F');
820 $users[
$user[
"ID"]] = Array(
821 'ID' => (
int)
$user[
"ID"],
824 'LAST_NAME' =>
$user[
'LAST_NAME'],
825 'WORK_POSITION' =>
$user[
'WORK_POSITION'],
827 'AVATAR' => \CIMChat::GetAvatarImage(
$user[
"PERSONAL_PHOTO"], 200,
false),
828 'GENDER' =>
$user[
'PERSONAL_GENDER'] ==
'F'?
'F':
'M',
830 'EXTRANET' => \CIMContactList::IsExtranet(
$user),
831 'NETWORK' =>
$user[
'EXTERNAL_AUTH_ID'] == \CIMContactList::NETWORK_AUTH_ID ||
$user[
'EXTERNAL_AUTH_ID'] == \
Bitrix\
Im\Bot::EXTERNAL_AUTH_ID && $bots[
$user[
"ID"]][
'TYPE'] == \
Bitrix\
Im\Bot::TYPE_NETWORK,
832 'BOT' =>
$user[
'EXTERNAL_AUTH_ID'] == \
Bitrix\
Im\Bot::EXTERNAL_AUTH_ID,
833 'CONNECTOR' =>
$user[
'EXTERNAL_AUTH_ID'] ==
"imconnector",
834 'EXTERNAL_AUTH_ID' =>
$user[
'EXTERNAL_AUTH_ID']?
$user[
'EXTERNAL_AUTH_ID']:
'default',
835 'STATUS' =>
$user[
'STATUS'],
839 'DEPARTMENTS' => is_array(
$user[
'UF_DEPARTMENT']) && !empty(
$user[
'UF_DEPARTMENT'])?
$user[
'UF_DEPARTMENT']: [],
840 'ABSENT' => \CIMContactList::formatAbsentResult(
$user[
"ID"]),
844 $users[
$user[
"ID"]][
'AVATAR_HR'] = $users[
$user[
"ID"]][
'avatar'];
847 if ($voximplantInstalled)
849 $user[
"WORK_PHONE"] = \CVoxImplantPhone::Normalize(
$user[
"WORK_PHONE"]);
850 if (
$user[
"WORK_PHONE"])
852 $users[
$user[
"ID"]][
'PHONES'][
'WORK_PHONE'] =
$user[
'WORK_PHONE'];
854 $user[
"PERSONAL_MOBILE"] = \CVoxImplantPhone::Normalize(
$user[
"PERSONAL_MOBILE"]);
855 if (
$user[
"PERSONAL_MOBILE"])
857 $users[
$user[
"ID"]][
'PHONES'][
'PERSONAL_MOBILE'] =
$user[
'PERSONAL_MOBILE'];
859 $user[
"PERSONAL_PHONE"] = \CVoxImplantPhone::Normalize(
$user[
"PERSONAL_PHONE"]);
860 if (
$user[
"PERSONAL_PHONE"])
862 $users[
$user[
"ID"]][
'PHONES'][
'PERSONAL_PHONE'] =
$user[
'PERSONAL_PHONE'];
864 $user[
"UF_PHONE_INNER"] = preg_replace(
"/[^0-9\#\*]/i",
"",
$user[
"UF_PHONE_INNER"]);
865 if (
$user[
"UF_PHONE_INNER"])
867 $users[
$user[
"ID"]][
'PHONES'][
'INNER_PHONE'] =
$user[
"UF_PHONE_INNER"];
872 $users[
$user[
"ID"]][
'PHONES'][
'WORK_PHONE'] =
$user[
'WORK_PHONE'];
873 $users[
$user[
"ID"]][
'PHONES'][
'PERSONAL_MOBILE'] =
$user[
'PERSONAL_MOBILE'];
874 $users[
$user[
"ID"]][
'PHONES'][
'PERSONAL_PHONE'] =
$user[
'PERSONAL_PHONE'];
875 $users[
$user[
"ID"]][
'PHONES'][
'INNER_PHONE'] =
$user[
"UF_PHONE_INNER"];
881 foreach ($users as
$key => $userData)
883 foreach ($userData as $field => $value)
887 $users[
$key][$field] = date(
'c', $value->getTimestamp());
889 else if (is_string($value) && $value && is_string($field) && in_array($field, Array(
'AVATAR',
'AVATAR_HR')) && mb_strpos($value,
'http') !== 0)
893 else if (is_array($value))
895 $users[
$key][$field] = array_change_key_case($value, CASE_LOWER);
898 $users[
$key] = array_change_key_case($users[
$key], CASE_LOWER);;
907 if (isset(
$params[
'FILTER'][
'SEARCH']))
921 $filter[
'=CONFIRM_CODE'] =
false;
933 foreach ($group[
'USERS'] as $userId)
935 $filterByUsers[$userId] = $userId;
938 $filterByUsers[
$params[
'CURRENT_USER']] =
$params[
'CURRENT_USER'];
943 $params[
'FILTER'][
'BUSINESS'] ==
'Y'
944 && \
Bitrix\
Main\Loader::includeModule(
'bitrix24')
945 && !\CBitrix24BusinessTools::isLicenseUnlimited()
948 $businessUsers = \CBitrix24BusinessTools::getUnlimUsers();
952 $extranetBusinessResult = [];
953 foreach ($filterByUsers as $userId)
955 if (in_array($userId, $businessUsers))
957 $extranetBusinessResult[$userId] = $userId;
960 $filterByUsers = $extranetBusinessResult;
964 foreach ($businessUsers as $userId)
966 $filterByUsers[$userId] = $userId;
973 $filter[
'=ID'] = array_keys($filterByUsers);
987 $pagination = isset(
$options[
'LIST'])?
true:
false;
989 $limit = isset(
$options[
'LIST'][
'LIMIT'])? intval(
$options[
'LIST'][
'LIMIT']): 50;
990 $offset = isset(
$options[
'LIST'][
'OFFSET'])? intval(
$options[
'LIST'][
'OFFSET']): 0;
994 $businessUsersAvailable =
false;
995 if (\
Bitrix\
Main\Loader::includeModule(
'bitrix24') && !\CBitrix24BusinessTools::isLicenseUnlimited())
997 $businessUsers = \CBitrix24BusinessTools::getUnlimUsers();
1001 $extranetBusinessResult = [];
1007 foreach ($group[
'USERS'] as
$uid)
1009 if (in_array(
$uid, $businessUsers))
1016 $list = $extranetBusinessResult;
1020 foreach ($businessUsers as $userId)
1022 $list[$userId] = $userId;
1026 $businessUsersAvailable =
true;
1031 $list = array_slice($list, $offset, $limit);
1037 $getOptions = Array();
1040 $getOptions[
'JSON'] =
'Y';
1043 foreach ($list as $userId)
1050 $result = array_values($list);
1055 $result = Array(
'TOTAL' =>
$count,
'RESULT' =>
$result,
'AVAILABLE' => $businessUsersAvailable);
1064 if (!$businessUsersAvailable)
1083 '=AUTHOR_ID' => $userId
1090 if (intval(
$options[
'FIRST_ID']) > 0)
1097 $order = Array(
'ID' =>
'DESC');
1115 $skipMessage = isset(
$options[
'SKIP_MESSAGE']) &&
$options[
'SKIP_MESSAGE'] ==
'Y';
1118 'ID',
'CHAT_ID',
'DATE_CREATE',
1119 'CHAT_TITLE' =>
'CHAT.TITLE'
1126 $orm = \Bitrix\Im\Model\MessageTable::getList(
array(
1134 $messagesChat = Array();
1140 'TEXT' => (
string)
$message[
'MESSAGE'],
1148 $messagesChat[
$message[
'ID']] = Array(
1150 'CHAT_ID' => (
int)
$message[
'CHAT_ID']
1161 if (isset($param[
'FILE_ID']))
1163 foreach ($param[
'FILE_ID'] as $fileId)
1165 $fileIds[$messagesChat[
$messageId][
'CHAT_ID']][$fileId] = $fileId;
1173 foreach ($fileIds as $chatId => $fileId)
1192 $result[
'MESSAGES'][
$key][
'DATE'] = date(
'c', $value[
'DATE']->getTimestamp());
1203 $result[
'FILES'][
$key][
'date'] = date(
'c', $value[
'date']->getTimestamp());
1206 foreach ([
'urlPreview',
'urlShow',
'urlDownload'] as $field)
1209 if (is_string(
$url) &&
$url && mb_strpos(
$url,
'http') !== 0)
1226 if (in_array(
$fields[
'EXTERNAL_AUTH_ID'], \
Bitrix\
Main\UserTable::getExternalUserTypes()))
1228 return Loc::getMessage(
'IM_USER_GUEST_NAME');
1230 else if (!empty(
$fields[
'LOGIN']))
1236 return Loc::getMessage(
'IM_USER_ANONYM_NAME');
1245 if (is_null(self::$formatNameTemplate))
1247 self::$formatNameTemplate = \CSite::GetNameFormat(
false);
1252 if (in_array(
$fields[
'EXTERNAL_AUTH_ID'], \
Bitrix\
Main\UserTable::getExternalUserTypes()))
1254 return Loc::getMessage(
'IM_USER_GUEST_NAME');
1256 else if (!empty(
$fields[
'LOGIN']))
1262 return Loc::getMessage(
'IM_USER_ANONYM_NAME');
1266 return \CUser::FormatName(self::$formatNameTemplate,
$fields,
true,
false);
1272 if ($instance instanceof $c)
1274 self::$instance[$userId] = $instance;
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getUserId($userId=null)
static filterExternalUserTypes(array $skipTypes=[])
getWorkPosition($safe=false)
static getMessages($userId=null, $options=Array())
static formatFullNameFromDatabase($fields)
static isOpenlinesOperator($userId=null)
static formatNameFromDatabase($fields)
static uploadAvatar($avatarUrl='', $hash='')
static getInstance($userId=null)
static clearStaticCache()
static getListParams($params)
static $formatNameTemplate
getPhone($type=self::PHONE_ANY)
static getBusiness($userId=null, $options=array())
__construct($userId=null)
static setInstance($userId, $instance)
static getArrayWithOnline(array $users, array $options=['JSON'=> 'Y', 'SKIP_ONLINE'=> 'Y'])
getService($type=self::PHONE_ANY)
static formatLegacyJson(array $result)
static getInstance(?int $id)
static includeModule($moduleName)
static getList(array $parameters=array())
static getUserSearchFilter(array $fields)
static GetFiles($chatId, $fileId=false, $checkPermission=true)
static prepareShow($arMessages, $params)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
htmlspecialcharsback($str)
$GLOBALS['____1690880296']
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']