OrderManagementPlugin.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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;
  6. use Magento\Framework\Api\FilterBuilder;
  7. use Magento\Framework\Api\SearchCriteriaBuilder;
  8. use Magento\Framework\Exception\LocalizedException;
  9. use Magento\Sales\Api\Data\ShipmentInterface;
  10. use Magento\Sales\Api\OrderManagementInterface;
  11. use Psr\Log\LoggerInterface;
  12. use Temando\Shipping\Api\Data\Shipment\ShipmentReferenceInterface;
  13. use Temando\Shipping\Api\Shipment\ShipmentStatusInterface;
  14. use Temando\Shipping\Model\ResourceModel\Repository\ShipmentReferenceRepositoryInterface;
  15. use Temando\Shipping\Model\Sales\Service\ShipmentService;
  16. /**
  17. * OrderManagementPlugin
  18. *
  19. * @package Temando\Shipping\Plugin
  20. * @author Christoph Aßmann <christoph.assmann@netresearch.de>
  21. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  22. * @link https://www.temando.com/
  23. */
  24. class OrderManagementPlugin
  25. {
  26. /**
  27. * @var ShipmentReferenceRepositoryInterface
  28. */
  29. private $shipmentReferenceRepository;
  30. /**
  31. * @var FilterBuilder
  32. */
  33. private $filterBuilder;
  34. /**
  35. * @var SearchCriteriaBuilder
  36. */
  37. private $searchCriteriaBuilder;
  38. /**
  39. * @var ShipmentService
  40. */
  41. private $shipmentService;
  42. /**
  43. * @var LoggerInterface
  44. */
  45. private $logger;
  46. /**
  47. * OrderManagementPlugin constructor.
  48. * @param ShipmentReferenceRepositoryInterface $shipmentReferenceRepository
  49. * @param FilterBuilder $filterBuilder
  50. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  51. * @param ShipmentService $shipmentService
  52. * @param LoggerInterface $logger
  53. */
  54. public function __construct(
  55. ShipmentReferenceRepositoryInterface $shipmentReferenceRepository,
  56. FilterBuilder $filterBuilder,
  57. SearchCriteriaBuilder $searchCriteriaBuilder,
  58. ShipmentService $shipmentService,
  59. LoggerInterface $logger
  60. ) {
  61. $this->shipmentReferenceRepository = $shipmentReferenceRepository;
  62. $this->filterBuilder = $filterBuilder;
  63. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  64. $this->shipmentService = $shipmentService;
  65. $this->logger = $logger;
  66. }
  67. /**
  68. * Attempt to cancel shipments after an order is cancelled.
  69. *
  70. * @param OrderManagementInterface $orderService
  71. * @param bool $result
  72. * @param int $orderId
  73. * @return bool
  74. */
  75. public function afterCancel(OrderManagementInterface $orderService, bool $result, int $orderId): bool
  76. {
  77. if (!$result) {
  78. // order was not cancelled, nothing to do
  79. return $result;
  80. }
  81. $notCancelledFilter = $this->filterBuilder
  82. ->setField(ShipmentInterface::SHIPMENT_STATUS)
  83. ->setValue(ShipmentStatusInterface::STATUS_CANCELLED)
  84. ->setConditionType('neq')
  85. ->create();
  86. $statusUnknownFilter = $this->filterBuilder
  87. ->setField(ShipmentInterface::SHIPMENT_STATUS)
  88. ->setConditionType('null')
  89. ->create();
  90. $searchCriteria = $this->searchCriteriaBuilder
  91. ->addFilter(ShipmentInterface::ORDER_ID, $orderId)
  92. ->addFilters([$notCancelledFilter, $statusUnknownFilter])
  93. ->create();
  94. /** @var ShipmentReferenceInterface[] $shipmentReferences */
  95. $shipmentReferences = $this->shipmentReferenceRepository->getList($searchCriteria);
  96. foreach ($shipmentReferences as $shipmentReference) {
  97. try {
  98. $this->shipmentService->cancel(
  99. $shipmentReference->getExtShipmentId(),
  100. $shipmentReference->getShipmentId()
  101. );
  102. } catch (LocalizedException $exception) {
  103. $message = sprintf(
  104. 'Shipment %d (%s) could not be cancelled.',
  105. $shipmentReference->getShipmentId(),
  106. $shipmentReference->getExtShipmentId()
  107. );
  108. $this->logger->critical($message, ['exception' => $exception]);
  109. }
  110. }
  111. return $result;
  112. }
  113. }