<?php
namespace App\Twig;
use App\Entity\Main\Cart;
use App\Entity\Main\DiscountCode;
use App\Entity\Main\Pack;
use App\Entity\Main\PackProduct;
use App\Entity\Main\Product;
use App\Entity\Main\Tracking;
use App\Entity\Main\TransactionInvoice;
use App\Entity\Main\TransactionInvoiceItem;
use App\Entity\Main\TransactionInvoicePack;
use App\Entity\Main\User;
use App\EventListener\Main\UtmTrackingListener;
use App\Services\CartManager;
use App\Services\PackManager;
use App\Services\TrackingManager;
use App\Services\ABTestManager;
use App\Services\DiscountCodeManager;
use App\Services\SiteManager;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class GoogleTagManagerExtension extends AbstractExtension
{
const
GTM_SESSION_LOGIN_EVENT_KEY = 'gtm_login_event_to_fire',
GTM_SESSION_PROMOCODE_EVENT_KEY = 'gtm_promocode_event_to_fire',
GTM_SESSION_PROMOCODE_NAME_KEY = 'gtm_promocode_name',
GTM_SESSION_PAYMENT_ERROR_EVENT_KEY = 'gtm_payment_error_event_to_fire',
GTM_SESSION_PAYMENT_3DS_SWAP_EVENT_KEY = 'gtm_payment_error_event_to_fire',
GTM_SESSION_PAYMENT_3DS_ERROR_EVENT_KEY = 'gtm_payment_error_event_to_fire'
;
const
GTM_TYPE_GA4 = 'GA4',
GTM_TYPE_UA = 'UA',
FORCE_DISPLAY_TEXT = 'data_cmp_ab=1',
FORCE_DISPLAY_SUB_TEXT = 'data_cmp_ab=2'
;
const
GTM_UA_CURRENCY_KEY = 'currencyCode',
GTM_UA_PRODUCTS_KEY = 'products',
GTM_UA_PRODUCT_ID_KEY = 'id',
GTM_UA_PRODUCT_NAME_KEY = 'name',
GTM_UA_PURCHASE_REVENUE_KEY = 'revenue',
GTM_UA_PURCHASE_REVENUE_NOT_VAT_KEY = 'revenue_not_vat',
GTM_UA_PURCHASE_ID_KEY = 'id',
GTM_GA4_CURRENCY_KEY = 'currency',
GTM_GA4_PRODUCTS_KEY = 'items',
GTM_GA4_PRODUCT_ID_KEY = 'item_id',
GTM_GA4_PRODUCT_NAME_KEY = 'item_name',
GTM_GA4_PURCHASE_REVENUE_KEY = 'value',
GTM_GA4_PURCHASE_REVENUE_NOT_VAT_KEY = 'value_not_vat',
GTM_GA4_PURCHASE_ID_KEY = 'transaction_id'
;
protected $environment;
protected $googleHeadTag = <<<TAG
<!-- Google Tag Manager -->
<script __*FORCEDISPLAY*__>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','__*GTMTAG*__');</script>
<!-- End Google Tag Manager -->
TAG;
protected $googleBodyTag = <<<TAG
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=__*GTMTAG*__"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
TAG;
// checkout step is depending on the page visited by the user.
// 0 => no cart
// 1 => cart with products inside
// 2 => shipping page is reached.
// 3 => payment page is reached
// 4 => purchase is successful.
// 99 => confirming double order
protected $steps = [
'brulafine_show_packs' => 1,
'brulafine_updateCustomPack' => 1,
'brulafine_cart' => 1,
'brulafine_confirm' => 99,
'brulafine_push_check_pack_switch' => 2,
'brulafine_updateCart' => 2,
'brulafine_discount' => 2,
'brulafine_shipping' => 2,
'brulafine_commande' => 2,
'brulafine_payment' => 3,
'brulafine_over' => 4
];
/**
* @var SiteManager
*/
private $siteManager;
/**
* @var ABTestManager
*/
private $ABTestManager;
/**
* @var TrackingManager
*/
private $trackingFactory;
/**
* @var CartManager
*/
private $cartFactory;
private $gtmEnabled;
private $gtmTagId;
private $session;
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
private $cart = 0;
private $tracking = 0;
/**
* @var PackManager
*/
private $packFactory;
/**
* @var LoggerInterface
*/
private $logger;
private $googleTagManagerVersion;
/**
* @var mixed
*/
private $brandName;
/**
* @var DiscountCodeManager
*/
private DiscountCodeManager $discountCodeManager;
/**
* @var mixed
*/
private $siteName;
private string $locale;
/**
* GoogleTagManagerExtension constructor.
* @param $environment
* @param TrackingManager $trackingFactory
* @param SiteManager $siteManager
* @param ABTestManager $ABTestManager
* @param CartManager $cartFactory
* @param RequestStack $requestStack
* @param TokenStorageInterface $tokenStorage
* @param $gtmEnabled
* @param $gtmTagId
* @param PackManager $packFactory
* @param LoggerInterface $logger
* @param DiscountCodeManager $discountCodeManager
*/
public function __construct(
$environment,
TrackingManager $trackingFactory,
SiteManager $siteManager,
ABTestManager $ABTestManager,
CartManager $cartFactory,
RequestStack $requestStack,
TokenStorageInterface $tokenStorage,
$gtmEnabled,
$gtmTagId,
PackManager $packFactory,
LoggerInterface $logger,
DiscountCodeManager $discountCodeManager
) {
$this->environment = $environment;
$this->siteManager = $siteManager;
$this->ABTestManager = $ABTestManager;
$this->trackingFactory = $trackingFactory;
$this->cartFactory = $cartFactory;
$this->gtmEnabled = $gtmEnabled;
$this->gtmTagId = $gtmTagId;
$this->requestStack = $requestStack;
$this->tokenStorage = $tokenStorage;
$this->packFactory = $packFactory;
$this->logger = $logger;
$this->googleTagManagerVersion = $this->siteManager->getYamlConfigParameter('google_tag_manager_version');
$this->brandName = $this->siteManager->getYamlConfigParameter('brandName');
$this->siteName = $this->siteManager->getYamlConfigParameter('websiteName');
$this->discountCodeManager = $discountCodeManager;
if ($this->requestStack->getCurrentRequest()) {
$this->session = $this->requestStack->getCurrentRequest()->getSession();
$this->locale = $this->requestStack->getCurrentRequest()->getLocale();
}
}
/**
* @return array|TwigFunction[]
*/
public function getFunctions(): array
{
return [
new TwigFunction('getGTMHeadTag', [$this, 'getGTMHeadTag'], ['is_safe' => ['html']]),
new TwigFunction('getGTMBodyTag', [$this, 'getGTMBodyTag'], ['is_safe' => ['html']]),
new TwigFunction('getGTMLayerTag', [$this, 'getGTMLayerTag'], ['is_safe' => ['html']]),
new TwigFunction('getGTMEvents', [$this, 'getGTMEvents'], ['is_safe' => ['html']]),
];
}
/**
* @return mixed
*/
public function getGTMHeadTag($forceLoading = true)
{
if (!$this->gtmEnabled) {
return '';
}
if (!isset($this->gtmTagId[$this->locale])) {
return '';
}
$tag = str_replace("__*GTMTAG*__", $this->gtmTagId[$this->locale], $this->googleHeadTag);
$forcedDisplay = '';
if ($forceLoading) {
$forcedDisplay = self::FORCE_DISPLAY_TEXT;
}
$tag = str_replace("__*FORCEDISPLAY*__", $forcedDisplay, $tag);
return $tag;
}
/**
* @return mixed
*/
public function getGTMBodyTag($forceLoading = true)
{
if (!$this->gtmEnabled) {
return '';
}
if (!isset($this->gtmTagId[$this->locale])) {
return '';
}
$tag = str_replace("__*GTMTAG*__", $this->gtmTagId[$this->locale], $this->googleBodyTag);
$forcedDisplay = '';
if ($forceLoading) {
$forcedDisplay = self::FORCE_DISPLAY_TEXT;
}
$tag = str_replace("__*FORCEDISPLAY*__", $forcedDisplay, $tag);
return $tag;
}
/**
* @return mixed
*/
public function getGTMLayerTag($tracking, $cart, $actualRoute)
{
if (!$this->gtmEnabled) {
return '';
}
if ($tracking instanceof Tracking) {
$this->tracking = $tracking;
}
if ($cart instanceof Cart) {
$this->cart = $cart;
}
$layer = [
'tracking' => $this->getTrackingVariables(),
'user' => $this->getUserVariables(),
];
$checkoutStep = $this->getCheckoutStep($actualRoute);
switch ($checkoutStep) {
case 2:
$layer['event'] = 'shipping';
break;
case 3:
$layer['event'] = 'checkout';
break;
case 4:
break;
case 99:
$layer['event'] = 'confirmDoubleOrder';
break;
}
$layer['ecommerce'] = $this->getCartVariables($checkoutStep);
$encodedLayer = json_encode($layer);
return "<script>dataLayer = [{$encodedLayer}];</script>";
}
/**
* @return string
*/
public function getGTMEvents($actualRoute)
{
$eventString = '';
$eventString .= $this->getErrorEvent('login', self::GTM_SESSION_LOGIN_EVENT_KEY);
// $eventString .= $this->getErrorEvent(
// 'codepromo',
// self::GTM_SESSION_PROMOCODE_EVENT_KEY,
// 'error_coupon',
// self::GTM_SESSION_PROMOCODE_NAME_KEY
// );
$eventString .= $this->getErrorEvent('bank', self::GTM_SESSION_PAYMENT_ERROR_EVENT_KEY);
$eventString .= $this->getErrorEvent('swap_3ds', self::GTM_SESSION_PAYMENT_3DS_SWAP_EVENT_KEY);
$eventString .= $this->getErrorEvent('bank_3ds', self::GTM_SESSION_PAYMENT_3DS_ERROR_EVENT_KEY);
$eventString .= $this->getPageEvent($actualRoute);
return $this->gtmEnabled ? $eventString : '';
}
/**
* @return array
*/
private function getTrackingVariables()
{
$tracking = $this->tracking;
if (!$tracking instanceof Tracking) {
$tracking = $this->trackingFactory->getCurrentTracking();
}
$trackingInfo = [
'device' => $tracking->getDevice(),
'aff' => $tracking->getAff()->getAffiliateId(),
'o1' => $tracking->getO1(),
'o2' => $tracking->getO2(),
'o3' => $tracking->getO3(),
'o4' => $tracking->getO4(),
'o5' => $tracking->getO5(),
'rmkg' => (int) $tracking->getRmkg()
];
if ($this->session->get(CartManager::DISCOUNT_CODE_KEY)) {
$trackingInfo['dcode'] = $this->session->get(CartManager::DISCOUNT_CODE_KEY);
}
if ($this->session->has(UtmTrackingListener::UTM_CONTENT)) {
$trackingInfo[UtmTrackingListener::UTM_CONTENT] = $this->session->get(UtmTrackingListener::UTM_CONTENT);
}
return $trackingInfo;
}
/**
* @return array
*/
private function getCartVariables($checkoutStep)
{
$cart = $this->getCurrentCart();
if (!$cart instanceof Cart) {
return [];
}
$currencyKey = self::GTM_UA_CURRENCY_KEY;
$productsKey = self::GTM_UA_PRODUCTS_KEY;
$productIdKey = self::GTM_UA_PRODUCT_ID_KEY;
$productNameKey = self::GTM_UA_PRODUCT_NAME_KEY;
$purchaseRevenueKey = self::GTM_UA_PURCHASE_REVENUE_KEY;
$purchaseRevenueNotVatKey = self::GTM_UA_PURCHASE_REVENUE_NOT_VAT_KEY;
$purchaseId = self::GTM_UA_PURCHASE_ID_KEY;
if (self::GTM_TYPE_GA4 === $this->googleTagManagerVersion) {
$currencyKey = self::GTM_GA4_CURRENCY_KEY;
$productsKey = self::GTM_GA4_PRODUCTS_KEY;
$productIdKey = self::GTM_GA4_PRODUCT_ID_KEY;
$productNameKey = self::GTM_GA4_PRODUCT_NAME_KEY;
$purchaseRevenueKey = self::GTM_GA4_PURCHASE_REVENUE_KEY;
$purchaseRevenueNotVatKey = self::GTM_GA4_PURCHASE_REVENUE_NOT_VAT_KEY;
$purchaseId = self::GTM_GA4_PURCHASE_ID_KEY;
}
$cartArray = [
$currencyKey => 'EUR',
'checkout_step' => $checkoutStep,
'coupon' => $this->getCartPromoCode(),
'coaching' => (int) $this->getCartCoaching(),
];
$commonActionFields = [
$currencyKey => 'EUR',
'coupon' => $this->getCartPromoCode(),
'coaching' => (int) $this->getCartCoaching()
];
$productArray = [];
$cartPacks = $cart->getPacks();
$packArray = [];
$packNormalPrice = [];
/** @var Pack $cartPack */
foreach ($cartPacks as $cartPack) {
$packNormalPrice[$cartPack->getPackId()] = $cartPack->getPackPriceReduced() / 100;
$packArray[$cartPack->getPackId()] = $cartPack;
}
if (4 !== $checkoutStep) {
// For Brulafine for "items" array data:
// 1. For Custom Packs -> we send Product information (product price, product Name, etc.)
// 2. For Auto Packs -> we send Pack information (pack price, pack Name, etc.)
// For Slimalis its by Pack information.
switch($this->siteName) {
case 'brulafine':
if (Pack::CUSTOM_PACK === $cartPack->getPackType()) {
/** @var Pack $cartPack */
foreach ($cartPacks as $cartPack) {
/** @var PackProduct $packProduct */
foreach ($cartPack->getPackProducts() as $packProduct) {
if (Product::ELECTRONIC_PRODUCT === $packProduct->getProduct()->getProductType()) {
continue;
}
$product = [
$productNameKey => $packProduct->getProduct()->getProductName(),
'price' => (float)number_format(($packProduct->getProduct()->getProductPrice() / 100), 2),
'quantity' => $packProduct->getProductQuantity(),
$productIdKey => $packProduct->getProduct()->getProductOptions()['EAN'] ?? '',
'item_brand' => $this->brandName,
];
$productArray[] = $product;
}
}
} else {
/** @var Pack $cartPack */
foreach ($cartPacks as $cartPack) {
$product = [
$productNameKey => $this->packFactory->getMarketingPackName($cartPack),
'price' => (float) number_format(($cartPack->getPackPriceReduced() / 100), 2) ?? '-1',
'quantity' => 1, // ATM we can only have 1 pack
$productIdKey => $cartPack->getPackOptions()['EAN'] ?? '',
'item_brand' => $this->brandName,
];
$productArray[] = $product;
}
}
$cartArray['cart_value'] = $this->getCartDiscountedRevenue();
break;
case 'slimalis':
/** @var Pack $cartPack */
foreach ($cartPacks as $cartPack) {
$product = [
$productNameKey => $this->packFactory->getMarketingPackName($cartPack),
'price' => ($cartPack->getPackPriceReduced() / 100) ?? '-1',
'quantity' => 1, // ATM we can only have 1 pack
$productIdKey => $cartPack->getPackOptions()['EAN'] ?? '',
'item_brand' => $this->brandName,
];
$productArray[] = $product;
}
break;
}
}
switch($checkoutStep) {
case 1:
$cartArray['add']['actionField'] = $commonActionFields;
$cartArray['add'][$productsKey] = $productArray;
break;
case 2:
$cartArray['shipping']['actionField'] = $commonActionFields;
$cartArray['shipping'][$productsKey] = $productArray;
break;
case 3:
$cartArray['checkout']['actionField'] = $commonActionFields;
$cartArray['checkout'][$productsKey] = $productArray;
break;
case 4:
$transaction = $cart->getPaymentTransaction();
$invoice = new TransactionInvoice($transaction, $this->cartFactory, $this->cartFactory->getInvoiceSiteId(), $this->logger);
$invoiceArray = $invoice->asArrayForWebservice();
$cartArray['purchase']['actionField'][$purchaseId] = $this->cartFactory->getEncodedId($cart);
$cartArray['purchase']['actionField'][$purchaseRevenueNotVatKey] = (float) round($invoiceArray['total_price_without_vat'], 2);
$cartArray['purchase']['actionField'][$purchaseRevenueKey] = (float) round($invoiceArray['total_price'], 2);
$cartArray['purchase']['actionField']['shipping_no_vat'] = (float) round($invoiceArray['total_shipping_without_vat'], 2);
$cartArray['purchase']['actionField']['shipping'] = $invoiceArray['total_shipping'];
$cartArray['purchase']['actionField']['method'] = $invoice->getPaymentMethodLabel();
$cartArray['purchase']['actionField']['delivery'] = 'standard';
$cartArray['purchase']['actionField']['coaching'] = $cart->hasCoaching();
$cartArray['purchase']['actionField']['tax'] = (float) round($invoiceArray['total_vat_discounted'], 2);
$cartArray['purchase']['actionField']['discount'] = (float) round($invoiceArray['total_discount'], 2);
$cartArray['purchase']['actionField']['discounted_revenue_not_vat'] = (float) round(($invoiceArray['total_price_without_vat_with_discount']), 2);
$cartArray['purchase']['actionField']['discounted_revenue'] = (float) round(($invoiceArray['total_price_with_discount']), 2);
// For Brulafine for items array data:
// 1. For Custom Packs -> we send Product information (product price, product Name, etc.)
// 2. For Auto Packs -> we send Pack information (pack price, pack Name, etc.)
// For Slimalis its stays by Pack info.
switch($this->siteName) {
case 'brulafine':
if (Pack::CUSTOM_PACK === $cartPack->getPackType()) {
/** @var TransactionInvoicePack $invoicePack */
foreach ($invoice->getPacks() as $invoicePack) {
/** @var TransactionInvoiceItem $transactionInvoiceItem */
foreach ($invoicePack->getItems() as $transactionInvoiceItem) {
if ($transactionInvoiceItem->isElectronic()) {
continue;
}
$product = [
$productNameKey => $transactionInvoiceItem->getName(),
'price' => (float) number_format($transactionInvoiceItem->getUnitPrice() / 100, 1),
'price_not_vat' => (float) number_format($transactionInvoiceItem->getUnitPriceWithoutVat() / 100, 1),
'quantity' => $transactionInvoiceItem->getQuantity(), // ATM we can only have 1 pack
$productIdKey => $transactionInvoiceItem->getPackEAN(),
'revenue_no_vat' => (float) number_format(($transactionInvoiceItem->getUnitPriceWithoutVat() * $transactionInvoiceItem->getQuantity()) / 100, 1),
'revenue' => (float) number_format(($transactionInvoiceItem->getUnitPrice() * $transactionInvoiceItem->getQuantity()) / 100, 1),
'item_brand' => $this->brandName,
'vat_applied' => $invoicePack->getVatRate(),
'discount' => $invoicePack->getDiscount()
];
$productArray[] = $product;
}
}
} else {
/** @var TransactionInvoicePack $invoicePack */
foreach ($invoice->getPacks() as $invoicePack) {
$product = [
$productNameKey => $this->packFactory->getMarketingPackName($packArray[$invoicePack->getId()]),
'price' => (float) number_format($packNormalPrice[$invoicePack->getId()], 2),
'price_not_vat' => (float) number_format($invoicePack->getPriceWithoutVat() / 100, 2),
'quantity' => 1, // ATM we can only have 1 pack
$productIdKey => $invoicePack->getEan(),
'revenue_no_vat' => (float) number_format($invoicePack->getPriceWithoutVat() / 100, 2),
'revenue' => $invoicePack->getPrice() / 100,
'item_brand' => $this->brandName,
'vat_applied' => $invoicePack->getVatRate(),
'discount' => $invoicePack->getDiscount()
];
$productArray[] = $product;
}
}
break;
case 'slimalis':
/** @var TransactionInvoicePack $invoicePack */
foreach ($invoice->getPacks() as $invoicePack) {
$product = [
$productNameKey => $this->packFactory->getMarketingPackName($packArray[$invoicePack->getId()]),
'price' => (float) number_format($packNormalPrice[$invoicePack->getId()], 2),
'productPriceTtc' => $packNormalPrice[$invoicePack->getId()],
'price_not_vat' => (float) number_format($invoicePack->getPriceWithoutVat() / 100, 2),
'quantity' => 1, // ATM we can only have 1 pack
$productIdKey => $invoicePack->getEan(),
'revenue_not_vat' => (float) round($invoicePack->getPriceWithoutVat() / 100, 1),
'revenue' => (float) round($invoicePack->getPrice() / 100, 2),
'item_brand' => $this->brandName,
'vat_applied' => $invoicePack->getVatRate(),
'discount' => $invoicePack->getDiscount()
];
$productArray[] = $product;
}
break;
}
$cartArray['purchase'][$productsKey] = $productArray;
break;
case 99:
$cartArray['doubleOrder']['actionField'] = $commonActionFields;
$cartArray['doubleOrder'][$productsKey] = $productArray;
break;
}
return $cartArray;
}
/**
* @return array
*/
private function getUserVariables()
{
$token = $this->tokenStorage->getToken();
if (null !== $token) {
$user = $token->getUser();
} else {
$user = null;
}
$userData = [
'is_logged_in' => false,
'id' => null
];
if ($user instanceof User) {
$userData['is_logged_in'] = true;
$userData['id'] = $user->getId();
$userData['has_fb_login'] = $user->getFacebookId() ? true : false;
$last24 = false;
$registrationDate = $user->getCreationStamp()->getTimestamp();
$now = (new \DateTime())->getTimestamp();
if (($registrationDate + 86400) > $now) {
$last24 = true;
}
$userData['registered_in_last_24_h'] = $last24;
}
return $userData;
}
/**
* @return string
*/
private function getCartPromoCode()
{
$cart = $this->getCurrentCart();
if (!$cart instanceof Cart) {
return '';
}
if ($cart->getDiscountCode() instanceof DiscountCode) {
return $cart->getDiscountCode()->getDiscountCodeName();
}
return '';
}
/**
* @return bool
*/
private function getCartCoaching()
{
$cart = $this->getCurrentCart();
$coaching = false;
if ($cart instanceof Cart && $cart->hasCoaching()) {
$coaching = true;
}
return $coaching;
}
/**
* @param $actualRoute
* @return int|mixed
*/
private function getCheckoutStep($actualRoute)
{
if (isset($this->steps[$actualRoute]) && $this->steps[$actualRoute]) {
return $this->steps[$actualRoute];
}
// if we are not in one of those routes, then we are on step 0.
return 0;
}
/**
* @return object|void
*/
private function getCurrentCart()
{
// if not initialised then initialise it
if (0 === $this->cart) {
$this->cart = $this->cartFactory->resolveCurrentCart();
}
return $this->cart;
}
private function getCartDiscountedRevenue()
{
$values = $this->cartFactory->computeCartTotal($this->getCurrentCart());
return (float) number_format(($values['packPriceReduced'] / 100), 2);
}
/**
* @param string $type
* @param string $sessionKey
* @param null $additionnalVar
* @param null $additionnalData
* @return string
*/
private function getErrorEvent($type = 'login', $sessionKey = self::GTM_SESSION_LOGIN_EVENT_KEY, $additionnalVar = null, $additionnalData = null)
{
$event = '';
$error = $this->session->get($sessionKey);
if ($error) {
$variableArray = ['errorString' => $error];
if ($additionnalVar) {
$variableArray[$additionnalVar] = $this->session->get($additionnalData);
}
$event = $this->getEventCode($type, $variableArray);
$this->session->remove($sessionKey);
}
return $event;
}
/**
* @param $eventName
* @param array $variables
*/
private function getEventCode($eventName, $variables = [])
{
$event = json_encode(array_merge(['event' => $eventName], $variables));
$eventString = <<<TAG
<script>
dataLayer.push({$event});
</script>
TAG;
return $eventString;
}
/**
* @param $actualRoute
* @return string
*/
private function getPageEvent($actualRoute)
{
$checkoutStep = $this->getCheckoutStep($actualRoute);
switch ($checkoutStep) {
case 4:
$event = json_encode(['event' => 'transaction']);
$eventString = <<<TAG
<script>
dataLayer.push({$event});
</script>
TAG;
return $eventString;
break;
}
}
/**
* @return string
*/
public function getName()
{
return 'google_tag_manager_extension';
}
}