custom/plugins/ShopsyKlaviyo6/src/Subscriber/Subscriber.php line 509

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopsy\ShopsyKlaviyo\Subscriber;
  3. use Frosh\ShareBasket\Services\ShareBasketServiceInterface;
  4. use KlaviyoAPI\KlaviyoAPI;
  5. use Shopsy\ShopsyKlaviyo\Service\DalService;
  6. use Shopsy\ShopsyKlaviyo\Service\KlaviyoEventService;
  7. use Shopware\Core\Checkout\Cart\Cart;
  8. use Shopware\Core\Checkout\Cart\Event\AfterLineItemAddedEvent;
  9. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  10. use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity;
  11. use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
  12. use Shopware\Core\Checkout\Order\Event\OrderStateMachineStateChangeEvent;
  13. use Shopware\Core\Checkout\Order\OrderDefinition;
  14. use Shopware\Core\Checkout\Order\OrderEntity;
  15. use Shopware\Core\Checkout\Order\OrderEvents;
  16. use Shopware\Core\Content\Newsletter\NewsletterEvents;
  17. use Shopware\Core\Content\Product\ProductEntity;
  18. use Shopware\Core\Defaults;
  19. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  20. use Shopware\Core\Framework\Event\ShopwareSalesChannelEvent;
  21. use Shopware\Core\Framework\Struct\ArrayEntity;
  22. use Shopware\Core\System\SalesChannel\SalesChannelEntity;
  23. use Shopware\Core\System\SystemConfig\SystemConfigService;
  24. use Shopware\Storefront\Event\StorefrontRenderEvent;
  25. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  26. use Shopware\Storefront\Page\Page;
  27. use Shopware\Storefront\Page\Product\ProductPage;
  28. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  29. use Symfony\Component\HttpFoundation\RequestStack;
  30. class Subscriber implements EventSubscriberInterface
  31. {
  32.     /**
  33.      * @var SystemConfigService
  34.      */
  35.     private $systemConfigService;
  36.     /**
  37.      * @var RequestStack
  38.      */
  39.     private $requestStack;
  40.     /**
  41.      * @var DalService $dalService
  42.      */
  43.     private $dalService;
  44.     /**
  45.      * @var KlaviyoEventService $klaviyoEventService
  46.      */
  47.     private $klaviyoEventService;
  48.     /**
  49.      * @var ShareBasketServiceInterface $shareBasketService
  50.      */
  51.     private $shareBasketService;
  52.     public function __construct(
  53.         SystemConfigService $systemConfigService,
  54.         RequestStack $requestStack,
  55.         DalService $dalService,
  56.         KlaviyoEventService $klaviyoEventService,
  57.         $shareBasketService null
  58.     ) {
  59.         $this->systemConfigService $systemConfigService;
  60.         $this->requestStack $requestStack;
  61.         $this->dalService $dalService;
  62.         $this->klaviyoEventService $klaviyoEventService;
  63.         $this->shareBasketService $shareBasketService;
  64.     }
  65.     public static function getSubscribedEvents(): array
  66.     {
  67.         return [
  68.             StorefrontRenderEvent::class => 'onStorefrontRender',
  69.             OrderEvents::ORDER_WRITTEN_EVENT => 'onOrderWritten',
  70.             CheckoutFinishPageLoadedEvent::class => 'onOrderPlaced',
  71.             NewsletterEvents::NEWSLETTER_RECIPIENT_WRITTEN_EVENT => 'onNewsletterWritten',
  72.             AfterLineItemAddedEvent::class => 'onAfterLineItemAdd',
  73.             'state_enter.order_transaction.state.paid' => 'onOrderStateChanged',
  74.             'state_enter.order_delivery.state.shipped' => 'onOrderStateChanged',
  75.             'state_enter.order_transaction.state.cancelled' => 'onOrderStateChanged',
  76.             'state_enter.order_transaction.state.refunded' => 'onOrderStateChanged'
  77.         ];
  78.     }
  79.     /**
  80.      * @param EntityWrittenEvent $event
  81.      */
  82.     public function onNewsletterWritten(EntityWrittenEvent $event)
  83.     {
  84.         $payload $event->getWriteResults()[0]->getPayload();
  85.         if($payload['email'] == '') {
  86.             return;
  87.         }
  88.         $salesChannelId $payload['salesChannelId'] ?? $event->getContext()->getSource()->getSalesChannelId();
  89.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannelId) == '') {
  90.             return;
  91.         }
  92.         $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannelId), '');
  93.         if($klaviyo->api_key == '') {
  94.             return;
  95.         }
  96.         $salesChannel $this->dalService->getSalesChannel($salesChannelId$event->getContext());
  97.         $klaviyoListId $this->getKlaviyoList($klaviyo$salesChannel);
  98.         if($klaviyoListId == '') {
  99.             return;
  100.         }
  101.         //unsubscribe remove from newsletter list
  102.         if(isset($payload['status']) && $payload['status'] == 'optOut') {
  103.             $unsubscribeProfile = array(
  104.                 'data' => array(
  105.                     'type' => 'profile-unsubscription-bulk-create-job',
  106.                     'attributes' => array(
  107.                         'list_id' => $klaviyoListId,
  108.                         'emails' => $payload['email']
  109.                     )
  110.                 )
  111.             );
  112.             $klaviyo->Profiles->unsubscribeProfiles($unsubscribeProfile);
  113.         }
  114.         else {
  115.             //check if email is already in list
  116.             $filter 'any(email,["' $payload['email']. '"])';
  117.             $newsletterProfile $klaviyo->Lists->getListProfiles($klaviyoListIdnullnull$filternull1);
  118.             if (count($newsletterProfile['data']) > && isset($newsletterProfile[0]['id']) && $newsletterProfile[0]['id'] != '') {
  119.                 return;
  120.             }
  121.             //subscribe add to newsletter list
  122.             $newsletterProfileBody = array(
  123.                 'data' => array(
  124.                     'type' => 'profile-subscription-bulk-create-job',
  125.                     'attributes' => array(
  126.                         'list_id' => $klaviyoListId,
  127.                         'subscriptions' => [
  128.                             array(
  129.                                 "channels" => array(
  130.                                     "email" => [
  131.                                         "MARKETING"
  132.                                     ]
  133.                                 ),
  134.                                 'email' => $payload['email']
  135.                             )
  136.                         ]
  137.                     )
  138.                 )
  139.             );
  140.             $klaviyo->Profiles->subscribeProfiles($newsletterProfileBody);
  141.         }
  142.     }
  143.     /**
  144.      * @param StorefrontRenderEvent $event
  145.      * @return void
  146.      */
  147.     public function onStorefrontRender(StorefrontRenderEvent $event): void
  148.     {
  149.         $shopId $event->getSalesChannelContext()->getSalesChannel()->getId();
  150.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId) == ''
  151.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId) == '') {
  152.             return;
  153.         }
  154.         if(!isset($event->getParameters('page')['page'])) {
  155.             return;
  156.         }
  157.         $page $event->getParameters('page')['page'];
  158.         $customer $event->getSalesChannelContext()->getCustomer();
  159.         $controllerData $this->getCurrentController();
  160.         if($controllerData[1] === 'Affiliate') {
  161.             return;
  162.         }
  163.         if($event->getRequest()->get('backInStockSuccess')) {
  164.             $page->assign([
  165.                 'backInStockSuccess' => true
  166.             ]);
  167.         }
  168.         if($page instanceof ProductPage) {
  169.             $page->assign([
  170.                 'backInStock' => $this->systemConfigService->get('ShopsyKlaviyo6.config.backInStock'$shopId)
  171.             ]);
  172.         }
  173.         $category '';
  174.         if ($controllerData[1] == 'Product') {
  175.             $pageData $event->getParameters('page');
  176.             if (is_array($pageData) && array_key_exists('page'$pageData)) {
  177.                 $productPage $pageData['page'];
  178.                 if ($productPage instanceof ProductPage) {
  179.                     $productEntity $productPage->getProduct();
  180.                     if ($productEntity && $productEntity instanceof ProductEntity) {
  181.                         $category $this->dalService->getCategory($productEntity->getCategoryTree(), $event->getContext());
  182.                     }
  183.                 }
  184.             }
  185.         }
  186.         if($controllerData[1] == 'Register' && $controllerData[2] == 'checkoutRegisterPage') {
  187.             $this->setKlaviyoCartItemExtension($event->getParameters()['page']->getCart(), $shopId$event);
  188.         }
  189.         if(!$customer) {
  190.             if($page instanceof Page) {
  191.                 $salesChannel $this->dalService->getSalesChannel($event->getSalesChannelContext()->getSalesChannelId(), $event->getContext());
  192.                 $page->assign([
  193.                     'shopsyKlaviyo' => [
  194.                         'apiKey' => $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId),
  195.                         'cookieRequired' => $this->systemConfigService->get('ShopsyKlaviyo6.config.cookieRequired'$shopId),
  196.                         'trackingMethod' => $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId),
  197.                         'category' => $category,
  198.                         'salesChannel' => $salesChannel->getName()
  199.                     ]
  200.                 ]);
  201.             }
  202.             return;
  203.         }
  204.         $customer->setGroup($event->getSalesChannelContext()->getCurrentCustomerGroup());
  205.         if($customer->getBirthday() == '') {
  206.             $customerBirthday null;
  207.         }
  208.         else {
  209.             $customerBirthday $customer->getBirthday()->format("m/d/Y");
  210.         }
  211.         if($customer->getNewsletter() == '') {
  212.             $newsletter 0;
  213.         }
  214.         else {
  215.             $newsletter 1;
  216.         }
  217.         $checkOutURL '';
  218.         if($controllerData[1] == 'Product' && $controllerData[2] == 'index'
  219.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide' && !$event->getRequest()->get('backInStockSuccess')) {
  220.             if (isset($event->getParameters('page')['page'])) {
  221.                 /** @var ProductEntity $product */
  222.                 $product $event->getParameters('page')['page']->getProduct();
  223.                 if($product) {
  224.                     $category $this->dalService->getCategory($product->getCategoryTree(), $event->getContext());
  225.                 }
  226.                 $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32);
  227.                 if($klaviyo->api_key == '') {
  228.                     return;
  229.                 }
  230.                 $this->klaviyoEventService->trackViewedProduct($klaviyo$customer$customerBirthday$newsletter$product$category);
  231.             }
  232.         }
  233.         elseif($controllerData[1] == 'Checkout' && $controllerData[2] == 'confirmPage') {
  234.             $this->setKlaviyoCartItemExtension($event->getParameters()['page']->getCart(), $shopId$event);
  235.             // Plugin "ShareBasket" from "Friends of Shopware" needed!
  236.             if($this->shareBasketService != null) {
  237.                 $data $this->shareBasketService->prepareLineItems($event->getSalesChannelContext());
  238.                 $checkOutURL $this->shareBasketService->saveCart($data$event->getSalesChannelContext());
  239.             }
  240.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  241.                 $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32);
  242.                 if($klaviyo->api_key == '') {
  243.                     return;
  244.                 }
  245.                 $cart $event->getParameters()['page']->getCart();
  246.                 if($cart) {
  247.                     $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  248.                     $this->klaviyoEventService->trackStartedCheckout($klaviyo$customer$customerBirthday$newsletter$cart$excludeTypes$event$checkOutURL);
  249.                 }
  250.             }
  251.         }
  252.         elseif($controllerData[1] == 'Checkout' && $controllerData[2] == 'finishPage') {
  253.             if (method_exists($event->getParameters('page')['page'], 'getOrder')) {
  254.                 /** @var OrderEntity $order */
  255.                 $order $event->getParameters('page')['page']->getOrder();
  256.                 $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  257.                 /** @var OrderLineItemEntity $lineItem */
  258.                 foreach ($order->getLineItems() as $lineItem) {
  259.                     if (!in_array($lineItem->getType(), $excludeTypes)) {
  260.                         if(array_key_exists('categoryIds'$lineItem->getPayload())) {
  261.                             $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  262.                         }
  263.                         else {
  264.                             $category null;
  265.                         }
  266.                         $manufacturer $this->dalService->getManufacturer($lineItem->getProductId(), $event->getContext());
  267.                         $productUrl $this->dalService->getProductUrl(
  268.                             $lineItem->getProductId(),
  269.                             $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl()
  270.                         );
  271.                         $shopsyKlaviyoExtension = [
  272.                             'category' => $category,
  273.                             'manufacturer' => $manufacturer,
  274.                             'productUrl' => $productUrl
  275.                         ];
  276.                         $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  277.                     }
  278.                 }
  279.             }
  280.         }
  281.         $salesChannel $this->dalService->getSalesChannel($event->getSalesChannelContext()->getSalesChannelId(), $event->getContext());
  282.         $page->assign([
  283.             'shopsyKlaviyo' => [
  284.                 'apiKey' => $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId),
  285.                 'cookieRequired' => $this->systemConfigService->get('ShopsyKlaviyo6.config.cookieRequired'$shopId),
  286.                 'trackingMethod' => $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId),
  287.                 'birthday' => $customerBirthday,
  288.                 'phoneNumber' => $customer->getActiveBillingAddress()->getPhoneNumber(),
  289.                 'customerGroup' => $customer->getGroup()->getName(),
  290.                 'newsletter' => $newsletter,
  291.                 'category' => $category,
  292.                 'salesChannel' => $salesChannel->getName(),
  293.                 'checkOutURL' => $checkOutURL
  294.             ]
  295.         ]);
  296.     }
  297.     /**
  298.      * @param CheckoutFinishPageLoadedEvent $event
  299.      * @return void
  300.      */
  301.     public function onOrderPlaced(CheckoutFinishPageLoadedEvent $event)
  302.     {
  303.         $order $event->getPage()->getOrder();
  304.         $shopId $event->getSalesChannelContext()->getSalesChannelId();
  305.         if ($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  306.             $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  307.             foreach ($order->getLineItems() as $lineItem) {
  308.                 if (!in_array($lineItem->getType(), $excludeTypes)) {
  309.                     if (array_key_exists('categoryIds'$lineItem->getPayload())) {
  310.                         $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  311.                     } else {
  312.                         $category null;
  313.                     }
  314.                     $manufacturer $this->dalService->getManufacturer($lineItem->getProductId(), $event->getContext());
  315.                     $productUrl $this->dalService->getProductUrl(
  316.                         $lineItem->getProductId(),
  317.                         ''
  318.                     );
  319.                     $shopsyKlaviyoExtension = [
  320.                         'category' => $category,
  321.                         'manufacturer' => $manufacturer,
  322.                         'productUrl' => $productUrl
  323.                     ];
  324.                     $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  325.                 }
  326.             }
  327.             $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32);
  328.             if ($klaviyo->api_key == '') {
  329.                 return;
  330.             }
  331.             if ($event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getBirthday() == '') {
  332.                 $customerBirthday null;
  333.             } else {
  334.                 $customerBirthday $event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getBirthday()->format("m/d/Y");
  335.             }
  336.             $this->klaviyoEventService->trackCheckoutCompleted($klaviyo$event->getPage()->getOrder()->getOrderCustomer()->getCustomer(), $customerBirthday$event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getNewsletter(), $order$excludeTypes$event);
  337.         }
  338.     }
  339.     /**
  340.      * @param EntityWrittenEvent $event
  341.      */
  342.     public function onOrderWritten(EntityWrittenEvent $event): void
  343.     {
  344.         if ($event->getEntityName() !== OrderDefinition::ENTITY_NAME
  345.             || $event->getWriteResults()[0]->getOperation() ==='update') {
  346.             return;
  347.         }
  348.         $versionId $event->getWriteResults()[0]->getPayload()['versionId'];
  349.         if($versionId !== Defaults::LIVE_VERSION) {
  350.             return;
  351.         }
  352.         $shopId $event->getWriteResults()[0]->getPayload()['salesChannelId'];
  353.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId) == ''
  354.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId) == '') {
  355.             return;
  356.         }
  357.         $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32);
  358.         if($klaviyo->api_key == '') {
  359.             return;
  360.         }
  361.         /** @var OrderCustomerEntity $customer */
  362.         $customer $this->dalService->getCustomer($event->getPayloads()[0]['id'], $event->getContext());
  363.         $lineItems $this->dalService->getLineItems($event->getPayloads()[0]['id'], $event->getContext());
  364.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  365.         /** @var OrderLineItemEntity $lineItem */
  366.         foreach ($lineItems as $lineItem) {
  367.             if(!in_array($lineItem->getType(), $excludeTypes)) {
  368.                 $category $this->dalService->getCategory($lineItem->getProduct()->getCategoryTree(), $event->getContext());
  369.                 if ($this->systemConfigService->get('ShopsyKlaviyo6.config.trackOrderedProduct'$shopId)) {
  370.                     $this->klaviyoEventService->trackOrderedProduct($klaviyo$customer$lineItem$category,
  371.                         $event->getContext(), $event);
  372.                 }
  373.             }
  374.         }
  375.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackPlacedOrder'$shopId)) {
  376.             $this->klaviyoEventService->trackPlacedOrder($klaviyo$lineItems$excludeTypes$customer$event->getContext(), $event$this->systemConfigService->get('ShopsyKlaviyo6.config.trackPlacedOrderExtraData'$shopId));
  377.         }
  378.     }
  379.     /**
  380.      * @param OrderStateMachineStateChangeEvent $event
  381.      */
  382.     public function onOrderStateChanged(OrderStateMachineStateChangeEvent $event): void
  383.     {
  384.         $context $event->getContext();
  385.         $salesChannel $event->getSalesChannelId();
  386.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$salesChannel) == ''
  387.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannel) == '') {
  388.             return;
  389.         }
  390.         $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannel), 32);
  391.         if($klaviyo->api_key == '') {
  392.             return;
  393.         }
  394.         $order $this->dalService->getOrder($event->getOrder()->getId());
  395.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$salesChannel));
  396.         $orderCustomFields $order->getCustomFields();
  397.         if($event->getName() == 'state_enter.order_delivery.state.shipped' && (!isset($orderCustomFields) || !isset($orderCustomFields['shopsy_klaviyo_tracked_fulfilled_order']) || $orderCustomFields['shopsy_klaviyo_tracked_fulfilled_order'] == 0)) {
  398.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackFulfilledOrder'$salesChannel)) {
  399.                 $this->klaviyoEventService->trackFulfilledOrder($klaviyo$order$excludeTypes$context);
  400.                 $this->dalService->setShopsyKlaviyoTrackedFulfilledOrder($order->getId());
  401.             }
  402.         }
  403.         if($event->getName() == 'state_enter.order_transaction.state.paid' && (!isset($orderCustomFields) || !isset($orderCustomFields['shopsy_klaviyo_tracked_purchased_items']) || $orderCustomFields['shopsy_klaviyo_tracked_purchased_items'] == 0)) {
  404.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackPurchasedItems'$salesChannel)) {
  405.                 $this->klaviyoEventService->trackPurchasedItems($klaviyo$order$excludeTypes$context);
  406.                 $this->dalService->setShopsyKlaviyoTrackPurchasedItemsOrder($order->getId());
  407.             }
  408.         }
  409.         if($event->getName() == 'state_enter.order_transaction.state.cancelled' && (!isset($orderCustomFields) || !isset($orderCustomFields['shopsy_klaviyo_tracked_cancelled_order']) || $orderCustomFields['shopsy_klaviyo_tracked_cancelled_order'] == 0)) {
  410.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackCancelledOrder'$salesChannel)) {
  411.                 $this->klaviyoEventService->trackCancelledOrder($klaviyo$order$excludeTypes$context);
  412.                 $this->dalService->setShopsyKlaviyoTrackedCancelledOrder($order->getId());
  413.             }
  414.         }
  415.         if($event->getName() == 'state_enter.order_transaction.state.refunded' && (!isset($orderCustomFields) || !isset($orderCustomFields['shopsy_klaviyo_tracked_refunded_order']) || $orderCustomFields['shopsy_klaviyo_tracked_refunded_order'] == 0)) {
  416.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackRefundedOrder'$salesChannel)) {
  417.                 $this->klaviyoEventService->trackRefundedOrder($klaviyo$order$excludeTypes$context);
  418.                 $this->dalService->setShopsyKlaviyoTrackedRefundedOrder($order->getId());
  419.             }
  420.         }
  421.     }
  422.     /**
  423.      * @param ShopwareSalesChannelEvent $event
  424.      * @return void
  425.      */
  426.     public function onAfterLineItemAdd(ShopwareSalesChannelEvent $event)
  427.     {
  428.         $shopId $event->getSalesChannelContext()->getSalesChannel()->getId();
  429.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  430.             $customer $event->getSalesChannelContext()->getCustomer();
  431.             if(!$customer) {
  432.                 return;
  433.             }
  434.             $customer->setGroup($event->getSalesChannelContext()->getCurrentCustomerGroup());
  435.             if ($event->getLineItems()[0]) {
  436.                 $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  437.                 /** @var LineItem $lineItem */
  438.                 $lineItem $event->getLineItems()[0];
  439.                 if(!in_array($lineItem->getType(), $excludeTypes) && $lineItem->getLabel() != '') {
  440.                     $category '';
  441.                     if(isset($lineItem->getPayload()['categoryIds'])) {
  442.                         $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  443.                     }
  444.                     $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32);
  445.                     if ($klaviyo->api_key == '') {
  446.                         return;
  447.                     }
  448.                     $customer $event->getSalesChannelContext()->getCustomer();
  449.                     if($customer->getBirthday() == '') {
  450.                         $customerBirthday null;
  451.                     }
  452.                     else {
  453.                         $customerBirthday $customer->getBirthday()->format("m/d/Y");
  454.                     }
  455.                     if($customer->getNewsletter() == '') {
  456.                         $newsletter 0;
  457.                     }
  458.                     else {
  459.                         $newsletter 1;
  460.                     }
  461.                     $this->klaviyoEventService->trackAddedToCart($klaviyo$customer$customerBirthday$newsletter$lineItem$category);
  462.                 }
  463.             }
  464.         }
  465.     }
  466.     /**
  467.      * @return array|false
  468.      */
  469.     private function getCurrentController()
  470.     {
  471.         $controllerData = [];
  472.         $currentRequest $this->requestStack->getCurrentRequest();
  473.         $currentController $currentRequest->attributes->get('_controller');
  474.         if(!$currentController) {
  475.             return false;
  476.         }
  477.         preg_match('/Controller\\\\(\w+)Controller::?(\w+)$/'$currentController$controllerData);
  478.         return $controllerData;
  479.     }
  480.     /**
  481.      * @param $cart
  482.      * @param $shopId
  483.      * @param $event
  484.      */
  485.     private function setKlaviyoCartItemExtension($cart$shopId$event) {
  486.         /** @var Cart $cart */
  487.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  488.         /** @var LineItem $lineItem */
  489.         foreach ($cart->getLineItems() as $lineItem) {
  490.             if(!in_array($lineItem->getType(), $excludeTypes)) {
  491.                 $category $this->dalService->getCategory($lineItem->getPayloadValue('categoryIds'), $event->getContext());
  492.                 $productUrl $this->dalService->getProductUrl(
  493.                     $lineItem->getId(),
  494.                     $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl()
  495.                 );
  496.                 $shopsyKlaviyoExtension = [
  497.                     'category' => $category,
  498.                     'productUrl' => $productUrl
  499.                 ];
  500.                 $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  501.             }
  502.         }
  503.     }
  504.     /**
  505.      * @param KlaviyoAPI $klaviyo
  506.      * @param SalesChannelEntity $salesChannel
  507.      * @return mixed|string
  508.      */
  509.     private function getKlaviyoList(KlaviyoAPI $klaviyoSalesChannelEntity $salesChannel) {
  510.         //get klaviyo newsletter list depending on saleschannel name
  511.         $listName 'Shopware_Newsletter_' $salesChannel->getTranslated()['name'];
  512.         $filter 'equals(name,"' $listName '")';
  513.         $klaviyoList $klaviyo->Lists->getLists(null$filternull);
  514.         if(count($klaviyoList['data']) > 0) {
  515.             $klaviyoListId '';
  516.             if($klaviyoList['data'][0]['type'] == 'list' && $klaviyoList['data'][0]['attributes']['name'] == 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']) {
  517.                 return $klaviyoList['data'][0]['id'];
  518.             }
  519.             //create new newsletterlist in Klaviyo
  520.             if($klaviyoListId == '') {
  521.                 $newsletterList = array(
  522.                     'data' => array(
  523.                         'type' => 'list',
  524.                         'attributes' => array(
  525.                             'name' => 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']
  526.                         )
  527.                     )
  528.                 );
  529.                 $newKlaviyoList $klaviyo->Lists->createList($newsletterList);
  530.                 if(isset($newKlaviyoList['data']['id'])) {
  531.                     return $newKlaviyoList['data']['id'];
  532.                 }
  533.             }
  534.         }
  535.         else {
  536.             //create new newsletterlist in Klaviyo
  537.             $newsletterList = array(
  538.                 'data' => array(
  539.                     'type' => 'list',
  540.                     'attributes' => array(
  541.                         'name' => 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']
  542.                     )
  543.                 )
  544.             );
  545.             $newKlaviyoList $klaviyo->Lists->createList($newsletterList);
  546.             if(isset($newKlaviyoList['data']['id'])) {
  547.                 return $newKlaviyoList['data']['id'];
  548.             }
  549.         }
  550.         return '';
  551.     }
  552. }