• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/widget/data/activity/statusstatistics.php
  • Класс: Bitrix\Crm\Widget\Data\Activity\StatusStatistics
  • Вызов: StatusStatistics::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.");
	}

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

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

	list($providerId, $providerTypeId) = $this->getActivityProviderInfo();

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

	$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(ActivityStatisticsTable::getEntity());

	switch ($name)
	{
		case 'UNANSWERED_QTY':
			$query->addFilter('=STATUS_ID', StatisticsStatus::Unanswered);
			break;
		case 'ANSWERED_QTY':
			$query->addFilter('=STATUS_ID', StatisticsStatus::Answered);
			break;
		default:
			$query->addFilter('>STATUS_ID', StatisticsStatus::Undefined);
	}

	$nameAlias = 'CNT';
	$query->registerRuntimeField('', new ExpressionField($nameAlias, "COUNT(*)"));
	$query->addSelect($nameAlias);

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

	if ($providerId)
		$query->addFilter('=PROVIDER_ID', $providerId);
	if ($providerTypeId)
		$query->addFilter('=PROVIDER_TYPE_ID', $providerTypeId);

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

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

	if($group !== '')
	{
		if($group === self::GROUP_BY_USER)
		{
			$query->addSelect('RESPONSIBLE_ID');
			$query->addGroup('RESPONSIBLE_ID');
		}
		elseif($group === self::GROUP_BY_STATUS)
		{
			$query->addSelect('STATUS_ID');
			$query->addGroup('STATUS_ID');
		}
		else //if($groupBy === self::GROUP_BY_DATE)
		{
			$query->addSelect('DEADLINE_DATE');
			$query->addGroup('DEADLINE_DATE');
			$query->addOrder('DEADLINE_DATE', 'ASC');
		}
	}

	$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'] = $this->getLocalDate($ary['DEADLINE_DATE'], 'Y-m-d');
			unset($ary['DEADLINE_DATE']);

			if($ary['DATE'] === '9999-12-31')
			{
				//Skip empty dates
				continue;
			}
			$result[] = $ary;
		}
	}
	elseif($group === self::GROUP_BY_STATUS)
	{
		$statuses = StatisticsStatus::getDescriptions();
		
		while($ary = $dbResult->fetch())
		{
			$resultAry = array(
				'STATUS' => isset($statuses[$ary['STATUS_ID']]) ? $statuses[$ary['STATUS_ID']] : '-',
				$name => (int)$ary['CNT']
			);

			if($enableGroupKey)
			{
				$result[(int)$ary['STATUS_ID']] = $resultAry;
			}
			else
			{
				$result[] = $resultAry;
			}
		}
	}
	elseif($group === self::GROUP_BY_USER)
	{
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}
			$result[] = $ary;
		}
		self::parseUserInfo($result, ['RESPONSIBLE_ID' => 'USER']);
	}
	else
	{
		while($ary = $dbResult->fetch())
		{
			if($useAlias && isset($ary[$nameAlias]))
			{
				$ary[$name] = $ary[$nameAlias];
				unset($ary[$nameAlias]);
			}

			$result[] = $ary;
		}
	}

	return $result;
}