custom/plugins/CioAddressbook/src/Subscriber/AddressbookSubscriber.php line 121

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace CioAddressbook\Subscriber;
  3. use CioAddressbook\Controller\AddressbookController;
  4. use CioAddressbook\Definition\Addressbook\AddressbookEntity;
  5. use CioAddressbook\Error\CioShippingAddressPermissionsError;
  6. use CioAddressbook\Service\AddressArrayHelper;
  7. use CioAddressbook\Service\AddressbookService;
  8. use CioBudget\Service\SessionService;
  9. use Shopware\Core\Checkout\Cart\Address\Error\ShippingAddressBlockedError;
  10. use Shopware\Core\Checkout\Cart\Cart;
  11. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  12. use Shopware\Core\Checkout\Cart\Order\CartConvertedEvent;
  13. use Shopware\Core\Checkout\Customer\Event\CustomerLogoutEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  17. use Shopware\Core\Framework\Uuid\Uuid;
  18. use Shopware\Storefront\Event\StorefrontRenderEvent;
  19. use Symfony\Component\BrowserKit\Request;
  20. use Symfony\Component\DependencyInjection\ContainerInterface;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\HttpKernel\Event\RequestEvent;
  24. use Symfony\Component\HttpKernel\KernelEvents;
  25. class AddressbookSubscriber implements EventSubscriberInterface
  26. {
  27.     private SessionService $sessionService;
  28.     private AddressbookService $addressbookService;
  29.     private RequestStack $requestStack;
  30.     private ContainerInterface $container;
  31.     public function __construct(SessionService $sessionServiceAddressbookService $addressbookServiceRequestStack $requestStackContainerInterface $container)
  32.     {
  33.         $this->sessionService $sessionService;
  34.         $this->addressbookService $addressbookService;
  35.         $this->requestStack $requestStack;
  36.         $this->container $container;
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             StorefrontRenderEvent::class => 'onStorefrontRender',
  42.             CartConvertedEvent::class => 'onCartConvertedEvent',
  43.             KernelEvents::REQUEST => 'onKernelRequest',
  44.             CustomerLogoutEvent::class => 'onCustomerLogoutEvent'
  45.         ];
  46.     }
  47.     public function onStorefrontRender(StorefrontRenderEvent $event)
  48.     {
  49.         $route $event->getRequest()->get('_route');
  50.         if ($route == 'frontend.checkout.confirm.page') {
  51.             /** @var EntityRepositoryInterface $customerAddressRepository */
  52.             $customerAddressRepository $this->container->get('customer_address.repository');
  53.             $addressResultCollection $customerAddressRepository->search(
  54.                 (new Criteria())->addFilter(new EqualsFilter('customerId'$event->getSalesChannelContext()->getCustomer()->getId())),
  55.                 $event->getContext()
  56.             );
  57.             $budgetStore $this->sessionService->getBudgetStoreEntityFromSession($event->getContext());
  58.             $budgetStoreData '';
  59.             $addressBookEntry null;
  60.             if ($budgetStore) {
  61.                 $addressBookEntryCriteria = new Criteria([$budgetStore->getAddressbookId()]);
  62.                 $addressBookEntryCriteria->addAssociation('country');
  63.                 /** @var AddressbookEntity $addressBookEntry */
  64.                 $addressBookEntry $this->container->get('cio_addressbook.repository')->search($addressBookEntryCriteria$event->getContext())->first();
  65.                 if ($addressBookEntry) {
  66.                     $budgetStoreData json_encode(
  67.                         AddressArrayHelper::addressEntityToArray($addressBookEntry$this->container->get('twig'))
  68.                     );
  69.                 }
  70.             }
  71.             $currentSelectedOverrideAddress null;
  72.             $sessionType null;
  73.             try {
  74.                 $sessionData $event->getRequest()->getSession()->get(AddressbookController::ADDRESS_TYPE_SESSION_DATA_KEY);
  75.                 $sessionType $event->getRequest()->getSession()->get(AddressbookController::ADDRESS_TYPE_SESSION_TYPE_KEY);
  76.                 $currentSelectedOverrideAddress json_decode($sessionDatatrue);
  77.             } catch (\Throwable $throwable) {}
  78.             $currentSelectedOverrideAddress $this->addressbookService->getCurrentOverrideShippingAddress($event->getRequest()->getSession(), $event->getSalesChannelContext(), $budgetStoreData);
  79.             if ($this->checkDefaultAccountAddressPermissions($event) === false && $event->getRequest()->getSession()->get(AddressbookController::ADDRESS_TYPE_SESSION_DATA_KEY) === null) {
  80.                 /** @var Cart $cart */
  81.                 $cart $event->getParameters()['page']->getCart();
  82.                 $cart->addErrors(new CioShippingAddressPermissionsError());
  83.                 $event->getRequest()->getSession()->getFlashBag()->add('danger''Keine Berechtigungen für die Verwendung der Standard-Adresse im Kundenprofil. Bitte wählen Sie eine andere Adresse aus.');
  84.             }
  85.             $event->setParameter('allAvailableDefaultShippingAddresses'$addressResultCollection);
  86.             $event->setParameter('budgetShippingAddressForCheckout'$budgetStore);
  87.             $event->setParameter('budgetShippingAdressbookAddressForCheckout'$addressBookEntry);
  88.             $event->setParameter('budgetShippingAddressData'$budgetStoreData);
  89.             $event->setParameter('currentlySelectedOverrideAddress'$currentSelectedOverrideAddress);
  90.             $event->setParameter('addressBookShippingAddressesForCheckout'$this->addressbookService->getShippingAddressesForCheckout($event->getContext()));
  91.             $event->setParameter('currentAddressType'$sessionType);
  92.         }
  93.     }
  94.     protected function checkDefaultAccountAddressPermissions(StorefrontRenderEvent $event)
  95.     {
  96.         return $this->container->get('customer.cio_check_permissions')->check($event->getSalesChannelContext()->getCustomer(), 'ADDRESS_DELIVERY_CUSTOM'$event->getContext());
  97.     }
  98.     public function onCartConvertedEvent(CartConvertedEvent $event)
  99.     {
  100.         $request $this->requestStack->getCurrentRequest();
  101.         $isOverrideActive $request->get('cioOverrideShippingAddressActive') !== null;
  102.         $addressOverrideData $request->get('cioOverrideShippingAddressData');
  103.         if ($addressOverrideData) {
  104.             $currentSelectedOverrideAddress null;
  105.             try {
  106.                 $currentSelectedOverrideAddress json_decode($addressOverrideDatatrue);
  107.                 /** @var EntityRepositoryInterface $orderRepository */
  108.                 $orderRepository $this->container->get('order_address.repository');
  109.                 /** @var EntityRepositoryInterface $orderDeliveryRepository */
  110.                 $orderDeliveryRepository $this->container->get('order_delivery.repository');
  111.                 /** @var EntityRepositoryInterface $salutationRepository */
  112.                 $salutationRepository $this->container->get('salutation.repository');
  113.                 /** @var EntityRepositoryInterface $countryStateRepository */
  114.                 $countryStateRepository $this->container->get('country_state.repository');
  115.                 /** @var EntityRepositoryInterface $countryRepository */
  116.                 $countryRepository $this->container->get('country.repository');
  117.                 /** @var array $originalOrderShippingAddress */
  118.                 $originalOrderShippingAddress $event->getConvertedCart()['deliveries'][0]['shippingOrderAddress'];
  119.                 $originalOrder $event->getConvertedCart();
  120.                 // start validate foreign keys or fallback to default
  121.                 $salutation null;
  122.                 if ($currentSelectedOverrideAddress['salutationId'] && Uuid::isValid($currentSelectedOverrideAddress['salutationId'])) {
  123.                     $salutation $salutationRepository->search(new Criteria([$currentSelectedOverrideAddress['salutationId']]), $event->getContext())->first();
  124.                 }
  125.                 $salutationId $salutation $salutation->getId() : (array_key_exists('salutationId'$originalOrderShippingAddress) ? $originalOrderShippingAddress['salutationId'] : null);
  126.                 $countryState null;
  127.                 if ($currentSelectedOverrideAddress['countryStateId'] && Uuid::isValid($currentSelectedOverrideAddress['countryStateId'])) {
  128.                     $countryState $countryStateRepository->search(new Criteria([$currentSelectedOverrideAddress['countryStateId']]), $event->getContext())->first();
  129.                 }
  130.                 $countryStateId $countryState $countryState->getId() : (array_key_exists('countryStateId'$originalOrderShippingAddress) ? $originalOrderShippingAddress['countryStateId'] : null);
  131.                 $country null;
  132.                 if ($currentSelectedOverrideAddress['countryId'] && Uuid::isValid($currentSelectedOverrideAddress['countryId'])) {
  133.                     $country $countryRepository->search(new Criteria([$currentSelectedOverrideAddress['countryId']]), $event->getContext())->first();
  134.                 }
  135.                 $countryId $country $country->getId() : (array_key_exists('countryId'$originalOrderShippingAddress) ? $originalOrderShippingAddress['countryId'] : null);
  136.                 // end validate foreign keys or fallback to default
  137.                 $newOrderAddressId Uuid::randomHex();
  138.                 $originalOrder['deliveries'][0]['shippingOrderAddress'] = [
  139.                     'id' => $newOrderAddressId,
  140.                     'company' => $currentSelectedOverrideAddress['company'],
  141.                     'department' => $currentSelectedOverrideAddress['department'],
  142.                     'title' => $currentSelectedOverrideAddress['title'],
  143.                     'firstName' => $currentSelectedOverrideAddress['firstName'],
  144.                     'lastName' => $currentSelectedOverrideAddress['lastName'],
  145.                     'street' => $currentSelectedOverrideAddress['street'],
  146.                     'zipcode' => (string)$currentSelectedOverrideAddress['zipcode'],
  147.                     'phoneNumber' => (string)$currentSelectedOverrideAddress['phoneNumber'],
  148.                     'additionalAddressLine1' => (string)$currentSelectedOverrideAddress['additionalAddressLine1'],
  149.                     'additionalAddressLine2' => (string)$currentSelectedOverrideAddress['additionalAddressLine2'],
  150.                     'city' => $currentSelectedOverrideAddress['city'],
  151.                     'salutationId' => $salutationId,
  152.                     'countryStateId' => $countryStateId,
  153.                     'countryId' => $countryId
  154.                 ];
  155.                 if ($originalOrderShippingAddress['id'] === $originalOrder['billingAddressId']) {
  156.                     $originalOrder['billingAddressId'] = $originalOrderShippingAddress['id'];
  157.                     $originalOrder['addresses'][0] = $originalOrderShippingAddress;
  158.                 }
  159.                 $event->setConvertedCart($originalOrder);
  160.             } catch (\Throwable $throwable) {
  161.                 dd($throwable);
  162.             }
  163.         }
  164.         $request->getSession()->set(AddressbookController::ADDRESS_TYPE_SESSION_TYPE_KEYnull);
  165.         $request->getSession()->set(AddressbookController::ADDRESS_TYPE_SESSION_DATA_KEYnull);
  166.     }
  167.     public function onKernelRequest(RequestEvent $event)
  168.     {
  169.         $request $event->getRequest();
  170.         $attributes $request->attributes;
  171.         $route $attributes->get('_route');
  172.         if ($route == 'frontend.checkout.confirm.page') {
  173.             if ($event->getRequest()->getSession()->get(AddressbookController::ADDRESS_TYPE_SESSION_DATA_KEY) === null && $this->container->get('customer.cio_check_permissions')) {
  174.                 //$event->getRequest()->getSession()->getFlashBag()->add('danger', 'Keine Berechtigungen für die Verwendung der Standard-Adresse im Kundenprofil. Bitte wählen Sie eine andere Adresse aus.');
  175.             }
  176.         }
  177.     }
  178.     public function onCustomerLogoutEvent(CustomerLogoutEvent $event)
  179.     {
  180.         $request $this->requestStack->getCurrentRequest();
  181.         // reset selection in session
  182.         $request->getSession()->set(AddressbookController::ADDRESS_TYPE_SESSION_TYPE_KEYnull);
  183.         $request->getSession()->set(AddressbookController::ADDRESS_TYPE_SESSION_DATA_KEYnull);
  184.     }
  185. }