Your IP : 18.222.115.88


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/intranet.user.list/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/intranet.user.list/class.php

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;
use Bitrix\Intranet\Component\UserList;
use Bitrix\Main\Loader;
use Bitrix\Main\ErrorCollection;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Filter;
use Bitrix\Socialnetwork\UserToGroupTable;
use Bitrix\Main\PhoneNumber;

Loc::loadMessages(__FILE__);

Loader::includeModule("intranet");

class CIntranetUserListComponent extends UserList
{
	protected $gridId = 'INTRANET_USER_GRID_'.SITE_ID;
	protected $filterId = 'INTRANET_USER_LIST_'.SITE_ID;
	protected $explicitFieldsList = [
		'ID',
		'FULL_NAME',
		'PERSONAL_PHOTO',
		'UF_DEPARTMENT',
		'UF_DEPARTMENT_FLAT'
	];
	protected $availableEntityFields = [];

	private function extranetSite()
	{
		static $result = null;

		if ($result === null)
		{
			$result = (
				Loader::includeModule('extranet')
				&& \CExtranet::isExtranetSite()
			);
		}

		return $result;
	}

	private function getGridHeaders()
	{
		static $result = null;
		if ($result === null)
		{
			$result = [];

			$columns = [
				[
					'id' => 'ID',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_ID'),
					'sort' => 'ID',
//					'default' => true,
					'editable' => false
				],
				[
					'id' => 'PHOTO',
					'fieldId' => 'PERSONAL_PHOTO',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PHOTO'),
					'sort' => false,
					'default' => true,
					'editable' => false
				],
				[
					'id' => 'FULL_NAME',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_FULL_NAME'),
					'sort' => 'FULL_NAME',
					'default' => true,
					'editable' => false
				],
				[
					'id' => 'NAME',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_NAME'),
					'sort' => 'NAME',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'LAST_NAME',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_LAST_NAME'),
					'sort' => 'LAST_NAME',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'SECOND_NAME',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_SECOND_NAME'),
					'sort' => 'SECOND_NAME',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'LOGIN',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_LOGIN'),
					'sort' => 'LOGIN',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'EMAIL',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_EMAIL'),
					'sort' => 'EMAIL',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'DATE_REGISTER',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_DATE_REGISTER'),
					'sort' => 'DATE_REGISTER',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'LAST_ACTIVITY_DATE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_LAST_ACTIVITY_DATE'),
					'sort' => 'LAST_ACTIVITY_DATE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'BIRTHDAY',
					'fieldId' => 'PERSONAL_BIRTHDAY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_BIRTHDAY'),
//					'sort' => 'BIRTHDAY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WWW',
					'fieldId' => 'PERSONAL_WWW',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WWW'),
					'sort' => 'WWW',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'GENDER',
					'fieldId' => 'PERSONAL_GENDER',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_GENDER'),
					'sort' => 'GENDER',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PHONE_MOBILE',
					'fieldId' => 'PERSONAL_MOBILE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PHONE_MOBILE'),
					'sort' => 'PHONE_MOBILE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PHONE',
					'fieldId' => 'PERSONAL_PHONE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PHONE'),
					'sort' => 'PHONE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_CITY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_CITY'),
					'sort' => 'PERSONAL_CITY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_STREET',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_STREET'),
					'sort' => 'PERSONAL_STREET',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_STATE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_STATE'),
					'sort' => 'PERSONAL_STATE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_ZIP',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_ZIP'),
					'sort' => 'PERSONAL_ZIP',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_MAILBOX',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_MAILBOX'),
					'sort' => 'PERSONAL_MAILBOX',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'PERSONAL_COUNTRY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_PERSONAL_COUNTRY'),
					'sort' => 'PERSONAL_COUNTRY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_CITY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_CITY'),
					'sort' => 'WORK_CITY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_STREET',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_STREET'),
					'sort' => 'WORK_STREET',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_STATE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_STATE'),
					'sort' => 'WORK_STATE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_ZIP',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_ZIP'),
					'sort' => 'WORK_ZIP',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_MAILBOX',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_MAILBOX'),
					'sort' => 'WORK_MAILBOX',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_COUNTRY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_COUNTRY'),
					'sort' => 'WORK_COUNTRY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_PHONE',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_PHONE'),
					'sort' => 'WORK_PHONE',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'POSITION',
					'fieldId' => 'WORK_POSITION',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_POSITION'),
					'sort' => 'POSITION',
					'default' => true,
					'editable' => false
				],
				[
					'id' => 'COMPANY',
					'fieldId' => 'WORK_COMPANY',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_COMPANY'),
					'sort' => 'COMPANY',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'WORK_DEPARTMENT',
					'fieldId' => 'WORK_DEPARTMENT',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_WORK_DEPARTMENT'),
					'sort' => 'WORK_DEPARTMENT',
					'default' => false,
					'editable' => false
				],
				[
					'id' => 'DEPARTMENT',
					'fieldId' => 'UF_DEPARTMENT',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_DEPARTMENT'),
					'sort' => false,
					'default' => true,
					'editable' => false
				],
				[
					'id' => 'TAGS',
					'name' => Loc::getMessage('INTRANET_USER_LIST_COLUMN_TAGS'),
					'sort' => false,
					'default' => false,
					'editable' => false
				],
			];

			$gridUFManager = new \Bitrix\Main\Grid\Uf\User();
			$gridUFManager->addUFHeaders($columns);

			foreach($columns as $column)
			{
				$fieldId = (isset($column['fieldId']) ? $column['fieldId'] : $column['id']);
				if (
					in_array($fieldId, $this->explicitFieldsList)
					|| in_array($fieldId, $this->arParams['USER_PROPERTY_LIST'])
				)
				{
					$result[] = $column;
				}
			}

			$defaultSelectedGridHeaders = $this->getDefaultGridSelectedHeaders();

			foreach($result as $key => $column)
			{
				if (
					!$column['default']
					&& in_array($column['id'], $defaultSelectedGridHeaders)
				)
				{
					$result[$key]['default'] = true;
				}
			}
		}

		return $result;
	}

	private function getDefaultGridHeaders()
	{
		$result = [];
		$gridHeaders = $this->getGridHeaders();
		foreach($gridHeaders as $header)
		{
			if (!empty($header['default']))
			{
				$result[] = $header['id'];
			}
		}

		return $result;
	}

	private function getDefaultGridSelectedHeaders()
	{
		$result = [
			'EMAIL',
			'PERSONAL_MOBILE',
			'UF_SKYPE',
			'WORK_PHONE',
			'PERSONAL_PHOTO',
			'FULL_NAME',
		];

		if (
			\Bitrix\Main\Loader::includeModule('extranet')
			&& \CExtranet::isExtranetSite()
		)
		{
			$result[] = 'WORK_COMPANY';
		}
		else
		{
			$result[] = 'UF_PHONE_INNER';
			$result[] = 'UF_DEPARTMENT';
		}

		return $result;
	}

	private function getFilterFields(\Bitrix\Main\Filter\Filter $entityFilter, array $usedFields = [])
	{
		$result = [];

		$fields = $entityFilter->getFields();

		foreach ($fields as $fieldName => $field)
		{
			if (!in_array($fieldName, $usedFields))
			{
				continue;
			}

			$result[] = $field->toArray();
		}

		return $result;
	}

	private function getFilterPresets(\Bitrix\Main\Filter\Filter $entityFilter)
	{
		$result = [];
		$fields = $entityFilter->getFields();

		$defaultFilterIds = $entityFilter->getDefaultFieldIDs();
		$defaultFieldsValues = [];
		foreach($defaultFilterIds as $fieldId)
		{
			switch ($fields[$fieldId])
			{
				case 'dest_selector':
					$value = false;
					break;
				default:
					$value = '';
			}
			$defaultFieldsValues[$fieldId] = $value;
		}

		if (!Filter\UserDataProvider::extranetSite())
		{
			$result['company'] = [
				'name' => Loc::getMessage('INTRANET_USER_LIST_FILTER_PRESET_COMPANY'),
				'fields' => array_merge($defaultFieldsValues, [
					'FIRED' => 'N'
				]),
				'default' => true
			];
		}
		else
		{
			$result['employees'] = [
				'name' => Loc::getMessage('INTRANET_USER_LIST_FILTER_PRESET_EMPLOYEES'),
				'fields' => array_merge($defaultFieldsValues, [
					'EXTRANET' => 'N'
				]),
				'default' => true
			];
		}

		if (Filter\UserDataProvider::getExtranetAvailability())
		{
			$result['extranet'] = [
				'name' => Loc::getMessage(!Filter\UserDataProvider::extranetSite() ? 'INTRANET_USER_LIST_FILTER_PRESET_EXTRANET' : 'INTRANET_USER_LIST_FILTER_PRESET_CONTACTS'),
				'fields' => array_merge($defaultFieldsValues, [
					'EXTRANET' => 'Y',
					'FIRED' => 'N'
				])
			];
		}

		if (Filter\UserDataProvider::getInvitedAvailability())
		{
			$result['invited'] = [
				'name' => Loc::getMessage('INTRANET_USER_LIST_FILTER_PRESET_INVITED'),
				'fields' => array_merge($defaultFieldsValues, [
					'INVITED' => 'Y'
				])
			];
		}

		if (Filter\UserDataProvider::getFiredAvailability())
		{
			$result['fired'] = [
				'name' => Loc::getMessage('INTRANET_USER_LIST_FILTER_PRESET_FIRED'),
				'fields' => array_merge($defaultFieldsValues, [
					'FIRED' => 'Y'
				])
			];
		}

		return $result;
	}

	private function getOrder(\Bitrix\Main\Grid\Options $gridOptions)
	{
		$result = [];
		$gridSort = $gridOptions->getSorting();

		if (!empty($gridSort['sort']))
		{
			foreach($gridSort['sort'] as $by => $order)
			{
				switch($by)
				{
					case 'FULL_NAME':
						$by = 'LAST_NAME';
						break;
					case 'BIRTHDAY':
						$by = 'PERSONAL_BIRTHDAY';
						break;
					case 'GENDER':
						$by = 'PERSONAL_GENDER';
						break;
					case 'WWW':
						$by = 'PERSONAL_WWW';
						break;
					case 'PHONE_MOBILE':
						$by = 'PERSONAL_MOBILE';
						break;
					case 'PHONE':
						$by = 'PERSONAL_PHONE';
						break;
					case 'POSITION':
						$by = 'WORK_POSITION';
						break;
					case 'COMPANY':
						$by = 'WORK_COMPANY';
						break;
					default:
				}
				$result[$by] = mb_strtoupper($order);
			}
		}
		else
		{
			$result = [
				'LAST_NAME' => 'ASC',
				'LOGIN' => 'ASC'
			];
		}

		return $result;
	}

	private function initAvailableEntityFields()
	{
		$entityFields = \Bitrix\Intranet\UserTable::getEntity()->getFields();
		foreach($entityFields as $entityField)
		{
			$this->availableEntityFields[] = $entityField->getName();
		}
	}

	private function checkQueryFieldName($fieldName = '')
	{
		$fieldName = trim($fieldName, '!=<>%*');
		return (
			in_array($fieldName, $this->availableEntityFields)
			|| mb_strpos($fieldName, '.') !== false
		);
	}


	private function addQueryOrder(\Bitrix\Main\Entity\Query &$query, \Bitrix\Main\Grid\Options $gridOptions)
	{
		$orderFields = $this->getOrder($gridOptions);
		foreach($orderFields as $fieldName => $value)
		{
			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}
			$query->addOrder($fieldName, $value);
		}
	}

	private function addQueryFilter(\Bitrix\Main\Entity\Query &$query, array $gridFilter)
	{
		global $USER;

		$filter = $this->getFilter($gridFilter);

		$departmentId = $flatDepartmentId = false;

		foreach($filter as $fieldName => $value)
		{
			if ($fieldName == '=UF_DEPARTMENT')
			{
				$departmentId = intval($filter[$fieldName]);
				unset($filter[$fieldName]);
				continue;
			}
			elseif ($fieldName == '=UF_DEPARTMENT_FLAT')
			{
				$query->addFilter('=UF_DEPARTMENT', $value);
				unset($filter[$fieldName]);
				continue;
			}

			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}

			$query->addFilter($fieldName, $value);
		}

		if (
			Loader::includeModule('extranet')
			&& !\CExtranet::isExtranetAdmin()
			&& (
				(
					isset($filter['UF_DEPARTMENT'])
					&& $filter['UF_DEPARTMENT'] == false
				)
				|| !\CExtranet::isIntranetUser()
				|| !isset($filter['UF_DEPARTMENT'])
			)
			&& (
				!isset($filter['!UF_DEPARTMENT'])
				|| $filter['!UF_DEPARTMENT'] !== false
				|| !\CExtranet::isIntranetUser()
			)
			&& Loader::includeModule('socialnetwork')
		)
		{
			$workgroupIdList = [];
			$res = UserToGroupTable::getList([
				'filter' => [
					'=USER_ID' => $USER->getId(),
					'@ROLE' => UserToGroupTable::getRolesMember(),
					'=GROUP.ACTIVE' => 'Y'
				],
				'select' => [ 'GROUP_ID' ]
			]);

			while ($userToGroupFields = $res->fetch())
			{
				$workgroupIdList[] = $userToGroupFields['GROUP_ID'];
			}
			$workgroupIdList = array_unique($workgroupIdList);

			if (
				!isset($filter['UF_DEPARTMENT'])
				&& \CExtranet::isIntranetUser()
			)
			{
				if (!empty($workgroupIdList))
				{
					$subQuery = new \Bitrix\Main\Entity\Query(UserToGroupTable::getEntity());
					$subQuery->addSelect('USER_ID');
					$subQuery->addFilter("=ROLE", UserToGroupTable::ROLE_USER);
					$subQuery->addFilter("@GROUP_ID", $workgroupIdList);
					$subQuery->addGroup("USER_ID");

					$query->addFilter(null, [
						'LOGIC' => 'OR',
						[
							'!UF_DEPARTMENT' => false
						],
						[
							'@ID' => new Bitrix\Main\DB\SqlExpression($subQuery->getQuery())
						],
					]);
				}
				else
				{
					$query->addFilter('!UF_DEPARTMENT', false);
				}
			}
			elseif (empty($workgroupIdList))
			{
				return false;
			}
			else
			{
				$query->registerRuntimeField(
					'',
					new \Bitrix\Main\Entity\ReferenceField(
						'UG',
						\Bitrix\Socialnetwork\UserToGroupTable::getEntity(),
						array(
							'=ref.USER_ID' => 'this.ID',
						),
						array('join_type' => 'INNER')
					)
				);

				$query->addFilter("<=UG.ROLE", UserToGroupTable::ROLE_USER);
				$query->addFilter("@UG.GROUP_ID", $workgroupIdList);
			}
		}

		if ($departmentId)
		{
			$iblockId = (int) Option::get('intranet', 'iblock_structure', 0);
			if (
				$iblockId > 0
				&& Loader::includeModule('iblock')
			)
			{
				$section = \Bitrix\Iblock\SectionTable::getList([
					'filter' => [
						'=IBLOCK_ID' => $iblockId,
						'=ID' => $departmentId
					],
					'select' => [ 'LEFT_MARGIN', 'RIGHT_MARGIN' ],
					'limit' => 1
				])->fetch();

				if ($section)
				{
					$query->registerRuntimeField(
						'',
						new \Bitrix\Main\Entity\ReferenceField(
							'DEPARTMENT',
							\Bitrix\Iblock\SectionTable::getEntity(),
							array(
								'=ref.ID' => 'this.UF_DEPARTMENT_SINGLE',
							),
							array('join_type' => 'INNER')
						)
					);
					$query->addFilter("=DEPARTMENT.IBLOCK_ID", $iblockId);
					$query->addFilter(">=DEPARTMENT.LEFT_MARGIN", $section['LEFT_MARGIN']);
					$query->addFilter("<=DEPARTMENT.RIGHT_MARGIN", $section['RIGHT_MARGIN']);
				}
			}
		}

		return true;
	}

	private function addQuerySelect(\Bitrix\Main\Entity\Query &$query, \Bitrix\Main\Grid\Options $gridOptions)
	{
		$selectFields = $this->getSelect($gridOptions);
		foreach($selectFields as $fieldName)
		{
			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}
			$query->addSelect($fieldName);
		}
	}

	private function addFilterInteger(&$filter, array $params = [])
	{
		$filterFieldName = (isset($params['FILTER_FIELD_NAME']) ? $params['FILTER_FIELD_NAME'] : '');
		$value = (isset($params['VALUE']) ?  $params['VALUE'] : '');

		if (
			$filterFieldName == ''
			|| intval($value) <= 0
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] <> '' ? $params['FIELD_NAME'] : $filterFieldName);
		$operation = (isset($params['OPERATION']) ?  $params['OPERATION'] : '=');

		if (
			in_array($fieldName, $this->arParams['USER_PROPERTY_LIST'])
			|| in_array($fieldName, $this->explicitFieldsList)
		)
		{
			$filter[$operation.$fieldName] = $value;
		}
	}

	private function addFilterString(&$filter, array $params = [])
	{
		$filterFieldName = (isset($params['FILTER_FIELD_NAME']) ? $params['FILTER_FIELD_NAME'] : '');
		$value = (isset($params['VALUE']) ?  $params['VALUE'] : '');

		if (
			$filterFieldName == ''
			|| trim($value, '%') == ''
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] <> '' ? $params['FIELD_NAME'] : $filterFieldName);
		$operation = (isset($params['OPERATION']) ?  $params['OPERATION'] : '%=');

		if (in_array($fieldName, $this->arParams['USER_PROPERTY_LIST']))
		{
			$filter[$operation.$fieldName] = $value;
		}
	}

	private function addFilterDateTime(&$filter, array $params = [])
	{
		$filterFieldName = (isset($params['FILTER_FIELD_NAME']) ? $params['FILTER_FIELD_NAME'] : '');
		$valueFrom = (isset($params['VALUE_FROM']) ?  $params['VALUE_FROM'] : '');
		$valueTo = (isset($params['VALUE_TO']) ?  $params['VALUE_TO'] : '');

		if (
			$filterFieldName == ''
			|| (
				$valueFrom == ''
				&& $valueTo == ''
			)
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] <> '' ? $params['FIELD_NAME'] : $filterFieldName);

		if (in_array($fieldName, $this->arParams['USER_PROPERTY_LIST']))
		{
			if ($valueFrom <> '')
			{
				$filter['>='.$fieldName] = $valueFrom;
			}
			if ($valueTo <> '')
			{
				$filter['<='.$fieldName] = $valueTo;
			}
		}
	}

	/**
	 * Get filter for getList.
	 * @param array $gridFilter
	 * @return array|boolean
	 */
	private function getFilter(array $gridFilter)
	{
		global $USER_FIELD_MANAGER;

		$result = [
			'IS_REAL_USER' => 'Y'
		];

		if (!Filter\UserDataProvider::getFiredAvailability())
		{
			$result['=ACTIVE'] = 'Y';
		}
		elseif (!empty($gridFilter['FIRED']))
		{
			if ($gridFilter['FIRED'] == 'Y')
			{
				$result['=ACTIVE'] = 'N';
			}
			elseif ($gridFilter['FIRED'] == 'N')
			{
				$result['=ACTIVE'] = 'Y';
			}
		}

		if (
			!empty($gridFilter['EXTRANET'])
			&& Filter\UserDataProvider::getExtranetAvailability()
		)
		{
			if ($gridFilter['EXTRANET'] === 'Y')
			{
				$result['UF_DEPARTMENT'] = false;
				if (
					Loader::includeModule('extranet')
					&& ($extranetGroupId = \CExtranet::getExtranetUserGroupId())
				)
				{
					$result['=GROUPS.GROUP_ID'] = $extranetGroupId;
				}
			}
			elseif ($gridFilter['EXTRANET'] === 'N')
			{
				$result['!UF_DEPARTMENT'] = false;
			}
		}
		elseif (in_array($gridFilter['PRESET_ID'], ['company', 'employees']))
		{
			$result['!UF_DEPARTMENT'] = false;
		}

		if (
			!empty($gridFilter['INVITED'])
			&& Filter\UserDataProvider::getInvitedAvailability()
		)
		{
			if ($gridFilter['INVITED'] == 'Y')
			{
				$result['!CONFIRM_CODE'] = false;
			}
			else
			{
				$result['CONFIRM_CODE'] = false;
			}
		}
		elseif (
			$gridFilter['PRESET_ID'] == 'company'
			|| !Filter\UserDataProvider::getInvitedAvailability()
		)
		{
			$result['CONFIRM_CODE'] = false;
		}

		if (
			!empty($gridFilter['INTEGRATOR'])
			&& $gridFilter['INTEGRATOR'] == 'Y'
			&& method_exists('Bitrix\Main\Filter\UserDataProvider', 'getIntegratorAvailability')
			&& Filter\UserDataProvider::getIntegratorAvailability()
			&& Loader::includeModule('bitrix24')
		)
		{
			$integratorGroupId = \Bitrix\Bitrix24\Integrator::getIntegratorGroupId();
			if ($integratorGroupId)
			{
				$result['=GROUPS.GROUP_ID'] = $integratorGroupId;
			}
		}

		if (
			!empty($gridFilter['ADMIN'])
			&& $gridFilter['ADMIN'] == 'Y'
			&& method_exists('Bitrix\Main\Filter\UserDataProvider', 'getAdminAvailability')
			&& Filter\UserDataProvider::getAdminAvailability()
		)
		{
			$result['=GROUPS.GROUP_ID'] = 1;
			if (Loader::includeModule('bitrix24'))
			{
				$integratorGroupId = \Bitrix\Bitrix24\Integrator::getIntegratorGroupId();
				if ($integratorGroupId)
				{
					$result['!=GROUPS.GROUP_ID'] = $integratorGroupId;
				}
			}
		}

		if (
			!empty($gridFilter['IS_ONLINE'])
			&& in_array($gridFilter['IS_ONLINE'], [ 'Y', 'N' ])
		)
		{
			$result['IS_ONLINE'] = (
				$gridFilter['IS_ONLINE'] == 'Y'
					? 'Y'
					: 'N'
			);
		}

		if (isset($gridFilter['TAGS']))
		{
			$tagsSearchValue = trim($gridFilter['TAGS']);
			if ($tagsSearchValue <> '')
			{
				$result['%=TAGS.NAME'] = $tagsSearchValue.'%';
			}
		}

		$integerFieldsList = [
			[
				'FILTER_FIELD_NAME' => 'ID',
				'FIELD_NAME' => 'ID',
				'OPERATION' => '=',
				'VALUE' => $gridFilter['ID']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_COUNTRY',
				'FIELD_NAME' => 'PERSONAL_COUNTRY',
				'OPERATION' => '@',
				'VALUE' => $gridFilter['PERSONAL_COUNTRY']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_COUNTRY',
				'FIELD_NAME' => 'WORK_COUNTRY',
				'OPERATION' => '@',
				'VALUE' => $gridFilter['WORK_COUNTRY']
			],
			[
				'FILTER_FIELD_NAME' => 'DEPARTMENT',
				'FIELD_NAME' => 'UF_DEPARTMENT',
				'OPERATION' => '=',
				'VALUE' => (
					$gridFilter['DEPARTMENT']
					&& preg_match('/^DR(\d+)$/', $gridFilter['DEPARTMENT'], $matches)
						? $matches[1]
						: ($gridFilter['DEPARTMENT'] && intval($gridFilter['DEPARTMENT'] > 0) ? $gridFilter['DEPARTMENT'] : false)
				)
			],
			[
				'FILTER_FIELD_NAME' => 'DEPARTMENT',
				'FIELD_NAME' => 'UF_DEPARTMENT_FLAT',
				'OPERATION' => '=',
				'VALUE' => (
					$gridFilter['DEPARTMENT'] && preg_match('/^D(\d+)$/', $gridFilter['DEPARTMENT'], $matches)
						? $matches[1]
						: false
				)
			]
		];

		$stringFieldsList = [
			[
				'FILTER_FIELD_NAME' => 'NAME',
				'FIELD_NAME' => 'NAME',
				'OPERATION' => '%=',
				'VALUE' => $gridFilter['NAME'].'%'
			],
			[
				'FILTER_FIELD_NAME' => 'LAST_NAME',
				'FIELD_NAME' => 'LAST_NAME',
				'OPERATION' => '%=',
				'VALUE' => $gridFilter['LAST_NAME'].'%'
			],
			[
				'FILTER_FIELD_NAME' => 'SECOND_NAME',
				'FIELD_NAME' => 'SECOND_NAME',
				'OPERATION' => '%=',
				'VALUE' => $gridFilter['SECOND_NAME'].'%'
			],
			[
				'FILTER_FIELD_NAME' => 'LOGIN',
				'FIELD_NAME' => 'LOGIN',
				'OPERATION' => '%=',
				'VALUE' => $gridFilter['LOGIN'].'%'
			],
			[
				'FILTER_FIELD_NAME' => 'EMAIL',
				'FIELD_NAME' => 'EMAIL',
				'OPERATION' => '%=',
				'VALUE' => $gridFilter['EMAIL'].'%'
			],
			[
				'FILTER_FIELD_NAME' => 'GENDER',
				'FIELD_NAME' => 'PERSONAL_GENDER',
				'OPERATION' => '=',
				'VALUE' => $gridFilter['GENDER']
			],
			[
				'FILTER_FIELD_NAME' => 'PHONE_MOBILE',
				'FIELD_NAME' => 'PERSONAL_MOBILE',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PHONE_MOBILE']
			],
			[
				'FILTER_FIELD_NAME' => 'PHONE',
				'FIELD_NAME' => 'PERSONAL_PHONE',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PHONE']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_CITY',
				'FIELD_NAME' => 'PERSONAL_CITY',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PERSONAL_CITY']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_STREET',
				'FIELD_NAME' => 'PERSONAL_STREET',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PERSONAL_STREET']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_STATE',
				'FIELD_NAME' => 'PERSONAL_STATE',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PERSONAL_STATE']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_ZIP',
				'FIELD_NAME' => 'PERSONAL_ZIP',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PERSONAL_ZIP']
			],
			[
				'FILTER_FIELD_NAME' => 'PERSONAL_MAILBOX',
				'FIELD_NAME' => 'PERSONAL_MAILBOX',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['PERSONAL_MAILBOX']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_CITY',
				'FIELD_NAME' => 'WORK_CITY',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_CITY']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_STREET',
				'FIELD_NAME' => 'WORK_STREET',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_STREET']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_STATE',
				'FIELD_NAME' => 'WORK_STATE',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_STATE']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_ZIP',
				'FIELD_NAME' => 'WORK_ZIP',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_ZIP']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_MAILBOX',
				'FIELD_NAME' => 'WORK_MAILBOX',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_MAILBOX']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_PHONE',
				'FIELD_NAME' => 'WORK_PHONE',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_PHONE']
			],
			[
				'FILTER_FIELD_NAME' => 'POSITION',
				'FIELD_NAME' => 'WORK_POSITION',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['POSITION']
			],
			[
				'FILTER_FIELD_NAME' => 'COMPANY',
				'FIELD_NAME' => 'WORK_COMPANY',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['COMPANY']
			],
			[
				'FILTER_FIELD_NAME' => 'WORK_DEPARTMENT',
				'FIELD_NAME' => 'WORK_DEPARTMENT',
				'OPERATION' => '%',
				'VALUE' => $gridFilter['WORK_DEPARTMENT']
			],
		];

		$dateFieldsList = [
			[
				'FILTER_FIELD_NAME' => 'DATE_REGISTER',
				'FIELD_NAME' => 'DATE_REGISTER',
				'VALUE_FROM' => (isset($gridFilter['DATE_REGISTER_from']) ? $gridFilter['DATE_REGISTER_from'] : false),
				'VALUE_TO' => (isset($gridFilter['DATE_REGISTER_to']) ? $gridFilter['DATE_REGISTER_to'] : false)
			],
			[
				'FILTER_FIELD_NAME' => 'LAST_ACTIVITY_DATE',
				'FIELD_NAME' => 'LAST_ACTIVITY_DATE',
				'VALUE_FROM' => (isset($gridFilter['LAST_ACTIVITY_DATE_from']) ? $gridFilter['LAST_ACTIVITY_DATE_from'] : false),
				'VALUE_TO' => (isset($gridFilter['LAST_ACTIVITY_DATE_to']) ? $gridFilter['LAST_ACTIVITY_DATE_to'] : false)
			],
			[
				'FILTER_FIELD_NAME' => 'BIRTHDAY',
				'FIELD_NAME' => 'PERSONAL_BIRTHDAY',
				'VALUE_FROM' => (isset($gridFilter['BIRTHDAY_from']) ? $gridFilter['BIRTHDAY_from'] : false),
				'VALUE_TO' => (isset($gridFilter['BIRTHDAY_to']) ? $gridFilter['BIRTHDAY_to'] : false)
			]
		];

		foreach($integerFieldsList as $field)
		{
			$value = false;

			if (
				is_array($field['VALUE'])
				&& !empty($field['VALUE'])
			)
			{
				$value = $field['VALUE'];
			}
			elseif (
				!is_array($field['VALUE'])
				&& $field['VALUE'] <> ''
			)
			{
				$value = intval($field['VALUE']);
			}

			if ($value !== false)
			{
				$this->addFilterInteger($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'OPERATION' => (isset($field['OPERATION']) ? $field['OPERATION'] : '='),
					'VALUE' => $value
				]);
			}
		}

		foreach($stringFieldsList as $field)
		{
			if ($field['VALUE'] <> '')
			{
				$this->addFilterString($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'OPERATION' => (isset($field['OPERATION']) ? $field['OPERATION'] : '%='),
					'VALUE' => $field['VALUE']
				]);
			}
		}

		foreach($dateFieldsList as $field)
		{
			if (
				!empty($field['VALUE_FROM'])
				|| !empty($field['VALUE_TO'])
			)
			{
				$this->addFilterDateTime($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'VALUE_FROM' => (isset($field['VALUE_FROM']) ? $field['VALUE_FROM'] : $gridFilter[$field['FILTER_FIELD_NAME']]),
					'VALUE_TO' => (isset($field['VALUE_TO']) ? $field['VALUE_TO'] : $gridFilter[$field['FILTER_FIELD_NAME']])
				]);
			}
		}

		$ufList = $USER_FIELD_MANAGER->getUserFields(\Bitrix\Main\UserTable::getUfId(), 0, LANGUAGE_ID, false);
		$ufCodesList = array_keys($ufList);

		foreach($gridFilter as $key => $value)
		{
			if (
				preg_match('/(.*)_from$/i'.BX_UTF_PCRE_MODIFIER, $key, $match)
				&& in_array($match[1], $ufCodesList)
			)
			{
				Filter\Range::prepareFrom($result, $match[1], $value);
			}
			elseif (
				preg_match('/(.*)_to$/i'.BX_UTF_PCRE_MODIFIER, $key, $match)
				&& in_array($match[1], $ufCodesList)
			)
			{
				Filter\Range::prepareTo($result, $match[1], $value);
			}
			elseif (!in_array($key, $ufCodesList))
			{
				continue;
			}
			elseif (
				!empty($ufList[$key])
				&& !empty($ufList[$key]['SHOW_FILTER'])
				&& !empty($ufList[$key]['USER_TYPE_ID'])
				&& $ufList[$key]['USER_TYPE_ID'] == 'string'
				&& $ufList[$key]['SHOW_FILTER'] == 'E'
			)
			{
				$result[$key] = $value.'%';
			}
			else
			{
				$result[$key] = $value;
			}
		}

		if (
			isset($gridFilter['FIND'])
			&& $gridFilter['FIND']
		)
		{
			$matchesPhones = [];
			$phoneParserManager = PhoneNumber\Parser::getInstance();
			preg_match_all('/'.$phoneParserManager->getValidNumberPattern().'/i', $gridFilter['FIND'], $matchesPhones);

			if (
				!empty($matchesPhones)
				&& !empty($matchesPhones[0])
			)
			{
				foreach($matchesPhones[0] as $phone)
				{
					$convertedPhone = PhoneNumber\Parser::getInstance()
						->parse($phone)
						->format(PhoneNumber\Format::E164);
					$gridFilter['FIND'] = str_replace($phone, $convertedPhone, $gridFilter['FIND']);
				}
			}

			$findFilter = \Bitrix\Main\UserUtils::getAdminSearchFilter([
				'FIND' => $gridFilter['FIND']
			]);
			if (!empty($findFilter))
			{
				$result = array_merge($result, $findFilter);
			}
		}

		return $result;
	}

	protected function getSelect(\Bitrix\Main\Grid\Options $gridOptions)
	{
		$result = [ 'ID', 'ACTIVE', 'IS_ONLINE', 'CONFIRM_CODE', 'USER_TYPE' ];
		$gridColumns = $gridOptions->getVisibleColumns();

		if (empty($gridColumns))
		{
			$gridColumns = $this->getDefaultGridHeaders();
		}

		foreach($gridColumns as $column)
		{
			switch($column)
			{
				case 'EMAIL':
					$result[] = 'EMAIL';
					break;
				case 'FULL_NAME':
					$result[] = 'NAME';
					$result[] = 'LAST_NAME';
					$result[] = 'SECOND_NAME';
					$result[] = 'LOGIN';
					break;
				case 'PHOTO':
					$result[] = 'PERSONAL_PHOTO';
					break;
				case 'WWW':
					$result[] = 'PERSONAL_WWW';
					break;
				case 'BIRTHDAY':
					$result[] = 'PERSONAL_BIRTHDAY';
					$result[] = 'PERSONAL_GENDER';
					break;
				case 'GENDER':
					$result[] = 'PERSONAL_GENDER';
					break;
				case 'PHONE_MOBILE':
					$result[] = 'PERSONAL_MOBILE';
					break;
				case 'PHONE':
					$result[] = 'PERSONAL_PHONE';
					break;
				case 'POSITION':
					$result[] = 'WORK_POSITION';
					break;
				case 'COMPANY':
					$result[] = 'WORK_COMPANY';
					break;
				case 'DEPARTMENT':
					$result[] = 'UF_DEPARTMENT';
					break;
				case 'TAGS':
					// don't delete this empty block
					break;
				default:
					$result[] = $column;
			}
		}

		return $result;
	}

	public function onPrepareComponentParams($params)
	{
		$this->errorCollection = new ErrorCollection();

		if (empty($params['PATH_TO_DEPARTMENT']))
		{
			$params['PATH_TO_DEPARTMENT'] = SITE_DIR.'company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#';
		}
		if (empty($params['PATH_TO_USER']))
		{
			$params['PATH_TO_USER'] = Option::get('intranet', 'search_user_url', SITE_DIR.'company/personal/user/#ID#/');
		}

		if (!empty($params['LIST_URL']))
		{
			$oldValue = Option::get('intranet', 'list_user_url', '', SITE_ID);
			if ($params['LIST_URL'] != $oldValue)
			{
				Option::set('intranet', 'list_user_url', $params['LIST_URL'], SITE_ID);
			}
		}

		if (
			!isset($params['EXPORT_MODE'])
			|| $params['EXPORT_MODE'] != 'Y'
		)
		{
			$params['EXPORT_MODE'] = 'N';
		}
		else
		{
			if (
				!isset($params['EXPORT_TYPE'])
				|| !in_array($params['EXPORT_TYPE'], ['excel'])
			)
			{
				$params['EXPORT_TYPE'] = 'excel';
			}
		}

		if (
			!isset($params['USER_PROPERTY_LIST'])
			|| !is_array($params['USER_PROPERTY_LIST'])
		)
		{
			$params['USER_PROPERTY_LIST'] = $this->getUserPropertyList();
		}
		elseif ($params['EXPORT_MODE'] != 'Y')
		{
			$this->setUserPropertyList($params['USER_PROPERTY_LIST']);
		}

		return $params;
	}

	protected function prepareData()
	{
		$result = [];

		$this->initAvailableEntityFields();

		$entityFilter = Filter\Factory::createEntityFilter(
			\Bitrix\Main\UserTable::getUfId(),
			[
				'ID' => $this->filterId,
				'WHITE_LIST' => $this->arParams['USER_PROPERTY_LIST']
			]
		);

		$result['EXTRANET_SITE'] = ($this->extranetSite() ? 'Y' : 'N');
		$result['GRID_ID'] = $this->gridId;
		$result['FILTER_ID'] = $this->filterId;
		$result['FILTER_PRESETS'] = $this->getFilterPresets($entityFilter);

		$gridOptions = new Bitrix\Main\Grid\Options($result['GRID_ID']);
		$filterOptions = new \Bitrix\Main\UI\Filter\Options($result['FILTER_ID'], $result['FILTER_PRESETS']);

		$usedFields = $filterOptions->getUsedFields();
		$usedFields = array_filter(
			$usedFields,
			function ($value)
			{
				return !empty($value);
			}
		);

		if(empty($usedFields))
		{
			$usedFields = $entityFilter->getDefaultFieldIDs();
		}

		$navParams = $gridOptions->getNavParams();
		$pageSize = $navParams['nPageSize'];

		$nav = new \Bitrix\Main\UI\PageNavigation("page");

		if ($this->arParams['EXPORT_MODE'] == 'Y')
		{
			$nav->allowAllRecords(true)->setPageSize(0);
		}
		else
		{
			$nav->allowAllRecords(false)
				->setPageSize($pageSize)
				->initFromUri();
		}

		$result['HEADERS'] = $this->getGridHeaders();
		//TODO: replace to new \Bitrix\Main\Filter\Filter::getFieldArrays after main will be stable
		$result['FILTER'] = $this->getFilterFields($entityFilter, $usedFields);
		$result['ROWS'] = [];

		$gridFilter = $filterOptions->getFilter($result['FILTER']);

		$result['PROCESS_EXTRANET'] = (
			(
				isset($gridFilter['EXTRANET'])
				&& in_array($gridFilter['EXTRANET'], ['Y', 'N'])
			)
			|| !empty($gridFilter['DEPARTMENT'])
			|| in_array($gridFilter['PRESET_ID'], ['company', 'employees'])
				? 'N'
				: 'Y'
		);

		$query = new \Bitrix\Main\Entity\Query(\Bitrix\Intranet\UserTable::getEntity());
		$this->addQueryOrder($query, $gridOptions);
		if (!$this->addQueryFilter($query, $gridFilter))
		{
			return $result;
		}
		$this->addQuerySelect($query, $gridOptions);
		$query->countTotal(true);
		$query->setOffset($nav->getOffset());
		$query->setLimit($nav->getLimit());
		$query->disableDataDoubling();

		$res = $query->exec();
		$users = $res->fetchCollection();

		$gridColumns = $gridOptions->getVisibleColumns();
		if (empty($gridColumns))
		{
			$gridColumns = $this->getDefaultGridHeaders();
		}

		if (in_array('TAGS', $gridColumns))
		{
			$users->fillTags();
		}

		$rowsList = [];

		foreach ($users as $user)
		{
			$row['USER_FIELDS'] = $user;

			$row['CAN_EDIT'] = $row['CAN_DELETE'] = false;

			$rowsList[] = [
				"id" => $user['ID'],
				"data" => $row,
				"columns" => [],
				"editable" => true,
				"actions" => \Bitrix\Intranet\Component\UserList::getActions([
					'USER_FIELDS' => $user,
					'PATH_TO_USER' => $this->arParams['PATH_TO_USER']
				]),
				"columnClasses" => (
					$user['USER_TYPE'] == 'extranet'
						? [
						'FULL_NAME' => 'intranet-user-list-full-name-extranet'
					]
					: []
				)
			];
		}

		$result['ROWS'] = $rowsList;
		$result['ROWS_COUNT'] = $res->getCount();

		$nav->setRecordCount($result['ROWS_COUNT']);
		$result['NAV_OBJECT'] = $nav;

		$result['GRID_COLUMNS'] = $gridColumns;

		return $result;
	}

	public function executeComponent()
	{
		$this->arResult = $this->prepareData();

		if ($this->arParams['EXPORT_MODE'] != 'Y')
		{
			$this->includeComponentTemplate();
		}
		else
		{
			while(ob_get_clean());

			header("HTTP/1.1 200 OK");
			header("Content-Transfer-Encoding: binary");
			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
			header("Expires: 0");
			header("Pragma: public");

			$this->IncludeComponentTemplate($this->arParams['EXPORT_TYPE']);

			die();
		}

	}
}
?>