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

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), 32, [], 'ShopwareHostedSync/Shopsy/6');
  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-subscription-bulk-delete-job',
  106.                     'attributes' => array(
  107.                         'profiles' => array(
  108.                             'data' => [
  109.                                 array(
  110.                                     'type' => 'profile',
  111.                                     'attributes' => array(
  112.                                         'email' => $payload['email']
  113.                                     )
  114.                                 )
  115.                             ]
  116.                         )
  117.                     ),
  118.                     'relationships' => array(
  119.                         'list' => array(
  120.                             'data' => array(
  121.                                 'type' => 'list',
  122.                                 'id' => $klaviyoListId
  123.                             )
  124.                         )
  125.                     )
  126.                 )
  127.             );
  128.             try {
  129.                 $klaviyo->Profiles->unsubscribeProfiles($unsubscribeProfile);
  130.             }catch (\Exception $ex) {}
  131.         }
  132.         else {
  133.             //check if email is already in list
  134.             $filter 'any(email,["' $payload['email']. '"])';
  135.             $newsletterProfile $klaviyo->Lists->getListProfiles($klaviyoListIdnullnull$filternull1);
  136.             if (count($newsletterProfile['data']) > && isset($newsletterProfile[0]['id']) && $newsletterProfile[0]['id'] != '') {
  137.                 return;
  138.             }
  139.             //subscribe add to newsletter list
  140.             $newsletterProfileBody = array(
  141.                 'data' => array(
  142.                     'type' => 'profile-subscription-bulk-create-job',
  143.                     'attributes' => array(
  144.                         'profiles' => array(
  145.                             'data' => array(
  146.                                 array(
  147.                                     'type' => 'profile',
  148.                                     'attributes' => array(
  149.                                         'email' => $payload['email'],
  150.                                         'subscriptions' => array(
  151.                                             "email" => array(
  152.                                                 'marketing' => array(
  153.                                                     'consent' => 'SUBSCRIBED'
  154.                                                 )
  155.                                             )
  156.                                         )
  157.                                     )
  158.                                 )
  159.                             )
  160.                         )
  161.                     ),
  162.                     'relationships' => array(
  163.                         'list' => array(
  164.                             'data' => array(
  165.                                 'type' => 'list',
  166.                                 'id' => $klaviyoListId
  167.                             )
  168.                         )
  169.                     )
  170.                 )
  171.             );
  172.             try {
  173.                 $klaviyo->Profiles->subscribeProfiles($newsletterProfileBody);
  174.             }catch (\Exception $ex) {}
  175.         }
  176.     }
  177.     /**
  178.      * @param StorefrontRenderEvent $event
  179.      * @return void
  180.      */
  181.     public function onStorefrontRender(StorefrontRenderEvent $event): void
  182.     {
  183.         $shopId $event->getSalesChannelContext()->getSalesChannel()->getId();
  184.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId) == ''
  185.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId) == '') {
  186.             return;
  187.         }
  188.         if(!isset($event->getParameters('page')['page'])) {
  189.             return;
  190.         }
  191.         $page $event->getParameters('page')['page'];
  192.         $customer $event->getSalesChannelContext()->getCustomer();
  193.         $controllerData $this->getCurrentController();
  194.         if($controllerData[1] === 'Affiliate') {
  195.             return;
  196.         }
  197.         if($event->getRequest()->get('backInStockSuccess')) {
  198.             $page->assign([
  199.                 'backInStockSuccess' => true
  200.             ]);
  201.         }
  202.         if($page instanceof ProductPage) {
  203.             $page->assign([
  204.                 'backInStock' => $this->systemConfigService->get('ShopsyKlaviyo6.config.backInStock'$shopId)
  205.             ]);
  206.         }
  207.         $category '';
  208.         if ($controllerData[1] == 'Product') {
  209.             $pageData $event->getParameters('page');
  210.             if (is_array($pageData) && array_key_exists('page'$pageData)) {
  211.                 $productPage $pageData['page'];
  212.                 if ($productPage instanceof ProductPage) {
  213.                     $productEntity $productPage->getProduct();
  214.                     if ($productEntity && $productEntity instanceof ProductEntity) {
  215.                         $category $this->dalService->getCategory($productEntity->getCategoryTree(), $event->getContext());
  216.                     }
  217.                 }
  218.             }
  219.         }
  220.         if($controllerData[1] == 'Register' && $controllerData[2] == 'checkoutRegisterPage') {
  221.             $this->setKlaviyoCartItemExtension($event->getParameters()['page']->getCart(), $shopId$event);
  222.         }
  223.         if(!$customer) {
  224.             if($page instanceof Page) {
  225.                 $salesChannel $this->dalService->getSalesChannel($event->getSalesChannelContext()->getSalesChannelId(), $event->getContext());
  226.                 $page->assign([
  227.                     'shopsyKlaviyo' => [
  228.                         'apiKey' => $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId),
  229.                         'cookieRequired' => $this->systemConfigService->get('ShopsyKlaviyo6.config.cookieRequired'$shopId),
  230.                         'trackingMethod' => $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId),
  231.                         'category' => $category,
  232.                         'salesChannel' => $salesChannel->getName()
  233.                     ]
  234.                 ]);
  235.             }
  236.             return;
  237.         }
  238.         $customer->setGroup($event->getSalesChannelContext()->getCurrentCustomerGroup());
  239.         if($customer->getBirthday() == '') {
  240.             $customerBirthday null;
  241.         }
  242.         else {
  243.             $customerBirthday $customer->getBirthday()->format("m/d/Y");
  244.         }
  245.         if($customer->getNewsletter() == '') {
  246.             $newsletter 0;
  247.         }
  248.         else {
  249.             $newsletter 1;
  250.         }
  251.         $checkOutURL '';
  252.         if($controllerData[1] == 'Product' && $controllerData[2] == 'index'
  253.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide' && !$event->getRequest()->get('backInStockSuccess')) {
  254.             if (isset($event->getParameters('page')['page'])) {
  255.                 if(!method_exists($event->getParameters('page')['page'], 'getProduct')) {
  256.                     return;
  257.                 }
  258.                 /** @var ProductEntity $product */
  259.                 $product $event->getParameters('page')['page']->getProduct();
  260.                 if($product) {
  261.                     $category $this->dalService->getCategory($product->getCategoryTree(), $event->getContext());
  262.                 }
  263.                 $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32, [], 'ShopwareHostedSync/Shopsy/6');
  264.                 if($klaviyo->api_key == '') {
  265.                     return;
  266.                 }
  267.                 $this->klaviyoEventService->trackViewedProduct($klaviyo$customer$customerBirthday$newsletter$product$category);
  268.             }
  269.         }
  270.         elseif($controllerData[1] == 'Checkout' && $controllerData[2] == 'confirmPage') {
  271.             $this->setKlaviyoCartItemExtension($event->getParameters()['page']->getCart(), $shopId$event);
  272.             // Plugin "ShareBasket" from "Friends of Shopware" needed!
  273.             if($this->shareBasketService != null) {
  274.                 $data $this->shareBasketService->prepareLineItems($event->getSalesChannelContext());
  275.                 $checkOutURL $this->shareBasketService->saveCart($data$event->getSalesChannelContext());
  276.             }
  277.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  278.                 $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32, [], 'ShopwareHostedSync/Shopsy/6');
  279.                 if($klaviyo->api_key == '') {
  280.                     return;
  281.                 }
  282.                 $cart $event->getParameters()['page']->getCart();
  283.                 if($cart) {
  284.                     $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  285.                     $this->klaviyoEventService->trackStartedCheckout($klaviyo$customer$customerBirthday$newsletter$cart$excludeTypes$event$checkOutURL);
  286.                 }
  287.             }
  288.         }
  289.         elseif($controllerData[1] == 'Checkout' && $controllerData[2] == 'finishPage') {
  290.             if (method_exists($event->getParameters('page')['page'], 'getOrder')) {
  291.                 /** @var OrderEntity $order */
  292.                 $order $event->getParameters('page')['page']->getOrder();
  293.                 $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  294.                 /** @var OrderLineItemEntity $lineItem */
  295.                 foreach ($order->getLineItems() as $lineItem) {
  296.                     if (!in_array($lineItem->getType(), $excludeTypes)) {
  297.                         if(array_key_exists('categoryIds'$lineItem->getPayload())) {
  298.                             $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  299.                         }
  300.                         else {
  301.                             $category null;
  302.                         }
  303.                         $manufacturer $this->dalService->getManufacturer($lineItem->getProductId(), $event->getContext());
  304.                         $productUrl $this->dalService->getProductUrl(
  305.                             $lineItem->getProductId(),
  306.                             $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl()
  307.                         );
  308.                         $shopsyKlaviyoExtension = [
  309.                             'category' => $category,
  310.                             'manufacturer' => $manufacturer,
  311.                             'productUrl' => $productUrl
  312.                         ];
  313.                         $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  314.                     }
  315.                 }
  316.             }
  317.         }
  318.         $salesChannel $this->dalService->getSalesChannel($event->getSalesChannelContext()->getSalesChannelId(), $event->getContext());
  319.         $page->assign([
  320.             'shopsyKlaviyo' => [
  321.                 'apiKey' => $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId),
  322.                 'cookieRequired' => $this->systemConfigService->get('ShopsyKlaviyo6.config.cookieRequired'$shopId),
  323.                 'trackingMethod' => $this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId),
  324.                 'birthday' => $customerBirthday,
  325.                 'phoneNumber' => $customer->getActiveBillingAddress()->getPhoneNumber(),
  326.                 'customerGroup' => $customer->getGroup()->getName(),
  327.                 'newsletter' => $newsletter,
  328.                 'category' => $category,
  329.                 'salesChannel' => $salesChannel->getName(),
  330.                 'checkOutURL' => $checkOutURL
  331.             ]
  332.         ]);
  333.     }
  334.     /**
  335.      * @param CheckoutFinishPageLoadedEvent $event
  336.      * @return void
  337.      */
  338.     public function onOrderPlaced(CheckoutFinishPageLoadedEvent $event)
  339.     {
  340.         $order $event->getPage()->getOrder();
  341.         $shopId $event->getSalesChannelContext()->getSalesChannelId();
  342.         if ($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  343.             $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  344.             foreach ($order->getLineItems() as $lineItem) {
  345.                 if (!in_array($lineItem->getType(), $excludeTypes)) {
  346.                     if (array_key_exists('categoryIds'$lineItem->getPayload())) {
  347.                         $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  348.                     } else {
  349.                         $category null;
  350.                     }
  351.                     $manufacturer $this->dalService->getManufacturer($lineItem->getProductId(), $event->getContext());
  352.                     $productUrl $this->dalService->getProductUrl(
  353.                         $lineItem->getProductId(),
  354.                         ''
  355.                     );
  356.                     $shopsyKlaviyoExtension = [
  357.                         'category' => $category,
  358.                         'manufacturer' => $manufacturer,
  359.                         'productUrl' => $productUrl
  360.                     ];
  361.                     $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  362.                 }
  363.             }
  364.             $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32, [], 'ShopwareHostedSync/Shopsy/6');
  365.             if ($klaviyo->api_key == '') {
  366.                 return;
  367.             }
  368.             if ($event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getBirthday() == '') {
  369.                 $customerBirthday null;
  370.             } else {
  371.                 $customerBirthday $event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getBirthday()->format("m/d/Y");
  372.             }
  373.             $this->klaviyoEventService->trackCheckoutCompleted($klaviyo$event->getPage()->getOrder()->getOrderCustomer()->getCustomer(), $customerBirthday$event->getPage()->getOrder()->getOrderCustomer()->getCustomer()->getNewsletter(), $order$excludeTypes$event);
  374.         }
  375.     }
  376.     /**
  377.      * @param EntityWrittenEvent $event
  378.      */
  379.     public function onOrderWritten(EntityWrittenEvent $event): void
  380.     {
  381.         if ($event->getEntityName() !== OrderDefinition::ENTITY_NAME
  382.             || $event->getWriteResults()[0]->getOperation() ==='update') {
  383.             return;
  384.         }
  385.         $versionId $event->getWriteResults()[0]->getPayload()['versionId'];
  386.         if($versionId !== Defaults::LIVE_VERSION) {
  387.             return;
  388.         }
  389.         $shopId $event->getWriteResults()[0]->getPayload()['salesChannelId'];
  390.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$shopId) == ''
  391.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId) == '') {
  392.             return;
  393.         }
  394.         $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32, [], 'ShopwareHostedSync/Shopsy/6');
  395.         if($klaviyo->api_key == '') {
  396.             return;
  397.         }
  398.         /** @var OrderCustomerEntity $customer */
  399.         $customer $this->dalService->getCustomer($event->getPayloads()[0]['id'], $event->getContext());
  400.         $lineItems $this->dalService->getLineItems($event->getPayloads()[0]['id'], $event->getContext());
  401.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  402.         /** @var OrderLineItemEntity $lineItem */
  403.         foreach ($lineItems as $lineItem) {
  404.             if(!in_array($lineItem->getType(), $excludeTypes)) {
  405.                 $category $this->dalService->getCategory($lineItem->getProduct()->getCategoryTree(), $event->getContext());
  406.                 if ($this->systemConfigService->get('ShopsyKlaviyo6.config.trackOrderedProduct'$shopId)) {
  407.                     $this->klaviyoEventService->trackOrderedProduct($klaviyo$customer$lineItem$category,
  408.                         $event->getContext(), $event);
  409.                 }
  410.             }
  411.         }
  412.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackPlacedOrder'$shopId)) {
  413.             $this->klaviyoEventService->trackPlacedOrder($klaviyo$lineItems$excludeTypes$customer$event->getContext(), $event$this->systemConfigService->get('ShopsyKlaviyo6.config.trackPlacedOrderExtraData'$shopId));
  414.         }
  415.     }
  416.     /**
  417.      * @param OrderStateMachineStateChangeEvent $event
  418.      */
  419.     public function onOrderStateChanged(OrderStateMachineStateChangeEvent $event): void
  420.     {
  421.         $context $event->getContext();
  422.         $salesChannel $event->getSalesChannelId();
  423.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoApiKey'$salesChannel) == ''
  424.             && $this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannel) == '') {
  425.             return;
  426.         }
  427.         $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$salesChannel), 32, [], 'ShopwareHostedSync/Shopsy/6');
  428.         if($klaviyo->api_key == '') {
  429.             return;
  430.         }
  431.         $order $this->dalService->getOrder($event->getOrder()->getId());
  432.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$salesChannel));
  433.         $orderCustomFields $order->getCustomFields();
  434.         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)) {
  435.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackFulfilledOrder'$salesChannel)) {
  436.                 $this->klaviyoEventService->trackFulfilledOrder($klaviyo$order$excludeTypes$context);
  437.                 $this->dalService->setShopsyKlaviyoTrackedFulfilledOrder($order->getId());
  438.             }
  439.         }
  440.         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)) {
  441.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackPurchasedItems'$salesChannel)) {
  442.                 $this->klaviyoEventService->trackPurchasedItems($klaviyo$order$excludeTypes$context);
  443.                 $this->dalService->setShopsyKlaviyoTrackPurchasedItemsOrder($order->getId());
  444.             }
  445.         }
  446.         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)) {
  447.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackCancelledOrder'$salesChannel)) {
  448.                 $this->klaviyoEventService->trackCancelledOrder($klaviyo$order$excludeTypes$context);
  449.                 $this->dalService->setShopsyKlaviyoTrackedCancelledOrder($order->getId());
  450.             }
  451.         }
  452.         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)) {
  453.             if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackRefundedOrder'$salesChannel)) {
  454.                 $this->klaviyoEventService->trackRefundedOrder($klaviyo$order$excludeTypes$context);
  455.                 $this->dalService->setShopsyKlaviyoTrackedRefundedOrder($order->getId());
  456.             }
  457.         }
  458.     }
  459.     /**
  460.      * @param ShopwareSalesChannelEvent $event
  461.      * @return void
  462.      */
  463.     public function onAfterLineItemAdd(ShopwareSalesChannelEvent $event)
  464.     {
  465.         $shopId $event->getSalesChannelContext()->getSalesChannel()->getId();
  466.         if($this->systemConfigService->get('ShopsyKlaviyo6.config.trackingMethod'$shopId) == 'serverSide') {
  467.             $customer $event->getSalesChannelContext()->getCustomer();
  468.             if(!$customer) {
  469.                 return;
  470.             }
  471.             $customer->setGroup($event->getSalesChannelContext()->getCurrentCustomerGroup());
  472.             if ($event->getLineItems()[0]) {
  473.                 $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  474.                 /** @var LineItem $lineItem */
  475.                 $lineItem $event->getLineItems()[0];
  476.                 if(!in_array($lineItem->getType(), $excludeTypes) && $lineItem->getLabel() != '') {
  477.                     $category '';
  478.                     if(isset($lineItem->getPayload()['categoryIds'])) {
  479.                         $category $this->dalService->getCategory($lineItem->getPayload()['categoryIds'], $event->getContext());
  480.                     }
  481.                     $klaviyo = new KlaviyoAPI($this->systemConfigService->get('ShopsyKlaviyo6.config.klaviyoPrivateApiKey'$shopId), 32, [], 'ShopwareHostedSync/Shopsy/6');
  482.                     if ($klaviyo->api_key == '') {
  483.                         return;
  484.                     }
  485.                     $customer $event->getSalesChannelContext()->getCustomer();
  486.                     if($customer->getBirthday() == '') {
  487.                         $customerBirthday null;
  488.                     }
  489.                     else {
  490.                         $customerBirthday $customer->getBirthday()->format("m/d/Y");
  491.                     }
  492.                     if($customer->getNewsletter() == '') {
  493.                         $newsletter 0;
  494.                     }
  495.                     else {
  496.                         $newsletter 1;
  497.                     }
  498.                     $this->klaviyoEventService->trackAddedToCart($klaviyo$customer$customerBirthday$newsletter$lineItem$category);
  499.                 }
  500.             }
  501.         }
  502.     }
  503.     /**
  504.      * @return array|false
  505.      */
  506.     private function getCurrentController()
  507.     {
  508.         $controllerData = [];
  509.         $currentRequest $this->requestStack->getCurrentRequest();
  510.         $currentController $currentRequest->attributes->get('_controller');
  511.         if(!$currentController) {
  512.             return false;
  513.         }
  514.         preg_match('/Controller\\\\(\w+)Controller::?(\w+)$/'$currentController$controllerData);
  515.         return $controllerData;
  516.     }
  517.     /**
  518.      * @param $cart
  519.      * @param $shopId
  520.      * @param $event
  521.      */
  522.     private function setKlaviyoCartItemExtension($cart$shopId$event) {
  523.         /** @var Cart $cart */
  524.         $excludeTypes explode(';'$this->systemConfigService->get('ShopsyKlaviyo6.config.excludeType'$shopId));
  525.         /** @var LineItem $lineItem */
  526.         foreach ($cart->getLineItems() as $lineItem) {
  527.             if(!in_array($lineItem->getType(), $excludeTypes)) {
  528.                 $category $this->dalService->getCategory($lineItem->getPayloadValue('categoryIds'), $event->getContext());
  529.                 $productUrl $this->dalService->getProductUrl(
  530.                     $lineItem->getId(),
  531.                     $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl()
  532.                 );
  533.                 $shopsyKlaviyoExtension = [
  534.                     'category' => $category,
  535.                     'productUrl' => $productUrl
  536.                 ];
  537.                 $lineItem->addExtension('shopsyKlaviyo', new ArrayEntity($shopsyKlaviyoExtension));
  538.             }
  539.         }
  540.     }
  541.     /**
  542.      * @param KlaviyoAPI $klaviyo
  543.      * @param SalesChannelEntity $salesChannel
  544.      * @return mixed|string
  545.      */
  546.     private function getKlaviyoList(KlaviyoAPI $klaviyoSalesChannelEntity $salesChannel) {
  547.         //get klaviyo newsletter list depending on saleschannel name
  548.         $listName 'Shopware_Newsletter_' $salesChannel->getTranslated()['name'];
  549.         $filter 'equals(name,"' $listName '")';
  550.         $klaviyoList $klaviyo->Lists->getLists(nullnull$filter'tags'null);
  551.         if(count($klaviyoList['data']) > 0) {
  552.             $klaviyoListId '';
  553.             if($klaviyoList['data'][0]['type'] == 'list' && $klaviyoList['data'][0]['attributes']['name'] == 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']) {
  554.                 return $klaviyoList['data'][0]['id'];
  555.             }
  556.             //create new newsletterlist in Klaviyo
  557.             if($klaviyoListId == '') {
  558.                 $newsletterList = array(
  559.                     'data' => array(
  560.                         'type' => 'list',
  561.                         'attributes' => array(
  562.                             'name' => 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']
  563.                         )
  564.                     )
  565.                 );
  566.                 $newKlaviyoList $klaviyo->Lists->createList($newsletterList);
  567.                 if(isset($newKlaviyoList['data']['id'])) {
  568.                     return $newKlaviyoList['data']['id'];
  569.                 }
  570.             }
  571.         }
  572.         else {
  573.             //create new newsletterlist in Klaviyo
  574.             $newsletterList = array(
  575.                 'data' => array(
  576.                     'type' => 'list',
  577.                     'attributes' => array(
  578.                         'name' => 'Shopware_Newsletter_' $salesChannel->getTranslated()['name']
  579.                     )
  580.                 )
  581.             );
  582.             $newKlaviyoList $klaviyo->Lists->createList($newsletterList);
  583.             if(isset($newKlaviyoList['data']['id'])) {
  584.                 return $newKlaviyoList['data']['id'];
  585.             }
  586.         }
  587.         return '';
  588.     }
  589. }