1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
shipmentitemcollection.php
См. документацию.
1<?php
8namespace Bitrix\Sale;
9
10use Bitrix\Main;
11use Bitrix\Main\Localization\Loc;
12use Bitrix\Sale\Internals;
13use Bitrix\Sale\Internals\CollectableEntity;
14
15Loc::loadMessages(__FILE__);
16
19{
21 protected $shipment;
22
24
28 protected function getEntityParent()
29 {
30 return $this->getShipment();
31 }
32
42 public function resetCollection(Basket $basket)
43 {
44 if ($this->getShipment()->isShipped())
45 {
47 }
48
49 if (!empty($this->collection))
50 {
52 foreach ($this->collection as $shipmentItem)
53 {
54 $shipmentItem->setFieldNoDemand('QUANTITY', 0);
55 $shipmentItem->delete();
56 }
57 }
58
59 $quantityList = [];
60
62 $shipmentCollection = $this->getShipment()->getCollection();
63
65 foreach ($basket as $basketItem)
66 {
67 $quantityList[$basketItem->getBasketCode()] = $shipmentCollection->getBasketItemDistributedQuantity($basketItem);
68 }
69
71 $itemClassName = static::getItemCollectionClassName();
72
74 foreach ($basket as $basketItem)
75 {
76 $shipmentItem = $itemClassName::create($this, $basketItem);
77 $this->addItem($shipmentItem);
78
79 $basketItemQuantity = 0;
80
81 if (array_key_exists($basketItem->getBasketCode(), $quantityList))
82 {
83 $basketItemQuantity = $quantityList[$basketItem->getBasketCode()];
84 }
85
86 $quantity = $basketItem->getQuantity() - $basketItemQuantity;
87
88 $shipmentItem->setFieldNoDemand("QUANTITY", $quantity);
89
90 if ($basketItem->isBundleParent())
91 {
92 $this->addBundleToCollection($basketItem);
93 }
94 }
95 }
96
106 public function createItem(BasketItem $basketItem)
107 {
108 if ($this->getShipment()->isShipped())
109 {
110 return null;
111 }
112
113 $shipmentItem = $this->getItemByBasketCode($basketItem->getBasketCode());
114 if ($shipmentItem !== null)
115 {
116 return $shipmentItem;
117 }
118
120 $itemClassName = static::getItemCollectionClassName();
121
122 $shipmentItem = $itemClassName::create($this, $basketItem);
123
124 $shipmentItem->setCollection($this);
125 $this->addItem($shipmentItem);
126
127 $shipment = $this->getShipment();
128
129 if ($basketItem->isBundleParent() && !$shipment->isSystem())
130 {
131 $this->addBundleToCollection($basketItem);
132 }
133
134 return $shipmentItem;
135 }
136
145 private function addBundleToCollection(BasketItem $basketItem)
146 {
147 $result = new Result();
148
150 if (!$bundleCollection = $basketItem->getBundleCollection())
151 {
152 throw new Main\ObjectNotFoundException('Entity "BundleCollection" not found');
153 }
154
155 if ($bundleCollection->getOrder() === null)
156 {
158 if ($basketCollection = $basketItem->getCollection())
159 {
160 if ($order = $basketCollection->getOrder())
161 {
162 $bundleCollection->setOrder($order);
163 }
164 }
165 }
166
168 $shipment = $this->getShipment();
169
171 if (!$shipmentCollection = $shipment->getCollection())
172 {
173 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
174 }
175
177 if (!$systemShipment = $shipmentCollection->getSystemShipment())
178 {
179 throw new Main\ObjectNotFoundException('Entity "System Shipment" not found');
180 }
181
183 if (!$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection())
184 {
185 throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
186 }
187
188 $baseQuantity = $basketItem->getQuantity();
189
191 if ($systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))
192 {
193 $baseQuantity = $systemShipmentItem->getQuantity();
194 }
195
196 $bundleBaseQuantity = $basketItem->getBundleBaseQuantity();
197
199 foreach ($bundleCollection as $bundleBasketItem)
200 {
201
202 if ($this->isExistsBasketItem($bundleBasketItem))
203 {
204 continue;
205 }
206
207 $bundleProductId = $bundleBasketItem->getProductId();
208
209 if (!isset($bundleBaseQuantity[$bundleProductId]))
210 throw new Main\ArgumentOutOfRangeException("bundle product id");
211
212 $quantity = $bundleBaseQuantity[$bundleProductId] * $baseQuantity;
213
214 if ($quantity == 0)
215 continue;
216
218 $itemClassName = static::getItemCollectionClassName();
219 $shipmentItemBundle = $itemClassName::create($this, $bundleBasketItem);
220 $this->addItem($shipmentItemBundle);
221
222 if ($shipment->isSystem())
223 {
224 $shipmentItemBundle->setFieldNoDemand('QUANTITY', $quantity);
225 }
226 else
227 {
228 $r = $shipmentItemBundle->setQuantity($quantity);
229 if (!$r->isSuccess())
230 {
231 $result->addErrors($r->getErrors());
232 }
233 }
234 }
235
236 return $result;
237 }
238
243 protected function addItem(Internals\CollectableEntity $shipmentItem)
244 {
245 parent::addItem($shipmentItem);
246
248 $shipment = $this->getShipment();
249 $shipment->onShipmentItemCollectionModify(EventActions::ADD, $shipmentItem);
250 }
251
252 protected function bindItem(CollectableEntity $shipmentItem): CollectableEntity
253 {
254 $item = parent::bindItem($shipmentItem);
255
256 $this->shipmentItemIndexMap[$shipmentItem->getBasketCode()] = $shipmentItem->getInternalIndex();
257
258 return $item;
259 }
260
261 protected function createIndex()
262 {
263 $index = parent::createIndex();
264 $shipment = $this->getShipment();
265 return $shipment->getInternalIndex()."_".$index;
266 }
267
276 public function deleteItem($index)
277 {
278 $oldShipmentItem = parent::deleteItem($index);
279
280 unset($this->shipmentItemIndexMap[$oldShipmentItem->getBasketCode()]);
281
282 $shipment = $this->getShipment();
283 $shipment->onShipmentItemCollectionModify(EventActions::DELETE, $oldShipmentItem);
284 }
285
295 public function onItemModify(Internals\CollectableEntity $item, $name = null, $oldValue = null, $value = null)
296 {
297 $shipment = $this->getShipment();
298 return $shipment->onShipmentItemCollectionModify(EventActions::UPDATE, $item, $name, $oldValue, $value);
299 }
300
305 public function getItemByBasketCode($itemCode)
306 {
307 if (
308 isset($this->shipmentItemIndexMap[$itemCode])
309 && isset($this->collection[$this->shipmentItemIndexMap[$itemCode]])
310 )
311 {
312 return $this->collection[$this->shipmentItemIndexMap[$itemCode]];
313 }
314
315 return null;
316 }
317
322 public function getItemByBasketId($itemId)
323 {
324 $itemId = (int)$itemId;
325 foreach ($this->collection as $shippedItem)
326 {
328 $shippedItemId = (int)($shippedItem->getBasketId());
329 if ($itemId === $shippedItemId)
330 return $shippedItem;
331 }
332
333 return null;
334 }
335
341 public function getShippableItems()
342 {
343 $callback = function (ShipmentItem $shipmentItem)
344 {
345 return $shipmentItem->isShippable();
346 };
347
348 return new Internals\CollectionFilterIterator($this->getIterator(), $callback);
349 }
350
354 public function getSellableItems()
355 {
356 $callback = function (ShipmentItem $shipmentItem)
357 {
358 $basketItem = $shipmentItem->getBasketItem();
359 if ($basketItem)
360 return !$basketItem->isBundleChild();
361
362 return true;
363 };
364
365 return new Internals\CollectionFilterIterator($this->getIterator(), $callback);
366 }
367
372 public function getPrice()
373 {
374 $price = 0;
375
376 $sellableItems = $this->getSellableItems();
378 foreach ($sellableItems as $shipmentItem)
379 {
381 if ($basketItem = $shipmentItem->getBasketItem())
382 {
383 $price += PriceMaths::roundPrecision($basketItem->getPriceWithVat() * $shipmentItem->getQuantity());
384 }
385 }
386
387 return $price;
388 }
389
394 public function getWeight() : float
395 {
396 $weight = 0;
397
399 foreach ($this->getShippableItems() as $shipmentItem)
400 {
401 $basketItem = $shipmentItem->getBasketItem();
402
403 $weight += $basketItem->getWeight() * $shipmentItem->getQuantity();
404 }
405
406 return $weight;
407 }
408
412 public function getShipment()
413 {
414 return $this->shipment;
415 }
416
424 public function save()
425 {
426 $result = new Main\Entity\Result();
427
429 if (!$shipment = $this->getShipment())
430 {
431 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
432 }
433
435 if (!$shipmentCollection = $shipment->getCollection())
436 {
437 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
438 }
439
441 if (!$order = $shipmentCollection->getOrder())
442 {
443 throw new Main\ObjectNotFoundException('Entity "Order" not found');
444 }
445
446 $itemsFromDb = array();
447 if ($this->getShipment()->getId() > 0)
448 {
449 $itemsFromDbList = static::getList(
450 array(
451 "filter" => array("ORDER_DELIVERY_ID" => $this->getShipment()->getId()),
452 "select" => array("ID", 'BASKET_ID')
453 )
454 );
455 while ($itemsFromDbItem = $itemsFromDbList->fetch())
456 $itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
457 }
458
459
461 foreach ($this->collection as $shipmentItem)
462 {
464 if (!$basketItem = $shipmentItem->getBasketItem())
465 {
466 continue;
467 }
468
469 if ($basketItem->isBundleParent())
470 {
471 $this->addBundleToCollection($basketItem);
472 }
473 }
474
476 if (!$shipment = $this->getShipment())
477 {
478 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
479 }
480
481 $changeMeaningfulFields = array(
482 "QUANTITY",
483 "RESERVED_QUANTITY",
484 );
485
487 foreach ($this->collection as $shipmentItem)
488 {
490 if (!$basketItem = $shipmentItem->getBasketItem())
491 {
492 continue;
493 }
494
495 $isNew = (bool)($shipmentItem->getId() <= 0);
496 $isChanged = $shipmentItem->isChanged();
497
498 if ($order->getId() > 0 && $isChanged)
499 {
500 $logFields = array(
501 "BASKET_ID" => $basketItem->getId(),
502 "BASKET_ITEM_NAME" => $basketItem->getField("NAME"),
503 "BASKET_ITEM_PRODUCT_ID" => $basketItem->getField("PRODUCT_ID"),
504 "ORDER_DELIVERY_ID" => $shipmentItem->getField("ORDER_DELIVERY_ID"),
505 );
506
507 $fields = $shipmentItem->getFields();
508 $originalValues = $fields->getOriginalValues();
509
510 foreach($originalValues as $originalFieldName => $originalFieldValue)
511 {
512 if (in_array($originalFieldName, $changeMeaningfulFields) && $shipmentItem->getField($originalFieldName) != $originalFieldValue)
513 {
514 $logFields[$originalFieldName] = $shipmentItem->getField($originalFieldName);
515 if (!$isNew)
516 $logFields['OLD_'.$originalFieldName] = $originalFieldValue;
517 }
518 }
519 }
520
521 $r = $shipmentItem->save();
522 if ($r->isSuccess())
523 {
524 if ($order->getId() > 0 && $isChanged)
525 {
526 $registry = Registry::getInstance(static::getRegistryType());
527
529 $orderHistory = $registry->getOrderHistoryClassName();
530 $orderHistory::addLog(
531 'SHIPMENT_ITEM',
532 $order->getId(),
533 $isNew ? 'SHIPMENT_ITEM_ADD' : 'SHIPMENT_ITEM_UPDATE',
534 $shipmentItem->getId(),
535 $shipmentItem,
536 $logFields,
537 $orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
538 );
539 }
540 }
541 else
542 {
543 $result->addErrors($r->getErrors());
544 }
545
546 if (isset($itemsFromDb[$shipmentItem->getId()]))
547 {
548 unset($itemsFromDb[$shipmentItem->getId()]);
549 }
550 }
551
553 if (!$basket = $order->getBasket())
554 {
555 throw new Main\ObjectNotFoundException('Entity "Basket" not found');
556 }
557
558 foreach ($itemsFromDb as $k => $v)
559 {
560 $v['ENTITY_REGISTRY_TYPE'] = static::getRegistryType();
561
563 $event = new Main\Event('sale', "OnBeforeSaleShipmentItemDeleted", array(
564 'VALUES' => $v,
565 ));
566 $event->send();
567
568 static::deleteInternal($k);
569
571 $event = new Main\Event('sale', "OnSaleShipmentItemDeleted", array(
572 'VALUES' => $v,
573 ));
574 $event->send();
575
577 if ($basketItem = $basket->getItemById($k))
578 {
579 $registry = Registry::getInstance(static::getRegistryType());
580
582 $orderHistory = $registry->getOrderHistoryClassName();
583 $orderHistory::addAction(
584 'SHIPMENT',
585 $order->getId(),
586 'SHIPMENT_ITEM_BASKET_REMOVED',
587 $shipment->getId(),
588 null,
589 array(
590 'NAME' => $basketItem->getField('NAME'),
591 'QUANTITY' => $basketItem->getQuantity(),
592 'PRODUCT_ID' => $basketItem->getProductId(),
593 )
594 );
595 }
596 }
597
598 if ($order->getId() > 0)
599 {
600 $registry = Registry::getInstance(static::getRegistryType());
601
603 $orderHistory = $registry->getOrderHistoryClassName();
604 $orderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId());
605 }
606
607 return $result;
608 }
609
613 private static function createShipmentItemCollectionObject()
614 {
615 $registry = Registry::getInstance(static::getRegistryType());
616 $shipmentItemCollectionClassName = $registry->getShipmentItemCollectionClassName();
617
618 return new $shipmentItemCollectionClassName();
619 }
620
624 public static function getRegistryType()
625 {
627 }
628
632 private static function getItemCollectionClassName()
633 {
634 $registry = Registry::getInstance(static::getRegistryType());
635 return $registry->getShipmentItemClassName();
636 }
637
645 public static function load(Shipment $shipment)
646 {
648 $shipmentItemCollection = static::createShipmentItemCollectionObject();
649 $shipmentItemCollection->shipment = $shipment;
650
651 if ($shipment->getId() > 0)
652 {
654 if (!$shipmentCollection = $shipment->getCollection())
655 {
656 throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
657 }
658
660 if (!$order = $shipmentCollection->getOrder())
661 {
662 throw new Main\ObjectNotFoundException('Entity "Order" not found');
663 }
664
666 $itemClassName = static::getItemCollectionClassName();
667 $shipmentItemList = $itemClassName::loadForShipment($shipment->getId());
668
670 foreach ($shipmentItemList as $shipmentItem)
671 {
672 $shipmentItem->setCollection($shipmentItemCollection);
673 $shipmentItemCollection->bindItem($shipmentItem);
674
675 if (!$basketItem = $shipmentItem->getBasketItem())
676 {
677 $msg = Loc::getMessage("SALE_SHIPMENT_ITEM_COLLECTION_BASKET_ITEM_NOT_FOUND", array(
678 '#BASKET_ITEM_ID#' => $shipmentItem->getBasketId(),
679 '#SHIPMENT_ID#' => $shipment->getId(),
680 '#SHIPMENT_ITEM_ID#' => $shipmentItem->getId(),
681 ));
682
683 $r = new Result();
684 $r->addError( new ResultError($msg, 'SALE_SHIPMENT_ITEM_COLLECTION_BASKET_ITEM_NOT_FOUND'));
685
686 $registry = Registry::getInstance(static::getRegistryType());
688 $entityMarker = $registry->getEntityMarkerClassName();
689 $entityMarker::addMarker($order, $shipment, $r);
690 if (!$shipment->isSystem())
691 {
692 $shipment->setField('MARKED', 'Y');
693 }
694 }
695 }
696 }
697
698 return $shipmentItemCollection;
699 }
700
706 public static function getList(array $parameters = array())
707 {
708 return Internals\ShipmentItemTable::getList($parameters);
709 }
710
715 protected function deleteInternal($primary)
716 {
718 }
719
729 public function onBeforeBasketItemDelete(BasketItem $basketItem)
730 {
731 $result = new Result();
732
733 $r = $this->deleteByBasketItem($basketItem);
734 if (!$r->isSuccess())
735 {
736 $result->addErrors($r->getErrors());
737 }
738
739 return $result;
740 }
741
755 public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null)
756 {
757 $result = new Result();
758
760 {
761 $shipmentItem = $this->createItem($basketItem);
762 if ($shipmentItem)
763 {
764 $shipmentItem->onBasketModify($action, $basketItem, $name, $oldValue, $value);
765 }
766
767 return $result;
768 }
770 {
771 $shipmentItem = $this->getItemByBasketCode($basketItem->getBasketCode());
772
773 if (!$shipmentItem)
774 {
775 $shipmentItem = $this->createItem($basketItem);
776 }
777
778 $r = $shipmentItem->setField('QUANTITY', $value);
779 if (!$r->isSuccess())
780 {
781 return $result->addErrors($r->getErrors());
782 }
783 }
784
785 return $result;
786 }
787
793 protected function isExistsBasketItem(BasketItem $basketItem)
794 {
796 foreach ($this->collection as $shipmentItem)
797 {
798 if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode())
799 return true;
800 }
801
802 return false;
803 }
804
814 public function deleteByBasketItem(BasketItem $basketItem)
815 {
816 $result = new Result();
817 $systemShipmentItem = null;
818
820 if (!$shipment = $this->getShipment())
821 {
822 throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
823 }
824
826 foreach ($this->collection as $shipmentItem)
827 {
828 if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode())
829 {
830 if ($shipment->isSystem())
831 {
832 $systemShipmentItem = $shipmentItem;
833 continue;
834 }
835
836 $r = $shipmentItem->delete();
837 if (!$r->isSuccess())
838 {
839 $result->addErrors($r->getErrors());
840 }
841 }
842 }
843
844 if ($systemShipmentItem !== null)
845 {
846 if ($systemShipmentItem->getReservedQuantity() > 0)
847 {
849 $r = $systemShipmentItem->tryUnreserve();
850 if (!$r->isSuccess())
851 {
852 $result->addErrors($r->getErrors());
853 }
854 }
855
856 if ($result->isSuccess())
857 {
858 $systemShipmentItem->setFieldNoDemand('QUANTITY', 0);
859 $r = $systemShipmentItem->delete();
860 if (!$r->isSuccess())
861 {
862 $result->addErrors($r->getErrors());
863 }
864 }
865 }
866
867 return $result;
868 }
869
873 public function isEmpty()
874 {
875 if (count($this->collection) == 0)
876 return true;
877
879 foreach ($this->collection as $item)
880 {
881 if ($item->getQuantity() > 0)
882 return false;
883 }
884
885 return true;
886 }
887
893 public function getBasketItemQuantity(BasketItem $basketItem)
894 {
895 $quantity = 0;
896
897 $shipmentItem = $this->getItemByBasketCode($basketItem->getBasketCode());
898 if ($shipmentItem)
899 {
900 $quantity = $shipmentItem->getQuantity();
901 }
902
903 return $quantity;
904 }
905
912 public function isExistBasketItem(BasketItem $basketItem)
913 {
915 foreach ($this->collection as $shipmentItem)
916 {
917 if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode())
918 {
919 return true;
920 }
921 }
922
923 return false;
924 }
925
935 public function createClone(\SplObjectStorage $cloneEntity)
936 {
937 if ($this->isClone() && $cloneEntity->contains($this))
938 {
939 return $cloneEntity[$this];
940 }
941
943 $shipmentItemCollectionClone = parent::createClone($cloneEntity);
944
946 if ($shipment = $this->shipment)
947 {
948 if (!$cloneEntity->contains($shipment))
949 {
950 $cloneEntity[$shipment] = $shipment->createClone($cloneEntity);
951 }
952
953 if ($cloneEntity->contains($shipment))
954 {
955 $shipmentItemCollectionClone->shipment = $cloneEntity[$shipment];
956 }
957 }
958
959 return $shipmentItemCollectionClone;
960 }
961
967 public function getErrorEntity($value)
968 {
969 $className = null;
970
972 foreach ($this->collection as $shipmentItem)
973 {
974 if ($className = $shipmentItem->getErrorEntity($value))
975 {
976 break;
977 }
978 }
979
980 return $className;
981 }
982
988 public function canAutoFixError($value)
989 {
990 $autoFix = false;
991
993 foreach ($this->collection as $shipmentItem)
994 {
995 if ($autoFix = $shipmentItem->canAutoFixError($value))
996 {
997 break;
998 }
999 }
1000 return $autoFix;
1001 }
1002
1003}
static getList(array $parameters=array())
Определения datamanager.php:431
const ADD
Определения eventactions.php:8
const DELETE
Определения eventactions.php:10
const UPDATE
Определения eventactions.php:9
static deleteWithItems($id)
Определения shipmentitem.php:64
static roundPrecision($value)
Определения pricemaths.php:16
static getInstance($type)
Определения registry.php:183
const REGISTRY_TYPE_ORDER
Определения registry.php:16
getBasketItemQuantity(BasketItem $basketItem)
Определения shipmentitemcollection.php:893
static getList(array $parameters=array())
Определения shipmentitemcollection.php:706
onBeforeBasketItemDelete(BasketItem $basketItem)
Определения shipmentitemcollection.php:729
bindItem(CollectableEntity $shipmentItem)
Определения shipmentitemcollection.php:252
onBasketModify($action, BasketItem $basketItem, $name=null, $oldValue=null, $value=null)
Определения shipmentitemcollection.php:755
onItemModify(Internals\CollectableEntity $item, $name=null, $oldValue=null, $value=null)
Определения shipmentitemcollection.php:295
</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
$name
Определения menu_edit.php:35
$order
Определения payment.php:8
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$k
Определения template_pdf.php:567
$action
Определения file_dialog.php:21
$fields
Определения yandex_run.php:501