• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/widget/data/leadsumstatistics.php
  • Класс: Bitrix\Crm\Widget\Data\LeadSumStatistics
  • Вызов: LeadSumStatistics::getList
public function getList(array $params)
{
	/** @var Filter $filter */
	$filter = isset($params['filter']) ? $params['filter'] : null;
	if(!($filter instanceof Filter))
	{
		throw new Main\ObjectNotFoundException("The 'filter' is not found in params.");
	}

	$semanticID = $filter->getExtraParam('semanticID', PhaseSemantics::UNDEFINED);
	$isJunk = $filter->getExtraParam('isJunk', null);

	$group = isset($params['group'])? mb_strtoupper($params['group']) : '';
	if($group !== ''
		&& $group !== self::GROUP_BY_USER
		&& $group !== self::GROUP_BY_DATE
		&& $group !== self::GROUP_BY_SOURCE)
	{
		$group = '';
	}
	$enableGroupKey = isset($params['enableGroupKey']) ? (bool)$params['enableGroupKey'] : false;

	/** @var array $select */
	$select = isset($params['select']) && is_array($params['select']) ? $params['select'] : array();
	$name = '';
	$aggregate = '';
	if(!empty($select))
	{
		$selectItem = $select[0];
		if(isset($selectItem['name']))
		{
			$name = $selectItem['name'];
		}
		if(isset($selectItem['aggregate']))
		{
			$aggregate = mb_strtoupper($selectItem['aggregate']);
		}
	}

	if($name === '')
	{
		$name = 'SUM_TOTAL';
	}

	if($aggregate !== '' && !in_array($aggregate, array('SUM', 'COUNT', 'MAX', 'MIN')))
	{
		$aggregate = '';
	}

	$permissionSql = '';
	if($this->enablePermissionCheck)
	{
		$permissionSql = $this->preparePermissionSql();
		if($permissionSql === false)
		{
			//Access denied;
			return array();
		}
	}

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

	$query = new Query(LeadSumStatisticsTable::getEntity());

	$nameAlias = $name;
	if($aggregate !== '')
	{
		if($aggregate === 'COUNT')
		{
			$query->registerRuntimeField('', new ExpressionField($nameAlias, "COUNT(*)"));
		}
		else
		{
			$nameAlias = "{$nameAlias}_R";
			$query->registerRuntimeField('', new ExpressionField($nameAlias, "{$aggregate}(%s)", $name));
		}
	}

	$query->addSelect($nameAlias);
	$query->setTableAliasPostfix('_s2');

	$subQuery = new Query(LeadSumStatisticsTable::getEntity());
	$subQuery->setTableAliasPostfix('_s1');
	$subQuery->addSelect('OWNER_ID');

	$subQuery->addFilter('>=CREATED_DATE', $periodStartDate);
	$subQuery->addFilter('<=CREATED_DATE', $periodEndDate);

	if($semanticID !== PhaseSemantics::UNDEFINED)
	{
		$subQuery->addFilter('=STATUS_SEMANTIC_ID', $semanticID);
	}

	if(is_bool($isJunk))
	{
		$subQuery->addFilter('=IS_JUNK', $isJunk);
	}

	if($this->enablePermissionCheck && is_string($permissionSql) && $permissionSql !== '')
	{
		$subQuery->addFilter('@OWNER_ID', new SqlExpression($permissionSql));
	}

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

	$subQuery->addGroup('OWNER_ID');

	$subQuery->addSelect('MAX_CREATED_DATE');
	$subQuery->registerRuntimeField('', new ExpressionField('MAX_CREATED_DATE', 'MAX(%s)', 'CREATED_DATE'));

	$query->registerRuntimeField('',
		new ReferenceField('M',
			Base::getInstanceByQuery($subQuery),
			array('=this.OWNER_ID' => 'ref.OWNER_ID', '=this.CREATED_DATE' => 'ref.MAX_CREATED_DATE'),
			array('join_type' => 'INNER')
		)
	);

	$sort = isset($params['sort']) && is_array($params['sort']) && !empty($params['sort']) ? $params['sort'] : null;
	if($sort)
	{
		foreach($sort as $sortItem)
		{
			if(isset($sortItem['name']))
			{
				$sortName = $sortItem['name'];
				if($sortName === $name)
				{
					$sortName = $nameAlias;
				}
				$query->addOrder($sortName, isset($sortItem['order']) ? $sortItem['order'] : 'ASC');
			}
		}
	}

	if($group !== '')
	{
		if($group === self::GROUP_BY_USER)
		{
			$query->addSelect('RESPONSIBLE_ID');
			$query->addGroup('RESPONSIBLE_ID');
		}
		elseif($group === self::GROUP_BY_DATE)
		{
			$query->addSelect('CREATED_DATE');
			$query->addGroup('CREATED_DATE');
			if(!$sort)
			{
				$query->addOrder('CREATED_DATE', 'ASC');
			}
		}
		elseif($group === self::GROUP_BY_SOURCE)
		{
			$query->addSelect('SOURCE_ID');
			$query->addGroup('SOURCE_ID');
		}
	}

	$dbResult = $query->exec();
	$result = array();
	$useAlias = $nameAlias !== $name;
	if($group === self::GROUP_BY_DATE)
	{
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}

			$ary['DATE'] = $ary['CREATED_DATE']->format('Y-m-d');
			unset($ary['CREATED_DATE']);

			if($ary['DATE'] === '9999-12-31')
			{
				//Skip empty dates
				continue;
			}

			if($enableGroupKey)
			{
				$result[$ary['DATE']] = $ary;
			}
			else
			{
				$result[] = $ary;
			}
		}
	}
	elseif($group === self::GROUP_BY_USER)
	{
		$rawResult = array();
		$userIDs = array();
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}

			$userID = $ary['RESPONSIBLE_ID'] = (int)$ary['RESPONSIBLE_ID'];
			if($userID > 0 && !isset($userIDs[$userID]))
			{
				$userIDs[$userID] = true;
			}
			$rawResult[] = $ary;
		}
		$userNames = self::prepareUserNames(array_keys($userIDs));
		if($enableGroupKey)
		{
			foreach($rawResult as $item)
			{
				$userID = $item['RESPONSIBLE_ID'];
				$item['USER_ID'] = $userID;
				$item['USER'] = isset($userNames[$userID]) ? $userNames[$userID] : "[{$userID}]";
				unset($item['RESPONSIBLE_ID']);

				$result[$userID] = $item;
			}
		}
		else
		{
			foreach($rawResult as $item)
			{
				$userID = $item['RESPONSIBLE_ID'];
				$item['USER_ID'] = $userID;
				$item['USER'] = isset($userNames[$userID]) ? $userNames[$userID] : "[{$userID}]";
				unset($item['RESPONSIBLE_ID']);

				$result[] = $item;
			}
		}
	}
	elseif($group === self::GROUP_BY_SOURCE)
	{
		self::includeModuleFile();
		$sourceList = \CCrmStatus::GetStatusList('SOURCE');
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}

			$sourceID = isset($ary['SOURCE_ID']) ? $ary['SOURCE_ID'] : '';
			if($sourceID === '')
			{
				$ary['SOURCE'] = GetMessage('CRM_LEAD_SUM_STAT_NO_SOURCE');
			}
			else
			{
				$ary['SOURCE'] = isset($sourceList[$sourceID]) ? $sourceList[$sourceID] : "[{$sourceID}]";
			}

			if($enableGroupKey)
			{
				$result[$sourceID] = $ary;
			}
			else
			{
				$result[] = $ary;
			}
		}
	}
	else
	{
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}
			$result[] = $ary;
		}
	}
	return $result;
}