1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
extraservicesservice.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Delivery\Rest;
4
5use Bitrix\Main;
6use Bitrix\Sale;
7use Bitrix\Rest\RestException;
8use Bitrix\Rest\AccessException;
9
10if (!Main\Loader::includeModule('rest'))
11{
12 return;
13}
14
20{
21 private const ERROR_EXTRA_SERVICE_ADD = 'ERROR_EXTRA_SERVICE_ADD';
22 private const ERROR_EXTRA_SERVICE_UPDATE = 'ERROR_EXTRA_SERVICE_UPDATE';
23 private const ERROR_EXTRA_SERVICE_DELETE = 'ERROR_EXTRA_SERVICE_DELETE';
24
25 private const ERROR_CHECK_FAILURE = 'ERROR_CHECK_FAILURE';
26 private const ERROR_EXTRA_SERVICE_NOT_FOUND = 'ERROR_EXTRA_SERVICE_NOT_FOUND';
27 private const ERROR_DELIVERY_NOT_FOUND = 'ERROR_DELIVERY_NOT_FOUND';
28
29 private const ENUM_TYPE = 'enum';
30 private const CHECKBOX_TYPE = 'checkbox';
31 private const QUANTITY_TYPE = 'quantity';
32
40 public static function addExtraServices($query, $n, \CRestServer $server)
41 {
43 $params = self::prepareExtraServicesParams($query, $server);
44
45 if (empty($params['DELIVERY_ID']))
46 {
47 throw new RestException('Parameter DELIVERY_ID is not defined', self::ERROR_CHECK_FAILURE);
48 }
49
50 if (empty($params['NAME']))
51 {
52 throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
53 }
54
55 $extraServiceType = $params['TYPE'] ?? null;
56 if (!$extraServiceType)
57 {
58 throw new RestException('Parameter TYPE is not defined', self::ERROR_CHECK_FAILURE);
59 }
60
61 $extraServicesTypeMap = self::getExtraServicesTypeMap();
62 if (empty($extraServicesTypeMap[$extraServiceType]))
63 {
64 throw new RestException('Parameter TYPE is unknown', self::ERROR_CHECK_FAILURE);
65 }
66
67 if ($params['TYPE'] === self::ENUM_TYPE)
68 {
69 if (!isset($params['ITEMS']) || !is_array($params['ITEMS']) || empty($params['ITEMS']))
70 {
71 throw new RestException('Parameter ITEMS must be defined for enum type', self::ERROR_CHECK_FAILURE);
72 }
73 }
74
75 $deliveryService = Sale\Delivery\Services\Manager::getById($params['DELIVERY_ID']);
76 if ($deliveryService)
77 {
78 if (!self::hasAccessToDelivery($deliveryService, $params['APP_ID']))
79 {
80 throw new AccessException();
81 }
82 }
83 else
84 {
85 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
86 }
87
88 if (!empty($params['CODE']))
89 {
90 $extraServiceData = Sale\Delivery\ExtraServices\Table::getList([
91 'select' => ['ID'],
92 'filter' => [
93 '=DELIVERY_ID' => $params['DELIVERY_ID'],
94 '=CODE' => $params['CODE'],
95 ],
96 'limit' => 1,
97 ])->fetch();
98 if ($extraServiceData)
99 {
100 throw new RestException(
101 'CODE "' . $params['CODE'] . '" already exists for this delivery',
102 self::ERROR_CHECK_FAILURE
103 );
104 }
105 }
106
108 'CLASS_NAME' => $extraServicesTypeMap[$params['TYPE']],
109 'DELIVERY_ID' => $params['DELIVERY_ID'],
110 'NAME' => $params['NAME'],
111 'ACTIVE' => (!empty($params['ACTIVE']) && $params['ACTIVE'] === 'Y') ? 'Y' : 'N',
112 'CODE' => $params['CODE'] ?? '',
113 'DESCRIPTION' => $params['DESCRIPTION'] ?? '',
114 'PARAMS' => self::makeInternalParams($params['TYPE'], $params),
115 'SORT' => $params['SORT'] ? (int)$params['SORT'] : 100,
116 'RIGHTS' => [
117 Sale\Delivery\ExtraServices\Manager::RIGHTS_ADMIN_IDX => 'Y',
118 Sale\Delivery\ExtraServices\Manager::RIGHTS_MANAGER_IDX => 'Y',
119 Sale\Delivery\ExtraServices\Manager::RIGHTS_CLIENT_IDX => 'Y',
120 ],
121 ]);
122 $result = Sale\Delivery\ExtraServices\Table::add($fields);
123 if ($result->isSuccess())
124 {
125 return $result->getId();
126 }
127
128 $error = implode("\n", $result->getErrorMessages());
129 throw new RestException($error, self::ERROR_EXTRA_SERVICE_ADD);
130 }
131
139 public static function updateExtraServices($query, $n, \CRestServer $server)
140 {
142 $params = self::prepareExtraServicesParams($query, $server);
143
144 if (empty($params['ID']))
145 {
146 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
147 }
148
149 $extraService = Sale\Delivery\ExtraServices\Table::getList([
150 'select' => ['ID', 'CODE', 'DELIVERY_ID', 'CLASS_NAME'],
151 'filter' => [
152 '=ID' => $params['ID'],
153 ],
154 'limit' => 1,
155 ])->fetch();
156 if ($extraService)
157 {
158 $deliveryService = Sale\Delivery\Services\Manager::getById($extraService['DELIVERY_ID']);
159 if ($deliveryService && !self::hasAccessToDelivery($deliveryService, $params['APP_ID']))
160 {
161 throw new AccessException();
162 }
163
164 $newCode = $params['CODE'] ?? '';
165 if ($newCode)
166 {
167 $existingExtraService = Sale\Delivery\ExtraServices\Table::getList([
168 'select' => ['ID'],
169 'filter' => [
170 '=DELIVERY_ID' => $extraService['DELIVERY_ID'],
171 '=CODE' => $newCode,
172 ],
173 'limit' => 1,
174 ])->fetch();
175 if ($existingExtraService && (int)$existingExtraService['ID'] !== (int)$params['ID'])
176 {
177 throw new RestException(
178 'FIELDS[CODE] "' . $newCode . '" already exists for this delivery',
179 self::ERROR_CHECK_FAILURE
180 );
181 }
182 }
183 }
184 else
185 {
186 throw new RestException('Extra service not found', self::ERROR_EXTRA_SERVICE_NOT_FOUND);
187 }
188
189 $extraServicesTypeMap = array_flip(self::getExtraServicesTypeMap());
190
191 if (!isset($extraServicesTypeMap[$extraService['CLASS_NAME']]))
192 {
193 throw new RestException('Unknown type', self::ERROR_CHECK_FAILURE);
194 }
195 $type = $extraServicesTypeMap[$extraService['CLASS_NAME']];
196
197 $fields = [];
198
199 if (array_key_exists('NAME', $params))
200 {
201 if (empty($params['NAME']))
202 {
203 throw new RestException('Parameter NAME should not be empty', self::ERROR_CHECK_FAILURE);
204 }
205
206 $fields['NAME'] = (string)$params['NAME'];
207 }
208
209 if (array_key_exists('ACTIVE', $params))
210 {
211 $fields['ACTIVE'] = $params['ACTIVE'] === 'Y' ? 'Y' : 'N';
212 }
213
214 if (array_key_exists('DESCRIPTION', $params))
215 {
216 $fields['DESCRIPTION'] = (string)$params['DESCRIPTION'];
217 }
218
219 if (array_key_exists('SORT', $params))
220 {
221 $fields['SORT'] = (int)$params['SORT'];
222 }
223
224 if (array_key_exists('CODE', $params))
225 {
226 $fields['CODE'] = (string)$params['CODE'];
227 }
228
229 $internalParams = self::makeInternalParams($type, $params);
230 if (!is_null($internalParams))
231 {
232 $fields['PARAMS'] = $internalParams;
233 }
234
236
237 $result = Sale\Delivery\ExtraServices\Table::update($params['ID'], $fields);
238 if ($result->isSuccess())
239 {
240 return true;
241 }
242
243 $error = implode("\n", $result->getErrorMessages());
244 throw new RestException($error, self::ERROR_EXTRA_SERVICE_UPDATE);
245 }
246
253 public static function deleteExtraServices($query, $n, \CRestServer $server)
254 {
256 $params = self::prepareExtraServicesParams($query, $server);
257
258 if (empty($params['ID']))
259 {
260 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
261 }
262
263 $extraService = Sale\Delivery\ExtraServices\Table::getById($params['ID'])->fetch();
264 if ($extraService)
265 {
266 $data = Sale\Delivery\Services\Manager::getById($extraService['DELIVERY_ID']);
267 if ($data && !self::hasAccessToDelivery($data, $params['APP_ID']))
268 {
269 throw new AccessException();
270 }
271 }
272 else
273 {
274 throw new RestException('Extra service not found', self::ERROR_EXTRA_SERVICE_NOT_FOUND);
275 }
276
277 $result = Sale\Delivery\ExtraServices\Table::delete($params['ID']);
278 if ($result->isSuccess())
279 {
280 return true;
281 }
282
283 $error = implode("\n", $result->getErrorMessages());
284 throw new RestException($error, self::ERROR_EXTRA_SERVICE_DELETE);
285 }
286
293 public static function get($query, $n, \CRestServer $server): array
294 {
297
298 if (empty($params['DELIVERY_ID']))
299 {
300 throw new RestException('Parameter DELIVERY_ID is not defined', self::ERROR_CHECK_FAILURE);
301 }
302
304 if (!$data)
305 {
306 throw new RestException('Delivery not found', self::ERROR_DELIVERY_NOT_FOUND);
307 }
308
310
311 $extraServices = Sale\Delivery\ExtraServices\Table::getList([
312 'filter' => [
313 '=DELIVERY_ID' => $params['DELIVERY_ID'],
314 '=CLASS_NAME' => $esClasses
315 ],
316 'select' => ['ID', 'CODE', 'NAME', 'DESCRIPTION', 'CLASS_NAME', 'ACTIVE', 'SORT', 'PARAMS'],
317 'order' => [
318 'SORT' => 'ASC',
319 ],
320 ])->fetchAll();
321
322 $extraServicesTypeMap = array_flip(self::getExtraServicesTypeMap());
323
324 foreach ($extraServices as $key => $extraService)
325 {
326 $type = $extraServicesTypeMap[$extraService['CLASS_NAME']];
327 $extraServices[$key]['TYPE'] = $type;
328 unset($extraServices[$key]['CLASS_NAME']);
329
330 if ($type === self::ENUM_TYPE)
331 {
332 if (array_key_exists('PRICES', $extraServices[$key]['PARAMS']))
333 {
334 if (is_array($extraServices[$key]['PARAMS']['PRICES']))
335 {
336 $extraServices[$key]['ITEMS'] = [];
337 foreach ($extraServices[$key]['PARAMS']['PRICES'] as $price)
338 {
339 $extraServices[$key]['ITEMS'][] = [
340 'TITLE' => $price['TITLE'],
341 'CODE' => $price['CODE'],
342 'PRICE' => $price['PRICE'] ?? null,
343 ];
344 }
345 }
346 }
347 }
348 elseif (in_array($type, [self::CHECKBOX_TYPE, self::QUANTITY_TYPE]))
349 {
350 if (array_key_exists('PRICE', $extraServices[$key]['PARAMS']))
351 {
352 $extraServices[$key]['PRICE'] = $extraServices[$key]['PARAMS']['PRICE'];
353 }
354 }
355 unset($extraServices[$key]['PARAMS']);
356 }
357
358 return $extraServices ?: [];
359 }
360
367 private static function makeInternalParams(string $type, array $params): ?array
368 {
369 $result = null;
370
371 if ($type === self::ENUM_TYPE)
372 {
373 if (is_array($params['ITEMS']))
374 {
375 $result = [
376 'PRICES' => [],
377 ];
378
379 foreach ($params['ITEMS'] as $item)
380 {
381 if (!isset($item['TITLE']) || empty($item['TITLE']))
382 {
383 throw new RestException('Item title must be defined for enum item', self::ERROR_CHECK_FAILURE);
384 }
385
386 if (!isset($item['CODE']) || empty($item['CODE']))
387 {
388 throw new RestException('Item code must be defined for enum item', self::ERROR_CHECK_FAILURE);
389 }
390
391 $result['PRICES'][$item['CODE']] = [
392 'TITLE' => $item['TITLE'],
393 'CODE' => $item['CODE'],
394 'PRICE' => isset($item['PRICE']) ? (float)$item['PRICE'] : null,
395 ];
396 }
397 }
398 }
399 elseif (in_array($type, [self::CHECKBOX_TYPE, self::QUANTITY_TYPE]) && array_key_exists('PRICE', $params))
400 {
401 $result['PRICE'] = isset($params['PRICE']) ? (float)$params['PRICE'] : null;
402 }
403
404 return $result;
405 }
406
411 private static function getExtraServicesTypeMap(): array
412 {
413 $result = [];
414
415 $allowedTypes = [
416 self::ENUM_TYPE,
417 self::CHECKBOX_TYPE,
418 self::QUANTITY_TYPE,
419 ];
420 $esClasses = Sale\Delivery\ExtraServices\Manager::getClassesList();
421 foreach ($esClasses as $className)
422 {
423 $classCode = (new \ReflectionClass($className))->getShortName();
424 $type = mb_strtolower($classCode);
425 if (!in_array($type, $allowedTypes, true))
426 {
427 continue;
428 }
429 $result[$type] = $className;
430 }
431
432 return $result;
433 }
434
440 private static function prepareExtraServicesParams(array $data, \CRestServer $server): array
441 {
443 $data['APP_ID'] = $server->getClientId();
444
445 return $data;
446 }
447}
$type
Определения options.php:106
static includeModule($moduleName)
Определения loader.php:67
static prepareParamsToSave($params)
Определения manager.php:183
static prepareIncomingParams(array $data)
Определения baseservice.php:91
static checkDeliveryPermission()
Определения baseservice.php:82
static addExtraServices($query, $n, \CRestServer $server)
Определения extraservicesservice.php:40
static updateExtraServices($query, $n, \CRestServer $server)
Определения extraservicesservice.php:139
static deleteExtraServices($query, $n, \CRestServer $server)
Определения extraservicesservice.php:253
static getById($deliveryId)
Определения manager.php:53
getClientId()
Определения rest.php:362
$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
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
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