• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/merger/requisitemerginghelper.php
  • Класс: Bitrix\Crm\Merger\RequisiteMergingHelper
  • Вызов: RequisiteMergingHelper::getEntityRequisites
protected function getEntityRequisites($entityID, $roleID)
{
	$requisiteList = array();

	$requisite = new Crm\EntityRequisite();
	$res = $requisite->getList(
		array(
			'order' => array('SORT', 'ID'),
			'select' => array('ID', 'PRESET_ID'),
			'filter' => array('=ENTITY_TYPE_ID' => $this->entityTypeID, '=ENTITY_ID' => $entityID)
		)
	);
	while ($row = $res->fetch())
	{
		$requisiteId = (int)$row['ID'];
		$presetId = (int)$row['PRESET_ID'];
		if ($requisiteId > 0 && $presetId > 0)
		{
			if (!isset($requisiteList[$requisiteId]))
				$requisiteList[$requisiteId] = array(
					'ID' => $requisiteId,
					'ENTITY_TYPE_ID' => $this->entityTypeID,
					'ENTITY_ID' => $entityID,
					'PRESET_ID' => $presetId
				);
			if (!isset($this->presetList[$presetId]))
				$this->presetList[$presetId] = array('ID' => $presetId);
		}
	}

	$allowedFieldsMap = array_fill_keys(
		array_merge(
			$requisite->getRqFields(),
			$requisite->getUserFields()
		),
		true
	);

	// load presets
	$selectMap = array('ID' => true, 'PRESET_ID' => true);
	if (!empty($this->presetList))
	{
		$preset = new Crm\EntityPreset();
		$res = $preset->getList(array(
			'order' => array('SORT' => 'ASC'),
			'filter' => array(
				'=ENTITY_TYPE_ID' => Crm\EntityPreset::Requisite,
				'@ID' => array_keys($this->presetList)
			),
			'select' => array('ID', 'COUNTRY_ID', 'SETTINGS')
		));
		while ($row = $res->fetch())
		{
			$id = (int)$row['ID'];
			$countryId = (int)$row['COUNTRY_ID'];
			if ($countryId > 0 && is_array($row['SETTINGS']))
			{
				$presetFieldsMap = array();
				foreach ($preset->settingsGetFields($row['SETTINGS']) as $fieldInfo)
				{
					if (isset($fieldInfo['FIELD_NAME']) && isset($allowedFieldsMap[$fieldInfo['FIELD_NAME']]))
						$presetFieldsMap[$fieldInfo['FIELD_NAME']] = true;
				}
				$presetFields = array_keys($presetFieldsMap);
				unset($presetFieldsMap);
				foreach ($presetFields as $fieldName)
				{
					if (!isset($selectMap[$fieldName]))
						$selectMap[$fieldName] = true;
				}
				$this->presetList[$id] = array(
					'ID' => $id,
					'COUNTRY_ID' => $countryId,
					'FIELDS' => $presetFields
				);
			}
		}
	}

	unset($allowedFieldsMap);

	if (!empty($requisiteList))
	{
		// load requisites
		$requisiteBasicFields = array_keys(Crm\EntityRequisite::getBasicFieldsInfo());
		foreach ($requisiteBasicFields as $fieldName)
		{
			if (!isset($selectMap[$fieldName]))
				$selectMap[$fieldName] = true;
		}
		$res = $requisite->getList(
			array(
				'order' => array('SORT', 'ID'),
				'select' => array_keys($selectMap),
				'filter' => array('=ENTITY_TYPE_ID' => $this->entityTypeID, '=ENTITY_ID' => $entityID)
			)
		);
		while ($row = $res->fetch())
		{
			$requisiteId = (int)$row['ID'];
			$presetId = (int)$row['PRESET_ID'];
			if ($requisiteId > 0 && $presetId > 0
				&& isset($requisiteList[$requisiteId]) && isset($this->presetList[$presetId]))
			{
				foreach ($requisiteBasicFields as $fieldName)
				{
					if (!isset($requisiteList[$requisiteId][$fieldName]))
						$requisiteList[$requisiteId][$fieldName] = $row[$fieldName];
				}
				$requisiteList[$requisiteId]['PRESET_COUNTRY_ID'] = $this->presetList[$presetId]['COUNTRY_ID'];

				if (is_array($this->presetList[$presetId]['FIELDS'])
					&& !empty($this->presetList[$presetId]['FIELDS']))
				{
					foreach ($this->presetList[$presetId]['FIELDS'] as $fieldName)
					{
						if ($fieldName === Crm\EntityRequisite::ADDRESS)
						{
							// load addresses
							$requisiteList[$requisiteId][$fieldName] =
								Crm\EntityRequisite::getAddresses($requisiteId);
						}
						else
						{
							$requisiteList[$requisiteId][$fieldName] = $row[$fieldName];
						}
					}
				}
			}
		}

		// load bank detail fields map
		$countryMap = array();
		$bankDetailList = array();
		$bankDetail = new Crm\EntityBankDetail();
		$selectMap = array('ID' => true, 'ENTITY_ID' => true, 'COUNTRY_ID' => true);
		$res = $bankDetail->getList(
			array(
				'order' => array('ENTITY_ID', 'SORT', 'ID'),
				'filter' => array(
					'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
					'@ENTITY_ID' => array_keys($requisiteList)
				),
				'select' => array('ID', 'ENTITY_ID', 'COUNTRY_ID')
			)
		);
		while ($row = $res->fetch())
		{
			$bankDetailId = (int)$row['ID'];
			$requisiteId = (int)$row['ENTITY_ID'];
			$countryId = (int)$row['COUNTRY_ID'];
			if ($countryId <= 0 && $requisiteId > 0 && is_array($requisiteList[$requisiteId])
				&& isset($requisiteList[$requisiteId]['PRESET_COUNTRY_ID']))
			{
				$countryId = (int)$requisiteList[$requisiteId]['PRESET_COUNTRY_ID'];
			}
			if ($bankDetailId > 0 && $requisiteId > 0 && $countryId > 0)
			{
				if (!isset($bankDetailList[$bankDetailId]))
					$bankDetailList[$bankDetailId] = array(
						'ID' => $bankDetailId,
						'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
						'ENTITY_ID' => $requisiteId,
						'COUNTRY_ID' => $countryId
					);
				if (!isset($countryMap[$countryId]))
					$countryMap[$countryId] = array();
			}
		}
		foreach ($bankDetail->getRqFieldByCountry() as $countryId => $fields)
		{
			$fields[] = 'COMMENTS';
			if (isset($countryMap[$countryId]))
			{
				foreach ($fields as $fieldName)
				{
					if (!isset($selectMap[$fieldName]))
						$selectMap[$fieldName] = true;
				}
				if (!isset($this->bankDetailFieldsMap[$countryId]))
					$this->bankDetailFieldsMap[$countryId] = $fields;
			}
		}
		unset($countryMap);

		// load bank details
		$bankDetailBasicFields = array_keys(Crm\EntityBankDetail::getBasicFieldsInfo());
		foreach ($bankDetailBasicFields as $fieldName)
		{
			if (!isset($selectMap[$fieldName]))
				$selectMap[$fieldName] = true;
		}
		$res = $bankDetail->getList(
			array(
				'order' => array('ENTITY_ID', 'SORT', 'ID'),
				'filter' => array(
					'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
					'@ENTITY_ID' => array_keys($requisiteList)
				),
				'select' => array_keys($selectMap)
			)
		);
		while ($row = $res->fetch())
		{
			$bankDetailId = (int)$row['ID'];
			if (is_array($bankDetailList[$bankDetailId]))
			{
				foreach ($bankDetailBasicFields as $fieldName)
				{
					if (!isset($bankDetailList[$bankDetailId][$fieldName]))
						$bankDetailList[$bankDetailId][$fieldName] = $row[$fieldName];
				}
				foreach ($this->bankDetailFieldsMap[$bankDetailList[$bankDetailId]['COUNTRY_ID']] as $fieldName)
					$bankDetailList[$bankDetailId][$fieldName] = $row[$fieldName];
				$requisiteId = $bankDetailList[$bankDetailId]['ENTITY_ID'];
				if (!is_array($requisiteList[$requisiteId]['BD']))
					$requisiteList[$requisiteId]['BD'] = array();
				$requisiteList[$requisiteId]['BD'][$bankDetailId] = $bankDetailList[$bankDetailId];
			}
		}
		unset($bankDetailList);
	}

	return $requisiteList;
}