• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/entitypreset.php
  • Класс: Bitrix\Crm\EntityPreset
  • Вызов: EntityPreset::convertOrderPropsSyncSettings
private function convertOrderPropsSyncSettings(array $newPresetMap, array $existsDefPresetMap)
{
	//region Verification of initial data
	$presetMap = [];
	foreach (['COMPANY', 'CONTACT'] as $entityTypeName)
	{
		$isValidPreset = (
			is_array($newPresetMap[$entityTypeName])
			&& isset($newPresetMap[$entityTypeName]['ID'])
			&& $newPresetMap[$entityTypeName]['ID'] > 0
			&& isset($newPresetMap[$entityTypeName]['COUNTRY_ID'])
			&& $newPresetMap[$entityTypeName]['COUNTRY_ID'] > 0
			&& isset($newPresetMap[$entityTypeName]['NAME'])
			&& is_string($newPresetMap[$entityTypeName]['NAME'])
			&& is_array($newPresetMap[$entityTypeName]['SETTINGS'])
			&& is_array($newPresetMap[$entityTypeName]['SETTINGS']['FIELDS'])
		);
		$presetMap[$entityTypeName] = [
			'IS_VALID' => $isValidPreset,
			'ID' => $isValidPreset ? (int)$newPresetMap[$entityTypeName]['ID'] : 0,
			'COUNTRY_ID' => $isValidPreset ? (int)$newPresetMap[$entityTypeName]['COUNTRY_ID'] : 0,
			'NAME' => $isValidPreset ? $newPresetMap[$entityTypeName]['NAME'] : '',
			'SETTINGS' => $isValidPreset ? $newPresetMap[$entityTypeName]['SETTINGS'] : [],
		];
	}
	$newPresetMap = $presetMap;
	unset($entityTypeName, $isValidPreset, $presetMap);
	//endregion Verification of initial data

	if (
		($newPresetMap['COMPANY']['IS_VALID'] || $newPresetMap['CONTACT']['IS_VALID'])
		&& !empty($existsDefPresetMap)
	)
	{
		$bankDetail = EntityBankDetail::getSingleInstance();

		$res = OrderPropsMatchTable::getList(
			[
				'filter' => [
					'@CRM_ENTITY_TYPE' => [
						\CCrmOwnerType::Company,
						\CCrmOwnerType::Contact
					],
					'@CRM_FIELD_TYPE' => [
						BaseEntityMatcher::REQUISITE_FIELD_TYPE,
						BaseEntityMatcher::BANK_DETAIL_FIELD_TYPE
					]
				],
				'select' => [
					'ID',
					'CRM_ENTITY_TYPE',
					'CRM_FIELD_TYPE',
					'SETTINGS',
					'CRM_FIELD_CODE'
				]
			]
		);
		if (is_object($res))
		{
			$settingsFieldsMap = [];
			$bankDetailFieldsMap = $bankDetail->getRqFieldByCountry();
			while ($row = $res->fetch())
			{
				if (
					is_array($row['SETTINGS'])
					&& isset($row['SETTINGS']['RQ_PRESET_ID'])
					&& $row['SETTINGS']['RQ_PRESET_ID'] > 0
				)
				{
					$propPresetId = (int)$row['SETTINGS']['RQ_PRESET_ID'];
					if (is_array($existsDefPresetMap[$propPresetId]))
					{
						$entityTypeId = \CCrmOwnerType::Undefined;
						$presetInfo = $existsDefPresetMap[$propPresetId];

						//region Detect entity type
						if (
							isset($presetInfo['XML_ID'])
							&& is_string($presetInfo['XML_ID'])
							&& $presetInfo['XML_ID'] !== ''
						)
						{
							$xmlIdLength = mb_strlen($presetInfo['XML_ID']);
							$signMap = [
								'COMPANY' => \CCrmOwnerType::Company,
								'INDIVIDUAL' => \CCrmOwnerType::Company,
								'PERSON' => \CCrmOwnerType::Contact,
								'LEGALENTITY' => \CCrmOwnerType::Company,
							];
							foreach (array_keys($signMap) as $sign)
							{
								$suffix = mb_substr($presetInfo['XML_ID'], $xmlIdLength - mb_strlen($sign) - 1);
								if ($suffix === ($sign . '#'))
								{
									$entityTypeId = $signMap[$sign];
									break;
								}
							}
						}
						if ($entityTypeId === \CCrmOwnerType::Undefined)
						{
							if (isset($row['CRM_ENTITY_TYPE']) && $row['CRM_ENTITY_TYPE'] > 0)
							{
								$entityTypeId = (int)$row['CRM_ENTITY_TYPE'];
							}
							if (
								!(
									$entityTypeId === \CCrmOwnerType::Company
									|| $entityTypeId === \CCrmOwnerType::Contact
								)
							)
							{
								$entityTypeId = \CCrmOwnerType::Company;
							}
						}
						//endregion Detect entity type

						$entityTypeName = \CCrmOwnerType::ResolveName($entityTypeId);
						if (
							is_array($newPresetMap[$entityTypeName])
							&& $newPresetMap[$entityTypeName]['IS_VALID']
							&& isset($row['ID'])
							&& $row['ID'] > 0
							&& isset($row['CRM_FIELD_TYPE'])
							&& $row['CRM_FIELD_TYPE'] > 0
							&& isset($row['CRM_FIELD_CODE'])
							&& is_string($row['CRM_FIELD_CODE'])
							&& $row['CRM_FIELD_CODE'] !== ''
							&& isset($row['SETTINGS']['RQ_NAME'])
							&& isset($row['SETTINGS']['RQ_PRESET_ID'])
						)
						{
							$crmFieldType = (int)$row['CRM_FIELD_TYPE'];
							$presetId = $newPresetMap[$entityTypeName]['ID'];
							$presetCountryId = $newPresetMap[$entityTypeName]['COUNTRY_ID'];
							$fields = [
								'SETTINGS' => $row['SETTINGS']
							];
							$fields['SETTINGS']['RQ_PRESET_ID'] = $presetId;
							$fields['SETTINGS']['RQ_NAME'] = $newPresetMap[$entityTypeName]['NAME'];
							$needUpdate = false;

							if ($crmFieldType === BaseEntityMatcher::REQUISITE_FIELD_TYPE)
							{
								if (!isset($settingsFieldsMap[$presetId]))
								{
									$settingsFieldsMap[$presetId] = [];
									if (is_array($newPresetMap[$entityTypeName]['SETTINGS']['FIELDS']))
									{
										$presetFields = $newPresetMap[$entityTypeName]['SETTINGS']['FIELDS'];
										foreach ($presetFields as $presetField)
										{
											if (
												isset($presetField['FIELD_NAME'])
												&& is_string($presetField['FIELD_NAME'])
												&& $presetField['FIELD_NAME'] !== ''
											)
											{
												$settingsFieldsMap[$presetId][$presetField['FIELD_NAME']] = true;
											}
										}
									}
								}

								if (isset($settingsFieldsMap[$presetId][$row['CRM_FIELD_CODE']]))
								{
									$needUpdate = true;
								}
							}
							elseif ($crmFieldType === BaseEntityMatcher::BANK_DETAIL_FIELD_TYPE)
							{
								if (isset($bankDetailFieldsMap[$presetCountryId][$row['CRM_FIELD_CODE']]))
								{
									$fields['SETTINGS']['BD_NAME'] =
										$bankDetail->getDefaultSectionTitle($presetCountryId)
									;
									$fields['SETTINGS']['BD_COUNTRY_ID'] = $presetCountryId;
									$needUpdate = true;
								}
							}

							if ($needUpdate)
							{
								OrderPropsMatchTable::update((int)$row['ID'], ['fields' => $fields]);
							}
						}
					}
				}
			}
		}
	}
}