• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/security/controller/querybuilder/controllerbased.php
  • Класс: Bitrix\Crm\Security\Controller\QueryBuilder\ControllerBased
  • Вызов: ControllerBased::buildObserverSqlCondition
protected function buildObserverSqlCondition(int $userId, array $permissionEntityTypes, $prefix): array
{
	if (empty($permissionEntityTypes))
	{
		return [];
	}

	$categoryIdMap = [];
	$hasCategories = null;
	foreach ($permissionEntityTypes as $permissionEntityType)
	{
		if (!$this->controller->isObservable())
		{
			continue;
		}
		if ($hasCategories !== null && $hasCategories !== $this->controller->hasCategories())
		{
			throw new \Bitrix\Main\NotSupportedException('Several data sources for observers are not supported');
		}
		$hasCategories = $this->controller->hasCategories();

		$entityTypeID = $this->controller->getEntityTypeId();
		if (!isset($categoryIdMap[$entityTypeID]))
		{
			$categoryIdMap[$entityTypeID] = [];
		}
		$categoryIdMap[$entityTypeID][] =
			$hasCategories
				? $this->controller->extractCategoryId($permissionEntityType)
				: 0;
	}

	$sqlConditions = [];

	foreach ($categoryIdMap as $entityTypeID => $categoryIds)
	{
		$categoryIds = array_unique($categoryIds);

		if (!$hasCategories)
		{
			$sqlConditions[] = "({$prefix}P.ENTITY_ID IN (SELECT ENTITY_ID FROM b_crm_observer WHERE ENTITY_TYPE_ID = {$entityTypeID} AND USER_ID = {$userId}))";
		}
		elseif (count($categoryIds) === 1)
		{
			$sqlConditions[] = "({$prefix}P.CATEGORY_ID = {$categoryIds[0]} AND {$prefix}P.ENTITY_ID IN (SELECT ENTITY_ID FROM b_crm_observer WHERE ENTITY_TYPE_ID = {$entityTypeID} AND USER_ID = {$userId}))";
		}
		else
		{
			$slug = implode(",", $categoryIds);
			$sqlConditions[] = "({$prefix}P.CATEGORY_ID IN ({$slug}) AND {$prefix}P.ENTITY_ID IN (SELECT ENTITY_ID FROM b_crm_observer WHERE ENTITY_TYPE_ID = {$entityTypeID} AND USER_ID = {$userId}))";
		}
	}

	return $sqlConditions;
}