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