• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/integration/crm/connectors/client.php
  • Класс: Bitrix\Sender\Integration\Crm\Connectors\Client
  • Вызов: Client::addCrmEntityReferences
protected function addCrmEntityReferences(Entity\Query $query)
{
	$docTypes = array();
	$docType = $this->getFieldValue('DOC_TYPE');
	if ($docType)
	{
		$docTypes[] = $docType;
	}
	else
	{
		foreach (array_keys(self::getCrmDocumentTypes()) as $entityTypeName)
		{
			$filter = $this->getCrmReferencedEntityFilter($entityTypeName);
			if (count($filter) === 0)
			{
				continue;
			}

			$docTypes[] = $entityTypeName;
		}
	}

	foreach ($docTypes as $docType)
	{
		$refClassName = "\\Bitrix\\Crm\\" . ucfirst(mb_strtolower($docType)) . "Table";
		if (!class_exists($refClassName))
		{
			continue;
		}

		if ($query->getEntity()->getName() === 'Contact')
		{
			$ref = array('=this.ID' => 'ref.CONTACT_ID');
		}
		elseif ($query->getEntity()->getName() === 'Company')
		{
			$ref = array('=this.ID' => 'ref.COMPANY_ID');
		}
		else
		{
			continue;
		}

		$runtimeFieldName = "SGT_$docType";
		$filter = $this->getCrmReferencedEntityFilter($docType);
		$joinType = $filter[$docType]['JOIN_TYPE']??'INNER';
		unset($filter[$docType]['JOIN_TYPE']);

		$query->registerRuntimeField(null, new Entity\ReferenceField(
			$runtimeFieldName,
			$refClassName,
			$ref,
			array('join_type' => $joinType)
		));

		foreach ($filter as $key => $value)
		{
			$pattern = "/^[\W]{0,2}$docType\./";
			if (preg_match($pattern, $key))
			{
				$key = str_replace("$docType.", "$runtimeFieldName.", $key);
			}

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

		$runtime = Helper::getRuntimeByEntity($docType);
		foreach ($runtime as $item)
		{
			$item = new Entity\ExpressionField(
				$item['name'],
				str_replace("$docType.", "$runtimeFieldName.", $item['expression']),
				array_map(
					function ($from) use ($docType, $runtimeFieldName)
					{
						return str_replace("$docType.", "$runtimeFieldName.", $from);
					},
					$item['buildFrom']
				)
			);
			$query->registerRuntimeField($item);
		}
	}

	$entityTypeName = mb_strtoupper($query->getEntity()->getName());
	$runtime = Helper::getRuntimeByEntity($entityTypeName);
	foreach ($runtime as $item)
	{
		$item = new Entity\ExpressionField(
			$item['name'],
			$item['expression'],
			array_map(
				function ($from) use ($entityTypeName)
				{
					return str_replace("$entityTypeName.", "", $from);
				},
				$item['buildFrom']
			)
		);
		$query->registerRuntimeField($item);
	}

	$filterFields = $query->getFilter();
	if (array_key_exists('NO_PURCHASES', $filterFields))
	{
		$noPurchasesFilter = $filterFields['NO_PURCHASES'];
		$productSource = $filterFields['PRODUCT_SOURCE'];

		unset($filterFields['NO_PURCHASES']);
		$query->setFilter($filterFields);

		$this->addNoPurchasesFilter($query, $noPurchasesFilter, $productSource);
	}
	if (array_key_exists('DEAL', $filterFields))
	{
		$query->where(\Bitrix\Main\Entity\Query::filter()
			->logic('or')
			->where($filterFields['DEAL'])
		);
		unset($filterFields['DEAL']);
		$query->setFilter($filterFields);
	}
}