1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
basketitem.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Rest\Entity;
4
5use Bitrix\Main\Error;
6use Bitrix\Main\Loader;
7use Bitrix\Sale\Helpers\Order\Builder\BasketBuilderRest;
8use Bitrix\Sale\Rest\Attributes;
9use Bitrix\Sale\Result;
10
11class BasketItem extends Base
12{
13 private bool $bitrix24Included;
14 private bool $catalogIncluded;
15
16 public function getFields()
17 {
18 $this->checkModules();
19
20 return $this->getFieldsInfoItem() + $this->getCustomProductFieldsInfo();
21 }
22
23 public function getFieldsCatalogProduct()
24 {
25 $this->checkModules();
26
27 return $this->getFieldsInfoItem() + $this->getFieldsInfoCatalogProduct();
28 }
29
30 private function getFieldsInfoItem(): array
31 {
32 $result = [];
33 $result['ID'] = [
34 'TYPE' => self::TYPE_INT,
35 'ATTRIBUTES' => [
37 ],
38 ];
39 $result['XML_ID'] = [
40 'TYPE' => self::TYPE_STRING,
41 ];
42 $result['ORDER_ID'] = [
43 'TYPE' => self::TYPE_INT,
44 'ATTRIBUTES' => [
47 ],
48 ];
49
50 if (!$this->bitrix24Included)
51 {
52 $result['FUSER_ID'] = [
53 'TYPE' => self::TYPE_INT,
54 'ATTRIBUTES' => [
56 ],
57 ];
58 $result['LID'] = [
59 'TYPE' => self::TYPE_STRING,
60 'ATTRIBUTES' => [
62 ],
63 ];
64 }
65
66 $result['SORT'] = [
67 'TYPE' => self::TYPE_INT,
68 ];
69 $result['PRODUCT_ID'] = [
70 'TYPE' => self::TYPE_INT,
71 'ATTRIBUTES' => [
74 ],
75 ];
76 $result['PRICE'] = [
77 'TYPE' => self::TYPE_FLOAT,
78 ];
79 $result['CURRENCY'] = [
80 'TYPE' => self::TYPE_STRING,
81 'ATTRIBUTES' => [
84 ],
85 ];
86 $result['CUSTOM_PRICE'] = [
87 'TYPE' => self::TYPE_CHAR,
88 'ATTRIBUTES' => [
90 ],
91 ];
92 $result['QUANTITY'] = [
93 'TYPE' => self::TYPE_FLOAT,
94 'ATTRIBUTES' => [
96 ],
97 ];
98 $result['DATE_INSERT'] = [
99 'TYPE' => self::TYPE_DATETIME,
100 'ATTRIBUTES' => [
102 ],
103 ];
104 $result['DATE_UPDATE'] = [
105 'TYPE' => self::TYPE_DATETIME,
106 'ATTRIBUTES' => [
108 ],
109 ];
110 $result['PROPERTIES'] = [
111 'TYPE' => self::TYPE_LIST,
112 'ATTRIBUTES' => [
114 ],
115 ];
116
117 return $result;
118 }
119
120 private function getFieldsInfoCatalogProduct(): array
121 {
122 $result['NAME'] = [
123 'TYPE' => self::TYPE_STRING,
124 'ATTRIBUTES' => [
126 ],
127 ];
128
129 if (!$this->bitrix24Included)
130 {
131 $result['PRODUCT_PRICE_ID'] = [
132 'TYPE' => self::TYPE_INT,
133 'ATTRIBUTES' => [
135 ],
136 ];
137 $result['PRICE_TYPE_ID'] = [
138 'TYPE' => self::TYPE_INT,
139 'ATTRIBUTES' => [
141 ],
142 ];
143 $result['DETAIL_PAGE_URL'] = [
144 'TYPE' => self::TYPE_STRING,
145 'ATTRIBUTES' => [
147 ],
148 ];
149 }
150
151 $result['BASE_PRICE'] = [
152 'TYPE' => self::TYPE_FLOAT,
153 'ATTRIBUTES' => [
155 ],
156 ];
157 $result['DISCOUNT_PRICE'] = [
158 'TYPE' => self::TYPE_FLOAT,
159 'ATTRIBUTES' => [
161 ],
162 ];
163 $result['WEIGHT'] = [
164 'TYPE' => self::TYPE_FLOAT,
165 'ATTRIBUTES' => [
167 ],
168 ];
169 $result['DIMENSIONS'] = [
170 'TYPE' => self::TYPE_STRING,
171 'ATTRIBUTES' => [
173 ],
174 ];
175 $result['MEASURE_CODE'] = [
176 'TYPE' => self::TYPE_STRING,
177 'ATTRIBUTES' => [
179 ],
180 ];
181 $result['MEASURE_NAME'] = [
182 'TYPE' => self::TYPE_STRING,
183 'ATTRIBUTES' => [
185 ],
186 ];
187
188 $result['CAN_BUY'] = [
189 'TYPE' => self::TYPE_CHAR,
190 'ATTRIBUTES' => [
192 ],
193 ];
194
195 $result['VAT_RATE'] = [
196 'TYPE' => self::TYPE_FLOAT,
197 'ATTRIBUTES' => [
199 ],
200 ];
201 $result['VAT_INCLUDED'] = [
202 'TYPE' => self::TYPE_CHAR,
203 'ATTRIBUTES' => [
205 ],
206 ];
207
208 if (
209 $this->catalogIncluded
210 && \Bitrix\Catalog\Config\State::isUsedInventoryManagement()
211 )
212 {
213 $result['BARCODE_MULTI'] = [
214 'TYPE' => self::TYPE_CHAR,
215 'ATTRIBUTES' => [
217 ],
218 ];
219 }
220
221 $result['TYPE'] = [
222 'TYPE' => self::TYPE_INT,
223 'ATTRIBUTES' => [
225 ],
226 ];
227
228 if (!$this->bitrix24Included)
229 {
230 $result['PRODUCT_PROVIDER_CLASS'] = [
231 'TYPE' => self::TYPE_STRING,
232 'ATTRIBUTES' => [
234 ],
235 ];
236 $result['MODULE'] = [
237 'TYPE' => self::TYPE_STRING,
238 'ATTRIBUTES' => [
240 ],
241 ];
242 $result['SET_PARENT_ID'] = [
243 'TYPE' => self::TYPE_INT,
244 'ATTRIBUTES' => [
246 ],
247 ];
248 }
249
250 $result['CATALOG_XML_ID'] = [
251 'TYPE' => self::TYPE_STRING,
252 'ATTRIBUTES' => [
254 ],
255 ];
256 $result['PRODUCT_XML_ID'] = [
257 'TYPE' => self::TYPE_STRING,
258 'ATTRIBUTES' => [
260 ],
261 ];
262
263 return $result;
264 }
265
266 private function getCustomProductFieldsInfo(): array
267 {
268 $result = [];
269 $result['NAME'] = [
270 'TYPE' => self::TYPE_STRING,
271 ];
272
273 if (!$this->bitrix24Included)
274 {
275 $result['PRODUCT_PRICE_ID'] = [
276 'TYPE' => self::TYPE_INT,
277 ];
278 $result['PRICE_TYPE_ID'] = [
279 'TYPE' => self::TYPE_INT,
280 ];
281 $result['DETAIL_PAGE_URL'] = [
282 'TYPE' => self::TYPE_STRING,
283 'ATTRIBUTES' => [
285 ],
286 ];
287 }
288
289 $result['BASE_PRICE'] = [
290 'TYPE' => self::TYPE_FLOAT,
291 ];
292 $result['DISCOUNT_PRICE'] = [
293 'TYPE' => self::TYPE_FLOAT,
294 ];
295 $result['WEIGHT'] = [
296 'TYPE' => self::TYPE_FLOAT,
297 ];
298 $result['DIMENSIONS'] = [
299 'TYPE' => self::TYPE_STRING,
300 ];
301 $result['MEASURE_CODE'] = [
302 'TYPE' => self::TYPE_STRING,
303 ];
304 $result['MEASURE_NAME'] = [
305 'TYPE' => self::TYPE_STRING,
306 ];
307 $result['CAN_BUY'] = [
308 'TYPE' => self::TYPE_CHAR,
309 ];
310 $result['VAT_RATE'] = [
311 'TYPE' => self::TYPE_FLOAT,
312 ];
313 $result['VAT_INCLUDED'] = [
314 'TYPE' => self::TYPE_CHAR,
315 ];
316
317 if (
318 $this->catalogIncluded
319 && \Bitrix\Catalog\Config\State::isUsedInventoryManagement()
320 )
321 {
322 $result['BARCODE_MULTI'] = [
323 'TYPE' => self::TYPE_CHAR,
324 ];
325 }
326 $result['TYPE'] = [
327 'TYPE' => self::TYPE_INT,
328 ];
329
330 if (!$this->bitrix24Included)
331 {
332 $result['PRODUCT_PROVIDER_CLASS'] = [
333 'TYPE' => self::TYPE_STRING,
334 'ATTRIBUTES' => [
336 ],
337 ];
338 $result['MODULE'] = [
339 'TYPE' => self::TYPE_STRING,
340 'ATTRIBUTES' => [
342 ],
343 ];
344 $result['SET_PARENT_ID'] = [
345 'TYPE' => self::TYPE_INT,
346 ];
347 }
348
349 $result['CATALOG_XML_ID'] = [
350 'TYPE' => self::TYPE_STRING,
351 'ATTRIBUTES' => [
353 ],
354 ];
355 $result['PRODUCT_XML_ID'] = [
356 'TYPE' => self::TYPE_STRING,
357 'ATTRIBUTES' => [
359 ],
360 ];
361
362 return $result;
363 }
364
365 public function convertKeysToSnakeCaseArguments($name, $arguments)
366 {
367 if ($name === 'getfieldscatalogproduct')
368 {
369 return $arguments;
370 }
371
372 if (
373 $name === 'addcatalogproduct'
374 || $name === 'updatecatalogproduct'
375 || $name === 'modifycatalogproduct')
376 {
377 if (isset($arguments['fields']))
378 {
379 $fields = $arguments['fields'];
380 if (!empty($fields))
381 {
382 $arguments['fields'] = $this->convertKeysToSnakeCaseFields($fields);
383 }
384 }
385 }
386 else
387 {
388 $arguments = parent::convertKeysToSnakeCaseArguments($name, $arguments);
389 }
390
391 return $arguments;
392 }
393
394 public function checkArguments($name, $arguments)
395 {
396 $r = new Result();
397
398 if ($name === 'getfieldscatalogproduct')
399 {
400 return $r;
401 }
402
403 if ($name === 'addcatalogproduct')
404 {
405 $fields = $arguments['fields'];
406 $fieldsInfo = $this->getListFieldInfo(
408 [
409 'filter' => [
410 'ignoredAttributes' => [
413 ],
414 ],
415 ]
416 );
417
418 if (!empty($fields))
419 {
420 $required = $this->checkRequiredFields($fields, $fieldsInfo);
421 if (!$required->isSuccess())
422 {
423 $r->addError(new Error(
424 'Required fields: ' . implode(', ', $required->getErrorMessages())
425 ));
426 }
427 }
428 }
429 elseif ($name === 'updatecatalogproduct')
430 {
431 $fields = $arguments['fields'];
432 $fieldsInfo = $this->getListFieldInfo(
434 [
435 'filter' => [
436 'ignoredAttributes' => [
440 ],
441 ],
442 ],
443 );
444
445 if (!empty($fields))
446 {
447 $required = $this->checkRequiredFields($fields, $fieldsInfo);
448 if (!$required->isSuccess())
449 {
450 $r->addError(new Error(
451 'Required fields: ' . implode(', ', $required->getErrorMessages())
452 ));
453 }
454 }
455 }
456 else
457 {
458 $r = parent::checkArguments($name, $arguments);
459 }
460
461 return $r;
462 }
463
464 public function internalizeArguments($name, $arguments)
465 {
466 if (
467 $name === 'canbuy'
468 || $name === 'getbaseprice'
469 || $name === 'getbasepricewithvat'
470 || $name === 'getcurrency'
471 || $name === 'getdefaultprice'
472 || $name === 'getdiscountprice'
473 || $name === 'getfinalprice'
474 || $name === 'getinitialprice'
475 || $name === 'getprice'
476 || $name === 'getpricewithvat'
477 || $name === 'getproductid'
478 || $name === 'getquantity'
479 || $name === 'getreservedquantity'
480 || $name === 'getvat'
481 || $name === 'getvatrate'
482 || $name === 'getweight'
483 || $name === 'isbarcodemulti'
484 || $name === 'iscustommulti'
485 || $name === 'iscustomprice'
486 || $name === 'isdelay'
487 || $name === 'isvatinprice'
488 || $name === 'getfieldscatalogproduct'
489 || $name === 'modifycatalogproduct'
490 )
491 {
492 return $arguments;
493 }
494
495 if ($name === 'addcatalogproduct')
496 {
497 $fields = $arguments['fields'];
498 $fieldsInfo = $this->getListFieldInfo(
500 [
501 'filter' => [
502 'ignoredAttributes' => [
505 ],
506 ],
507 ]
508 );
509
510 if (!empty($fields))
511 {
512 $arguments['fields'] = $this->internalizeFields($fields, $fieldsInfo);
513 }
514 }
515 elseif ($name === 'updatecatalogproduct')
516 {
517 $fields = $arguments['fields'];
518 $fieldsInfo = $this->getListFieldInfo(
520 [
521 'filter' => [
522 'ignoredAttributes' => [
526 ],
527 ],
528 ]
529 );
530
531 if (!empty($fields))
532 {
533 $arguments['fields'] = $this->internalizeFields($fields, $fieldsInfo);
534 }
535 }
536 else
537 {
538 parent::internalizeArguments($name, $arguments);
539 }
540
541 return $arguments;
542 }
543
545 {
546 if ($name === 'getfieldscatalogproduct')
547 {
548 return $fields;
549 }
550
551 if (
552 $name === 'addcatalogproduct'
553 || $name === 'updatecatalogproduct'
554 )
555 {
557 }
558 else
559 {
560 parent::externalizeResult($name, $fields);
561 }
562
563 return $fields;
564 }
565
566 protected function isNewItem($fields)
567 {
568 if (!isset($fields['ID']))
569 {
570 return true;
571 }
572 else
573 {
575 }
576 }
577
578 public function internalizeFieldsModify($fields, $fieldsInfo=[])
579 {
580 $result = [];
581 $basketProperties = new BasketProperties();
582
583 $fieldsInfo = empty($fieldsInfo) ? $this->getFields() : $fieldsInfo;
584 $listFieldsInfoAdd = $this->getListFieldInfo(
585 $fieldsInfo,
586 [
587 'filter' => [
588 'ignoredAttributes' => [
591 ],
592 'ignoredFields' => [
593 'ORDER_ID',
594 ],
595 ],
596 ]
597 );
598 $listFieldsInfoUpdate = $this->getListFieldInfo(
599 $fieldsInfo,
600 [
601 'filter' => [
602 'ignoredAttributes' => [
606 ],
607 'skipFields' => [
608 'ID',
609 ],
610 ],
611 ]
612 );
613
614 if (isset($fields['ORDER']['ID']))
615 {
616 $result['ORDER']['ID'] = (int)$fields['ORDER']['ID'];
617 }
618
619 if (isset($fields['ORDER']['BASKET_ITEMS']))
620 {
621 foreach ($fields['ORDER']['BASKET_ITEMS'] as $k => $item)
622 {
623 $result['ORDER']['BASKET_ITEMS'][$k] = $this->internalizeFields($item,
624 $this->isNewItem($item)? $listFieldsInfoAdd:$listFieldsInfoUpdate
625 );
626
627 // n1 - ref shipmentItem.basketId
628 if ($this->isNewItem($item) && isset($item['ID']))
629 {
630 $result['ORDER']['BASKET_ITEMS'][$k]['ID'] = $item['ID'];
631 }
632
633 if (isset($item['PROPERTIES']))
634 {
635 $result['ORDER']['BASKET_ITEMS'][$k]['PROPERTIES'] = $basketProperties->internalizeFieldsModify(['BASKET_ITEM' => ['PROPERTIES'=>$item['PROPERTIES']]])['BASKET_ITEM']['PROPERTIES'];
636 }
637 }
638 }
639
640 return $result;
641 }
642
643 public function externalizeFields($fields)
644 {
645 $basketProperties = new BasketProperties();
646 $basketReservation = new BasketReservation();
647
648 $result = parent::externalizeFields($fields);
649
650 if (isset($fields['PROPERTIES']))
651 {
652 $result['PROPERTIES'] = $basketProperties->externalizeListFields($fields['PROPERTIES']);
653 }
654
655 if (isset($fields['RESERVATIONS']))
656 {
657 $result['RESERVATIONS'] = $basketReservation->externalizeListFields($fields['RESERVATIONS']);
658 }
659
660 return $result;
661 }
662
664 {
665 return $this->externalizeListFields($fields);
666 }
667
668 public function checkFieldsModify($fields)
669 {
670 $r = new Result();
671
672 $emptyFields = [];
673 if (!isset($fields['ORDER']['ID']))
674 {
675 $emptyFields[] = '[order][id]';
676 }
677 if (!isset($fields['ORDER']['BASKET_ITEMS']) || !is_array($fields['ORDER']['BASKET_ITEMS']))
678 {
679 $emptyFields[] = '[order][basketItems][]';
680 }
681
682 if (!empty($emptyFields))
683 {
684 $r->addError(new Error('Required fields: ' . implode(', ', $emptyFields)));
685 }
686 else
687 {
688 $r = parent::checkFieldsModify($fields);
689 }
690
691 return $r;
692 }
693
695 {
696 $r = new Result();
697
698 $basketProperties = new BasketProperties();
699
700 $listFieldsInfoAdd = $this->getListFieldInfo(
701 $this->getFields(),
702 [
703 'filter' => [
704 'ignoredAttributes' => [
707 ],
708 'ignoredFields' => [
709 'ORDER_ID',
710 ],
711 ],
712 ]
713 );
714 $listFieldsInfoUpdate = $this->getListFieldInfo(
715 $this->getFields(),
716 [
717 'filter' => [
718 'ignoredAttributes' => [
722 ],
723 ],
724 ]
725 );
726
727 foreach ($fields['ORDER']['BASKET_ITEMS'] as $k => $item)
728 {
729 $required = $this->checkRequiredFields($item,
730 $this->isNewItem($item)? $listFieldsInfoAdd:$listFieldsInfoUpdate
731 );
732 if (!$required->isSuccess())
733 {
734 $r->addError(new Error(
735 '[basketItems]['.$k.'] - ' . implode(', ', $required->getErrorMessages()) . '.'
736 ));
737 }
738
739 if (isset($item['PROPERTIES']))
740 {
741 $requiredProperties = $basketProperties->checkRequiredFieldsModify([
742 'BASKET_ITEM' => [
743 'PROPERTIES' => $item['PROPERTIES'],
744 ],
745 ]);
746 if (!$requiredProperties->isSuccess())
747 {
748 $requiredPropertiesFields = [];
749 foreach ($requiredProperties->getErrorMessages() as $errorMessage)
750 {
751 $requiredPropertiesFields[] = '[basketItems]['.$k.']'.$errorMessage;
752 }
753 $r->addError(new Error(implode( ' ', $requiredPropertiesFields)));
754 }
755 }
756 }
757 return $r;
758 }
759
760 private function checkModules(): void
761 {
762 if (!isset($this->bitrix24Included))
763 {
764 $this->bitrix24Included = Loader::includeModule('bitrix24');
765 }
766 if (!isset($this->catalogIncluded))
767 {
768 $this->catalogIncluded = Loader::includeModule('catalog');
769 }
770 }
771}
Определения error.php:15
const Hidden
Определения attributes.php:8
const Required
Определения attributes.php:11
const ReadOnly
Определения attributes.php:9
const Immutable
Определения attributes.php:10
externalizeListFields($list)
Определения base.php:625
getListFieldInfo(array $fieldsInfo, $params=[])
Определения base.php:62
internalizeFields($fields, array $fieldsInfo)
Определения base.php:296
convertKeysToSnakeCaseFields($fields)
Определения base.php:101
checkRequiredFields($fields, array $fieldsInfo, $params=[])
Определения base.php:736
externalizeFields($fields)
Определения basketitem.php:643
internalizeArguments($name, $arguments)
Определения basketitem.php:464
checkFieldsModify($fields)
Определения basketitem.php:668
externalizeFieldsModify($fields)
Определения basketitem.php:663
convertKeysToSnakeCaseArguments($name, $arguments)
Определения basketitem.php:365
checkArguments($name, $arguments)
Определения basketitem.php:394
internalizeFieldsModify($fields, $fieldsInfo=[])
Определения basketitem.php:578
externalizeResult($name, $fields)
Определения basketitem.php:544
checkRequiredFieldsModify($fields)
Определения basketitem.php:694
</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
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
$name
Определения menu_edit.php:35
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$k
Определения template_pdf.php:567
$fields
Определения yandex_run.php:501