- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicatelist.php
- Класс: Bitrix\Crm\Integrity\DuplicateList
- Вызов: DuplicateList::createQuery
protected function createQuery($offset = 0, $limit = 0)
{
if (!is_int($offset))
{
$offset = intval($offset);
}
if (!is_int($limit))
{
$limit = intval($limit);
}
$typeIDs = $this->getTypeIDs();
if (empty($typeIDs))
{
throw new Main\NotSupportedException("Criterion types are required.");
}
$query = new Main\Entity\Query(Entity\DuplicateIndexTable::getEntity());
$query->addSelect('ROOT_ENTITY_ID');
$query->addSelect('ROOT_ENTITY_NAME');
$query->addSelect('ROOT_ENTITY_TITLE');
$query->addSelect('QUANTITY');
$query->addSelect('TYPE_ID');
$query->addSelect('SCOPE');
$query->addSelect('MATCHES');
$query->addSelect('IS_JUNK');
$permissionSql = '';
if ($this->enablePermissionCheck)
{
$permissions = \CCrmPerms::GetUserPermissions($this->userID);
$permissionSql = \CCrmPerms::BuildSql(
\CCrmOwnerType::ResolveName($this->entityTypeID),
'',
'READ',
array('RAW_QUERY' => true, 'PERMS' => $permissions)
);
if ($permissionSql === false)
{
//Access denied;
return null;
}
}
$query->addFilter('=USER_ID', $this->userID);
$query->addFilter('=ENTITY_TYPE_ID', $this->entityTypeID);
$query->addFilter('@TYPE_ID', $typeIDs);
if ($this->matchHash != '')
{
$query->addFilter('=MATCH_HASH', $this->matchHash);
}
$query->addFilter('=SCOPE', $this->scope);
if (!empty($this->statusIDs))
{
$query->addFilter('@STATUS_ID', $this->statusIDs);
}
if ($this->enablePermissionCheck && $permissionSql !== '')
{
$query->addFilter('@ROOT_ENTITY_ID', new Main\DB\SqlExpression($permissionSql));
}
if ($offset > 0)
{
$query->setOffset($offset);
}
if ($limit > 0)
{
$query->setLimit($limit);
}
$enableSorting = $this->sortTypeID !== DuplicateIndexType::UNDEFINED;
if ($enableSorting)
{
$order = $this->sortOrder === SORT_DESC ? 'DESC' : 'ASC';
if (!empty($this->statusIDs))
{
$query->addOrder('STATUS_ID', $order);
}
if ($this->sortTypeID === DuplicateIndexType::COMMUNICATION_EMAIL)
{
$query->addOrder('ROOT_ENTITY_EMAIL_FLAG', $order);
$query->addOrder('ROOT_ENTITY_EMAIL', $order);
}
elseif ($this->sortTypeID === DuplicateIndexType::COMMUNICATION_PHONE)
{
$query->addOrder('ROOT_ENTITY_PHONE_FLAG', $order);
$query->addOrder('ROOT_ENTITY_PHONE', $order);
}
elseif ($this->sortTypeID === DuplicateIndexType::PERSON)
{
$query->addOrder('ROOT_ENTITY_NAME_FLAG', $order);
$query->addOrder('ROOT_ENTITY_NAME', $order);
}
elseif ($this->sortTypeID === DuplicateIndexType::ORGANIZATION)
{
$query->addOrder('ROOT_ENTITY_TITLE_FLAG', $order);
$query->addOrder('ROOT_ENTITY_TITLE', $order);
}
else
{
$isSortingTypeFound = false;
$sortingTypeID = DuplicateIndexType::UNDEFINED;
foreach (DuplicateRequisiteCriterion::getSupportedDedupeTypes() as $typeID)
{
if ($this->sortTypeID === $typeID)
{
$sortingTypeID = $typeID;
$isSortingTypeFound = true;
break;
}
}
if (!$isSortingTypeFound)
{
foreach (DuplicateBankDetailCriterion::getSupportedDedupeTypes() as $typeID)
{
if ($this->sortTypeID === $typeID)
{
$sortingTypeID = $typeID;
$isSortingTypeFound = true;
break;
}
}
}
if ($isSortingTypeFound)
{
$typeName = DuplicateIndexType::resolveName($sortingTypeID);
$query->addOrder("ROOT_ENTITY_{$typeName}_FLAG", $order);
$query->addOrder("ROOT_ENTITY_{$typeName}", $order);
}
}
}
elseif ($this->isNaturalSortEnabled())
{
$order = $this->sortOrder === SORT_DESC ? 'DESC' : 'ASC';
$query->addOrder('STATUS_ID', $order);
$query->addOrder('USER_ID', $order);
$query->addOrder('ENTITY_TYPE_ID', $order);
$query->addOrder('TYPE_ID', $order);
$query->addOrder('MATCH_HASH', $order);
$query->addOrder('SCOPE', $order);
}
return $query;
}