• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/widget/data/dealactivitystatistics.php
  • Класс: Bitrix\Crm\Widget\Data\DealActivityStatistics
  • Вызов: DealActivityStatistics::prepareEntityListFilter
public function prepareEntityListFilter(array $filterParams)
{
	$filter = self::internalizeFilter($filterParams);
	$query = new Query(DealActivityStatisticsTable::getEntity());
	$query->addSelect('OWNER_ID');
	$query->addGroup('OWNER_ID');

	$period = $filter->getPeriod();
	$periodStartDate = $period['START'];
	$periodEndDate = $period['END'];

	$query->addFilter('>=DEADLINE_DATE', $periodStartDate);
	$query->addFilter('<=DEADLINE_DATE', $periodEndDate);

	$responsibleIDs = $filter->getResponsibleIDs();
	if(!empty($responsibleIDs))
	{
		$query->addFilter('@RESPONSIBLE_ID', $responsibleIDs);
	}

	$semanticID = $filter->getExtraParam('semanticID', PhaseSemantics::UNDEFINED);
	if($semanticID !== PhaseSemantics::UNDEFINED)
	{
		$query->addFilter('=STAGE_SEMANTIC_ID', $semanticID);
	}

	$categoryID = (int)$filter->getExtraParam('dealCategoryID', -1);
	if($categoryID >= 0)
	{
		//HACK: use SqlExpression to avoid filter sql like (CATEGORY_ID IS NULL OR CATEGORY_ID = 0), that cause the filesort.
		$query->addFilter('=CATEGORY_ID', new Main\DB\SqlExpression('?i', $categoryID));
	}

	$field = isset($filterParams['FIELD']) ? $filterParams['FIELD'] : '';
	if($field === 'CALL_QTY' || $field === 'MEETING_QTY' || $field === 'EMAIL_QTY')
	{
		$query->addFilter(">{$field}", 0);
	}
	elseif($field === 'TOTAL')
	{
		$query->registerRuntimeField(null, new ExpressionField('TOTAL', '(%s + %s + %s)', array('CALL_QTY', 'MEETING_QTY', 'EMAIL_QTY')));
		$query->addFilter('>TOTAL', 0);
	}
	
	return array(
		'__JOINS' => array(
			array(
				'TYPE' => 'INNER',
				'SQL' => 'INNER JOIN('.$query->getQuery().') DS ON DS.OWNER_ID = L.ID'
			)
		)
	);
}