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