42 public function resetCollection(
Basket $basket)
49 if (!empty($this->collection))
52 foreach ($this->collection as $shipmentItem)
54 $shipmentItem->setFieldNoDemand(
'QUANTITY', 0);
55 $shipmentItem->delete();
62 $shipmentCollection = $this->
getShipment()->getCollection();
65 foreach ($basket as $basketItem)
67 $quantityList[$basketItem->getBasketCode()] = $shipmentCollection->getBasketItemDistributedQuantity($basketItem);
71 $itemClassName = static::getItemCollectionClassName();
74 foreach ($basket as $basketItem)
76 $shipmentItem = $itemClassName::create($this, $basketItem);
77 $this->addItem($shipmentItem);
79 $basketItemQuantity = 0;
81 if (array_key_exists($basketItem->getBasketCode(), $quantityList))
83 $basketItemQuantity = $quantityList[$basketItem->getBasketCode()];
86 $quantity = $basketItem->getQuantity() - $basketItemQuantity;
88 $shipmentItem->setFieldNoDemand(
"QUANTITY", $quantity);
90 if ($basketItem->isBundleParent())
92 $this->addBundleToCollection($basketItem);
106 public function createItem(BasketItem $basketItem)
114 if ($shipmentItem !==
null)
116 return $shipmentItem;
120 $itemClassName = static::getItemCollectionClassName();
122 $shipmentItem = $itemClassName::create($this, $basketItem);
124 $shipmentItem->setCollection($this);
125 $this->addItem($shipmentItem);
129 if ($basketItem->isBundleParent() && !
$shipment->isSystem())
131 $this->addBundleToCollection($basketItem);
134 return $shipmentItem;
145 private function addBundleToCollection(BasketItem $basketItem)
150 if (!$bundleCollection = $basketItem->getBundleCollection())
152 throw new Main\ObjectNotFoundException(
'Entity "BundleCollection" not found');
155 if ($bundleCollection->getOrder() ===
null)
158 if ($basketCollection = $basketItem->getCollection())
160 if (
$order = $basketCollection->getOrder())
162 $bundleCollection->setOrder(
$order);
171 if (!$shipmentCollection =
$shipment->getCollection())
173 throw new Main\ObjectNotFoundException(
'Entity "ShipmentCollection" not found');
177 if (!$systemShipment = $shipmentCollection->getSystemShipment())
179 throw new Main\ObjectNotFoundException(
'Entity "System Shipment" not found');
183 if (!$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection())
185 throw new Main\ObjectNotFoundException(
'Entity "ShipmentItemCollection" not found');
188 $baseQuantity = $basketItem->getQuantity();
191 if ($systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))
193 $baseQuantity = $systemShipmentItem->getQuantity();
196 $bundleBaseQuantity = $basketItem->getBundleBaseQuantity();
199 foreach ($bundleCollection as $bundleBasketItem)
202 if ($this->isExistsBasketItem($bundleBasketItem))
207 $bundleProductId = $bundleBasketItem->getProductId();
209 if (!isset($bundleBaseQuantity[$bundleProductId]))
210 throw new Main\ArgumentOutOfRangeException(
"bundle product id");
212 $quantity = $bundleBaseQuantity[$bundleProductId] * $baseQuantity;
218 $itemClassName = static::getItemCollectionClassName();
219 $shipmentItemBundle = $itemClassName::create($this, $bundleBasketItem);
220 $this->addItem($shipmentItemBundle);
224 $shipmentItemBundle->setFieldNoDemand(
'QUANTITY', $quantity);
228 $r = $shipmentItemBundle->setQuantity($quantity);
229 if (!$r->isSuccess())
231 $result->addErrors($r->getErrors());
243 protected function addItem(Internals\CollectableEntity $shipmentItem)
245 parent::addItem($shipmentItem);
254 $item = parent::bindItem($shipmentItem);
256 $this->shipmentItemIndexMap[$shipmentItem->getBasketCode()] = $shipmentItem->
getInternalIndex();
263 $index = parent::createIndex();
265 return $shipment->getInternalIndex().
"_".$index;
278 $oldShipmentItem = parent::deleteItem($index);
280 unset($this->shipmentItemIndexMap[$oldShipmentItem->getBasketCode()]);
308 isset($this->shipmentItemIndexMap[$itemCode])
309 && isset($this->collection[$this->shipmentItemIndexMap[$itemCode]])
312 return $this->collection[$this->shipmentItemIndexMap[$itemCode]];
322 public function getItemByBasketId($itemId)
324 $itemId = (int)$itemId;
325 foreach ($this->collection as $shippedItem)
328 $shippedItemId = (int)($shippedItem->getBasketId());
329 if ($itemId === $shippedItemId)
345 return $shipmentItem->isShippable();
358 $basketItem = $shipmentItem->getBasketItem();
360 return !$basketItem->isBundleChild();
372 public function getPrice()
378 foreach ($sellableItems as $shipmentItem)
381 if ($basketItem = $shipmentItem->getBasketItem())
394 public function getWeight() : float
401 $basketItem = $shipmentItem->getBasketItem();
403 $weight += $basketItem->getWeight() * $shipmentItem->getQuantity();
424 public function save()
426 $result =
new Main\Entity\Result();
435 if (!$shipmentCollection =
$shipment->getCollection())
441 if (!
$order = $shipmentCollection->getOrder())
443 throw new Main\ObjectNotFoundException(
'Entity "Order" not found');
446 $itemsFromDb =
array();
449 $itemsFromDbList = static::getList(
452 "select" =>
array(
"ID",
'BASKET_ID')
455 while ($itemsFromDbItem = $itemsFromDbList->fetch())
456 $itemsFromDb[$itemsFromDbItem[
"ID"]] = $itemsFromDbItem;
461 foreach ($this->collection as $shipmentItem)
464 if (!$basketItem = $shipmentItem->getBasketItem())
469 if ($basketItem->isBundleParent())
471 $this->addBundleToCollection($basketItem);
478 throw new Main\ObjectNotFoundException(
'Entity "Shipment" not found');
481 $changeMeaningfulFields =
array(
487 foreach ($this->collection as $shipmentItem)
490 if (!$basketItem = $shipmentItem->getBasketItem())
495 $isNew = (bool)($shipmentItem->getId() <= 0);
498 if (
$order->getId() > 0 && $isChanged)
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"),
507 $fields = $shipmentItem->getFields();
508 $originalValues =
$fields->getOriginalValues();
510 foreach($originalValues as $originalFieldName => $originalFieldValue)
512 if (in_array($originalFieldName, $changeMeaningfulFields) && $shipmentItem->getField($originalFieldName) != $originalFieldValue)
514 $logFields[$originalFieldName] = $shipmentItem->getField($originalFieldName);
516 $logFields[
'OLD_'.$originalFieldName] = $originalFieldValue;
521 $r = $shipmentItem->save();
524 if (
$order->getId() > 0 && $isChanged)
529 $orderHistory = $registry->getOrderHistoryClassName();
530 $orderHistory::addLog(
533 $isNew ?
'SHIPMENT_ITEM_ADD' :
'SHIPMENT_ITEM_UPDATE',
534 $shipmentItem->getId(),
537 $orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
543 $result->addErrors($r->getErrors());
546 if (isset($itemsFromDb[$shipmentItem->getId()]))
548 unset($itemsFromDb[$shipmentItem->getId()]);
553 if (!$basket =
$order->getBasket())
555 throw new Main\ObjectNotFoundException(
'Entity "Basket" not found');
558 foreach ($itemsFromDb as
$k => $v)
560 $v[
'ENTITY_REGISTRY_TYPE'] = static::getRegistryType();
563 $event =
new Main\Event(
'sale',
"OnBeforeSaleShipmentItemDeleted",
array(
568 static::deleteInternal(
$k);
571 $event =
new Main\Event(
'sale',
"OnSaleShipmentItemDeleted",
array(
577 if ($basketItem = $basket->getItemById(
$k))
582 $orderHistory = $registry->getOrderHistoryClassName();
583 $orderHistory::addAction(
586 'SHIPMENT_ITEM_BASKET_REMOVED',
590 'NAME' => $basketItem->getField(
'NAME'),
591 'QUANTITY' => $basketItem->getQuantity(),
592 'PRODUCT_ID' => $basketItem->getProductId(),
603 $orderHistory = $registry->getOrderHistoryClassName();
604 $orderHistory::collectEntityFields(
'SHIPMENT_ITEM',
$order->getId());
613 private static function createShipmentItemCollectionObject()
616 $shipmentItemCollectionClassName = $registry->getShipmentItemCollectionClassName();
618 return new $shipmentItemCollectionClassName();
632 private static function getItemCollectionClassName()
635 return $registry->getShipmentItemClassName();
645 public static function load(Shipment
$shipment)
648 $shipmentItemCollection = static::createShipmentItemCollectionObject();
649 $shipmentItemCollection->shipment =
$shipment;
654 if (!$shipmentCollection =
$shipment->getCollection())
660 if (!
$order = $shipmentCollection->getOrder())
662 throw new Main\ObjectNotFoundException(
'Entity "Order" not found');
666 $itemClassName = static::getItemCollectionClassName();
667 $shipmentItemList = $itemClassName::loadForShipment(
$shipment->getId());
670 foreach ($shipmentItemList as $shipmentItem)
672 $shipmentItem->setCollection($shipmentItemCollection);
673 $shipmentItemCollection->bindItem($shipmentItem);
675 if (!$basketItem = $shipmentItem->getBasketItem())
677 $msg = Loc::getMessage(
"SALE_SHIPMENT_ITEM_COLLECTION_BASKET_ITEM_NOT_FOUND",
array(
678 '#BASKET_ITEM_ID#' => $shipmentItem->getBasketId(),
680 '#SHIPMENT_ITEM_ID#' => $shipmentItem->getId(),
684 $r->addError(
new ResultError($msg,
'SALE_SHIPMENT_ITEM_COLLECTION_BASKET_ITEM_NOT_FOUND'));
688 $entityMarker = $registry->getEntityMarkerClassName();
698 return $shipmentItemCollection;
733 $r = $this->deleteByBasketItem($basketItem);
734 if (!$r->isSuccess())
736 $result->addErrors($r->getErrors());
761 $shipmentItem = $this->createItem($basketItem);
764 $shipmentItem->onBasketModify(
$action, $basketItem,
$name, $oldValue, $value);
775 $shipmentItem = $this->createItem($basketItem);
778 $r = $shipmentItem->setField(
'QUANTITY', $value);
779 if (!$r->isSuccess())
781 return $result->addErrors($r->getErrors());
793 protected function isExistsBasketItem(
BasketItem $basketItem)
796 foreach ($this->collection as $shipmentItem)
798 if ($shipmentItem->getBasketCode() == $basketItem->
getBasketCode())
814 public function deleteByBasketItem(BasketItem $basketItem)
817 $systemShipmentItem =
null;
822 throw new Main\ObjectNotFoundException(
'Entity "Shipment" not found');
826 foreach ($this->collection as $shipmentItem)
828 if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode())
832 $systemShipmentItem = $shipmentItem;
836 $r = $shipmentItem->delete();
837 if (!$r->isSuccess())
839 $result->addErrors($r->getErrors());
844 if ($systemShipmentItem !==
null)
846 if ($systemShipmentItem->getReservedQuantity() > 0)
849 $r = $systemShipmentItem->tryUnreserve();
850 if (!$r->isSuccess())
852 $result->addErrors($r->getErrors());
858 $systemShipmentItem->setFieldNoDemand(
'QUANTITY', 0);
859 $r = $systemShipmentItem->delete();
860 if (!$r->isSuccess())
862 $result->addErrors($r->getErrors());
875 if (
count($this->collection) == 0)
879 foreach ($this->collection as $item)
881 if ($item->getQuantity() > 0)
900 $quantity = $shipmentItem->getQuantity();
912 public function isExistBasketItem(
BasketItem $basketItem)
915 foreach ($this->collection as $shipmentItem)
917 if ($shipmentItem->getBasketCode() == $basketItem->
getBasketCode())
935 public function createClone(\SplObjectStorage $cloneEntity)
937 if ($this->isClone() && $cloneEntity->contains($this))
939 return $cloneEntity[$this];
943 $shipmentItemCollectionClone = parent::createClone($cloneEntity);
955 $shipmentItemCollectionClone->shipment = $cloneEntity[
$shipment];
959 return $shipmentItemCollectionClone;
967 public function getErrorEntity($value)
972 foreach ($this->collection as $shipmentItem)
974 if ($className = $shipmentItem->getErrorEntity($value))
988 public function canAutoFixError($value)
993 foreach ($this->collection as $shipmentItem)
995 if ($autoFix = $shipmentItem->canAutoFixError($value))