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