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

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Kiener\MolliePayments\Subscriber;
  4. use Kiener\MolliePayments\Components\ShipmentManager\ShipmentManager;
  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\Aggregate\OrderTransaction\OrderTransactionEntity;
  10. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  11. use Shopware\Core\Framework\Context;
  12. use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  17. use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
  18. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. class OrderDeliverySubscriber implements EventSubscriberInterface
  21. {
  22.     /**
  23.      * @var SettingsService
  24.      */
  25.     private $settings;
  26.     /**
  27.      * @var ShipmentManager
  28.      */
  29.     private $mollieShipment;
  30.     /**
  31.      * @var OrderService
  32.      */
  33.     private $orderService;
  34.     /**
  35.      * @var EntityRepository<EntityCollection<OrderTransactionEntity>>
  36.      */
  37.     private $repoOrderTransactions;
  38.     /**
  39.      * @var LoggerInterface
  40.      */
  41.     private $logger;
  42.     /**
  43.      * @param EntityRepository<EntityCollection<OrderTransactionEntity>> $repoOrderTransactions
  44.      */
  45.     public function __construct(SettingsService $settingsShipmentManager $mollieShipmentOrderService $orderService$repoOrderTransactionsLoggerInterface $logger)
  46.     {
  47.         $this->settings $settings;
  48.         $this->mollieShipment $mollieShipment;
  49.         $this->orderService $orderService;
  50.         $this->repoOrderTransactions $repoOrderTransactions;
  51.         $this->logger $logger;
  52.     }
  53.     /**
  54.      * @return array<mixed>
  55.      */
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             'state_machine.order_delivery.state_changed' => 'onOrderDeliveryChanged',
  60.         ];
  61.     }
  62.     public function onOrderDeliveryChanged(StateMachineStateChangeEvent $event): void
  63.     {
  64.         if ($event->getTransitionSide() !== StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER) {
  65.             return;
  66.         }
  67.         $transitionName $event->getTransition()->getTransitionName();
  68.         if ($transitionName !== StateMachineTransitionActions::ACTION_SHIP) {
  69.             return;
  70.         }
  71.         $orderDeliveryId $event->getTransition()->getEntityId();
  72.         try {
  73.             $order $this->orderService->getOrderByDeliveryId($orderDeliveryId$event->getContext());
  74.             // get the configuration of the sales channel from the order
  75.             $configSalesChannel $this->settings->getSettings($order->getSalesChannelId());
  76.             // if we don't even configure automatic shipping
  77.             // then don't even look into our order to find out if we should actually starts
  78.             if (! $configSalesChannel->getAutomaticShipping()) {
  79.                 return;
  80.             }
  81.             $swTransaction $this->getLatestOrderTransaction($order->getId(), $event->getContext());
  82.             if (! $swTransaction) {
  83.                 throw new \Exception('Order ' $order->getOrderNumber() . ' does not have transactions');
  84.             }
  85.             // verify if the customer really paid with Mollie in the end
  86.             $paymentMethod $swTransaction->getPaymentMethod();
  87.             if (! $paymentMethod instanceof PaymentMethodEntity) {
  88.                 throw new \Exception('Transaction ' $swTransaction->getId() . ' has no payment method!');
  89.             }
  90.             $paymentMethodAttributes = new PaymentMethodAttributes($paymentMethod);
  91.             if (! $paymentMethodAttributes->isMolliePayment()) {
  92.                 // just skip it if it has been paid
  93.                 // with another payment provider
  94.                 // do NOT throw an error
  95.                 return;
  96.             }
  97.             $this->logger->info('Starting Shipment through Order Delivery Transition for order: ' $order->getOrderNumber());
  98.             $this->mollieShipment->shipOrderRest($ordernull$event->getContext());
  99.         } catch (\Throwable $ex) {
  100.             $this->logger->error('Failed to transfer delivery state to mollie: ' $ex->getMessage(), ['exception' => $ex]);
  101.             return;
  102.         }
  103.     }
  104.     private function getLatestOrderTransaction(string $orderIdContext $context): ?OrderTransactionEntity
  105.     {
  106.         $criteria = new Criteria();
  107.         $criteria->addFilter(new EqualsFilter('order.id'$orderId));
  108.         $criteria->addAssociation('order');
  109.         $criteria->addAssociation('stateMachineState');
  110.         $criteria->addAssociation('paymentMethod');
  111.         $criteria->addSorting(new FieldSorting('createdAt'FieldSorting::DESCENDING));
  112.         $result $this->repoOrderTransactions->search($criteria$context);
  113.         /** @var ?OrderTransactionEntity $orderTransaction */
  114.         $orderTransaction $result->first();
  115.         if ($orderTransaction === null) {
  116.             return null;
  117.         }
  118.         return $orderTransaction;
  119.     }
  120. }