custom/plugins/MaxiaTaxSwitch6/src/Storefront/Service/TaxSwitchService.php line 144

Open in your IDE?
  1. <?php
  2. namespace Maxia\MaxiaTaxSwitch6\Storefront\Service;
  3. use Maxia\MaxiaTaxSwitch6\Storefront\Events\TaxSwitchEvent;
  4. use Shopware\Core\Checkout\Cart\Price\Struct\CartPrice;
  5. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  6. use Shopware\Core\System\SystemConfig\SystemConfigService;
  7. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. class TaxSwitchService
  10. {
  11.     public const TAX_SWITCH_ACTIVE_ATTR 'maxia-tax-switch-active';
  12.     public const IS_NET_ATTR 'maxia-is-net';
  13.     public const STATE_CHANGED_ATTR 'maxia-net-changed';
  14.     public const COOKIE_NAME 'maxia-is-net';
  15.     /**
  16.      * @var RequestStack
  17.      */
  18.     protected $requestStack;
  19.     /**
  20.      * @var EventDispatcherInterface
  21.      */
  22.     protected $eventDispatcher;
  23.     /**
  24.      * @var SystemConfigService
  25.      */
  26.     protected $configService;
  27.     /**
  28.      * @param RequestStack $requestStack
  29.      * @param EventDispatcherInterface $eventDispatcher
  30.      * @param SystemConfigService $configService
  31.      */
  32.     public function __construct(
  33.         RequestStack $requestStack,
  34.         EventDispatcherInterface $eventDispatcher,
  35.         SystemConfigService $configService
  36.     ) {
  37.         $this->requestStack $requestStack;
  38.         $this->eventDispatcher $eventDispatcher;
  39.         $this->configService $configService;
  40.     }
  41.     /**
  42.      * @param SalesChannelContext $context
  43.      * @return SalesChannelContext
  44.      */
  45.     public function initializeContext(SalesChannelContext $context)
  46.     {
  47.         $config $this->getContext($context);
  48.         if (!$config['pluginEnabled'] || !$this->getMainRequest()) {
  49.             return $context;
  50.         }
  51.         $this->getMainRequest()->attributes->set(static::TAX_SWITCH_ACTIVE_ATTRtrue);
  52.         $isNet $this->getDisplayNet($context);
  53.         if ($isNet === null) {
  54.             // initialize setting on first visit
  55.             $isNet $config['preselection'] === 'net';
  56.         }
  57.         $this->setDisplayNet($context$isNet);
  58.         // set context tax state according to current tax switch setting
  59.         $taxState $isNet CartPrice::TAX_STATE_NET CartPrice::TAX_STATE_GROSS;
  60.         $context->setTaxState($taxState);
  61.         $context->getContext()->setTaxState($taxState);
  62.         $context->getCurrentCustomerGroup()->setDisplayGross(!$isNet);
  63.         return $context;
  64.     }
  65.     /**
  66.      * Returns the current tax switch setting.
  67.      *
  68.      * @param SalesChannelContext $context
  69.      * @return bool
  70.      */
  71.     public function getDisplayNet(SalesChannelContext $context)
  72.     {
  73.         $config $this->getConfig($context);
  74.         if (!$config || !$config['pluginEnabled'] || !$this->getMainRequest() || $this->isApiRequest()) {
  75.             return null;
  76.         }
  77.         $value $this->getUrlParameterValue($context);
  78.         if ($value !== null) {
  79.             return $value;
  80.         }
  81.         $attrValue $this->getMainRequest()->attributes->get(static::IS_NET_ATTR);
  82.         $cookieValue $this->getMainRequest()->cookies->get(static::COOKIE_NAME);
  83.         if ($attrValue !== null) {
  84.             return (bool)$attrValue;
  85.         }
  86.         if ($cookieValue !== null) {
  87.             return (bool)$cookieValue;
  88.         }
  89.         if ($this->getSession()) {
  90.             $value $this->getSession()->get(static::IS_NET_ATTR);
  91.             if ($value !== null) {
  92.                 return $value;
  93.             }
  94.         }
  95.         return null;
  96.     }
  97.     /**
  98.      * Updates the tax switch setting.
  99.      *
  100.      * @param SalesChannelContext $context
  101.      * @param bool $displayNet
  102.      */
  103.     public function setDisplayNet(SalesChannelContext $contextbool $displayNet)
  104.     {
  105.         $changed false;
  106.         $valueBefore $this->getDisplayNet($context);
  107.         if ($this->getMainRequest()) {
  108.             $this->getMainRequest()->attributes->set(static::IS_NET_ATTR$displayNet);
  109.             if ($valueBefore !== $displayNet) {
  110.                 $changed true;
  111.             }
  112.             if ($this->getSession() && $this->getSession()->get(static::IS_NET_ATTR) !== $displayNet)
  113.             {
  114.                 $this->getSession()->set(static::IS_NET_ATTR$displayNet);
  115.                 $changed true;
  116.             }
  117.             $cookieValue $this->getMainRequest()->cookies->get(static::COOKIE_NAME);
  118.             if ($cookieValue !== null && (bool)$cookieValue !== $displayNet) {
  119.                 $this->getMainRequest()->cookies->set(static::COOKIE_NAME$displayNet);
  120.                 $changed true;
  121.             }
  122.             if ($changed) {
  123.                 $this->getMainRequest()->attributes->set(static::STATE_CHANGED_ATTRtrue);
  124.                 $this->eventDispatcher->dispatch(new TaxSwitchEvent($displayNet$context));
  125.             }
  126.         }
  127.     }
  128.     /**
  129.      * Returns the plugin config as an array, including the current 'is net' state.
  130.      *
  131.      * @param SalesChannelContext $context
  132.      * @return array
  133.      */
  134.     public function getConfig(SalesChannelContext $context)
  135.     {
  136.         return $this->configService->get('MaxiaTaxSwitch6.config'$context->getSalesChannel()->getId());
  137.     }
  138.     /**
  139.      * Returns the plugin config as an array, including the current 'is net' state.
  140.      *
  141.      * @param SalesChannelContext $context
  142.      * @return array
  143.      */
  144.     public function getContext(SalesChannelContext $context)
  145.     {
  146.         return array_merge($this->getConfig($context), [
  147.             'isNet' => $this->getDisplayNet($context),
  148.             'pluginEnabled' => $this->checkIsActive($context)
  149.         ]);
  150.     }
  151.     /**
  152.      * Returns the isNet value from URL parameter of the current master request
  153.      *
  154.      * @return bool|null
  155.      */
  156.     public function getUrlParameterValue(SalesChannelContext $context)
  157.     {
  158.         $config $this->getConfig($context);
  159.         if (!$config || !$config['urlParameterActive'] || !$this->getMainRequest()) {
  160.             return null;
  161.         }
  162.         $value $this->getMainRequest()->get($config['urlParameterName']);
  163.         return $value !== null ? (bool)$value null;
  164.     }
  165.     /**
  166.      * Checks if the switcher plugin should active in the given sales channel.
  167.      *
  168.      * @param SalesChannelContext $context
  169.      * @return bool
  170.      */
  171.     public function checkIsActive(SalesChannelContext $context)
  172.     {
  173.         $config $this->getConfig($context);
  174.         return isset($config['pluginEnabled']) && $config['pluginEnabled']
  175.             && !$this->isApiRequest()
  176.             && $this->getMainRequest() !== null
  177.             && ($context->getTaxState() !== CartPrice::TAX_STATE_FREE || $config['activateTaxFreeCountries'])
  178.             && (!$config['deactivateLoggedIn'] || $context->getCustomer() === null);
  179.     }
  180.     /**
  181.      * @return \Symfony\Component\HttpFoundation\Request|null
  182.      */
  183.     protected function getMainRequest()
  184.     {
  185.         return method_exists($this->requestStack'getMainRequest')
  186.             ? $this->requestStack->getMainRequest()
  187.             : $this->requestStack->getMasterRequest();
  188.     }
  189.     /**
  190.      * @return \Symfony\Component\HttpFoundation\Session\SessionInterface|null
  191.      */
  192.     protected function getSession()
  193.     {
  194.         return ($this->getMainRequest()->hasSession() && $this->getMainRequest()->getSession()->isStarted())
  195.             ? $this->getMainRequest()->getSession()
  196.             : null;
  197.     }
  198.     /**
  199.      * Checks if the current request is a Store-API request.
  200.      *
  201.      * @return bool
  202.      */
  203.     protected function isApiRequest()
  204.     {
  205.         return $this->getMainRequest() &&
  206.             (str_starts_with($this->getMainRequest()->getPathInfo(), '/api/_proxy/store-api/') ||
  207.             str_starts_with($this->getMainRequest()->getPathInfo(), '/api/_proxy-order/') ||
  208.             str_starts_with($this->getMainRequest()->getPathInfo(), '/store-api/'));
  209.     }
  210. }