src/Module/Account/Subscriber/ExcludeVatSubscriber.php line 61

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Module\Account\Subscriber;
  4. use App\Module\Account\Repository\CustomerRepository;
  5. use Commercetools\Core\Model\Customer\Customer;
  6. use Commercetools\Core\Model\CustomerGroup\CustomerGroupReference;
  7. use Denios\SharedConstant\Cookie\Key;
  8. use Denios\SharedConstant\CustomerGroup\GroupKey;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\Cookie;
  11. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  12. use Symfony\Component\HttpKernel\Event\RequestEvent;
  13. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Symfony\Component\Security\Core\User\UserInterface;
  16. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  17. use Symfony\Component\Security\Http\SecurityEvents;
  18. /**
  19. * @package App\Module\Account\Subscriber
  20. */
  21. class ExcludeVatSubscriber implements EventSubscriberInterface
  22. {
  23. private CustomerRepository $customerRepository;
  24. private SessionInterface $session;
  25. private const BTB_NAME = 'b2b';
  26. /**
  27. * @param CustomerRepository $customerRepository
  28. * @param SessionInterface $session
  29. */
  30. public function __construct(CustomerRepository $customerRepository, SessionInterface $session)
  31. {
  32. $this->customerRepository = $customerRepository;
  33. $this->session = $session;
  34. }
  35. /**
  36. * @return array
  37. */
  38. public static function getSubscribedEvents(): array
  39. {
  40. return [
  41. // make sure this is executed BEFORE routing where products are loaded
  42. KernelEvents::REQUEST => [['checkForVatParameter', 64]],
  43. SecurityEvents::INTERACTIVE_LOGIN => ['addVatCookieBasedOnCustomerGroupOnLogin'],
  44. KernelEvents::RESPONSE => ['addVatCookieBasedOnCustomerGroupToResponse']
  45. ];
  46. }
  47. /**
  48. * Check for vat parameter and add it as request attribute
  49. *
  50. * @param RequestEvent $event
  51. *
  52. * @return void
  53. */
  54. public function checkForVatParameter(RequestEvent $event): void
  55. {
  56. $request = $event->getRequest();
  57. // default is B2b customer --> exclude vat from prices
  58. $request->attributes->set(Key::EXCLUDE_VAT, true);
  59. if ($request->cookies->has(Key::EXCLUDE_VAT)) {
  60. $request->attributes->set(Key::EXCLUDE_VAT, $request->cookies->getBoolean(Key::EXCLUDE_VAT));
  61. }
  62. //only fallback because Google do not want to have exclude_vat param
  63. if ($request->query->has(self::BTB_NAME)) {
  64. $request->attributes->set(Key::EXCLUDE_VAT, $request->query->getBoolean(self::BTB_NAME));
  65. }
  66. if ($request->query->has(Key::EXCLUDE_VAT)) {
  67. $request->attributes->set(Key::EXCLUDE_VAT, $request->query->getBoolean(Key::EXCLUDE_VAT));
  68. }
  69. }
  70. /**
  71. * @param InteractiveLoginEvent $event
  72. *
  73. * @return void
  74. */
  75. public function addVatCookieBasedOnCustomerGroupOnLogin(InteractiveLoginEvent $event): void
  76. {
  77. /** @var UserInterface $user */
  78. $user = $event
  79. ->getAuthenticationToken()
  80. ->getUser();
  81. $userEmail = $user->getUsername();
  82. /** @var Customer|null $customer */
  83. $customer = $this->customerRepository
  84. ->setExpands(['customerGroup'])
  85. ->findOneBy(['email = "' . $userEmail . '"']);
  86. if ($customer !== null) {
  87. /** @var CustomerGroupReference|null $customerGroup */
  88. $customerGroup = $customer->getCustomerGroup();
  89. if ($customerGroup !== null) {
  90. $event->getRequest()->attributes->set(Key::EXCLUDE_VAT, $customerGroup->getObj()->getKey() === GroupKey::BUSINESS_KEY);
  91. }
  92. }
  93. }
  94. /**
  95. * @param ResponseEvent $event
  96. *
  97. * @return void
  98. */
  99. public function addVatCookieBasedOnCustomerGroupToResponse(ResponseEvent $event): void
  100. {
  101. if ($event->getRequest()->attributes->has(Key::EXCLUDE_VAT)) {
  102. $event->getResponse()->headers->setCookie(
  103. Cookie::create(
  104. Key::EXCLUDE_VAT,
  105. $event->getRequest()->attributes->get(Key::EXCLUDE_VAT)
  106. ? 'true'
  107. : 'false',
  108. 0,
  109. '/',
  110. null,
  111. null,
  112. false,
  113. false,
  114. 'None'
  115. )
  116. );
  117. }
  118. }
  119. }