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

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