custom/plugins/CioBudget/src/Subscriber/HeaderSelectionSubscriber.php line 69

Open in your IDE?
  1. <?php
  2. namespace CioBudget\Subscriber;
  3. use CioBudget\Definition\Budget\BudgetEntity;
  4. use CioBudget\Service\BudgetInfoService;
  5. use CioBudget\Service\SessionService;
  6. use PhpParser\Node\Expr\Array_;
  7. use Shopware\Core\Checkout\Customer\CustomerEntity;
  8. use CioBudget\Service\BudgetLoaderService;
  9. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  12. use Shopware\Core\Framework\Validation\DataBag\DataBag;
  13. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  14. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  15. use Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute;
  16. use Shopware\Storefront\Event\StorefrontRenderEvent;
  17. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPage;
  18. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
  19. use Symfony\Component\DependencyInjection\Container;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpFoundation\Session\Session;
  22. use Shopware\Storefront\Page\Cart\CartPageLoadedEvent;
  23. use Symfony\Component\HttpFoundation\RedirectResponse;
  24. use Symfony\Component\HttpKernel\Event\RequestEvent;
  25. use Symfony\Component\HttpKernel\KernelEvents;
  26. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  27. use Symfony\Contracts\Translation\TranslatorInterface;
  28. class HeaderSelectionSubscriber implements EventSubscriberInterface
  29. {
  30.     private Container $container;
  31.     private BudgetLoaderService $budgetLoaderService;
  32.     private SessionService $sessionService;
  33.     private BudgetInfoService $budgetInfoService;
  34.     private UrlGeneratorInterface $router;
  35.     private TranslatorInterface $translator;
  36.     public function __construct(Container $container, UrlGeneratorInterface $router, TranslatorInterface $translator)
  37.     {
  38.         $this->container = $container;
  39.         $this->router = $router;
  40.         $this->translator = $translator;
  41.     }
  42.     public function setSessionService(SessionService $sessionService)
  43.     {
  44.         $this->sessionService = $sessionService;
  45.     }
  46.     public function setBudgetLoaderService(BudgetLoaderService $budgetLoaderService)
  47.     {
  48.         $this->budgetLoaderService = $budgetLoaderService;
  49.     }
  50.     public function setBudgetInfoService(BudgetInfoService $budgetInfoService)
  51.     {
  52.         $this->budgetInfoService = $budgetInfoService;
  53.     }
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             StorefrontRenderEvent::class => 'onStorefrontRender'
  58.         ];
  59.     }
  60.     public function onStorefrontRender(StorefrontRenderEvent $event)
  61.     {
  62.         $customer = $event->getSalesChannelContext()->getCustomer();
  63.         if (!$customer instanceof CustomerEntity) {
  64.             $event->setParameter('cio_budgets_show', false);
  65.             return;
  66.         }
  67.         if (!$customer || !is_array($customer->getCustomFields())) {
  68.             return;
  69.         }
  70.         /** @var EntitySearchResult $budgets */
  71.         $budgets = $this->budgetLoaderService->getActiveBudgetsByCustomer($customer, $event->getSalesChannelContext()->getContext());
  72.         if (!$budgets) {
  73.             return;
  74.         }
  75.         $currentSelectedBudgetId = $this->sessionService->getBudgetIdFromSession();
  76.         if (!$currentSelectedBudgetId) {
  77.             return;
  78.         }
  79.         $currentBudget = $this->budgetLoaderService->getBudgetById($currentSelectedBudgetId);
  80.         $currentBudget = [
  81.             'budget' => $currentBudget,
  82.             'currentState' => $currentBudget ? $this->budgetInfoService->getAvailableBudget($currentBudget->getId(), $event->getSalesChannelContext()) : 0,
  83.             'externalId' => $currentBudget ? str_pad($currentBudget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : ''
  84.         ];
  85.         $event->setParameter('cio_budgets_show', true);
  86.         $event->setParameter('cio_currently_selected_budget', $currentBudget);
  87.         if ($budgets) {
  88.             $budgets = $budgets->map(function ($budget) use ($event) {
  89.                 return [
  90.                     'budget' => $budget,
  91.                     'currentState' => $budget instanceof BudgetEntity ? $this->budgetInfoService->getAvailableBudget($budget->getId(), $event->getSalesChannelContext()) : 0,
  92.                     'externalId' => $budget instanceof BudgetEntity ? str_pad($budget->get('store')->getExtId(), 4, 0, STR_PAD_LEFT) : ''
  93.                 ];
  94.             });
  95.             uasort($budgets, function ($a, $b) {
  96.                 if ($a['budget']->getName() == $b['budget']->getName()) return 0;
  97.                 return ($a['budget']->getName() < $b['budget']->getName()) ? -1 : 1;
  98.             });
  99.             $event->setParameter('cio_avaivable_budgets', $budgets);
  100.         }
  101.         $event->setParameter('cio_avaivable_budgets_redirect', $event->getRequest()->attributes->get('_route'));
  102.         $event->setParameter('cio_avaivable_budgets_redirect_querystring', $event->getRequest()->getQueryString());
  103.         $event->setParameter('cio_avaivable_budgets_redirect_params', $event->getRequest()->attributes->get('_route_params'));
  104.         if (key_exists('page', $event->getParameters()) && $event->getParameters()['page'] instanceof CheckoutConfirmPage ) {
  105.             $currentPaymentId = $event->getParameters()['page']->getCart()->getTransactions()->getElements()[0]->getPaymentMethodId();
  106.             if( !in_array($currentPaymentId, array('f261b55b5214496bb30fec99e5f6561c','8cbfa5840845471ea510d574a947b365'))){
  107.                 return;
  108.             }            
  109.             $valueCart   = $event->getParameters()['page']->getCart()->getPrice()->getTotalPrice();
  110.             $valueBudget = $currentBudget['currentState'];
  111.             $valueBudgetDisplay = $currentBudget['currentState'] . ' ' . $event->getSalesChannelContext()->getCurrency()->getSymbol();
  112.             if( $valueCart > $valueBudget )
  113.             {
  114.                 /** @var Session $sessionService */
  115.                 $sessionService = $this->container->get('session');
  116.                 $sessionService->getFlashBag()->set('danger', $this->translator->trans('confirm.cartValueExceedsBudget', array('%value%'=>$valueBudgetDisplay)));
  117.                 $response = new RedirectResponse($this->router->generate('frontend.checkout.cart.page'), 301);
  118.                 $response->headers->set('Location', $this->router->generate('frontend.checkout.cart.page'));
  119.                 $response->setStatusCode(302);
  120.                 $response->send();
  121.                 $event->setResponse($response);
  122.             }
  123.         }
  124.         if (key_exists('page', $event->getParameters()) && $event->getParameters()['page'] instanceof CheckoutCartPage )
  125.         {
  126.             $currentPaymentId = $event->getParameters()['page']->getCart()->getTransactions()->getElements()[0]->getPaymentMethodId();
  127.             if( !in_array($currentPaymentId, array('f261b55b5214496bb30fec99e5f6561c','8cbfa5840845471ea510d574a947b365'))){
  128.                 return;
  129.             }
  130.             $valueCart   = $event->getParameters()['page']->getCart()->getPrice()->getTotalPrice();
  131.             $valueBudget = $currentBudget['currentState'];
  132.             $valueBudgetDisplay = $currentBudget['currentState'] . ' ' . $event->getSalesChannelContext()->getCurrency()->getSymbol();
  133.             if( $valueCart > $valueBudget )
  134.             {
  135.                 /** @var Session $sessionService */
  136.                 $sessionService = $this->container->get('session');
  137.                 $sessionService->getFlashBag()->set('danger', $this->translator->trans('confirm.cartValueExceedsBudget', array('%value%'=>$valueBudgetDisplay)));
  138.             }
  139.         }
  140.     }
  141. }