CCrmDuplicateRestProxy::processMethodRequest

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmDuplicateRestProxy
  4. processMethodRequest
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/restservice.php
  • Класс: \CCrmDuplicateRestProxy
  • Вызов: CCrmDuplicateRestProxy::processMethodRequest
public function processMethodRequest($name, $nameDetails, $arParams, $nav, $server)
{
	$userPerms = CCrmPerms::GetCurrentUserPermissions();
	if(!CCrmLead::CheckReadPermission(0, $userPerms)
		&& !CCrmContact::CheckReadPermission(0, $userPerms)
		&& !CCrmCompany::CheckReadPermission(0, $userPerms))
	{
		throw new RestException('Access denied.');
	}

	if(mb_strtoupper($name) === 'FINDBYCOMM')
	{
		$type = mb_strtoupper($this->resolveParam($arParams, 'type'));
		if($type !== 'EMAIL' && $type !== 'PHONE')
		{
			if($type === '')
			{
				throw new RestException("Communication type is not defined.");
			}
			else
			{
				throw new RestException("Communication type '{$type}' is not supported in current context.");
			}
		}

		$values = $this->resolveArrayParam($arParams, 'values');
		if(!is_array($values) || count($values) === 0)
		{
			throw new RestException("Communication values is not defined.");
		}

		$entityTypeID = CCrmOwnerType::ResolveID(
			$this->resolveMultiPartParam($arParams, array('entity', 'type'))
		);

		if($entityTypeID === CCrmOwnerType::Deal)
		{
			throw new RestException("Deal is not supported in current context.");
		}

		$criterions = array();
		$dups = array();
		$qty = 0;
		foreach($values as $value)
		{
			if(!is_string($value) || $value === '')
			{
				continue;
			}

			$criterion = new \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion($type, $value);
			$isExists = false;
			foreach($criterions as $curCriterion)
			{
				/** @var \Bitrix\Crm\Integrity\DuplicateCriterion $curCriterion */
				if($criterion->equals($curCriterion))
				{
					$isExists = true;
					break;
				}
			}

			if($isExists)
			{
				continue;
			}
			$criterions[] = $criterion;

			$duplicate = $criterion->find($entityTypeID, 20);
			if($duplicate !== null)
			{
				$dups[] = $duplicate;
			}

			$qty++;
			if($qty >= 20)
			{
				break;
			}
		}

		$entityByType = array();
		foreach($dups as $dup)
		{
			/** @var \Bitrix\Crm\Integrity\Duplicate $dup */
			$entities = $dup->getEntities();
			if(!(is_array($entities) && !empty($entities)))
			{
				continue;
			}

			//Each entity type limited by 50 items
			foreach($entities as $entity)
			{
				/** @var \Bitrix\Crm\Integrity\DuplicateEntity $entity */
				$entityTypeID = $entity->getEntityTypeID();
				$entityTypeName = CCrmOwnerType::ResolveName($entityTypeID);

				$entityID = $entity->getEntityID();

				if(!isset($entityByType[$entityTypeName]))
				{
					$entityByType[$entityTypeName] = array($entityID);
				}
				elseif(!in_array($entityID, $entityByType[$entityTypeName], true))
				{
					$entityByType[$entityTypeName][] = $entityID;
				}
			}
		}
		return $entityByType;
	}
	throw new RestException('Method not found!', RestException::ERROR_METHOD_NOT_FOUND, CRestServer::STATUS_NOT_FOUND);
}

Добавить комментарий