• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integrity/actualranking.php
  • Класс: Bitrix\Crm\Integrity\ActualRanking
  • Вызов: ActualRanking::rankByQuery
protected function rankByQuery(ORM\Query\Query $query, $limit = null)
{
	switch ($this->entityTypeId)
	{
		case \CCrmOwnerType::Contact:
			$fieldName = 'BINDING_CONTACT_ID';
			$filterFieldName = 'BINDING_CONTACT.CONTACT_ID';
			break;
		case \CCrmOwnerType::Company:
			$fieldName = $filterFieldName = 'COMPANY_ID';
			break;
		default:
			return null;
	}

	$rankingEntitiesQuery = clone $query;

	$queryId = null;
	$rankedList = array();
	$query->setSelect(array($fieldName => $filterFieldName, 'MAX_ID'));
	$query->whereIn($filterFieldName, $this->list);
	$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_ID', 'MAX(%s)', 'ID'));
	if ($limit !== 1)
	{
		$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_DATE_MODIFY', 'MAX(%s)', 'DATE_MODIFY'));
		$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_DATE_CREATE', 'MAX(%s)', 'DATE_CREATE'));
		$query->setOrder(array(
			'MAX_DATE_MODIFY' => 'DESC',
			'MAX_DATE_CREATE' => 'DESC',
			'MAX_ID' => 'DESC',
		));
	}
	else
	{
		$query->setOrder(array(
			'MAX_ID' => 'DESC',
		));
	}

	if ($limit)
	{
		$query->setLimit($limit);
	}

	$listDb = $query->exec();
	while ($item = $listDb->fetch())
	{
		$rankedList[] = $item[$fieldName];
		if (!$queryId)
		{
			$queryId = $item['MAX_ID'];
		}
	}

	$isRanked = $queryId > 0;
	if (!$isRanked)
	{
		return [];
	}

	// set entity id
	if (!$this->entityId)
	{
		$this->entityId = $rankedList[0];
	}

	$queryId = [$queryId];
	if (!$limit && $this->entityId && !empty($queryId))
	{
		// find only if its not from ::setEntity

		$rankingEntitiesResult = $rankingEntitiesQuery
			->setSelect(['ID'])
			->where($filterFieldName, $this->entityId)
			->setOrder([
				'DATE_MODIFY' => 'DESC',
				'DATE_CREATE' => 'DESC',
				'ID' => 'DESC',
			])
			->exec()
			->fetchAll();
		if (count($rankingEntitiesResult) > 0)
		{
			$queryId = array_column($rankingEntitiesResult, 'ID');
		}
	}

	if ($limit)
	{
		return $queryId;
	}

	$this->updateListByRankedList($rankedList);
	return $queryId;
}