...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicatechecker.php
- Класс: Bitrix\Crm\Integrity\DuplicateChecker
- Вызов: DuplicateChecker::findBankDetailDuplicates
public function findBankDetailDuplicates(\Bitrix\Crm\EntityAdapter $adapter, DuplicateSearchParams $params) { $dups = array(); $fieldNames = $params->getFieldNames(); $processAllFields = empty($fieldNames); $processAllRequisiteFields = $processAllFields || in_array('RQ', $fieldNames, true); $processAllBankDetailFields = $processAllFields || $processAllRequisiteFields || in_array('RQ.BD', $fieldNames, true); $bankDetailDupFieldsMap = EntityBankDetail::getDuplicateCriterionFieldsMap(); $bankDetailFieldGroups = array(); foreach ($bankDetailDupFieldsMap as $countryId => $fields) { foreach ($fields as $fieldName) { $groupId = $fieldName.'|'.$countryId; if ($processAllBankDetailFields || in_array('RQ.BD.'.$groupId, $fieldNames, true)) { $bankDetailFieldGroups[$groupId] = array( 'countryId' => $countryId, 'fieldName' => $fieldName, 'values' => array() ); } } } foreach ($fieldNames as $fieldName) { if (mb_strlen($fieldName) > 6 && 'RQ.BD.' === mb_substr($fieldName, 0, 3) && !in_array(mb_substr($fieldName, 6), array_keys($bankDetailFieldGroups)) ) { throw new Main\NotSupportedException( "Field name: \"{$fieldName}\" is not supported in current context" ); } } if (!empty($bankDetailFieldGroups)) { $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) { if (isset($requisiteFields['BD']) && is_array($requisiteFields['BD']) && !empty($requisiteFields['BD'])) { $presetId = 0; if (isset($requisiteFields['PRESET_ID']) && $requisiteFields['PRESET_ID'] > 0) $presetId = (int)$requisiteFields['PRESET_ID']; $countryId = 0; if (isset($presetCountryMap[$presetId])) $countryId = $presetCountryMap[$presetId]; else if (isset($requisiteFields['PRESET_COUNTRY_ID']) && $requisiteFields['PRESET_COUNTRY_ID'] > 0) $countryId = (int)$requisiteFields['PRESET_COUNTRY_ID']; if (isset($requisiteFields['ID']) && is_array($requisiteFields['BD'])) { foreach ($requisiteFields['BD'] as $bankDetailFields) { if ($countryId <= 0 && isset($bankDetailFields['COUNTRY_ID']) && $bankDetailFields['COUNTRY_ID'] > 0) $countryId = (int)$bankDetailFields['COUNTRY_ID']; if ($countryId > 0) { foreach ($bankDetailFields as $fieldName => $value) { $groupId = $fieldName.'|'.$countryId; if (isset($bankDetailFieldGroups[$groupId])) $bankDetailFieldGroups[$groupId]['values'][] = $value; } } } } } } unset($presetCountryMap); $criterions = array(); foreach($bankDetailFieldGroups as $bankDetailFieldGroup) { foreach ($bankDetailFieldGroup['values'] as $value) { if($value === '') { continue; } $criterion = new DuplicateBankDetailCriterion( $bankDetailFieldGroup['countryId'], $bankDetailFieldGroup['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; }