EntityPreset::changeCurrentCountry

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. EntityPreset
  4. changeCurrentCountry
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/entitypreset.php
  • Класс: Bitrix\Crm\EntityPreset
  • Вызов: EntityPreset::changeCurrentCountry
public function changeCurrentCountry(int $countryId): Main\Result
{
	$result = new Main\Result();

	if ($countryId <= 0 || !in_array($countryId, EntityRequisite::getAllowedRqFieldCountries(), true))
	{
		$result->addError(new Main\Error("Incorrect country for change (ID: $countryId)"));
	}

	if ($result->isSuccess())
	{
		if (!static::checkChangeCurrentCountryPermission())
		{
			$result->addError(new Main\Error('Access denied!'));
		}
	}

	if ($result->isSuccess())
	{
		$currentCountryId = static::getCurrentCountryId();

		if ($currentCountryId > 0)
		{
			//region Delete all default presets for which there are no requisites.
			$fixedPresetList = EntityRequisite::getFixedPresetList();
			$defPresetsXmlIds = [];
			foreach ($fixedPresetList as $presetInfo)
			{
				$defPresetsXmlIds[] = $presetInfo['XML_ID'];
			}
			unset($presetInfo);

			$existsDefPresetMap = [];
			$existsDefPresetsByXmlId = [];
			$res = $this->getList(
				[
					'filter' => [
						'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
						[
							'LOGIC' => 'OR',
							'=CREATED_BY_ID' => 0,
							'@XML_ID' => $defPresetsXmlIds,
						]

					],
					'select' => ['ID', 'COUNTRY_ID', 'XML_ID']
				]
			);
			unset($defPresetsXmlIds);
			if (is_object($res))
			{
				$requisite = EntityRequisite::getSingleInstance();
				$emptyXmlIdIndex = 1;
				while ($row = $res->fetch())
				{
					$id = (int)$row['ID'];
					$presetCountryId = (int)$row['COUNTRY_ID'];
					$deleted = 'N';

					if ($presetCountryId !== $countryId)
					{
						$resRq = $requisite->getList(
							[
								'filter' => ['=PRESET_ID' => $id],
								'select' => ['ID'],
								'limit' => 1,
							]
						);
						if (is_object($resRq))
						{
							$rowRq = $resRq->fetch();
							if (!$rowRq)
							{
								// Remove directly through the table because you need to avoid
								// checks and setting default presets.
								$delResult = PresetTable::delete($id);
								if ($delResult->isSuccess())
								{
									$deleted = 'Y';
								}
							}
						}
					}

					$xmlId = '';
					if (isset($row['XML_ID']) && is_string($row['XML_ID']) && $row['XML_ID'] !== '')
					{
						$xmlId = $row['XML_ID'];
						$index = $row['XML_ID'];
					}
					else
					{
						$index = "";
						$emptyXmlIdIndex++;
					}
					$emptyXmlIdIndex++;
					$existsDefPresetMap[$id] = [
						'COUNTRY_ID' => $presetCountryId,
						'XML_ID' => $xmlId,
						'deleted' => $deleted
					];
					$existsDefPresetsByXmlId[$index] = [
						'ID' => $id,
						'COUNTRY_ID' => $presetCountryId,
						'deleted' => $deleted
					];
				}
			}
			unset(
				$id,
				$deleted,
				$row,
				$res,
				$rowRq,
				$resRq,
				$presetCountryId,
				$requisite,
				$resDel,
				$defPresetsOptionValue,
				$emptyXmlIdIndex,
				$xmlId,
				$index
			);
			//endregion Delete all default presets for which there are no requisites.

			//region Create new default presets.
			$sort = 500;
			$datetimeEntity = new Main\DB\SqlExpression(
				Main\Application::getConnection()->getSqlHelper()->getCurrentDateTimeFunction()
			);
			foreach ($fixedPresetList as $presetData)
			{
				if ($countryId === (int)$presetData['COUNTRY_ID'])
				{
					$sort += 10;
					if (
						!isset($existsDefPresetsByXmlId[$presetData['XML_ID']])
						|| (
							isset($existsDefPresetsByXmlId[$presetData['XML_ID']]['deleted'])
							&& $existsDefPresetsByXmlId[$presetData['XML_ID']]['deleted'] === 'Y'
						)
					)
					{
						$presetFields = [
							'ENTITY_TYPE_ID' => EntityPreset::Requisite,
							'COUNTRY_ID' => $countryId,
							'DATE_CREATE' => $datetimeEntity,
							'CREATED_BY_ID' => 0,
							'NAME' => $presetData['NAME'],
							'ACTIVE' => $presetData['ACTIVE'],
							'SORT' => $sort,
							'XML_ID' => $presetData['XML_ID'],
							'SETTINGS' => $presetData['SETTINGS']
						];

						//region Rename existing presets if their names match the new one.
						$res = $this->getList(
							[
								'filter' => [
									'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
									'=NAME' => $presetFields['NAME'],
								],
								'select' => ['ID', 'NAME', 'COUNTRY_ID'],
							]
						);
						if (is_object($res))
						{
							while ($row = $res->fetch())
							{
								$countryCode = EntityPreset::getCountryCodeById($row['COUNTRY_ID']);
								if ($countryCode !== '')
								{
									PresetTable::update(
										(int)$row['ID'],
										['NAME' => $row['NAME'] . " ($countryCode)"]
									);
								}
							}
						}
						unset($res, $row, $countryCode);
						//endregion Rename existing presets if their names match the new one.

						PresetTable::add($presetFields);
					}
				}
			}
			unset(
				$existsDefPresetsByXmlId,
				$fixedPresetList,
				$presetData,
				$sort,
				$presetFields
			);
			//endregion Create new default presets.

			// Set new identifier of the current country.
			Option::set('crm', 'crm_requisite_preset_country_id', $countryId);

			$entityTypeNames = ['COMPANY', 'CONTACT'];

			//region Get current default presets identifiers
			$defPresetMap = [];
			foreach ($entityTypeNames as $entityTypeName)
			{
				$defPresetMap[$entityTypeName] = [
					'ID' => 0,
					'COUNTRY_ID' => 0,
					'NAME' => '',
					'SETTINGS' => []
				];
			}
			unset($entityTypeName);
			$optionValue = Option::get('crm', 'requisite_default_presets');
			$optionModified = false;
			if ($optionValue !== '')
			{
				$optionValue = unserialize($optionValue, ['allowed_classes' => false]);
			}
			if (!is_array($optionValue))
			{
				$optionValue = [];
			}
			foreach ($entityTypeNames as $entityTypeName)
			{
				if (isset($optionValue[$entityTypeName]))
				{
					$defPresetMap[$entityTypeName]['ID'] = (int)$optionValue[$entityTypeName];
					if ($defPresetMap[$entityTypeName]['ID'] < 0)
					{
						$defPresetMap[$entityTypeName]['ID'] = 0;
						$optionModified = true;
					}
				}
			}
			unset($entityTypeName);

			//region Check existing of default presets
			$existsDefPreset = [];
			foreach ($entityTypeNames as $entityTypeName)
			{
				$existsDefPreset[$entityTypeName] = false;
			}
			unset($entityTypeName);
			if ($defPresetMap['COMPANY']['ID'] > 0 || $defPresetMap['CONTACT']['ID'] > 0)
			{
				$ids = [];
				foreach ($entityTypeNames as $entityTypeName)
				{
					if (
						$defPresetMap[$entityTypeName]['ID'] > 0
						&& !in_array($defPresetMap[$entityTypeName]['ID'], $ids, true)
					)
					{
						$ids[] = $defPresetMap[$entityTypeName]['ID'];
					}
				}
				unset($entityTypeName);

				if (!empty($ids))
				{
					$res = $this->getList(
						[
							'filter' => [
								'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
								'@ID' => $ids
							],
							'select' => ['ID', 'COUNTRY_ID', 'NAME', 'SETTINGS'],
						]
					);
					if (is_object($res))
					{
						while ($row = $res->fetch())
						{
							$presetId = is_array($row) && isset($row['ID']) ? (int)$row['ID'] : 0;
							if ($presetId > 0)
							{
								foreach ($entityTypeNames as $entityTypeName)
								{
									if ($presetId === $defPresetMap[$entityTypeName]['ID'])
									{
										$existsDefPreset[$entityTypeName] = true;
										$defPresetMap[$entityTypeName]['COUNTRY_ID'] = (int)$row['COUNTRY_ID'];
										if ($defPresetMap[$entityTypeName]['COUNTRY_ID'] < 0)
										{
											$defPresetMap[$entityTypeName]['COUNTRY_ID'] = 0;
										}
										if (isset($row['NAME']) && is_string($row['NAME']) && $row['NAME'] !== '')
										{
											$defPresetMap[$entityTypeName]['NAME'] = $row['NAME'];
										}
										if (is_array($row['SETTINGS']))
										{
											$defPresetMap[$entityTypeName]['SETTINGS'] = $row['SETTINGS'];
										}
									}
								}
							}
						}
					}
					unset($ids, $res, $row, $presetId, $entityTypeName);
				}
			}
			foreach ($entityTypeNames as $entityTypeName)
			{
				if (!$existsDefPreset[$entityTypeName])
				{
					$defPresetMap[$entityTypeName]['ID'] = 0;
					$optionModified = true;
				}
			}
			unset($entityTypeName, $existsDefPreset);
			//endregion Check existing of default presets

			$optionValue = [];
			foreach ($entityTypeNames as $entityTypeName)
			{
				$optionValue[$entityTypeName] = $defPresetMap[$entityTypeName]['ID'];
			}
			unset($entityTypeNames, $entityTypeName);
			//endregion Get current default presets identifiers

			//region Reset default presets to option
			$countryCode = static::getCountryCodeById($countryId);
			$personTypeMap = [
				'COMPANY' => $countryCode === 'RU' ? 'COMPANY' : 'LEGALENTITY',
				'CONTACT' => 'PERSON',
			];
			foreach ($personTypeMap as $optionParamName => $personType)
			{
				$xmlId = str_replace(
					['%COUNTRY%', '%PERSON%'],
					[$countryCode, $personType],
					'#CRM_REQUISITE_PRESET_DEF_%COUNTRY%_%PERSON%#'
				);
				$res = $this->getList(
					[
						'order' => ['SORT' => 'ASC', 'ID' => 'ASC'],
						'filter' => [
							'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
							'=XML_ID' => $xmlId
						],
						'select' => ['ID', 'COUNTRY_ID', 'NAME', 'SETTINGS'],
						'limit' => 1
					]
				);
				if (is_object($res))
				{
					$row = $res->fetch();
					if (is_array($row))
					{
						$presetId = isset($row['ID']) ? (int)$row['ID'] : 0;
						$presetCountryId =
							(isset($row['COUNTRY_ID']) && $row['COUNTRY_ID'] > 0)
							? (int)$row['COUNTRY_ID']
							: 0
						;
						$presetName = (isset($row['NAME']) && is_string($row['NAME'])) ? $row['NAME'] : '';
						$settings = is_array($row['SETTINGS']) ? $row['SETTINGS'] : [];
						if ($presetId > 0)
						{
							$optionValue[$optionParamName] = $presetId;
							$defPresetMap[$optionParamName]['ID'] = $presetId;
							$defPresetMap[$optionParamName]['COUNTRY_ID'] = $presetCountryId;
							$defPresetMap[$optionParamName]['NAME'] = $presetName;
							$defPresetMap[$optionParamName]['SETTINGS'] = $settings;
							$optionModified = true;
						}
					}
				}
			}
			unset(
				$personTypeMap,
				$optionParamName,
				$personType,
				$xmlId,
				$res,
				$row,
				$presetId,
				$presetCountryId,
				$presetName,
				$settings
			);

			if ($optionModified)
			{
				Option::set('crm', 'requisite_default_presets', serialize($optionValue));
			}
			unset($optionModified, $optionValue);
			//endregion Reset default presets to option

			//region Convert synchronization settings for order properties with requisite fields
			$this->convertOrderPropsSyncSettings(
				$defPresetMap,
				$existsDefPresetMap
			);
			//endregion Convert synchronization settings for order properties with requisite fields

			unset($defPresetMap, $existsDefPresetMap);
		}
	}

	return $result;
}

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