- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicatechecker.php
- Класс: Bitrix\Crm\Integrity\DuplicateChecker
- Вызов: DuplicateChecker::findRequisiteDuplicates
public function findRequisiteDuplicates(\Bitrix\Crm\EntityAdapter $adapter, DuplicateSearchParams $params) { $dups = array(); $fieldNames = $params->getFieldNames(); $processAllFields = empty($fieldNames); $processAllRequisiteFields = $processAllFields || in_array('RQ', $fieldNames, true); $requsiiteDupFieldsMap = EntityRequisite::getDuplicateCriterionFieldsMap(); $requisiteFieldGroups = array(); foreach ($requsiiteDupFieldsMap as $countryId => $fields) { foreach ($fields as $fieldName) { $groupId = $fieldName.'|'.$countryId; if ($processAllRequisiteFields || in_array('RQ.'.$groupId, $fieldNames, true)) { $requisiteFieldGroups[$groupId] = array( 'countryId' => $countryId, 'fieldName' => $fieldName, 'values' => array() ); } } } foreach ($fieldNames as $fieldName) { $fieldNameLength = mb_strlen($fieldName); if ($fieldNameLength > 3 && 'RQ.' === mb_substr($fieldName, 0, 3) && $fieldName !== 'RQ.BD' && ($fieldNameLength < 6 || 'RQ.BD.' !== mb_substr($fieldName, 0, 6)) && !in_array(mb_substr($fieldName, 3), array_keys($requisiteFieldGroups)) ) { throw new Main\NotSupportedException( "Field name: \"{$fieldName}\" is not supported in current context" ); } } if (!empty($requisiteFieldGroups)) { $allRequisites = $adapter->getFieldValue('RQ'); // gather countries by presets $presetCountryMap = array(); $presetIds = array(); foreach ($allRequisites as $requisiteFields) { if (!(isset($requisiteFields['PRESET_COUNTRY_ID']) && $requisiteFields['PRESET_COUNTRY_ID'] > 0) && isset($requisiteFields['PRESET_ID']) && $requisiteFields['PRESET_ID'] > 0) { $presetIds[] = (int)$requisiteFields['PRESET_ID']; } } if (!empty($presetIds)) { $preset = new EntityPreset(); $res = $preset->getList(array( 'order' => array('SORT' => 'ASC'), 'filter' => array( '=ENTITY_TYPE_ID' => EntityPreset::Requisite, '=ID' => array_unique($presetIds) ), 'select' => array('ID', 'COUNTRY_ID') )); while ($presetData = $res->fetch()) { $countryId = (int)$presetData['COUNTRY_ID']; if ($countryId > 0) $presetCountryMap[(int)$presetData['ID']] = $countryId; } } unset($presetIds, $requisiteFields, $preset, $res, $presetData, $countryId); // gather values foreach ($allRequisites as $requisiteFields) { $countryId = 0; if (isset($requisiteFields['PRESET_COUNTRY_ID']) && $requisiteFields['PRESET_COUNTRY_ID'] > 0) $countryId = (int)$requisiteFields['PRESET_COUNTRY_ID']; $presetId = 0; if (isset($requisiteFields['PRESET_ID']) && $requisiteFields['PRESET_ID'] > 0) $presetId = (int)$requisiteFields['PRESET_ID']; if (isset($presetCountryMap[$presetId])) $countryId = $presetCountryMap[$presetId]; if (isset($requisiteFields['ID']) && $countryId > 0) { foreach ($requisiteFields as $fieldName => $value) { $groupId = $fieldName.'|'.$countryId; if (isset($requisiteFieldGroups[$groupId])) $requisiteFieldGroups[$groupId]['values'][] = $value; } } } unset($presetCountryMap); $criterions = array(); foreach($requisiteFieldGroups as $requsiiteFieldGroup) { foreach ($requsiiteFieldGroup['values'] as $value) { if($value === '') { continue; } $criterion = new DuplicateRequisiteCriterion( $requsiiteFieldGroup['countryId'], $requsiiteFieldGroup['fieldName'], $value ); $criterion->setCategoryId($params->getCategoryId()); $isExists = false; foreach($criterions as $curCriterion) { /** @var DuplicateCriterion $curCriterion */ if($criterion->equals($curCriterion)) { $isExists = true; break; } } if($isExists) { continue; } $criterions[] = $criterion; $duplicate = $criterion->find($params->getEntityTypeId() ?? \CCrmOwnerType::Undefined); if($duplicate !== null) { $dups[] = $duplicate; } } } } return $dups; }