custom/static-plugins/EfbStorefront/Subscriber/OrderSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Uandi\EFB\Storefront\Subscriber;
  4. use Exception;
  5. use Psr\Log\LoggerInterface;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Checkout\Order\OrderEvents;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Shopware\Core\Checkout\Cart\AbstractCartPersister;
  10. use Uandi\EFB\Storefront\Struct\CartPreferenceExtension;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  15. class OrderSubscriber implements EventSubscriberInterface
  16. {
  17.     private EntityRepositoryInterface $orderRepository;
  18.     private RequestStack $requestStack;
  19.     private AbstractCartPersister $cartPersister;
  20.     private LoggerInterface $logger;
  21.     private EntityRepositoryInterface $customerRepository;
  22.     public function __construct(
  23.         EntityRepositoryInterface $orderRepository,
  24.         RequestStack $requestStack,
  25.         AbstractCartPersister $cartPersister,
  26.         LoggerInterface $logger,
  27.         EntityRepositoryInterface $customerRepository
  28.     ) {
  29.         $this->orderRepository $orderRepository;
  30.         $this->requestStack $requestStack;
  31.         $this->cartPersister $cartPersister;
  32.         $this->logger $logger;
  33.         $this->customerRepository $customerRepository;
  34.     }
  35.     public static function getSubscribedEvents(): array
  36.     {
  37.         return [
  38.             OrderEvents::ORDER_WRITTEN_EVENT => 'onOrderWritten'
  39.         ];
  40.     }
  41.     public function onOrderWritten(EntityWrittenEvent $event)
  42.     {
  43.         $request $this->requestStack->getCurrentRequest();
  44.         if (null === $request) return;
  45.         /** @var SalesChannelContext $salesChannelContext */
  46.         $salesChannelContext $request->get('sw-sales-channel-context') ?? null;
  47.         if (null === $salesChannelContext) {
  48.             $this->logger->error('Not possible to save preferences into order. salesChannelContext not found.');
  49.             return;
  50.         }
  51.         if ($salesChannelContext->getCustomerId()) {
  52.             $this->tagCustomer($salesChannelContext->getCustomerId(), $event->getContext());
  53.         }
  54.         $av_contact_person $request->get('av_contact_person') ? $request->get('av_contact_person') : null;
  55.         $av_phone_number $request->get('av_phone_number') ? $request->get('av_phone_number') : null;
  56.         $av_active $request->get('av_active') ? 'true' 'false';
  57.         $context $event->getContext();
  58.         foreach ($event->getWriteResults() as $writeResult) {
  59.             if ($writeResult->getExistence() !== null && $writeResult->getExistence()->exists()) continue;
  60.             if ($writeResult->getOperation() !== 'insert') continue;
  61.             $payload $writeResult->getPayload();
  62.             if (empty($payload)) continue;
  63.             $customFields = !empty($payload['customFields']) ? $payload['customFields'] : [];
  64.             if (!empty($customFields) && !empty($customFields['preferences'])) continue;
  65.             try {
  66.                 $customFields['preferences'] = $this->getCartPreferences($salesChannelContext->getToken() ?? ''$salesChannelContext);
  67.                 $customFields['av_contact_person'] = $av_contact_person;
  68.                 $customFields['av_phone_number'] = $av_phone_number;
  69.                 $customFields['av_active'] = $av_active;
  70.                 $data = [
  71.                     [
  72.                         'id' => $payload['id'],
  73.                         'customFields' => $customFields
  74.                     ]
  75.                 ];
  76.                 $this->orderRepository->update($data$context);
  77.             } catch (Exception $exception) {
  78.                 $this->logger->error('Error while processing saving preferences into order: ' $exception->getMessage());
  79.             }
  80.         }
  81.     }
  82.     private function getCartPreferences(string $cartTokenSalesChannelContext $salesChannelContext): array
  83.     {
  84.         $cart $this->cartPersister->load($cartToken$salesChannelContext);
  85.         $cartPreferences $cart->getExtension(CartPreferenceExtension::NAME);
  86.         return $cartPreferences->getCartPreferences() ?? [];
  87.     }
  88.     private function tagCustomer(string $customerIdContext $context): void
  89.     {
  90.         $this->customerRepository->upsert([[
  91.             'id' => $customerId,
  92.             'customFields' => ['emz_customer_has_ordered_in_shop' => true]
  93.         ]], $context);
  94.     }
  95. }