ShipOrder.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Sales\Api\OrderRepositoryInterface;
  9. use Magento\Sales\Api\ShipmentRepositoryInterface;
  10. use Magento\Sales\Api\ShipOrderInterface;
  11. use Magento\Sales\Model\Order\Config as OrderConfig;
  12. use Magento\Sales\Model\Order\OrderStateResolverInterface;
  13. use Magento\Sales\Model\Order\ShipmentDocumentFactory;
  14. use Magento\Sales\Model\Order\Shipment\NotifierInterface;
  15. use Magento\Sales\Model\Order\Shipment\OrderRegistrarInterface;
  16. use Magento\Sales\Model\Order\Validation\ShipOrderInterface as ShipOrderValidator;
  17. use Psr\Log\LoggerInterface;
  18. /**
  19. * Class ShipOrder
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class ShipOrder implements ShipOrderInterface
  23. {
  24. /**
  25. * @var ResourceConnection
  26. */
  27. private $resourceConnection;
  28. /**
  29. * @var OrderRepositoryInterface
  30. */
  31. private $orderRepository;
  32. /**
  33. * @var ShipmentDocumentFactory
  34. */
  35. private $shipmentDocumentFactory;
  36. /**
  37. * @var OrderStateResolverInterface
  38. */
  39. private $orderStateResolver;
  40. /**
  41. * @var OrderConfig
  42. */
  43. private $config;
  44. /**
  45. * @var ShipmentRepositoryInterface
  46. */
  47. private $shipmentRepository;
  48. /**
  49. * @var ShipOrderValidator
  50. */
  51. private $shipOrderValidator;
  52. /**
  53. * @var NotifierInterface
  54. */
  55. private $notifierInterface;
  56. /**
  57. * @var LoggerInterface
  58. */
  59. private $logger;
  60. /**
  61. * @var OrderRegistrarInterface
  62. */
  63. private $orderRegistrar;
  64. /**
  65. * @param ResourceConnection $resourceConnection
  66. * @param OrderRepositoryInterface $orderRepository
  67. * @param ShipmentDocumentFactory $shipmentDocumentFactory
  68. * @param OrderStateResolverInterface $orderStateResolver
  69. * @param OrderConfig $config
  70. * @param ShipmentRepositoryInterface $shipmentRepository
  71. * @param ShipOrderValidator $shipOrderValidator
  72. * @param NotifierInterface $notifierInterface
  73. * @param OrderRegistrarInterface $orderRegistrar
  74. * @param LoggerInterface $logger
  75. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  76. */
  77. public function __construct(
  78. ResourceConnection $resourceConnection,
  79. OrderRepositoryInterface $orderRepository,
  80. ShipmentDocumentFactory $shipmentDocumentFactory,
  81. OrderStateResolverInterface $orderStateResolver,
  82. OrderConfig $config,
  83. ShipmentRepositoryInterface $shipmentRepository,
  84. ShipOrderValidator $shipOrderValidator,
  85. NotifierInterface $notifierInterface,
  86. OrderRegistrarInterface $orderRegistrar,
  87. LoggerInterface $logger
  88. ) {
  89. $this->resourceConnection = $resourceConnection;
  90. $this->orderRepository = $orderRepository;
  91. $this->shipmentDocumentFactory = $shipmentDocumentFactory;
  92. $this->orderStateResolver = $orderStateResolver;
  93. $this->config = $config;
  94. $this->shipmentRepository = $shipmentRepository;
  95. $this->shipOrderValidator = $shipOrderValidator;
  96. $this->notifierInterface = $notifierInterface;
  97. $this->logger = $logger;
  98. $this->orderRegistrar = $orderRegistrar;
  99. }
  100. /**
  101. * @param int $orderId
  102. * @param \Magento\Sales\Api\Data\ShipmentItemCreationInterface[] $items
  103. * @param bool $notify
  104. * @param bool $appendComment
  105. * @param \Magento\Sales\Api\Data\ShipmentCommentCreationInterface|null $comment
  106. * @param \Magento\Sales\Api\Data\ShipmentTrackCreationInterface[] $tracks
  107. * @param \Magento\Sales\Api\Data\ShipmentPackageCreationInterface[] $packages
  108. * @param \Magento\Sales\Api\Data\ShipmentCreationArgumentsInterface|null $arguments
  109. * @return int
  110. * @throws \Magento\Sales\Api\Exception\DocumentValidationExceptionInterface
  111. * @throws \Magento\Sales\Api\Exception\CouldNotShipExceptionInterface
  112. * @throws \Magento\Framework\Exception\InputException
  113. * @throws \Magento\Framework\Exception\NoSuchEntityException
  114. * @throws \DomainException
  115. */
  116. public function execute(
  117. $orderId,
  118. array $items = [],
  119. $notify = false,
  120. $appendComment = false,
  121. \Magento\Sales\Api\Data\ShipmentCommentCreationInterface $comment = null,
  122. array $tracks = [],
  123. array $packages = [],
  124. \Magento\Sales\Api\Data\ShipmentCreationArgumentsInterface $arguments = null
  125. ) {
  126. $connection = $this->resourceConnection->getConnection('sales');
  127. $order = $this->orderRepository->get($orderId);
  128. $shipment = $this->shipmentDocumentFactory->create(
  129. $order,
  130. $items,
  131. $tracks,
  132. $comment,
  133. ($appendComment && $notify),
  134. $packages,
  135. $arguments
  136. );
  137. $validationMessages = $this->shipOrderValidator->validate(
  138. $order,
  139. $shipment,
  140. $items,
  141. $notify,
  142. $appendComment,
  143. $comment,
  144. $tracks,
  145. $packages
  146. );
  147. if ($validationMessages->hasMessages()) {
  148. throw new \Magento\Sales\Exception\DocumentValidationException(
  149. __("Shipment Document Validation Error(s):\n" . implode("\n", $validationMessages->getMessages()))
  150. );
  151. }
  152. $connection->beginTransaction();
  153. try {
  154. $this->orderRegistrar->register($order, $shipment);
  155. $order->setState(
  156. $this->orderStateResolver->getStateForOrder($order, [OrderStateResolverInterface::IN_PROGRESS])
  157. );
  158. $order->setStatus($this->config->getStateDefaultStatus($order->getState()));
  159. $this->shipmentRepository->save($shipment);
  160. $this->orderRepository->save($order);
  161. $connection->commit();
  162. } catch (\Exception $e) {
  163. $this->logger->critical($e);
  164. $connection->rollBack();
  165. throw new \Magento\Sales\Exception\CouldNotShipException(
  166. __('Could not save a shipment, see error log for details')
  167. );
  168. }
  169. if ($notify) {
  170. if (!$appendComment) {
  171. $comment = null;
  172. }
  173. $this->notifierInterface->notify($order, $shipment, $comment);
  174. }
  175. return $shipment->getEntityId();
  176. }
  177. }