DuplicateChecker::findBankDetailDuplicates

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. DuplicateChecker
  4. findBankDetailDuplicates
  • Модуль: 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;
}

Добавить комментарий