custom/plugins/CrswCleverReachOfficial/src/Subscriber/Automation/CartRecoverySubscriber.php line 103

Open in your IDE?
  1. <?php /** @noinspection PhpUndefinedClassInspection */
  2. namespace Crsw\CleverReachOfficial\Subscriber\Automation;
  3. use Crsw\CleverReachOfficial\Components\Utility\Bootstrap;
  4. use Crsw\CleverReachOfficial\Components\Utility\Initializer;
  5. use Crsw\CleverReachOfficial\Core\Infrastructure\Exceptions\BaseException;
  6. use Crsw\CleverReachOfficial\Core\Infrastructure\Logger\Logger;
  7. use Crsw\CleverReachOfficial\Entity\Product\Repositories\ProductRepository;
  8. use Crsw\CleverReachOfficial\Service\BusinessLogic\Automation\Entities\RecoveryRecord;
  9. use Crsw\CleverReachOfficial\Service\BusinessLogic\Automation\RecoveryRecordService;
  10. use Crsw\CleverReachOfficial\Service\BusinessLogic\SalesChannel\SalesChannelContextService;
  11. use Shopware\Core\Checkout\Cart\LineItemFactoryRegistry;
  12. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  13. use Shopware\Core\Framework\Context;
  14. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  15. use Shopware\Storefront\Event\StorefrontRenderEvent;
  16. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  19. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  20. use Symfony\Component\HttpKernel\KernelEvents;
  21. /**
  22.  * Class CartRecoverySubscriber
  23.  *
  24.  * @package Crsw\CleverReachOfficial\Subscriber\Automation
  25.  */
  26. class CartRecoverySubscriber implements EventSubscriberInterface
  27. {
  28.     /**
  29.      * @var RecoveryRecordService
  30.      */
  31.     private $recoveryRecordService;
  32.     /**
  33.      * @var ProductRepository
  34.      */
  35.     private $productRepository;
  36.     /**
  37.      * @var LineItemFactoryRegistry
  38.      */
  39.     private $factory;
  40.     /**
  41.      * @var CartService
  42.      */
  43.     private $cartService;
  44.     /**
  45.      * @var SessionInterface
  46.      */
  47.     private $session;
  48.     /**
  49.      * @var SalesChannelContextService
  50.      */
  51.     private $salesChannelContextService;
  52.     /**
  53.      * CartRecoverySubscriber constructor.
  54.      *
  55.      * @param Initializer $initializer
  56.      * @param RecoveryRecordService $recoveryRecordService
  57.      * @param ProductRepository $productRepository
  58.      * @param LineItemFactoryRegistry $factory
  59.      * @param CartService $cartService
  60.      * @param SessionInterface $session
  61.      * @param SalesChannelContextService $salesChannelContextService
  62.      */
  63.     public function __construct(
  64.         Initializer $initializer,
  65.         RecoveryRecordService $recoveryRecordService,
  66.         ProductRepository $productRepository,
  67.         LineItemFactoryRegistry $factory,
  68.         CartService $cartService,
  69.         SessionInterface $session,
  70.         SalesChannelContextService $salesChannelContextService
  71.     ) {
  72.         Bootstrap::register();
  73.         $initializer->registerServices();
  74.         $this->recoveryRecordService $recoveryRecordService;
  75.         $this->productRepository $productRepository;
  76.         $this->factory $factory;
  77.         $this->cartService $cartService;
  78.         $this->session $session;
  79.         $this->salesChannelContextService $salesChannelContextService;
  80.     }
  81.     /**
  82.      * @inheritDoc
  83.      */
  84.     public static function getSubscribedEvents(): array
  85.     {
  86.         return [
  87.             KernelEvents::CONTROLLER => 'onRecover',
  88.             StorefrontRenderEvent::class => 'afterCartUpdate'
  89.         ];
  90.     }
  91.     /**
  92.      * Handles cart recovery.
  93.      *
  94.      * @param ControllerEvent $event
  95.      */
  96.     public function onRecover(ControllerEvent $event): void
  97.     {
  98.         $request $event->getRequest();
  99.         $routeName $request->get('_route');
  100.         if ($routeName !== 'frontend.checkout.confirm.page') {
  101.             return;
  102.         }
  103.         $token $request->get('token');
  104.         $flag $request->get('recover');
  105.         if (empty($token) || empty($flag)) {
  106.             return;
  107.         }
  108.         $crMailing $request->get('crmailing');
  109.         if (!empty($crMailing)) {
  110.             $this->session->set('crMailing'$crMailing);
  111.         }
  112.         try {
  113.             $record $this->recoveryRecordService->findByToken($token);
  114.             if ($record === null) {
  115.                 return;
  116.             }
  117.             /** @var SalesChannelContext $salesChannelContext */
  118.             $salesChannelContext $request->get('sw-sales-channel-context') ?:
  119.                 $this->salesChannelContextService->getSalesChannelContext($request);
  120.             $this->cartService->createNew($salesChannelContext->getToken());
  121.             $lineItems $this->getLineItems($record$salesChannelContext);
  122.             $cart $this->cartService->getCart($salesChannelContext->getToken(), $salesChannelContext);
  123.             $this->cartService->add($cart$lineItems$salesChannelContext);
  124.         } catch (BaseException $e) {
  125.             Logger::logError('Failed to recover basket because: ' $e->getMessage(), 'Integration');
  126.         }
  127.     }
  128.     /**
  129.      * Removes items from cart if they are duplicated.
  130.      *
  131.      * @param StorefrontRenderEvent $event
  132.      */
  133.     public function afterCartUpdate(StorefrontRenderEvent $event): void
  134.     {
  135.         if ($event->getView() !== '@Storefront/storefront/page/checkout/confirm/index.html.twig') {
  136.             return;
  137.         }
  138.         $context $event->getSalesChannelContext();
  139.         /** @var CheckoutConfirmPage $page */
  140.         $page $event->getParameters()['page'];
  141.         $cart $page->getCart();
  142.         try {
  143.             $records $this->recoveryRecordService->find(['email' => $context->getCustomer()->getEmail()]);
  144.             if ($records === []) {
  145.                 return;
  146.             }
  147.             $record $records[0];
  148.             if ($cart->getLineItems()->count() > count($record->getItems())) {
  149.                 $newCart $this->cartService->createNew($context->getToken());
  150.                 $lineItems $this->getLineItems($record$context);
  151.                 $newCart $this->cartService->add($newCart$lineItems$context);
  152.                 $page->setCart($newCart);
  153.                 $this->cartService->setCart($newCart);
  154.             }
  155.         } catch (BaseException $e) {
  156.             Logger::logError('Failed to retrieve recovery record because ' $e->getMessage());
  157.         }
  158.     }
  159.     /**
  160.      * @param RecoveryRecord $record
  161.      * @param SalesChannelContext $context
  162.      *
  163.      * @return array
  164.      */
  165.     protected function getLineItems(RecoveryRecord $recordSalesChannelContext $context): array
  166.     {
  167.         $lineItems = [];
  168.         foreach ($record->getItems() as $key => $value) {
  169.             $product $this->productRepository->getProductById($keyContext::createDefaultContext());
  170.             if (!$product) {
  171.                 continue;
  172.             }
  173.             $lineItem $this->factory->create([
  174.                 'type' => 'product',
  175.                 'referencedId' => $product->getId(),
  176.                 'quantity' => $value
  177.             ], $context);
  178.             $lineItems[] = $lineItem;
  179.         }
  180.         return $lineItems;
  181.     }
  182. }