• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integration/report/handler/order/basegrid.php
  • Класс: Bitrix\Crm\Integration\Report\Handler\Order\BaseGrid
  • Вызов: BaseGrid::formatQueryFilter
private function formatQueryFilter(array $filter, array $runtime)
{
	$result = array();
	$orderFields = array_flip(\Bitrix\Crm\Order\Order::getAllFields());

	$searchRestriction = \Bitrix\Crm\Restriction\RestrictionManager::getSearchLimitRestriction();
	if(!$searchRestriction->isExceeded(\CCrmOwnerType::Order))
	{
		\Bitrix\Crm\Search\SearchEnvironment::convertEntityFilterValues(\CCrmOwnerType::Order, $filter);
		if(isset($filter['SEARCH_CONTENT']))
		{
			$searchValue = $filter['SEARCH_CONTENT'];
			unset($filter['SEARCH_CONTENT']);
			if(is_string($searchValue))
			{
				$find = trim($searchValue);
				if($find !== '')
				{
					$preparedFindFilter = \Bitrix\Crm\Search\SearchEnvironment::prepareEntityFilter(
						\CCrmOwnerType::Order,
						array(
							'SEARCH_CONTENT' => \Bitrix\Crm\Search\SearchEnvironment::prepareSearchContent($find)
						)
					);
					$filter = array_merge($filter, $preparedFindFilter);
				}
			}
		}
	}

	$isFilteredByClient = false;
	$propertyItterator = 0;
	foreach($filter as $k => $v)
	{
		$k = str_replace(self::FILTER_FIELDS_PREFIX, '', $k);
		$name = preg_replace('/^\W+/', '', $k);

		if ($name === 'COMPANY_ID')
		{
			$result[] = [
				'CLIENT.ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
				'CLIENT.ENTITY_ID' => $v,
			];
			$isFilteredByClient = true;
		}
		elseif ($name === 'ASSOCIATED_CONTACT_ID')
		{
			$result[] = [
				'CLIENT.ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
				'CLIENT.ENTITY_ID' => $v,
			];
			$isFilteredByClient = true;
		}
		elseif ($name === 'SOURCE_ID')
		{
			$result['TRADING_PLATFORM.TRADING_PLATFORM_ID'] = $v;
		}
		elseif ($name === 'PAY_SYSTEM')
		{
			$result['PAYMENT.PAY_SYSTEM_ID'] = $v;
		}
		elseif ($name === 'DELIVERY_SERVICE')
		{
			$result['SHIPMENT.DELIVERY_ID'] = $v;
			$result['SHIPMENT.SYSTEM'] = 'N';
		}
		elseif($name === 'ASSOCIATED_DEAL_ID')
		{
			$result['=ORDER_BINDING.OWNER_ID'] = $v;
			$result['=ORDER_BINDING.OWNER_TYPE_ID'] = \CCrmOwnerType::Deal;

			$runtime[] = new Reference('ORDER_BINDING',
				\Bitrix\Crm\Binding\OrderEntityTable::getEntity(),
				['=ref.ORDER_ID' => 'this.ID',],
				['join_type' => 'LEFT',]
			);
		}
		elseif($name === 'COUPON')
		{
			$result['=ORDER_COUPONS.COUPON'] = $v;
		}
		elseif($name === 'XML_ID')
		{
			$result['%XML_ID'] = $v;
		}
		elseif($name === 'SHIPMENT_TRACKING_NUMBER')
		{
			$result['%SHIPMENT.TRACKING_NUMBER'] = $v;
		}
		elseif($name === 'SHIPMENT_DELIVERY_DOC_DATE')
		{
			$docDateName = str_replace('SHIPMENT_DELIVERY_DOC_DATE', 'SHIPMENT.DELIVERY_DOC_DATE', $k);
			$result[$docDateName] = $v;
		}
		elseif($name === 'TIME_PERIOD')
		{
			$timePeriodName = str_replace('TIME_PERIOD', 'DATE_INSERT', $k);
			$result[$timePeriodName] = $v;
		}
		elseif ($name === 'USER')
		{
			$buyerFilter = \Bitrix\Main\UserUtils::getAdminSearchFilter([
				'FIND' => $v
			]);
			foreach ($buyerFilter as $key => $userFilterItem)
			{
				$key = str_replace('INDEX', 'USER.INDEX', $key);
				$result[$key] = $userFilterItem;
			}
		}
		if (mb_strpos($name, 'PROPERTY_') === 0)
		{
			$propertyId = (int)str_replace('PROPERTY_', '', $name);
			if ("PROPERTY_{$propertyId}" !== $name)
			{
				continue;
			}
			$propertyTableName = "PROPERTY_{$propertyItterator}";

			$propertyValueCode = str_replace($name, "{$propertyTableName}.VALUE", $k);
			$runtime[] =
				new Reference($propertyTableName,
					OrderPropsValueTable::getEntity(),
					array(
						'=ref.ORDER_ID' => 'this.ID',
					),
					array('join_type' => 'inner')
				);

			$result[] = [
				"={$propertyTableName}.ORDER_PROPS_ID" => $propertyId,
				$propertyValueCode => $v
			];

			$propertyItterator++;
		}
		elseif (isset($orderFields[$name]) || mb_strpos($name, 'UF_') === 0)
		{
			$result[$k] = $v;
		}
	}

	if ($isFilteredByClient)
	{
		$runtime[] =
			new Reference('CLIENT',
				OrderContactCompanyTable::getEntity(),
				array(
					'=ref.ORDER_ID' => 'this.ID',
				),
				array('join_type' => 'LEFT')
			);
	}

	if(isset($filter['ACTIVITY_COUNTER']))
	{
		$this->addActivityCounterFilter($filter, $result, $runtime);
	}

	return $result;
}