1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
deliveryservice.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Delivery\Rest;
4
5use Bitrix\Main,
6 Bitrix\Sale\Delivery,
7 Bitrix\Rest\AccessException,
8 Bitrix\Rest\RestException;
9
10if (!Main\Loader::includeModule('rest'))
11{
12 return;
13}
14
20{
21 private const ERROR_CHECK_FAILURE = 'ERROR_CHECK_FAILURE';
22 private const ERROR_HANDLER_NOT_FOUND = 'ERROR_HANDLER_NOT_FOUND';
23 private const ERROR_DELIVERY_ADD = 'ERROR_DELIVERY_ADD';
24 private const ERROR_DELIVERY_UPDATE = 'ERROR_DELIVERY_UPDATE';
25 private const ERROR_DELIVERY_DELETE = 'ERROR_DELIVERY_DELETE';
26 private const ERROR_DELIVERY_CONFIG_UPDATE = 'ERROR_DELIVERY_CONFIG_UPDATE';
27 private const ERROR_DELIVERY_NOT_FOUND = 'ERROR_DELIVERY_NOT_FOUND';
28
29 private const ALLOWED_DELIVERY_FIELDS = [
30 'ID',
31 'PARENT_ID',
32 'NAME',
33 'ACTIVE',
34 'DESCRIPTION',
35 'SORT',
36 'LOGOTIP',
37 'CURRENCY',
38 ];
39
40 private const DELIVERY_FIELDS_STRING_TYPE = [
41 'NAME',
42 'ACTIVE',
43 'DESCRIPTION',
44 'CURRENCY',
45 ];
46
47 private const DELIVERY_FIELDS_INT_TYPE = [
48 'ID',
49 'PARENT_ID',
50 'SORT',
51 'LOGOTIP',
52 ];
53
59 private static function prepareDeliveryParams(array $data, \CRestServer $server): array
60 {
62 $data['APP_ID'] = $server->getClientId();
63
64 return $data;
65 }
66
70 protected static function getIncomingFieldsMap(): array
71 {
72 return [
73 'LOGOTYPE' => 'LOGOTIP',
74 ];
75 }
76
80 protected static function getOutcomingFieldsMap(): array
81 {
82 return [
83 'LOGOTIP' => 'LOGOTYPE',
84 ];
85 }
86
87 protected static function castOutcomingFieldsData(array $data): array
88 {
89 $result = [];
90
91 foreach (self::DELIVERY_FIELDS_STRING_TYPE as $stringField)
92 {
93 if (!array_key_exists($stringField, $data))
94 {
95 continue;
96 }
97
98 $result[$stringField] = isset($data[$stringField])
99 ? (string)$data[$stringField]
100 : null
101 ;
102 }
103
104 foreach (self::DELIVERY_FIELDS_INT_TYPE as $intField)
105 {
106 if (!array_key_exists($intField, $data))
107 {
108 continue;
109 }
110
111 $result[$intField] = isset($data[$intField])
112 ? (int)$data[$intField]
113 : null
114 ;
115 }
116
117 return $result;
118 }
119
125 private static function checkParamsBeforeDeliveryAdd($params): void
126 {
127 if (empty($params['REST_CODE']))
128 {
129 throw new RestException('Parameter REST_CODE is not defined', self::ERROR_CHECK_FAILURE);
130 }
131
132 if (empty($params['NAME']))
133 {
134 throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
135 }
136
137 if (isset($params['CONFIG']))
138 {
139 if (!is_array($params['CONFIG']))
140 {
141 throw new RestException('Parameter CONFIG must be of array type', self::ERROR_CHECK_FAILURE);
142 }
143
144 self::checkConfig($params['CONFIG']);
145 }
146
147 if (empty($params['CURRENCY']))
148 {
149 throw new RestException('Parameter CURRENCY is not defined', self::ERROR_CHECK_FAILURE);
150 }
151
152 $handlerData = self::getHandlerData($params['REST_CODE']);
153 if ($handlerData)
154 {
155 if ($params['APP_ID'] && !empty($handlerData['APP_ID']) && $handlerData['APP_ID'] !== $params['APP_ID'])
156 {
157 throw new AccessException();
158 }
159 }
160 else
161 {
162 throw new RestException(
163 'Handler "' . $params['REST_CODE'] . '" not exists', self::ERROR_HANDLER_NOT_FOUND
164 );
165 }
166 }
167
168 private static function prepareParamsBeforeDeliveryAdd(array $params): array
169 {
170 $params['CONFIG'] = self::prepareIncomingConfig($params['CONFIG'] ?? [], $params);
171
172 if (isset($params['LOGOTIP']))
173 {
174 $params['LOGOTIP'] = self::saveFile($params['LOGOTIP']);
175 }
176
177 return $params;
178 }
179
185 private static function checkParamsBeforeDeliveryUpdate($params): void
186 {
187 if (empty($params['ID']))
188 {
189 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
190 }
191
192 $data = Delivery\Services\Manager::getById($params['ID']);
193 if (!$data)
194 {
195 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
196 }
197
198 if (array_key_exists('NAME', $params))
199 {
200 if (empty($params['NAME']))
201 {
202 throw new RestException('Parameter NAME should not be empty', self::ERROR_CHECK_FAILURE);
203 }
204 }
205
206 if (!self::hasAccessToDelivery($data, $params['APP_ID']))
207 {
208 throw new AccessException();
209 }
210 }
211
217 private static function checkParamsBeforeDeliveryDelete($params): void
218 {
219 if (empty($params['ID']))
220 {
221 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
222 }
223
224 $data = Delivery\Services\Manager::getById($params['ID']);
225 if (!$data)
226 {
227 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
228 }
229
230 if (!self::hasAccessToDelivery($data, $params['APP_ID']))
231 {
232 throw new AccessException();
233 }
234 }
235
240 private static function checkParamsBeforeDeliveryConfigGet($params): void
241 {
242 if (empty($params['ID']))
243 {
244 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
245 }
246
247 $data = Delivery\Services\Manager::getById($params['ID']);
248 if (!$data)
249 {
250 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
251 }
252
253 if (!self::hasAccessToDelivery($data, $params['APP_ID']))
254 {
255 throw new AccessException();
256 }
257 }
258
259 private static function checkParamsBeforeDeliveryConfigUpdate($params): void
260 {
261 if (empty($params['ID']))
262 {
263 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
264 }
265
266 if (isset($params['CONFIG']))
267 {
268 if (!is_array($params['CONFIG']))
269 {
270 throw new RestException('Parameter CONFIG must be of array type', self::ERROR_CHECK_FAILURE);
271 }
272
273 self::checkConfig($params['CONFIG']);
274 }
275
276 $data = Delivery\Services\Manager::getById($params['ID']);
277 if (!$data)
278 {
279 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
280 }
281
282 if (!self::hasAccessToDelivery($data, $params['APP_ID']))
283 {
284 throw new AccessException();
285 }
286 }
287
288 private static function saveFile($fileContent)
289 {
290 $file = \CRestUtil::saveFile($fileContent);
291 if ($file)
292 {
293 $file['MODULE_ID'] = 'sale';
294 return \CFile::SaveFile($file, 'sale');
295 }
296
297 return null;
298 }
299
307 public static function addDelivery($query, $n, \CRestServer $server)
308 {
310 $params = self::prepareDeliveryParams($query, $server);
311 self::checkParamsBeforeDeliveryAdd($params);
312
313 $params = self::prepareParamsBeforeDeliveryAdd($params);
314
315 $fields = [
316 'NAME' => $params['NAME'],
317 'DESCRIPTION' => $params['DESCRIPTION'] ?? '',
318 'CLASS_NAME' => '\\' . \Sale\Handlers\Delivery\RestHandler::class,
319 'CURRENCY' => $params['CURRENCY'],
320 'SORT' => $params['SORT'] ?? 100,
321 'ACTIVE' => $params['ACTIVE'] ?? 'Y',
322 'CONFIG' => $params['CONFIG'],
323 'LOGOTIP' => $params['LOGOTIP'] ?? null,
324 ];
325
326 $result = Delivery\Services\Manager::add($fields);
327 if ($result->isSuccess())
328 {
329 $parentDelivery = Delivery\Services\Manager::getList([
330 'select' => self::ALLOWED_DELIVERY_FIELDS,
331 'filter' => ['=ID' => (int)$result->getId()],
332 ])->fetch();
333
334 $profiles = [];
335 $profilesDeliveryList = Delivery\Services\Manager::getList([
336 'select' => self::ALLOWED_DELIVERY_FIELDS,
337 'filter' => ['=PARENT_ID' => (int)$result->getId()],
338 ]);
339 while ($profileDelivery = $profilesDeliveryList->fetch())
340 {
341 $profiles[] = self::prepareOutcomingFields($profileDelivery);
342 }
343
344 return [
345 'parent' => $parentDelivery ? self::prepareOutcomingFields($parentDelivery) : null,
346 'profiles' => $profiles,
347 ];
348 }
349
350 $error = implode("\n", $result->getErrorMessages());
351 throw new RestException($error, self::ERROR_DELIVERY_ADD);
352 }
353
361 public static function updateDelivery($query, $n, \CRestServer $server): bool
362 {
364 $params = self::prepareDeliveryParams($query, $server);
365 self::checkParamsBeforeDeliveryUpdate($params);
366
367 $fields = [];
368
369 if (array_key_exists('NAME', $params))
370 {
371 $fields['NAME'] = (string)$params['NAME'];
372 }
373
374 if (array_key_exists('ACTIVE', $params))
375 {
376 $fields['ACTIVE'] = $params['ACTIVE'] === 'Y' ? 'Y' : 'N';
377 }
378
379 if (array_key_exists('DESCRIPTION', $params))
380 {
381 $fields['DESCRIPTION'] = (string)$params['DESCRIPTION'];
382 }
383
384 if (array_key_exists('SORT', $params))
385 {
386 $fields['SORT'] = (int)$params['SORT'];
387 }
388
389 if (array_key_exists('CURRENCY', $params))
390 {
391 $fields['CURRENCY'] = (string)$params['CURRENCY'];
392 }
393
394 if (array_key_exists('LOGOTIP', $params))
395 {
396 $fields['LOGOTIP'] = self::saveFile($params['LOGOTIP']);
397 }
398
400 if ($result->isSuccess())
401 {
402 return true;
403 }
404
405 $error = implode("\n", $result->getErrorMessages());
406 throw new RestException($error, self::ERROR_DELIVERY_UPDATE);
407 }
408
416 public static function deleteDelivery($query, $n, \CRestServer $server): bool
417 {
419 $params = self::prepareDeliveryParams($query, $server);
420 self::checkParamsBeforeDeliveryDelete($params);
421
423 if ($result->isSuccess())
424 {
425 return true;
426 }
427
428 $error = implode("\n", $result->getErrorMessages());
429 throw new RestException($error, self::ERROR_DELIVERY_DELETE);
430 }
431
438 public static function getDeliveryList($query, $n, \CRestServer $server): array
439 {
442 self::checkParamsBeforeDeliveryListGet($params);
443
444 $select =
445 isset($params['SELECT']) && is_array($params['SELECT'])
446 ? array_flip(self::prepareIncomingParams(array_flip($params['SELECT'])))
447 : self::ALLOWED_DELIVERY_FIELDS
448 ;
449
450 $filter = isset($params['FILTER']) && is_array($params['FILTER'])
451 ? $params['FILTER']
452 : []
453 ;
454
455 $order =
456 isset($params['ORDER']) && is_array($params['ORDER'])
458 : []
459 ;
460
461 $result = [];
462 $deliveryListResult = Delivery\Services\Manager::getList([
463 'select' => $select,
464 'filter' => $filter,
465 'order' => $order,
466 ]);
467 while ($delivery = $deliveryListResult->fetch())
468 {
470 }
471
472 return $result;
473 }
474
479 private static function checkParamsBeforeDeliveryListGet(array $params)
480 {
481 $select = isset($params['SELECT']) && is_array($params['SELECT']) ? $params['SELECT'] : [];
482 if ($select)
483 {
484 $select = array_flip(self::prepareIncomingParams(array_flip($select)));
485 $diffSelect = array_diff($select, self::ALLOWED_DELIVERY_FIELDS);
486
487 if ($diffSelect)
488 {
489 throw new RestException(
490 implode(', ', $diffSelect) . ' not allowed for select',
491 self::ERROR_CHECK_FAILURE
492 );
493 }
494 }
495
496 $filter = isset($params['FILTER']) && is_array($params['FILTER']) ? $params['FILTER'] : [];
497 if ($filter)
498 {
499 $filterFields = [];
500 foreach ($filter as $rawName => $value)
501 {
502 $filterField = \CSqlUtil::GetFilterOperation($rawName);
503 if (isset($filterField['FIELD']))
504 {
505 $filterFields[] = $filterField['FIELD'];
506 }
507 }
508
509 $filterFields = array_flip(self::prepareIncomingParams(array_flip($filterFields)));
510 $diffFilter = array_diff($filterFields, self::ALLOWED_DELIVERY_FIELDS);
511 if ($diffFilter)
512 {
513 throw new RestException(
514 implode(', ', $diffFilter) . ' not allowed for filter',
515 self::ERROR_CHECK_FAILURE
516 );
517 }
518 }
519
520 $order =
521 isset($params['ORDER']) && is_array($params['ORDER'])
523 : []
524 ;
525 if ($order)
526 {
527 $diffOrder = array_diff(array_keys($order), self::ALLOWED_DELIVERY_FIELDS);
528 if ($diffOrder)
529 {
530 throw new RestException(
531 implode(', ', $diffOrder) . ' not allowed for order',
532 self::ERROR_CHECK_FAILURE
533 );
534 }
535 }
536 }
537
545 public static function getConfig($query, $n, \CRestServer $server): array
546 {
548 $params = self::prepareDeliveryParams($query, $server);
549 self::checkParamsBeforeDeliveryConfigGet($params);
550
551 $result = [];
552
554 if ($delivery)
555 {
556 if (is_array($delivery['CONFIG']))
557 {
558 $delivery['CONFIG'] = self::prepareOutcomingConfig($delivery['CONFIG']);
559 }
560
561 $result = is_array($delivery['CONFIG']) ? $delivery['CONFIG'] : [];
562 }
563
564 return $result;
565 }
566
574 public static function updateConfig($query, $n, \CRestServer $server): bool
575 {
577 $params = self::prepareDeliveryParams($query, $server);
578 self::checkParamsBeforeDeliveryConfigUpdate($params);
579
581 $handlerCode = self::getRestCodeFromConfig($data['CONFIG']);
582 $params['REST_CODE'] = $handlerCode;
583
585 $params['ID'],
586 [
587 'CONFIG' => self::prepareIncomingConfig($params['CONFIG'] ?? [], $params)
588 ]
589 );
590 if ($result->isSuccess())
591 {
592 return true;
593 }
594
595 $error = implode("\n", $result->getErrorMessages());
596 throw new RestException($error, self::ERROR_DELIVERY_CONFIG_UPDATE);
597 }
598
599 private static function prepareIncomingConfig(array $config, array $params): array
600 {
601 $result = [
602 'MAIN' => [
603 'REST_CODE' => $params['REST_CODE']
604 ],
605 ];
606
607 foreach ($config as $configItem)
608 {
609 $result['MAIN'][$configItem['CODE']] = $configItem['VALUE'];
610 }
611
612 return $result;
613 }
614
619 private static function prepareOutcomingConfig(array $config): array
620 {
621 if (isset($config['MAIN']['REST_CODE']))
622 {
623 unset($config['MAIN']['REST_CODE']);
624 }
625
626 $configItems = isset($config['MAIN']) && is_array($config['MAIN']) ? $config['MAIN'] : [];
627
628 $result = [];
629 foreach ($configItems as $configItemCode => $configItemValue)
630 {
631 $result[] = [
632 'CODE' => $configItemCode,
633 'VALUE' => $configItemValue,
634 ];
635 }
636
637 return $result;
638 }
639
640 private static function checkConfig(array $config): void
641 {
642 $requiredFields = [
643 'CODE',
644 'VALUE',
645 ];
646
647 foreach ($config as $configItem)
648 {
649 foreach ($requiredFields as $requiredField)
650 {
651 if (
652 !isset($configItem[$requiredField])
653 || $configItem[$requiredField] === ''
654 )
655 {
656 throw new RestException(
657 'Config item ' . $requiredField . ' is not specified',
658 self::ERROR_CHECK_FAILURE
659 );
660 }
661 }
662 }
663 }
664}
static includeModule($moduleName)
Определения loader.php:67
static prepareIncomingParams(array $data)
Определения baseservice.php:91
static getHandlerData(string $code)
Определения baseservice.php:196
static checkDeliveryPermission()
Определения baseservice.php:82
static getRestCodeFromConfig(array $config)
Определения baseservice.php:180
static prepareOutcomingFields(array $data)
Определения baseservice.php:100
static getConfig($query, $n, \CRestServer $server)
Определения deliveryservice.php:545
static addDelivery($query, $n, \CRestServer $server)
Определения deliveryservice.php:307
static getDeliveryList($query, $n, \CRestServer $server)
Определения deliveryservice.php:438
static castOutcomingFieldsData(array $data)
Определения deliveryservice.php:87
static deleteDelivery($query, $n, \CRestServer $server)
Определения deliveryservice.php:416
static updateDelivery($query, $n, \CRestServer $server)
Определения deliveryservice.php:361
static updateConfig($query, $n, \CRestServer $server)
Определения deliveryservice.php:574
static getList(array $params=array())
Определения manager.php:82
static delete($id, bool $checkServiceUsage=true)
Определения manager.php:868
static getById($deliveryId)
Определения manager.php:53
static update($id, array $fields)
Определения manager.php:817
getClientId()
Определения rest.php:362
static GetFilterOperation($key)
Определения sql_util.php:45
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$fileContent
Определения file_property.php:47
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
$filterFields
Определения iblock_catalog_list.php:55
$order
Определения payment.php:8
$config
Определения quickway.php:69
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$error
Определения subscription_card_product.php:20
$n
Определения update_log.php:107
$fields
Определения yandex_run.php:501