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

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