/** * @param Shipment $shipment * @return array * @throws ArgumentException * @throws NotSupportedException */ private static function reserveShipment(Shipment $shipment) { if ($shipment->isReserved()) { new SystemException("shipment already reserved"); } $result = array(); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); /** @var OrderBase $order */ $order = $shipmentCollection->getOrder(); /** @var ShipmentItemCollection $shipmentCollection */ $shipmentItemCollection = $shipment->getShipmentItemCollection(); /** @var ShipmentItem $shipmentItem */ foreach ($shipmentItemCollection as $shipmentIndex => $shipmentItem) { $poolQuantity = static::getReservationPoolItem($order->getInternalId(), $shipmentItem->getBasketItem()); if ($poolQuantity === null || floatval($shipmentItem->getQuantity()) == floatval($shipmentItem->getReservedQuantity())) { continue; } $needReserved = floatval($shipmentItem->getQuantity()) - floatval($shipmentItem->getReservedQuantity()); $resultQuantity = static::reserveShipmentItem($shipmentItem, $poolQuantity - $needReserved > 0 ? $needReserved : $poolQuantity); $poolQuantity -= $resultQuantity; static::setReservationPoolItem($order->getInternalId(), $shipmentItem->getBasketItem(), $poolQuantity); $result[$shipmentItem->getBasketCode()] = $resultQuantity; } return $result; }