vendor/store.shopware.com/mltisafemultisafepay/src/Subscriber/OrderDeliveryStateChangeEvent.php line 80

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. /**
  3.  * Copyright © MultiSafepay, Inc. All rights reserved.
  4.  * See DISCLAIMER.md for disclaimer details.
  5.  */
  6. namespace MultiSafepay\Shopware6\Subscriber;
  7. use Exception;
  8. use MultiSafepay\Api\Transactions\UpdateRequest;
  9. use MultiSafepay\Exception\ApiException;
  10. use MultiSafepay\Exception\InvalidApiKeyException;
  11. use MultiSafepay\Shopware6\Factory\SdkFactory;
  12. use MultiSafepay\Shopware6\Util\OrderUtil;
  13. use MultiSafepay\Shopware6\Util\PaymentUtil;
  14. use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryEntity;
  15. use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryStates;
  16. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
  18. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  19. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. class OrderDeliveryStateChangeEvent implements EventSubscriberInterface
  22. {
  23.     /**
  24.      * @var EntityRepository
  25.      */
  26.     private $orderDeliveryRepository;
  27.     /**
  28.      * @var SdkFactory
  29.      */
  30.     private $sdkFactory;
  31.     /**
  32.      * @var PaymentUtil
  33.      */
  34.     private $paymentUtil;
  35.     /**
  36.      * @var OrderUtil
  37.      */
  38.     private $orderUtil;
  39.     /**
  40.      * OrderDeliveryStateChangeEvent constructor.
  41.      *
  42.      * @param EntityRepository $orderDeliveryRepository
  43.      * @param SdkFactory $sdkFactory
  44.      * @param PaymentUtil $paymentUtil
  45.      * @param OrderUtil $orderUtil
  46.      */
  47.     public function __construct(
  48.         EntityRepository $orderDeliveryRepository,
  49.         SdkFactory $sdkFactory,
  50.         PaymentUtil $paymentUtil,
  51.         OrderUtil $orderUtil
  52.     ) {
  53.         $this->orderDeliveryRepository $orderDeliveryRepository;
  54.         $this->sdkFactory $sdkFactory;
  55.         $this->paymentUtil $paymentUtil;
  56.         $this->orderUtil $orderUtil;
  57.     }
  58.     /**
  59.      * {@inheritDoc}
  60.      */
  61.     public static function getSubscribedEvents(): array
  62.     {
  63.         return [
  64.             'state_machine.order_delivery.state_changed' => 'onOrderDeliveryStateChanged',
  65.         ];
  66.     }
  67.     /**
  68.      * @param StateMachineStateChangeEvent $event
  69.      * @throws Exception
  70.      */
  71.     public function onOrderDeliveryStateChanged(StateMachineStateChangeEvent $event): void
  72.     {
  73.         if ($event->getTransitionSide() !== StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER
  74.             || $event->getStateName() !== OrderDeliveryStates::STATE_SHIPPED
  75.         ) {
  76.             return;
  77.         }
  78.         $context $event->getContext();
  79.         $orderDelivery $this->getOrderDeliveryData($event);
  80.         $trackAndTraceCode $orderDelivery->getTrackingCodes();
  81.         $orderId $orderDelivery->getOrderId();
  82.         if (!$this->paymentUtil->isMultiSafepayPaymentMethod($orderId$context)) {
  83.             return;
  84.         }
  85.         try {
  86.             $order $this->orderUtil->getOrder($orderId$context);
  87.             $this->sdkFactory->create($order->getSalesChannelId())
  88.                 ->getTransactionManager()
  89.                 ->update(
  90.                     $order->getOrderNumber(),
  91.                     (new UpdateRequest())->addStatus('shipped')->addData([
  92.                         'tracktrace_code' => reset($trackAndTraceCode),
  93.                         'carrier' => '',
  94.                         'ship_date' => date('Y-m-d H:i:s'),
  95.                         'reason' => 'Shipped',
  96.                     ])
  97.                 );
  98.         } catch (InvalidApiKeyException $invalidApiKeyException) {
  99.             return;
  100.         } catch (ApiException $apiException) {
  101.             return;
  102.         }
  103.     }
  104.     /**
  105.      * Get Order delivery data
  106.      *
  107.      * @param StateMachineStateChangeEvent $event
  108.      * @return mixed|null
  109.      * @throws InconsistentCriteriaIdsException
  110.      */
  111.     private function getOrderDeliveryData(StateMachineStateChangeEvent $event): OrderDeliveryEntity
  112.     {
  113.         $orderDelivery $this->orderDeliveryRepository->search(
  114.             new Criteria([$event->getTransition()->getEntityId()]),
  115.             $event->getContext()
  116.         )->first();
  117.         return $orderDelivery;
  118.     }
  119. }