custom/plugins/NewsletterSendinblue/src/Subscriber/CartOrderSubscriber.php line 138

Open in your IDE?
  1. <?php
  2. namespace NewsletterSendinblue\Subscriber;
  3. use Monolog\Logger;
  4. use NewsletterSendinblue\Service\BaseSyncService;
  5. use NewsletterSendinblue\Service\Cart\CartEventProducer;
  6. use NewsletterSendinblue\Service\ConfigService;
  7. use NewsletterSendinblue\Service\Constant;
  8. use NewsletterSendinblue\Service\Customer\CustomerProducer;
  9. use NewsletterSendinblue\Service\OrderSyncService;
  10. use NewsletterSendinblue\Traits\HelperTrait;
  11. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  12. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  13. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionDefinition;
  14. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  15. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
  16. use Shopware\Core\Checkout\Order\OrderDefinition;
  17. use Shopware\Core\Checkout\Order\OrderEntity;
  18. use Shopware\Core\Checkout\Order\OrderStates;
  19. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  20. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  21. use Shopware\Core\System\StateMachine\Aggregation\StateMachineState\StateMachineStateEntity;
  22. use Shopware\Core\System\StateMachine\Event\StateMachineTransitionEvent;
  23. use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity;
  24. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  25. use Symfony\Component\HttpFoundation\RequestStack;
  26. class CartOrderSubscriber implements EventSubscriberInterface
  27. {
  28.     use HelperTrait;
  29.     const ORDER_OPEN 'open';
  30.     /**
  31.      * @var ConfigService
  32.     */
  33.     private $configService;
  34.     /**
  35.      * @var CartEventProducer
  36.     */
  37.     private $cartEventProducer;
  38.     /**
  39.      * @var CustomerProducer
  40.      */
  41.     private $customerProducer;
  42.     /**
  43.      * @var EntityRepositoryInterface
  44.      */
  45.     private $systemConfigRepository;
  46.     /**
  47.      * @var EntityRepositoryInterface
  48.      */
  49.     private $orderTransactionRepository;
  50.     /**
  51.      * @var OrderSyncService
  52.      */
  53.     private $orderSyncService;
  54.     /**
  55.      * @var Logger
  56.      */
  57.     private $logger;
  58.     /**
  59.      * @var EntityRepositoryInterface
  60.      */
  61.     private $brevoAbandonedCartRepository;
  62.     /**
  63.      * @var BaseSyncService
  64.      */
  65.     private $productSyncService;
  66.     /**
  67.      * @var RequestStack
  68.      */
  69.     private $requestStack;
  70.     /**
  71.      * @param ConfigService $configService
  72.      * @param CartEventProducer $cartEventProducer
  73.      * @param CustomerProducer $customerProducer
  74.      * @param EntityRepositoryInterface $systemConfigRepository
  75.      * @param EntityRepositoryInterface $orderTransactionRepository
  76.      * @param OrderSyncService $orderSyncService
  77.      * @param Logger $logger
  78.      * @param EntityRepositoryInterface $brevoAbandonedCartRepository
  79.      * @param BaseSyncService $productSyncService
  80.      * @param RequestStack $requestStack
  81.      */
  82.     public function __construct(
  83.         ConfigService             $configService,
  84.         CartEventProducer         $cartEventProducer,
  85.         CustomerProducer          $customerProducer,
  86.         EntityRepositoryInterface $systemConfigRepository,
  87.         EntityRepositoryInterface $orderTransactionRepository,
  88.         OrderSyncService          $orderSyncService,
  89.         Logger                    $logger,
  90.         EntityRepositoryInterface $brevoAbandonedCartRepository,
  91.         BaseSyncService           $productSyncService,
  92.         RequestStack              $requestStack
  93.     )
  94.     {
  95.         $this->configService $configService;
  96.         $this->cartEventProducer $cartEventProducer;
  97.         $this->customerProducer $customerProducer;
  98.         $this->systemConfigRepository $systemConfigRepository;
  99.         $this->orderTransactionRepository $orderTransactionRepository;
  100.         $this->orderSyncService $orderSyncService;
  101.         $this->logger $logger;
  102.         $this->brevoAbandonedCartRepository $brevoAbandonedCartRepository;
  103.         $this->productSyncService $productSyncService;
  104.         $this->requestStack $requestStack;
  105.     }
  106.     /**
  107.      * @return string[]
  108.      */
  109.     public static function getSubscribedEvents(): array
  110.     {
  111.         return [
  112.             CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
  113.             StateMachineTransitionEvent::class => 'onStateChanged',
  114.         ];
  115.     }
  116.     /**
  117.      * @param StateMachineTransitionEvent $event
  118.      * @return void
  119.      */
  120.     public function onStateChanged(StateMachineTransitionEvent $event): void
  121.     {
  122.         $connectionId $this->getAutoSyncConnectionId(
  123.             ConfigService::CONFIG_IS_ORDERS_AUTO_SYNC_ENABLED,
  124.             $event->getContext()
  125.         );
  126.         if (empty($connectionId)) {
  127.             return;
  128.         }
  129.         $entity $event->getEntityName();
  130.         $toState $event->getToPlace()->getTechnicalName();
  131.         if ($entity === OrderDefinition::ENTITY_NAME
  132.             && $toState === OrderStates::STATE_CANCELLED
  133.         ) {
  134.             $orderId $this->getOrderId($event);
  135.             if (!$orderId) {
  136.                 return;
  137.             }
  138.             $order $this->orderSyncService->getOrder($orderId$event->getContext());
  139.             if (!$order instanceof OrderEntity) {
  140.                 return;
  141.             }
  142.             foreach ($order->getLineItems() as $lineItem) {
  143.                 if ($lineItem->getType() !== LineItem::PRODUCT_LINE_ITEM_TYPE) {
  144.                     continue;
  145.                 }
  146.                 if (!empty($lineItem->getProductId())) {
  147.                     $this->productSyncService->sync(
  148.                         $lineItem->getProductId(),
  149.                         $connectionId,
  150.                         $event->getContext()
  151.                     );
  152.                 }
  153.             }
  154.         }
  155.         if (
  156.             ($entity === OrderTransactionDefinition::ENTITY_NAME
  157.                 && in_array($toStateOrderSyncService::PAYMENT_SYNC_STATUSES))
  158.         ) {
  159.             $orderId $this->getOrderId($event);
  160.             if (!$orderId) {
  161.                 return;
  162.             }
  163.             $order $this->orderSyncService->getOrder($orderId$event->getContext());
  164.             if (!$order instanceof OrderEntity) {
  165.                 return;
  166.             }
  167.             if ($toState === OrderTransactionStates::STATE_CHARGEBACK) {
  168.                 $toState OrderTransactionStates::STATE_OPEN;
  169.             }
  170.             $this->orderSyncService->sync($order$connectionId$toState$event->getContext(), true);
  171.         }
  172.     }
  173.     /**
  174.      * @param CheckoutOrderPlacedEvent $event
  175.      * @return void
  176.      */
  177.     public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
  178.     {
  179.         $this->configService->setSalesChannelId($event->getSalesChannelId());
  180.         if ($this->configService->isAutoSyncEnabled()) {
  181.             $this->cartEventProducer->createTransactionalOrder(
  182.                 $event->getOrder(), $event->getContext(), $event->getSalesChannelId()
  183.             );
  184.         }
  185.         // ORDER AUTO SYNC
  186.         $connectionId $this->getAutoSyncConnectionId(
  187.             ConfigService::CONFIG_IS_ORDERS_AUTO_SYNC_ENABLED,
  188.             $event->getContext()
  189.         );
  190.         if (!empty($connectionId)) {
  191.             $order $event->getOrder();
  192.             $toState self::ORDER_OPEN;
  193.             if ($order->getTransactions()->first() instanceof OrderTransactionEntity
  194.                 && $order->getTransactions()->first()->getStateMachineState() instanceof StateMachineStateEntity
  195.             ) {
  196.                 $toState $order->getTransactions()->first()->getStateMachineState()->getTechnicalName();
  197.             }
  198.             $this->orderSyncService->sync($order$connectionId$toState$event->getContext());
  199.         }
  200.         // PRODUCT AUTO SYNC (stock)
  201.         $productAutoSyncConnectionId $this->getAutoSyncConnectionId(
  202.             ConfigService::CONFIG_IS_PRODUCTS_AUTO_SYNC_ENABLED,
  203.             $event->getContext()
  204.         );
  205.         if (!empty($productAutoSyncConnectionId)) {
  206.             $order $event->getOrder();
  207.             foreach ($order->getLineItems() as $lineItem) {
  208.                 if ($lineItem->getType() !== LineItem::PRODUCT_LINE_ITEM_TYPE) {
  209.                     continue;
  210.                 }
  211.                 if (!empty($lineItem->getProductId())) {
  212.                     $this->productSyncService->sync(
  213.                         $lineItem->getProductId(),
  214.                         $productAutoSyncConnectionId,
  215.                         $event->getContext()
  216.                     );
  217.                 }
  218.             }
  219.         }
  220.         if ($this->configService->isAbandonedCartTrackingEnabled()) {
  221.             if ($event->getOrder()->getOrderCustomer() instanceof OrderCustomerEntity) {
  222.                 try {
  223.                     $this->brevoAbandonedCartRepository->delete([
  224.                         ['id' => md5($event->getOrder()->getOrderCustomer()->getEmail())]
  225.                     ], $event->getContext());
  226.                 } catch (\Throwable $e) {
  227.                 }
  228.             }
  229.         }
  230.         // OPT-IN ATTR
  231.         if ($this->configService->isFullCustomerSyncEnabled()
  232.             && $this->requestStack
  233.             && ($request $this->requestStack->getCurrentRequest())
  234.         ) {
  235.             try {
  236.                 $isCheckoutOptInChecked $request->request->get('brevoCheckoutConfirmOptin'false);
  237.                 $this->customerProducer->setAdditionalUpdateData([
  238.                     Constant::OPT_IN_ENABLED => $this->configService->isDisplayOptInEnabled() ? 'true' 'false',
  239.                     Constant::OPT_IN_CHECKED => $isCheckoutOptInChecked 'true' 'false',
  240.                 ]);
  241.                 $this->customerProducer->updateContact($event->getCustomerId(), $event->getContext(), $event->getSalesChannelId());
  242.             } catch (\Throwable $e) {
  243.                 $this->logger->addRecord(Logger::ERROR$e->getMessage(), ['onOrderPlaced: opt-in attr.']);
  244.             }
  245.         }
  246.     }
  247.     /**
  248.      * @param StateMachineTransitionEvent $event
  249.      * @return string|null
  250.      */
  251.     private function getOrderId(StateMachineTransitionEvent $event): ?string
  252.     {
  253.         $orderId null;
  254.         switch ($event->getEntityName()) {
  255.             case OrderDefinition::ENTITY_NAME:
  256.                 $orderId $event->getEntityId();
  257.                 break;
  258.             case OrderTransactionDefinition::ENTITY_NAME:
  259.                 $transactions $this->orderTransactionRepository->search(new Criteria([$event->getEntityId()]), $event->getContext());
  260.                 if (count($transactions) > 0) {
  261.                     $orderId $transactions->first()->getOrderId();
  262.                 }
  263.                 break;
  264.         }
  265.         return $orderId;
  266.     }
  267. }