1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
shipmentitem.php
См. документацию.
1<?php
2namespace Bitrix\Sale;
3
4use Bitrix\Main;
5use Bitrix\Sale\Internals;
6use Bitrix\Main\Localization\Loc;
7
8Loc::loadMessages(__FILE__);
9
15 implements \IEntityMarker
16{
18 protected $basketItem;
19
22
24 protected static $errors = [];
25
29 public static function getAvailableFields()
30 {
31 return ['QUANTITY', 'RESERVED_QUANTITY', 'XML_ID'];
32 }
33
37 protected static function getMeaningfulFields()
38 {
39 return ['QUANTITY'];
40 }
41
53 {
54 $fields = [
55 'XML_ID' => static::generateXmlId(),
56 'RESERVED_QUANTITY' => 0
57 ];
58
59 if ($basketItem !== null && $basketItem->getId() > 0)
60 {
61 $fields["BASKET_ID"] = $basketItem->getId();
62 }
63
64 $shipmentItem = static::createShipmentItemObject($fields);
65 $shipmentItem->setCollection($collection);
66
67 if ($basketItem !== null)
68 {
69 $shipmentItem->basketItem = $basketItem;
70 }
71
72 return $shipmentItem;
73 }
74
78 protected static function generateXmlId()
79 {
80 return uniqid('bx_');
81 }
82
89 public function delete()
90 {
91 $result = new Result();
92
93 $shipment = $this->getCollection()->getShipment();
94
95 $oldEntityValues = $this->fields->getOriginalValues();
96
97 $event = new Main\Event('sale', "OnBeforeSaleShipmentItemEntityDeleted", [
98 'ENTITY' => $this,
99 'VALUES' => $oldEntityValues,
100 ]);
101 $event->send();
102
103 foreach($event->getResults() as $eventResult)
104 {
105 if($eventResult->getType() == Main\EventResult::ERROR)
106 {
108 Loc::getMessage('SALE_EVENT_ON_BEFORE_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'),
109 'SALE_EVENT_ON_BEFORE_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'
110 );
111 if ($eventResultData = $eventResult->getParameters())
112 {
113 if (isset($eventResultData) && $eventResultData instanceof ResultError)
114 {
115 $errorMsg = $eventResultData;
116 }
117 }
118
119 $result->addError($errorMsg);
120 }
121 }
122
123 if (!$result->isSuccess())
124 {
125 return $result;
126 }
127
128
129 if (!$shipment->isSystem())
130 {
131 if ($shipment->isShipped())
132 {
134 if (!$basketItem = $this->getBasketItem())
135 {
136 throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
137 }
138
139 $result->addError(
140 new ResultError(
141 Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'),
142 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'
143 )
144 );
145
146 return $result;
147 }
148
149 $r = $this->setField("QUANTITY", 0);
150
151 if (!$r->isSuccess())
152 {
153 return $result->addErrors($r->getErrors());
154 }
155 }
156 elseif ($shipment->isSystem() && $this->getQuantity() > 1e-10)
157 {
158 throw new \ErrorException('System shipment not empty');
159 }
160
161 $r = parent::delete();
162 if (!$r->isSuccess())
163 {
164 $result->addErrors($r->getErrors());
165 }
166
167
168 $event = new Main\Event('sale', "OnSaleShipmentItemEntityDeleted", [
169 'ENTITY' => $this,
170 'VALUES' => $oldEntityValues,
171 ]);
172 $event->send();
173
174 foreach($event->getResults() as $eventResult)
175 {
176 if($eventResult->getType() == Main\EventResult::ERROR)
177 {
178 $errorMsg = new ResultError(
179 Loc::getMessage('SALE_EVENT_ON_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'),
180 'SALE_EVENT_ON_SALESHIPMENTITEM_ENTITY_DELETED_ERROR'
181 );
182 $eventResultData = $eventResult->getParameters();
183 if (isset($eventResultData) && $eventResultData instanceof ResultError)
184 {
185 $errorMsg = $eventResultData;
186 }
187
188 $result->addError($errorMsg);
189 }
190 }
191
192 return $result;
193 }
194
198 public function getQuantity()
199 {
200 return (float)$this->getField('QUANTITY');
201 }
202
214 protected function onFieldModify($name, $oldValue, $value)
215 {
216 $result = new Result();
217
218 $shipment = $this->getCollection()->getShipment();
219
220 $order = $shipment->getCollection()->getOrder();
221
222 if (
223 $shipment->isShipped()
224 && $name !== 'XML_ID'
225 )
226 {
227 return $result->addError(
228 new ResultError(
229 Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'),
230 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'
231 )
232 );
233 }
234
235 if ($name == "QUANTITY")
236 {
238 if (!$basketItem = $this->getBasketItem())
239 {
240 if ($value != 0)
241 {
242 throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
243 }
244 }
245
246 $deltaQuantity = $value - $oldValue;
247
248 if ($basketItem && $deltaQuantity > 0)
249 {
250 $systemShipment = $shipment->getCollection()->getSystemShipment();
251
252 $systemBasketItemQuantity = $systemShipment->getBasketItemQuantity($basketItem);
253 if ($systemBasketItemQuantity < abs($deltaQuantity))
254 {
255 $errorBasketCode = $basketItem->getBasketCode();
256
257 if ($basketItem->isBundleChild())
258 {
260 if (!($parentBasketItem = $basketItem->getParentBasketItem()))
261 {
262 throw new Main\ObjectNotFoundException('Entity "Parent Basket Item" not found');
263 }
264
265 $errorBasketCode = $parentBasketItem->getBasketCode();
266 }
267
268 if (isset(static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED']))
269 {
270 static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $basketItem->getQuantity();
271 }
272 else
273 {
274 $result->addError(
275 new ResultError(
276 Loc::getMessage(
277 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY_2',
278 [
279 '#PRODUCT_NAME#' => $basketItem->getField('NAME'),
280 ]
281 ), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY'
282 )
283 );
284
285 static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $basketItem->getQuantity();
286 }
287
288 return $result;
289 }
290 }
291
292
293 if ($basketItem)
294 {
295 if (!$this->isMathActionOnly())
296 {
297 $r = $this->calculateDelivery();
298 if (!$r->isSuccess())
299 {
300 $result->addErrors($r->getErrors());
301 }
302 }
303 }
304
306 $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
307 if (
309 && $basketItem->isReservableItem()
310 )
311 {
312 throw new Main\ObjectNotFoundException('Entity "ShipmentItemStoreCollection" not found');
313 }
314
316 {
317 if ((int)$value === 0)
318 {
319 $basketItemName = Loc::getMessage("SALE_SHIPMENT_ITEM_BASKET_WRONG_BASKET_ITEM");
320 $basketItemProductId = '1';
321
322 if ($basketItem)
323 {
324 $basketItemName = $basketItem->getField('NAME');
325 $basketItemProductId = $basketItem->getProductId();
326 }
327
328 $registry = Registry::getInstance(static::getRegistryType());
329
331 $orderHistory = $registry->getOrderHistoryClassName();
332 $orderHistory::addAction(
333 'SHIPMENT',
334 $order->getId(),
335 'SHIPMENT_ITEM_BASKET_REMOVED',
336 $shipment->getId(),
337 null,
338 [
339 'NAME' => $basketItemName,
340 'PRODUCT_ID' => $basketItemProductId,
341 ]
342 );
343
345 foreach ($shipmentItemStoreCollection as $shipmentItemStore)
346 {
347 $shipmentItemStore->delete();
348 }
349
350 }
351 elseif ($basketItem->isReservableItem())
352 {
353 // check barcodes
354 $r = $shipmentItemStoreCollection->onShipmentItemModify(EventActions::UPDATE, $this, $name, $oldValue, $value);
355 if (!$r->isSuccess())
356 {
357 $result->addErrors($r->getErrors());
358 return $result;
359 }
360
361 $barcodeQuantity = $shipmentItemStoreCollection->getQuantityByBasketCode($basketItem->getBasketCode());
362 if ($barcodeQuantity > $value)
363 {
364 $result->addError(
365 new ResultError(
366 Loc::getMessage('SALE_SHIPMENT_ITEM_BARCODE_MORE_ITEM_QUANTITY'),
367 'BARCODE_MORE_ITEM_QUANTITY'
368 )
369 );
370
371 return $result;
372 }
373 }
374 }
375
376 if (!$basketItem)
377 {
378 return $result;
379 }
380 }
381
382
383 return parent::onFieldModify($name, $oldValue, $value);
384 }
385
391 public function checkMarkingCodeOnDeducted()
392 {
393 $result = new Result();
394
395 if (
396 !$this->getBasketItem()->isReservableItem()
397 || !$this->getBasketItem()->isSupportedMarkingCode()
398 )
399 {
400 return $result;
401 }
402
403 $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
404 if ($shipmentItemStoreCollection && $shipmentItemStoreCollection->count() < $this->getQuantity())
405 {
406 return $result->addError(
407 new Main\Error(
408 Loc::getMessage(
409 'SALE_SHIPMENT_ITEM_MARKING_CODE_LESS_ITEM_QUANTITY_LONG_2',
410 ['#PRODUCT_NAME#' => $this->getBasketItem()->getField('NAME')])
411 )
412 );
413 }
414
416 foreach ($shipmentItemStoreCollection as $itemStore)
417 {
418 if ($itemStore->getMarkingCode() === '')
419 {
420 return $result->addError(
421 new Main\Error(
422 Loc::getMessage(
423 'SALE_SHIPMENT_ITEM_MARKING_CODE_LESS_ITEM_QUANTITY_LONG_2',
424 ['#PRODUCT_NAME#' => $this->getBasketItem()->getField('NAME')])
425 )
426 );
427 }
428 }
429
430 return $result;
431 }
432
439 public function setQuantity($quantity)
440 {
441 return $this->setField('QUANTITY', (float)$quantity);
442 }
443
444 public function setField($name, $value)
445 {
446 if ($name === 'RESERVED_QUANTITY')
447 {
448 $oldValue = $this->getReservedQuantity();
449
450 $result = parent::setField($name, $value);
451 if ($result->isSuccess())
452 {
453 $this->setReserveQuantity($value, $oldValue);
454 }
455
456 return $result;
457 }
458
459 return parent::setField($name, $value);
460 }
461
462 public function setFieldNoDemand($name, $value)
463 {
464 if ($name === 'RESERVED_QUANTITY')
465 {
466 $oldValue = $this->getReservedQuantity();
467
468 parent::setFieldNoDemand($name, $value);
469
470 $this->setReserveQuantity($value, $oldValue);
471
472 return;
473 }
474
475 parent::setFieldNoDemand($name, $value);
476 }
477
478 protected function setReserveQuantity($value, $oldValue)
479 {
480 $result = new Result();
481
482 $basketItem = $this->getBasketItem();
483
484 $reserveCollection = $basketItem->getReserveQuantityCollection();
485 if (!$reserveCollection)
486 {
487 return $result;
488 }
489
490 if ($value - $oldValue > 0) // plus
491 {
492 $reserve = null;
493 foreach ($reserveCollection as $reserve)
494 {
495 break;
496 }
497
498 if ($reserve === null)
499 {
500 $reserve = $reserveCollection->create();
501 }
502
503 $settableReserveQuantity = $reserve->getQuantity() + $value - $oldValue;
504 $reserve->setFieldNoDemand('QUANTITY', $settableReserveQuantity);
505 }
506 else // minus
507 {
508 $delta = abs($value - $oldValue);
509
511 foreach ($reserveCollection as $reserve)
512 {
513 if ($delta === 0)
514 {
515 break;
516 }
517
518 if ($reserve->getQuantity() > $delta)
519 {
520 $settableReserveQuantity = $reserve->getQuantity() - $delta;
521 $reserve->setFieldNoDemand('QUANTITY', $settableReserveQuantity);
522
523 break;
524 }
525
526 $delta -= $reserve->getQuantity();
527 $reserve->deleteNoDemand();
528 }
529 }
530
531 return $result;
532 }
533
537 public function getReservedQuantity(): float
538 {
539 return $this->getField('RESERVED_QUANTITY');
540 }
541
545 public function getBasketId()
546 {
547 return (int)$this->getField('BASKET_ID');
548 }
549
554 public function getBasketCode()
555 {
556 if ($basketItem = $this->getBasketItem())
557 {
558 return $basketItem->getBasketCode();
559 }
560
561 return null;
562 }
563
568 public function getProductId()
569 {
570 $basketItem = $this->getBasketItem();
571 if ($basketItem)
572 {
573 return $basketItem->getProductId();
574 }
575
576 return null;
577 }
578
589 public function save()
590 {
591 $this->checkCallingContext();
592
593 $result = new Result();
594
595 $id = $this->getId();
596 $fields = $this->fields->getValues();
597
598 $shipment = $this->getCollection()->getShipment();
599
601 $order = $shipment->getCollection()->getOrder();
602
603 if ($this->isChanged())
604 {
606 $event = new Main\Event('sale', 'OnBeforeSaleShipmentItemEntitySaved', [
607 'ENTITY' => $this,
608 'VALUES' => $this->fields->getOriginalValues()
609 ]);
610 $event->send();
611 }
612
613 if ($id > 0)
614 {
615 $fields = $this->fields->getChangedValues();
616
617 if (!empty($fields) && is_array($fields))
618 {
619 if (!$shipment->isSystem())
620 {
621 if (isset($fields["QUANTITY"]) && (floatval($fields["QUANTITY"]) == 0))
622 {
623 return $result;
624 }
625 }
626
627 $r = $this->updateInternal($id, $fields);
628 if (!$r->isSuccess())
629 {
630 $registry = Registry::getInstance(static::getRegistryType());
631
633 $orderHistory = $registry->getOrderHistoryClassName();
634 $orderHistory::addAction(
635 'SHIPMENT',
636 $order->getId(),
637 'SHIPMENT_ITEM_UPDATE_ERROR',
638 $id,
639 $this,
640 ["ERROR" => $r->getErrorMessages()]
641 );
642
643 $result->addErrors($r->getErrors());
644 return $result;
645 }
646
647 if ($resultData = $r->getData())
648 $result->setData($resultData);
649 }
650
651 if ($order && $order->getId() > 0)
652 {
653 $registry = Registry::getInstance(static::getRegistryType());
654
656 $orderHistory = $registry->getOrderHistoryClassName();
657 $orderHistory::collectEntityFields('SHIPMENT_ITEM_STORE', $order->getId(), $id);
658 }
659 }
660 else
661 {
662 $fields['ORDER_DELIVERY_ID'] = $this->getParentShipmentId();
663 $this->setFieldNoDemand('ORDER_DELIVERY_ID', $fields['ORDER_DELIVERY_ID']);
664
665 $fields['DATE_INSERT'] = new Main\Type\DateTime();
666 $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']);
667
668 $fields["BASKET_ID"] = $this->basketItem->getId();
669 $this->setFieldNoDemand('BASKET_ID', $fields['BASKET_ID']);
670
671 if ($fields['BASKET_ID'] <= 0)
672 {
673 return $result;
674 }
675
676 if (!isset($fields["QUANTITY"]) || (floatval($fields["QUANTITY"]) == 0))
677 {
678 return $result;
679 }
680
681 $r = $this->addInternal($fields);
682 if (!$r->isSuccess())
683 {
684 $registry = Registry::getInstance(static::getRegistryType());
685
687 $orderHistory = $registry->getOrderHistoryClassName();
688 $orderHistory::addAction(
689 'SHIPMENT',
690 $order->getId(),
691 'SHIPMENT_ITEM_ADD_ERROR',
692 null,
693 $this,
694 ["ERROR" => $r->getErrorMessages()]
695 );
696
697 $result->addErrors($r->getErrors());
698 return $result;
699 }
700
701 if ($resultData = $r->getData())
702 $result->setData($resultData);
703
704 $id = $r->getId();
705 $this->setFieldNoDemand('ID', $id);
706
707 if (!$shipment->isSystem())
708 {
709 $registry = Registry::getInstance(static::getRegistryType());
710
712 $orderHistory = $registry->getOrderHistoryClassName();
713 $orderHistory::addAction(
714 'SHIPMENT',
715 $order->getId(),
716 'SHIPMENT_ITEM_BASKET_ADDED',
717 $shipment->getId(),
718 $this->basketItem,
719 [
720 'QUANTITY' => $this->getQuantity(),
721 ]
722 );
723 }
724 }
725
726 if ($id > 0)
727 {
728 $result->setId($id);
729 }
730
731 if ($this->isChanged())
732 {
734 $event = new Main\Event('sale', 'OnSaleShipmentItemEntitySaved', [
735 'ENTITY' => $this,
736 'VALUES' => $this->fields->getOriginalValues(),
737 ]);
738 $event->send();
739 }
740
741 $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
743 {
744 $r = $shipmentItemStoreCollection->save();
745 if (!$r->isSuccess())
746 {
747 $result->addErrors($r->getErrors());
748 }
749 }
750
751 if ($result->isSuccess())
752 {
753 $registry = Registry::getInstance(static::getRegistryType());
754
756 $orderHistory = $registry->getOrderHistoryClassName();
757 $orderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId(), $id);
758 }
759
760 return $result;
761 }
762
763
764
768 private function checkCallingContext()
769 {
771 if (!$shipmentItemCollection = $this->getCollection())
772 {
773 throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
774 }
775
777 if (!$shipment = $shipmentItemCollection->getShipment())
778 {
779 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
780 }
781
783 if (!$shipmentCollection = $shipment->getCollection())
784 {
785 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
786 }
787
789 if (!$order = $shipmentCollection->getOrder())
790 {
791 throw new Main\ObjectNotFoundException('Entity "Order" not found');
792 }
793
794 if (!$order->isSaveRunning())
795 {
796 trigger_error("Incorrect call to the save process. Use method save() on \Bitrix\Sale\Order entity", E_USER_WARNING);
797 }
798 }
799
800 private function getParentShipmentId()
801 {
803 $collection = $this->getCollection();
804 $shipment = $collection->getShipment();
805 return $shipment->getId();
806 }
807
814 public static function loadForShipment($id)
815 {
816 if (intval($id) <= 0)
817 throw new Main\ArgumentNullException("id");
818
819 $items = [];
820
821 $itemDataList = static::getList([
822 'filter' => [
823 '=ORDER_DELIVERY_ID' => $id,
824 '!BASKET.ID' => null
825 ],
826 'order' => ['DATE_INSERT' => 'ASC', 'ID' => 'ASC']
827 ]);
828
829 while ($itemData = $itemDataList->fetch())
830 $items[] = static::createShipmentItemObject($itemData);
831
832 return $items;
833 }
834
839 private static function createShipmentItemObject(array $itemData = [])
840 {
841 $registry = Registry::getInstance(static::getRegistryType());
842 $shipmentItemClassName = $registry->getShipmentItemClassName();
843
844 return new $shipmentItemClassName($itemData);
845 }
846
850 public static function getRegistryType()
851 {
853 }
854
858 public static function getRegistryEntity()
859 {
861 }
862
867 protected function loadBasketItem()
868 {
870 $collection = $this->getCollection();
871
873 if (!$shipment = $collection->getShipment())
874 {
875 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
876 }
877
879 if (!$shipmentCollection = $shipment->getCollection())
880 {
881 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
882 }
883
885 if (!$order = $shipmentCollection->getOrder())
886 {
887 throw new Main\ObjectNotFoundException('Entity "Order" not found');
888 }
889
891 if (!$basket = $order->getBasket())
892 {
893 throw new Main\ObjectNotFoundException('Entity "Basket" not found');
894 }
895
896 // [performance]
897 // new ShipmentItem binds BasketItem on initialization
898 // here we find BasketItem for already saved ShipmentItem (his ID is equal to CODE)
899 return $basket->getItemByBasketCode($this->getBasketId());
900 }
901
905 public function getBasketItem()
906 {
907 if ($this->basketItem == null)
908 {
909 $this->basketItem = $this->loadBasketItem();
910 }
911
912 return $this->basketItem;
913 }
914
918 public function getShipmentItemStoreCollection()
919 {
920 if (!$this->getBasketItem()->isReservableItem())
921 {
922 return null;
923 }
924
925 if (empty($this->shipmentItemStoreCollection))
926 {
927 $registry = Registry::getInstance(static::getRegistryType());
928
930 $itemStoreCollectionClassName = $registry->getShipmentItemStoreCollectionClassName();
931 $this->shipmentItemStoreCollection = $itemStoreCollectionClassName::load($this);
932 }
933
935 }
936
950 public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null)
951 {
952 $result = new Result();
953
955 {
956 $this->setFieldNoDemand('QUANTITY', $basketItem->getQuantity());
957 }
958
959 return $result;
960 }
961
966 protected function calculateDelivery()
967 {
968 $result = new Result();
969
971 $collection = $this->getCollection();
973 $shipment = $collection->getShipment();
974
976 $shipmentCollection = $shipment->getCollection();
977
979 $order = $shipmentCollection->getOrder();
980
981 if ($order->getId() > 0)
982 {
983 return $result;
984 }
985
986 $deliveryCalculate = $shipment->calculateDelivery();
987 if (!$deliveryCalculate->isSuccess())
988 {
989 $result->addErrors($deliveryCalculate->getErrors());
990 }
991
992 if ($deliveryCalculate->getPrice() > 0)
993 {
994 $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice());
995 }
996
997 return $result;
998 }
999
1000
1007 protected function addChangesToHistory($name, $oldValue = null, $value = null)
1008 {
1009 if ($this->getId() > 0)
1010 {
1012 if (!$shipmentItemCollection = $this->getCollection())
1013 {
1014 throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
1015 }
1016
1018 if (!$shipment = $shipmentItemCollection->getShipment())
1019 {
1020 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
1021 }
1022
1023 if ($shipment->isSystem())
1024 return;
1025
1027 if (!$shipmentCollection = $shipment->getCollection())
1028 {
1029 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
1030 }
1031
1032 $historyFields = [];
1033
1035 if ($basketItem = $this->getBasketItem())
1036 {
1037 $historyFields = [
1038 'NAME' => $basketItem->getField('NAME'),
1039 'PRODUCT_ID' => $basketItem->getField('PRODUCT_ID'),
1040 ];
1041 }
1042
1044 if (($order = $shipmentCollection->getOrder()) && $order->getId() > 0)
1045 {
1046 $registry = Registry::getInstance(static::getRegistryType());
1047
1049 $orderHistory = $registry->getOrderHistoryClassName();
1050 $orderHistory::addField(
1051 'SHIPMENT_ITEM',
1052 $order->getId(),
1053 $name,
1054 $oldValue,
1055 $value,
1056 $this->getId(),
1057 $this,
1058 $historyFields
1059 );
1060 }
1061
1062
1063 }
1064 }
1065
1069 public function isChanged()
1070 {
1071 if (parent::isChanged())
1072 {
1073 return true;
1074 }
1075
1076 $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
1078 }
1079
1085 public function tryReserve()
1086 {
1087 return Internals\Catalog\Provider::tryReserveShipmentItem($this);
1088 }
1089
1095 public function tryUnreserve()
1096 {
1097 return Internals\Catalog\Provider::tryUnreserveShipmentItem($this);
1098 }
1099
1100
1105 public function verify()
1106 {
1107 $result = new Result();
1108
1110 if (!$shipmentItemCollection = $this->getCollection())
1111 {
1112 throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
1113 }
1114
1116 if (!$shipment = $shipmentItemCollection->getShipment())
1117 {
1118 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
1119 }
1120
1121 if (!$this->getBasketItem())
1122 {
1123 $result->addError(
1124 new ResultError(
1125 Loc::getMessage(
1126 'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND',
1127 [
1128 '#BASKET_ITEM_ID#' => $this->getBasketId(),
1129 '#SHIPMENT_ID#' => $shipment->getId(),
1130 '#SHIPMENT_ITEM_ID#' => $this->getId(),
1131 ]
1132 ), 'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND'
1133 )
1134 );
1135
1136 return $result;
1137 }
1138
1139 if ($this->getQuantity() <= 0)
1140 {
1141 $result->addError(
1142 new ResultError(
1143 Loc::getMessage(
1144 'SALE_SHIPMENT_ITEM_ERR_QUANTITY_EMPTY',
1145 [
1146 '#BASKET_ITEM_NAME#' => $this->getBasketItem()->getField('NAME'),
1147 ]
1148 ), 'SALE_SHIPMENT_ITEM_ERR_QUANTITY_EMPTY'
1149 )
1150 );
1151
1152 return $result;
1153 }
1154
1156 if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())
1157 {
1159 foreach ($shipmentItemStoreCollection as $shipmentItemStore)
1160 {
1161 $r = $shipmentItemStore->verify();
1162 if (!$r->isSuccess())
1163 {
1164 $result->addErrors($r->getErrors());
1165 }
1166 }
1167 }
1168
1169 return $result;
1170 }
1171
1178 public static function getList(array $parameters)
1179 {
1180 return Internals\ShipmentItemTable::getList($parameters);
1181 }
1182
1196 public function createClone(\SplObjectStorage $cloneEntity)
1197 {
1198 if ($this->isClone() && $cloneEntity->contains($this))
1199 {
1200 return $cloneEntity[$this];
1201 }
1202
1204 $shipmentItemClone = parent::createClone($cloneEntity);
1205
1207 if ($basketItem = $this->getBasketItem())
1208 {
1209 if (!$cloneEntity->contains($basketItem))
1210 {
1211 $cloneEntity[$basketItem] = $basketItem->createClone($cloneEntity);
1212 }
1213
1214 if ($cloneEntity->contains($basketItem))
1215 {
1216 $shipmentItemClone->basketItem = $cloneEntity[$basketItem];
1217 }
1218 }
1219
1221 if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())
1222 {
1223 if (!$cloneEntity->contains($shipmentItemStoreCollection))
1224 {
1225 $cloneEntity[$shipmentItemStoreCollection] = $shipmentItemStoreCollection->createClone($cloneEntity);
1226 }
1227
1228 if ($cloneEntity->contains($shipmentItemStoreCollection))
1229 {
1230 $shipmentItemClone->shipmentItemStoreCollection = $cloneEntity[$shipmentItemStoreCollection];
1231 }
1232 }
1233
1234 return $shipmentItemClone;
1235 }
1236
1237
1243 public function getErrorEntity($value)
1244 {
1245 static $className = null;
1246 $errorsList = static::getAutoFixErrorsList();
1247 if (is_array($errorsList) && in_array($value, $errorsList))
1248 {
1249 if ($className === null)
1250 $className = static::getClassName();
1251 }
1252 else
1253 {
1255 if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())
1256 {
1257 $className = $shipmentItemStoreCollection->getErrorEntity($value);
1258 }
1259 }
1260
1261 return $className;
1262 }
1263
1264
1270 public function canAutoFixError($value)
1271 {
1272 $autoFix = false;
1273 $errorsList = static::getAutoFixErrorsList();
1274 if (is_array($errorsList) && in_array($value, $errorsList))
1275 {
1276 $autoFix = true;
1277 }
1278 else
1279 {
1281 if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())
1282 {
1283 $autoFix = $shipmentItemStoreCollection->canAutoFixError($value);
1284 }
1285 }
1286
1287 return $autoFix;
1288 }
1289
1293 public function getAutoFixErrorsList()
1294 {
1295 return [];
1296 }
1297
1303 public function tryFixError($code)
1304 {
1305 return new Result();
1306 }
1307
1308 public function canMarked()
1309 {
1310 return false;
1311 }
1312
1313 public function getMarkField()
1314 {
1315 return null;
1316 }
1317
1321 public function clearChanged()
1322 {
1323 parent::clearChanged();
1324
1325 if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection())
1326 {
1327 foreach ($shipmentItemStoreCollection as $shipmentItemStore)
1328 {
1329 $shipmentItemStore->clearChanged();
1330 }
1331 }
1332 }
1333
1339 public function needReserve()
1340 {
1341 return
1342 $this->fields->isChanged('RESERVED_QUANTITY')
1343 || $this->getCollection()->getShipment()->getField('RESERVED') == 'Y'
1344 ;
1345 }
1346
1351 public function getNeedReserveQuantity()
1352 {
1353 if (!$this->needReserve())
1354 {
1355 return 0;
1356 }
1357
1358 $changedFields = $this->fields->getChangedValues();
1359 $originalFields = $this->fields->getOriginalValues();
1360
1361 return $changedFields['RESERVED_QUANTITY'] - $originalFields['RESERVED_QUANTITY'];
1362 }
1363
1369 protected function addInternal(array $data)
1370 {
1372 }
1373
1380 protected function updateInternal($primary, array $data)
1381 {
1383 }
1384
1388 protected static function getFieldsMap()
1389 {
1391 }
1392
1398 public static function getEntityEventName()
1399 {
1400 return 'SaleShipmentItem';
1401 }
1402
1406 public function toArray(): array
1407 {
1408 $result = parent::toArray();
1409
1410 $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
1411 $result['STORES'] = $shipmentItemStoreCollection ? $shipmentItemStoreCollection->toArray() : [];
1412
1413 return $result;
1414 }
1415
1421 public function isShippable(): bool
1422 {
1423 $basketItem = $this->getBasketItem();
1424 if ($basketItem)
1425 {
1426 return !$basketItem->isBundleParent() && !$basketItem->isService();
1427 }
1428
1429 return true;
1430 }
1431}
Определения event.php:5
static getList(array $parameters=array())
Определения datamanager.php:431
static add(array $data)
Определения datamanager.php:877
static update($primary, array $data)
Определения datamanager.php:1256
const ADD
Определения eventactions.php:8
const UPDATE
Определения eventactions.php:9
onFieldModify($name, $oldValue, $value)
Определения collectableentity.php:29
const ENTITY_SHIPMENT_ITEM
Определения registry.php:37
static getInstance($type)
Определения registry.php:183
const REGISTRY_TYPE_ORDER
Определения registry.php:16
$shipmentItemStoreCollection
Определения shipmentitem.php:21
getAutoFixErrorsList()
Определения shipmentitem.php:1293
static getRegistryEntity()
Определения shipmentitem.php:858
updateInternal($primary, array $data)
Определения shipmentitem.php:1380
static getMeaningfulFields()
Определения shipmentitem.php:37
static getFieldsMap()
Определения shipmentitem.php:1388
tryFixError($code)
Определения shipmentitem.php:1303
setQuantity($quantity)
Определения shipmentitem.php:439
static getEntityEventName()
Определения shipmentitem.php:1398
static getAvailableFields()
Определения shipmentitem.php:29
static getList(array $parameters)
Определения shipmentitem.php:1178
addInternal(array $data)
Определения shipmentitem.php:1369
getNeedReserveQuantity()
Определения shipmentitem.php:1351
setFieldNoDemand($name, $value)
Определения shipmentitem.php:462
static $errors
Определения shipmentitem.php:24
static generateXmlId()
Определения shipmentitem.php:78
onBasketModify($action, BasketItem $basketItem, $name=null, $oldValue=null, $value=null)
Определения shipmentitem.php:950
static create(ShipmentItemCollection $collection, BasketItem $basketItem=null)
Определения shipmentitem.php:52
setField($name, $value)
Определения shipmentitem.php:444
static getRegistryType()
Определения shipmentitem.php:850
static loadForShipment($id)
Определения shipmentitem.php:814
getReservedQuantity()
Определения shipmentitem.php:537
$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
canAutoFixError($value)
getErrorEntity($value)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$name
Определения menu_edit.php:35
$value
Определения Param.php:39
trait Error
Определения error.php:11
$order
Определения payment.php:8
$event
Определения prolog_after.php:141
$delta
Определения prolog_main_admin.php:363
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$errorMsg
Определения refund.php:16
$items
Определения template.php:224
$action
Определения file_dialog.php:21
$fields
Определения yandex_run.php:501