• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/tracking/analytics/provider/base.php
  • Класс: Bitrix\Crm\Tracking\Analytics\Provider\Base
  • Вызов: Base::prepareQuery
private function prepareQuery(Orm\Query\Query $query, $entityTypeId, array $options = [])
{
	$mainSelect = [];
	$query->setSelect(array_merge(
		[
			'ACCOUNT_CURRENCY_ID', 'OPPORTUNITY_ACCOUNT'
		],
		$query->getSelect()
	));

	if ($this->isGroupedByAssigned())
	{
		$query->addSelect(self::Assigned);
		$mainSelect[] = self::Assigned;
	}
	if ($this->isGroupedByTrackingSource())
	{
		$query->addSelect(
			new Orm\Fields\ExpressionField(self::TrackingSourceId, 'IFNULL(%s, 0)', ['TRACE_ENTITY.TRACE.SOURCE_ID'])
		);
		$mainSelect[] = self::TrackingSourceId;
	}
	else
	{
		$query->addFilter('>TRACE_ENTITY.TRACE.SOURCE_ID', 0);
		$query->registerRuntimeField(new Orm\Fields\ExpressionField(
			self::TrackingSourceId, '\'summary\''
		));
		$query->addSelect(self::TrackingSourceId);
		$mainSelect[] = self::TrackingSourceId;
	}

	$query->registerRuntimeField(new Orm\Fields\Relations\Reference(
		'TRACE_ENTITY',
		Tracking\Internals\TraceEntityTable::class,
		[
			'=ref.ENTITY_TYPE_ID' => new SqlExpression('?', $entityTypeId),
			'=this.ID' => 'ref.ENTITY_ID'
		]
	));
	foreach ($this->filter as $key => $value)
	{
		$newKey = str_replace(
			[
				self::TrackingSourceId,
				'DATE_CREATE',
				'ASSIGNED_BY_ID',
			],
			[
				'TRACE_ENTITY.TRACE.SOURCE_ID',
				$options['dateFieldName'] ?? 'DATE_CREATE',
				$options['assignedByFieldName'] ?? 'ASSIGNED_BY_ID',
			],
			$key
		);
		unset($this->filter[$key]);
		$this->filter[$newKey] = $value;
	}

	$query->setFilter($query->getFilter() + $this->filter);


	$query->addGroup('ID');
	$mainQuery = (new Orm\Query\Query($query));
	$mainQuery->registerRuntimeField(new Orm\Fields\ExpressionField(
		'CNT', 'COUNT(*)'
	));
	$mainQuery->registerRuntimeField(new Orm\Fields\ExpressionField(
		'SUM', 'SUM(%s)', ['OPPORTUNITY_ACCOUNT']
	));

	$mainQuery->setSelect(array_merge(
		$mainSelect,
		[
			'CNT',
			'SUM',
			'ACCOUNT_CURRENCY_ID'
		]
	));

	return $mainQuery;
}