custom/plugins/ZeobvCartRecovery/src/Storefront/Subscriber/CheckoutSubscriber.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Zeobv\CartRecovery\Storefront\Subscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  5. use Shopware\Core\Checkout\Order\OrderEntity;
  6. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  7. use Shopware\Core\Framework\Struct\ArrayStruct;
  8. use Zeobv\CartRecovery\Service\CartRecoveryService;
  9. use Shopware\Core\Checkout\Cart\Cart;
  10. class CheckoutSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var CartRecoveryService
  14.      */
  15.     protected $cartRecoveryService;
  16.     /**
  17.      * CheckoutSubscriber constructor.
  18.      *
  19.      * @param CartRecoveryService $cartRecoveryService
  20.      */
  21.     public function __construct(
  22.         CartRecoveryService $cartRecoveryService
  23.     )
  24.     {
  25.         $this->cartRecoveryService $cartRecoveryService;
  26.     }
  27.     /**
  28.      * @return array
  29.      */
  30.     public static function getSubscribedEvents()
  31.     {
  32.         return [
  33.             CheckoutFinishPageLoadedEvent::class => 'onFinishPageLoaded',
  34.             CheckoutConfirmPageLoadedEvent::class => 'onConfirmPageLoaded'
  35.         ];
  36.     }
  37.     /**
  38.      * @param CheckoutFinishPageLoadedEvent $event
  39.      */
  40.     public function onFinishPageLoaded(CheckoutFinishPageLoadedEvent $event)
  41.     {
  42.         $order $event->getPage()->getOrder();
  43.         if ($event->getPage()->isPaymentFailed() || $this->paymentFailedForOrder($order)) {
  44.             $this->cartRecoveryService->recoverCartFromOrder($order$event->getSalesChannelContext());
  45.         } else {
  46.             $this->cartRecoveryService->cleanUpCartWaitingForRecoveryForOrder($order$event->getSalesChannelContext());
  47.         }
  48.     }
  49.     public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event)
  50.     {
  51.         $event->getPage()->addExtension('ZeobvCartRecovery', new ArrayStruct([
  52.             'freshLoadToken' => md5(random_bytes(3))
  53.         ]));
  54.     }
  55.     /**
  56.      * @param OrderEntity $order
  57.      *
  58.      * @return bool
  59.      */
  60.     protected function paymentFailedForOrder(OrderEntity $order)
  61.     {
  62.         $latestTransactionStateName $order->getTransactions()->last()->getStateMachineState()->getTechnicalName();
  63.         return in_array($latestTransactionStateName, [
  64.             'cancelled',
  65.             'denied'
  66.         ]);
  67.     }
  68. }