• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_entity_selector_helper.php
  • Класс: \CCrmEntitySelectorHelper
  • Вызов: CCrmEntitySelectorHelper::PrepareRequisiteData
static function PrepareRequisiteData($entityTypeId, $entityId, $options = array())
{
	$entityTypeId = (int)$entityTypeId;
	$entityId = (int)$entityId;

	// Options
	$copyMode = (
		isset($options['COPY_MODE']) && ($options['COPY_MODE'] === true || $options['COPY_MODE'] === 'Y')
	);
	$viewDataOnly = (
		isset($options['VIEW_DATA_ONLY'])
		&& ($options['VIEW_DATA_ONLY'] === true || $options['VIEW_DATA_ONLY'] === 'Y')
	);
	$viewFormatted = (
		isset($options['VIEW_FORMATTED'])
		&& ($options['VIEW_FORMATTED'] === true || $options['VIEW_FORMATTED'] === 'Y')
	);
	$addressAsJson = (
		isset($options['ADDRESS_AS_JSON'])
		&& ($options['ADDRESS_AS_JSON'] === true || $options['ADDRESS_AS_JSON'] === 'Y')
	);

	$result = array();

	$requisite = new \Bitrix\Crm\EntityRequisite();
	$preset = new \Bitrix\Crm\EntityPreset();
	$fieldsInfo = $requisite->getFormFieldsInfo();

	if ($requisite->validateEntityReadPermission($entityTypeId, $entityId))
	{
		// selected
		$requisiteIdSelected = 0;
		$bankDetailIdSelected = 0;
		$settings = $requisite->loadSettings($entityTypeId, $entityId);
		if (is_array($settings))
		{
			if (isset($settings['REQUISITE_ID_SELECTED']))
			{
				$requisiteIdSelected = (int)$settings['REQUISITE_ID_SELECTED'];
				if ($requisiteIdSelected < 0)
					$requisiteIdSelected = 0;
			}
			if (isset($settings['BANK_DETAIL_ID_SELECTED']))
			{
				$bankDetailIdSelected = (int)$settings['BANK_DETAIL_ID_SELECTED'];
				if ($bankDetailIdSelected < 0)
					$bankDetailIdSelected = 0;
			}
		}
		$bSelected = false;

		$fieldsAllowedMap = array();
		foreach ($fieldsInfo as $fieldName => $fieldInfo)
		{
			if ($fieldInfo['isRQ'])
			{
				$fieldsAllowedMap[$fieldName] = true;
			}
		}
		unset($fieldName, $fieldInfo);
		$select = array_keys($fieldsInfo);

		// address field
		$needLoadAddresses = false;
		if (array_search(Bitrix\Crm\EntityRequisite::ADDRESS, $select, true))
		{
			$needLoadAddresses = true;
			unset($select[Bitrix\Crm\EntityRequisite::ADDRESS]);
		}

		$requisiteList = array();
		$presetList = array();
		$presetIds = array();
		$requisiteAddresses = array();
		if (is_array($select) && !empty($select))
		{
			$res = $requisite->getList(
				array(
					'order' => array('SORT' => 'ASC', 'ID' => 'ASC'),
					'filter' => array(
						'=ENTITY_TYPE_ID' => $entityTypeId,
						'=ENTITY_ID' => $entityId
					),
					'select' => $select
				)
			);
			while ($row = $res->fetch())
			{
				if ($needLoadAddresses)
				{
					$row[Bitrix\Crm\EntityRequisite::ADDRESS] = [];
				}
				$presetIds[] = (int)$row['PRESET_ID'];
				$requisiteList[$row['ID']] = $row;
				if (!$bSelected && $requisiteIdSelected === intval($row['ID']))
					$bSelected = true;
			}
			if (!empty($requisiteList))
			{
				if (!empty($presetIds))
				{
					$presetIds = array_unique($presetIds);
					$res = $preset->getList(
						array(
							'filter' => array(
								'=ID' => $presetIds,
								'=ENTITY_TYPE_ID' => \Bitrix\Crm\EntityPreset::Requisite/*,
								'=ACTIVE' => 'Y'*/
							),
							'select' => array('ID', 'NAME', 'COUNTRY_ID', 'SETTINGS')
						)
					);
					while ($row = $res->Fetch())
					{
						$presetList[$row['ID']] = $row;
					}
				}

				// load addresses
				if ($needLoadAddresses)
				{
					$rqAddr = new Bitrix\Crm\RequisiteAddress();
					$res = $rqAddr->getList(
						array(
							'filter' => array(
								'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
								'ENTITY_ID' => array_keys($requisiteList)
							),
							'select' => array(
								'ENTITY_ID',
								'TYPE_ID',
								'ADDRESS_1',
								'ADDRESS_2',
								'CITY',
								'POSTAL_CODE',
								'REGION',
								'PROVINCE',
								'COUNTRY',
								'COUNTRY_CODE',
								'LOC_ADDR_ID'
							)
						)
					);
					while ($row = $res->fetch())
					{
						$requisiteId = (int)$row['ENTITY_ID'];
						$typeId = (int)$row['TYPE_ID'];
						unset($row['ENTITY_ID'], $row['TYPE_ID']);
						$requisiteAddresses[$typeId] = \Bitrix\Crm\Format\AddressFormatter::getSingleInstance()->formatTextComma($row);

						if ($addressAsJson)
						{
							if (RequisiteAddress::isLocationModuleIncluded())
							{
								/** @var $locationAddress Address */
								$locationAddress = RequisiteAddress::makeLocationAddressByFields($row);
								if ($locationAddress)
								{
									$requisiteList[$requisiteId][Bitrix\Crm\EntityRequisite::ADDRESS][$typeId] =
										$locationAddress->toJson();
								}
								unset($locationAddress);
							}
						}
						else
						{
							$requisiteList[$requisiteId][Bitrix\Crm\EntityRequisite::ADDRESS][$typeId] = $row;
						}
					}
				}

				$index = 0;
				foreach ($requisiteList as $requisiteId => $fields)
				{
					$presetID = isset($fields['PRESET_ID']) ? (int)$fields['PRESET_ID'] : 0;
					$bankDetailCountryId = 0;
					$dataFields = array();
					foreach ($fields as $fName => $fValue)
					{
						if ($copyMode && ($fName === 'ID' || $fName === 'ENTITY_ID'))
							$fValue = 0;

						if ($fValue instanceof \Bitrix\Main\Type\DateTime)
							$dataFields[$fName] = $fValue->toString();
						else
							$dataFields[$fName] = $fValue;
					}
					unset($fName, $fValue);

					$presetFieldsMap = [];
					$presetFieldsIndex = [];
					$presetFieldsSort = [
						'ID' => [],
						'SORT' => [],
						'FIELD_NAME' => []
					];
					if (is_array($presetList[$fields['PRESET_ID']]))
					{
						if (is_array($presetList[$fields['PRESET_ID']]['SETTINGS']))
						{
							$presetFieldsInfo = $preset->settingsGetFields($presetList[$fields['PRESET_ID']]['SETTINGS']);
							foreach ($presetFieldsInfo as $fieldInfo)
							{
								if (isset($fieldInfo['FIELD_NAME']))
								{
									$presetFieldsSort['ID'][] = isset($fieldInfo['ID']) ? (int)$fieldInfo['ID'] : 0;
									$presetFieldsSort['SORT'][] = isset($fieldInfo['SORT']) ? (int)$fieldInfo['SORT'] : 0;
									$presetFieldsSort['FIELD_NAME'][] = $fieldInfo['FIELD_NAME'];
								}
							}
							unset($presetFieldsInfo, $fieldInfo);
						}
						if (is_array($presetList[$fields['PRESET_ID']]['COUNTRY_ID']))
						{
							$bankDetailCountryId = (int)$presetList[$fields['PRESET_ID']]['COUNTRY_ID'];
						}
					}
					if (!empty($presetFieldsSort['FIELD_NAME']))
					{
						if(array_multisort(
							$presetFieldsSort['SORT'], SORT_ASC, SORT_NUMERIC,
							$presetFieldsSort['ID'], SORT_ASC, SORT_NUMERIC,
							$presetFieldsSort['FIELD_NAME']))
						{
							$presetFieldsMap = array_fill_keys($presetFieldsSort['FIELD_NAME'], true);
							$presetFieldsIndex = array_flip($presetFieldsSort['FIELD_NAME']);
						}
					}
					unset($presetFieldsSort);

					// sort fields by preset
					$viewDataFields = array();
					if (!empty($presetFieldsIndex))
					{
						$dataFieldsSortedIndex = array();
						$dataFieldsUnsortedIndex = array();
						foreach ($dataFields as $dataFieldName => &$dataField)
						{
							if (isset($presetFieldsIndex[$dataFieldName]))
								$dataFieldsSortedIndex[$presetFieldsIndex[$dataFieldName]] = $dataFieldName;
							else
								$dataFieldsUnsortedIndex[] = $dataFieldName;
						}
						unset($dataFieldName, $dataField);
						if (!empty($dataFieldsSortedIndex))
						{
							ksort($dataFieldsSortedIndex, SORT_NUMERIC);
							foreach ($dataFieldsSortedIndex as $dataFieldName)
								$viewDataFields[$dataFieldName] = &$dataFields[$dataFieldName];
							unset($dataFieldName);
						}
						unset($dataFieldsSortedIndex);
						if (!empty($dataFieldsUnsortedIndex))
						{
							foreach ($dataFieldsUnsortedIndex as $dataFieldName)
								$viewDataFields[$dataFieldName] = &$dataFields[$dataFieldName];
							unset($dataFieldName);
						}
						unset($dataFieldsUnsortedIndex);
					}
					else
					{
						$viewDataFields = &$dataFields;
					}

					$requisiteData = array();
					if (!$viewDataOnly)
					{
						$requisiteData['fields'] = $dataFields;
					}
					$fieldsInView = array_intersect_assoc($presetFieldsMap, $fieldsAllowedMap);

					if ($viewFormatted)
					{
						$requisiteData['viewData'] = $requisite->prepareViewDataFormatted($viewDataFields, $fieldsInView);
					}
					else
					{
						$requisiteData['viewData'] = $requisite->prepareViewData($viewDataFields, $fieldsInView);
					}

					unset($presetFields, $fieldsInView);
					if ($bankDetailCountryId <= 0)
						$bankDetailCountryId = \Bitrix\Crm\EntityPreset::getCurrentCountryId();
					$bankDetailsData = self::PrepareBankDetailsData(
						\CCrmOwnerType::Requisite,
						$requisiteId,
						array(
							'VIEW_DATA_ONLY' => $viewDataOnly,
							'SKIP_CHECK_PERMISSION' => true,
							'COUNTRY_ID' => $bankDetailCountryId,
							'BANK_DETAIL_ID_SELECTED' => $bankDetailIdSelected
						)
					);
					if (!$viewDataOnly)
					{
						$requisiteData['bankDetailFieldsList'] = &$bankDetailsData['bankDetailFieldsList'];
					}
					$requisiteData['bankDetailViewDataList'] = &$bankDetailsData['bankDetailViewDataList'];
					$requisiteData['bankDetailIdSelected'] = &$bankDetailsData['bankDetailIdSelected'];
					$requisiteData['formattedAddresses'] = $requisiteAddresses;

					unset($viewDataFields, $bankDetailsData, $requisiteAddress);
					$requisiteDataJson = '';
					$requisiteDataSign = '';
					if (is_array($requisiteData))
					{
						$jsonData = null;
						try
						{
							$jsonData = \Bitrix\Main\Web\Json::encode($requisiteData);
						}
						catch (\Bitrix\Main\SystemException $e)
						{}
						if ($jsonData)
						{
							if ($viewDataOnly)
							{
								$requisiteDataJson = $jsonData;
							}
							else
							{
								$signer = new \Bitrix\Main\Security\Sign\Signer();
								$requisiteDataSign = '';
								try
								{
									$requisiteDataSign = $signer->getSignature(
										$jsonData,
										'crm.requisite.edit-'.$entityTypeId
									);
								}
								catch (\Bitrix\Main\SystemException $e)
								{}

								if (!empty($requisiteDataSign))
								{
									$requisiteDataJson = $jsonData;
								}
							}
						}
						unset($jsonData);
					}

					if (!empty($requisiteDataJson) && ($viewDataOnly || !empty($requisiteDataSign)))
					{
						if (is_array($presetList[$presetID])
							&& isset($presetList[$presetID]['COUNTRY_ID']))
						{
							$presetCountryId = (int)$presetList[$presetID]['COUNTRY_ID'];
						}
						else
						{
							$presetCountryId = 0;
						}
						$resultItem = array(
							'presetId' => $presetID,
							'presetCountryId' => $presetCountryId,
							'requisiteId' => $copyMode ? 0 : $requisiteId,
							'entityTypeId' => $entityTypeId,
							'entityId' => $copyMode ? 0 : $entityId,
							'requisiteData' => $requisiteDataJson
						);

						if (!$viewDataOnly)
						{
							$resultItem['requisiteDataSign'] = $requisiteDataSign;
						}
						$resultItem['selected'] = (!$bSelected && $index === 0
							|| $requisiteIdSelected === intval($requisiteId));
						$result[$index++] = $resultItem;
						unset($resultItem);
					}
					unset($dataFields);
				}
				unset($requisiteId, $fields);
			}
		}
	}

	return $result;
}