• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/kanban.php
  • Класс: Bitrix\Crm\Kanban
  • Вызов: Kanban::getFilter
protected function getFilter(array $params = []): array
{
	static $filter = null;
	$entity = $this->getEntity();

	if(isset($params['FORCE_FILTER']) && $params['FORCE_FILTER'] === 'Y')
	{
		$forceFilter = [];

		if ($entity->canUseAllCategories() && $entity->getCategoryId() === -1)
		{
			$forceFilter = [];
		}

		if ($entity->isCategoriesSupported())
		{
			$forceFilter = [
				'CATEGORY_ID' => $entity->getCategoryId(),
			];
		}

		$this->prepareSemanticIdsAndStages($forceFilter);

		return $forceFilter;
	}

	if($filter !== null)
	{
		return $filter;
	}

	$filter = [];
	$filterLogic = [
		'TITLE',
		'NAME',
		'LAST_NAME',
		'SECOND_NAME',
		'POST',
		'COMMENTS',
		'COMPANY_TITLE',
		'COMPANY_COMMENTS',
		'CONTACT_FULL_NAME',
		'CONTACT_COMMENTS',
	];
	$filterAddress = [
		'ADDRESS', 'ADDRESS_2', 'ADDRESS_PROVINCE', 'ADDRESS_REGION', 'ADDRESS_CITY',
		'ADDRESS_COUNTRY', 'ADDRESS_POSTAL_CODE'
	];
	$filterHistory = ['STAGE_ID_FROM_HISTORY', 'STAGE_ID_FROM_SUPPOSED_HISTORY', 'STAGE_SEMANTIC_ID_FROM_HISTORY'];
	//from main.filter
	$grid = $entity->getFilterOptions();

	$filterId = ($params['FILTER_PRESET_ID'] ?? null);
	if ($filterId)
	{
		$grid->setCurrentFilterPresetId($filterId);
	}
	$gridFilter = $entity->getGridFilter($filterId);
	$search = $grid->GetFilter($gridFilter);
	\Bitrix\Crm\UI\Filter\EntityHandler::internalize($gridFilter, $search);
	if(!isset($search['FILTER_APPLIED']))
	{
		$search = [];
	}
	if(!empty($search))
	{
		foreach($search as $key => $item)
		{
			unset($search[$key]);
			if(in_array(mb_substr($key, 0, 2), array('>=', '<=', '<>')))
			{
				$key = mb_substr($key, 2);
			}
			if(
				in_array(mb_substr($key, 0, 1), array('=', '<', '>', '@', '!'))
				&& !(mb_substr($key, 0, 1) === '!' && $item === false)
			)
			{
				$key = mb_substr($key, 1);
			}
			$search[$key] = $item;
		}
		foreach($gridFilter as $key => $item)
		{
			//fill filter by type
			$fromFieldName = $key . '_from';
			$toFieldName = $key . '_to';
			if(isset($item['type']) && $item['type'] === 'date')
			{
				if(!empty($search[$fromFieldName]))
				{
					$filter['>=' . $key] = $search[$fromFieldName] . ' 00:00:00';
				}
				if(!empty($search[$toFieldName]))
				{
					$filter['<=' . $key] = $search[$toFieldName] . ' 23:59:00';
				}
				if(isset($search[$key]) && $search[$key] === false)
				{
					$filter[$key] = $search[$key];
				}
				elseif(isset($search['!' . $key]) && $search['!' . $key] === false)
				{
					$filter['!' . $key] = $search['!' . $key];
				}
			}
			elseif(isset($item['type']) && $item['type'] === 'number')
			{
				$fltType = $search[$key . '_numsel'] ?? 'exact';
				if(
					($fltType === 'exact' || $fltType === 'range')
					&& isset($search[$fromFieldName], $search[$toFieldName])
				)
				{
					$filter['>=' . $key] = $search[$fromFieldName];
					$filter['<=' . $key] = $search[$toFieldName];
				}
				elseif($fltType === 'exact' && isset($search[$fromFieldName]))
				{
					$filter[$key] = $search[$fromFieldName];
				}
				elseif(
					$fltType === 'more'
					&& isset($search[$fromFieldName])
				)
				{
					$filter['>' . $key] = $search[$fromFieldName];
				}
				elseif(
					$fltType === 'less' &&
					isset($search[$toFieldName])
				)
				{
					$filter['<' . $key] = $search[$toFieldName];
				}
				elseif((isset($search[$key]) && $search[$key] === false))
				{
					$filter[$key] = $search[$key];
				}
				elseif((isset($search['!' . $key]) && $search['!' . $key] === false))
				{
					$filter['!' . $key] = $search['!' . $key];
				}
			}
			elseif(isset($search[$key]))
			{
				if((isset($search[$key]) && $search[$key] === false))
				{
					$filter[$key] = $search[$key];
				}
				elseif((isset($search['!' . $key]) && $search['!' . $key] === false))
				{
					$filter['!' . $key] = $search['!' . $key];
				}
				elseif(in_array($key, $filterLogic, true))
				{
					$filter['?' . $key] = $search[$key];
				}
				elseif(in_array($key, $filterAddress, true))
				{
					$filter['=%' . $key] = $search[$key] . '%';
				}
				elseif(in_array($key, $filterHistory, true))
				{
					$filter['%' . $key] = $search[$key];
				}
				elseif($key === 'STATUS_CONVERTED')
				{
					$filter[$key === 'N' ? 'STATUS_SEMANTIC_ID' : '!STATUS_SEMANTIC_ID'] = 'P';
				}
				elseif ($key === 'ORDER_TOPIC' ||
					(
						$entity instanceof \Bitrix\Crm\Kanban\Entity\Order
						&& $key === 'ACCOUNT_NUMBER'
					)
				)
				{
					$filter['~' . $key] = '%' . $search[$key] . '%';
				}
				elseif(
					$key === 'ENTITIES_LINKS'
					&& $entity->isEntitiesLinksInFilterSupported()
				)
				{
					$ownerData = explode('_', $search[$key]);
					if(count($ownerData) > 1)
					{
						$ownerTypeName = \CCrmOwnerType::resolveName(
							\CCrmOwnerType::resolveID($ownerData[0])
						);
						$ownerID = (int)$ownerData[1];
						if(!empty($ownerTypeName) && $ownerID > 0)
						{
							$filter[$entity->getFilterFieldNameByEntityTypeName($ownerTypeName)] = $ownerID;
						}
					}
				}
				elseif(ParentFieldManager::isParentFieldName($key))
				{
					$filter[$key] = ParentFieldManager::transformEncodedFilterValueIntoInteger(
						$key,
						$search[$key]
					);
				}
				else
				{
					$filter[$entity->prepareFilterField($key)] = $search[$key];
				}
			}
			elseif(isset($search['!' . $key]) && $search['!' . $key] === false)
			{
				$filter['!' . $key] = $search['!' . $key];
			}
			elseif(isset($item['alias'], $search[$item['alias']]))
			{
				$filter['=' . $key] = $search[$item['alias']];
			}
		}
		//search index
		$find = $search['FIND'] ? trim($search['FIND']) : null;
		if(!empty($find))
		{
			$search['FIND'] = $find;
			$filter['SEARCH_CONTENT'] = $search['FIND'];
		}
	}
	if(isset($filter['COMMUNICATION_TYPE']))
	{
		if(!is_array($filter['COMMUNICATION_TYPE']))
		{
			$filter['COMMUNICATION_TYPE'] = [$filter['COMMUNICATION_TYPE']];
		}
		if(in_array(\CCrmFieldMulti::PHONE, $filter['COMMUNICATION_TYPE']))
		{
			$filter['HAS_PHONE'] = 'Y';
		}
		if(in_array(\CCrmFieldMulti::EMAIL, $filter['COMMUNICATION_TYPE']))
		{
			$filter['HAS_EMAIL'] = 'Y';
		}
		unset($filter['COMMUNICATION_TYPE']);
	}
	//overdue
	if(
		isset($filter['OVERDUE'])
		&& ($entity->isOverdueFilterSupported())
	)
	{
		$key = $entity->getCloseDateFieldName();
		$date = new \Bitrix\Main\Type\Date;
		if($filter['OVERDUE'] === 'Y')
		{
			$filter['<' . $key] = $date;
			$filter['>' . $key] = \Bitrix\Main\Type\Date::createFromTimestamp(0);
		}
		else
		{
			$filter['>=' . $key] = $date;
		}
	}

	if ($this->viewMode === ViewMode::MODE_ACTIVITIES)
	{
		// The responsible field for activity view should not be altered at this time. It must be preserved for later use.
		$fieldToSkip = !CounterSettings::getInstance()->useActivityResponsible()
			? 'ACTIVITY_RESPONSIBLE_IDS'
			: 'ASSIGNED_BY_ID';
		$userFieldsToTransform = [$fieldToSkip];
	}
	else
	{
		$userFieldsToTransform = ['ASSIGNED_BY_ID', 'ACTIVITY_RESPONSIBLE_IDS'];
	}

	/** @var UserBasedField $userFieldPrepare */
	$userFieldPrepare = ServiceLocator::getInstance()->get('crm.filter.fieldsTransform.userBasedField');
	$userFieldPrepare->transformAll($filter, $userFieldsToTransform, $this->currentUserId);

	$entity->applySubQueryBasedFilters($filter, $this->viewMode);


	$filter = Deal\OrderFilter::prepareFilter($filter);
	$filter = \Bitrix\Crm\Automation\Debugger\DebuggerFilter::prepareFilter($filter, $entity->getTypeId());

	if(
		($entity->isCategoriesSupported() && !$entity->canUseAllCategories())
		|| ($entity->canUseAllCategories() && $entity->getCategoryId() > -1)
	)
	{
		$filter['CATEGORY_ID'] = $this->entity->getCategoryId();
	}
	//invoice
	if($entity->isRecurringSupported())
	{
		$filter['=IS_RECURRING'] = 'N';
	}
	if(isset($filter['OVERDUE']))
	{
		unset($filter['OVERDUE']);
	}
	//detect success/fail columns
	$this->prepareSemanticIdsAndStages($filter);

	$entityTypeId = $entity->getTypeId();
	//region Apply Search Restrictions
	$searchRestriction = RestrictionManager::getSearchLimitRestriction();
	if(!$searchRestriction->isExceeded($entityTypeId))
	{
		$searchRestriction->notifyIfLimitAlmostExceed($entityTypeId);

		SearchEnvironment::convertEntityFilterValues(
			$entityTypeId,
			$filter
		);
	}
	//endregion

	CCrmEntityHelper::prepareMultiFieldFilter($filter, [], '=%', false);

	return $filter;
}