ResultEntity::findDuplicateEntityId

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. ResultEntity
  4. findDuplicateEntityId
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/webform/resultentity.php
  • Класс: Bitrix\Crm\WebForm\ResultEntity
  • Вызов: ResultEntity::findDuplicateEntityId
protected function findDuplicateEntityId($entityTypeName, $fields)
{
	if(!$this->duplicateMode || $this->duplicateMode == self::DUPLICATE_CONTROL_MODE_NONE)
	{
		return null;
	}

	$entity = Entity::getMap($entityTypeName);
	if(!$entity || empty($entity['DUPLICATE_CHECK']))
	{
		return null;
	}

	$mergerOptions = ['ENABLE_UPLOAD' => true, 'ENABLE_UPLOAD_CHECK' => false];

	switch ($entityTypeName)
	{
		case \CCrmOwnerType::CompanyName:
			$rowId = $this->selector->getCompanyId();
			break;

		case \CCrmOwnerType::ContactName:
			$rowId = $this->selector->getContactId();
			break;

		case \CCrmOwnerType::DealName:
			$rowId = $this->isDealDuplicateControlEnabled
				? $this->selector->getDealId()
				: null
			;
			break;

		case \CCrmOwnerType::LeadName:
			$rowId = $this->selector->getReturnCustomerLeadId();
			if ($rowId)
			{
				$facility = new EntityManageFacility($this->selector);
				$facility->setUpdateClientMode(
					$this->duplicateMode == self::DUPLICATE_CONTROL_MODE_REPLACE
						?
						EntityManageFacility::UPDATE_MODE_REPLACE
						:
						EntityManageFacility::UPDATE_MODE_MERGE
				);
				$facility->updateClientFields($fields);
				return $rowId;
			}
			else
			{
				$rowId = $this->selector->getLeadId();
			}
			break;

		default:
			$entityTypeId = \CCrmOwnerType::resolveID($entityTypeName);
			if (!\CCrmOwnerType::isUseDynamicTypeBasedApproach($entityTypeId))
			{
				return null;
			}

			$rowId = $this->isDynamicDuplicateControlEnabled
				? $this->selector->getDynamicId()
				: null
			;
			if (!$rowId)
			{
				return null;
			}

			$dynamicFactory = Crm\Service\Container::getInstance()->getFactory($entityTypeId);
			$dynamicItem = $dynamicFactory->getItem($rowId);
			if (!$dynamicItem)
			{
				return null;
			}

			switch($this->duplicateMode)
			{
				case self::DUPLICATE_CONTROL_MODE_MERGE:
					$entityFields = $dynamicItem->getData();
					foreach ($entityFields as $key => $value)
					{
						if ($value === [] || $value === null || $value === '' || $value === false)
						{
							unset($entityFields[$key]);
						}
					}
					break;

				case self::DUPLICATE_CONTROL_MODE_REPLACE:
					$entityFields = [];
					break;

				default:
					return $rowId;
			}

			$merger = new class($entityTypeId, $rowId, false) extends EntityMerger {
				/** @var \Bitrix\Crm\Service\Factory */
				public $dynamicFactory;
				protected function getEntityFieldsInfo()
				{
					return $this->dynamicFactory->getFieldsInfo();
				}

				protected function getEntityUserFieldsInfo()
				{
					return $this->dynamicFactory->getUserFieldsInfo();
				}

				protected function getEntityFields($entityID, $roleID){}
				protected function getEntityResponsibleID($entityID, $roleID){}
				protected function checkEntityReadPermission($entityID,$userPermissions){}
				protected function checkEntityUpdatePermission($entityID,$userPermissions){}
				protected function checkEntityDeletePermission($entityID,$userPermissions){}
				protected function updateEntity($entityID,array &$fields,$roleID,array $options = array()){}
				protected function deleteEntity($entityID,$roleID,array $options = array()){}
			};
			$merger->dynamicFactory = $dynamicFactory;
			$merger->mergeFields($fields, $entityFields, false, $mergerOptions);

			$dynamicItem->setFromCompatibleData($entityFields);
			$dynamicOperation = $dynamicFactory->getUpdateOperation(
				$dynamicItem,
				(new Crm\Service\Context())->setUserId($this->assignedById ?: 1)
			);
			$dynamicResult = $dynamicOperation
				->disableCheckAccess()
				->disableCheckFields()
				->launch();
			$dynamicResult->isSuccess();

			return $rowId;
	}

	if (!$rowId)
	{
		return null;
	}

	/** @var  \CCrmContact $entityObject */
	$entityObject = new $entity['CLASS_NAME'](false);

	$entityMultiFields = array();
	$hasMultiFields = !empty($entity['HAS_MULTI_FIELDS']);
	if ($hasMultiFields)
	{
		$multiFields = \CCrmFieldMulti::GetEntityFields($entityTypeName, $rowId, null);
		foreach($multiFields as $multiField)
		{
			$entityMultiFields[$multiField['TYPE_ID']][$multiField['ID']] = [
					'VALUE' => $multiField['VALUE'],
					'VALUE_TYPE' => $multiField['VALUE_TYPE'],
			];
		}
		unset($multiFields);
	}

	/** @var  $merger \Bitrix\Crm\Merger\EntityMerger */
	$mergerClass = $entity['DUPLICATE_CHECK']['MERGER_CLASS_NAME'];
	switch($this->duplicateMode)
	{
		case self::DUPLICATE_CONTROL_MODE_MERGE:
			$entityFieldsDb = $entityObject->GetListEx(
				array(),
				array('ID' => $rowId, 'CHECK_PERMISSIONS' => 'N'),
				false,
				false,
				array('*', 'UF_*')
			);

			if (!$entityFields = $entityFieldsDb->Fetch())
			{
				return null;
			}

			if ($hasMultiFields)
			{
				$entityFields['FM'] = $entityMultiFields;
			}
			foreach ($entityFields as $key => $value)
			{
				if ($value === [] || $value === null || $value === '' || $value === false)
				{
					unset($entityFields[$key]);
				}
			}
			$merger = new $mergerClass(0, false);
			$merger->mergeFields($fields, $entityFields, false, $mergerOptions);

			$entityObject->Update($rowId, $entityFields);
			break;

		case self::DUPLICATE_CONTROL_MODE_REPLACE:
			$entityFields = [];
			if ($hasMultiFields)
			{
				$entityFields['FM'] = $entityMultiFields;
			}

			if (in_array($entityTypeName, [\CCrmOwnerType::DealName, \CCrmOwnerType::ContactName, \CCrmOwnerType::CompanyName]))
			{
				$fieldName = $entityTypeName === \CCrmOwnerType::ContactName ? 'NAME' : 'TITLE';
				$filledValue = $this->fields[$entityTypeName][$fieldName] ?? null;
				$mergedValue = $fields[$fieldName] ?? null;
				if ($mergedValue && !$filledValue)
				{
					unset($fields[$fieldName]);
				}
			}

			$merger = new $mergerClass(0, false);
			$merger->mergeFields($fields, $entityFields, false, $mergerOptions);
			$entityObject->Update($rowId, $entityFields);
			break;
	}

	return $rowId;
}

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