• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/integration/crm/connectors/querycount.php
  • Класс: Bitrix\Sender\Integration\Crm\Connectors\QueryCount
  • Вызов: QueryCount::prepare
static function prepare(Entity\Query $query, $dataTypeId = null, $entityDbName = null, $entityName = null)
{
	$fields = array();
	foreach (self::getTypes() as $typeId => $field)
	{
		if ($dataTypeId && $dataTypeId != $typeId)
		{
			continue;
		}

		$entityName = $entityName ?? mb_strtoupper($query->getEntity()->getName());
		$entityDbName = $entityDbName ?? "crm_".mb_strtolower($query->getEntity()->getName());

		$useEmptyValue = false;
		if (mb_strpos($field['DATA_COLUMN'], '.') > 0)
		{
			$dataColumn = explode('.', $field['DATA_COLUMN']);
			$refFieldName = array_shift($dataColumn);
			if (!array_key_exists($refFieldName, $query->getRuntimeChains()))
			{
				$useEmptyValue = true;
			}
		}
		if (!empty($field['ENTITIES']) && !in_array($entityName, $field['ENTITIES']))
		{
			$useEmptyValue = true;
		}

		$fieldName = $field['COLUMN_ALIAS'] ?? 'COUNT_' . $field['DATA_COLUMN'];
		$fields[] = $fieldName;

		if (isset($field['HAS']))
		{
			$query->registerRuntimeField(new Entity\ExpressionField(
				$fieldName,
				"COUNT(DISTINCT CASE WHEN %s = 'Y' THEN `{$entityDbName}`.`ID` END)",
				$field['HAS']
			));
		}
		elseif ($useEmptyValue)
		{
			$query->registerRuntimeField(new Entity\ExpressionField(
				$fieldName,
				"0"
			));
		}
		else
		{
			if ($typeId === Recipient\Type::CRM_COMPANY_ID && in_array($entityName, ['CONTACT']))
			{
				$field['DATA_COLUMN'] = 'CRM_COMPANY_ID';
			}

			$query->registerRuntimeField(new Entity\ExpressionField(
				$fieldName,
				"COUNT(DISTINCT CASE WHEN %s > 0 THEN `{$entityDbName}`.`ID` END)",
				$field['DATA_COLUMN']
			));
		}
	}
	$query->setSelect($fields);

	return $query;
}