* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @link https://www.temando.com/ */ class OrderRepositoryPlugin { /** * @var OrderReferenceInterfaceFactory */ private $orderReferenceFactory; /** * @var OrderDataInitializer */ private $orderDataInitializer; /** * @var OrderRepositoryInterface */ private $orderRepository; /** * @var OrderOperationProcessorPool */ private $processorPool; /** * @var LoggerInterface */ private $logger; /** * OrderRepositoryPlugin constructor. * @param OrderReferenceInterfaceFactory $orderReferenceFactory * @param OrderDataInitializer $orderDataInitializer * @param OrderRepositoryInterface $orderRepository * @param OrderOperationProcessorPool $processorPool * @param LoggerInterface $logger */ public function __construct( OrderReferenceInterfaceFactory $orderReferenceFactory, OrderDataInitializer $orderDataInitializer, OrderRepositoryInterface $orderRepository, OrderOperationProcessorPool $processorPool, LoggerInterface $logger ) { $this->orderReferenceFactory = $orderReferenceFactory; $this->orderDataInitializer = $orderDataInitializer; $this->orderRepository = $orderRepository; $this->processorPool = $processorPool; $this->logger = $logger; } /** * Manifest order at Temando platform. * * Observers don't work: * - `sales_order_save_commit_after` is no longer triggered in guest checkout * - `sales_order_save_after` does not have related entities (addresses) persisted yet * * Other promising events like `sales_order_place_after`, `checkout_submit_all_after`, * `sales_model_service_quote_submit_success` are * - triggered before the order was saved or * - not triggered at all in multi address checkout or some payment providers' * custom checkout implementations (paypal express, sagepay, …). * * @param SalesOrderRepositoryInterface $subject * @param OrderInterface|\Magento\Sales\Model\Order $salesOrder * @return OrderInterface */ public function afterSave(SalesOrderRepositoryInterface $subject, OrderInterface $salesOrder) { if (!$salesOrder->getData('shipping_method')) { // virtual or corrupt order return $salesOrder; } $shippingMethod = $salesOrder->getShippingMethod(true); $carrierCode = $shippingMethod->getData('carrier_code'); if ($carrierCode !== Carrier::CODE) { // not interested in other carriers return $salesOrder; } try { $orderReference = $this->orderRepository->getReferenceByOrderId($salesOrder->getId()); } catch (NoSuchEntityException $exception) { $orderReference = $this->orderReferenceFactory->create(['data' => [ OrderReferenceInterface::ORDER_ID => $salesOrder->getId(), ]]); } if ($orderReference->getExtOrderId()) { // Do not send orders to Temando platform that were saved already. return $salesOrder; } try { // create request data from local (sales) order entity $order = $this->orderDataInitializer->getOrder($salesOrder); // save order at Temando platform as well as local reference to it. $saveResult = $this->orderRepository->save($order); $this->processorPool->processSaveResponse($salesOrder, $order, $saveResult); } catch (LocalizedException $exception) { // nothing we can do here, just don't interrupt order process $this->logger->critical($exception->getLogMessage(), ['exception' => $exception]); } return $salesOrder; } }