• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integrity/actualranking.php
  • Класс: Bitrix\Crm\Integrity\ActualRanking
  • Вызов: ActualRanking::rankByDynamics
protected function rankByDynamics($findDynamicsOnly = false)
{
	if (!$this->dynamicTypeId)
	{
		return;
	}

	if (!\CCrmOwnerType::isUseDynamicTypeBasedApproach($this->dynamicTypeId))
	{
		return;
	}

	$factory = Crm\Service\Container::getInstance()->getFactory($this->dynamicTypeId);
	if (!$factory)
	{
		return;
	}


	$query = $factory->getDataClass()::query();
	switch ($this->entityTypeId)
	{
		case \CCrmOwnerType::Contact:
			$fieldName = 'CONTACT_ID';
			break;
		case \CCrmOwnerType::Company:
			$fieldName = 'COMPANY_ID';
			break;
		default:
			return;
	}
	$query
		->setSelect(['ID', $fieldName])
		->addFilter("=$fieldName", $this->entityId ?: $this->list)
		->addFilter('!=STAGE.SEMANTICS', Crm\PhaseSemantics::getFinalSemantis());

	$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_ID', 'MAX(%s)', 'ID'));
	$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_DATE_MODIFY', 'MAX(%s)', 'UPDATED_TIME'));
	$query->registerRuntimeField(new ORM\Fields\ExpressionField('MAX_DATE_CREATE', 'MAX(%s)', 'CREATED_TIME'));
	$query->setOrder(array(
		'MAX_DATE_MODIFY' => 'DESC',
		'MAX_DATE_CREATE' => 'DESC',
		'MAX_ID' => 'DESC',
	));

	$topEntityId = null;
	$rankedList = [];
	foreach ($query->fetchAll() as $item)
	{
		if (!$topEntityId)
		{
			$topEntityId = $item[$fieldName];
		}

		if ($topEntityId == $item[$fieldName] && !in_array($item['ID'], $this->dynamics))
		{
			// find all, even from ::setEntity
			$this->dynamics[] = $item['ID'];
		}

		if (!in_array($item[$fieldName], $rankedList))
		{
			$rankedList[] = $item[$fieldName];
		}
	}

	if (empty($rankedList))
	{
		return;
	}

	$this->isRanked = true;

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

	if ($findDynamicsOnly)
	{
		return;
	}

	$this->updateListByRankedList($rankedList);
}