45 if (empty(
$params[
'DELIVERY_ID']))
47 throw new RestException(
'Parameter DELIVERY_ID is not defined', self::ERROR_CHECK_FAILURE);
52 throw new RestException(
'Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
55 $extraServiceType =
$params[
'TYPE'] ??
null;
56 if (!$extraServiceType)
58 throw new RestException(
'Parameter TYPE is not defined', self::ERROR_CHECK_FAILURE);
61 $extraServicesTypeMap = self::getExtraServicesTypeMap();
62 if (empty($extraServicesTypeMap[$extraServiceType]))
64 throw new RestException(
'Parameter TYPE is unknown', self::ERROR_CHECK_FAILURE);
67 if (
$params[
'TYPE'] === self::ENUM_TYPE)
71 throw new RestException(
'Parameter ITEMS must be defined for enum type', self::ERROR_CHECK_FAILURE);
78 if (!self::hasAccessToDelivery($deliveryService,
$params[
'APP_ID']))
85 throw new RestException(
'Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
90 $extraServiceData = Sale\Delivery\ExtraServices\Table::getList([
93 '=DELIVERY_ID' =>
$params[
'DELIVERY_ID'],
98 if ($extraServiceData)
101 'CODE "' .
$params[
'CODE'] .
'" already exists for this delivery',
102 self::ERROR_CHECK_FAILURE
108 'CLASS_NAME' => $extraServicesTypeMap[
$params[
'TYPE']],
109 'DELIVERY_ID' =>
$params[
'DELIVERY_ID'],
111 'ACTIVE' => (!empty(
$params[
'ACTIVE']) &&
$params[
'ACTIVE'] ===
'Y') ?
'Y' :
'N',
112 'CODE' =>
$params[
'CODE'] ??
'',
113 'DESCRIPTION' =>
$params[
'DESCRIPTION'] ??
'',
146 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
149 $extraService = Sale\Delivery\ExtraServices\Table::getList([
150 'select' => [
'ID',
'CODE',
'DELIVERY_ID',
'CLASS_NAME'],
159 if ($deliveryService && !self::hasAccessToDelivery($deliveryService,
$params[
'APP_ID']))
164 $newCode =
$params[
'CODE'] ??
'';
167 $existingExtraService = Sale\Delivery\ExtraServices\Table::getList([
170 '=DELIVERY_ID' => $extraService[
'DELIVERY_ID'],
175 if ($existingExtraService && (
int)$existingExtraService[
'ID'] !== (
int)
$params[
'ID'])
178 'FIELDS[CODE] "' . $newCode .
'" already exists for this delivery',
179 self::ERROR_CHECK_FAILURE
186 throw new RestException(
'Extra service not found', self::ERROR_EXTRA_SERVICE_NOT_FOUND);
189 $extraServicesTypeMap = array_flip(self::getExtraServicesTypeMap());
191 if (!isset($extraServicesTypeMap[$extraService[
'CLASS_NAME']]))
193 throw new RestException(
'Unknown type', self::ERROR_CHECK_FAILURE);
195 $type = $extraServicesTypeMap[$extraService[
'CLASS_NAME']];
199 if (array_key_exists(
'NAME',
$params))
203 throw new RestException(
'Parameter NAME should not be empty', self::ERROR_CHECK_FAILURE);
209 if (array_key_exists(
'ACTIVE',
$params))
214 if (array_key_exists(
'DESCRIPTION',
$params))
219 if (array_key_exists(
'SORT',
$params))
224 if (array_key_exists(
'CODE',
$params))
229 $internalParams = self::makeInternalParams(
$type,
$params);
230 if (!is_null($internalParams))
232 $fields[
'PARAMS'] = $internalParams;
260 throw new RestException(
'Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
263 $extraService = Sale\Delivery\ExtraServices\Table::getById(
$params[
'ID'])->fetch();
274 throw new RestException(
'Extra service not found', self::ERROR_EXTRA_SERVICE_NOT_FOUND);
277 $result = Sale\Delivery\ExtraServices\Table::delete(
$params[
'ID']);
298 if (empty(
$params[
'DELIVERY_ID']))
300 throw new RestException(
'Parameter DELIVERY_ID is not defined', self::ERROR_CHECK_FAILURE);
306 throw new RestException(
'Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
311 $extraServices = Sale\Delivery\ExtraServices\Table::getList([
313 '=DELIVERY_ID' =>
$params[
'DELIVERY_ID'],
314 '=CLASS_NAME' => $esClasses
316 'select' => [
'ID',
'CODE',
'NAME',
'DESCRIPTION',
'CLASS_NAME',
'ACTIVE',
'SORT',
'PARAMS'],
322 $extraServicesTypeMap = array_flip(self::getExtraServicesTypeMap());
324 foreach ($extraServices as
$key => $extraService)
326 $type = $extraServicesTypeMap[$extraService[
'CLASS_NAME']];
328 unset($extraServices[
$key][
'CLASS_NAME']);
330 if (
$type === self::ENUM_TYPE)
332 if (array_key_exists(
'PRICES', $extraServices[
$key][
'PARAMS']))
334 if (is_array($extraServices[
$key][
'PARAMS'][
'PRICES']))
336 $extraServices[
$key][
'ITEMS'] = [];
337 foreach ($extraServices[
$key][
'PARAMS'][
'PRICES'] as $price)
339 $extraServices[
$key][
'ITEMS'][] = [
340 'TITLE' => $price[
'TITLE'],
341 'CODE' => $price[
'CODE'],
342 'PRICE' => $price[
'PRICE'] ??
null,
348 elseif (in_array(
$type, [self::CHECKBOX_TYPE, self::QUANTITY_TYPE]))
350 if (array_key_exists(
'PRICE', $extraServices[
$key][
'PARAMS']))
352 $extraServices[
$key][
'PRICE'] = $extraServices[
$key][
'PARAMS'][
'PRICE'];
355 unset($extraServices[
$key][
'PARAMS']);
358 return $extraServices ?: [];