- Модуль: 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);
}