Your IP : 3.128.205.92


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/im/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/im/lib/user.php

<?php
namespace Bitrix\Im;

class User
{
	private static $instance = Array();
	private $userId = 0;
	private $userData = null;

	const FILTER_LIMIT = 50;

	const PHONE_ANY = 'PHONE_ANY';
	const PHONE_WORK = 'work_phone';
	const PHONE_PERSONAL = 'personal_phone';
	const PHONE_MOBILE = 'personal_mobile';
	const PHONE_INNER = 'uf_phone_inner';

	function __construct($userId = null)
	{
		global $USER;

		$this->userId = (int)$userId;
		if ($this->userId <= 0 && is_object($USER) && $USER->GetID() > 0)
		{
			$this->userId = (int)$USER->GetID();
		}
	}

	/**
	 * @param null $userId
	 * @return User
	 */
	public static function getInstance($userId = null)
	{
		global $USER;

		$userId = (int)$userId;
		if ($userId <= 0 && is_object($USER) && $USER->GetID() > 0)
		{
			$userId = (int)$USER->GetID();
		}

		if (!isset(self::$instance[$userId]))
		{
			self::$instance[$userId] = new self($userId);
		}

		return self::$instance[$userId];
	}

	/**
	 * @return int
	 */
	public function getId()
	{
		return $this->userId;
	}

	/**
	 * @return string
	 */
	public function getFullName($safe = true)
	{
		$fields = $this->getFields();
		if (!$fields)
			return '';

		return $safe? $fields['name']: htmlspecialcharsback($fields['name']);
	}

	/**
	 * @return string
	 */
	public function getName($safe = true)
	{
		$fields = $this->getFields();
		if (!$fields)
			return '';

		return $safe? $fields['first_name']: htmlspecialcharsback($fields['first_name']);
	}

	/**
	 * @return string
	 */
	public function getLastName($safe = true)
	{
		$fields = $this->getFields();
		if (!$fields)
			return '';

		return $safe? $fields['last_name']: htmlspecialcharsback($fields['last_name']);
	}

	/**
	 * @return string
	 */
	public function getAvatar()
	{
		$fields = $this->getFields();

		return $fields && $fields['avatar'] != '/bitrix/js/im/images/blank.gif'? $fields['avatar']: '';
	}

	/**
	 * @return string
	 */
	public function getStatus()
	{
		$fields = $this->getFields();

		return $fields? $fields['status']: '';
	}

	/**
	 * @return string
	 */
	public function getIdle()
	{
		$fields = $this->getFields();

		if ($fields && $fields['idle'])
		{
			return $fields['idle'];
		}
		else
		{
			return false;
		}
	}

	/**
	 * @return string
	 */
	public function getLastActivityDate()
	{
		$fields = $this->getFields();

		if ($fields && $fields['last_activity_date'])
		{
			return $fields['last_activity_date'];
		}
		else
		{
			return false;
		}
	}

	/**
	 * @return string
	 */
	public function getMobileLastDate()
	{
		$fields = $this->getFields();

		if ($fields && $fields['mobile_last_date'])
		{
			return $fields['mobile_last_date'];
		}
		else
		{
			return false;
		}
	}

	/**
	 * @return string
	 */
	public function getBirthday()
	{
		$fields = $this->getFields();

		return $fields? $fields['birthday']: '';
	}

	/**
	 * @return string
	 */
	public function getAvatarId()
	{
		$fields = $this->getFields();

		return $fields? $fields['avatar_id']: 0;
	}

	/**
	 * @return string
	 */
	public function getWorkPosition($safe = false)
	{
		$fields = $this->getFields();

		if ($fields)
		{
			return $safe? $fields['work_position']: htmlspecialcharsback($fields['work_position']);
		}
		else
		{
			return false;
		}
	}

	/**
	 * @return string
	 */
	public function getGender()
	{
		$fields = $this->getFields();

		return $fields? $fields['gender']: '';
	}

