canShipItem($orderItem, $items)) { return false; } // Remove from shipment items without qty or with qty=0 if (!$orderItem->isDummy(true) && (!isset($items[$orderItem->getId()]) || (float) $items[$orderItem->getId()] <= 0) ) { return false; } return true; } /** * Set prepared items to shipment document * * @param \Magento\Sales\Api\Data\ShipmentInterface $shipment * @param array $shipmentItems * @return \Magento\Sales\Api\Data\ShipmentInterface */ private function setItemsToShipment(\Magento\Sales\Api\Data\ShipmentInterface $shipment, $shipmentItems) { $totalQty = 0; /** * Verify that composite products shipped separately has children, if not -> remove from collection */ /** @var \Magento\Sales\Model\Order\Shipment\Item $shipmentItem */ foreach ($shipmentItems as $key => $shipmentItem) { if ($shipmentItem->getOrderItem()->getHasChildren() && $shipmentItem->getOrderItem()->isShipSeparately() ) { $containerId = $shipmentItem->getOrderItem()->getId(); $childItems = array_filter($shipmentItems, function ($item) use ($containerId) { return $containerId == $item->getOrderItem()->getParentItemId(); }); if (count($childItems) <= 0) { unset($shipmentItems[$key]); continue; } } $totalQty += $shipmentItem->getQty(); $shipment->addItem($shipmentItem); } return $shipment->setTotalQty($totalQty); } /** * Casts Qty to float or integer type * * @param Item $item * @param string|int|float $qty * @return float|int */ private function castQty(\Magento\Sales\Model\Order\Item $item, $qty) { if ($item->getIsQtyDecimal()) { $qty = (double)$qty; } else { $qty = (int)$qty; } return $qty > 0 ? $qty : 0; } /** * Adds tracks to the shipment. * * @param \Magento\Sales\Api\Data\ShipmentInterface $shipment * @param array $tracks * @throws \Magento\Framework\Exception\LocalizedException * @return \Magento\Sales\Api\Data\ShipmentInterface */ protected function prepareTracks(\Magento\Sales\Api\Data\ShipmentInterface $shipment, array $tracks) { foreach ($tracks as $data) { if (empty($data['number'])) { throw new \Magento\Framework\Exception\LocalizedException( __('Please enter a tracking number.') ); } $shipment->addTrack( $this->trackFactory->create()->addData($data) ); } return $shipment; } }