• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/delivery/rest/extraservicesservice.php
  • Класс: BitrixSaleDeliveryRestExtraServicesService
  • Вызов: ExtraServicesService::addExtraServices
static function addExtraServices($query, $n, CRestServer $server)
{
	self::checkDeliveryPermission();
	$params = self::prepareExtraServicesParams($query, $server);

	if (empty($params['DELIVERY_ID']))
	{
		throw new RestException('Parameter DELIVERY_ID is not defined', self::ERROR_CHECK_FAILURE);
	}

	if (empty($params['NAME']))
	{
		throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
	}

	$extraServiceType = $params['TYPE'] ?? null;
	if (!$extraServiceType)
	{
		throw new RestException('Parameter TYPE is not defined', self::ERROR_CHECK_FAILURE);
	}

	$extraServicesTypeMap = self::getExtraServicesTypeMap();
	if (empty($extraServicesTypeMap[$extraServiceType]))
	{
		throw new RestException('Parameter TYPE is unknown', self::ERROR_CHECK_FAILURE);
	}

	if ($params['TYPE'] === self::ENUM_TYPE)
	{
		if (!isset($params['ITEMS']) || !is_array($params['ITEMS']) || empty($params['ITEMS']))
		{
			throw new RestException('Parameter ITEMS must be defined for enum type', self::ERROR_CHECK_FAILURE);
		}
	}

	$deliveryService = SaleDeliveryServicesManager::getById($params['DELIVERY_ID']);
	if ($deliveryService)
	{
		if (!self::hasAccessToDelivery($deliveryService, $params['APP_ID']))
		{
			throw new AccessException();
		}
	}
	else
	{
		throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
	}

	if (!empty($params['CODE']))
	{
		$extraServiceData = SaleDeliveryExtraServicesTable::getList([
			'select' => ['ID'],
			'filter' => [
				'=DELIVERY_ID' => $params['DELIVERY_ID'],
				'=CODE' => $params['CODE'],
			],
			'limit' => 1,
		])->fetch();
		if ($extraServiceData)
		{
			throw new RestException(
				'CODE "' . $params['CODE'] . '" already exists for this delivery',
				self::ERROR_CHECK_FAILURE
			);
		}
	}

	$fields = SaleDeliveryExtraServicesManager::prepareParamsToSave([
		'CLASS_NAME' => $extraServicesTypeMap[$params['TYPE']],
		'DELIVERY_ID' => $params['DELIVERY_ID'],
		'NAME' => $params['NAME'],
		'ACTIVE' => (!empty($params['ACTIVE']) && $params['ACTIVE'] === 'Y') ? 'Y' : 'N',
		'CODE' => $params['CODE'] ?? '',
		'DESCRIPTION' => $params['DESCRIPTION'] ?? '',
		'PARAMS' => self::makeInternalParams($params['TYPE'], $params),
		'SORT' => $params['SORT'] ? (int)$params['SORT'] : 100,
		'RIGHTS' => [
			SaleDeliveryExtraServicesManager::RIGHTS_ADMIN_IDX => 'Y',
			SaleDeliveryExtraServicesManager::RIGHTS_MANAGER_IDX => 'Y',
			SaleDeliveryExtraServicesManager::RIGHTS_CLIENT_IDX => 'Y',
		],
	]);
	$result = SaleDeliveryExtraServicesTable::add($fields);
	if ($result->isSuccess())
	{
		return $result->getId();
	}

	$error = implode("n", $result->getErrorMessages());
	throw new RestException($error, self::ERROR_EXTRA_SERVICE_ADD);
}