	/**
	 * @return string
	 */
	public function getExternalAuthId()
	{
		$fields = $this->getFields();

		return $fields? $fields['external_auth_id']: '';
	}

	/**
	 * @return string
	 */
	public function getWebsite()
	{
		$fields = $this->getFields();

		return $fields? $fields['website']: '';
	}

	/**
	 * @return string
	 */
	public function getEmail()
	{
		$fields = $this->getFields();

		return $fields? $fields['email']: '';
	}

	/**
	 * @param string $type
	 * @return string
	 */
	public function getPhone($type = self::PHONE_ANY)
	{
		$fields = $this->getPhones();

		$result = '';
		if ($type == self::PHONE_ANY)
		{
			if (isset($fields[self::PHONE_MOBILE]))
			{
				$result = $fields[self::PHONE_MOBILE];
			}
			else if (isset($fields[self::PHONE_PERSONAL]))
			{
				$result = $fields[self::PHONE_PERSONAL];
			}
			else if (isset($fields[self::PHONE_WORK]))
			{
				$result = $fields[self::PHONE_WORK];
			}
		}
		else if (isset($fields[$type]))
		{
			$result = $fields[$type];
		}

		return $result;
	}

	/**
	 * @return string
	 */
	public function getColor()
	{
		$fields = $this->getFields();

		return $fields? $fields['color']: '';
	}

	/**
	 * @return string
	 */
	public function getTzOffset()
	{
		$fields = $this->getFields();

		return $fields? $fields['tz_offset']: '';
	}

	/**
	 * @return bool
	 */
	public function isOnline()
	{
		$fields = $this->getFields();

		return $fields? $fields['status'] != 'offline': false;
	}
	/**
	 * @return bool
	 */
	public function isExtranet()
	{
		$fields = $this->getFields();

		return $fields? (bool)$fields['extranet']: null;
	}

	/**
	 * @return bool
	 */
	public function isActive()
	{
		$fields = $this->getFields();

		return $fields? (bool)$fields['active']: null;
	}

	/**
	 * @return bool
	 */
	public function isAbsent()
	{
		$fields = $this->getFields();

		if ($fields && $fields['absent'])
		{
			return $fields['absent'];
		}
		else
		{
			return false;
		}
	}

	/**
	 * @return bool
	 */
	public function isNetwork()
	{
		$fields = $this->getFields();

		return $fields? (bool)$fields['network']: null;
	}

	/**
	 * @return bool
	 */
	public function isBot()
	{
		$fields = $this->getFields();

		return $fields? (bool)$fields['bot']: null;
	}

	/**
	 * @return bool
	 */
	public function isConnector()
	{
		$fields = $this->getFields();

		return $fields? (bool)$fields['connector']: null;
	}

	/**
	 * @return bool
	 */
	public function isExists()
	{
		$fields = $this->getFields();

		return $fields? true: false;
	}

	/**
	 * @return array|null
	 */
	public function getFields()
	{
		$params = $this->getParams();

		return $params? $params['user']: null;
	}

	/**
	 * @return array|null
	 */
	public function getPhones()
	{
		$params = $this->getFields();

		return $params? $params['phones']: null;
	}

	/**
	 * @return array|null
	 */
	public function getDepartments()
	{
		$params = $this->getFields();

		return $params? $params['departments']: Array();
	}

