vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/EventListener/OrderIntegrityChecker.php line 35

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\ShopBundle\EventListener;
  12. use Doctrine\Common\Collections\ArrayCollection;
  13. use Doctrine\Persistence\ObjectManager;
  14. use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
  15. use Sylius\Component\Core\Model\OrderInterface;
  16. use Sylius\Component\Core\Model\PromotionInterface;
  17. use Sylius\Component\Order\Processor\OrderProcessorInterface;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\Routing\RouterInterface;
  20. use Webmozart\Assert\Assert;
  21. final class OrderIntegrityChecker implements OrderIntegrityCheckerInterface
  22. {
  23.     public function __construct(
  24.         private RouterInterface $router,
  25.         private OrderProcessorInterface $orderProcessor,
  26.         private ObjectManager $manager,
  27.     ) {
  28.     }
  29.     public function check(ResourceControllerEvent $event): void
  30.     {
  31.         $order $event->getSubject();
  32.         /** @var OrderInterface $order */
  33.         Assert::isInstanceOf($orderOrderInterface::class);
  34.         /** @var ArrayCollection<array-key, PromotionInterface> $previousPromotions */
  35.         $previousPromotions = new ArrayCollection($order->getPromotions()->toArray());
  36.         $oldTotal $order->getTotal();
  37.         $this->orderProcessor->process($order);
  38.         /** @var PromotionInterface $previousPromotion */
  39.         foreach ($previousPromotions as $previousPromotion) {
  40.             if (!$order->getPromotions()->contains($previousPromotion)) {
  41.                 $event->stop(
  42.                     'sylius.order.promotion_integrity',
  43.                     ResourceControllerEvent::TYPE_ERROR,
  44.                     ['%promotionName%' => $previousPromotion->getName()],
  45.                 );
  46.                 $event->setResponse(new RedirectResponse($this->router->generate('sylius_shop_checkout_complete')));
  47.                 $this->manager->persist($order);
  48.                 $this->manager->flush();
  49.                 return;
  50.             }
  51.         }
  52.         if ($order->getTotal() !== $oldTotal) {
  53.             $event->stop('sylius.order.total_integrity'ResourceControllerEvent::TYPE_ERROR);
  54.             $event->setResponse(new RedirectResponse($this->router->generate('sylius_shop_checkout_complete')));
  55.             $this->manager->persist($order);
  56.             $this->manager->flush();
  57.             return;
  58.         }
  59.     }
  60. }