123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\Order;
- use Magento\Framework\App\ObjectManager;
- use Magento\Sales\Api\Data\ShipmentInterface;
- use Magento\Sales\Api\Data\ShipmentItemCreationInterface;
- use Magento\Sales\Api\Data\ShipmentPackageCreationInterface;
- use Magento\Sales\Api\Data\ShipmentTrackCreationInterface;
- use Magento\Framework\EntityManager\HydratorPool;
- use Magento\Sales\Model\Order\Shipment\TrackFactory;
- use Magento\Sales\Api\Data\OrderInterface;
- use Magento\Sales\Api\Data\ShipmentCommentCreationInterface;
- use Magento\Sales\Api\Data\ShipmentCreationArgumentsInterface;
- use Magento\Sales\Api\Data\OrderItemInterface;
- use Magento\Sales\Model\Order\ShipmentDocumentFactory\ExtensionAttributesProcessor;
- /**
- * Class ShipmentDocumentFactory
- *
- * @api
- * @since 100.1.2
- */
- class ShipmentDocumentFactory
- {
- /**
- * @var ShipmentFactory
- */
- private $shipmentFactory;
- /**
- * @var TrackFactory
- */
- private $trackFactory;
- /**
- * @var HydratorPool
- */
- private $hydratorPool;
- /**
- * @var ExtensionAttributesProcessor
- */
- private $extensionAttributesProcessor;
- /**
- * ShipmentDocumentFactory constructor.
- *
- * @param ShipmentFactory $shipmentFactory
- * @param HydratorPool $hydratorPool
- * @param TrackFactory $trackFactory
- * @param ExtensionAttributesProcessor $extensionAttributesProcessor
- */
- public function __construct(
- ShipmentFactory $shipmentFactory,
- HydratorPool $hydratorPool,
- TrackFactory $trackFactory,
- ExtensionAttributesProcessor $extensionAttributesProcessor = null
- ) {
- $this->shipmentFactory = $shipmentFactory;
- $this->trackFactory = $trackFactory;
- $this->hydratorPool = $hydratorPool;
- $this->extensionAttributesProcessor = $extensionAttributesProcessor ?: ObjectManager::getInstance()
- ->get(ExtensionAttributesProcessor::class);
- }
- /**
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- *
- * @param OrderInterface $order
- * @param ShipmentItemCreationInterface[] $items
- * @param ShipmentTrackCreationInterface[] $tracks
- * @param ShipmentCommentCreationInterface|null $comment
- * @param bool $appendComment
- * @param ShipmentPackageCreationInterface[] $packages
- * @param ShipmentCreationArgumentsInterface|null $arguments
- * @return ShipmentInterface
- * @since 100.1.2
- */
- public function create(
- OrderInterface $order,
- array $items = [],
- array $tracks = [],
- ShipmentCommentCreationInterface $comment = null,
- $appendComment = false,
- array $packages = [],
- ShipmentCreationArgumentsInterface $arguments = null
- ) {
- $shipmentItems = empty($items)
- ? $this->getQuantitiesFromOrderItems($order->getItems())
- : $this->getQuantitiesFromShipmentItems($items);
- /** @var Shipment $shipment */
- $shipment = $this->shipmentFactory->create(
- $order,
- $shipmentItems
- );
- if (null !== $arguments) {
- $this->extensionAttributesProcessor->execute($shipment, $arguments);
- }
- foreach ($tracks as $track) {
- $hydrator = $this->hydratorPool->getHydrator(
- \Magento\Sales\Api\Data\ShipmentTrackCreationInterface::class
- );
- $shipment->addTrack($this->trackFactory->create(['data' => $hydrator->extract($track)]));
- }
- if ($comment) {
- $shipment->addComment(
- $comment->getComment(),
- $appendComment,
- $comment->getIsVisibleOnFront()
- );
- if ($appendComment) {
- $shipment->setCustomerNote($comment->getComment());
- $shipment->setCustomerNoteNotify($appendComment);
- }
- }
- return $shipment;
- }
- /**
- * Translate OrderItemInterface array to product id => product quantity array.
- *
- * @param OrderItemInterface[] $items
- * @return int[]
- */
- private function getQuantitiesFromOrderItems(array $items)
- {
- $shipmentItems = [];
- foreach ($items as $item) {
- if (!$item->getIsVirtual() && (!$item->getParentItem() || $item->isShipSeparately())) {
- $shipmentItems[$item->getItemId()] = $item->getQtyOrdered();
- }
- }
- return $shipmentItems;
- }
- /**
- * Translate ShipmentItemCreationInterface array to product id => product quantity array.
- *
- * @param ShipmentItemCreationInterface[] $items
- * @return int[]
- */
- private function getQuantitiesFromShipmentItems(array $items)
- {
- $shipmentItems = [];
- foreach ($items as $item) {
- $shipmentItems[$item->getOrderItemId()] = $item->getQty();
- }
- return $shipmentItems;
- }
- }
|