custom/plugins/MolliePayments/src/Subscriber/OrderDeliverySubscriber.php line 74

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Kiener\MolliePayments\Subscriber;
  3. use Kiener\MolliePayments\Components\ShipmentManager\ShipmentManager;
  4. use Kiener\MolliePayments\Repository\OrderTransaction\OrderTransactionRepositoryInterface;
  5. use Kiener\MolliePayments\Service\OrderService;
  6. use Kiener\MolliePayments\Service\SettingsService;
  7. use Kiener\MolliePayments\Struct\PaymentMethod\PaymentMethodAttributes;
  8. use Psr\Log\LoggerInterface;
  9. use Shopware\Core\Checkout\Order\OrderEntity;
  10. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  11. use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
  12. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. class OrderDeliverySubscriber implements EventSubscriberInterface
  15. {
  16.     /**
  17.      * @var SettingsService
  18.      */
  19.     private $settings;
  20.     /**
  21.      * @var ShipmentManager
  22.      */
  23.     private $mollieShipment;
  24.     /**
  25.      * @var OrderService
  26.      */
  27.     private $orderService;
  28.     /**
  29.      * @var OrderTransactionRepositoryInterface
  30.      */
  31.     private $repoOrderTransactions;
  32.     /**
  33.      * @var LoggerInterface
  34.      */
  35.     private $logger;
  36.     /**
  37.      * @param SettingsService $settings
  38.      * @param ShipmentManager $mollieShipment
  39.      * @param OrderService $orderService
  40.      * @param OrderTransactionRepositoryInterface $repoOrderTransactions
  41.      * @param LoggerInterface $logger
  42.      */
  43.     public function __construct(SettingsService $settingsShipmentManager $mollieShipmentOrderService $orderServiceOrderTransactionRepositoryInterface $repoOrderTransactionsLoggerInterface $logger)
  44.     {
  45.         $this->settings $settings;
  46.         $this->mollieShipment $mollieShipment;
  47.         $this->orderService $orderService;
  48.         $this->repoOrderTransactions $repoOrderTransactions;
  49.         $this->logger $logger;
  50.     }
  51.     /**
  52.      * @return array<mixed>
  53.      */
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             'state_machine.order_delivery.state_changed' => 'onOrderDeliveryChanged',
  58.         ];
  59.     }
  60.     /**
  61.      * @param StateMachineStateChangeEvent $event
  62.      */
  63.     public function onOrderDeliveryChanged(StateMachineStateChangeEvent $event): void
  64.     {
  65.         if ($event->getTransitionSide() !== StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER) {
  66.             return;
  67.         }
  68.         $transitionName $event->getTransition()->getTransitionName();
  69.         if ($transitionName !== StateMachineTransitionActions::ACTION_SHIP) {
  70.             return;
  71.         }
  72.         # get the configuration of the sales channel from the order
  73.         $configSalesChannel $this->settings->getSettings($event->getSalesChannelId());
  74.         # if we don't even configure automatic shipping
  75.         # then don't even look into our order to find out if we should actually starts
  76.         if (!$configSalesChannel->getAutomaticShipping()) {
  77.             return;
  78.         }
  79.         $orderDeliveryId $event->getTransition()->getEntityId();
  80.         try {
  81.             $order $this->orderService->getOrderByDeliveryId($orderDeliveryId$event->getContext());
  82.             $swTransaction $this->repoOrderTransactions->getLatestOrderTransaction($order->getId(), $event->getContext());
  83.             # verify if the customer really paid with Mollie in the end
  84.             $paymentMethod $swTransaction->getPaymentMethod();
  85.             if (!$paymentMethod instanceof PaymentMethodEntity) {
  86.                 throw new \Exception('Transaction ' $swTransaction->getId() . ' has no payment method!');
  87.             }
  88.             $paymentMethodAttributes = new PaymentMethodAttributes($paymentMethod);
  89.             if (!$paymentMethodAttributes->isMolliePayment()) {
  90.                 # just skip it if it has been paid
  91.                 # with another payment provider
  92.                 # do NOT throw an error
  93.                 return;
  94.             }
  95.             $this->logger->info('Starting Shipment through Order Delivery Transition for order: ' $order->getOrderNumber());
  96.             $this->mollieShipment->shipOrderRest($ordernull$event->getContext());
  97.         } catch (\Throwable $ex) {
  98.             $this->logger->error('Failed to transfer delivery state to mollie: '.$ex->getMessage());
  99.             return;
  100.         }
  101.     }
  102. }