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