	/**
	 * @return array|null
	 */
	public function getArray($options = array())
	{
		if (!$this->isExists())
		{
			return null;
		}

		$result = Array(
			'ID' => $this->getId(),
			'NAME' => $this->getFullName(false),
			'FIRST_NAME' => $this->getName(false),
			'LAST_NAME' => $this->getLastName(false),
			'WORK_POSITION' => $this->getWorkPosition(false),
			'COLOR' => $this->getColor(),
			'AVATAR' => $this->getAvatar(),
			'GENDER' => $this->getGender(),
			'BIRTHDAY' => (string)$this->getBirthday(),
			'EXTRANET' => $this->isExtranet(),
			'NETWORK' => $this->isNetwork(),
			'BOT' => $this->isBot(),
			'CONNECTOR' => $this->isConnector(),
			'EXTERNAL_AUTH_ID' => $this->getExternalAuthId(),
			'STATUS' => $this->getStatus(),
			'IDLE' => $this->getIdle(),
			'LAST_ACTIVITY_DATE' => $this->getLastActivityDate(),
			'MOBILE_LAST_DATE' => $this->getMobileLastDate(),
			'DEPARTMENTS' => $this->getDepartments(),
			'ABSENT' => $this->isAbsent(),
			'PHONES' => $this->getPhones(),
		);

		if ($options['JSON'])
		{
			foreach ($result as $key => $value)
			{
				if ($value instanceof \Bitrix\Main\Type\DateTime)
				{
					$result[$key] = date('c', $value->getTimestamp());
				}
				else if ($key == 'AVATAR' && is_string($value) && $value && strpos($value, 'http') !== 0)
				{
					$result[$key] = \Bitrix\Im\Common::getPublicDomain().$value;
				}
			}
			$result = array_change_key_case($result, CASE_LOWER);
		}

		return $result;
	}

	/**
	 * @return array|null
	 */
	private function getParams()
	{
		if (is_null($this->userData))
		{
			$userData = \CIMContactList::GetUserData(Array(
				'ID' => self::getId(),
				'PHONES' => 'Y',
				'EXTRA_FIELDS' => 'Y',
				'DATE_ATOM' => 'N'
			));
			if (isset($userData['users'][self::getId()]))
			{
				$this->userData['user'] = $userData['users'][self::getId()];
			}
		}
		return $this->userData;
	}

	public static function uploadAvatar($avatarUrl = '')
	{
		if (!$ar = parse_url($avatarUrl))
			return '';

		if (!preg_match('#\.(png|jpg|jpeg|gif)$#i', $ar['path']))
			return '';

		$orm = \Bitrix\Im\Model\ExternalAvatarTable::getList(Array(
			'filter' => Array('=LINK_MD5' => md5($avatarUrl))
		));
		if ($cache = $orm->fetch())
		{
			return $cache['AVATAR_ID'];
		}

		$recordFile = \CFile::MakeFileArray($avatarUrl);
		if (!\CFile::IsImage($recordFile['name'], $recordFile['type']))
			return '';

		if (is_array($recordFile) && $recordFile['size'] && $recordFile['size'] > 0 && $recordFile['size'] < 1000000)
		{
			$recordFile = array_merge($recordFile, array('MODULE_ID' => 'imbot'));
		}
		else
		{
			$recordFile = 0;
		}

		if ($recordFile)
		{
			$recordFile = \CFile::SaveFile($recordFile, 'botcontroller');
		}

		if ($recordFile > 0)
		{
			\Bitrix\Im\Model\ExternalAvatarTable::add(Array(
				'LINK_MD5' => md5($avatarUrl),
				'AVATAR_ID' => intval($recordFile)
			));
		}

		return $recordFile;
	}

	/**
	 * @return bool
	 */
	public static function clearStaticCache()
	{
		self::$instance = Array();
		return true;
	}

	public static function isOpenlinesOperator($userId = null)
	{
		$userId = \Bitrix\Im\Common::getUserId($userId);
		if (!$userId)
		{
			return false;
		}

		$list = \Bitrix\ImOpenLines\Config::getQueueList($userId);

		return empty($list);
	}

