- Модуль: 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;
}