src/AtechNet/CoreBundle/Controller/AbstractController.php line 1021

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Controller;
  3. use App\AtechNet\CoreBundle\Entity\Basket;
  4. use App\AtechNet\CoreBundle\Entity\CategoryPage;
  5. use App\AtechNet\CoreBundle\Entity\Customer;
  6. use App\AtechNet\CoreBundle\Entity\Domain;
  7. use App\AtechNet\CoreBundle\Entity\DomainNavigation;
  8. use App\AtechNet\CoreBundle\Entity\Language;
  9. use App\AtechNet\CoreBundle\Entity\Nanobar;
  10. use App\AtechNet\CoreBundle\Entity\Order;
  11. use App\AtechNet\CoreBundle\Entity\Product;
  12. use App\AtechNet\CoreBundle\Entity\ProductType;
  13. use App\AtechNet\CoreBundle\Entity\SeoUrl;
  14. use App\AtechNet\CoreBundle\Entity\User;
  15. use App\AtechNet\CoreBundle\Helper\ActiveCampaignConnect;
  16. use App\AtechNet\CoreBundle\Helper\Billingo;
  17. use App\AtechNet\CoreBundle\Helper\DigitalOceanSpaces;
  18. use App\AtechNet\CoreBundle\Helper\Furbify\Cetelem;
  19. use App\AtechNet\CoreBundle\Helper\Furbify\GoPayHelper;
  20. use App\AtechNet\CoreBundle\Helper\Furbify\Image;
  21. use App\AtechNet\CoreBundle\Helper\Furbify\Login;
  22. use App\AtechNet\CoreBundle\Helper\Furbify\Module;
  23. use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
  24. use App\AtechNet\CoreBundle\Helper\Furbify\OrderHelper;
  25. use App\AtechNet\CoreBundle\Helper\Furbify\PayPal;
  26. use App\AtechNet\CoreBundle\Helper\Furbify\ProductHelper;
  27. use App\AtechNet\CoreBundle\Helper\Furbify\SeoUrlHelper;
  28. use App\AtechNet\CoreBundle\Helper\Furbify\SimplePayHelper;
  29. use App\AtechNet\CoreBundle\Helper\Furbify\SocialShareImageHelper;
  30. use App\AtechNet\CoreBundle\Helper\Instacash;
  31. use App\AtechNet\CoreBundle\Helper\Klarna;
  32. use App\AtechNet\CoreBundle\Helper\KlaviyoConnect;
  33. use App\AtechNet\CoreBundle\Helper\Milpay;
  34. use App\AtechNet\CoreBundle\Helper\Packeta;
  35. use App\AtechNet\CoreBundle\Helper\PastPay;
  36. use App\AtechNet\CoreBundle\Helper\SquarePay;
  37. use App\AtechNet\CoreBundle\Service\Furbify\BazaarService;
  38. use App\AtechNet\CoreBundle\Service\HistoricalEuroRate;
  39. use App\AtechNet\CoreBundle\Translation\DatabaseTranslator;
  40. use Doctrine\ORM\EntityManager;
  41. use Doctrine\Persistence\ManagerRegistry;
  42. use Psr\Cache\CacheItemPoolInterface;
  43. use Psr\SimpleCache\InvalidArgumentException;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SymfonyAbstractController;
  45. use Symfony\Component\HttpFoundation\File\UploadedFile;
  46. use Symfony\Component\HttpFoundation\Request;
  47. use Symfony\Component\HttpFoundation\RequestStack;
  48. use Symfony\Component\HttpKernel\KernelInterface;
  49. use Symfony\Component\Mailer\MailerInterface;
  50. use Symfony\Component\Routing\Annotation\Route;
  51. use Symfony\Component\Routing\Exception\RouteNotFoundException;
  52. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  53. use Symfony\Component\Routing\Matcher\UrlMatcher;
  54. use Symfony\Component\Routing\RequestContext;
  55. use Symfony\Component\Security\Core\Security;
  56. use Symfony\Contracts\Translation\TranslatorInterface;
  57. use Twig\Environment;
  58. abstract class AbstractController extends SymfonyAbstractController
  59. {
  60.     public const CUSTOMER_TYPE_RETAIL = 1;
  61.     public const CUSTOMER_TYPE_WHOLESALE = 2;
  62.     public const CACHE_LIFETIME_15_MINUTES = 900;
  63.     public const CACHE_LIFETIME_30_MINUTES = 1800;
  64.     public const CACHE_LIFETIME_1_HOUR = 3600;
  65.     public const CACHE_LIFETIME_4_HOUR = 14400;
  66.     public const CACHE_LIFTETIME_6_HOURS = 21600;
  67.     public const CACHE_LIFETIME_12_HOURS = 43200;
  68.     public const CACHE_LIFETIME_1_DAY = 86400;
  69.     public const CACHE_LIFETIME_3_DAYS = 259200;
  70.     public const CACHE_LIFETIME_7_DAYS = 604800;
  71.     public const CACHE_LIFETIME_1_YEAR = 31536000;
  72.     // Warranty types
  73.     public const WARRANTY_TYPE_DEFAULT = 'default';
  74.     public const WARRANTY_TYPE_PRODUCT_TYPE = 'byProductTyp';
  75.     public const WARRANTY_TYPE_NOTEBOOK_BATTERY = 'byBatteryType';
  76.     public const WARRANTY_DEFAULT_ARRAY = [
  77.         'year' => 2,
  78.         'priceWarrantyDay' => 30,
  79.     ];
  80.     public const WARRANTY_3_YEARS_60_DAYS_ARRAY = [
  81.         'year' => 3,
  82.         'priceWarrantyDay' => 60,
  83.     ];
  84.     public const WARRANTY_NOTEBOOK_BATTERY_ARRAY = [
  85.         'year' => 0.5,
  86.         'priceWarrantyDay' => 30,
  87.     ];
  88.     private $storeSwitcher;
  89.     public function __construct(
  90.         ManagerRegistry       $doctrine,
  91.         TranslatorInterface   $translator,
  92.         UrlGeneratorInterface $router,
  93.         MailerInterface       $mailer,
  94.         RequestStack          $requestStack,
  95.         Security              $security,
  96.         HistoricalEuroRate    $historicalEuroRate,
  97.         KernelInterface       $kernel,
  98.         Environment           $twig,
  99.         protected CacheItemPoolInterface $cache, 
  100.         private BazaarService $bazaarService
  101.     ) {
  102.         $this->doctrine = $doctrine;
  103.         $this->translator = $translator;
  104.         $this->router = $router;
  105.         $this->mailer = $mailer;
  106.         $this->requestStack = $requestStack;
  107.         $this->security = $security;
  108.         $this->historicalEuroRate = $historicalEuroRate;
  109.         $this->kernel = $kernel;
  110.         $this->twig = $twig;
  111.     }
  112.     /**
  113.      * @return EntityManager
  114.      */
  115.     public function getEntityManager(string $connection = 'default'): EntityManager
  116.     {
  117.         return $this->doctrine->getManager($connection);
  118.     }
  119.     /**
  120.      * @return string[]
  121.      */
  122.     public static function getWarrantyTypesByDomains(): array
  123.     {
  124.         return [
  125.             Domain::DOMAIN_ID_RT_SK => self::WARRANTY_TYPE_DEFAULT,
  126.             Domain::DOMAIN_ID_WS_SK => self::WARRANTY_TYPE_DEFAULT,
  127.             Domain::DOMAIN_ID_RT_HU => self::WARRANTY_TYPE_DEFAULT,
  128.             Domain::DOMAIN_ID_WS_HU => self::WARRANTY_TYPE_DEFAULT,
  129.             Domain::DOMAIN_ID_RT_EU => self::WARRANTY_TYPE_DEFAULT,
  130.             Domain::DOMAIN_ID_WS_CZ => self::WARRANTY_TYPE_DEFAULT,
  131.             Domain::DOMAIN_ID_RT_CZ => self::WARRANTY_TYPE_DEFAULT,
  132.             Domain::DOMAIN_ID_WS_EU => self::WARRANTY_TYPE_DEFAULT,
  133.         ];
  134.     }
  135.     /**
  136.      * @return array
  137.      */
  138.     public static function getWarranty(): array
  139.     {
  140.         return [
  141.             Domain::DOMAIN_ID_RT_SK => [
  142.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  143.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  144.             ],
  145.             Domain::DOMAIN_ID_WS_SK => [
  146.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  147.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  148.             ],
  149.             Domain::DOMAIN_ID_RT_HU => [
  150.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  151.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  152.             ],
  153.             Domain::DOMAIN_ID_WS_HU => [
  154.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  155.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  156.             ],
  157.             Domain::DOMAIN_ID_WS_CZ => [
  158.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  159.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  160.             ],
  161.             Domain::DOMAIN_ID_WS_EU => [
  162.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  163.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  164.             ],
  165.             Domain::DOMAIN_ID_RT_CZ => [
  166.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  167.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  168.             ],
  169.             Domain::DOMAIN_ID_RT_EU => [
  170.                 self::WARRANTY_TYPE_DEFAULT => self::WARRANTY_DEFAULT_ARRAY,
  171.                 self::WARRANTY_TYPE_NOTEBOOK_BATTERY => self::WARRANTY_NOTEBOOK_BATTERY_ARRAY,
  172.             ],
  173.         ];
  174.     }
  175.     /**
  176.      * @param int $domainId
  177.      * @param int $productTypeId
  178.      * @return mixed
  179.      */
  180.     protected function getWarrantyForProductType(int $domainId, int $productTypeId)
  181.     {
  182.         $warrantyType = self::WARRANTY_TYPE_DEFAULT;
  183.         if ($productTypeId == ProductType::PRODUCT_TYPE_ID_NOTEBOOK_BATTERY) {
  184.             $warrantyType = self::WARRANTY_TYPE_NOTEBOOK_BATTERY;
  185.         }
  186.         if (
  187.             !empty(self::getWarranty()[$domainId][self::getWarrantyTypesByDomains()[$domainId]]['typeIds']) &&
  188.             in_array($productTypeId, self::getWarranty()[$domainId][self::getWarrantyTypesByDomains()[$domainId]]['typeIds'])
  189.         ) {
  190.             $warrantyType = self::WARRANTY_TYPE_PRODUCT_TYPE;
  191.         }
  192.         return self::getWarranty()[$domainId][$warrantyType];
  193.     }
  194.     /**
  195.      * @param int $domainId
  196.      * @param string $valueName
  197.      * @return int|mixed
  198.      *
  199.      * header, footer, login-page, ..., texts
  200.      */
  201.     protected function getWarrantyForNonProductText(int $domainId, string $valueName = 'year')
  202.     {
  203.         $warrantyObjectForDomain = self::getWarranty()[$domainId];
  204.         unset($warrantyObjectForDomain[self::WARRANTY_TYPE_NOTEBOOK_BATTERY]);
  205.         $warrantyYear = 99;
  206.         foreach ($warrantyObjectForDomain as $key => $value) {
  207.             if ($warrantyYear > $value[$valueName]) {
  208.                 $warrantyYear = $value[$valueName];
  209.             }
  210.         }
  211.         return $warrantyYear;
  212.     }
  213.     /**
  214.      * @param Request $request
  215.      * @return string The rendered view
  216.      * @throws \Exception
  217.      * @throws \Psr\SimpleCache\InvalidArgumentException
  218.      */
  219.     public function getHeader(Request $request)
  220.     {
  221.         // Entity Manager
  222.         $entityManager = $this->getEntityManager();
  223.         // Connection
  224.         $connection = $entityManager->getConnection();
  225.         // Route
  226.         $route = $request->attributes->get('_route');
  227.         $module = $this->getModuleHelper($request);
  228.         $data = [];
  229.         if (in_array($route, ['cart_show', 'cart_show_locale', 'checkout_customer', 'checkout_customer_locale', 'checkout_shipping_and_payment', 'checkout_shipping_and_payment_locale', 'checkout_address', 'checkout_address_locale', 'checkout_review', 'checkout_review_locale'])) {
  230.             $data['mode'] = 'minimal';
  231.         } else {
  232.             $data['mode'] = 'standard';
  233.             $data['menu'] = $this->getMenu($request);
  234.         }
  235.         $multiStore = $this->getMultiStoreHelper($request);
  236.         $defaultLocale = $multiStore->getDefaultLocale();
  237.         $domain = $multiStore->getDomain();
  238.         $domainType = $domain->getType();
  239.         if ( $request->getSession()->get('isBazaarPage') === true ) {
  240.             $data['headerPageList'] = $this->bazaarService->getHeaderPageList($domain, $this->url($request));
  241.         } else {
  242.             $data['headerPageList'] = $this->getHeaderPageList($domain, $this->url($request));
  243.         }
  244.         $data['currency'] = $domain->getCurrency();
  245.         $data['precision'] = $domain->getPricePrecision();
  246.         $data['cart'] = $module->widgetCart();
  247.         $contactInfos = $this->getContactInfos();
  248.         $data['phone_support'] = $contactInfos['phone.webshop.' . $defaultLocale . '.' . $domainType];
  249.         $data['phone_order'] = $contactInfos['phone.webshop.' . $defaultLocale . '.' . $domainType];
  250.         $data['logo_country_suffix'] = '';
  251.         if (in_array($defaultLocale, ['sk', 'hu', 'cz'])) {
  252.             $data['logo_country_suffix'] = '-' . $defaultLocale;
  253.         }
  254.         // Search
  255.         if ($request->get('fs')) {
  256.             $data['filterSearch'] = $request->get('fs');
  257.         } else {
  258.             $data['filterSearch'] = '';
  259.         }
  260.         $data['cartTotal'] = 0;
  261.         $data['cartItemsCount'] = 0;
  262.         $data['customerType'] = $this->getCustomerTypeString($request);
  263.         $session = $request->getSession();
  264.         $loggedInCustomerId = $session->get('customerId');
  265.         $data['isLoggedIn'] = !is_null($loggedInCustomerId) && is_numeric($loggedInCustomerId);
  266.         $data['customer'] = $data['isLoggedIn'] ? $entityManager->getRepository(Customer::class)->findOneById($loggedInCustomerId) : null;
  267.         $data['nanobars'] = $this->getNanobars($domain, $defaultLocale);
  268.         $data['warrantyYear'] = $this->getWarrantyForNonProductText($domain->getId());
  269.         //-> Store & Language Switcher
  270.         // Environment
  271.         $environment = $this->getEnvironment();
  272.         // Stores
  273.         $this->storeSwitcher = [
  274.             0 => [
  275.                 'url' => ($environment == 'dev' ? 'http://furbify.dev.sk' : 'https://www.furbify.sk'),
  276.                 'source' => 'furbify.sk',
  277.                 'title' => 'Furbify.sk',
  278.                 'icon' => 'sk',
  279.                 'primary' => false,
  280.                 'language' => [
  281.                     'sk' => 'Slovenčina',
  282.                     'hu' => 'Magyar',
  283.                     'en' => 'English',
  284.                 ],
  285.             ],
  286.             1 => [
  287.                 'url' => ($environment == 'dev' ? 'http://furbify.dev.hu' : 'https://www.furbify.hu'),
  288.                 'source' => 'furbify.hu',
  289.                 'title' => 'Furbify.hu',
  290.                 'icon' => 'hu',
  291.                 'primary' => false,
  292.                 'language' => [
  293.                     'hu' => 'Magyar',
  294.                     'en' => 'English',
  295.                 ],
  296.             ],
  297.             2 => [
  298.                 'url' => ($environment == 'dev' ? 'http://furbify.dev.cz' : 'https://www.furbify.cz'),
  299.                 'source' => 'furbify.cz',
  300.                 'title' => 'Furbify.cz',
  301.                 'icon' => 'cz',
  302.                 'primary' => false,
  303.                 'language' => [
  304.                     'cz' => 'Čeština',
  305.                     'sk' => 'Slovenčina',
  306.                     'en' => 'English',
  307.                 ],
  308.             ],
  309.             3 => [
  310.                 'url' => ($environment == 'dev' ? 'http://furbify.dev.eu' : 'https://www.furbify.eu'),
  311.                 'source' => 'furbify.eu',
  312.                 'title' => 'Furbify.eu',
  313.                 'icon' => 'eu',
  314.                 'primary' => false,
  315.                 'language' => [
  316.                     'en' => 'English',
  317.                     'sk' => 'Slovenčina',
  318.                     'hu' => 'Magyar',
  319.                     'cz' => 'Čeština',
  320.                 ],
  321.             ],
  322.         ];
  323.         if ($domain->getId() == Domain::DOMAIN_ID_RT_EU) {
  324.             $locales = [
  325.                 'de' => 'furbify.de',
  326.                 'fr' => 'furbify.fr',
  327.                 'it' => 'furbify.it',
  328.                 'es' => 'furbify.es',
  329.                 'nl' => 'furbify.nl',
  330.                 'ro' => 'furbify.ro',
  331.                 'se' => 'furbify.se',
  332.                 'hr' => 'furbify.hr',
  333.                 'si' => 'furbify.si',
  334.                 #'dk' => 'furbify.dk',
  335.                 'ie' => 'furbify.ie',
  336.             ];
  337.             foreach ($locales as $code => $domainName) {
  338.                 $this->storeSwitcher[] = [
  339.                     'url' => "https://www.$domainName/",
  340.                     'source' => $domainName,
  341.                     'title' => ucfirst($domainName),
  342.                     'icon' => $code,
  343.                     'primary' => false,
  344.                     'unas' => true,
  345.                 ];
  346.             }
  347.         }
  348.         // Slug
  349.         $slug = $request->get('slug');
  350.         if (!empty($slug)) {
  351.             // URL Path
  352.             $urlPath = [
  353.                 Domain::DOMAIN_ID_RT_SK => [],
  354.                 Domain::DOMAIN_ID_RT_HU => [],
  355.                 Domain::DOMAIN_ID_RT_CZ => [],
  356.                 Domain::DOMAIN_ID_RT_EU => [],
  357.             ];
  358.             // Parts of Slug
  359.             $parts = explode('/', $slug);
  360.             // Remove any empty arrays from trailing
  361.             if (mb_strlen(end($parts)) == 0) {
  362.                 array_pop($parts);
  363.             }
  364.             // Start with the low-level part
  365.             $parts = array_reverse($parts);
  366.             // Language ID
  367.             $languageId = $multiStore->getDefaultLanguageId();
  368.             // Domain
  369.             $domainId = $domain->getId();
  370.             if (in_array($domainId, MultiStore::getWholesaleDomainIDs())) {
  371.                 switch ($domainId) {
  372.                     case Domain::DOMAIN_ID_WS_SK:
  373.                         $domainId = Domain::DOMAIN_ID_RT_SK;
  374.                         break;
  375.                     case Domain::DOMAIN_ID_WS_HU:
  376.                         $domainId = Domain::DOMAIN_ID_RT_HU;
  377.                         break;
  378.                     case Domain::DOMAIN_ID_WS_CZ:
  379.                         $domainId = Domain::DOMAIN_ID_RT_CZ;
  380.                         break;
  381.                     case Domain::DOMAIN_ID_WS_EU:
  382.                         $domainId = Domain::DOMAIN_ID_RT_EU;
  383.                         break;
  384.                 }
  385.             }
  386.             // Get entities by parts of slug
  387.             foreach ($parts as $part) {
  388.                 // Seo URL
  389.                 $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  390.                     'keyword' => $part,
  391.                     'language' => $languageId,
  392.                     'archived' => false,
  393.                     'domain' => [$domainId, null],
  394.                 ]);
  395.                 if ($seoUrl) {
  396.                     // Query
  397.                     $query = explode('=', $seoUrl->getQuery());
  398.                     // Product
  399.                     if ($query[0] == 'product_id') {
  400.                         // Product ID
  401.                         $productId = (int)$query[1];
  402.                         // Product
  403.                         $product = $entityManager->getRepository(Product::class)->findOneById($productId);
  404.                         if ($product) {
  405.                             // Meta
  406.                             foreach ($product->getMetas() as $meta) {
  407.                                 // Needle Domain ID
  408.                                 $needleDomainId = $meta->getDomain()->getId();
  409.                                 if ($meta->isActive() && isset($urlPath[$needleDomainId])) {
  410.                                     $productSeoUrl = $connection->fetchAssociative("SELECT `keyword` FROM seo_url WHERE archived = '0' AND domain_id IS NULL AND language_id = '" . $multiStore->getLanguageIdByDomainId((int)$needleDomainId) . "' AND `query` = 'product_id=" . (int)$productId . "'");
  411.                                     if (!empty($productSeoUrl['keyword']) && isset($urlPath[(int)$needleDomainId])) {
  412.                                         $urlPath[(int)$needleDomainId][] = $productSeoUrl['keyword'];
  413.                                     }
  414.                                 }
  415.                             }
  416.                         }
  417.                     }
  418.                     // Category
  419.                     elseif ($query[0] == 'category_id') {
  420.                         // Category ID
  421.                         $categoryId = (int)$query[1];
  422.                         // Category
  423.                         $category = $entityManager->getRepository(CategoryPage::class)->findOneById($categoryId);
  424.                         if ($category) {
  425.                             if ($category->getType() == CategoryPage::CATEGORY_TYPE_PRODUCT) {
  426.                                 // Haystack Categories
  427.                                 $haystackCategories = $entityManager->getRepository(CategoryPage::class)->findBy([
  428.                                     'type' => CategoryPage::CATEGORY_TYPE_PRODUCT,
  429.                                     'published' => 1,
  430.                                     'showOnlyDiscounted' => $category->isShowOnlyDiscounted(),
  431.                                     'showOnlyFlashSales' => $category->isShowOnlyFlashSales(),
  432.                                     'showOnlyBazaar' => $category->isShowOnlyBazaar(),
  433.                                     'includeBazaar' => $category->isIncludeBazaar(),
  434.                                 ], [
  435.                                     'updated' => 'DESC',
  436.                                 ]);
  437.                                 // Use Cache
  438.                                 if (!empty($haystackCategories[0])) {
  439.                                     // Updated
  440.                                     $updated = $haystackCategories[0]->getUpdated();
  441.                                     // Cache Key
  442.                                     $cacheKey = 'store.switcher.v3.haystack.categories.' . $categoryId . '.' . $domainId . '.' . $updated->getTimestamp();
  443.                                     $cacheItem = $this->cache->getItem($cacheKey);
  444.                                     if ($cacheItem->isHit()) {
  445.                                         $cacheUrlPath = $cacheItem->get();
  446.                                         foreach ($cacheUrlPath as $cacheDomainId => $cachePath) {
  447.                                             $urlPath[(int)$cacheDomainId][] = $cachePath;
  448.                                         }
  449.                                     }
  450.                                 }
  451.                                 if (empty($cacheUrlPath)) {
  452.                                     $cacheUrlPath = [];
  453.                                     foreach ($haystackCategories as $needleCategory) {
  454.                                         // Product Types
  455.                                         $productTypes = $category->getProductTypes();
  456.                                         $needleProductTypes = $needleCategory->getProductTypes();
  457.                                         // Presumably, the needle category match with category according to product type
  458.                                         if ($productTypes->count() > 0 && $productTypes->count() == $needleProductTypes->count()) {
  459.                                             // Skip it if the needle category does not contains all product types of the category
  460.                                             foreach ($productTypes as $productType) {
  461.                                                 if (!$needleProductTypes->contains($productType)) {
  462.                                                     continue 2;
  463.                                                 }
  464.                                             }
  465.                                         } // Presumably there is no match, so we skip it
  466.                                         elseif ($productTypes->count() !== $needleProductTypes->count()) {
  467.                                             continue;
  468.                                         }
  469.                                         // Vendors
  470.                                         $vendors = $category->getVendors();
  471.                                         $needleVendors = $needleCategory->getVendors();
  472.                                         // Presumably, the needle category match with category according to vendor
  473.                                         if ($vendors->count() > 0 && $vendors->count() == $needleVendors->count()) {
  474.                                             // Skip it if the needle category does not contains all vendors of the category
  475.                                             foreach ($vendors as $vendor) {
  476.                                                 if (!$needleVendors->contains($vendor)) {
  477.                                                     continue 2;
  478.                                                 }
  479.                                             }
  480.                                         } // Presumably there is no match, so we skip it
  481.                                         elseif ($vendors->count() !== $needleVendors->count()) {
  482.                                             continue;
  483.                                         }
  484.                                         // Products
  485.                                         $products = $category->getProducts();
  486.                                         $needleProducts = $needleCategory->getProducts();
  487.                                         // Presumably, the needle category match with category according to product
  488.                                         if ($products->count() > 0 && $products->count() == $needleProducts->count()) {
  489.                                             // Skip it if the needle category does not contains all products of the category
  490.                                             foreach ($products as $product) {
  491.                                                 if (!$needleProducts->contains($product)) {
  492.                                                     continue 2;
  493.                                                 }
  494.                                             }
  495.                                         } // Presumably there is no match, so we skip it
  496.                                         elseif ($products->count() !== $needleProducts->count()) {
  497.                                             continue;
  498.                                         }
  499.                                         // Badges
  500.                                         $badges = $category->getBadges();
  501.                                         $needleBadges = $needleCategory->getBadges();
  502.                                         // Reset
  503.                                         if ($badges == '[]') {
  504.                                             $badges = '';
  505.                                         }
  506.                                         if ($needleBadges == '[]') {
  507.                                             $needleBadges = '';
  508.                                         }
  509.                                         // Presumably, the needle category match with category according to badge
  510.                                         if (!empty($badges) && $badges == $needleBadges) {
  511.                                             $badges = json_decode($badges, true);
  512.                                             $needleBadges = json_decode($needleBadges, true);
  513.                                             // Skip it if the needle category does not contains all badges of the category
  514.                                             foreach ($badges as $badge) {
  515.                                                 if (!in_array($badge, $needleBadges)) {
  516.                                                     continue 2;
  517.                                                 }
  518.                                             }
  519.                                         } // Presumably there is no match, so we skip it
  520.                                         elseif ($badges !== $needleBadges) {
  521.                                             continue;
  522.                                         }
  523.                                         // Domain Id
  524.                                         $needleDomainId = $needleCategory->getDomain()->getId();
  525.                                         // Presumably the category match with the needle category
  526.                                         // Therefore we query the seo keyword of the needle category
  527.                                         $categorySeoUrl = $connection->fetchAssociative("SELECT `keyword` FROM seo_url WHERE archived = '0' AND domain_id = '" . (int)$needleDomainId . "' AND language_id = '" . $multiStore->getLanguageIdByDomainId((int)$needleDomainId) . "' AND `query` = 'category_id=" . (int)$needleCategory->getId() . "'");
  528.                                         if (!empty($categorySeoUrl['keyword']) && isset($urlPath[(int)$needleDomainId])) {
  529.                                             $urlPath[(int)$needleDomainId][] = $categorySeoUrl['keyword'];
  530.                                             $cacheUrlPath[(int)$needleDomainId] = $categorySeoUrl['keyword'];
  531.                                         }
  532.                                     }
  533.                                     if (isset($cacheKey)) {
  534.                                         $cacheItem->set($cacheUrlPath);
  535.                                         $cacheItem->expiresAfter(self::CACHE_LIFETIME_7_DAYS);
  536.                                         $this->cache->save($cacheItem);
  537.                                     }
  538.                                     unset($cacheKey, $cacheUrlPath);
  539.                                 }
  540.                             }
  541.                         }
  542.                     }
  543.                 }
  544.             }
  545.             // Validate found path & add to store switcher
  546.             foreach ($urlPath as $domainId => $path) {
  547.                 if (!empty($path) && count($path) == count($parts)) {
  548.                     // Build Path
  549.                     $path = array_reverse($path);
  550.                     $path = implode('/', $path);
  551.                     switch ($domainId) {
  552.                         case Domain::DOMAIN_ID_RT_SK:
  553.                             $this->storeSwitcher[0]['url'] .= '/' . $path;
  554.                             break;
  555.                         case Domain::DOMAIN_ID_RT_HU:
  556.                             $this->storeSwitcher[1]['url'] .= '/' . $path;
  557.                             break;
  558.                         case Domain::DOMAIN_ID_RT_CZ:
  559.                             $this->storeSwitcher[2]['url'] .= '/' . $path;
  560.                             break;
  561.                         case Domain::DOMAIN_ID_RT_EU:
  562.                             $this->storeSwitcher[3]['url'] .= '/' . $path;
  563.                             break;
  564.                     }
  565.                 }
  566.             }
  567.         }
  568.         // Determine primary domain
  569.         switch ($domain->getId()) {
  570.             // Slovakia -> Hungary, Czech Republic, EU
  571.             case Domain::DOMAIN_ID_RT_SK:
  572.             case Domain::DOMAIN_ID_WS_SK:
  573.                 $this->storeSwitcher[0]['primary'] = true;
  574.                 break;
  575.                 // Hungary -> Slovakia, Czech Republic, EU
  576.             case Domain::DOMAIN_ID_RT_HU:
  577.             case Domain::DOMAIN_ID_WS_HU:
  578.                 $this->storeSwitcher[1]['primary'] = true;
  579.                 break;
  580.                 // Czech Republic -> Slovakia, Hungary, EU
  581.             case Domain::DOMAIN_ID_RT_CZ:
  582.             case Domain::DOMAIN_ID_WS_CZ:
  583.                 $this->storeSwitcher[2]['primary'] = true;
  584.                 break;
  585.                 // EU -> Slovakia, Hungary, Czech Republic
  586.             case Domain::DOMAIN_ID_RT_EU:
  587.             case Domain::DOMAIN_ID_WS_EU:
  588.                 $this->storeSwitcher[3]['primary'] = true;
  589.                 break;
  590.         }
  591.         $data['stores'] = $this->storeSwitcher;
  592.         //<- Store & Language Switcher
  593.         // Bazaar
  594.         $data['isBazaarPage'] = $request->getSession()->get('isBazaarPage');
  595.         return $this->renderView('AtechNetCoreBundle/Common/header.html.twig', $data);
  596.     }
  597.     /**
  598.      * @var Domain $domain
  599.      * @var SeoUrlHelper $seoUrl
  600.      * @return array
  601.      */
  602.     protected function getHeaderPageList(Domain $domain, SeoUrlHelper $seoUrl): array
  603.     {
  604.         switch ($domain->getLanguage()->getId()) {
  605.             case Language::LANGUAGE_ID_HU:
  606.                 return [
  607.                     [
  608.                         'link' => $seoUrl->link('page', [
  609.                             'static_id' => 20,
  610.                         ]),
  611.                         'title' => 'Rólunk',
  612.                     ],
  613.                     [
  614.                         'link' => $seoUrl->link('page', [
  615.                             'static_id' => 21,
  616.                         ]),
  617.                         'title' => 'Felújítási folyamat',
  618.                     ],
  619.                     [
  620.                         'link' => $this->generateUrl('review_list_hu'),
  621.                         'title' => 'Referenciák',
  622.                     ],
  623.                     [
  624.                         'link' => $seoUrl->link('page', [
  625.                             'static_id' => 26,
  626.                         ]),
  627.                         'title' => 'GYIK',
  628.                     ],
  629.                     /*[
  630.                         'link' => $seoUrl->link('page', ['static_id' => 40]),
  631.                         'title' => 'Garancia'
  632.                     ],*/
  633.                     [
  634.                         'link' => $seoUrl->link('page', [
  635.                             'static_id' => 202,
  636.                         ]),
  637.                         'title' => 'Reklamáció és visszaküldés',
  638.                     ],
  639.                     [
  640.                         'link' => $this->generateUrl('blog_main'),
  641.                         'title' => 'Blog',
  642.                     ],
  643.                 ];
  644.             case Language::LANGUAGE_ID_SK:
  645.                 return [
  646.                     [
  647.                         'link' => $seoUrl->link('page', [
  648.                             'static_id' => 50,
  649.                         ]),
  650.                         'title' => 'O nás',
  651.                     ],
  652.                     [
  653.                         'link' => $seoUrl->link('page', [
  654.                             'static_id' => 4,
  655.                         ]),
  656.                         'title' => 'Čo je repasovaný počítač?',
  657.                     ],
  658.                     [
  659.                         'link' => $this->generateUrl('review_list_sk'),
  660.                         'title' => 'Hodnotenia zákazníkov',
  661.                     ],
  662.                     [
  663.                         'link' => $seoUrl->link('page', [
  664.                             'static_id' => 10,
  665.                         ]),
  666.                         'title' => 'FAQ',
  667.                     ],
  668.                     /*[
  669.                         'link' => $seoUrl->link('page', ['static_id' => 41]),
  670.                         'title' => 'Garancia'
  671.                     ],*/
  672.                     [
  673.                         'link' => $seoUrl->link('page', [
  674.                             'static_id' => 203,
  675.                         ]),
  676.                         'title' => 'Vrátenie tovaru a reklamácie',
  677.                     ],
  678.                     [
  679.                         'link' => $this->generateUrl('blog_main'),
  680.                         'title' => 'Blog',
  681.                     ],
  682.                 ];
  683.             case Language::LANGUAGE_ID_CZ:
  684.                 return [
  685.                     [
  686.                         'link' => $seoUrl->link('page', [
  687.                             'static_id' => 74,
  688.                         ]),
  689.                         'title' => 'O nás',
  690.                     ],
  691.                     [
  692.                         'link' => $seoUrl->link('page', [
  693.                             'static_id' => 54,
  694.                         ]),
  695.                         'title' => 'Čo sú renovované zariadenia?',
  696.                     ],
  697.                     [
  698.                         'link' => $this->generateUrl('review_list_cz'),
  699.                         'title' => 'Hodnocení zákazníků',
  700.                     ],
  701.                     [
  702.                         'link' => $seoUrl->link('page', [
  703.                             'static_id' => 59,
  704.                         ]),
  705.                         'title' => 'FAQ',
  706.                     ],
  707.                     /*[
  708.                         'link' => $seoUrl->link('page', ['static_id' => 69]),
  709.                         'title' => 'Garance'
  710.                     ],*/
  711.                     [
  712.                         'link' => $seoUrl->link('page', [
  713.                             'static_id' => 204,
  714.                         ]),
  715.                         'title' => 'Odstoupení od smlouvy a reklamace',
  716.                     ],
  717.                     [
  718.                         'link' => $this->generateUrl('blog_main'),
  719.                         'title' => 'Blog',
  720.                     ],
  721.                 ];
  722.             case Language::LANGUAGE_ID_EN:
  723.                 return [
  724.                     [
  725.                         'link' => $seoUrl->link('page', [
  726.                             'static_id' => 114,
  727.                         ]),
  728.                         'title' => 'We Are Furbify',
  729.                     ],
  730.                     /*[
  731.                         'link' => $seoUrl->link('page', ['static_id' => 96]),
  732.                         'title' => 'What is a refurbished computer?'
  733.                     ],*/
  734.                     [
  735.                         'link' => $seoUrl->link('page', [
  736.                             'static_id' => 99,
  737.                         ]),
  738.                         'title' => 'FAQ',
  739.                     ],
  740.                     [
  741.                         'link' => $seoUrl->link('page', [
  742.                             'static_id' => 154,
  743.                         ]),
  744.                         'title' => 'Shipping, Returns & Claims',
  745.                     ],
  746.                     [
  747.                         'link' => $this->generateUrl('blog_main'),
  748.                         'title' => 'Blog',
  749.                     ],
  750.                 ];
  751.         }
  752.         return [];
  753.     }
  754.     /**
  755.      * @param Request $request
  756.      * @return string
  757.      * @throws InvalidArgumentException
  758.      */
  759.     public function getFooter(Request $request): string
  760.     {
  761.         $data = [];
  762.         $locale = $request->getLocale();
  763.         $multiStore = $this->getMultiStoreHelper($request);
  764.         $domain = $multiStore->getDomain();
  765.         $domainId = $domain->getId();
  766.         $defaultLocale = $multiStore->getDefaultLocale();
  767.         $route = $request->attributes->get('_route');
  768.         $data['salesManager'] = null;
  769.         $data['warrantyYear'] = $this->getWarrantyForNonProductText($domainId);
  770.         if ($domain->getType() == 'wholesale') {
  771.             // default salesManager
  772.             $data['salesManager'] = $domain->getDefaultSalesManager()->getFirstName();
  773.         }
  774.         if (in_array($route, ['cart_show', 'cart_show_locale', 'checkout_customer', 'checkout_customer_locale', 'checkout_shipping_and_payment', 'checkout_shipping_and_payment_locale', 'checkout_address', 'checkout_address_locale', 'checkout_review', 'checkout_review_locale'])) {
  775.             $data['mode'] = 'minimal';
  776.         } else {
  777.             $data['mode'] = 'standard';
  778.         }
  779.         $footerCacheKey = 'footer.' . $domain->getId() . '.v4' . $defaultLocale . '.' . $locale . '.' . $data['mode'];
  780.         $footerCacheItem = $this->cache->getItem($footerCacheKey);
  781.         if ($footerCacheItem->isHit()) {
  782.             $data = $footerCacheItem->get();
  783.         } else {
  784.             $data['locale'] = $locale;
  785.             $data['year'] = (new \DateTime())->format('Y');
  786.             $languageId = $multiStore->getDefaultLanguageId();
  787.             $seoUrl = $this->url($request);
  788.             $contactInfos = $this->getContactInfos();
  789.             $data['phone_support'] = $contactInfos['phone.webshop.' . $defaultLocale . '.' . $domain->getType()];
  790.             $data['footerMenu'] = [];
  791.             $translator = $this->getTranslator();
  792.             $skippingTitles = [
  793.                 $this->getTranslator()->trans('Free Norton subscription'),
  794.                 $this->getTranslator()->trans('Furbify installment'),
  795.             ];
  796.             foreach ($this->getFooterMenuPagesList()[$languageId] as $key => $menu) {
  797.                 $data['footerMenu'][$key]['title'] = $menu['title'];
  798.                 foreach ($menu['items'] as $page) {
  799.                     $filterLink = array_values($page)[0]['filter'] ?? '';
  800.                     $pageTitle = array_values($page)[0]['title'];
  801.                     $pageId = array_key_first($page);
  802.                     //WS DOMAINS SKIP NORTON AND BUY NOW PAY LATER
  803.                     if (in_array($domainId, MultiStore::getWholesaleDomainIDs())
  804.                         && in_array($pageTitle, $skippingTitles) ) {
  805.                         continue;
  806.                     }
  807.                     if (str_contains($pageId, '_')) {
  808.                         $categoryPageId = explode('_', $pageId)[1];
  809.                         $categoryPage = $this->getEntityManager()->find(CategoryPage::class, $categoryPageId);
  810.                         if (
  811.                             in_array($domainId, MultiStore::getRetailDomainIDs())
  812.                             && $categoryPage?->isShowOnlyBazaar()
  813.                         ) {
  814.                             continue;
  815.                         }
  816.                     }
  817.                     $data['footerMenu'][$key]['items'][] = [
  818.                         'title'      => $pageTitle,
  819.                         'href'       =>
  820.                             $menu['module'] == 'category'
  821.                                 ?
  822.                                 $seoUrl->link('category', [
  823.                                     'path' => $pageId,
  824.                                 ])
  825.                                 :
  826.                                 (is_numeric($pageId)
  827.                                     ?
  828.                                     $seoUrl->link($menu['module'], [
  829.                                         $menu['module'] == 'page' ? 'static_id' : $menu['module'] => $pageId,
  830.                                     ])
  831.                                     :
  832.                                     $this->generateUrl($pageId)
  833.                                 ),
  834.                         'filterLink' => $filterLink,
  835.                     ];
  836.                 }
  837.             }
  838.             $data['facebook_link'] = $languageId == Language::LANGUAGE_ID_HU ? 'https://www.facebook.com/furbify.hu' : 'https://www.facebook.com/furbify.sk';
  839.             $data['instagram_link'] = $languageId == Language::LANGUAGE_ID_HU ? 'https://www.instagram.com/furbify.hu' : 'https://www.instagram.com/furbify.sk';
  840.             $data['footerMinimalMenu'] = [];
  841.             foreach ($this->getCheckoutFooterMenuPagesList()[$languageId] as $pageId => $pageTitle) {
  842.                 $page['title'] = $pageTitle;
  843.                 $page['link'] = $seoUrl->link('page', [
  844.                     'static_id' => $pageId,
  845.                 ]);
  846.                 $data['footerMinimalMenu'][] = $page;
  847.             }
  848.             if ( $request->getSession()->get('isBazaarPage') === true ) {
  849.                 $data['headerPageList'] = $this->bazaarService->getHeaderPageList($domain, $this->url($request));
  850.             } else {
  851.                 $data['headerPageList'] = $this->getHeaderPageList($domain, $this->url($request));
  852.             }
  853.             $footerCacheItem->set($data);
  854.             $footerCacheItem->expiresAfter(self::CACHE_LIFETIME_7_DAYS);
  855.             $this->cache->save($footerCacheItem);
  856.         }
  857.         $data['nanobars'] = $this->getNanobars($domain, $defaultLocale);
  858.         $legalLinks = $this->getLegalLinks($request, $domainId);
  859.         $data['privacy_policy_link'] = $legalLinks['privacy_policy'];
  860.         $data['cookies_link'] = $legalLinks['cookies'];
  861.         if (is_null($request->cookies->get('frb_cookie_consent'))) {
  862.             $data['displayCookieConsent'] = true;
  863.         } else {
  864.             $data['displayCookieConsent'] = false;
  865.             // Show cookie for users who declined the modal
  866.             if ( $request->cookies->get('frb_cookie_consent') == 'decline' ) {
  867.                 if ( is_null($request->cookies->get('frb_cookie_consent_2025')) ) {
  868.                     $data['displayCookieConsent'] = true;
  869.                     setcookie('frb_cookie_consent_2025', 'ok', time() + ( 60 * 60 * 24 * 30 * 6 ));
  870.                 }
  871.             }
  872.         }
  873.         if (in_array($domain->getId(), [Domain::DOMAIN_ID_RT_SK, Domain::DOMAIN_ID_RT_HU])) {
  874.             $data['displayCookieConsent'] = false;
  875.         }
  876.         $data['domainId'] = $domain->getId();
  877.         $data['loggedInCustomer'] = $this->getLoginHelper($request)->getLoggedInCustomer();
  878.         $data['stores'] = $this->storeSwitcher;
  879.         if ($data['mode'] == 'standard') {
  880.             $data['sidebarMenu'] = $this->getMenu($request, 'mobile');
  881.         }
  882.         $data['currency'] = $domain->getCurrency();
  883.         $data['precision'] = $domain->getPricePrecision();
  884.         $data['languages'] = $this->getAvailableLanguagesByDomainId($request, $domain->getId());
  885.         return $this->renderView('AtechNetCoreBundle/Common/footer.html.twig', $data);
  886.     }
  887.     /**
  888.      * @param Request $request
  889.      * @return string
  890.      * @throws \Exception
  891.      */
  892.     public function getColumnRight(Request $request)
  893.     {
  894.         $data = [];
  895.         $moduleHelper = $this->getModuleHelper($request);
  896.         $route = $this->getRouteName($request);
  897.         $data['modules'] = [];
  898.         switch ($route) {
  899.             case 'blog_main':
  900.             case 'blog_show':
  901.             case 'blog_show_locale':
  902.                 // Block Categories
  903.                 array_push($data['modules'], $moduleHelper->blockBlogCategory());
  904.                 $blogId = $request->attributes->get('blogId');
  905.                 // Block Featured
  906.                 array_push($data['modules'], $moduleHelper->blockBlogFeatured($blogId));
  907.                 // Block Tag Cloud
  908.                 array_push($data['modules'], $moduleHelper->blockBlogTagCloud());
  909.                 break;
  910.             case 'blog_main':
  911.             case 'blog_show_category':
  912.             case 'blog_list_locale':
  913.             case 'blog_archive_locale':
  914.             case 'blog_main_locale':
  915.             case 'blog_show_category_locale':
  916.             case 'seo':
  917.                 // Block Categories
  918.                 array_push($data['modules'], $moduleHelper->blockBlogCategory());
  919.                 // Block Tag Cloud
  920.                 array_push($data['modules'], $moduleHelper->blockBlogTagCloud());
  921.                 break;
  922.         }
  923.         return $this->renderView('AtechNetCoreBundle/Common/columnRight.html.twig', $data);
  924.     }
  925.     /**
  926.      * @param Request $request
  927.      * @return string
  928.      */
  929.     public function getContentTop(Request $request)
  930.     {
  931.         $data = [];
  932.         return $this->renderView('AtechNetCoreBundle/Common/content_top.html.twig', $data);
  933.     }
  934.     /**
  935.      * @param Request $request
  936.      * @param null|string $route
  937.      * @return string
  938.      * @throws \Exception
  939.      */
  940.     public function getContentBottom(Request $request, $route = null, $warrantyYear = null)
  941.     {
  942.         $data = [];
  943.         $moduleHelper = $this->getModuleHelper($request);
  944.         $route = is_null($route) ? $this->getRouteName($request) : $route;
  945.         $data['modules'] = [];
  946.         $loggedInCustomer = $this->getLoginHelper($request)->getLoggedInCustomer();
  947.         $isPartner = !is_null($loggedInCustomer) && in_array($loggedInCustomer->getDomain()->getId(), MultiStore::getWholesaleDomainIDs());
  948.         switch ($route) {
  949.             case 'homepage':
  950.             case 'product_show':
  951.             case 'category_show':
  952.             case 'product_search':
  953.             case 'customer_login':
  954.             case 'customer_registration':
  955.             case 'customer_password_reset':
  956.             case 'customer_forgot_password':
  957.             case 'customer_registration_successful':
  958.             case 'customer_login_locale':
  959.             case 'customer_registration_locale':
  960.             case 'customer_password_reset_locale':
  961.             case 'customer_forgot_password_locale':
  962.             case 'customer_registration_successful_locale':
  963.                 // Block Popular Link
  964.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  965.                 break;
  966.             case 'customer_claims':
  967.             case 'customer_logout':
  968.             case 'customer_orders':
  969.             case 'customer_account':
  970.             case 'customer_address':
  971.             case 'customer_claims_new':
  972.             case 'customer_newsletter':
  973.             case 'customer_address_add':
  974.             case 'customer_account_edit':
  975.             case 'customer_address_edit':
  976.             case 'customer_claims_locale':
  977.             case 'customer_logout_locale':
  978.             case 'customer_orders_locale':
  979.             case 'customer_account_locale':
  980.             case 'customer_address_locale':
  981.             case 'customer_claims_new_locale':
  982.             case 'customer_newsletter_locale':
  983.             case 'customer_address_add_locale':
  984.             case 'customer_account_edit_locale':
  985.             case 'customer_address_edit_locale':
  986.                 // Block Popular Link
  987.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  988.                 break;
  989.             case 'cart_show':
  990.             case 'cart_show_locale':
  991.                 break;
  992.             case 'checkout_success':
  993.             case 'checkout_success_locale':
  994.                 break;
  995.             case 'contact':
  996.             case 'contact_locale':
  997.                 // Block Popular Link
  998.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  999.                 break;
  1000.             case 'blog_show':
  1001.             case 'blog_list':
  1002.             case 'blog_show_locale':
  1003.             case 'blog_list_locale':
  1004.                 // Block Popular Link
  1005.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  1006.                 break;
  1007.             case 'blog_main':
  1008.             case 'page_show':
  1009.             case 'blog_main_locale':
  1010.             case 'page_show_locale':
  1011.                 if (!$isPartner) {
  1012.                     // Testimonials
  1013.                     array_push($data['modules'], $moduleHelper->blockTestimonial());
  1014.                 }
  1015.                 // Block Popular Link
  1016.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  1017.                 break;
  1018.             case 'review_list':
  1019.             case 'review_list_en':
  1020.             case 'review_list_sk':
  1021.             case 'review_list_hu':
  1022.             case 'review_list_cz':
  1023.             case 'review_list_locale':
  1024.             case 'review_list_en_locale':
  1025.             case 'review_list_sk_locale':
  1026.             case 'review_list_hu_locale':
  1027.             case 'review_list_cz_locale':
  1028.                 // Block Popular Link
  1029.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  1030.                 break;
  1031.             case 'not_found':
  1032.             case 'not_found_locale':
  1033.                 // Block Popular Link
  1034.                 array_push($data['modules'], $moduleHelper->blockPopularLink());
  1035.                 break;
  1036.         }
  1037.         return $this->renderView('AtechNetCoreBundle/Common/content_bottom.html.twig', $data);
  1038.     }
  1039.     /**
  1040.      * @param Request $request
  1041.      * @return string
  1042.      */
  1043.     private function getRouteName(Request $request)
  1044.     {
  1045.         $route = $request->attributes->get('_route');
  1046.         $forward = $request->attributes->get('_forward_controller');
  1047.         if (isset($forward[0], $forward[1])) {
  1048.             if ($forward[1] == 'listAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\ProductController) {
  1049.                 $route = 'category_show';
  1050.             } elseif ($forward[1] == 'showAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\ProductController) {
  1051.                 $route = 'product_show';
  1052.             } elseif ($forward[1] == 'showAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\PageController) {
  1053.                 $route = 'page_show';
  1054.             } elseif ($forward[1] == 'showBlogAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\PageController) {
  1055.                 $route = 'blog_show';
  1056.             } elseif ($forward[1] == 'listBlogAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\PageController) {
  1057.                 $route = 'blog_list';
  1058.             } elseif ($forward[1] == 'notFoundAction' && $forward[0] instanceof \App\AtechNet\CoreBundle\Controller\DefaultController) {
  1059.                 $route = 'not_found';
  1060.             }
  1061.         }
  1062.         return $route;
  1063.     }
  1064.     /**
  1065.      * @param Request $request
  1066.      * @return DatabaseTranslator
  1067.      * @throws \Exception
  1068.      */
  1069.     public function getDatabaseTranslator(Request $request)
  1070.     {
  1071.         return new DatabaseTranslator($this->getEntityManager(), $request->getSession()->get('localeDomainId'));
  1072.     }
  1073.     public function getTranslator()
  1074.     {
  1075.         return $this->translator;
  1076.     }
  1077.     /**
  1078.      * @param Request $request
  1079.      * @return ProductHelper
  1080.      * @throws \Exception
  1081.      */
  1082.     public function getProductHelper(Request $request)
  1083.     {
  1084.         return new ProductHelper($this->getEntityManager(), $this->getParameter('cloudflare_image'), $this->getDatabaseTranslator($request), $this->getMultiStoreHelper($request), $this->router, $this->historicalEuroRate);
  1085.     }
  1086.     /**
  1087.      * @param Request $request
  1088.      * @return MultiStore
  1089.      */
  1090.     public function getMultiStoreHelper(Request $request)
  1091.     {
  1092.         return new MultiStore($this->getEntityManager(), $request);
  1093.     }
  1094.     /**
  1095.      * @param Request $request
  1096.      * @return Module
  1097.      * @throws \Exception
  1098.      */
  1099.     public function getModuleHelper(Request $request)
  1100.     {
  1101.         return new Module($this->getEntityManager(), $request, $this->getProductHelper($request), $this->getParameter('cloudflare_image'), $this->getMultiStoreHelper($request), $this->getDatabaseTranslator($request), $this->url($request), $this->getTranslator(), $this->twig);
  1102.     }
  1103.     /**
  1104.      * @param Request $request
  1105.      * @return SeoUrlHelper
  1106.      */
  1107.     public function url(Request $request): SeoUrlHelper
  1108.     {
  1109.         return new SeoUrlHelper($this->getEntityManager(), $request, $this->getEnvironment());
  1110.     }
  1111.     /**
  1112.      * @param Request $request
  1113.      * @param string $target
  1114.      * @return array
  1115.      * @throws \Psr\SimpleCache\InvalidArgumentException
  1116.      */
  1117.     protected function getMenu(Request $request, string $target = 'desktop'): array
  1118.     {
  1119.         // Entity Manager
  1120.         $entityManager = $this->getEntityManager();
  1121.         // Multi-Store
  1122.         $multiStore = $this->getMultiStoreHelper($request);
  1123.         // SEO URL
  1124.         $seoUrl = $this->url($request);
  1125.         // Retail Domain
  1126.         $domain = $multiStore->getDomain();
  1127.         $router = $this->router;
  1128.         // Wholesale Domain
  1129.         if (in_array($domain->getId(), MultiStore::getWholesaleDomainIDs())) {
  1130.             $domain = $multiStore->getRetailDomainByWholesaleDomain($domain);
  1131.         }
  1132.         // Default Language Id
  1133.         $defaultLanguageId = $multiStore->getDefaultLanguageId();
  1134.         // Language Code
  1135.         $languageCode = $request->getLocale();
  1136.         // Category Repository
  1137.         $categoryPageRepository = $entityManager->getRepository(CategoryPage::class);
  1138.         $categoryPageRepository->setSession($request->getSession());
  1139.         // Last Changes
  1140.         $lastChanges = $entityManager->getConnection()->fetchOne('SELECT updated FROM domain_navigation WHERE domain_id = ' . $domain->getId() . ' ORDER BY updated DESC LIMIT 1');
  1141.         // Cache Key
  1142.         $cacheKey = 'header.mainMenu.' . $target . '.v24.' . $request->getSession()->get('localeDomainId') . '.' . $languageCode . '.' . strtotime($lastChanges);
  1143.         // Bazaar
  1144.         if ( $request->getSession()->get('isBazaarPage') === true ) {
  1145.             $cacheKey = 'header.mainMenu.' . $target . '.bazaar.v24.' . $request->getSession()->get('localeDomainId') . '.' . $languageCode . '.' . strtotime($lastChanges);
  1146.         }
  1147.         // Cache Data
  1148.         $cacheItem = $this->cache->getItem($cacheKey);
  1149.         if ($cacheItem->isHit()) {
  1150.             return $cacheItem->get();
  1151.         }
  1152.         // Collection of Routes
  1153.         $routes = $router->getRouteCollection();
  1154.         // Menu
  1155.         $menu = [
  1156.             'product' => [
  1157.                 'name' => 'Our products',
  1158.                 'href' => false,
  1159.                 'nanobar' => false,
  1160.                 'children' => [],
  1161.             ],
  1162.             'standard' => [],
  1163.             'push' => [],
  1164.         ];
  1165.         // Criteria
  1166.         $criteria = [
  1167.             'domain' => $domain, 
  1168.             'parent' => null
  1169.         ];
  1170.         // Bazaar
  1171.         if ( $request->getSession()->get('isBazaarPage') === true ) {
  1172.             $criteria['bazaar'] = true;
  1173.         }
  1174.         $domainNavigation = $entityManager->getRepository(DomainNavigation::class)->findBy($criteria, [
  1175.             'sortIndex' => 'ASC',
  1176.         ]);
  1177.         /**
  1178.          * @var DomainNavigation $navigation
  1179.          */
  1180.         foreach ($domainNavigation as $navigationIndex => $navigation) {
  1181.             // Navigation Type
  1182.             $navigationType = $navigation->getType();
  1183.             if ( $navigationType == DomainNavigation::NAVIGATION_TYPE_PRODUCT && $request->getSession()->get('isBazaarPage') === false && $navigation->isBazaar() === true ) {
  1184.                 continue;
  1185.             }
  1186.             // Category Page (parent)
  1187.             $parentCategoryPage = $navigation->getCategoryPage();
  1188.             // Build Query
  1189.             $arguments = [];
  1190.             if (!empty($navigation->getQuery())) {
  1191.                 foreach (explode('&', $navigation->getQuery()) as $argument) {
  1192.                     [$name, $value] = explode('=', $argument);
  1193.                     if (!empty($name) && !empty($value)) {
  1194.                         $arguments[$name] = $value;
  1195.                     }
  1196.                 }
  1197.             }
  1198.             // Alternative Navigation
  1199.             $alternativeNavigation = null;
  1200.             if ($multiStore->isLanguageSwitched()) {
  1201.                 // Use Alternative Category
  1202.                 if (!is_null($parentCategoryPage)) {
  1203.                     $alternativeParentCategoryPage = $categoryPageRepository->getAlternativeCategoryByLanguage($parentCategoryPage);
  1204.                     if (!is_null($alternativeParentCategoryPage)) {
  1205.                         // Criteria
  1206.                         $_criteria = [
  1207.                             'categoryPage'  => $alternativeParentCategoryPage, 
  1208.                             'parent'        => null
  1209.                         ];
  1210.                         // Bazaar
  1211.                         if ( $request->getSession()->get('isBazaarPage') === true ) {
  1212.                             $_criteria['bazaar'] = true;
  1213.                         }
  1214.                         // Alternative Navigations
  1215.                         $alternativeNavigations = $entityManager->getRepository(DomainNavigation::class)->findBy($_criteria);
  1216.                         foreach ($alternativeNavigations as $_alternativeNavigation) {
  1217.                             // Build Alternative Query
  1218.                             $alternativeArguments = [];
  1219.                             if (!empty($_alternativeNavigation->getQuery())) {
  1220.                                 foreach (explode('&', $_alternativeNavigation->getQuery()) as $argument) {
  1221.                                     [$name, $value] = explode('=', $argument);
  1222.                                     if (!empty($name) && !empty($value)) {
  1223.                                         $alternativeArguments[$name] = $value;
  1224.                                     }
  1225.                                 }
  1226.                             }
  1227.                             if (array_diff($arguments, $alternativeArguments) == array_diff($alternativeArguments, $arguments)) {
  1228.                                 $alternativeNavigation = $_alternativeNavigation;
  1229.                                 continue;
  1230.                             }
  1231.                         }
  1232.                     }
  1233.                 }
  1234.                 // Alternatives to non-identifiable static categories
  1235.                 else {
  1236.                     $alternativeNavigation = $categoryPageRepository->getAlternativeNavigation($navigation);
  1237.                 }
  1238.             }
  1239.             // Build Link
  1240.             if ($parentCategoryPage) {
  1241.                 if ($parentCategoryPage->getType() == CategoryPage::CATEGORY_TYPE_BLOG) {
  1242.                     $link = $seoUrl->link('blog_category', array_merge([
  1243.                         'blog_category_id' => $parentCategoryPage->getId(),
  1244.                     ], $arguments));
  1245.                 } else {
  1246.                     $link = $seoUrl->link('category', array_merge([
  1247.                         'path'      => $parentCategoryPage->getId(), 
  1248.                         'isBazaar'  => $parentCategoryPage->isShowOnlyBazaar()
  1249.                     ], $arguments));
  1250.                 }
  1251.             } else {
  1252.                 $context = new RequestContext();
  1253.                 $context->fromRequest($request);
  1254.                 $matcher = new UrlMatcher($routes, $context);
  1255.                 $route = '/' . ltrim($navigation->getRoute(), '/');
  1256.                 $attributes = $matcher->match($route);
  1257.                 if (empty($attributes) || $attributes['_route'] == 'seo') {
  1258.                     // Static Page Seo Url
  1259.                     $staticSeoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  1260.                         'keyword'   => ltrim($navigation->getRoute(), '/'), 
  1261.                         'domain'    => $domain, 
  1262.                         'language'  => $defaultLanguageId
  1263.                     ]);
  1264.                     if ( empty($staticSeoUrl) ) {
  1265.                         continue;
  1266.                     }
  1267.                     // Explode Url Query
  1268.                     [$type, $static_id] = explode('=', $staticSeoUrl->getQuery());
  1269.                     if ( $type !== 'static_id' ) {
  1270.                         continue;
  1271.                     }
  1272.                     $link = $seoUrl->link('page', array_merge([
  1273.                         $type   => $static_id
  1274.                     ], $arguments));
  1275.                 } else {
  1276.                     $link = $this->generateUrl($attributes['_route'], $arguments);
  1277.                 }
  1278.             }
  1279.             if ( empty($link) ) {
  1280.                 continue;
  1281.             }
  1282.             // Product
  1283.             if ($navigationType == DomainNavigation::NAVIGATION_TYPE_PRODUCT) {
  1284.                 $menu['product']['children'][$navigationIndex] = [
  1285.                     'name' => !is_null($alternativeNavigation) ? $alternativeNavigation->getTitle() : $navigation->getTitle(),
  1286.                     'icon' => $navigation->getSvgIcon(),
  1287.                     'href' => $link,
  1288.                     'children' => false,
  1289.                 ];
  1290.                 // Groups
  1291.                 if ($navigation->getChildren()->count() > 0) {
  1292.                     $groups = [];
  1293.                     foreach ($navigation->getChildren() as $groupIndex => $group) {
  1294.                         // Bazaar
  1295.                         if ( $request->getSession()->get('isBazaarPage') === true && !$group->isBazaar() ) {
  1296.                             continue;
  1297.                         }
  1298.                         if (($target == 'desktop' && $group->isDesktop()) || ($target == 'mobile' && $group->isMobile())) {
  1299.                             // Items
  1300.                             if ($group->getChildren()->count() > 0) {
  1301.                                 $groups[$groupIndex] = [
  1302.                                     'name' => (mb_strpos($group->getTitle(), '#') === false ? $group->getTitle() : ''),
  1303.                                     'children' => false,
  1304.                                 ];
  1305.                                 foreach ($group->getChildren() as $itemIndex => $item) {
  1306.                                     // Bazaar
  1307.                                     if ( $request->getSession()->get('isBazaarPage') === true && !$item->isBazaar() ) {
  1308.                                         continue;
  1309.                                     }
  1310.                                     if (($target == 'desktop' && $item->isDesktop()) || ($target == 'mobile' && $item->isMobile())) {
  1311.                                         // Category Page (child)
  1312.                                         /** @var CategoryPage $childCategoryPage */
  1313.                                         $childCategoryPage = $item->getCategoryPage();
  1314.                                         // Skip Blog Category Pages
  1315.                                         if ($multiStore->isLanguageSwitched() && !is_null($childCategoryPage) && $childCategoryPage->getType() == CategoryPage::CATEGORY_TYPE_BLOG) {
  1316.                                             continue;
  1317.                                         }
  1318.                                         // Build Query
  1319.                                         $arguments = [];
  1320.                                         if (!empty($item->getQuery())) {
  1321.                                             foreach (explode('&', $item->getQuery()) as $argument) {
  1322.                                                 if (count(explode('=', $argument)) == 1) {
  1323.                                                     continue;
  1324.                                                 }
  1325.                                                 [$name, $value] = explode('=', $argument);
  1326.                                                 if (!empty($name) && !empty($value)) {
  1327.                                                     $arguments[$name] = $value;
  1328.                                                 }
  1329.                                             }
  1330.                                         }
  1331.                                         // Alternative Child Navigation
  1332.                                         $alternativeChildNavigation = null;
  1333.                                         // Use Alternative Category by Language
  1334.                                         if (!is_null($childCategoryPage) && $multiStore->isLanguageSwitched()) {
  1335.                                             $alternativeChildCategoryPage = $categoryPageRepository->getAlternativeCategoryByLanguage($childCategoryPage);
  1336.                                             if (is_null($alternativeChildCategoryPage)) {
  1337.                                                 continue;
  1338.                                             }
  1339.                                             // Alternative Child Navigations
  1340.                                             $alternativeChildNavigations = $entityManager->getRepository(DomainNavigation::class)->findBy([
  1341.                                                 'categoryPage' => $alternativeChildCategoryPage,
  1342.                                             ]);
  1343.                                             foreach ($alternativeChildNavigations as $_alternativeChildNavigation) {
  1344.                                                 if (is_null($_alternativeChildNavigation->getParent())) {
  1345.                                                     continue;
  1346.                                                 }
  1347.                                                 if (!is_null($alternativeNavigation) && $_alternativeChildNavigation->getParent()->getParent()->getId() !== $alternativeNavigation->getId()) {
  1348.                                                     continue;
  1349.                                                 }
  1350.                                                 // Build Alternative Query
  1351.                                                 $alternativeArguments = [];
  1352.                                                 if (!empty($_alternativeChildNavigation->getQuery())) {
  1353.                                                     foreach (explode('&', $_alternativeChildNavigation->getQuery()) as $argument) {
  1354.                                                         try {
  1355.                                                             [$name, $value] = explode('=', $argument);
  1356.                                                         } catch (\Exception $exception) {
  1357.                                                            continue;
  1358.                                                         }
  1359.                                                         if (!empty($name) && !empty($value)) {
  1360.                                                             $alternativeArguments[$name] = $value;
  1361.                                                         }
  1362.                                                     }
  1363.                                                 }
  1364.                                                 if (array_diff($arguments, $alternativeArguments) == array_diff($alternativeArguments, $arguments)) {
  1365.                                                     $alternativeChildNavigation = $_alternativeChildNavigation;
  1366.                                                     continue;
  1367.                                                 }
  1368.                                             }
  1369.                                             if (is_null($alternativeChildNavigation)) {
  1370.                                                 continue;
  1371.                                             }
  1372.                                         }
  1373.                                         // Build Link
  1374.                                         if ($childCategoryPage) {
  1375.                                             //skip bazaar menu in RT domains
  1376.                                             if (
  1377.                                                 in_array($multiStore->getDomain()->getId(), MultiStore::getRetailDomainIDs())
  1378.                                                 && $childCategoryPage->isShowOnlyBazaar()
  1379.                                             ) {
  1380.                                                 continue;
  1381.                                             }
  1382.                                             if ($childCategoryPage->getType() == CategoryPage::CATEGORY_TYPE_BLOG) {
  1383.                                                 $link = $seoUrl->link('blog_category', array_merge([
  1384.                                                     'blog_category_id' => $childCategoryPage->getId(),
  1385.                                                 ], $arguments));
  1386.                                             } elseif ($childCategoryPage->getParentCategory()) {
  1387.                                                 $link = $seoUrl->link('category', array_merge([
  1388.                                                     'path'      => $childCategoryPage->getParentCategory()->getId() . '_' . $childCategoryPage->getId(), 
  1389.                                                     'isBazaar'  => $childCategoryPage->isShowOnlyBazaar()
  1390.                                                 ], $arguments));
  1391.                                             } else {
  1392.                                                 $link = $seoUrl->link('category', array_merge([
  1393.                                                     'path'      => $childCategoryPage->getId(), 
  1394.                                                     'isBazaar'  => $childCategoryPage->isShowOnlyBazaar()
  1395.                                                 ], $arguments));
  1396.                                             }
  1397.                                         } else {
  1398.                                             $context = new RequestContext();
  1399.                                             $context->fromRequest($request);
  1400.                                             $matcher = new UrlMatcher($routes, $context);
  1401.                                             $attributes = $matcher->match($item->getRoute());
  1402.                                             if (empty($attributes) || $attributes['_route'] == 'seo') {
  1403.                                                 continue;
  1404.                                             }
  1405.                                             $link = $this->generateUrl($attributes['_route'], $arguments);
  1406.                                         }
  1407.                                         $groups[$groupIndex]['children'][$itemIndex] = [
  1408.                                             'title' => !is_null($alternativeChildNavigation) ? $alternativeChildNavigation->getTitle() : $item->getTitle(),
  1409.                                             'subTitle' => !is_null($alternativeChildNavigation) ? $alternativeChildNavigation->getSubTitle() : $item->getSubTitle(),
  1410.                                             'href' => $link,
  1411.                                             'label' => (
  1412.                                                 !is_null($item->getLabel()) && $item->getLabel() !== DomainNavigation::LABEL_NONE && isset(DomainNavigation::getLabelChoices()[$item->getLabel()])
  1413.                                                     ? mb_strtolower(DomainNavigation::getLabelChoices()[$item->getLabel()]) : false
  1414.                                             ),
  1415.                                         ];
  1416.                                     }
  1417.                                 }
  1418.                                 if (!$groups[$groupIndex]['children']) {
  1419.                                     unset($groups[$groupIndex]);
  1420.                                 }
  1421.                             }
  1422.                         }
  1423.                     }
  1424.                     if (!empty($groups)) {
  1425.                         $menu['product']['children'][$navigationIndex]['children'] = $groups;
  1426.                     }
  1427.                 }
  1428.             }
  1429.             // Standard
  1430.             elseif ($navigationType == DomainNavigation::NAVIGATION_TYPE_STANDARD) {
  1431.                 $menu['standard'][$navigationIndex] = [
  1432.                     'name' => $navigation->getTitle(),
  1433.                     'href' => $link,
  1434.                     'children' => false,
  1435.                     'icon' => $navigation->getSvgIcon(),
  1436.                 ];
  1437.             }
  1438.             // Pushed to the right
  1439.             elseif ($navigationType == DomainNavigation::NAVIGATION_TYPE_PUSH) {
  1440.                 $menu['push'][$navigationIndex] = [
  1441.                     'name' => $navigation->getTitle(),
  1442.                     'href' => $link,
  1443.                     'children' => false,
  1444.                 ];
  1445.             }
  1446.         }
  1447.         if ($domain->getId() == Domain::DOMAIN_ID_RT_HU){
  1448.             $menu['standard'][-1] = [
  1449.                 'name' => 'Bestseller',
  1450.                 'href' => 'https://www.furbify.hu/bestseller',
  1451.                 'children' => false,
  1452.                 'icon' => null,
  1453.             ];
  1454.         } else if ($domain->getId() == Domain::DOMAIN_ID_RT_SK){
  1455.             $menu['standard'][-1] = [
  1456.                 'name' => 'Bestseller',
  1457.                 'href' => 'https://www.furbify.sk/bestseller',
  1458.                 'children' => false,
  1459.                 'icon' => null,
  1460.             ];
  1461.         } else if ($domain->getId() == Domain::DOMAIN_ID_RT_CZ){
  1462.             $menu['standard'][-1] = [
  1463.                 'name' => 'Bestseller',
  1464.                 'href' => 'https://www.furbify.cz/bestseller',
  1465.                 'children' => false,
  1466.                 'icon' => null,
  1467.             ];
  1468.         } else if ($domain->getId() == Domain::DOMAIN_ID_RT_EU){
  1469.             $menu['standard'][-1] = [
  1470.                 'name' => 'Sale',
  1471.                 'href' => 'https://www.furbify.eu/sale',
  1472.                 'children' => false,
  1473.                 'icon' => null,
  1474.             ];
  1475.         }
  1476.         $currentDate = new \DateTime();
  1477.         $endDate = new \DateTime('2025-11-30');
  1478.         $startDate = new \DateTime('2025-11-07');
  1479.         $blackFridayDateIsActive = $startDate <= $currentDate && $currentDate <= $endDate;
  1480.         if ($blackFridayDateIsActive) {
  1481.             $menu['standard'][-1]['name'] = 'BLACK FRIDAY';
  1482.             $menu['standard'][-1]['href'] = "{$domain->getUrl()}/black-friday";
  1483.         }
  1484.         if ( $request->getSession()->get('isBazaarPage') === true ) {
  1485.             unset($menu['standard'][-1]);
  1486.         }
  1487.         ksort($menu['standard']);
  1488.         $cacheItem->set($menu);
  1489.         $cacheItem->expiresAfter(self::CACHE_LIFETIME_1_YEAR);
  1490.         $this->cache->save($cacheItem);
  1491.         return $menu;
  1492.     }
  1493.     /**
  1494.      * @param Request $request
  1495.      * @return Login
  1496.      */
  1497.     public function getLoginHelper(Request $request): Login
  1498.     {
  1499.         return new Login($this->getEntityManager(), $request, $this->container);
  1500.     }
  1501.     /**
  1502.      * @return array
  1503.      */
  1504.     public function getContactInfos(): array
  1505.     {
  1506.         $isYear2025 = date('Y') == '2025';
  1507.         return [
  1508.             'mail.webshop.sk.retail' => 'webshop@furbify.sk',
  1509.             'mail.webshop.hu.retail' => 'webshop@furbify.hu',
  1510.             'mail.webshop.cz.retail' => 'webshop@furbify.cz',
  1511.             'mail.webshop.en.retail' => 'webshop@furbify.eu',
  1512.             'mail.webshop.sk.wholesale' => 'webshop@furbify.sk',
  1513.             'mail.webshop.hu.wholesale' => 'webshop@furbify.hu',
  1514.             'mail.webshop.cz.wholesale' => 'webshop@furbify.cz',
  1515.             'mail.webshop.en.wholesale' => 'zsolt.matusek@furbify.eu',
  1516.             'mail.warranty.sk.retail' => 'warranty@furbify.sk',
  1517.             'mail.warranty.hu.retail' => 'warranty@furbify.hu',
  1518.             'mail.warranty.cz.retail' => 'warranty@furbify.cz',
  1519.             'mail.warranty.en.retail' => 'warranty@furbify.eu',
  1520.             'mail.warranty.sk.wholesale' => 'warranty@furbify.sk',
  1521.             'mail.warranty.hu.wholesale' => 'warranty@furbify.hu',
  1522.             'mail.warranty.cz.wholesale' => 'warranty@furbify.cz',
  1523.             'mail.warranty.en.wholesale' => 'warranty@furbify.eu',
  1524.             'phone.webshop.sk.retail' => '+421 220 512 060',
  1525.             'phone.webshop.hu.retail' => '+36 17 65 46 57',
  1526.             'phone.webshop.cz.retail' => '+420 226 400 290',
  1527.             'phone.webshop.en.retail' => '+421 220 512 060',
  1528.             'phone.webshop.sk.wholesale' => '+421 220 512 060',
  1529.             'phone.webshop.hu.wholesale' => '+36 17 65 46 57',
  1530.             'phone.webshop.cz.wholesale' => '+420 226 400 290',
  1531.             'phone.webshop.en.wholesale' => '+421 220 512 060',
  1532.             'phone.warranty.sk.retail' => '+421 220 512 060',
  1533.             'phone.warranty.hu.retail' => '+36 17 65 46 57',
  1534.             'phone.warranty.cz.retail' => '+420 226 400 290',
  1535.             'phone.warranty.en.retail' => '+421 220 512 060',
  1536.             'phone.warranty.sk.wholesale' => '+421 220 512 060',
  1537.             'phone.warranty.hu.wholesale' => '+36 17 65 46 57',
  1538.             'phone.warranty.cz.wholesale' => '+420 226 400 290',
  1539.             'phone.warranty.en.wholesale' => '+421 220 512 060',
  1540.             'company.sk.name' => 'furbify s.r.o.',
  1541.             'company.sk.street' => 'Osada Reviczkého 3869/38',
  1542.             'company.sk.city' => 'Kolárovo',
  1543.             'company.sk.zip' => '946 03',
  1544.             'company.sk.country' => 'Slovenská republika',
  1545.             'company.sk.id' => '44827385',
  1546.             'company.sk.vatId' => 'SK2022851589',
  1547.             'company.sk.bankAccount' => '212959395/0900',
  1548.             'company.sk.iban' => 'SK45 0900 0000 0002 1295 9395 (Slovenská Sporiteľňa - Erste Group)',
  1549.             'company.hu.name' => 'furbify s.r.o.',
  1550.             'company.hu.street' => 'Osada Reviczkého 3869/38',
  1551.             'company.hu.city' => 'Kolárovo (Gúta)',
  1552.             'company.hu.zip' => '946 03',
  1553.             'company.hu.country' => 'Szlovákia',
  1554.             'company.hu.id' => '44827385',
  1555.             'company.hu.vatId' => 'SK2022851589',
  1556.             'company.hu.bankAccount' => '12028209-02010543-00100002',
  1557.             'company.hu.iban' => 'HU89 1202 8209 0201 0543 0010 0002 (Raiffeisen Bank)',
  1558.             'company.cz.name' => 'furbify s.r.o.',
  1559.             'company.cz.street' => 'Osada Reviczkého 3869/38',
  1560.             'company.cz.city' => 'Kolárovo',
  1561.             'company.cz.zip' => '946 03',
  1562.             'company.cz.country' => 'Slovenská republika',
  1563.             'company.cz.id' => '44827385',
  1564.             'company.cz.vatId' => 'SK2022851589',
  1565.             'company.cz.bankAccount' => '4732551359/0800 (Česká spořitelna, a.s.)',
  1566.             'company.cz.iban' => 'CZ38 0800 0000 0047 3255 1359',
  1567.             'company.en.name' => 'furbify s.r.o.',
  1568.             'company.en.street' => 'Osada Reviczkého 3869/38',
  1569.             'company.en.city' => 'Kolárovo',
  1570.             'company.en.zip' => '946 03',
  1571.             'company.en.country' => 'Slovakia',
  1572.             'company.en.id' => '44827385',
  1573.             'company.en.vatId' => 'SK2022851589',
  1574.             'company.en.bankAccount' => '212959395/0900 (SLSP)',
  1575.             'company.en.iban' => 'SK45 0900 0000 0002 1295 9395',
  1576.         ];
  1577.     }
  1578.     /**
  1579.      * @param Request $request
  1580.      * @param int $domainId
  1581.      * @return array
  1582.      */
  1583.     protected function getLegalLinks(Request $request, int $domainId): array
  1584.     {
  1585.         $links = [];
  1586.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  1587.         switch ($domainId) {
  1588.             case Domain::DOMAIN_ID_RT_SK:
  1589.             case Domain::DOMAIN_ID_WS_SK:
  1590.                 $links['terms_conditions'] = $seoUrlHelper->link('page', [
  1591.                     'static_id' => 12,
  1592.                 ]);
  1593.                 $links['privacy_policy'] = $seoUrlHelper->link('page', [
  1594.                     'static_id' => 13,
  1595.                 ]);
  1596.                 $links['return_policy'] = $seoUrlHelper->link('page', [
  1597.                     'static_id' => 15,
  1598.                 ]);
  1599.                 $links['cookies'] = $seoUrlHelper->link('page', [
  1600.                     'static_id' => 37,
  1601.                 ]);
  1602.                 break;
  1603.             case Domain::DOMAIN_ID_RT_HU:
  1604.             case Domain::DOMAIN_ID_WS_HU:
  1605.                 $links['terms_conditions'] = $seoUrlHelper->link('page', [
  1606.                     'static_id' => 28,
  1607.                 ]);
  1608.                 $links['privacy_policy'] = $seoUrlHelper->link('page', [
  1609.                     'static_id' => 29,
  1610.                 ]);
  1611.                 $links['return_policy'] = $seoUrlHelper->link('page', [
  1612.                     'static_id' => 31,
  1613.                 ]);
  1614.                 $links['cookies'] = $seoUrlHelper->link('page', [
  1615.                     'static_id' => 38,
  1616.                 ]);
  1617.                 break;
  1618.             case Domain::DOMAIN_ID_RT_CZ:
  1619.             case Domain::DOMAIN_ID_WS_CZ:
  1620.                 $links['terms_conditions'] = $seoUrlHelper->link('page', [
  1621.                     'static_id' => 61,
  1622.                 ]);
  1623.                 $links['privacy_policy'] = $seoUrlHelper->link('page', [
  1624.                     'static_id' => 62,
  1625.                 ]);
  1626.                 $links['return_policy'] = $seoUrlHelper->link('page', [
  1627.                     'static_id' => 64,
  1628.                 ]);
  1629.                 $links['cookies'] = $seoUrlHelper->link('page', [
  1630.                     'static_id' => 68,
  1631.                 ]);
  1632.                 break;
  1633.             case Domain::DOMAIN_ID_RT_EU:
  1634.             case Domain::DOMAIN_ID_WS_EU:
  1635.                 $links['terms_conditions'] = $seoUrlHelper->link('page', [
  1636.                     'static_id' => 128,
  1637.                 ]);
  1638.                 $links['privacy_policy'] = $seoUrlHelper->link('page', [
  1639.                     'static_id' => 123,
  1640.                 ]);
  1641.                 $links['return_policy'] = $seoUrlHelper->link('page', [
  1642.                     'static_id' => 127,
  1643.                 ]);
  1644.                 $links['cookies'] = $seoUrlHelper->link('page', [
  1645.                     'static_id' => 108,
  1646.                 ]);
  1647.                 break;
  1648.             default:
  1649.                 $links['terms_conditions'] = $seoUrlHelper->link('page', [
  1650.                     'static_id' => 12,
  1651.                 ]);
  1652.                 $links['privacy_policy'] = $seoUrlHelper->link('page', [
  1653.                     'static_id' => 13,
  1654.                 ]);
  1655.                 $links['return_policy'] = $seoUrlHelper->link('page', [
  1656.                     'static_id' => 15,
  1657.                 ]);
  1658.                 $links['cookies'] = $seoUrlHelper->link('page', [
  1659.                     'static_id' => 37,
  1660.                 ]);
  1661.         }
  1662.         return $links;
  1663.     }
  1664.     /**
  1665.      * @param Request $request
  1666.      * @return int
  1667.      */
  1668.     protected function getCommissionsCount(Request $request)
  1669.     {
  1670.         return $this->getEntityManager()
  1671.             ->createQuery("SELECT COUNT(pc.id) AS commissionCount
  1672.                 FROM AtechNetCoreBundle:ProductCommission pc
  1673.                 WHERE pc.customer = :customer")
  1674.             ->setParameter('customer', $this->getLoginHelper($request)->getLoggedInCustomerId())
  1675.             ->getResult()[0]['commissionCount'];
  1676.     }
  1677.     /**
  1678.      * @return Cetelem
  1679.      */
  1680.     protected function getCetelemHelperSK()
  1681.     {
  1682.         return new Cetelem(
  1683.             $this->getParameter('cetelem_sk_id'),
  1684.             $this->getEntityManager(),
  1685.             $this->getTwig(),
  1686.             __DIR__ . '/../Resources/storage/cetelem',
  1687.             'cetelem_sk.json'
  1688.         );
  1689.     }
  1690.     /**
  1691.      * @param Request $request
  1692.      * @return SeoUrlHelper
  1693.      */
  1694.     protected function getSeoUrlHelper(Request $request): SeoUrlHelper
  1695.     {
  1696.         return new SeoUrlHelper($this->getEntityManager(), $request, $this->getEnvironment());
  1697.     }
  1698.     /**
  1699.      * @param Request $request
  1700.      * @return OrderHelper
  1701.      * @throws \Exception
  1702.      */
  1703.     protected function getOrderHelper(Request $request): OrderHelper
  1704.     {
  1705.         return new OrderHelper(
  1706.             $request,
  1707.             $this->getEntityManager(),
  1708.             $this->getTranslator(),
  1709.             $this->getDatabaseTranslator($request),
  1710.             $this->getRouter(),
  1711.             $this->getMailer(),
  1712.             $this->getParameter('mailer_reply_to'),
  1713.             $this->getParameter('cloudflare_image'),
  1714.             $this->getEnvironment()
  1715.         );
  1716.     }
  1717.     /**
  1718.      * @param Request $request
  1719.      * @param int $domainId
  1720.      * @return array
  1721.      */
  1722.     protected function getAvailableLanguagesByDomainId(Request $request, int $domainId): array
  1723.     {
  1724.         // Language Redirect
  1725.         if ($request->attributes->get('productId')) {
  1726.             $redirect = [
  1727.                 'productId' => $request->attributes->get('productId'),
  1728.             ];
  1729.         } elseif ($request->attributes->get('categoryId')) {
  1730.             $redirect = [
  1731.                 'categoryId' => $request->attributes->get('categoryId'),
  1732.             ];
  1733.         } elseif ($request->attributes->get('pageId')) {
  1734.             $redirect = [
  1735.                 'pageId' => $request->attributes->get('pageId'),
  1736.             ];
  1737.         } elseif ($request->attributes->get('blogId')) {
  1738.             $redirect = [
  1739.                 'blogId' => $request->attributes->get('blogId'),
  1740.             ];
  1741.         } elseif ($request->attributes->get('blogCategoryId')) {
  1742.             $redirect = [
  1743.                 'blogCategoryId' => $request->attributes->get('blogCategoryId'),
  1744.             ];
  1745.         } elseif ($request->attributes->get('slug')) {
  1746.             $redirect = [
  1747.                 'slug' => $request->attributes->get('slug'),
  1748.             ];
  1749.         } elseif ($request->attributes->get('job_id')) {
  1750.             $redirect = [
  1751.                 'job_id' => $request->attributes->get('job_id'),
  1752.             ];
  1753.         } else {
  1754.             $redirect = [
  1755.                 'route' => str_replace('_locale', '', $request->attributes->get('_route')),
  1756.             ];
  1757.         }
  1758.         $query = $request->query->all();
  1759.         $languages = [];
  1760.         switch ($domainId) {
  1761.             case Domain::DOMAIN_ID_RT_SK:
  1762.             case Domain::DOMAIN_ID_WS_SK:
  1763.                 // Default
  1764.                 $parameters = array_merge([
  1765.                     'locale' => 'sk',
  1766.                 ], $redirect, $query);
  1767.                 $languages[] = [
  1768.                     'code' => 'sk',
  1769.                     'title' => 'Slovenčina',
  1770.                     'href' => $this->generateUrl('set_locale', $parameters),
  1771.                 ];
  1772.                 // Additional - Hungarian
  1773.                 $parameters = array_merge([
  1774.                     'locale' => 'hu',
  1775.                 ], $redirect, $query);
  1776.                 $languages[] = [
  1777.                     'code' => 'hu',
  1778.                     'title' => 'Magyar',
  1779.                     'href' => $this->generateUrl('set_locale', $parameters),
  1780.                 ];
  1781.                 // Additional - English
  1782.                 $parameters = array_merge([
  1783.                     'locale' => 'en',
  1784.                 ], $redirect, $query);
  1785.                 $languages[] = [
  1786.                     'code' => 'en',
  1787.                     'title' => 'English',
  1788.                     'href' => $this->generateUrl('set_locale', $parameters),
  1789.                 ];
  1790.                 break;
  1791.             case Domain::DOMAIN_ID_RT_HU:
  1792.             case Domain::DOMAIN_ID_WS_HU:
  1793.                 // Default
  1794.                 $parameters = array_merge([
  1795.                     'locale' => 'hu',
  1796.                 ], $redirect, $query);
  1797.                 $languages[] = [
  1798.                     'code' => 'hu',
  1799.                     'title' => 'Magyar',
  1800.                     'href' => $this->generateUrl('set_locale', $parameters),
  1801.                 ];
  1802.                 // Additional - English
  1803.                 $parameters = array_merge([
  1804.                     'locale' => 'en',
  1805.                 ], $redirect, $query);
  1806.                 $languages[] = [
  1807.                     'code' => 'en',
  1808.                     'title' => 'English',
  1809.                     'href' => $this->generateUrl('set_locale', $parameters),
  1810.                 ];
  1811.                 break;
  1812.             case Domain::DOMAIN_ID_RT_CZ:
  1813.             case Domain::DOMAIN_ID_WS_CZ:
  1814.                 // Default
  1815.                 $parameters = array_merge([
  1816.                     'locale' => 'cz',
  1817.                 ], $redirect, $query);
  1818.                 $languages[] = [
  1819.                     'code' => 'cz',
  1820.                     'title' => 'Čeština',
  1821.                     'href' => $this->generateUrl('set_locale', $parameters),
  1822.                 ];
  1823.                 // Additional - Slovak
  1824.                 $parameters = array_merge([
  1825.                     'locale' => 'sk',
  1826.                 ], $redirect, $query);
  1827.                 $languages[] = [
  1828.                     'code' => 'sk',
  1829.                     'title' => 'Slovenčina',
  1830.                     'href' => $this->generateUrl('set_locale', $parameters),
  1831.                 ];
  1832.                 // Additional - English
  1833.                 $parameters = array_merge([
  1834.                     'locale' => 'en',
  1835.                 ], $redirect, $query);
  1836.                 $languages[] = [
  1837.                     'code' => 'en',
  1838.                     'title' => 'English',
  1839.                     'href' => $this->generateUrl('set_locale', $parameters),
  1840.                 ];
  1841.                 break;
  1842.             case Domain::DOMAIN_ID_RT_EU:
  1843.             case Domain::DOMAIN_ID_WS_EU:
  1844.                 // Default
  1845.                 $parameters = array_merge([
  1846.                     'locale' => 'hu',
  1847.                 ], $redirect, $query);
  1848.                 $languages[] = [
  1849.                     'code' => 'en',
  1850.                     'title' => 'English',
  1851.                     'href' => $this->generateUrl('set_locale', $parameters),
  1852.                 ];
  1853.                 // Additional - Slovak
  1854.                 $parameters = array_merge([
  1855.                     'locale' => 'sk',
  1856.                 ], $redirect, $query);
  1857.                 $languages[] = [
  1858.                     'code' => 'sk',
  1859.                     'title' => 'Slovenčina',
  1860.                     'href' => $this->generateUrl('set_locale', $parameters),
  1861.                 ];
  1862.                 // Additional - Czech
  1863.                 $parameters = array_merge([
  1864.                     'locale' => 'cz',
  1865.                 ], $redirect, $query);
  1866.                 $languages[] = [
  1867.                     'code' => 'cz',
  1868.                     'title' => 'Čeština',
  1869.                     'href' => $this->generateUrl('set_locale', $parameters),
  1870.                 ];
  1871.                 // Additional - Hungarian
  1872.                 $parameters = array_merge([
  1873.                     'locale' => 'hu',
  1874.                 ], $redirect, $query);
  1875.                 $languages[] = [
  1876.                     'code' => 'hu',
  1877.                     'title' => 'Magyar',
  1878.                     'href' => $this->generateUrl('set_locale', $parameters),
  1879.                 ];
  1880.                 break;
  1881.         }
  1882.         return $languages;
  1883.     }
  1884.     /**
  1885.      * @param Request $request
  1886.      * @return array
  1887.      */
  1888.     protected function getBreadCrumbsBase(Request $request): array
  1889.     {
  1890.         return [
  1891.             'text' => $this->getTranslator()->trans('furbify eshop'),
  1892.             'href' => $this->generateUrl('homepage'),
  1893.         ];
  1894.     }
  1895.     protected function getCustomerTypeId(Request $request)
  1896.     {
  1897.         return $request->getSession()->get('customerTypeId');
  1898.     }
  1899.     protected function getCustomerTypeString(Request $request)
  1900.     {
  1901.         return $this->getCustomerTypeId($request) == MultiStore::CUSTOMER_TYPE_WHOLESALE ? 'partner' : 'retail';
  1902.     }
  1903.     /**
  1904.      * @return array
  1905.      */
  1906.     protected function getWhiteListCouponCodes()
  1907.     {
  1908.         return ['FURB20191Y', '15FPC19SK', '15FMON19SK', '15FNTB19SK', '15FPC19HU', '15FMON19HU', '15FNTB19HU', 'FBF3YW', 'XCSOKI', 'XMAS', 'extra3'];
  1909.     }
  1910.     /**
  1911.      * @param $cartId
  1912.      * @return null|object
  1913.      */
  1914.     protected function getCart($cartId)
  1915.     {
  1916.         return $this->getEntityManager()->getRepository(Basket::class)->findOneBy([
  1917.             'id' => $cartId,
  1918.             'active' => true,
  1919.         ]);
  1920.     }
  1921.     /**
  1922.      * @param $cartId
  1923.      * @return null|object
  1924.      */
  1925.     protected function getAbandonedCart($cartId)
  1926.     {
  1927.         return $this->getEntityManager()->getRepository(Basket::class)->findOneById($cartId);
  1928.     }
  1929.     /**
  1930.      * @return Billingo
  1931.      */
  1932.     protected function getBillingo(): Billingo
  1933.     {
  1934.         return new Billingo(
  1935.             $this->getEntityManager()
  1936.         );
  1937.     }
  1938.     /**
  1939.      * @param Request $request
  1940.      * @return GoPayHelper
  1941.      * @throws \Exception
  1942.      */
  1943.     protected function getGopayHelper(Request $request): GoPayHelper
  1944.     {
  1945.         $parameter = $this->getEnvironment() == 'dev' ? 'gopay_sandbox' : 'gopay';
  1946.         return new GoPayHelper(
  1947.             $request,
  1948.             $this->getEntityManager(),
  1949.             $this->getDatabaseTranslator($request),
  1950.             $this->getParameter($parameter),
  1951.             $this->getRouter()
  1952.         );
  1953.     }
  1954.     /**
  1955.      * @param Request $request
  1956.      * @return SimplePayHelper
  1957.      * @throws \Exception
  1958.      */
  1959.     protected function getSimplePayHelper(Request $request): SimplePayHelper
  1960.     {
  1961.         return new SimplePayHelper(
  1962.             $this->getEntityManager(),
  1963.             $this->getDatabaseTranslator($request),
  1964.             $this->getRouter(),
  1965.             $this->getEnvironment(),
  1966.             $this->getParameter('simplepay'),
  1967.         );
  1968.     }
  1969.     /**
  1970.      * @param int $domainId
  1971.      * @param int $limit
  1972.      * @return array
  1973.      */
  1974.     protected function getHeurekaSiteReviews(int $domainId, int $limit = 0)
  1975.     {
  1976.         switch ($domainId) {
  1977.             case Domain::DOMAIN_ID_RT_SK:
  1978.                 $reviewsUrl = 'https://www.heureka.sk/direct/dotaznik/export-review.php?key=5a2d564d3e7d6b24ff5c14432a3f6750';
  1979.                 break;
  1980.             case Domain::DOMAIN_ID_RT_CZ:
  1981.                 $reviewsUrl = 'https://www.heureka.cz/direct/dotaznik/export-review.php?key=0c19c896a04dcd0a071fb8ef4a1f3a48';
  1982.                 break;
  1983.         }
  1984.         $reviews = [];
  1985.         $xml = simplexml_load_string(file_get_contents($reviewsUrl));
  1986.         $reviewsCount = 0;
  1987.         foreach ($xml->children() as $child) {
  1988.             $reviewText = $child->summary->__toString();
  1989.             if ($limit > 0 && $reviewsCount >= $limit) {
  1990.                 continue;
  1991.             }
  1992.             if ($reviewText != '') {
  1993.                 $reviews[$reviewsCount]['text'] = preg_replace('/\s+/S', " ", $reviewText);
  1994.                 $reviews[$reviewsCount]['rating'] = round((float)$child->total_rating->__toString());
  1995.                 $reviews[$reviewsCount]['date'] = (new \DateTime())->setTimestamp($child->unix_timestamp->__toString())->format('d.m.Y, H:i');
  1996.                 $reviewsCount++;
  1997.             }
  1998.         }
  1999.         return $reviews;
  2000.     }
  2001.     /**
  2002.      * @param Domain $domain
  2003.      * @return array
  2004.      * @throws \Exception
  2005.      */
  2006.     protected function getHiglightedFlashSaleData(Request $request, Domain $domain)
  2007.     {
  2008.         $product = false;
  2009.         $flashSaleProduct = [];
  2010.         $entityManager = $this->getEntityManager();
  2011.         $productGroupTitle = 'flashsale';
  2012.         $productGroupProductData = $this->getProductHelper($request)->getProductGroupProducts($productGroupTitle, $domain);
  2013.         if (count($productGroupProductData['productGroupProducts']) > 0) {
  2014.             foreach ($productGroupProductData['productGroupProducts'] as $productGroupProduct) {
  2015.                 if (!$product && ProductHelper::isFlashSaleValidForProduct($productGroupProduct, $domain)) {
  2016.                     $product = $productGroupProduct;
  2017.                 }
  2018.             }
  2019.         }
  2020.         if (!$product) {
  2021.             $products = $entityManager->createQuery("SELECT p
  2022.                         FROM AtechNetCoreBundle:Product p
  2023.                         LEFT JOIN AtechNetCoreBundle:ProductMeta pm
  2024.                           WITH pm.id = (
  2025.                             SELECT pm2.id
  2026.                             FROM AtechNetCoreBundle:ProductMeta pm2
  2027.                             WHERE pm2.product = p.id AND pm2.domain = " . $domain->getId() . ")
  2028.                         WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1 AND pm.discounted = 1 AND
  2029.                             ((pm.saleStart IS NOT NULL AND pm.saleEnd IS NOT NULL AND pm.saleStart <= :now AND pm.saleEnd >= :now) OR (pm.saleStart IS NOT NULL AND pm.saleEnd IS NULL AND pm.saleStart <= :now) OR (pm.saleStart IS NULL AND pm.saleEnd IS NOT NULL AND pm.saleEnd >= :now))
  2030.                         ORDER BY pm.currentVatPrice ASC")
  2031.                 ->setParameter('now', new \DateTime())
  2032.                 ->getResult();
  2033.             if (count($products) > 0) {
  2034.                 foreach ($products as $p) {
  2035.                     if (!$product) {
  2036.                         $product = $p;
  2037.                     } else {
  2038.                         $addedProductType = $product->getType()->getId();
  2039.                         $currentProductType = $p->getType()->getId();
  2040.                         if ($addedProductType != 52 && $currentProductType == 52) {
  2041.                             $product = $p;
  2042.                         } elseif ($addedProductType != 52 && $currentProductType == 60) {
  2043.                             $product = $p;
  2044.                         }
  2045.                     }
  2046.                 }
  2047.             }
  2048.         }
  2049.         if ($product) {
  2050.             $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  2051.             $result = $this->getProductHelper($request)->getStructuredDataForProduct($product, 'list');
  2052.             $image = $placeholder;
  2053.             if (is_object($result['images'])) {
  2054.                 $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  2055.             }
  2056.             $flashSaleProduct = [
  2057.                 'id' => $result['id'],
  2058.                 'title' => $result['title'],
  2059.                 'vendor' => $result['vendor'],
  2060.                 'labels' => $result['badges'],
  2061.                 'rawPrice' => $result['rawPrice'],
  2062.                 'price' => $result['vatPrice'],
  2063.                 'rawSpecial' => ($result['isDiscounted'] ? $result['rawDiscountPrice'] : false),
  2064.                 'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  2065.                 'image' => $image,
  2066.                 'attributes' => $result['attributes'],
  2067.                 'available' => $result['availableQty'],
  2068.                 'href' => $this->url($request)->link('product', [
  2069.                     'product_id' => $result['id'], 
  2070.                     'isBazaar'   => $result['isBazaar'] ?? 0
  2071.                 ]),
  2072.                 'active' => $result['active'],
  2073.                 'timedSalesActive' => $result['timedSalesActive'],
  2074.                 'timedSalesStartDate' => $result['timedSalesStartDate'],
  2075.                 'timedSalesEndDate' => $result['timedSalesEndDate'],
  2076.                 'warrantyYear' => $this->getWarrantyForProductType($domain->getId(), $result['productTypeId'])['year'],
  2077.             ];
  2078.         }
  2079.         return $flashSaleProduct;
  2080.     }
  2081.     /**
  2082.      * @return array
  2083.      */
  2084.     public function getGuestAccountIds()
  2085.     {
  2086.         return [
  2087.             MultiStore::GUEST_CUSTOMER_ID_SK,
  2088.             MultiStore::GUEST_CUSTOMER_ID_HU,
  2089.             MultiStore::GUEST_CUSTOMER_ID_CZ,
  2090.         ];
  2091.     }
  2092.     /**
  2093.      * @return ActiveCampaignConnect
  2094.      */
  2095.     protected function getActiveCampaignConnect()
  2096.     {
  2097.         $accParameters = $this->getParameter('active_campaign');
  2098.         return new ActiveCampaignConnect(
  2099.             $this->getEntityManager(),
  2100.             $accParameters['url'],
  2101.             $accParameters['api_key']
  2102.         );
  2103.     }
  2104.     /**
  2105.      * @param string $currency
  2106.      * @return string
  2107.      */
  2108.     protected function getCurrencyISOForm($currency)
  2109.     {
  2110.         switch ($currency) {
  2111.             case '€':
  2112.                 return 'EUR';
  2113.                 break;
  2114.             case 'Ft':
  2115.             case 'FT':
  2116.                 return 'HUF';
  2117.                 break;
  2118.             case 'Kč':
  2119.             case 'KČ':
  2120.                 return 'CZK';
  2121.                 break;
  2122.         }
  2123.         return '';
  2124.     }
  2125.     /**
  2126.      * @return mixed
  2127.      */
  2128.     protected function getCentralisUser()
  2129.     {
  2130.         return $this->getEntityManager()->getRepository(User::class)->findOneById(User::CENTRALIS_USER_ID);
  2131.     }
  2132.     /**
  2133.      * @param Order $order
  2134.      * @return string
  2135.      */
  2136.     protected function getOrderPrivateKey(Order $order)
  2137.     {
  2138.         return md5($order->getCreated()->format('YmDHi'));
  2139.     }
  2140.     /**
  2141.      * @param UploadedFile $file
  2142.      * @param string $uploadDirectory
  2143.      * @param array $allowedFileTypes
  2144.      * @param bool $generateUniqueName
  2145.      * @return bool|string
  2146.      */
  2147.     protected function uploadFile(UploadedFile $file, $uploadDirectory, $allowedFileTypes = [], $generateUniqueName = true)
  2148.     {
  2149.         if (count($allowedFileTypes) > 0 && !in_array($file->getMimeType(), $allowedFileTypes)) {
  2150.             return false;
  2151.         }
  2152.         if ($generateUniqueName) {
  2153.             $response['filename'] = $this->generateUniqueFileName() . '.' . $file->guessExtension();
  2154.         } else {
  2155.             $response['filename'] = $file->getClientOriginalName();
  2156.         }
  2157.         $response['originalName'] = $file->getClientOriginalName();
  2158.         $response['mimeType'] = $file->getMimeType();
  2159.         $file->move(
  2160.             'uploads/' . $uploadDirectory,
  2161.             $response['filename']
  2162.         );
  2163.         return $response;
  2164.     }
  2165.     /**
  2166.      * @return string
  2167.      */
  2168.     public function generateUniqueFileName()
  2169.     {
  2170.         return md5(uniqid());
  2171.     }
  2172.     /**
  2173.      * @param Customer|null $customer
  2174.      * @param Request $request
  2175.      * @return bool
  2176.      */
  2177.     protected function useZeroVat(Customer $customer = null, Request $request)
  2178.     {
  2179.         $isCustomerHasVatId = !is_null($customer) && $customer->useZeroVat($customer->getVatId());
  2180.         $multiStore = $this->getMultiStoreHelper($request);
  2181.         $domain = $multiStore->getDomain();
  2182.         $checkoutData = $this->checkoutCustomerIsCompany($request)
  2183.             && !in_array($domain->getId(), [
  2184.                 Domain::DOMAIN_ID_RT_SK,
  2185.                 Domain::DOMAIN_ID_WS_SK,
  2186.             ]);
  2187.         $isDomainRTEU = $domain->getId() == Domain::DOMAIN_ID_RT_EU;
  2188.         $result = ($isCustomerHasVatId && $checkoutData) || ($isDomainRTEU && $this->checkoutCustomerIsCompany($request));
  2189.         $request->getSession()->set('useZeroVat', $result);
  2190.         return $result;
  2191.     }
  2192.     /**
  2193.      * @var Request $request
  2194.      * @return bool
  2195.      */
  2196.     protected function checkoutCustomerIsCompany(Request $request): bool
  2197.     {
  2198.         $sessionCheckout = $request->getSession()->get('checkout');
  2199.         return is_array($sessionCheckout)
  2200.             && array_key_exists('isCompany', $sessionCheckout)
  2201.             && $sessionCheckout['isCompany']
  2202.             && array_key_exists('billingVatNumber', $sessionCheckout)
  2203.             && $sessionCheckout['billingVatNumber'] != null
  2204.             && $sessionCheckout['billingVatNumber'] != ''
  2205.         ;
  2206.     }
  2207.     /**
  2208.      * @param $locale
  2209.      * @return int
  2210.      */
  2211.     protected function getServicesPageLink($locale): int
  2212.     {
  2213.         switch ($locale) {
  2214.             case 'sk':
  2215.                 return 79; // sluzby-furbify
  2216.             case 'hu':
  2217.                 return 25; // furbify-szolgaltatasok
  2218.             case 'cz':
  2219.                 return 84; // sluzby-spolecnosti-furbify
  2220.             case 'en':
  2221.                 return 117; // furbify-services
  2222.         }
  2223.         return 0;
  2224.     }
  2225.     /**
  2226.      * @param Domain $domain
  2227.      * @param string $locale
  2228.      * @return array
  2229.      * @throws \Psr\SimpleCache\InvalidArgumentException
  2230.      */
  2231.     protected function getNanobars(Domain $domain, string $locale): array
  2232.     {
  2233.         $entityManager = $this->getEntityManager();
  2234.         $nanobarCacheKey = 'nanobar.v4.' . $domain->getId() . '.' . $locale;
  2235.         $nanobarCacheItem = $this->cache->getItem($nanobarCacheKey);
  2236.         if ($nanobarCacheItem->isHit()) {
  2237.             return $nanobarCacheItem->get();
  2238.         }
  2239.         $nanobarResults = $entityManager->getRepository(Nanobar::class)->findBy([
  2240.             'domain' => $domain->getId(),
  2241.             'domainNavigation' => null,
  2242.             'enabled' => 1,
  2243.         ]);
  2244.         $nanobars = [];
  2245.         foreach ($nanobarResults as $nanobar) {
  2246.             if ($nanobar->isActive()) {
  2247.                 $nanobars[] = [
  2248.                     'color' => $nanobar->getColor(),
  2249.                     'message' => $nanobar->getMessage(),
  2250.                 ];
  2251.             }
  2252.         }
  2253.         $nanobarCacheItem->set($nanobars);
  2254.         $nanobarCacheItem->expiresAfter(self::CACHE_LIFETIME_15_MINUTES);
  2255.         $this->cache->save($nanobarCacheItem);
  2256.         return $nanobars;
  2257.     }
  2258.     /**
  2259.      * @param string $response
  2260.      */
  2261.     protected function verifyGoogleCaptcha(string $response)
  2262.     {
  2263.         $captchaCheckUrl = 'https://www.google.com/recaptcha/api/siteverify';
  2264.         $siteSecret = env('APP_ENV') == 'dev' ? '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe' : '6LcgtrsUAAAAAJApqqbEgkBpj5M5bK0iGXNd7dO_';
  2265.         $data = [
  2266.             'secret' => $siteSecret,
  2267.             'response' => $response,
  2268.         ];
  2269.         $ch = curl_init($captchaCheckUrl);
  2270.         $postString = http_build_query($data, '', '&');
  2271.         curl_setopt($ch, CURLOPT_POST, 1);
  2272.         curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
  2273.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  2274.         $response = curl_exec($ch);
  2275.         curl_close($ch);
  2276.         $captchaResponse = json_decode($response, true);
  2277.         return $captchaResponse['success'];
  2278.     }
  2279.     /**
  2280.      * @param string $textToCheck
  2281.      * @return string
  2282.      */
  2283.     protected function getTextWithoutEmoji(string $textToCheck): string
  2284.     {
  2285.         $regexForEmojiMatch = '([*#0-9](?>\\xEF\\xB8\\x8F)?\\xE2\\x83\\xA3|\\xC2[\\xA9\\xAE]|\\xE2..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?(?>\\xEF\\xB8\\x8F)?|\\xE3(?>\\x80[\\xB0\\xBD]|\\x8A[\\x97\\x99])(?>\\xEF\\xB8\\x8F)?|\\xF0\\x9F(?>[\\x80-\\x86].(?>\\xEF\\xB8\\x8F)?|\\x87.\\xF0\\x9F\\x87.|..(\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|(((?<zwj>\\xE2\\x80\\x8D)\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\k<zwj>\\xF0\\x9F..(\k<zwj>\\xF0\\x9F\\x91.)?|(\\xE2\\x80\\x8D\\xF0\\x9F\\x91.){2,3}))?))';
  2286.         $textWithoutEmoji = preg_replace($regexForEmojiMatch, '', $textToCheck);
  2287.         return trim(preg_replace('/\s+/', ' ', $textWithoutEmoji));
  2288.     }
  2289.     /**
  2290.      * @param int $domainId
  2291.      * @param string $locale
  2292.      * @return array
  2293.      *
  2294.      * To generate source CSV file see:
  2295.      * https://docs.google.com/spreadsheets/d/1vMrITAY-4e_dGD9N5DblgjERE4h_G6IGPgdEsHzup_Y/edit?usp=sharing
  2296.      */
  2297.     protected function getPostalCodeAndCityDatabaseByDomain(int $domainId, string $locale): array
  2298.     {
  2299.         // Data
  2300.         $data = [];
  2301.         // Cache Key
  2302.         $cacheKey = 'postal-code.city.v1.' . $domainId;
  2303.         $cacheItem = $this->cache->getItem($cacheKey);
  2304.         // Postal Code & City Database from Cache
  2305.         if ($cacheItem->isHit()) {
  2306.             $data = $cacheItem->get();
  2307.         } // Build Postal Code & City Database
  2308.         else {
  2309.             $databaseFile = dirname(__FILE__, 2) . '/Resources/storage/private/postalCodeCity/postal-codes-' . $locale . '.csv';
  2310.             if (file_exists($databaseFile)) {
  2311.                 if (($handle = @fopen($databaseFile, 'r')) !== false) {
  2312.                     while (($row = fgetcsv($handle, 255, ',')) !== false) {
  2313.                         // Postal Code
  2314.                         $postalCode = str_replace(' ', '', trim($row[0]));
  2315.                         // City
  2316.                         $city = trim($row[1]);
  2317.                         // Data
  2318.                         $data[] = [
  2319.                             'postalCode' => $postalCode,
  2320.                             'city' => $city,
  2321.                         ];
  2322.                     }
  2323.                     fclose($handle);
  2324.                 }
  2325.                 $cacheItem->set($data);
  2326.                 $cacheItem->expiresAfter(self::CACHE_LIFETIME_1_YEAR);
  2327.                 $this->cache->save($cacheItem);
  2328.             }
  2329.         }
  2330.         return $data;
  2331.     }
  2332.     /**
  2333.      * @return SocialShareImageHelper
  2334.      */
  2335.     protected function getSocialShareImageHelper(): SocialShareImageHelper
  2336.     {
  2337.         return new SocialShareImageHelper($this->getParameter('cloudflare_image'));
  2338.     }
  2339.     /**
  2340.      * @param object|string $photo
  2341.      * @param string $directory
  2342.      * @param bool|null $overwrite
  2343.      * @return Image
  2344.      */
  2345.     protected function getImage($photo, string $directory = 'product', ?bool $overwrite = null): Image
  2346.     {
  2347.         return new Image($this->getParameter('cloudflare_image'), $photo, $directory, $overwrite);
  2348.     }
  2349.     /**
  2350.      * @param int $currentStep
  2351.      * @return array
  2352.      */
  2353.     protected function checkoutSteps(int $currentStep): array
  2354.     {
  2355.         return [
  2356.             "currentStep" => $currentStep,
  2357.             "count" => 5,
  2358.             'withTitle' => true,
  2359.             'steps' => [
  2360.                 1 => [
  2361.                     'title' => 'Cart',
  2362.                     'link' => $this->generateUrl("cart_show"),
  2363.                 ],
  2364.                 2 => [
  2365.                     'title' => 'Customer',
  2366.                     'link' => $this->generateUrl('checkout_customer'),
  2367.                 ],
  2368.                 3 => [
  2369.                     'title' => 'Address',
  2370.                     'link' => $this->generateUrl('checkout_customer'),
  2371.                 ],
  2372.                 4 => [
  2373.                     'title' => 'Shipping & pay',
  2374.                     'link' => $this->generateUrl('checkout_customer'),
  2375.                 ],
  2376.                 5 => [
  2377.                     'title' => 'Review',
  2378.                     'link' => $this->generateUrl('checkout_customer'),
  2379.                 ],
  2380.             ],
  2381.         ];
  2382.     }
  2383.     /**
  2384.      * @return SquarePay
  2385.      */
  2386.     protected function getSquarePay(): SquarePay
  2387.     {
  2388.         $config = $this->getParameter('square_pay');
  2389.         return new SquarePay($this->kernel, $config['username'], $config['password']);
  2390.     }
  2391.     /**
  2392.      * @return Packeta
  2393.      */
  2394.     protected function getPacketa(): Packeta
  2395.     {
  2396.         $config = $this->getParameter('packeta');
  2397.         return new Packeta($config['api_key'], $config['api_password'], $this->getEntityManager());
  2398.     }
  2399.     /**
  2400.      * @return array
  2401.      */
  2402.     protected function getCheckoutFooterMenuPagesList(): array
  2403.     {
  2404.         return [
  2405.             Language::LANGUAGE_ID_HU => [
  2406.                 28 => 'ÁSZF',
  2407.                 29 => 'Adatkezelési tájékoztató',
  2408.             ],
  2409.             Language::LANGUAGE_ID_SK => [
  2410.                 12 => 'Obchodné podmienky',
  2411.                 13 => 'Ochrana osobných údajov',
  2412.             ],
  2413.             Language::LANGUAGE_ID_CZ => [
  2414.                 61 => 'Obchodní podmínky',
  2415.                 62 => 'Ochrana osobních údajů',
  2416.             ],
  2417.             Language::LANGUAGE_ID_EN => [
  2418.                 100 => 'Product grades',
  2419.                 128 => 'Terms and conditions',
  2420.             ],
  2421.         ];
  2422.     }
  2423.     /**
  2424.      * @return string
  2425.      */
  2426.     protected function getFromMail()
  2427.     {
  2428.         return $this->getKernel()->getEnvironment() == 'prod' ? $this->getParameter('mailer_user') : 'furbifytest@atechnet.sk';
  2429.     }
  2430.     /**
  2431.      * for emails
  2432.      * @return string
  2433.      */
  2434.     protected function getFromName()
  2435.     {
  2436.         return 'furbify webshop';
  2437.     }
  2438.     /**
  2439.      * @return array
  2440.      */
  2441.     protected function getFooterMenuPagesList(): array
  2442.     {
  2443.         $translator = $this->getTranslator();
  2444.         return [
  2445.             Language::LANGUAGE_ID_HU => [
  2446.                 [
  2447.                     'title' => $translator->trans('Laptops'),
  2448.                     'module' => 'category',
  2449.                     'items' => [
  2450.                         [
  2451.                             '56' => [
  2452.                                 'title' => $translator->trans('Refurbished notebook with warranty'),
  2453.                             ],
  2454.                         ],
  2455.                         [
  2456.                             '583' => [
  2457.                                 'title' => $translator->trans('Refurbished Apple notebook'),
  2458.                             ],
  2459.                         ],
  2460.                         [
  2461.                             '56_57' => [
  2462.                                 'title' => $translator->trans('Refurbished Dell notebook'),
  2463.                             ],
  2464.                         ],
  2465.                         [
  2466.                             '56_58' => [
  2467.                                 'title' => $translator->trans('Refurbished HP notebook'),
  2468.                             ],
  2469.                         ],
  2470.                         [
  2471.                             '56_59' => [
  2472.                                 'title' => $translator->trans('Refurbished Lenovo notebook'),
  2473.                             ],
  2474.                         ],
  2475.                         [
  2476.                             '56_62' => [
  2477.                                 'title' => $translator->trans('Refurbished gamer notebook'),
  2478.                             ],
  2479.                         ],
  2480.                         [
  2481.                             '56_112' => [
  2482.                                 'title' => $translator->trans('Refurbished workstation notebook'),
  2483.                             ],
  2484.                         ],
  2485.                         [
  2486.                             '56' => [
  2487.                                 'filter' => '?sort=price&order=asc&limit=24&fa[63]=632',
  2488.                                 'title' => $translator->trans('Notebook with full HD display'),
  2489.                             ],
  2490.                         ],
  2491.                         [
  2492.                             '56_240' => [
  2493.                                 'title' => $translator->trans('2in1 notebooks'),
  2494.                             ],
  2495.                         ],
  2496.                         [
  2497.                             '56_456' => [
  2498.                                 'title' => $translator->trans('Notebook bundle'),
  2499.                             ],
  2500.                         ],
  2501.                         [
  2502.                             '56_249' => [
  2503.                                 'title' => $translator->trans('Notebook bazaar'),
  2504.                             ],
  2505.                         ],
  2506.                         [
  2507.                             '569' => [
  2508.                                 'title' => $translator->trans('Colorful laptops'),
  2509.                             ],
  2510.                         ],
  2511.                         [
  2512.                             '574' => [
  2513.                                 'title' => $translator->trans('Windows 11 notebook'),
  2514.                             ],
  2515.                         ],
  2516.                     ],
  2517.                 ],
  2518.                 [
  2519.                     'title' => $translator->trans('Computers'),
  2520.                     'module' => 'category',
  2521.                     'items' => [
  2522.                         [
  2523.                             '48' => [
  2524.                                 'title' => $translator->trans('Refurbished computer with warranty'),
  2525.                             ],
  2526.                         ],
  2527.                         [
  2528.                             '48_49' => [
  2529.                                 'title' => $translator->trans('Refurbished Dell computer'),
  2530.                             ],
  2531.                         ],
  2532.                         [
  2533.                             '48_50' => [
  2534.                                 'title' => $translator->trans('Refurbished HP computer'),
  2535.                             ],
  2536.                         ],
  2537.                         [
  2538.                             '48_51' => [
  2539.                                 'title' => $translator->trans('Refurbished Lenovo computer'),
  2540.                             ],
  2541.                         ],
  2542.                         [
  2543.                             '48_85' => [
  2544.                                 'title' => $translator->trans('Refurbished All In One computer'),
  2545.                             ],
  2546.                         ],
  2547.                         [
  2548.                             '48_52' => [
  2549.                                 'title' => $translator->trans('Refurbished workstation computer'),
  2550.                             ],
  2551.                         ],
  2552.                         [
  2553.                             '48_54' => [
  2554.                                 'title' => $translator->trans('Computer with monitor'),
  2555.                             ],
  2556.                         ],
  2557.                         [
  2558.                             '48_178' => [
  2559.                                 'title' => $translator->trans('Refurbished mini PC'),
  2560.                             ],
  2561.                         ],
  2562.                         [
  2563.                             '48_55' => [
  2564.                                 'title' => $translator->trans('Gamer PC'),
  2565.                             ],
  2566.                         ],
  2567.                         [
  2568.                             '48_444' => [
  2569.                                 'title' => $translator->trans('Computer bazaar'),
  2570.                             ],
  2571.                         ],
  2572.                         [
  2573.                             '577' => [
  2574.                                 'title' => $translator->trans('Windows 11 PC'),
  2575.                             ],
  2576.                         ],
  2577.                     ],
  2578.                 ],
  2579.                 [
  2580.                     'title' => $translator->trans('Monitors'),
  2581.                     'module' => 'category',
  2582.                     'items' => [
  2583.                         [
  2584.                             '78' => [
  2585.                                 'title' => $translator->trans('Refurbished monitor'),
  2586.                             ],
  2587.                         ],
  2588.                         [
  2589.                             '78_80' => [
  2590.                                 'title' => $translator->trans('Refurbished Samsung monitor'),
  2591.                             ],
  2592.                         ],
  2593.                         [
  2594.                             '78_79' => [
  2595.                                 'title' => $translator->trans('Refurbished HP monitor'),
  2596.                             ],
  2597.                         ],
  2598.                         [
  2599.                             '78' => [
  2600.                                 'title' => $translator->trans('HDMI monitor'),
  2601.                                 'filter' => '?sort=price&order=asc&limit=24&fa[68]=733',
  2602.                             ],
  2603.                         ],
  2604.                         [
  2605.                             '78' => [
  2606.                                 'title' => $translator->trans('IPS monitor'),
  2607.                                 'filter' => '?fa[118]=926',
  2608.                             ],
  2609.                         ],
  2610.                         [
  2611.                             '78' => [
  2612.                                 'title' => $translator->trans('Full HD monitor'),
  2613.                                 'filter' => '?fa[63]=632',
  2614.                             ],
  2615.                         ],
  2616.                         [
  2617.                             '78_377' => [
  2618.                                 'title' => $translator->trans('Monitor bazaar'),
  2619.                             ],
  2620.                         ],
  2621.                         [
  2622.                             '78' => [
  2623.                                 'title' => $translator->trans('24“ monitor'),
  2624.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=204',
  2625.                             ],
  2626.                         ],
  2627.                         [
  2628.                             '78' => [
  2629.                                 'title' => $translator->trans('27“ monitor'),
  2630.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=205',
  2631.                             ],
  2632.                         ],
  2633.                         [
  2634.                             '78_192' => [
  2635.                                 'title' => $translator->trans('Refurbished projector'),
  2636.                             ],
  2637.                         ],
  2638.                     ],
  2639.                 ],
  2640.                 [
  2641.                     'title' => $translator->trans('Other products'),
  2642.                     'module' => 'category',
  2643.                     'items' => [
  2644.                         [
  2645.                             '44' => [
  2646.                                 'title' => $translator->trans('Notebook parts'),
  2647.                             ],
  2648.                         ],
  2649.                         [
  2650.                             '44' => [
  2651.                                 'title' => $translator->trans('Computer parts'),
  2652.                             ],
  2653.                         ],
  2654.                         [
  2655.                             '44_66' => [
  2656.                                 'title' => $translator->trans('Docking station for notebook'),
  2657.                             ],
  2658.                         ],
  2659.                         [
  2660.                             '44_45' => [
  2661.                                 'title' => $translator->trans('Notebook battery'),
  2662.                             ],
  2663.                         ],
  2664.                         [
  2665.                             '235' => [
  2666.                                 'title' => $translator->trans('Refurbished mobile phones'),
  2667.                             ],
  2668.                         ],
  2669.                         [
  2670.                             '268' => [
  2671.                                 'title' => $translator->trans('Tablet'),
  2672.                             ],
  2673.                         ],
  2674.                         [
  2675.                             '44_115' => [
  2676.                                 'title' => $translator->trans('Printer'),
  2677.                             ],
  2678.                         ],
  2679.                         [
  2680.                             '115_181' => [
  2681.                                 'title' => $translator->trans('Toner'),
  2682.                             ],
  2683.                         ],
  2684.                         [
  2685.                             '271' => [
  2686.                                 'title' => $translator->trans('Smartwatch'),
  2687.                             ],
  2688.                         ],
  2689.                     ],
  2690.                 ],
  2691.                 [
  2692.                     'title' => $translator->trans('Useful pages'),
  2693.                     'module' => 'page',
  2694.                     'items' => [
  2695.                         [
  2696.                             172 => [
  2697.                                 'title' => $translator->trans('Free Norton subscription'),
  2698.                             ],
  2699.                         ],
  2700.                         [
  2701.                             'blog_main' => [
  2702.                                 'title' => 'Furbify BLOG',
  2703.                             ],
  2704.                         ],
  2705.                         [
  2706.                             26 => [
  2707.                                 'title' => $translator->trans('Frequently asked questions'),
  2708.                             ],
  2709.                         ],
  2710.                         [
  2711.                             27 => [
  2712.                                 'title' => $translator->trans('Quality grading of product'),
  2713.                             ],
  2714.                         ],
  2715.                         [
  2716.                             'wizard_home' => [
  2717.                                 'title' => $translator->trans('wizard_home'),
  2718.                             ],
  2719.                         ],
  2720.                         [
  2721.                             'review_list_hu' => [
  2722.                                 'title' => $translator->trans('Reviews'),
  2723.                             ],
  2724.                         ],
  2725.                         [
  2726.                             143 => [
  2727.                                 'title' => $translator->trans('Laptop repurchase'),
  2728.                             ],
  2729.                         ],
  2730.                         [
  2731.                             150 => [
  2732.                                 'title' => $translator->trans('Furbify installment'),
  2733.                             ],
  2734.                         ],
  2735.                         [
  2736.                             152 => [
  2737.                                 'title' => $translator->trans('PastPay deferred payment'),
  2738.                             ],
  2739.                         ],
  2740.                         [
  2741.                             164 => [
  2742.                                 'title' => $translator->trans('Product renting'),
  2743.                             ],
  2744.                         ],
  2745.                     ],
  2746.                 ],
  2747.                 [
  2748.                     'title' => 'Furbify things',
  2749.                     'module' => 'page',
  2750.                     'items' => [
  2751.                         [
  2752.                             21 => [
  2753.                                 'title' => $translator->trans('What is a refurbished PC'),
  2754.                             ],
  2755.                         ],
  2756.                         [
  2757.                             20 => [
  2758.                                 'title' => $translator->trans('We are furbify'),
  2759.                             ],
  2760.                         ],
  2761.                         [
  2762.                             40 => [
  2763.                                 'title' => $translator->trans('Price guarantee'),
  2764.                             ],
  2765.                         ],
  2766.                         [
  2767.                             25 => [
  2768.                                 'title' => $translator->trans('Furbify services'),
  2769.                             ],
  2770.                         ],
  2771.                         [
  2772.                             95 => [
  2773.                                 'title' => $translator->trans('We are Green'),
  2774.                             ],
  2775.                         ],
  2776.                         [
  2777.                             'product_zsakbamacska_hu' => [
  2778.                                 'title' => $translator->trans('Furbify lucky bag'),
  2779.                             ],
  2780.                         ],
  2781.                         [
  2782.                             140 => [
  2783.                                 'title' => $translator->trans('Furbify media'),
  2784.                             ],
  2785.                         ],
  2786.                         /*[
  2787.                             42 => [
  2788.                                 'title' => $translator->trans('Newsletter'),
  2789.                             ],
  2790.                         ],*/
  2791.                         [
  2792.                             'jobs_hu' => [
  2793.                                 'title' => $translator->trans('Job offers'),
  2794.                             ],
  2795.                         ],
  2796.                     ],
  2797.                 ],
  2798.                 [
  2799.                     'title' => $translator->trans('Terms and conditions'),
  2800.                     'module' => 'page',
  2801.                     'items' => [
  2802.                         [
  2803.                             '28' => [
  2804.                                 'title' => $translator->trans('General terms and conditions'),
  2805.                             ],
  2806.                         ],
  2807.                         [
  2808.                             '29' => [
  2809.                                 'title' => $translator->trans('Privacy policy'),
  2810.                             ],
  2811.                         ],
  2812.                         [
  2813.                             '202' => [
  2814.                                 'title' => $translator->trans('Shipping, Returns & Claims'),
  2815.                             ],
  2816.                         ],
  2817.                         [
  2818.                             '30' => [
  2819.                                 'title' => $translator->trans('Shipping'),
  2820.                             ],
  2821.                         ],
  2822.                         [
  2823.                             '34' => [
  2824.                                 'title' => $translator->trans('Company details'),
  2825.                             ],
  2826.                         ],
  2827.                         [
  2828.                             'warranty_chech_page_hu' => [
  2829.                                 'title' => $translator->trans('Warranty check'),
  2830.                             ],
  2831.                         ],
  2832.                     ],
  2833.                 ],
  2834.             ],
  2835.             Language::LANGUAGE_ID_SK => [
  2836.                 [
  2837.                     'title' => $translator->trans('Laptops'),
  2838.                     'module' => 'category',
  2839.                     'items' => [
  2840.                         [
  2841.                             '5' => [
  2842.                                 'title' => $translator->trans('Refurbished notebook with warranty'),
  2843.                             ],
  2844.                         ],
  2845.                         [
  2846.                             '584' => [
  2847.                                 'title' => $translator->trans('Refurbished Apple notebook'),
  2848.                             ],
  2849.                         ],
  2850.                         [
  2851.                             '5_18' => [
  2852.                                 'title' => $translator->trans('Refurbished Dell notebook'),
  2853.                             ],
  2854.                         ],
  2855.                         [
  2856.                             '5_19' => [
  2857.                                 'title' => $translator->trans('Refurbished HP notebook'),
  2858.                             ],
  2859.                         ],
  2860.                         [
  2861.                             '5_20' => [
  2862.                                 'title' => $translator->trans('Refurbished Lenovo notebook'),
  2863.                             ],
  2864.                         ],
  2865.                         [
  2866.                             '5_24' => [
  2867.                                 'title' => $translator->trans('Refurbished gamer notebook'),
  2868.                             ],
  2869.                         ],
  2870.                         [
  2871.                             '5_113' => [
  2872.                                 'title' => $translator->trans('Refurbished workstation notebook'),
  2873.                             ],
  2874.                         ],
  2875.                         [
  2876.                             '5' => [
  2877.                                 'filter' => '?sort=price&order=asc&limit=24&fa[63]=632',
  2878.                                 'title' => $translator->trans('Notebook with full HD display'),
  2879.                             ],
  2880.                         ],
  2881.                         [
  2882.                             '5_241' => [
  2883.                                 'title' => $translator->trans('2in1 notebooks'),
  2884.                             ],
  2885.                         ],
  2886.                         [
  2887.                             '5_455' => [
  2888.                                 'title' => $translator->trans('Notebook bundle'),
  2889.                             ],
  2890.                         ],
  2891.                         [
  2892.                             '250' => [
  2893.                                 'title' => $translator->trans('Notebook bazaar'),
  2894.                             ],
  2895.                         ],
  2896.                         [
  2897.                             '570' => [
  2898.                                 'title' => $translator->trans('Colorful laptops'),
  2899.                             ],
  2900.                         ],
  2901.                         [
  2902.                             '573' => [
  2903.                                 'title' => $translator->trans('Windows 11 notebook'),
  2904.                             ],
  2905.                         ],
  2906.                     ],
  2907.                 ],
  2908.                 [
  2909.                     'title' => $translator->trans('Computers'),
  2910.                     'module' => 'category',
  2911.                     'items' => [
  2912.                         [
  2913.                             '4' => [
  2914.                                 'title' => $translator->trans('Refurbished computer with warranty'),
  2915.                             ],
  2916.                         ],
  2917.                         [
  2918.                             '4_11' => [
  2919.                                 'title' => $translator->trans('Refurbished Dell computer'),
  2920.                             ],
  2921.                         ],
  2922.                         [
  2923.                             '4_12' => [
  2924.                                 'title' => $translator->trans('Refurbished HP computer'),
  2925.                             ],
  2926.                         ],
  2927.                         [
  2928.                             '4_13' => [
  2929.                                 'title' => $translator->trans('Refurbished Lenovo computer'),
  2930.                             ],
  2931.                         ],
  2932.                         [
  2933.                             '4_84' => [
  2934.                                 'title' => $translator->trans('Refurbished All In One computer'),
  2935.                             ],
  2936.                         ],
  2937.                         [
  2938.                             '4_14' => [
  2939.                                 'title' => $translator->trans('Refurbished workstation computer'),
  2940.                             ],
  2941.                         ],
  2942.                         [
  2943.                             '4_16' => [
  2944.                                 'title' => $translator->trans('Computer with monitor'),
  2945.                             ],
  2946.                         ],
  2947.                         [
  2948.                             '4_177' => [
  2949.                                 'title' => $translator->trans('Refurbished mini PC'),
  2950.                             ],
  2951.                         ],
  2952.                         [
  2953.                             '4_17' => [
  2954.                                 'title' => $translator->trans('Gamer PCs'),
  2955.                             ],
  2956.                         ],
  2957.                         [
  2958.                             '4_443' => [
  2959.                                 'title' => $translator->trans('Computer bazaar'),
  2960.                             ],
  2961.                         ],
  2962.                         [
  2963.                             '578' => [
  2964.                                 'title' => $translator->trans('Windows 11 PC'),
  2965.                             ],
  2966.                         ],
  2967.                     ],
  2968.                 ],
  2969.                 [
  2970.                     'title' => $translator->trans('Monitors'),
  2971.                     'module' => 'category',
  2972.                     'items' => [
  2973.                         [
  2974.                             '6' => [
  2975.                                 'title' => $translator->trans('Refurbished monitor'),
  2976.                             ],
  2977.                         ],
  2978.                         [
  2979.                             '6_39' => [
  2980.                                 'title' => $translator->trans('Refurbished Samsung monitor'),
  2981.                             ],
  2982.                         ],
  2983.                         [
  2984.                             '6_38' => [
  2985.                                 'title' => $translator->trans('Refurbished HP monitor'),
  2986.                             ],
  2987.                         ],
  2988.                         [
  2989.                             '6' => [
  2990.                                 'title' => $translator->trans('HDMI monitor'),
  2991.                                 'filter' => '?sort=price&order=asc&limit=24&fa[68]=733',
  2992.                             ],
  2993.                         ],
  2994.                         [
  2995.                             '6' => [
  2996.                                 'title' => $translator->trans('IPS monitor'),
  2997.                                 'filter' => '?fa[118]=926',
  2998.                             ],
  2999.                         ],
  3000.                         [
  3001.                             '6' => [
  3002.                                 'title' => $translator->trans('Full HD monitor'),
  3003.                                 'filter' => '?fa[63]=632',
  3004.                             ],
  3005.                         ],
  3006.                         [
  3007.                             '6_378' => [
  3008.                                 'title' => $translator->trans('Monitor bazaar'),
  3009.                             ],
  3010.                         ],
  3011.                         [
  3012.                             '6' => [
  3013.                                 'title' => $translator->trans('24“ monitor'),
  3014.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=204',
  3015.                             ],
  3016.                         ],
  3017.                         [
  3018.                             '6' => [
  3019.                                 'title' => $translator->trans('27“ monitor'),
  3020.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=205',
  3021.                             ],
  3022.                         ],
  3023.                         [
  3024.                             '6_191' => [
  3025.                                 'title' => $translator->trans('Refurbished projector'),
  3026.                             ],
  3027.                         ],
  3028.                     ],
  3029.                 ],
  3030.                 [
  3031.                     'title' => $translator->trans('Other products'),
  3032.                     'module' => 'category',
  3033.                     'items' => [
  3034.                         [
  3035.                             '447' => [
  3036.                                 'title' => $translator->trans('Notebook parts'),
  3037.                             ],
  3038.                         ],
  3039.                         [
  3040.                             '447' => [
  3041.                                 'title' => $translator->trans('Computer parts'),
  3042.                             ],
  3043.                         ],
  3044.                         [
  3045.                             '447_9' => [
  3046.                                 'title' => $translator->trans('Docking station for notebook'),
  3047.                             ],
  3048.                         ],
  3049.                         [
  3050.                             '447_234' => [
  3051.                                 'title' => $translator->trans('Notebook battery'),
  3052.                             ],
  3053.                         ],
  3054.                         [
  3055.                             '236' => [
  3056.                                 'title' => $translator->trans('Refurbished mobile phones'),
  3057.                             ],
  3058.                         ],
  3059.                         [
  3060.                             '269' => [
  3061.                                 'title' => $translator->trans('Tablets'),
  3062.                             ],
  3063.                         ],
  3064.                         [
  3065.                             '114' => [
  3066.                                 'title' => $translator->trans('Printers'),
  3067.                             ],
  3068.                         ],
  3069.                         [
  3070.                             '114_180' => [
  3071.                                 'title' => $translator->trans('Toners'),
  3072.                             ],
  3073.                         ],
  3074.                         [
  3075.                             '272' => [
  3076.                                 'title' => $translator->trans('Smart watch'),
  3077.                             ],
  3078.                         ],
  3079.                     ],
  3080.                 ],
  3081.                 [
  3082.                     'title' => $translator->trans('Useful pages'),
  3083.                     'module' => 'page',
  3084.                     'items' => [
  3085.                         [
  3086.                             173 => [
  3087.                                 'title' => $translator->trans('Free Norton subscription'),
  3088.                             ],
  3089.                         ],
  3090.                         [
  3091.                             'blog_main' => [
  3092.                                 'title' => $translator->trans('Furbify BLOG'),
  3093.                             ],
  3094.                         ],
  3095.                         [
  3096.                             10 => [
  3097.                                 'title' => $translator->trans('Frequently asked questions'),
  3098.                             ],
  3099.                         ],
  3100.                         [
  3101.                             11 => [
  3102.                                 'title' => $translator->trans('Quality grading of product'),
  3103.                             ],
  3104.                         ],
  3105.                         [
  3106.                             'wizard_home' => [
  3107.                                 'title' => $translator->trans('wizard_home'),
  3108.                             ],
  3109.                         ],
  3110.                         [
  3111.                             'review_list_sk' => [
  3112.                                 'title' => $translator->trans('review_list'),
  3113.                             ],
  3114.                         ],
  3115.                         [
  3116.                             144 => [
  3117.                                 'title' => $translator->trans('Laptop repurchase'),
  3118.                             ],
  3119.                         ],
  3120.                         [
  3121.                             153 => [
  3122.                                 'title' => $translator->trans('PastPay deferred payment'),
  3123.                             ],
  3124.                         ],
  3125.                         [
  3126.                             157 => [
  3127.                                 'title' => $translator->trans('Payment in installments'),
  3128.                             ],
  3129.                         ],
  3130.                         [
  3131.                             165 => [
  3132.                                 'title' => $translator->trans('Product renting'),
  3133.                             ],
  3134.                         ],
  3135.                     ],
  3136.                 ],
  3137.                 [
  3138.                     'title' => 'Furbify things',
  3139.                     'module' => 'page',
  3140.                     'items' => [
  3141.                         [
  3142.                             4 => [
  3143.                                 'title' => $translator->trans('What is a refurbished PC'),
  3144.                             ],
  3145.                         ],
  3146.                         [
  3147.                             50 => [
  3148.                                 'title' => $translator->trans('We are furbify'),
  3149.                             ],
  3150.                         ],
  3151.                         [
  3152.                             41 => [
  3153.                                 'title' => $translator->trans('Price guarantee'),
  3154.                             ],
  3155.                         ],
  3156.                         [
  3157.                             79 => [
  3158.                                 'title' => $translator->trans('Furbify services'),
  3159.                             ],
  3160.                         ],
  3161.                         [
  3162.                             49 => [
  3163.                                 'title' => $translator->trans('Furbify PC shop'),
  3164.                             ],
  3165.                         ],
  3166.                         /*[
  3167.                             43 => [
  3168.                                 'title' => $translator->trans('Newsletter'),
  3169.                             ],
  3170.                         ],*/
  3171.                         [
  3172.                             'jobs_sk' => [
  3173.                                 'title' => $translator->trans('Job offers'),
  3174.                             ],
  3175.                         ],
  3176.                     ],
  3177.                 ],
  3178.                 [
  3179.                     'title' => $translator->trans('Terms and conditions'),
  3180.                     'module' => 'page',
  3181.                     'items' => [
  3182.                         [
  3183.                             12 => [
  3184.                                 'title' => $translator->trans('General terms and conditions'),
  3185.                             ],
  3186.                         ],
  3187.                         [
  3188.                             13 => [
  3189.                                 'title' => $translator->trans('Privacy policy'),
  3190.                             ],
  3191.                         ],
  3192.                         [
  3193.                             203 => [
  3194.                                 'title' => $translator->trans('Shipping, Returns & Claims'),
  3195.                             ],
  3196.                         ],
  3197.                         [
  3198.                             14 => [
  3199.                                 'title' => $translator->trans('Shipping'),
  3200.                             ],
  3201.                         ],
  3202.                         [
  3203.                             18 => [
  3204.                                 'title' => $translator->trans('Company details'),
  3205.                             ],
  3206.                         ],
  3207.                         [
  3208.                             'warranty_chech_page_sk' => [
  3209.                                 'title' => $translator->trans('Warranty check'),
  3210.                             ],
  3211.                         ],
  3212.                     ],
  3213.                 ],
  3214.             ],
  3215.             Language::LANGUAGE_ID_CZ => [
  3216.                 [
  3217.                     'title' => $translator->trans('Laptops'),
  3218.                     'module' => 'category',
  3219.                     'items' => [
  3220.                         [
  3221.                             '130' => [
  3222.                                 'title' => $translator->trans('Refurbished notebook with warranty'),
  3223.                             ],
  3224.                         ],
  3225.                         [
  3226.                             '585' => [
  3227.                                 'title' => $translator->trans('Refurbished Apple notebook'),
  3228.                             ],
  3229.                         ],
  3230.                         [
  3231.                             '131' => [
  3232.                                 'title' => $translator->trans('Refurbished Dell notebook'),
  3233.                             ],
  3234.                         ],
  3235.                         [
  3236.                             '130_132' => [
  3237.                                 'title' => $translator->trans('Refurbished HP notebook'),
  3238.                             ],
  3239.                         ],
  3240.                         [
  3241.                             '130_133' => [
  3242.                                 'title' => $translator->trans('Refurbished Lenovo notebook'),
  3243.                             ],
  3244.                         ],
  3245.                         [
  3246.                             '130_175' => [
  3247.                                 'title' => $translator->trans('Refurbished workstation notebook'),
  3248.                             ],
  3249.                         ],
  3250.                         [
  3251.                             '130' => [
  3252.                                 'filter' => '?sort=price&order=asc&limit=24&fa[63]=632',
  3253.                                 'title' => $translator->trans('Notebook with full HD display'),
  3254.                             ],
  3255.                         ],
  3256.                         [
  3257.                             '130_242' => [
  3258.                                 'title' => $translator->trans('2in1 notebooks'),
  3259.                             ],
  3260.                         ],
  3261.                         [
  3262.                             '130_457' => [
  3263.                                 'title' => $translator->trans('Notebook bundle'),
  3264.                             ],
  3265.                         ],
  3266.                         [
  3267.                             '130_251' => [
  3268.                                 'title' => $translator->trans('Notebook bazaar'),
  3269.                             ],
  3270.                         ],
  3271.                         [
  3272.                             '571' => [
  3273.                                 'title' => $translator->trans('Colorful laptops'),
  3274.                             ],
  3275.                         ],
  3276.                         [
  3277.                             '575' => [
  3278.                                 'title' => $translator->trans('Windows 11 notebook'),
  3279.                             ],
  3280.                         ],
  3281.                     ],
  3282.                 ],
  3283.                 [
  3284.                     'title' => $translator->trans('Computers'),
  3285.                     'module' => 'category',
  3286.                     'items' => [
  3287.                         [
  3288.                             '122' => [
  3289.                                 'title' => $translator->trans('Refurbished computer with warranty'),
  3290.                             ],
  3291.                         ],
  3292.                         [
  3293.                             '122_155' => [
  3294.                                 'title' => $translator->trans('Refurbished All In One computer'),
  3295.                             ],
  3296.                         ],
  3297.                         [
  3298.                             '122_126' => [
  3299.                                 'title' => $translator->trans('Refurbished workstation computer'),
  3300.                             ],
  3301.                         ],
  3302.                         [
  3303.                             '122_128' => [
  3304.                                 'title' => $translator->trans('Computer with monitor'),
  3305.                             ],
  3306.                         ],
  3307.                         [
  3308.                             '122_179' => [
  3309.                                 'title' => $translator->trans('Refurbished mini PC'),
  3310.                             ],
  3311.                         ],
  3312.                         [
  3313.                             '122_129' => [
  3314.                                 'title' => $translator->trans('Gamer PCs'),
  3315.                             ],
  3316.                         ],
  3317.                         [
  3318.                             '122_445' => [
  3319.                                 'title' => $translator->trans('Computer bazaar'),
  3320.                             ],
  3321.                         ],
  3322.                         [
  3323.                             '579' => [
  3324.                                 'title' => $translator->trans('Windows 11 PC'),
  3325.                             ],
  3326.                         ],
  3327.                     ],
  3328.                 ],
  3329.                 [
  3330.                     'title' => $translator->trans('Monitors'),
  3331.                     'module' => 'category',
  3332.                     'items' => [
  3333.                         [
  3334.                             '149' => [
  3335.                                 'title' => $translator->trans('Refurbished monitor'),
  3336.                             ],
  3337.                         ],
  3338.                         [
  3339.                             '149_151' => [
  3340.                                 'title' => $translator->trans('Refurbished Samsung monitor'),
  3341.                             ],
  3342.                         ],
  3343.                         [
  3344.                             '149_150' => [
  3345.                                 'title' => $translator->trans('Refurbished HP monitor'),
  3346.                             ],
  3347.                         ],
  3348.                         [
  3349.                             '149' => [
  3350.                                 'title' => $translator->trans('HDMI monitor'),
  3351.                                 'filter' => '?sort=price&order=asc&limit=24&fa[68]=733',
  3352.                             ],
  3353.                         ],
  3354.                         [
  3355.                             '149' => [
  3356.                                 'title' => $translator->trans('IPS monitor'),
  3357.                                 'filter' => '?fa[118]=926',
  3358.                             ],
  3359.                         ],
  3360.                         [
  3361.                             '149' => [
  3362.                                 'title' => $translator->trans('Full HD monitor'),
  3363.                                 'filter' => '?fa[63]=632',
  3364.                             ],
  3365.                         ],
  3366.                         [
  3367.                             '149_379' => [
  3368.                                 'title' => $translator->trans('Monitor bazaar'),
  3369.                             ],
  3370.                         ],
  3371.                         [
  3372.                             '149' => [
  3373.                                 'title' => $translator->trans('24“ monitor'),
  3374.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=204',
  3375.                             ],
  3376.                         ],
  3377.                         [
  3378.                             '149' => [
  3379.                                 'title' => $translator->trans('27“ monitor'),
  3380.                                 'filter' => '?sort=price&order=asc&limit=24&fa[12]=205',
  3381.                             ],
  3382.                         ],
  3383.                         [
  3384.                             '149_193' => [
  3385.                                 'title' => $translator->trans('Refurbished projector'),
  3386.                             ],
  3387.                         ],
  3388.                     ],
  3389.                 ],
  3390.                 [
  3391.                     'title' => $translator->trans('Other products'),
  3392.                     'module' => 'category',
  3393.                     'items' => [
  3394.                         [
  3395.                             '446' => [
  3396.                                 'title' => $translator->trans('Notebook parts'),
  3397.                             ],
  3398.                         ],
  3399.                         [
  3400.                             '446' => [
  3401.                                 'title' => $translator->trans('Computer parts'),
  3402.                             ],
  3403.                         ],
  3404.                         [
  3405.                             '446_120' => [
  3406.                                 'title' => $translator->trans('Docking station for notebook'),
  3407.                             ],
  3408.                         ],
  3409.                         [
  3410.                             '446_119' => [
  3411.                                 'title' => $translator->trans('Notebook battery'),
  3412.                             ],
  3413.                         ],
  3414.                         [
  3415.                             '239' => [
  3416.                                 'title' => $translator->trans('Refurbished mobile phones'),
  3417.                             ],
  3418.                         ],
  3419.                         [
  3420.                             '270' => [
  3421.                                 'title' => $translator->trans('Tablets'),
  3422.                             ],
  3423.                         ],
  3424.                         [
  3425.                             '176' => [
  3426.                                 'title' => $translator->trans('Printers'),
  3427.                             ],
  3428.                         ],
  3429.                         [
  3430.                             '176_182' => [
  3431.                                 'title' => $translator->trans('Toners'),
  3432.                             ],
  3433.                         ],
  3434.                         [
  3435.                             '364' => [
  3436.                                 'title' => $translator->trans('Smart watch'),
  3437.                             ],
  3438.                         ],
  3439.                     ],
  3440.                 ],
  3441.                 [
  3442.                     'title' => $translator->trans('Useful pages'),
  3443.                     'module' => 'page',
  3444.                     'items' => [
  3445.                         [
  3446.                             'blog_main' => [
  3447.                                 'title' => $translator->trans('Furbify BLOG'),
  3448.                             ],
  3449.                         ],
  3450.                         [
  3451.                             59 => [
  3452.                                 'title' => $translator->trans('Frequently asked questions'),
  3453.                             ],
  3454.                         ],
  3455.                         [
  3456.                             60 => [
  3457.                                 'title' => $translator->trans('Quality grading of product'),
  3458.                             ],
  3459.                         ],
  3460.                         [
  3461.                             'wizard_home' => [
  3462.                                 'title' => $translator->trans('wizard_home'),
  3463.                             ],
  3464.                         ],
  3465.                         [
  3466.                             'review_list_cz' => [
  3467.                                 'title' => $translator->trans('review_list'),
  3468.                             ],
  3469.                         ],
  3470.                         [
  3471.                             145 => [
  3472.                                 'title' => $translator->trans('Laptop repurchase'),
  3473.                             ],
  3474.                         ],
  3475.                         [
  3476.                             169 => [
  3477.                                 'title' => $translator->trans('Payment in installments'),
  3478.                             ],
  3479.                         ],
  3480.                         [
  3481.                             155 => [
  3482.                                 'title' => $translator->trans('PastPay deferred payment'),
  3483.                             ],
  3484.                         ],
  3485.                     ],
  3486.                 ],
  3487.                 [
  3488.                     'title' => 'Furbify things',
  3489.                     'module' => 'page',
  3490.                     'items' => [
  3491.                         [
  3492.                             54 => [
  3493.                                 'title' => $translator->trans('What is a refurbished PC'),
  3494.                             ],
  3495.                         ],
  3496.                         [
  3497.                             74 => [
  3498.                                 'title' => $translator->trans('We are furbify'),
  3499.                             ],
  3500.                         ],
  3501.                         [
  3502.                             69 => [
  3503.                                 'title' => $translator->trans('Price guarantee'),
  3504.                             ],
  3505.                         ],
  3506.                         [
  3507.                             84 => [
  3508.                                 'title' => $translator->trans('Furbify services'),
  3509.                             ],
  3510.                         ],
  3511.                         /*[
  3512.                             70 => [
  3513.                                 'title' => $translator->trans('Newsletter'),
  3514.                             ],
  3515.                         ],*/
  3516.                         [
  3517.                             'jobs_cz' => [
  3518.                                 'title' => $translator->trans('Job offers'),
  3519.                             ],
  3520.                         ],
  3521.                     ],
  3522.                 ],
  3523.                 [
  3524.                     'title' => $translator->trans('Terms and conditions'),
  3525.                     'module' => 'page',
  3526.                     'items' => [
  3527.                         [
  3528.                             61 => [
  3529.                                 'title' => $translator->trans('General terms and conditions'),
  3530.                             ],
  3531.                         ],
  3532.                         [
  3533.                             62 => [
  3534.                                 'title' => $translator->trans('Privacy policy'),
  3535.                             ],
  3536.                         ],
  3537.                         [
  3538.                             204 => [
  3539.                                 'title' => $translator->trans('Shipping, Returns & Claims'),
  3540.                             ],
  3541.                         ],
  3542.                         [
  3543.                             63 => [
  3544.                                 'title' => $translator->trans('Shipping'),
  3545.                             ],
  3546.                         ],
  3547.                         [
  3548.                             77 => [
  3549.                                 'title' => $translator->trans('Company details'),
  3550.                             ],
  3551.                         ],
  3552.                         [
  3553.                             'warranty_chech_page_cz' => [
  3554.                                 'title' => $translator->trans('Warranty check'),
  3555.                             ],
  3556.                         ],
  3557.                     ],
  3558.                 ],
  3559.             ],
  3560.             Language::LANGUAGE_ID_EN => [
  3561.                 [
  3562.                     'title' => $translator->trans('Laptops'),
  3563.                     'module' => 'category',
  3564.                     'items' => [
  3565.                         [
  3566.                             '285' => [
  3567.                                 'title' => $translator->trans('Refurbished laptops'),
  3568.                             ],
  3569.                         ],
  3570.                         [
  3571.                             '291' => [
  3572.                                 'title' => $translator->trans('Gaming laptop'),
  3573.                             ],
  3574.                         ],
  3575.                         [
  3576.                             '346' => [
  3577.                                 'title' => $translator->trans('Mobile workstation'),
  3578.                             ],
  3579.                         ],
  3580.                         [
  3581.                             '352' => [
  3582.                                 'title' => $translator->trans('2 in 1 laptop'),
  3583.                             ],
  3584.                         ],
  3585.                         [
  3586.                             '353' => [
  3587.                                 'title' => $translator->trans('Chromebook'),
  3588.                             ],
  3589.                         ],
  3590.                         [
  3591.                             '593' => [
  3592.                                 'title' => $translator->trans('Bazaar'),
  3593.                             ],
  3594.                         ],
  3595.                         [
  3596.                             '285' => [
  3597.                                 'filter' => '?sort=price&order=asc&limit=24&fd=1',
  3598.                                 'title' => $translator->trans('Laptop sale'),
  3599.                             ],
  3600.                         ],
  3601.                     ],
  3602.                 ],
  3603.                 [
  3604.                     'title' => $translator->trans('PC'),
  3605.                     'module' => 'category',
  3606.                     'items' => [
  3607.                         [
  3608.                             '277' => [
  3609.                                 'title' => $translator->trans('Refurbished computers'),
  3610.                             ],
  3611.                         ],
  3612.                         [
  3613.                             '277_310' => [
  3614.                                 'title' => $translator->trans('All in one PC'),
  3615.                             ],
  3616.                         ],
  3617.                         [
  3618.                             '277_284' => [
  3619.                                 'title' => $translator->trans('Gamer PC'),
  3620.                             ],
  3621.                         ],
  3622.                         [
  3623.                             '277_323' => [
  3624.                                 'title' => $translator->trans('Mini PC'),
  3625.                             ],
  3626.                         ],
  3627.                         [
  3628.                             '277_283' => [
  3629.                                 'title' => $translator->trans('PC set'),
  3630.                             ],
  3631.                         ],
  3632.                         [
  3633.                             '277_281' => [
  3634.                                 'title' => $translator->trans('Workstation PC'),
  3635.                             ],
  3636.                         ],
  3637.                         [
  3638.                             '277_594' => [
  3639.                                 'title' => $translator->trans('Bazaar'),
  3640.                             ],
  3641.                         ],
  3642.                         [
  3643.                             '277' => [
  3644.                                 'filter' => '?sort=price&order=asc&limit=24&fd=1',
  3645.                                 'title' => $translator->trans('PC sale'),
  3646.                             ],
  3647.                         ],
  3648.                     ],
  3649.                 ],
  3650.                 [
  3651.                     'title' => $translator->trans('Monitor'),
  3652.                     'module' => 'category',
  3653.                     'items' => [
  3654.                         [
  3655.                             '304' => [
  3656.                                 'title' => $translator->trans('Refurbished monitors'),
  3657.                             ],
  3658.                         ],
  3659.                         [
  3660.                             '348' => [
  3661.                                 'title' => $translator->trans('Projectors'),
  3662.                             ],
  3663.                         ],
  3664.                         [
  3665.                             '317' => [
  3666.                                 'title' => $translator->trans('Interactive boards'),
  3667.                             ],
  3668.                         ],
  3669.                         [
  3670.                             '595' => [
  3671.                                 'title' => $translator->trans('Bazaar'),
  3672.                             ],
  3673.                         ],
  3674.                         [
  3675.                             '304' => [
  3676.                                 'filter' => '?sort=price&order=asc&limit=24&fd=1',
  3677.                                 'title' => $translator->trans('Monitor sale'),
  3678.                             ],
  3679.                         ],
  3680.                     ],
  3681.                 ],
  3682.                 [
  3683.                     'title' => $translator->trans('Other products'),
  3684.                     'module' => 'category',
  3685.                     'items' => [
  3686.                         [
  3687.                             '350' => [
  3688.                                 'title' => $translator->trans('Refurbished smartphone'),
  3689.                             ],
  3690.                         ],
  3691.                         [
  3692.                             '360' => [
  3693.                                 'title' => $translator->trans('Refurbished tablet'),
  3694.                             ],
  3695.                         ],
  3696.                         [
  3697.                             '273_275' => [
  3698.                                 'title' => $translator->trans('Docking station'),
  3699.                             ],
  3700.                         ],
  3701.                         [
  3702.                             '458' => [
  3703.                                 'title' => $translator->trans('Components and spare parts'),
  3704.                             ],
  3705.                         ],
  3706.                         [
  3707.                             '273' => [
  3708.                                 'title' => $translator->trans('Accessories'),
  3709.                             ],
  3710.                         ],
  3711.                     ],
  3712.                 ],
  3713.                 [
  3714.                     'title' => $translator->trans('About'),
  3715.                     'module' => 'page',
  3716.                     'items' => [
  3717.                         [
  3718.                             '96' => [
  3719.                                 'title' => $translator->trans('What are refurbished devices?'),
  3720.                             ],
  3721.                         ],
  3722.                         [
  3723.                             '114' => [
  3724.                                 'title' => $translator->trans('About Us'),
  3725.                             ],
  3726.                         ],
  3727.                         // ['000' => ['title' => $translator->trans('Why Choose Refurbished?')]],
  3728.                         [
  3729.                             '156' => [
  3730.                                 'title' => $translator->trans('Sustainability'),
  3731.                             ],
  3732.                         ],
  3733.                         [
  3734.                             '99' => [
  3735.                                 'title' => $translator->trans('FAQ'),
  3736.                             ],
  3737.                         ],
  3738.                         [
  3739.                             '100' => [
  3740.                                 'title' => $translator->trans('Product grades'),
  3741.                             ],
  3742.                         ],
  3743.                         [
  3744.                             'wizard_home' => [
  3745.                                 'title' => $translator->trans('wizard_home'),
  3746.                             ],
  3747.                         ],
  3748.                     ],
  3749.                 ],
  3750.                 [
  3751.                     'title' => $translator->trans('Legal'),
  3752.                     'module' => 'page',
  3753.                     'items' => [
  3754.                         [
  3755.                             '106' => [
  3756.                                 'title' => $translator->trans('Company Information'),
  3757.                             ],
  3758.                         ],
  3759.                         [
  3760.                             '123' => [
  3761.                                 'title' => $translator->trans('Privacy policy'),
  3762.                             ],
  3763.                         ],
  3764.                         [
  3765.                             '102' => [
  3766.                                 'title' => $translator->trans('General Terms & Conditions'),
  3767.                             ],
  3768.                         ],
  3769.                         [
  3770.                             '154' => [
  3771.                                 'title' => $translator->trans('Shipping, Returns & Claims'),
  3772.                             ],
  3773.                         ],
  3774.                         [
  3775.                             '108' => [
  3776.                                 'title' => $translator->trans('Cookie Policy'),
  3777.                             ],
  3778.                         ],
  3779.                         [
  3780.                             '170' => [
  3781.                                 'title' => $translator->trans('Payment in installments'),
  3782.                             ],
  3783.                         ],
  3784.                     ],
  3785.                 ],
  3786.                 [
  3787.                     'title' => $translator->trans('User'),
  3788.                     'module' => 'page',
  3789.                     'items' => [
  3790.                         [
  3791.                             'customer_registration' => [
  3792.                                 'title' => $translator->trans('Registration'),
  3793.                             ],
  3794.                         ],
  3795.                         [
  3796.                             'customer_login' => [
  3797.                                 'title' => $translator->trans('Login'),
  3798.                             ],
  3799.                         ],
  3800.                         [
  3801.                             'partner_login' => [
  3802.                                 'title' => $translator->trans('Wholesale'),
  3803.                             ],
  3804.                         ],
  3805.                         [
  3806.                             'warranty_chech_page_en' => [
  3807.                                 'title' => $translator->trans('Warranty check'),
  3808.                             ],
  3809.                         ],
  3810.                     ],
  3811.                 ],
  3812.             ],
  3813.         ];
  3814.     }
  3815.     /**
  3816.      * @return Environment
  3817.      */
  3818.     protected function getTwig(): Environment
  3819.     {
  3820.         return $this->twig;
  3821.     }
  3822.     /**
  3823.      * @return KernelInterface
  3824.      */
  3825.     protected function getKernel(): KernelInterface
  3826.     {
  3827.         return $this->kernel;
  3828.     }
  3829.     /**
  3830.      * @return string
  3831.      */
  3832.     protected function getEnvironment(): string
  3833.     {
  3834.         return $this->getKernel()->getEnvironment();
  3835.     }
  3836.     /**
  3837.      * @return MailerInterface
  3838.      */
  3839.     protected function getMailer(): MailerInterface
  3840.     {
  3841.         return $this->mailer;
  3842.     }
  3843.     /**
  3844.      * @return UrlGeneratorInterface
  3845.      */
  3846.     protected function getRouter(): UrlGeneratorInterface
  3847.     {
  3848.         return $this->router;
  3849.     }
  3850.     /**
  3851.      * Generates a URL from the given parameters.
  3852.      * Overwrite the original function because of locale settings
  3853.      *
  3854.      * @param string $route
  3855.      * @param array $parameters
  3856.      * @param int $referenceType
  3857.      * @return string
  3858.      */
  3859.     protected function generateUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
  3860.     {
  3861.         // Determine locale if the _locale parameter is missing
  3862.         if (!isset($parameters['_locale'])) {
  3863.             $parameters['_locale'] = $this->getRoutePrefix() ;
  3864.         }
  3865.         // Add local flag if locale is set
  3866.         if ($parameters['_locale'] !== '') {
  3867.             try {
  3868.                 // Return route with locale flag if it is exists
  3869.                 return $this->router->generate($route . '_locale', $parameters, $referenceType);
  3870.             } catch (RouteNotFoundException $e) {
  3871.                 // Catch error if route with locale flag is not exists and do nothing
  3872.             }
  3873.             // Remove _locale parameter
  3874.             unset($parameters['_locale']);
  3875.         }
  3876.         // Return route with default locale
  3877.         return $this->router->generate($route, $parameters, $referenceType);
  3878.     }
  3879.     /**
  3880.      * Determine and return prefix for route based on locale settings
  3881.      * @return string
  3882.      */
  3883.     public function getRoutePrefix(): string
  3884.     {
  3885.         if (!is_null($this->requestStack->getCurrentRequest())) {
  3886.             return SeoUrlHelper::getRoutePrefix($this->requestStack->getCurrentRequest());
  3887.         }
  3888.         return '';
  3889.     }
  3890.     /*
  3891.      * @return Instacash
  3892.      */
  3893.     protected function getInstacash(string $languageCode): Instacash
  3894.     {
  3895.         $config = $this->getParameter('instacash')[$languageCode];
  3896.         return new Instacash($config['api_key'], $config['financier'], $this->getEntityManager(), $this->kernel->getEnvironment(), $this->cache, $languageCode);
  3897.     }
  3898.     /**
  3899.      * @param string $languageCode
  3900.      *
  3901.      * @return Milpay
  3902.      */
  3903.     protected function getMilpay(string $languageCode): Milpay
  3904.     {
  3905.         $env = $this->getEnvironment();
  3906.         $config = $this->getParameter('milpay')[$languageCode][$env];
  3907.         return new Milpay($config['api_key'], $config['offerId'], $this->getEntityManager(), $env, $this->cache, $languageCode);
  3908.     }
  3909.     /**
  3910.      * @param int $domainId
  3911.      * @return PastPay
  3912.      */
  3913.     protected function getPastPay(int $domainId): PastPay
  3914.     {
  3915.         $env = $this->kernel->getEnvironment();
  3916.         $config = $env == 'prod' ? $this->getParameter("past_pay") : $this->getParameter("past_pay_demo");
  3917.         return new PastPay($config["api_key_sk"], $this->getEntityManager(), $env);
  3918.     }
  3919.     /**
  3920.      * @param int $domainId
  3921.      * @param Request $request
  3922.      * @param string|null $shippingCountry
  3923.      * @param array $coupon
  3924.      *
  3925.      * @return Klarna|null
  3926.      * @throws \Doctrine\ORM\Exception\NotSupported
  3927.      * @throws \Random\RandomException
  3928.      */
  3929.     protected function getKlarna(int $domainId, Request $request, string $shippingCountry = null, array $coupon = []): ?Klarna
  3930.     {
  3931.         $env = $this->kernel->getEnvironment();
  3932.         $klarnaServices = [
  3933.             Domain::DOMAIN_ID_RT_SK => 'klarna_sk',
  3934.             Domain::DOMAIN_ID_RT_HU => 'klarna_hu',
  3935.             Domain::DOMAIN_ID_RT_CZ => 'klarna_cz',
  3936.             Domain::DOMAIN_ID_RT_EU => 'klarna_eu',
  3937.         ];
  3938.         if (!isset($klarnaServices[$domainId])) {
  3939.             return null;
  3940.         }
  3941.         $config = $env == 'prod'
  3942.             ? $this->getParameter($klarnaServices[$domainId])
  3943.             : $this->getParameter("klarna_test");
  3944.         $country = [];
  3945.         switch ($domainId) {
  3946.             case Domain::DOMAIN_ID_RT_SK:
  3947.                 $country['purchase_country'] = 'SK';
  3948.                 $country['purchase_currency'] = 'EUR';
  3949.                 $country['locale'] = 'sk-SK';
  3950.                 $country['domain'] = $env == 'prod' ? 'furbify.sk' : 'furbify.dev.sk';
  3951.                 break;
  3952.             case Domain::DOMAIN_ID_RT_HU:
  3953.                 $country['purchase_country'] = 'HU';
  3954.                 $country['purchase_currency'] = 'HUF';
  3955.                 $country['locale'] = 'hu-HU';
  3956.                 $country['domain'] = $env == 'prod' ? 'furbify.hu' : 'furbify.dev.hu';
  3957.                 break;
  3958.             case Domain::DOMAIN_ID_RT_CZ:
  3959.                 $country['purchase_country'] = 'CZ';
  3960.                 $country['purchase_currency'] = 'CZK';
  3961.                 $country['locale'] = 'cs-CZ';
  3962.                 $country['domain'] = $env == 'prod' ? 'furbify.cz' : 'furbify.dev.cz';
  3963.                 break;
  3964.             case Domain::DOMAIN_ID_RT_EU:
  3965.                 $country['locale'] = 'en-' . $shippingCountry;
  3966.                 $country['purchase_country'] = $shippingCountry;
  3967.                 $country['domain'] = $env == 'prod' ? 'furbify.eu' : 'furbify.dev.eu';
  3968.                 $country['purchase_currency'] = 'EUR';
  3969.                 break;
  3970.         }
  3971.         $domain = $this->getEntityManager()->getRepository(Domain::class)->find($domainId);
  3972.         $country['vat'] = $domain->getVat();
  3973.         $translator = $this->getDatabaseTranslator($request);
  3974.         return new Klarna($this->getEntityManager(), $env, $country, $config['username'], $config['password'], $coupon, $domain, $translator);
  3975.     }
  3976.     /**
  3977.      * DigitalOcean Space Connection
  3978.      *
  3979.      * @return DigitalOceanSpaces
  3980.      */
  3981.     public function getDigitalOceanSpace(): DigitalOceanSpaces
  3982.     {
  3983.         $config = $this->getParameter('digital_ocean_space');
  3984.         return ( new DigitalOceanSpaces($config['access_key'], $config['secret_key']) );
  3985.     }
  3986.     protected function getPaypal()
  3987.     {
  3988.         $env = $this->kernel->getEnvironment();
  3989.         $credentials = $env == 'prod'
  3990.             ? $this->getParameter('paypal')['live']
  3991.             : $this->getParameter('paypal')['sandbox'];
  3992.         return new Paypal($env, $credentials);
  3993.     }
  3994.     protected function getKlaviyoConnect(Request $request): KlaviyoConnect
  3995.     {
  3996.         $env = $this->kernel->getEnvironment();
  3997.         $config = $this->getParameter('klaviyo')[$env];
  3998.         return new KlaviyoConnect($config, $this->getEntityManager(), $env, $this->getRouter(), $this->getDatabaseTranslator($request)) ;
  3999.     }
  4000. }