	public static function getList($params)
	{
		$params = is_array($params)? $params: Array();

		if (!isset($params['CURRENT_USER']) && is_object($GLOBALS['USER']))
		{
			$params['CURRENT_USER'] = $GLOBALS['USER']->GetID();
		}

		$params['CURRENT_USER'] = intval($params['CURRENT_USER']);

		$userId = $params['CURRENT_USER'];
		if ($userId <= 0)
		{
			return false;
		}

		$enableLimit = false;
		if (isset($params['OFFSET']))
		{
			$filterLimit = intval($params['LIMIT']);
			$filterLimit = $filterLimit <= 0? self::FILTER_LIMIT: $filterLimit;

			$filterOffset = intval($params['OFFSET']);

			$enableLimit = true;
		}
		else
		{
			$filterLimit = false;
			$filterOffset = false;
		}

		$filter = self::getListFilter($params);
		if (is_null($filter))
		{
			return false;
		}
		$filter['ACTIVE'] = 'Y';

		$intranetInstalled = \Bitrix\Main\Loader::includeModule('intranet');
		$voximplantInstalled = \Bitrix\Main\Loader::includeModule('voximplant');

		$select = array(
			"ID", "LAST_NAME", "NAME", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", "WORK_PHONE", "PERSONAL_PHONE", "PERSONAL_MOBILE", "TIME_ZONE_OFFSET", "ACTIVE", "LAST_ACTIVITY_DATE",
			"COLOR" => "ST.COLOR", "STATUS" =>	"ST.STATUS", "IDLE" => "ST.IDLE", "MOBILE_LAST_DATE" => "ST.MOBILE_LAST_DATE",
		);
		if($intranetInstalled)
		{
			$select[] = 'UF_PHONE_INNER';
			$select[] = 'UF_DEPARTMENT';
		}
		if ($voximplantInstalled)
		{
			$select[] = 'UF_VI_PHONE';
		}

		$ormParams = Array(
			'select' => $select,
			'filter' => $filter,
			'runtime' => Array(
				new \Bitrix\Main\Entity\ReferenceField(
					'ST',
					'\Bitrix\Im\Model\StatusTable',
					array(
						"=ref.USER_ID" => "this.ID",
					),
					array("join_type"=>"LEFT")
				)
			),
		);
		if ($enableLimit)
		{
			$ormParams['offset'] = $filterOffset;
			$ormParams['limit'] = $filterLimit;
		}

		$orm = \Bitrix\Main\UserTable::getList($ormParams);

		$bots = \Bitrix\Im\Bot::getListCache();
		$nameTemplate = \CSite::GetNameFormat(false);

		$users = array();
		while ($user = $orm->fetch())
		{
			if (isset($extranetUsers[$user['ID']]))
			{
				continue;
			}

			$tmpFile = \CFile::ResizeImageGet(
				$user["PERSONAL_PHOTO"],
				array('width' => 100, 'height' => 100),
				BX_RESIZE_IMAGE_EXACT,
				false,
				false,
				true
			);

			$color = false;
			if (isset($user['COLOR']) && strlen($user['COLOR']) > 0)
			{
				$color = \Bitrix\Im\Color::getColor($user['COLOR']);
			}
			if (!$color)
			{
				$color = \CIMContactList::GetUserColor($user["ID"], $user['PERSONAL_GENDER'] == 'M'? 'M': 'F');
			}

			$users[$user["ID"]] = Array(
				'ID' => (int)$user["ID"],
				'NAME' => \CUser::FormatName($nameTemplate, $user, true, false),
				'FIRST_NAME' => $user['NAME'],
				'LAST_NAME' => $user['LAST_NAME'],
				'WORK_POSITION' => $user['WORK_POSITION'],
				'COLOR' => $color,
				'AVATAR' => !empty($tmpFile['src'])? $tmpFile['src']: '',
				'GENDER' => $user['PERSONAL_GENDER'] == 'F'? 'F': 'M',
				'BIRTHDAY' => $user['PERSONAL_BIRTHDAY'] instanceof \Bitrix\Main\Type\Date? $user['PERSONAL_BIRTHDAY']->format('d-m'): false,
				'EXTRANET' => \CIMContactList::IsExtranet($user),
				'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,
				'BOT' => $user['EXTERNAL_AUTH_ID'] == \Bitrix\Im\Bot::EXTERNAL_AUTH_ID,
				'CONNECTOR' => $user['EXTERNAL_AUTH_ID'] == "imconnector",
				'EXTERNAL_AUTH_ID' => $user['EXTERNAL_AUTH_ID']? $user['EXTERNAL_AUTH_ID']: 'default',
				'STATUS' => $user['STATUS'],
				'IDLE' => $user['IDLE'] instanceof \Bitrix\Main\Type\DateTime? $user['IDLE']: false,
				'LAST_ACTIVITY_DATE' => $user['MOBILE_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $user['MOBILE_LAST_DATE']: false,
				'MOBILE_LAST_DATE' => $user['LAST_ACTIVITY_DATE'] instanceof \Bitrix\Main\Type\DateTime? $user['LAST_ACTIVITY_DATE']: false,
				'DEPARTMENTS' => is_array($user['UF_DEPARTMENT']) && !empty($user['UF_DEPARTMENT'])? $user['UF_DEPARTMENT']: [],
				'ABSENT' => \CIMContactList::formatAbsentResult($user["ID"]),
			);

			if ($voximplantInstalled)
			{
				$user["WORK_PHONE"] = \CVoxImplantPhone::Normalize($user["WORK_PHONE"]);
				if ($user["WORK_PHONE"])
				{
					$users[$user["ID"]]['PHONES']['WORK_PHONE'] = $user['WORK_PHONE'];
				}
				$user["PERSONAL_MOBILE"] = \CVoxImplantPhone::Normalize($user["PERSONAL_MOBILE"]);
				if ($user["PERSONAL_MOBILE"])
				{
					$users[$user["ID"]]['PHONES']['PERSONAL_MOBILE'] = $user['PERSONAL_MOBILE'];
				}
				$user["PERSONAL_PHONE"] = \CVoxImplantPhone::Normalize($user["PERSONAL_PHONE"]);
				if ($user["PERSONAL_PHONE"])
				{
					$users[$user["ID"]]['PHONES']['PERSONAL_PHONE'] = $user['PERSONAL_PHONE'];
				}
				$user["UF_PHONE_INNER"] = preg_replace("/[^0-9\#\*]/i", "", $user["UF_PHONE_INNER"]);
				if ($user["UF_PHONE_INNER"])
				{
					$users[$user["ID"]]['PHONES']['INNER_PHONE'] = $user["UF_PHONE_INNER"];
				}
			}
			else
			{
				$users[$user["ID"]]['PHONES']['WORK_PHONE'] = $user['WORK_PHONE'];
				$users[$user["ID"]]['PHONES']['PERSONAL_MOBILE'] = $user['PERSONAL_MOBILE'];
				$users[$user["ID"]]['PHONES']['PERSONAL_PHONE'] = $user['PERSONAL_PHONE'];
				$users[$user["ID"]]['PHONES']['INNER_PHONE'] = $user["UF_PHONE_INNER"];
			}
		}

		if ($params['JSON'])
		{
			foreach ($users as $key => $userData)
			{
				foreach ($userData as $field => $value)
				{
					if ($value instanceof \Bitrix\Main\Type\DateTime)
					{
						$users[$key][$field] = date('c', $value->getTimestamp());
					}
					else if (is_string($value) && $value && in_array($field, Array('AVATAR')) && strpos($value, 'http') !== 0)
					{
						$users[$key][$field] = \Bitrix\Im\Common::getPublicDomain().$value;
					}
					else if (is_array($value))
					{
						$users[$key][$field] = array_change_key_case($value, CASE_LOWER);
					}
				}
				$users[$key] = array_change_key_case($users[$key], CASE_LOWER);;
			}
		}

		return $users;
	}

	public static function getListFilter($params)
	{
		if (isset($params['FILTER']['SEARCH']))
		{
			$filter = \Bitrix\Main\UserUtils::getUserSearchFilter(Array('FIND' => $params['FILTER']['SEARCH']));
			if (empty($filter))
			{
				return null;
			}
		}
		else
		{
			$filter = Array();
		}

		$filter['=ACTIVE'] = 'Y';
		$filter['=CONFIRM_CODE'] = false;
		foreach (\Bitrix\Main\UserTable::getExternalUserTypes() as $authId)
		{
			if ($authId != \Bitrix\Im\Bot::EXTERNAL_AUTH_ID)
			{
				$filter['!=EXTERNAL_AUTH_ID'][] = $authId;
			}
		}

		$filterByUsers = [];

		if (User::getInstance($params['CURRENT_USER'])->isExtranet())
		{
			$groups = \Bitrix\Im\Integration\Socialnetwork\Extranet::getGroup(Array(), $params['CURRENT_USER']);
			if (is_array($groups))
			{
				foreach ($groups as $group)
				{
					foreach ($group['USERS'] as $userId)
					{
						$filterByUsers[$userId] = $userId;
					}
				}
				$filterByUsers[$params['CURRENT_USER']] = $params['CURRENT_USER'];
			}
		}

		if (
			$params['FILTER']['BUSINESS'] == 'Y'
			&& \Bitrix\Main\Loader::includeModule('bitrix24')
			&& !\CBitrix24BusinessTools::isLicenseUnlimited()
		)
		{
			$businessUsers = \CBitrix24BusinessTools::getUnlimUsers();

			if (User::getInstance($params['CURRENT_USER'])->isExtranet())
			{
				$extranetBusinessResult = [];
				foreach ($filterByUsers as $userId)
				{
					if (in_array($userId, $businessUsers))
					{
						$extranetBusinessResult[$userId] = $userId;
					}
				}
				$filterByUsers = $extranetBusinessResult;
			}
			else
			{
				foreach ($businessUsers as $userId)
				{
					$filterByUsers[$userId] = $userId;
				}
			}
		}

		if ($filterByUsers)
		{
			$filter['=ID'] = array_keys($filterByUsers);
		}

		return $filter;
	}

	public static function getBusiness($userId = null, $options = array())
	{
		$userId = \Bitrix\Im\Common::getUserId($userId);
		if (!$userId)
		{
			return false;
		}

		$pagination = isset($options['LIST'])? true: false;

		$limit = isset($options['LIST']['LIMIT'])? intval($options['LIST']['LIMIT']): 50;
		$offset = isset($options['LIST']['OFFSET'])? intval($options['LIST']['OFFSET']): 0;

		$list = Array();

		$businessUsersAvailable = false;
		if (\Bitrix\Main\Loader::includeModule('bitrix24') && !\CBitrix24BusinessTools::isLicenseUnlimited())
		{
			$businessUsers = \CBitrix24BusinessTools::getUnlimUsers();

			if (User::getInstance($userId)->isExtranet())
			{
				$extranetBusinessResult = [];
				$groups = \Bitrix\Im\Integration\Socialnetwork\Extranet::getGroup(Array(), $userId);
				if (is_array($groups))
				{
					foreach ($groups as $group)
					{
						foreach ($group['USERS'] as $uid)
						{
							if (in_array($uid, $businessUsers))
							{
								$extranetUserList[$uid] = $uid;
							}
						}
					}
				}
				$list = $extranetBusinessResult;
			}
			else
			{
				foreach ($businessUsers as $userId)
				{
					$list[$userId] = $userId;
				}
			}

			$businessUsersAvailable = true;
		}

		$count = count($list);

		$list = array_slice($list, $offset, $limit);

		if ($options['USER_DATA'] == 'Y')
		{
			$result = Array();

			$getOptions = Array();
			if ($options['JSON'] == 'Y')
			{
				$getOptions['JSON'] = 'Y';
			}

			foreach ($list as $userId)
			{
				$result[] = \Bitrix\Im\User::getInstance($userId)->getArray($getOptions);
			}
		}
		else
		{
			$result = array_values($list);
		}

		if ($pagination)
		{
			$result = Array('TOTAL' => $count, 'RESULT' => $result, 'AVAILABLE' => $businessUsersAvailable);

			if ($options['JSON'] == 'Y')
			{
				$result = array_change_key_case($result, CASE_LOWER);
			}
		}
		else
		{
			if (!$businessUsersAvailable)
			{
				$result = false;
			}
		}

		return $result;
	}
}