ShippingBuilderPlugin.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Plugin\Sales\Order;
  6. use Magento\Framework\Exception\LocalizedException;
  7. use Magento\Sales\Api\Data\ShippingExtensionFactory;
  8. use Magento\Sales\Api\Data\ShippingInterface;
  9. use Magento\Sales\Model\Order\ShippingBuilder;
  10. use Temando\Shipping\Api\Data\Order\ShippingExperienceInterface;
  11. use Temando\Shipping\Api\Data\Order\ShippingExperienceInterfaceFactory;
  12. use Temando\Shipping\Model\ResourceModel\Repository\OrderCollectionPointRepositoryInterface;
  13. use Temando\Shipping\Model\ResourceModel\Repository\OrderRepositoryInterface;
  14. use Temando\Shipping\Model\Shipping\Carrier;
  15. /**
  16. * Load Temando order id and the shipping experience as selected during checkout.
  17. *
  18. * @package Temando\Shipping\Plugin
  19. * @author Christoph Aßmann <christoph.assmann@netresearch.de>
  20. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  21. * @link https://www.temando.com/
  22. */
  23. class ShippingBuilderPlugin
  24. {
  25. /**
  26. * @var ShippingExtensionFactory
  27. */
  28. private $shippingExtensionFactory;
  29. /**
  30. * @var ShippingExperienceInterfaceFactory
  31. */
  32. private $shippingExperienceFactory;
  33. /**
  34. * @var OrderRepositoryInterface
  35. */
  36. private $orderRepository;
  37. /**
  38. * @var OrderCollectionPointRepositoryInterface
  39. */
  40. private $collectionPointRepository;
  41. /**
  42. * ShippingBuilderPlugin constructor.
  43. * @param ShippingExtensionFactory $shippingExtensionFactory
  44. * @param ShippingExperienceInterfaceFactory $shippingExperienceFactory
  45. * @param OrderRepositoryInterface $orderRepository
  46. * @param OrderCollectionPointRepositoryInterface $collectionPointRepository
  47. */
  48. public function __construct(
  49. ShippingExtensionFactory $shippingExtensionFactory,
  50. ShippingExperienceInterfaceFactory $shippingExperienceFactory,
  51. OrderRepositoryInterface $orderRepository,
  52. OrderCollectionPointRepositoryInterface $collectionPointRepository
  53. ) {
  54. $this->shippingExtensionFactory = $shippingExtensionFactory;
  55. $this->shippingExperienceFactory = $shippingExperienceFactory;
  56. $this->orderRepository = $orderRepository;
  57. $this->collectionPointRepository = $collectionPointRepository;
  58. }
  59. /**
  60. * For Temando shipments, add the shipping experience information
  61. * (as selected during checkout) to the shipment.
  62. *
  63. * @param ShippingBuilder $shippingBuilder
  64. * @param ShippingInterface $shipping
  65. * @return ShippingInterface
  66. */
  67. public function afterCreate(
  68. ShippingBuilder $shippingBuilder,
  69. ShippingInterface $shipping = null
  70. ) {
  71. if (!$shipping) {
  72. return $shipping;
  73. }
  74. $isTemandoShipping = 0;
  75. $shippingMethod = $shipping->getMethod();
  76. $carrierCode = Carrier::CODE;
  77. $methodCode = preg_replace("/{$carrierCode}_/", '', $shippingMethod, 1, $isTemandoShipping);
  78. if (!$isTemandoShipping) {
  79. return $shipping;
  80. }
  81. $extensionAttributes = $shipping->getExtensionAttributes();
  82. if (empty($extensionAttributes)) {
  83. $extensionAttributes = $this->shippingExtensionFactory->create();
  84. }
  85. /** @var \Magento\Sales\Model\Order\Address $orderAddress */
  86. $orderAddress = $shipping->getAddress();
  87. if (!$orderAddress) {
  88. return $shipping;
  89. }
  90. $order = $orderAddress->getOrder();
  91. $shippingExperience = $this->shippingExperienceFactory->create([
  92. ShippingExperienceInterface::LABEL => $order->getShippingDescription(),
  93. ShippingExperienceInterface::CODE => $methodCode,
  94. ShippingExperienceInterface::COST => floatval($order->getBaseShippingInclTax()),
  95. ]);
  96. $extensionAttributes->setShippingExperience($shippingExperience);
  97. try {
  98. $orderReference = $this->orderRepository->getReferenceByOrderId($order->getId());
  99. $extensionAttributes->setExtOrderId($orderReference->getExtOrderId());
  100. } catch (LocalizedException $e) {
  101. $extensionAttributes->setExtOrderId('');
  102. }
  103. try {
  104. $collectionPoint = $this->collectionPointRepository->get($orderAddress->getEntityId());
  105. } catch (LocalizedException $e) {
  106. $collectionPoint = null;
  107. }
  108. if ($collectionPoint) {
  109. $extensionAttributes->setCollectionPoint($collectionPoint);
  110. }
  111. $shipping->setExtensionAttributes($extensionAttributes);
  112. return $shipping;
  113. }
  114. }