• Модуль: salescenter
  • Путь к файлу: ~/bitrix/modules/salescenter/lib/controller/deliveryselector.php
  • Класс: BitrixSalesCenterControllerDeliverySelector
  • Вызов: DeliverySelector::getInitializationDataAction
public function getInitializationDataAction(int $personTypeId, int $responsibleId = 0, array $excludedServiceIds = [])
{
	if (!Loader::includeModule('sale'))
	{
		$this->addError(new Error('sale module is not installed'));
		return null;
	}

	$activeServices = DeliveryServicesManager::getActiveList();
	$installedHandlers = (new HandlersRepository())
		->getCollection()
		->getInstalledItems();

	$flatServices = [];
	foreach ($installedHandlers as $installedHandler)
	{
		foreach ($activeServices as $service)
		{
			$isChild = false;
			if ($service['PARENT_ID']
				&& ($parentServiceFields = DeliveryServicesManager::getById($service['PARENT_ID']))
			)
			{
				$serviceClassName = $parentServiceFields['CLASS_NAME'];
				$isChild = true;
			}
			else
			{
				$serviceClassName = $service['CLASS_NAME'];
			}

			if ($serviceClassName !== $installedHandler->getHandlerClass())
			{
				continue;
			}

			if (!$isChild && $installedHandler instanceof IRestHandler
				&& $installedHandler->getRestHandlerCode() !== $service['CONFIG']['MAIN']['REST_CODE']
			)
			{
				continue;
			}

			if (in_array($service['ID'], $excludedServiceIds))
			{
				continue;
			}

			$logoParams = CFile::_GetImgParams($service['LOGOTIP']);
			$deliveryService = DeliveryServicesManager::getObjectById($service['ID']);

			$flatServices[$service['ID']] = [
				'id' => $service['ID'],
				'name' => $service['NAME'],
				'description' => $service['DESCRIPTION'],
				'title' => $service['ID'] != DeliveryServicesEmptyDeliveryService::getEmptyDeliveryServiceId()
					? Loc::getMessage('SALESCENTER_CONTROLLER_DELIVERY_SELECTOR_DELIVERY_SERVICE')
					: '',

				'restrictions' => $this->makeServiceRestrictions($service['CODE']),
				'tags' => $deliveryService ? $deliveryService->getTags() : [],
				'code' => $isChild ? $service['CODE'] : $installedHandler->getCode(),
				'logo' => $logoParams
					? [
						'src' => $logoParams['SRC'],
						'width' => $logoParams['WIDTH'],
						'height' => $logoParams['HEIGHT'],
					]
					: null,
				'parentId' => (int)$service['PARENT_ID'],
				'profiles' => [],
			];
		}
	}

	$deliveryServiceIds = array_keys($flatServices);

	$services = array_filter(
		$flatServices,
		function ($service)
		{
			return $service['parentId'] === 0;
		}
	);
	foreach ($flatServices as $serviceId => $service)
	{
		if ($service['parentId'] === 0)
		{
			continue;
		}
		if (!isset($services[$service['parentId']]))
		{
			continue;
		}
		$services[$service['parentId']]['profiles'][] = $service;
	}

	$services = array_values($services);

	/**
	 * Related properties
	 */
	$properties = [];
	$supportedPropertyTypes = ['ADDRESS', 'STRING'];

	$relatedProperties = OrderPropsRelationTable::getList(
		[
			'filter' => [
				'ENTITY_TYPE' => 'D',
				'ENTITY_ID' => $deliveryServiceIds,
				'lPROPERTY.TYPE' => $supportedPropertyTypes,
				'lPROPERTY.PERSON_TYPE_ID' => $personTypeId,
			],
			'select' => [
				'*',
				'PROPERTY_PERSON_TYPE_ID' => 'lPROPERTY.PERSON_TYPE_ID',
				'PROPERTY_TYPE' => 'lPROPERTY.TYPE',
				'PROPERTY_DEFAULT_VALUE' => 'lPROPERTY.DEFAULT_VALUE',
				'PROPERTY_SETTINGS' => 'lPROPERTY.SETTINGS',
				'PROPERTY_CODE' => 'lPROPERTY.CODE',
				'PROPERTY_REQUIRED' => 'lPROPERTY.REQUIRED',
				'PROPERTY_NAME' => 'lPROPERTY.NAME',
				'PROPERTY_IS_ADDRESS_FROM' => 'lPROPERTY.IS_ADDRESS_FROM',
				'PROPERTY_IS_ADDRESS_TO' => 'lPROPERTY.IS_ADDRESS_TO',
			]
		]
	);
	foreach ($relatedProperties as $relatedProperty)
	{
		if (isset($properties[$relatedProperty['PROPERTY_ID']]))
		{
			$properties[$relatedProperty['PROPERTY_ID']]['deliveryServiceIds'][] = $relatedProperty['ENTITY_ID'];
		}
		else
		{
			$properties[$relatedProperty['PROPERTY_ID']] = [
				'id' => $relatedProperty['PROPERTY_ID'],
				'code' => $relatedProperty['PROPERTY_CODE'],
				'type' => $relatedProperty['PROPERTY_TYPE'],
				'isAddressFrom' => $relatedProperty['PROPERTY_IS_ADDRESS_FROM'] === 'Y',
				'isAddressTo' => $relatedProperty['PROPERTY_IS_ADDRESS_TO'] === 'Y',
				'required' => $relatedProperty['PROPERTY_REQUIRED'] === 'Y',
				'initValue' => $relatedProperty['PROPERTY_DEFAULT_VALUE'],
				'settings' => empty($relatedProperty['PROPERTY_SETTINGS']) ? null : $relatedProperty['PROPERTY_SETTINGS'],
				'name' => $relatedProperty['PROPERTY_NAME'],
				'deliveryServiceIds' => [$relatedProperty['ENTITY_ID']],
			];
		}
	}

	return [
		'services' => $services,
		'properties' => array_values($properties),
		'extraServices' => $this->getExtraServices($deliveryServiceIds),
		'deliverySettingsUrl' => $this->getDeliverySettingsUrl(),
		'responsible' => $this->getResponsibleData($responsibleId),
		'userPageTemplate' => Option::get(
				'socialnetwork',
				'user_page',
				SITE_DIR.'company/personal/',
				SITE_ID
			).'user/#user_id#/',
	];
}