...Человеческий поиск в разработке...
- Модуль: 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; }