AssignSourceCodeToShipmentPlugin.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryShipping\Plugin\Sales\Shipment;
  8. use Magento\Framework\App\RequestInterface;
  9. use Magento\Sales\Api\Data\ShipmentInterface;
  10. use Magento\Sales\Model\Order;
  11. use Magento\Sales\Model\Order\ShipmentFactory;
  12. use Magento\Sales\Api\Data\ShipmentExtensionFactory;
  13. use Magento\InventorySalesApi\Model\StockByWebsiteIdResolverInterface;
  14. use Magento\InventoryApi\Api\GetSourcesAssignedToStockOrderedByPriorityInterface;
  15. use Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface;
  16. class AssignSourceCodeToShipmentPlugin
  17. {
  18. /**
  19. * @var RequestInterface
  20. */
  21. private $request;
  22. /**
  23. * @var ShipmentExtensionFactory
  24. */
  25. private $shipmentExtensionFactory;
  26. /**
  27. * @var StockByWebsiteIdResolverInterface
  28. */
  29. private $stockByWebsiteIdResolver;
  30. /**
  31. * @var GetSourcesAssignedToStockOrderedByPriorityInterface
  32. */
  33. private $getSourcesAssignedToStockOrderedByPriority;
  34. /**
  35. * @var DefaultSourceProviderInterface
  36. */
  37. private $defaultSourceProvider;
  38. /**
  39. * @param RequestInterface $request
  40. * @param ShipmentExtensionFactory $shipmentExtensionFactory
  41. * @param StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver
  42. * @param GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority
  43. * @param DefaultSourceProviderInterface $defaultSourceProvider
  44. */
  45. public function __construct(
  46. RequestInterface $request,
  47. ShipmentExtensionFactory $shipmentExtensionFactory,
  48. StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver,
  49. GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority,
  50. DefaultSourceProviderInterface $defaultSourceProvider
  51. ) {
  52. $this->request = $request;
  53. $this->shipmentExtensionFactory = $shipmentExtensionFactory;
  54. $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
  55. $this->getSourcesAssignedToStockOrderedByPriority = $getSourcesAssignedToStockOrderedByPriority;
  56. $this->defaultSourceProvider = $defaultSourceProvider;
  57. }
  58. /**
  59. * @param ShipmentFactory $subject
  60. * @param ShipmentInterface $shipment
  61. * @param Order $order
  62. * @return ShipmentInterface
  63. * @throws \Magento\Framework\Exception\InputException
  64. * @throws \Magento\Framework\Exception\LocalizedException
  65. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  66. */
  67. public function afterCreate(ShipmentFactory $subject, ShipmentInterface $shipment, Order $order)
  68. {
  69. $sourceCode = $this->request->getParam('sourceCode');
  70. if (empty($sourceCode)) {
  71. $websiteId = $order->getStore()->getWebsiteId();
  72. $stockId = $this->stockByWebsiteIdResolver->execute((int)$websiteId)->getStockId();
  73. $sources = $this->getSourcesAssignedToStockOrderedByPriority->execute((int)$stockId);
  74. //TODO: need ro rebuild this logic | create separate service
  75. if (!empty($sources) && count($sources) == 1) {
  76. $sourceCode = $sources[0]->getSourceCode();
  77. } else {
  78. $sourceCode = $this->defaultSourceProvider->getCode();
  79. }
  80. }
  81. $shipmentExtension = $shipment->getExtensionAttributes();
  82. if (empty($shipmentExtension)) {
  83. $shipmentExtension = $this->shipmentExtensionFactory->create();
  84. }
  85. $shipmentExtension->setSourceCode($sourceCode);
  86. $shipment->setExtensionAttributes($shipmentExtension);
  87. return $shipment;
  88. }
  89. }