• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicatecriterion.php
  • Класс: Bitrix\Crm\Integrity\DuplicateCriterion
  • Вызов: DuplicateCriterion::createDuplicate
public function createDuplicate(
	$entityTypeID,
	$rootEntityID,
	$userID,
	$enablePermissionCheck,
	$enableRanking,
	$limit = 0
)
{
	if (
		$entityTypeID !== \CCrmOwnerType::Lead
		&& $entityTypeID !== \CCrmOwnerType::Contact
		&& $entityTypeID !== \CCrmOwnerType::Company
	)
	{
		throw new Main\NotSupportedException(
			"Entity type: '"
			. \CCrmOwnerType::ResolveName($entityTypeID)
			. "' is not supported in current context"
		);
	}

	/** @var Duplicate $dup **/
	$dup = new Duplicate($this, array());

	$query = static::createQuery();
	$query->addSelect('ENTITY_ID');
	$query->addFilter('=ENTITY_TYPE_ID', $entityTypeID);
	static::setQueryFilter($query, $this->getMatches());

	if($enablePermissionCheck)
	{
		$permissions = \CCrmPerms::GetUserPermissions($userID);
		$permissionSql = \CCrmPerms::BuildSql(
			\CCrmOwnerType::ResolveName($entityTypeID),
			'',
			'READ',
			array('RAW_QUERY' => true, 'PERMS'=> $permissions)
		);

		if($permissionSql === false)
		{
			//Access denied;
			return null;
		}

		if($permissionSql !== '')
		{
			$query->addFilter('@ENTITY_ID', new Main\DB\SqlExpression($permissionSql));
		}
	}

	$dedupeParams = new DedupeParams($entityTypeID, $userID, $enablePermissionCheck, $this->getScope());
	$dedupeParams->setLimitByAssignedUser($this->limitByAssignedUser());
	$query = DedupeDataSource::registerRuntimeFieldsByParams($query, $dedupeParams);

	if($limit > 0)
	{
		$query->setLimit($limit);
	}

	if($rootEntityID > 0)
	{
		$dup->setRootEntityID($rootEntityID);

		$query->addFilter('!ENTITY_ID', $rootEntityID);
		$query->addFilter(
			'!@ENTITY_ID',
			DuplicateIndexMismatch::prepareQueryField($this, $entityTypeID, $rootEntityID, $userID)
		);
	}

	$dbResult = $query->exec();
	$rankings = array();
	while($fields = $dbResult->fetch())
	{
		$entityID = isset($fields['ENTITY_ID']) ? intval($fields['ENTITY_ID']) : 0;
		if($entityID <= 0)
		{
			continue;
		}

		$entity =  new DuplicateEntity($entityTypeID, $entityID);
		$entity->setCriterion($this);
		if($enableRanking)
		{
			$rankings[] = $entity->getRanking();
		}
		$dup->addEntity($entity);
	}
	$this->onAfterDuplicateCreated($dup, $entityTypeID, $userID, $enablePermissionCheck, $enableRanking, $rankings);

	if($enableRanking)
	{
		DuplicateEntityRanking::initializeBulk($rankings,
			array('CHECK_PERMISSIONS' => $enablePermissionCheck, 'USER_ID' => $userID)
		);
	}
	return $dup;
}