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;
}