custom/plugins/MolliePayments/src/Subscriber/CancelMollieOrderSubscriber.php line 59

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Kiener\MolliePayments\Subscriber;
  3. use Kiener\MolliePayments\Service\LoggerService;
  4. use Kiener\MolliePayments\Service\OrderService;
  5. use Mollie\Api\Exceptions\ApiException;
  6. use Mollie\Api\MollieApiClient;
  7. use Mollie\Api\Types\OrderStatus;
  8. use Monolog\Logger;
  9. use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
  10. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class CancelMollieOrderSubscriber implements EventSubscriberInterface
  13. {
  14.     public const MOLLIE_CANCEL_ORDER_STATES = [
  15.         OrderStatus::STATUS_CREATED,
  16.         OrderStatus::STATUS_AUTHORIZED,
  17.         OrderStatus::STATUS_SHIPPING
  18.     ];
  19.     /**
  20.      * @var string
  21.      */
  22.     private $shopwareVersion;
  23.     /**
  24.      * @var MollieApiClient
  25.      */
  26.     private $apiClient;
  27.     /**
  28.      * @var OrderService
  29.      */
  30.     private $orderService;
  31.     /**
  32.      * @var LoggerService
  33.      */
  34.     private $loggerService;
  35.     public function __construct(
  36.         MollieApiClient $apiClient,
  37.         OrderService $orderService,
  38.         LoggerService $loggerService,
  39.         string $shopwareVersion
  40.     )
  41.     {
  42.         $this->apiClient $apiClient;
  43.         $this->orderService $orderService;
  44.         $this->shopwareVersion $shopwareVersion;
  45.         $this->loggerService $loggerService;
  46.     }
  47.     public static function getSubscribedEvents()
  48.     {
  49.         return [
  50.             'state_machine.order.state_changed' => ['onOrderStateChanges']
  51.         ];
  52.     }
  53.     public function onOrderStateChanges(StateMachineStateChangeEvent $event): void
  54.     {
  55.         if ($event->getTransitionSide() !== StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER) {
  56.             return;
  57.         }
  58.         $allowedStates = [StateMachineTransitionActions::ACTION_CANCEL => true];
  59.         if (version_compare($this->shopwareVersion'6.2''>=')) {
  60.             $allowedStates[StateMachineTransitionActions::ACTION_FAIL] = true;
  61.         }
  62.         $transitionName $event->getTransition()->getTransitionName();
  63.         if (!isset($allowedStates[$transitionName])) {
  64.             return;
  65.         }
  66.         $order $this->orderService->getOrder($event->getTransition()->getEntityId(), $event->getContext());
  67.         $customFields $order->getCustomFields() ?? [];
  68.         $mollieOrderId $customFields['mollie_payments']['order_id'] ?? '';
  69.         if (empty($mollieOrderId)) {
  70.             return;
  71.         }
  72.         try {
  73.             $mollieOrder $this->apiClient->orders->get($mollieOrderId);
  74.             if (in_array($mollieOrder->status, [self::MOLLIE_CANCEL_ORDER_STATES])) {
  75.                 $this->apiClient->orders->cancel($mollieOrderId);
  76.             }
  77.         } catch (ApiException $e) {
  78.             $this->loggerService->addEntry(
  79.                 $e->getMessage(),
  80.                 $event->getContext(),
  81.                 $e,
  82.                 null,
  83.                 Logger::WARNING
  84.             );
  85.         }
  86.     }
  87. }