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