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#/',
];
}