src/AtechNet/CoreBundle/Controller/DefaultController.php line 1287

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Controller;
  3. use App\AtechNet\CoreBundle\Entity\Attribute;
  4. use App\AtechNet\CoreBundle\Entity\Banner;
  5. use App\AtechNet\CoreBundle\Entity\BannerItem;
  6. use App\AtechNet\CoreBundle\Entity\BlogPage;
  7. use App\AtechNet\CoreBundle\Entity\CategoryGroup;
  8. use App\AtechNet\CoreBundle\Entity\CategoryPage;
  9. use App\AtechNet\CoreBundle\Entity\Customer;
  10. use App\AtechNet\CoreBundle\Entity\CustomerBillingoData;
  11. use App\AtechNet\CoreBundle\Entity\CustomerProductFeed;
  12. use App\AtechNet\CoreBundle\Entity\Document;
  13. use App\AtechNet\CoreBundle\Entity\DocumentGroup;
  14. use App\AtechNet\CoreBundle\Entity\Domain;
  15. use App\AtechNet\CoreBundle\Entity\DomainPaymentType;
  16. use App\AtechNet\CoreBundle\Entity\DomainShippingType;
  17. use App\AtechNet\CoreBundle\Entity\Language;
  18. use App\AtechNet\CoreBundle\Entity\Order;
  19. use App\AtechNet\CoreBundle\Entity\OrderItem;
  20. use App\AtechNet\CoreBundle\Entity\OrderSetting;
  21. use App\AtechNet\CoreBundle\Entity\Photo;
  22. use App\AtechNet\CoreBundle\Entity\Product;
  23. use App\AtechNet\CoreBundle\Entity\ProductAttribute;
  24. use App\AtechNet\CoreBundle\Entity\ProductType;
  25. use App\AtechNet\CoreBundle\Entity\Review;
  26. use App\AtechNet\CoreBundle\Entity\ReviewSurveyMedia;
  27. use App\AtechNet\CoreBundle\Entity\SeoUrl;
  28. use App\AtechNet\CoreBundle\Entity\StockItem;
  29. use App\AtechNet\CoreBundle\Entity\SurveyAnswer;
  30. use App\AtechNet\CoreBundle\Entity\SurveyMedia;
  31. use App\AtechNet\CoreBundle\Entity\SurveyQuestion;
  32. use App\AtechNet\CoreBundle\Entity\SurveyQuestionOption;
  33. use App\AtechNet\CoreBundle\Entity\User;
  34. use App\AtechNet\CoreBundle\Entity\Vendor;
  35. use App\AtechNet\CoreBundle\Enum\PaymentType;
  36. use App\AtechNet\CoreBundle\Helper\BillingoOperation;
  37. use App\AtechNet\CoreBundle\Helper\Collections;
  38. use App\AtechNet\CoreBundle\Helper\DeliveryUtil;
  39. use App\AtechNet\CoreBundle\Helper\Furbify\CartHelper;
  40. use App\AtechNet\CoreBundle\Helper\Furbify\Heureka;
  41. use App\AtechNet\CoreBundle\Helper\Furbify\Image;
  42. use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
  43. use App\AtechNet\CoreBundle\Helper\Furbify\ProductHelper;
  44. use App\AtechNet\CoreBundle\Helper\Furbify\SeoUrlHelper;
  45. use App\AtechNet\CoreBundle\Helper\Furbify\TextHelper;
  46. use App\AtechNet\CoreBundle\Helper\KlaviyoConnect;
  47. use App\AtechNet\CoreBundle\Service\Furbify\BazaarService;
  48. use App\AtechNet\CoreBundle\Service\Furbify\ProductService;
  49. use DateTime;
  50. use Doctrine\Common\Collections\ArrayCollection;
  51. use Doctrine\ORM\NonUniqueResultException;
  52. use Doctrine\ORM\NoResultException;
  53. use Exception;
  54. use Google\Service\Dataform\Notebook;
  55. use Psr\Cache\CacheItemPoolInterface;
  56. use Psr\SimpleCache\InvalidArgumentException;
  57. use SimpleXMLElement;
  58. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  59. use Symfony\Component\Finder\Exception\AccessDeniedException;
  60. use Symfony\Component\HttpFoundation\JsonResponse;
  61. use Symfony\Component\HttpFoundation\RedirectResponse;
  62. use Symfony\Component\HttpFoundation\Request;
  63. use Symfony\Component\HttpFoundation\Response;
  64. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  65. use Symfony\Component\Routing\Annotation\Route;
  66. use Symfony\Component\Routing\Exception\InvalidParameterException;
  67. class DefaultController extends AbstractController
  68. {
  69.     /**
  70.      * @Route("/", name="homepage", defaults={"_locale":""})
  71.      * @Route("/{_locale<%supported_locales%>?}", name="homepage_locale", defaults={"_locale":""})
  72.      * @param Request $request
  73.      * @return Response
  74.      * @throws Exception
  75.      */
  76.     public function indexAction(Request $request): Response
  77.     {
  78.         // Set Bazaar Flag
  79.         $request->getSession()->set('isBazaarPage', false);
  80.         $pastPayPaymentResult = $request->get('pastPayPayment');
  81.         $orderId = base64_decode($request->get('pastPayId'));
  82.         if ($pastPayPaymentResult == 'success' && $orderId > 0) {
  83.             $entityManager = $this->getEntityManager();
  84.             $order = $entityManager->getRepository(Order::class)->findOneById($orderId);
  85.             if (count($order->getPastPayPaymentSettings()) == 0) {
  86.                 $orderSettingApplicationStatus = OrderSetting::createSetting(
  87.                     $order,
  88.                     OrderSetting::TYPE_PAST_PAY_RESERVE,
  89.                     'CREATED'
  90.                 );
  91.                 $entityManager->persist($orderSettingApplicationStatus);
  92.                 $entityManager->flush();
  93.             }
  94.             $this->addFlash(
  95.                 'pastPayResult',
  96.                 "PastPay payment SUCCESS!"
  97.             );
  98.         } elseif ($pastPayPaymentResult == 'failure' && $orderId > 0) {
  99.             $this->addFlash(
  100.                 'pastPayResult',
  101.                 "PastPay payment Failed!"
  102.             );
  103.         }
  104.         // Set back to products link for cart
  105.         $request->getSession()->set('cartBackToProductsLink', $request->getSchemeAndHttpHost() . $request->getBaseUrl());
  106.         // partner dashboard
  107.         if ( $request->getSession()->get('customerTypeId') == 2 ) { 
  108.             return $this->partnerIndex($request);
  109.         } else { // retail homepage
  110.             return $this->retailIndex($request);
  111.         }
  112.     }
  113.     /**
  114.      * @param Request $request
  115.      * @return Response
  116.      * @throws \Psr\SimpleCache\InvalidArgumentException
  117.      */
  118.     private function retailIndex(Request $request): Response
  119.     {
  120.         $data = [];
  121.         $entityManager = $this->getEntityManager();
  122.         $translator = $this->getTranslator();
  123.         $multiStore = $this->getMultiStoreHelper($request);
  124.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  125.         $domain = $multiStore->getDomain();
  126.         $domainId = $domain->getId();
  127.         $cache = $this->cache;
  128.         $language = $multiStore->getLanguage();
  129.         $cacheLifetime = self::CACHE_LIFETIME_15_MINUTES;
  130.         $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  131.         $data['precision'] = $domain->getPricePrecision();
  132.         $data['currency'] = $domain->getCurrency();
  133.         $data['warrantyYear'] = $this->getWarrantyForNonProductText($domainId);
  134.         $data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domainId, 'priceWarrantyDay');
  135.         $data['mainProducts'] = [];
  136.         $productHelper = $this->getProductHelper($request);
  137.         // Main Products
  138.         $homepageMainProductsCacheKey = 'homepage.main.products.v3.' . $domainId . '.' . $language->getCode();
  139.         $homepageMainProductsCacheItem = $cache->getItem($homepageMainProductsCacheKey);
  140.         if ($homepageMainProductsCacheItem->isHit()) {
  141.             $data['mainProducts'] = $homepageMainProductsCacheItem->get();
  142.         } else {
  143.             $productGroupProductData = $productHelper->getProductGroupProducts('homepage.main', $domain);
  144.             $productGroupProducts = $productGroupProductData['productGroupProducts'];
  145.             $groupProductCodesAdded = $productGroupProductData['productGroupCodesAdded'];
  146.             $productsToDisplay = $productGroupProductData['productsToDisplay'];
  147.             $productGroupResults = $productHelper->getStructuredDataForProducts($productGroupProducts);
  148.             $data['mainProducts'] = $productHelper->convertStructuredDataToListViewData($this->url($request), $productGroupResults, $placeholder);
  149.             // Fill in
  150.             if (count($groupProductCodesAdded) < $productsToDisplay) {
  151.                 $maxResults = $productsToDisplay - count($groupProductCodesAdded);
  152.                 // Already Added
  153.                 $productAlreadyAddedWhere = '';
  154.                 if (count($groupProductCodesAdded) > 0) {
  155.                     $productAlreadyAddedWhere = ' AND p.code NOT IN (' . implode(',', $groupProductCodesAdded) . ')';
  156.                 }
  157.                 $retailPage = $domain->getType() == 'retail';
  158.                 $notebookSaleProducts = $entityManager->createQuery("SELECT p
  159.                     FROM AtechNetCoreBundle:Product p
  160.                     LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
  161.                         SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $domainId . "
  162.                     )
  163.                     WHERE p.type = 52 AND pm.discounted = 1 AND pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . ($retailPage ? " AND p.qualityStatus != 9" : "") . $productAlreadyAddedWhere . "
  164.                     ORDER BY pm.currentVatPrice ASC, p.updated DESC")
  165.                     ->setMaxResults($maxResults)
  166.                     ->getResult();
  167.                 $results = $productHelper->getStructuredDataForProducts($notebookSaleProducts);
  168.                 $data['mainProducts'] = array_merge($data['mainProducts'], $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder));
  169.             }
  170.             foreach ($data['mainProducts'] as $key => $value) {
  171.                 $data['mainProducts'][$key]['warrantyYear'] = $value['qualityStatusId'] == Product::QualityStatus_Bazaar ? 1 : $this->getWarrantyForProductType($domain->getId(), $value['typeId'])['year'];
  172.             }
  173.             $homepageMainProductsCacheItem->set($data['mainProducts']);
  174.             $homepageMainProductsCacheItem->expiresAfter($cacheLifetime);
  175.             $cache->save($homepageMainProductsCacheItem);
  176.         }
  177.         // Header Featured Category
  178.         $homepageFeaturedCategoryCacheKey = 'homepage.featured.category.v6.' . $domainId . '.' . $language->getCode();
  179.         $homepageFeaturedCategoryCacheItem = $cache->getItem($homepageFeaturedCategoryCacheKey);
  180.         if ($homepageFeaturedCategoryCacheItem->isHit()) {
  181.             $data['featuredCategory'] = $homepageFeaturedCategoryCacheItem->get();
  182.         } else {
  183.             $featuredCategoryUpper = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_UPPER, $seoUrlHelper);
  184.             $featuredCategoryLower = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_LOWER, $seoUrlHelper);
  185.             $data['featuredCategory'] = [];
  186.             if (!empty($featuredCategoryUpper)) {
  187.                 $data['featuredCategory']['upper'] = $featuredCategoryUpper;
  188.             }
  189.             if (!empty($featuredCategoryLower)) {
  190.                 $data['featuredCategory']['lower'] = $featuredCategoryLower;
  191.             }
  192.             $homepageFeaturedCategoryCacheItem->set($data['featuredCategory']);
  193.             $homepageFeaturedCategoryCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
  194.             $cache->save($homepageFeaturedCategoryCacheItem);
  195.         }
  196.         // Featured Products
  197.         $homepageFeaturedProductCacheKey = 'homepage.featured.products.v7.' . $domainId . '.' . $language->getCode();
  198.         $homepageFeaturedProductCacheItem = $cache->getItem($homepageFeaturedProductCacheKey);
  199.         if ($homepageFeaturedProductCacheItem->isHit()) {
  200.             $data['featuredProduct'] = $homepageFeaturedProductCacheItem->get();
  201.             if (isset($data['featuredProduct']['upper']) && (array_key_exists('isRandom', $data['featuredProduct']['upper'])  && $data['featuredProduct']['upper']['isRandom'])
  202.                 || isset($data['featuredProduct']['lower']) && (array_key_exists('isRandom', $data['featuredProduct']['upper']) && $data['featuredProduct']['lower']['isRandom'])) {
  203.                 $data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
  204.             }
  205.         } else {
  206.             $data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
  207.         }
  208.         $featuredCategoriesCacheKey = 'homepage.featured.categories.v4.' . $domainId . '.' . $language->getCode();
  209.         $featuredCategoriesCacheItem = $cache->getItem($featuredCategoriesCacheKey);
  210.         if ($featuredCategoriesCacheItem->isHit()) {
  211.             $data['featuredCategories'] = $featuredCategoriesCacheItem->get();
  212.         } else {
  213.             switch ($domainId) {
  214.                 case Domain::DOMAIN_ID_RT_SK:
  215.                 case Domain::DOMAIN_ID_WS_SK:
  216.                     $data['featuredCategories'] = [
  217.                         [
  218.                             'title' => $translator->trans('Laptops'),
  219.                             'image' => 'laptop-200x150.png',
  220.                             'href'  => $seoUrlHelper->link('category', ['path' => '5']),
  221.                         ], [
  222.                             'title' => $translator->trans('MacBook'),
  223.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '584' ]),
  224.                             'image'  => 'macbook-200x150.png',
  225.                         ], [
  226.                             'title' => $translator->trans('Workstation laptops'),
  227.                             'image' => 'workstation-laptop-200x150.png',
  228.                             'href'  => $seoUrlHelper->link('category', ['path' => '113']),
  229.                         ], [
  230.                             'title' => $translator->trans('2in1 notebooks'),
  231.                             'image' => '2in1-notebooks-200x150.png',
  232.                             'href'  => $seoUrlHelper->link('category', ['path' => '241']),
  233.                         ], [
  234.                             'title' => $translator->trans('Desktop PC'),
  235.                             'image' => 'pc-set-200x150.png',
  236.                             'href'  => $seoUrlHelper->link('category', ['path' => '4']),
  237.                         ], [
  238.                             'title' => $translator->trans('Notebook with new battery'),
  239.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '648' ]),
  240.                             'image'  => 'laptop-200x150.png',
  241.                         ], [
  242.                             'title' => 'Mini PC',
  243.                             'href'  => $seoUrlHelper->link('category', ['path' => '177']),
  244.                             'image' => 'mini-pc-200x150.png',
  245.                         ], [
  246.                             'title' => $translator->trans('Gamer laptops'),
  247.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '24' ]),
  248.                             'image'  => 'gamer-laptop-200x150.png',
  249.                         ], [
  250.                             'title' => $translator->trans('Tablets'),
  251.                             'image' => 'tablet-200x150.png',
  252.                             'href'  => $seoUrlHelper->link('category', ['path' => '269']),
  253.                         ], [
  254.                             'title' => $translator->trans('Parts only'),
  255.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  256.                             'image' => 'components-200x150.png',
  257.                         ], [
  258.                             'title' => $translator->trans('Discounted notebooks'),
  259.                             'image' => 'laptop-sale-200x150.png',
  260.                             'href'  => $seoUrlHelper->link('category', ['path' => '5', 'fd' => 1]),
  261.                         ], [
  262.                             'title' => $translator->trans('wizard_home'),
  263.                             'image' => 'wizard_icon.svg',
  264.                             'href' => '/wizard',
  265.                         ],
  266.                     ];
  267.                     break;
  268.                 case Domain::DOMAIN_ID_RT_HU:
  269.                 case Domain::DOMAIN_ID_WS_HU:
  270.                     $data['featuredCategories'] = [
  271.                         [
  272.                             'title' => $translator->trans('Laptop'),
  273.                             'image' => 'laptop-200x150.png',
  274.                             'href'  => $seoUrlHelper->link('category', ['path' => '56']),
  275.                         ], [
  276.                             'title' => $translator->trans('MacBook'),
  277.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '583' ]),
  278.                             'image'  => 'macbook-200x150.png',
  279.                         ], [
  280.                             'title' => $translator->trans('Workstation laptop'),
  281.                             'image' => 'workstation-laptop-200x150.png',
  282.                             'href'  => $seoUrlHelper->link('category', ['path' => '112']),
  283.                         ], [
  284.                             'title' => $translator->trans('2in1 notebooks'),
  285.                             'image' => '2in1-notebooks-200x150.png',
  286.                             'href'  => $seoUrlHelper->link('category', ['path' => '240']),
  287.                         ], [
  288.                             'title' => $translator->trans('Desktop PC'),
  289.                             'image' => 'pc-set-200x150.png',
  290.                             'href'  => $seoUrlHelper->link('category', ['path' => '48']),
  291.                         ], [
  292.                             'title' => $translator->trans('Notebook with new battery'),
  293.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '647' ]),
  294.                             'image'  => 'laptop-200x150.png',
  295.                         ], [
  296.                             'title' => 'Mini PC',
  297.                             'href'  => $seoUrlHelper->link('category', ['path' => '178']),
  298.                             'image' => 'mini-pc-200x150.png',
  299.                         ], [
  300.                             'title' => $translator->trans('Gamer laptop'),
  301.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '62' ]),
  302.                             'image'  => 'gamer-laptop-200x150.png',
  303.                         ], [
  304.                             'title' => $translator->trans('Tablet'),
  305.                             'image' => 'tablet-200x150.png',
  306.                             'href'  => $seoUrlHelper->link('category', ['path' => '268']),
  307.                         ], [
  308.                             'title' => $translator->trans('Parts only'),
  309.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  310.                             'image' => 'components-200x150.png',
  311.                         ], [
  312.                             'title' => $translator->trans('Discounted notebooks'),
  313.                             'image' => 'laptop-sale-200x150.png',
  314.                             'href'  => $seoUrlHelper->link('category', ['path' => '56', 'fd' => 1]),
  315.                         ], [
  316.                             'title' => $translator->trans('wizard_home'),
  317.                             'image' => 'wizard_icon.svg',
  318.                             'href'  => '/wizard',
  319.                         ],
  320.                     ];
  321.                     break;
  322.                 case Domain::DOMAIN_ID_RT_CZ:
  323.                 case Domain::DOMAIN_ID_WS_CZ:
  324.                     $data['featuredCategories'] = [
  325.                         [
  326.                             'title' => $translator->trans('Laptops'),
  327.                             'image' => 'laptop-200x150.png',
  328.                             'href'  => $seoUrlHelper->link('category', ['path' => '130']),
  329.                         ], [
  330.                             'title' => $translator->trans('MacBook'),
  331.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '585' ]),
  332.                             'image'  => 'macbook-200x150.png',
  333.                         ], [
  334.                             'title' => $translator->trans('Workstation laptops'),
  335.                             'image' => 'workstation-laptop-200x150.png',
  336.                             'href'  => $seoUrlHelper->link('category', ['path' => '175']),
  337.                         ], [
  338.                             'title' => $translator->trans('2in1 notebooks'),
  339.                             'image' => '2in1-notebooks-200x150.png',
  340.                             'href'  => $seoUrlHelper->link('category', ['path' => '242']),
  341.                         ], [
  342.                             'title' => $translator->trans('Desktop PC'),
  343.                             'image' => 'pc-set-200x150.png',
  344.                             'href'  => $seoUrlHelper->link('category', ['path' => '122']),
  345.                         ], [
  346.                             'title' => $translator->trans('Notebook with new battery'),
  347.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '650' ]),
  348.                             'image'  => 'laptop-200x150.png',
  349.                         ], [
  350.                             'title' => 'Mini PC',
  351.                             'href'  => $seoUrlHelper->link('category', ['path' => '179']),
  352.                             'image' => 'mini-pc-200x150.png',
  353.                         ], [
  354.                             'title' => $translator->trans('Gamer laptops'),
  355.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '136' ]),
  356.                             'image' => 'gamer-laptop-200x150.png',
  357.                         ], [
  358.                             'title' => $translator->trans('Tablets'),
  359.                             'image' => 'tablet-200x150.png',
  360.                             'href'  => $seoUrlHelper->link('category', ['path' => '270']),
  361.                         ], [
  362.                             'title' => $translator->trans('Parts only'),
  363.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  364.                             'image' => 'components-200x150.png',
  365.                         ], [
  366.                             'title' => $translator->trans('Discounted notebooks'),
  367.                             'image' => 'laptop-sale-200x150.png',
  368.                             'href'  => $seoUrlHelper->link('category', ['path' => '130', 'fd' => 1]),
  369.                         ],[
  370.                             'title' => $translator->trans('wizard_home'),
  371.                             'image' => 'wizard_icon.svg',
  372.                             'href'  => '/wizard',
  373.                         ],
  374.                     ];
  375.                     break;
  376.                 case Domain::DOMAIN_ID_RT_EU:
  377.                 case Domain::DOMAIN_ID_WS_EU:
  378.                     $data['featuredCategories'] = [
  379.                         [
  380.                             'title' => $translator->trans('Laptop'),
  381.                             'image' => 'laptop-200x150.png',
  382.                             'href'  => $seoUrlHelper->link('category', ['path' => '285']),
  383.                         ], [
  384.                             'title' => $translator->trans('MacBook'),
  385.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '596' ]),
  386.                             'image'  => 'macbook-200x150.png',
  387.                         ], [
  388.                             'title' => 'Workstation laptop',
  389.                             'image' => 'workstation-laptop-200x150.png',
  390.                             'href'  => $seoUrlHelper->link('category', ['path' => '346']),
  391.                         ], [
  392.                             'title' => $translator->trans('2 in 1 notebooks'),
  393.                             'image' => '2in1-notebooks-200x150.png',
  394.                             'href'  => $seoUrlHelper->link('category', ['path' => '352']),
  395.                         ], [
  396.                             'title' => $translator->trans('Gaming laptop'),
  397.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '291' ]),
  398.                             'image'  => 'gamer-laptop-200x150.png',
  399.                         ], [
  400.                             'title' => $translator->trans('Desktop computers'),
  401.                             'image' => 'pc-set-200x150.png',
  402.                             'href'  => $seoUrlHelper->link('category', ['path' => '277']),
  403.                         ], [
  404.                             'title' => 'Mini PC',
  405.                             'href'  => $seoUrlHelper->link('category', ['path' => '323']),
  406.                             'image' => 'mini-pc-200x150.png',
  407.                         ], [
  408.                             'title' => $translator->trans('Notebook with new battery'),
  409.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '651' ]),
  410.                             'image'  => 'laptop-200x150.png',
  411.                         ], [
  412.                             'title' => $translator->trans('Tablet'),
  413.                             'image' => 'tablet-200x150.png',
  414.                             'href'  => $seoUrlHelper->link('category', ['path' => '360']),
  415.                         ], [
  416.                             'title' => $translator->trans('Parts only'),
  417.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  418.                             'image' => 'components-200x150.png',
  419.                         ], [
  420.                             'title' => $translator->trans('Discounted notebooks'),
  421.                             'image' => 'laptop-sale-200x150.png',
  422.                             'href'  => $seoUrlHelper->link('category', ['path' => '285', 'fd' => 1]),
  423.                         ], [
  424.                             'title' => $translator->trans('wizard_home'),
  425.                             'image' => 'wizard_icon.svg',
  426.                             'href'  => '/wizard',
  427.                         ],
  428.                     ];
  429.                     break;
  430.                 default:
  431.                     $data['featuredCategories'] = [];
  432.             }
  433.             $featuredCategoriesCacheItem->set($data['featuredCategories']);
  434.             $featuredCategoriesCacheItem->expiresAfter($cacheLifetime);
  435.             $cache->save($featuredCategoriesCacheItem);
  436.         }
  437.         $data['banners'] = $this->getHeaderBanner($domain);
  438.         $data['smallBanners'] = $this->getSmallBanners($domain);
  439.         $data['lang'] = $language->getCode();
  440.         $data['header'] = $this->getHeader($request);
  441.         $data['footer'] = $this->getFooter($request);
  442.         $data['content_top'] = $this->getContentTop($request);
  443.         $data['content_bottom'] = $this->getContentBottom($request);
  444.         $data['content_reviews'] = $this->getModuleHelper($request)->blockTestimonial('full', true);
  445.         $data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
  446.         return $this->render('AtechNetCoreBundle/Homepage/index.html.twig', $data);
  447.     }
  448.     /**
  449.      * @param Request $request
  450.      * @return Response
  451.      * @throws \Psr\SimpleCache\InvalidArgumentException
  452.      */
  453.     private function partnerIndex(Request $request): Response
  454.     {
  455.         $data = [];
  456.         $entityManager = $this->getEntityManager();
  457.         $translator = $this->getTranslator();
  458.         $multiStore = $this->getMultiStoreHelper($request);
  459.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  460.         $domain = $multiStore->getDomain();
  461.         $domainId = $domain->getId();
  462.         $cache = $this->cache;
  463.         $language = $multiStore->getLanguage();
  464.         $cacheLifetime = self::CACHE_LIFETIME_15_MINUTES;
  465.         $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  466.         $data['precision'] = $domain->getPricePrecision();
  467.         $data['currency'] = $domain->getCurrency();
  468.         $data['warrantyYear'] = $this->getWarrantyForNonProductText($domainId);
  469.         $data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domainId, 'priceWarrantyDay');
  470.         $data['mainProducts'] = [];
  471.         $productHelper = $this->getProductHelper($request);
  472.         // Main Products
  473.         $homepageMainProductsCacheKey = 'homepage.main.products.v4.' . $domainId . '.' . $language->getCode();
  474.         $homepageMainProductsCacheItem = $cache->getItem($homepageMainProductsCacheKey);
  475.         if ($homepageMainProductsCacheItem->isHit()) {
  476.             $data['mainProducts'] = $homepageMainProductsCacheItem->get();
  477.         } else {
  478.             $productGroupProductData = $productHelper->getProductGroupProducts('homepage.main', $domain);
  479.             $productGroupProducts = $productGroupProductData['productGroupProducts'];
  480.             $groupProductCodesAdded = $productGroupProductData['productGroupCodesAdded'];
  481.             $productsToDisplay = $productGroupProductData['productsToDisplay'];
  482.             $productGroupResults = $productHelper->getStructuredDataForProducts($productGroupProducts);
  483.             $data['mainProducts'] = $productHelper->convertStructuredDataToListViewData($this->url($request), $productGroupResults, $placeholder);
  484.             // Fill in
  485.             if (count($groupProductCodesAdded) < $productsToDisplay) {
  486.                 $maxResults = $productsToDisplay - count($groupProductCodesAdded);
  487.                 // Already Added
  488.                 $productAlreadyAddedWhere = '';
  489.                 if (count($groupProductCodesAdded) > 0) {
  490.                     $productAlreadyAddedWhere = ' AND p.code NOT IN (' . implode(',', $groupProductCodesAdded) . ')';
  491.                 }
  492.                 $retailPage = $domain->getType() == 'retail';
  493.                 $notebookSaleProducts = $entityManager->createQuery("SELECT p
  494.                     FROM AtechNetCoreBundle:Product p
  495.                     LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
  496.                         SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $domainId . "
  497.                     )
  498.                     WHERE p.type = 52 AND pm.discounted = 1 AND pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . ($retailPage ? " AND p.qualityStatus != 9" : "") . $productAlreadyAddedWhere . "
  499.                     ORDER BY pm.currentVatPrice ASC, p.updated DESC")
  500.                     ->setMaxResults($maxResults)
  501.                     ->getResult();
  502.                 $results = $productHelper->getStructuredDataForProducts($notebookSaleProducts);
  503.                 $data['mainProducts'] = array_merge($data['mainProducts'], $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder));
  504.             }
  505.             foreach ($data['mainProducts'] as $key => $value) {
  506.                 $data['mainProducts'][$key]['warrantyYear'] = $value['qualityStatusId'] == Product::QualityStatus_Bazaar ? 1 : $this->getWarrantyForProductType($domain->getId(), $value['typeId'])['year'];
  507.             }
  508.             $homepageMainProductsCacheItem->set($data['mainProducts']);
  509.             $homepageMainProductsCacheItem->expiresAfter($cacheLifetime);
  510.             $cache->save($homepageMainProductsCacheItem);
  511.         }
  512.         // Header Featured Category
  513.         $homepageFeaturedCategoryCacheKey = 'homepage.featured.category.v4.' . $domainId . '.' . $language->getCode();
  514.         $homepageFeaturedCategoryCacheItem = $cache->getItem($homepageFeaturedCategoryCacheKey);
  515.         if ($homepageFeaturedCategoryCacheItem->isHit()) {
  516.             $data['featuredCategory'] = $homepageFeaturedCategoryCacheItem->get();
  517.         } else {
  518.             $featuredCategoryUpper = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_UPPER, $seoUrlHelper);
  519.             $featuredCategoryLower = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_LOWER, $seoUrlHelper);
  520.             $data['featuredCategory'] = [];
  521.             if (!empty($featuredCategoryUpper)) {
  522.                 $data['featuredCategory']['upper'] = $featuredCategoryUpper;
  523.             }
  524.             if (!empty($featuredCategoryLower)) {
  525.                 $data['featuredCategory']['lower'] = $featuredCategoryLower;
  526.             }
  527.             $homepageFeaturedCategoryCacheItem->set($data['featuredCategory']);
  528.             $homepageFeaturedCategoryCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
  529.             $cache->save($homepageFeaturedCategoryCacheItem);
  530.         }
  531.         // Featured Products
  532.         $homepageFeaturedProductCacheKey = 'homepage.featured.products.v5.' . $domainId . '.' . $language->getCode();
  533.         $homepageFeaturedProductCacheItem = $cache->getItem($homepageFeaturedProductCacheKey);
  534.         if ($homepageFeaturedProductCacheItem->isHit()) {
  535.             $data['featuredProduct'] = $homepageFeaturedProductCacheItem->get();
  536.             if (isset($data['featuredProduct']['upper']['isRandom']) && $data['featuredProduct']['upper']['isRandom']
  537.                 || isset($data['featuredProduct']['lower']['isRandom']) && $data['featuredProduct']['lower']['isRandom']) {
  538.                 $data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
  539.             }
  540.         }
  541.         else {
  542.             $data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
  543.         }
  544.         $featuredCategoriesCacheKey = 'homepage.featured.categories.v1.' . $domainId . '.' . $language->getCode();
  545.         $featuredCategoriesCacheItem = $cache->getItem($featuredCategoriesCacheKey);
  546.         if ($featuredCategoriesCacheItem->isHit()) {
  547.             $data['featuredCategories'] = $featuredCategoriesCacheItem->get();
  548.         } else {
  549.             switch ($domainId) {
  550.                 case Domain::DOMAIN_ID_RT_SK:
  551.                 case Domain::DOMAIN_ID_WS_SK:
  552.                     $data['featuredCategories'] = [
  553.                         [
  554.                             'title' => $translator->trans('Laptops'),
  555.                             'image' => 'laptop-200x150.png',
  556.                             'href'  => $seoUrlHelper->link('category', ['path' => '5']),
  557.                         ], [
  558.                             'title' => $translator->trans('Gamer laptops'),
  559.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '24' ]),
  560.                             'image'  => 'gamer-laptop-200x150.png',
  561.                         ], [
  562.                             'title' => $translator->trans('Workstation laptops'),
  563.                             'image' => 'workstation-laptop-200x150.png',
  564.                             'href'  => $seoUrlHelper->link('category', ['path' => '113']),
  565.                         ], [
  566.                             'title' => $translator->trans('2in1 notebooks'),
  567.                             'image' => '2in1-notebooks-200x150.png',
  568.                             'href'  => $seoUrlHelper->link('category', ['path' => '241']),
  569.                         ], [
  570.                             'title' => $translator->trans('Desktop PC'),
  571.                             'image' => 'pc-set-200x150.png',
  572.                             'href'  => $seoUrlHelper->link('category', ['path' => '4']),
  573.                         ], [
  574.                             'title' => $translator->trans('Gamer PCs'),
  575.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '17' ]),
  576.                             'image'  => 'gamer-pc-200x150.png',
  577.                         ], [
  578.                             'title' => 'Chromebook',
  579.                             'href'  => $seoUrlHelper->link('category', ['path' => '244']),
  580.                             'image' => 'chromebook-quicklink.png',
  581.                         ], [
  582.                             'title' => $translator->trans('Tablets'),
  583.                             'image' => 'tablet-200x150.png',
  584.                             'href'  => $seoUrlHelper->link('category', ['path' => '269']),
  585.                         ], [
  586.                             'title' => $translator->trans('Parts only'),
  587.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  588.                             'image' => 'components-200x150.png',
  589.                         ], [
  590.                             'title' => $translator->trans('Discounted notebooks'),
  591.                             'image' => 'laptop-sale-200x150.png',
  592.                             'href'  => $seoUrlHelper->link('category', ['path' => '5', 'fd' => 1]),
  593.                         ], [
  594.                             'title' => $translator->trans('Bazaar'),
  595.                             'image' => 'bazar-200x150.png',
  596.                             'href'  => $seoUrlHelper->link('category', ['path' => '250']),
  597.                         ], [
  598.                             'title' => $translator->trans('wizard_home'),
  599.                             'image' => 'wizard_icon.svg',
  600.                             'href'  => '/wizard',
  601.                         ],
  602.                     ];
  603.                     break;
  604.                 case Domain::DOMAIN_ID_RT_HU:
  605.                 case Domain::DOMAIN_ID_WS_HU:
  606.                     $data['featuredCategories'] = [
  607.                         [
  608.                             'title' => $translator->trans('Laptop'),
  609.                             'image' => 'laptop-200x150.png',
  610.                             'href'  => $seoUrlHelper->link('category', ['path' => '56']),
  611.                         ], [
  612.                             'title' => $translator->trans('Gamer laptop'),
  613.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '62' ]),
  614.                             'image'  => 'gamer-laptop-200x150.png',
  615.                         ], [
  616.                             'title' => $translator->trans('Workstation laptop'),
  617.                             'image' => 'workstation-laptop-200x150.png',
  618.                             'href'  => $seoUrlHelper->link('category', ['path' => '112']),
  619.                         ], [
  620.                             'title' => $translator->trans('2in1 notebooks'),
  621.                             'image' => '2in1-notebooks-200x150.png',
  622.                             'href'  => $seoUrlHelper->link('category', ['path' => '240']),
  623.                         ], [
  624.                             'title' => $translator->trans('Desktop PC'),
  625.                             'image' => 'pc-set-200x150.png',
  626.                             'href'  => $seoUrlHelper->link('category', ['path' => '48']),
  627.                         ], [
  628.                             'title' => $translator->trans('Gamer PC'),
  629.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '48_55' ]),
  630.                             'image' => 'gamer-pc-200x150.png',
  631.                         ], [
  632.                             'title' => 'Chromebook',
  633.                             'href'  => $seoUrlHelper->link('category', ['path' => '243']),
  634.                             'image' => 'chromebook-quicklink.png',
  635.                         ], [
  636.                             'title' => $translator->trans('Tablet'),
  637.                             'image' => 'tablet-200x150.png',
  638.                             'href'  => $seoUrlHelper->link('category', ['path' => '268']),
  639.                         ], [
  640.                             'title' => $translator->trans('Parts only'),
  641.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  642.                             'image' => 'components-200x150.png',
  643.                         ], [
  644.                             'title' => $translator->trans('Discounted notebooks'),
  645.                             'image' => 'laptop-sale-200x150.png',
  646.                             'href'  => $seoUrlHelper->link('category', ['path' => '56', 'fd' => 1]),
  647.                         ], [
  648.                             'title' => $translator->trans('Bazaar'),
  649.                             'image' => 'bazar-200x150.png',
  650.                             'href'  => $seoUrlHelper->link('category', ['path' => '249']),
  651.                         ], [
  652.                             'title' => $translator->trans('wizard_home'),
  653.                             'image' => 'wizard_icon.svg',
  654.                             'href'  => '/wizard',
  655.                         ],
  656.                     ];
  657.                     break;
  658.                 case Domain::DOMAIN_ID_RT_CZ:
  659.                 case Domain::DOMAIN_ID_WS_CZ:
  660.                     $data['featuredCategories'] = [
  661.                         [
  662.                             'title' => $translator->trans('Laptops'),
  663.                             'image' => 'laptop-200x150.png',
  664.                             'href'  => $seoUrlHelper->link('category', ['path' => '130']),
  665.                         ], [
  666.                             'title' => $translator->trans('Gamer laptops'),
  667.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '136' ]),
  668.                             'image' => 'gamer-laptop-200x150.png',
  669.                         ], [
  670.                             'title' => $translator->trans('Workstation laptops'),
  671.                             'image' => 'workstation-laptop-200x150.png',
  672.                             'href'  => $seoUrlHelper->link('category', ['path' => '175']),
  673.                         ], [
  674.                             'title' => $translator->trans('2in1 notebooks'),
  675.                             'image' => '2in1-notebooks-200x150.png',
  676.                             'href'  => $seoUrlHelper->link('category', ['path' => '242']),
  677.                         ], [
  678.                             'title' => $translator->trans('Desktop PC'),
  679.                             'image' => 'pc-set-200x150.png',
  680.                             'href'  => $seoUrlHelper->link('category', ['path' => '122']),
  681.                         ], [
  682.                             'title' => $translator->trans('Gamer PCs'),
  683.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '129' ]),
  684.                             'image'  => 'gamer-pc-200x150.png',
  685.                         ], [
  686.                             'title' => 'Chromebook',
  687.                             'href'  => $seoUrlHelper->link('category', ['path' => '245']),
  688.                             'image' => 'chromebook-quicklink.png',
  689.                         ], [
  690.                             'title' => $translator->trans('Tablets'),
  691.                             'image' => 'tablet-200x150.png',
  692.                             'href'  => $seoUrlHelper->link('category', ['path' => '270']),
  693.                         ], [
  694.                             'title' => $translator->trans('Parts only'),
  695.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  696.                             'image' => 'components-200x150.png',
  697.                         ], [
  698.                             'title' => $translator->trans('Discounted notebooks'),
  699.                             'image' => 'laptop-sale-200x150.png',
  700.                             'href'  => $seoUrlHelper->link('category', ['path' => '130', 'fd' => 1]),
  701.                         ], [
  702.                             'title' => $translator->trans('Bazaar'),
  703.                             'image' => 'bazar-200x150.png',
  704.                             'href'  => $seoUrlHelper->link('category', ['path' => '251']),
  705.                         ], [
  706.                             'title' => $translator->trans('wizard_home'),
  707.                             'image' => 'wizard_icon.svg',
  708.                             'href'  => '/wizard',
  709.                         ],
  710.                     ];
  711.                     break;
  712.                 case Domain::DOMAIN_ID_RT_EU:
  713.                 case Domain::DOMAIN_ID_WS_EU:
  714.                     $data['featuredCategories'] = [
  715.                         [
  716.                             'title' => $translator->trans('Laptop'),
  717.                             'image' => 'laptop-200x150.png',
  718.                             'href'  => $seoUrlHelper->link('category', ['path' => '285']),
  719.                         ], [
  720.                             'title' => $translator->trans('Gaming laptop'),
  721.                             'href'  => $seoUrlHelper->link('category', [ 'path' => '291' ]),
  722.                             'image'  => 'gamer-laptop-200x150.png',
  723.                         ], [
  724.                             'title' => 'Workstation laptop',
  725.                             'image' => 'workstation-laptop-200x150.png',
  726.                             'href'  => $seoUrlHelper->link('category', ['path' => '346']),
  727.                         ], [
  728.                             'title' => $translator->trans('2 in 1 notebooks'),
  729.                             'image' => '2in1-notebooks-200x150.png',
  730.                             'href'  => $seoUrlHelper->link('category', ['path' => '352']),
  731.                         ], [
  732.                             'title' => $translator->trans('All in one computers'),
  733.                             'image' => 'all-in-one-pc-200x150.png',
  734.                             'href'  => $seoUrlHelper->link('category', ['path' => '310']),
  735.                         ], [
  736.                             'title' => $translator->trans('Desktop computers'),
  737.                             'image' => 'pc-set-200x150.png',
  738.                             'href'  => $seoUrlHelper->link('category', ['path' => '277']),
  739.                         ], [
  740.                             'title' => 'Mini PC',
  741.                             'href'  => $seoUrlHelper->link('category', ['path' => '323']),
  742.                             'image' => 'mini-pc-200x150.png',
  743.                         ], [
  744.                             'title' => $translator->trans('Monitor'),
  745.                             'image' => 'monitor-quicklink.png',
  746.                             'href'  => $seoUrlHelper->link('category', ['path' => '304']),
  747.                         ], [
  748.                             'title' => $translator->trans('Tablet'),
  749.                             'image' => 'tablet-200x150.png',
  750.                             'href'  => $seoUrlHelper->link('category', ['path' => '360']),
  751.                         ], [
  752.                             'title' => $translator->trans('Parts only'),
  753.                             'href'  => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
  754.                             'image' => 'components-200x150.png',
  755.                         ], [
  756.                             'title' => $translator->trans('Discounted notebooks'),
  757.                             'image' => 'laptop-sale-200x150.png',
  758.                             'href'  => $seoUrlHelper->link('category', ['path' => '285', 'fd' => 1]),
  759.                         ], [
  760.                             'title' => $translator->trans('wizard_home'),
  761.                             'image' => 'wizard_icon.svg',
  762.                             'href'  => '/wizard',
  763.                         ],
  764.                     ];
  765.                     break;
  766.                 default:
  767.                     $data['featuredCategories'] = [];
  768.             }
  769.             $featuredCategoriesCacheItem->set($data['featuredCategories']);
  770.             $featuredCategoriesCacheItem->expiresAfter($cacheLifetime);
  771.             $cache->save($featuredCategoriesCacheItem);
  772.         }
  773.         $data['banners'] = $this->getHeaderBanner($domain);
  774.         $data['smallBanners'] = $this->getSmallBanners($domain);
  775.         $data['lang'] = $language->getCode();
  776.         $data['header'] = $this->getHeader($request);
  777.         $data['footer'] = $this->getFooter($request);
  778.         $data['content_top'] = $this->getContentTop($request);
  779.         $data['content_bottom'] = $this->getContentBottom($request);
  780.         $data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
  781.         return $this->render('AtechNetCoreBundle/Homepage/partnerDashboard.html.twig', $data);
  782.     }
  783.     /**
  784.      * @Route("/bazar", name="bazar", defaults={"_locale":""})
  785.      * @Route("/bazaar", name="bazaar", defaults={"_locale":"en"})
  786.      * @Route("/{_locale<%supported_locales%>?}/bazaar", name="bazaar_locale", defaults={"_locale":""})
  787.      * 
  788.      * @todo refactor helpers as service
  789.      * 
  790.      * @param Request $request
  791.      * 
  792.      * @return Response
  793.      */
  794.     public function bazaarAction(Request $request, BazaarService $bazaarService, ProductService $productService): Response 
  795.     {
  796.         // Set Bazaar Flag
  797.         $request->getSession()->set('isBazaarPage', true);
  798.         /** @var MultiStore $multiStoreHelper */
  799.         $multiStoreHelper = $this->getMultiStoreHelper($request);
  800.         /** @var ProductHelper $productHelper */
  801.         $productHelper = $this->getProductHelper($request);
  802.         /** @var SeoUrlHelper $seoUrlHelper */
  803.         $seoUrlHelper = $this->url($request);
  804.         // Data
  805.         $data = $bazaarService->homepageData(
  806.             $multiStoreHelper, 
  807.             $productHelper, 
  808.             $seoUrlHelper
  809.         );
  810.         // Domain
  811.         $domain = $multiStoreHelper->getDomain();
  812.         // Language
  813.         $language = $multiStoreHelper->getLanguage();
  814.         // Additional Data
  815.         $data['precision'] = $domain->getPricePrecision();
  816.         $data['currency'] = $domain->getCurrency();
  817.         $data['warrantyYear'] = $productService->getWarrantyForNonProductText($domain->getId(), 'year', true);
  818.         $data['priceWarrantyDay'] = $productService->getWarrantyForNonProductText($domain->getId(), 'priceWarrantyDay', true);
  819.         // Common
  820.         $data['lang'] = $language->getCode();
  821.         $data['header'] = $this->getHeader($request);
  822.         $data['footer'] = $this->getFooter($request);
  823.         $data['content_top'] = $this->getContentTop($request);
  824.         $data['content_bottom'] = $this->getContentBottom($request);
  825.         $data['content_reviews'] = $this->getModuleHelper($request)->blockTestimonial('full', true);
  826.         $data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
  827.         return $this->render('AtechNetCoreBundle/Homepage/bazaar.html.twig', $data);
  828.     }
  829.     /**
  830.      * @Route("/contact", name="contact", defaults={"_locale":""})
  831.      * @Route("/{_locale<%supported_locales%>?}/contact", name="contact_locale", defaults={"_locale":""})
  832.      * @param Request $request
  833.      * @return Response
  834.      * @throws Exception
  835.      */
  836.     public function contactAction(Request $request)
  837.     {
  838.         $data = [];
  839.         $multiStore = $this->getMultiStoreHelper($request);
  840.         $domain = $multiStore->getDomain();
  841.         $translator = $this->getDatabaseTranslator($request);
  842.         $data['breadcrumbs'] = [];
  843.         $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  844.         $data['breadcrumbs'][] = [
  845.             'text' => $translator->trans('Contact'),
  846.             'href' => $this->generateUrl('contact'),
  847.         ];
  848.         $data['header'] = $this->getHeader($request);
  849.         $data['footer'] = $this->getFooter($request);
  850.         $data['contentBottom'] = $this->getContentBottom($request);
  851.         $data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domain->getId(), 'priceWarrantyDay');
  852.         $contactInfos = $this->getContactInfos();
  853.         $domainLanguageCode = $domain->getLanguage()->getCode();
  854.         $domainType = $domain->getType();
  855.         $data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_RETAIL;
  856.         $data['salesManager'] = [];
  857.         if (in_array($domain->getId(), [Domain::DOMAIN_ID_WS_SK, Domain::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
  858.             $data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_WHOLESALE;
  859.             $salesManager = $this->getLoginHelper($request)->getLoggedInCustomer()->getSalesManager();
  860.             $data['salesManager']['id'] = $salesManager->getId();
  861.             $data['salesManager']['name'] = $salesManager->getFirstName();
  862.             $data['salesManager']['username'] = $salesManager->getUsername();
  863.             $data['salesManager']['email'] = $salesManager->getEmail();
  864.             $data['salesManager']['phone'] = $domainLanguageCode != 'hu' ? $salesManager->getPhone() : $contactInfos['phone.webshop.' . $domainLanguageCode . '.' . $domainType];
  865.         } else if ($domain->getId() == Domain::DOMAIN_ID_WS_EU) {
  866.             $data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_WHOLESALE;
  867.             $salesManager = $this->getEntityManager()->getRepository(User::class)->findOneById(User::USER_ID_KATARINA_JOBBAGYOVA);
  868.             $data['salesManager']['id'] = $salesManager->getId();
  869.             $data['salesManager']['name'] = $salesManager->getFirstName();
  870.             $data['salesManager']['username'] = $salesManager->getUsername();
  871.             $data['salesManager']['email'] = $salesManager->getEmail();
  872.             $data['salesManager']['phone'] = $salesManager->getPhone();
  873.         }
  874.         switch ($domainLanguageCode) {
  875.             case 'sk':
  876.                 $data['return_policy_link'] = $this->url($request)->link('page', [
  877.                     'static_id' => 36,
  878.                 ]);
  879.                 break;
  880.             case 'hu':
  881.                 $data['return_policy_link'] = $this->url($request)->link('page', [
  882.                     'static_id' => 31,
  883.                 ]);
  884.                 break;
  885.             case 'cz':
  886.                 $data['return_policy_link'] = $this->url($request)->link('page', [
  887.                     'static_id' => 64,
  888.                 ]);
  889.                 break;
  890.             default:
  891.                 $data['return_policy_link'] = $this->url($request)->link('page', [
  892.                     'static_id' => 36,
  893.                 ]);
  894.         }
  895.         $data['webshop_email'] = $contactInfos['mail.webshop.' . $domainLanguageCode . '.' . $domainType];
  896.         $data['webshop_phone'] = $contactInfos['phone.webshop.' . $domainLanguageCode . '.' . $domainType];
  897.         $data['webshop_phone_trim'] = str_replace(' ', '', $data['webshop_phone']);
  898.         $data['warranty_email'] = $contactInfos['mail.warranty.' . $domainLanguageCode . '.' . $domainType];
  899.         $data['warranty_phone'] = $contactInfos['phone.warranty.' . $domainLanguageCode . '.' . $domainType];
  900.         $data['warranty_phone_trim'] = str_replace(' ', '', $data['warranty_phone']);
  901.         $data['company_name'] = $contactInfos['company.' . $domainLanguageCode . '.name'];
  902.         $data['company_street'] = $contactInfos['company.' . $domainLanguageCode . '.street'];
  903.         $data['company_city'] = $contactInfos['company.' . $domainLanguageCode . '.city'];
  904.         $data['company_zip'] = $contactInfos['company.' . $domainLanguageCode . '.zip'];
  905.         $data['company_country'] = $contactInfos['company.' . $domainLanguageCode . '.country'];
  906.         $data['company_id'] = $contactInfos['company.' . $domainLanguageCode . '.id'];
  907.         $data['company_vatId'] = $contactInfos['company.' . $domainLanguageCode . '.vatId'];
  908.         $data['company_bankAccount'] = $contactInfos['company.' . $domainLanguageCode . '.bankAccount'];
  909.         $data['company_iban'] = $contactInfos['company.' . $domainLanguageCode . '.iban'];
  910.         return $this->render('AtechNetCoreBundle/Page/contact.html.twig', $data);
  911.     }
  912.     /**
  913.      * @Route("/language/{locale}", name="set_locale")
  914.      * @param Request $request
  915.      * @param string $locale
  916.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  917.      */
  918.     public function setLocaleAction(Request $request, $locale)
  919.     {
  920.         if (!in_array($locale, Language::SWITCHABLE_LANGUAGE_CODES, true)) {
  921.             throw new InvalidParameterException();
  922.         }
  923.         $session = $request->getSession();
  924.         $oldLocale = $request->getLocale();
  925.         match ($locale) {
  926.             'en' => $session->set('languageId', Language::LANGUAGE_ID_EN),
  927.             'sk' => $session->set('languageId', Language::LANGUAGE_ID_SK),
  928.             'hu' => $session->set('languageId', Language::LANGUAGE_ID_HU),
  929.             'cz' => $session->set('languageId', Language::LANGUAGE_ID_CZ),
  930.         };
  931.         // Symfony locale
  932.         $session->set('_locale', $locale);
  933.         $request->setLocale($locale);
  934.         MultiStore::setLocalDomain($request);
  935.         if ($request->query->get('productId')) {
  936.             $redirect = $this->url($request)->link('product', [
  937.                 'product_id' => $request->query->get('productId'),
  938.             ]);
  939.             return $this->redirect($redirect);
  940.         } elseif ($request->query->get('categoryId')) {
  941.             $query = $request->query->all();
  942.             $categoryId = $request->query->get('categoryId');
  943.             if (isset($query['fa'])) {
  944.                 $filterAttribute = $query['fa'];
  945.                 unset($query['fa']);
  946.                 foreach ($filterAttribute as $attributeId => $values) {
  947.                     $query['fa[' . $attributeId . ']'] = $values;
  948.                 }
  949.             }
  950.             unset($query['categoryId']);
  951.             $redirect = $this->url($request)->link('category', array_merge([
  952.                 'path' => $categoryId,
  953.             ], $query));
  954.             return $this->redirect($redirect);
  955.         } elseif ($request->query->get('pageId')) {
  956.             $redirect = $this->url($request)->link('page', [
  957.                 'static_id' => $request->query->get('pageId'),
  958.             ]);
  959.             return $this->redirect($redirect);
  960.         } elseif ($request->query->get('blogId')) {
  961.             $redirect = $this->url($request)->link('blog', [
  962.                 'blog_id' => $request->query->get('blogId'),
  963.             ]);
  964.             return $this->redirect($redirect);
  965.         } elseif ($request->query->get('blogCategoryId')) {
  966.             $redirect = $this->url($request)->link('blog_category', [
  967.                 'blog_category_id' => $request->query->get('blogCategoryId'),
  968.             ]);
  969.             return $this->redirect($redirect);
  970.         } elseif ($request->query->get('slug')) {
  971.             $parts = explode('/', $request->query->get('slug'));
  972.             // Remove any empty arrays from trailing
  973.             if (mb_strlen(end($parts)) == 0) {
  974.                 array_pop($parts);
  975.             }
  976.             // Domain
  977.             $domainId = $request->getSession()->get('domainId');
  978.             // Default Language
  979.             $defaultLanguageId = $request->getSession()->get('defaultLanguageId');
  980.             // Remove Language
  981.             if (isset($parts[0])) {
  982.                 $language = $this->getEntityManager()->getRepository(Language::class)->findOneByCode($parts[0]);
  983.                 if ($language) {
  984.                     array_shift($parts);
  985.                 }
  986.             }
  987.             // Check Route
  988.             if (isset($parts[0]) && isset($parts[1])) {
  989.                 if ($parts[0] == 'product') {
  990.                     if ($parts[1] == 'search') {
  991.                         $query = $request->query->all();
  992.                         if (isset($query['fa'])) {
  993.                             $filterAttribute = $query['fa'];
  994.                             unset($query['fa']);
  995.                             foreach ($filterAttribute as $attributeId => $values) {
  996.                                 $query['fa[' . $attributeId . ']'] = $values;
  997.                             }
  998.                         }
  999.                         unset($query['slug']);
  1000.                         $redirect = $this->url($request)->link('search', $query);
  1001.                         return $this->redirect($redirect);
  1002.                     } else {
  1003.                         $redirect = $this->url($request)->link('product', [
  1004.                             'product_id' => $parts[1],
  1005.                         ]);
  1006.                         return $this->redirect($redirect);
  1007.                     }
  1008.                 } elseif ($parts[0] == 'category') {
  1009.                     $query = $request->query->all();
  1010.                     if (isset($query['fa'])) {
  1011.                         $filterAttribute = $query['fa'];
  1012.                         unset($query['fa']);
  1013.                         foreach ($filterAttribute as $attributeId => $values) {
  1014.                             $query['fa[' . $attributeId . ']'] = $values;
  1015.                         }
  1016.                     }
  1017.                     unset($query['slug']);
  1018.                     $redirect = $this->url($request)->link('category', array_merge([
  1019.                         'path' => $parts[1],
  1020.                     ], $query));
  1021.                     return $this->redirect($redirect);
  1022.                 } elseif ($parts[0] == 'page') {
  1023.                     $redirect = $this->url($request)->link('page', [
  1024.                         'static_id' => $parts[1],
  1025.                     ]);
  1026.                     return $this->redirect($redirect);
  1027.                 } elseif ($parts[0] == 'blog') {
  1028.                     if (isset($parts[2]) && $parts[2] == 'category') {
  1029.                         $redirect = $this->url($request)->link('blog_category', [
  1030.                             'blog_category_id' => $parts[1],
  1031.                         ]);
  1032.                         return $this->redirect($redirect);
  1033.                     } else {
  1034.                         $redirect = $this->url($request)->link('blog', [
  1035.                             'blog_id' => $parts[1],
  1036.                         ]);
  1037.                         return $this->redirect($redirect);
  1038.                     }
  1039.                 }
  1040.             }
  1041.             // Jump to last Part
  1042.             $lastPart = end($parts);
  1043.             $seo_url = $this->getEntityManager()->getRepository(SeoUrl::class)->findOneBy([
  1044.                 'keyword' => $lastPart,
  1045.                 'language' => $defaultLanguageId,
  1046.                 'domain' => [$domainId, null],
  1047.             ]);
  1048.             if ($seo_url) {
  1049.                 $url = explode('=', $seo_url->getQuery());
  1050.                 if ($url[0] == 'product_id') {
  1051.                     // Bazaar
  1052.                     $isBazaar = false;
  1053.                     if ( isset($parts[0]) && in_array($parts[0], [ 'bazar', 'bazaar' ]) ) {
  1054.                         $isBazaar = true;
  1055.                     }
  1056.                     $redirect = $this->url($request)->link('product', [
  1057.                         'product_id' => (int)$url[1], 
  1058.                         'isBazaar'   => $isBazaar
  1059.                     ]);
  1060.                     return $this->redirect($redirect);
  1061.                 } elseif ($url[0] == 'category_id') {
  1062.                     $query = $request->query->all();
  1063.                     if (isset($query['fa'])) {
  1064.                         $filterAttribute = $query['fa'];
  1065.                         unset($query['fa']);
  1066.                         foreach ($filterAttribute as $attributeId => $values) {
  1067.                             $query['fa[' . $attributeId . ']'] = $values;
  1068.                         }
  1069.                     }
  1070.                     $redirect = $this->url($request)->link('category', array_merge([
  1071.                         'path' => (int)$url[1],
  1072.                     ], $query));
  1073.                     return $this->redirect($redirect);
  1074.                 } elseif ($url[0] == 'static_id') {
  1075.                     $redirect = $this->url($request)->link('page', [
  1076.                         'static_id' => (int)$url[1],
  1077.                     ]);
  1078.                     return $this->redirect($redirect);
  1079.                 } elseif ($url[0] == 'blog_id') {
  1080.                     $redirect = $this->url($request)->link('blog', [
  1081.                         'blog_id' => (int)$url[1],
  1082.                     ]);
  1083.                     return $this->redirect($redirect);
  1084.                 } elseif ($url[0] == 'blog_category_id') {
  1085.                     $redirect = $this->url($request)->link('blog_category', [
  1086.                         'blog_category_id' => (int)$url[1],
  1087.                     ]);
  1088.                     return $this->redirect($redirect);
  1089.                 }
  1090.             }
  1091.         } elseif ($request->query->get('route')) {
  1092.             $route = str_replace($oldLocale, $locale, $request->query->get('route'));
  1093.             return $this->redirectToRoute($route);
  1094.         }
  1095.         return $this->redirectToRoute('homepage');
  1096.     }
  1097.     /**
  1098.      * @Route("/not-found", name="not_found", defaults={"_locale":""})
  1099.      * @Route("/{_locale<%supported_locales%>?}/not-found", name="not_found_locale", defaults={"_locale":""})
  1100.      * @param Request $request
  1101.      * @return Response
  1102.      */
  1103.     public function notFoundAction(Request $request)
  1104.     {
  1105.         if ($request->getPathInfo() == '/outsourcing') {
  1106.             return $this->redirect('https://pc.furbify.sk/outsourcing', 301);
  1107.         }
  1108.         $data = [];
  1109.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  1110.         $multiStore = $this->getMultiStoreHelper($request);
  1111.         $domainId = $multiStore->getDomain()->getId();
  1112.         $translator = $this->getTranslator();
  1113.         $data['header'] = $this->getHeader($request);
  1114.         $data['footer'] = $this->getFooter($request);
  1115.         if ($request->getSession()->get('blankPage') != null) {
  1116.             $request->getSession()->remove('blankPage');
  1117.             $data['blankPage'] = true;
  1118.         }
  1119.         $data['contentBottom'] = $this->getContentBottom($request);
  1120.         $data['breadcrumbs'] = [];
  1121.         $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  1122.         $data['breadcrumbs'][] = [
  1123.             'text' => $translator->trans('The page you requested was not found'),
  1124.             'href' => '',
  1125.         ];
  1126.         switch ($domainId) {
  1127.             case Domain::DOMAIN_ID_RT_SK:
  1128.             case Domain::DOMAIN_ID_WS_SK:
  1129.                 $data['category_link_notebook'] = $seoUrlHelper->link('category', [
  1130.                     'path' => 4,
  1131.                 ]);
  1132.                 $data['category_link_pc'] = $seoUrlHelper->link('category', [
  1133.                     'path' => 5,
  1134.                 ]);
  1135.                 $data['category_link_monitor'] = $seoUrlHelper->link('category', [
  1136.                     'path' => 6,
  1137.                 ]);
  1138.                 $data['category_link_parts'] = $seoUrlHelper->link('category', [
  1139.                     'path' => 7,
  1140.                 ]);
  1141.                 $data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
  1142.                     'path' => 84,
  1143.                 ]);
  1144.                 $data['blog_link'] = $seoUrlHelper->link('category', [
  1145.                     'path' => 3,
  1146.                 ]);
  1147.                 break;
  1148.             case Domain::DOMAIN_ID_RT_HU:
  1149.             case Domain::DOMAIN_ID_WS_HU:
  1150.                 $data['category_link_notebook'] = $seoUrlHelper->link('category', [
  1151.                     'path' => 56,
  1152.                 ]);
  1153.                 $data['category_link_pc'] = $seoUrlHelper->link('category', [
  1154.                     'path' => 48,
  1155.                 ]);
  1156.                 $data['category_link_monitor'] = $seoUrlHelper->link('category', [
  1157.                     'path' => 78,
  1158.                 ]);
  1159.                 $data['category_link_parts'] = $seoUrlHelper->link('category', [
  1160.                     'path' => 44,
  1161.                 ]);
  1162.                 $data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
  1163.                     'path' => 85,
  1164.                 ]);
  1165.                 $data['blog_link'] = $seoUrlHelper->link('category', [
  1166.                     'path' => 77,
  1167.                 ]);
  1168.                 break;
  1169.             case Domain::DOMAIN_ID_RT_CZ:
  1170.             case Domain::DOMAIN_ID_WS_CZ:
  1171.                 $data['category_link_notebook'] = $seoUrlHelper->link('category', [
  1172.                     'path' => 130,
  1173.                 ]);
  1174.                 $data['category_link_pc'] = $seoUrlHelper->link('category', [
  1175.                     'path' => 122,
  1176.                 ]);
  1177.                 $data['category_link_monitor'] = $seoUrlHelper->link('category', [
  1178.                     'path' => 149,
  1179.                 ]);
  1180.                 $data['category_link_parts'] = $seoUrlHelper->link('category', [
  1181.                     'path' => 118,
  1182.                 ]);
  1183.                 $data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
  1184.                     'path' => 155,
  1185.                 ]);
  1186.                 $data['blog_link'] = $seoUrlHelper->link('category', [
  1187.                     'path' => 169,
  1188.                 ]);
  1189.                 break;
  1190.             case Domain::DOMAIN_ID_RT_EU:
  1191.             case Domain::DOMAIN_ID_WS_EU:
  1192.                 $data['category_link_notebook'] = $seoUrlHelper->link('category', [
  1193.                     'path' => 285,
  1194.                 ]);
  1195.                 $data['category_link_pc'] = $seoUrlHelper->link('category', [
  1196.                     'path' => 277,
  1197.                 ]);
  1198.                 $data['category_link_monitor'] = $seoUrlHelper->link('category', [
  1199.                     'path' => 304,
  1200.                 ]);
  1201.                 $data['category_link_parts'] = $seoUrlHelper->link('category', [
  1202.                     'path' => 458,
  1203.                 ]);
  1204.                 $data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
  1205.                     'path' => 310,
  1206.                 ]);
  1207.                 $data['blog_link'] = $seoUrlHelper->link('category', [
  1208.                     'path' => 340,
  1209.                 ]);
  1210.                 break;
  1211.             default:
  1212.                 $data['category_link_notebook'] = $seoUrlHelper->link('category', [
  1213.                     'path' => 4,
  1214.                 ]);
  1215.                 $data['category_link_pc'] = $seoUrlHelper->link('category', [
  1216.                     'path' => 5,
  1217.                 ]);
  1218.                 $data['category_link_monitor'] = $seoUrlHelper->link('category', [
  1219.                     'path' => 6,
  1220.                 ]);
  1221.                 $data['category_link_parts'] = $seoUrlHelper->link('category', [
  1222.                     'path' => 7,
  1223.                 ]);
  1224.                 $data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
  1225.                     'path' => 84,
  1226.                 ]);
  1227.                 $data['blog_link'] = $seoUrlHelper->link('category', [
  1228.                     'path' => 3,
  1229.                 ]);
  1230.                 break;
  1231.         }
  1232.         $view = $this->renderView('AtechNetCoreBundle/Error/404.html.twig', $data);
  1233.         return new Response($view, 404);
  1234.     }
  1235.     /**
  1236.      * @Route("/error/exception", name="exception_page", defaults={"_locale":""})
  1237.      * @param Request $request
  1238.      */
  1239.     public function exceptionPageAction(Request $request)
  1240.     {
  1241.         $data = [];
  1242.         $multiStore = $this->getMultiStoreHelper($request);
  1243.         $domainId = $multiStore->getDomain()->getId();
  1244.         $translator = $this->getTranslator();
  1245.         $data['header'] = $this->getHeader($request);
  1246.         $data['footer'] = $this->getFooter($request);
  1247.         if ($request->getSession()->get('blankPage') != null) {
  1248.             $request->getSession()->remove('blankPage');
  1249.             $data['blankPage'] = true;
  1250.         }
  1251.         $view = $this->renderView('AtechNetCoreBundle/Error/exception.html.twig', $data);
  1252.         return new Response($view);
  1253.     }
  1254.     /**
  1255.      * @Route("/request-callback", name="request_callback", defaults={"_locale":""})
  1256.      * @Route("/{_locale<%supported_locales%>?}/request-callback", name="request_callback_locale", defaults={"_locale":""})
  1257.      * @param Request $request
  1258.      * @return JsonResponse
  1259.      * @throws Exception
  1260.      */
  1261.     public function requestCallbackAction(Request $request)
  1262.     {
  1263.         $phoneNumber = $request->request->get('phoneNumber') ?? false;
  1264.         $timeType = $request->request->get('timeType');
  1265.         $firstName = $request->request->get('firstName') ?? false;
  1266.         $customerId = $request->request->get('customerId') ?? false;
  1267.         $productId = $request->request->get('productId') ?? false;
  1268.         $captchaResponse = $request->get('gRecaptchaResponse');
  1269.         $captchaResult = $this->verifyGoogleCaptcha($captchaResponse);
  1270.         if ($captchaResult && $phoneNumber && !is_null($timeType) && $firstName) {
  1271.             $callBackData = [
  1272.                 'phoneNumber' => preg_replace("/[^0-9.]/", "", $phoneNumber),
  1273.                 'timeType' => strip_tags($timeType),
  1274.                 'firstName' => strip_tags($firstName),
  1275.                 'host' => $request->getHost(),
  1276.                 'locale' => $request->getLocale(),
  1277.             ];
  1278.             $entityManager = $this->getEntityManager();
  1279.             $customerRepo = $entityManager->getRepository(Customer::class);
  1280.             $multistoreHelper = $this->getMultiStoreHelper($request);
  1281.             $callBackData['domain'] = $multistoreHelper->getDomain();
  1282.             $entityManager = $this->getEntityManager();
  1283.             $callBackData['customer'] = $customerId > 0 ? $entityManager->getRepository(Customer::class)->findOneById($customerId) : null;
  1284.             $callBackData['product'] = $productId > 0 ? $entityManager->getRepository(Product::class)->findOneById($productId) : null;
  1285.             $callbackEntity = $customerRepo->createCustomerCallback($callBackData);
  1286.             $entityManager->persist($callbackEntity);
  1287.             $entityManager->flush();
  1288.             $callBackData['id'] = $callbackEntity->getId();
  1289.             $translator = $this->getTranslator();
  1290.             $response = $customerRepo->sendCallbackEmailToSalesManager($translator, $callBackData, $this->getMailer(), $this->getLoginHelper($request)->getLoggedInCustomer());
  1291.         }
  1292.         return new JsonResponse($response);
  1293.     }
  1294.     /**
  1295.      * @Route("/init-cetelem-sk", name="init_cetelem_sk")
  1296.      * @param Request $request
  1297.      * @return false|null|string
  1298.      */
  1299.     public function initCetelemSkAction(Request $request)
  1300.     {
  1301.         $response = null;
  1302.         if (!is_null($request->request->get('price'))) {
  1303.             $price = (float)$request->request->get('price');
  1304.             $cetelemCalculator = $this->getCetelemHelperSK();
  1305.             $response = $cetelemCalculator->getCalculatorView([
  1306.                 'cenaTovaru' => $price,
  1307.             ]);
  1308.         }
  1309.         return new Response($response);
  1310.     }
  1311.     /**
  1312.      * @Route("/recalculate-cetelem-sk", name="recalculate_cetelem_sk")
  1313.      * @param Request $request
  1314.      * @return Response
  1315.      */
  1316.     public function reCalculateCetelemSkAction(Request $request)
  1317.     {
  1318.         $calculatorView = '';
  1319.         $req = $request->request;
  1320.         $cetelemRequest['cenaTovaru'] = (float)$req->get('cenaTovaru');
  1321.         if (!is_null($req->get('kodBaremu')) && $req->get('kodBaremu') != ''
  1322.             && !is_null($req->get('kodPoistenia')) && $req->get('kodPoistenia') != ''
  1323.             && !is_null($req->get('kodMaterialu')) && $req->get('kodMaterialu') != ''
  1324.             && !is_null($req->get('priamaPlatba')) && $req->get('priamaPlatba') != ''
  1325.             && !is_null($req->get('pocetSplatok')) && $req->get('pocetSplatok') != ''
  1326.             && !is_null($req->get('odklad')) && $req->get('odklad') != '') {
  1327.             $cetelemRequest['kodBaremu'] = $req->get('kodBaremu');
  1328.             $cetelemRequest['kodPoistenia'] = $req->get('kodPoistenia');
  1329.             $cetelemRequest['kodMaterialu'] = $req->get('kodMaterialu');
  1330.             $cetelemRequest['priamaPlatba'] = $req->get('priamaPlatba');
  1331.             $cetelemRequest['pocetSplatok'] = $req->get('pocetSplatok');
  1332.             $cetelemRequest['odklad'] = $req->get('odklad');
  1333.             $cetelem = $this->getCetelemHelperSK();
  1334.             $calculatorView = $cetelem->getCalculatorView($cetelemRequest);
  1335.             if (is_array($calculatorView) && $cetelem->isDebugActive()) {
  1336.                 var_dump($calculatorView);
  1337.             }
  1338.         }
  1339.         return new Response($calculatorView);
  1340.     }
  1341.     /**
  1342.      * @Route("/sitemap.xml", name="regenerate_sitemaps")
  1343.      * @param Request $request
  1344.      * @return Response
  1345.      * @throws Exception
  1346.      */
  1347.     public function sitemapAction(Request $request): Response
  1348.     {
  1349.         $multistoreHelper = $this->getMultiStoreHelper($request);
  1350.         $entityManager = $this->getEntityManager();
  1351.         $domain = $multistoreHelper->getDomain();
  1352.         $language = $domain->getLanguage();
  1353.         $translator = $this->getDatabaseTranslator($request);
  1354.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  1355.         // Domain TLD
  1356.         $domainTLD = $language->getCode();
  1357.         if ($domainTLD == 'en') {
  1358.             $domainTLD = 'eu';
  1359.         }
  1360.         $urls = [];
  1361.         $urls[] = $homepage = 'https://www.furbify.' . $domainTLD;
  1362.         $urls[] = $homepage . $this->generateUrl('contact');
  1363.         switch ($domain->getLanguage()->getCode()) {
  1364.             case 'sk':
  1365.                 $urls[] = "$homepage/hodnotenia-zakaznikov";
  1366.                 break;
  1367.             case 'hu':
  1368.                 $urls[] = "$homepage/vasarloi-velemenyek";
  1369.                 break;
  1370.             case 'cz':
  1371.                 $urls[] = "$homepage/hodnoceni-zakaznikov";
  1372.                 break;
  1373.             case 'en':
  1374.                 $urls[] = "$homepage/reviews";
  1375.                 break;
  1376.         }
  1377.         $excludeStaticPages = [
  1378.             7, 24, // Resellers
  1379.             9, 25, // ESET
  1380.         ];
  1381.         // static pages
  1382.         $staticPages = $entityManager->createQuery("SELECT sp
  1383.               FROM AtechNetCoreBundle:StaticPage sp
  1384.               WHERE sp.domain = :domain AND sp.published = :published AND sp.indexable = :indexable AND sp.id NOT IN (" . implode(',', $excludeStaticPages) . ")")
  1385.             ->setParameters([
  1386.                 'domain' => $domain,
  1387.                 'published' => true,
  1388.                 'indexable' => true,
  1389.             ])
  1390.             ->getResult();
  1391.         foreach ($staticPages as $staticPage) {
  1392.             $urls[] = $homepage . '/' . $staticPage->getMetaByLanguage($language)->getLink();
  1393.         }
  1394.         // blog
  1395.         $urls[] = $homepage . $this->generateUrl('blog_main');
  1396.         // blog posts
  1397.         $blogPages = $entityManager->getRepository(BlogPage::class)->findBy([
  1398.             'domain' => $domain,
  1399.             'published' => true,
  1400.             'indexable' => true,
  1401.         ]);
  1402.         foreach ($blogPages as $blogPage) {
  1403.             $blogCategoryId = $blogPage->getCategoryPage() && $blogPage->getCategoryPage()->getId() > 0 ? $blogPage->getCategoryPage()->getId() : $multistoreHelper->getBlogCategoryIdByDomainId($domain->getId());
  1404.             $urls[] = $this->url($request)->link('blog', [
  1405.                 'blog_category_id' => $blogCategoryId,
  1406.                 'blog_id' => $blogPage->getId(),
  1407.             ]);
  1408.         }
  1409.         // product categories
  1410.         $productCategories = $entityManager->getRepository(CategoryPage::class)->findBy([
  1411.             'domain' => $domain,
  1412.             'published' => true,
  1413.             'indexable' => true,
  1414.             'type' => CategoryPage::CATEGORY_TYPE_PRODUCT,
  1415.         ]);
  1416.         /**
  1417.          * @var CategoryPage $productCategory
  1418.          */
  1419.         foreach ($productCategories as $productCategory) {
  1420.             $urls[] = $homepage . (!is_null($productCategory->getParentCategory()) ? '/' . $productCategory->getParentCategory()->getMetaByLanguage($language)->getLink() : '') . '/' . $productCategory->getMetaByLanguage($language)->getLink();
  1421.         }
  1422.         $excludeProducts = [
  1423.             2493,
  1424.             8521,
  1425.             7316,
  1426.             7317,
  1427.         ];
  1428.         // products
  1429.         $products = $entityManager->createQuery("SELECT p.code, v.name AS vendor, pt.title AS productType, p.name AS title
  1430.               FROM AtechNetCoreBundle:ProductMeta pm
  1431.               LEFT JOIN pm.product p
  1432.               LEFT JOIN p.type pt
  1433.               LEFT JOIN p.vendor v
  1434.               WHERE p.available > 0 AND pm.product = p.id AND pm.domain = " . $domain->getId() . " AND pm.active = 1 AND pm.orderable = 1 AND p.id NOT IN (" . implode(',', $excludeProducts) . ")")
  1435.             ->getResult();
  1436.         foreach ($products as $product) {
  1437.             $urls[] = $homepage . '/' . $seoUrlHelper->slug($translator->trans($product['productType']) . ($product['vendor'] != 'VARIOUS' ? ' ' . $product['vendor'] : '') . ' ' . $product['title'] . ' ' . $product['code']);
  1438.         }
  1439.         $xml = '<?xml version="1.0" encoding="UTF-8"?>
  1440.             <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
  1441.         foreach ($urls as $url) {
  1442.             $xml .= '<url><loc>' . $url . '</loc></url>';
  1443.         }
  1444.         $xml .= '</urlset>';
  1445.         $response = new Response($xml);
  1446.         $response->headers->set('Content-Type', 'xml');
  1447.         return $response;
  1448.     }
  1449.     /**
  1450.      * @Route("/site.webmanifest", name="regenerate_webmanifests")
  1451.      * @param Request $request
  1452.      * @return JsonResponse
  1453.      * @throws Exception
  1454.      */
  1455.     public function webmanifestAction(Request $request): JsonResponse
  1456.     {
  1457.         $translator = $this->getTranslator();
  1458.         $response = new JsonResponse([
  1459.             'name' => $translator->trans('default page title'),
  1460.             'short_name' => 'furbify',
  1461.             'icons' => [
  1462.                 'src' => '/android-chrome-96x96.png',
  1463.                 'sizes' => '96x96',
  1464.                 'type' => 'image/png',
  1465.             ],
  1466.             'theme_color' => '#ffffff',
  1467.             'background_color' => '#ffffff',
  1468.             'display' => 'standalone',
  1469.         ]);
  1470.         $response->headers->set('Content-Type', 'application/manifest+json');
  1471.         return $response;
  1472.     }
  1473.     /**
  1474.      * @Route("/robots.txt", name="robots")
  1475.      * @param Request $request
  1476.      * @return Response
  1477.      */
  1478.     public function robotsAction(Request $request): Response
  1479.     {
  1480.         // MultiStore
  1481.         $multiStore = $this->getMultiStoreHelper($request);
  1482.         // Domain TLD
  1483.         $domainTLD = $multiStore->getDefaultLocale();
  1484.         if ($domainTLD == 'en') {
  1485.             $domainTLD = 'eu';
  1486.         }
  1487.         $txt = 'User-agent: *
  1488. Disallow: /hu/
  1489. Disallow: /sk/
  1490. Disallow: /cz/
  1491. Disallow: /en/
  1492. Sitemap: https://www.furbify.' . $domainTLD . '/sitemap.xml';
  1493.         $response = new Response($txt);
  1494.         $response->headers->set('Content-Type', 'text/plain');
  1495.         return $response;
  1496.     }
  1497.     /**
  1498.      * @Route("/heureka.xml", name="heureka_feed")
  1499.      * @param Request $request
  1500.      * @return Response
  1501.      * @throws Exception
  1502.      */
  1503.     public function heurekaFeedAction(Request $request): Response
  1504.     {
  1505.         $translator = $this->getDatabaseTranslator($request);
  1506.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  1507.         $vat = $domain->getVat();
  1508.         $languageCode = $domain->getLanguage()->getCode();
  1509.         $cache = $this->cache;
  1510.         $cacheKey = 'heureka.' . $domain->getId() . '.v7';
  1511.         $heurekaCacheItem = $cache->getItem($cacheKey);
  1512.         if ($heurekaCacheItem->isHit()) {
  1513.             $xmlData = $heurekaCacheItem->get();
  1514.         } else {
  1515.             $xml = '<?xml version="1.0" encoding="utf-8" ?><SHOP>';
  1516.             $products = $this->getEntityManager()
  1517.                 ->createQuery("SELECT p
  1518.                     FROM AtechNetCoreBundle:Product p
  1519.                     WHERE p.archived = 0 AND p.available > 0 AND p.qualityStatus IN (" . Product::QualityStatus_Platinum . " ," . Product::QualityStatus_New . ")")
  1520.                 ->getResult();
  1521.             $entityManager = $this->getEntityManager();
  1522.             $shippingMethods = $entityManager->getRepository(DomainShippingType::class)->findBy([
  1523.                 'domain' => $domain->getId(),
  1524.                 'activeOnWeb' => true,
  1525.             ], [
  1526.                 'sortIndex' => 'ASC',
  1527.             ]);
  1528.             $cashOndeliveryPrice = $entityManager->getRepository(DomainPaymentType::class)->findOneBy([
  1529.                 'domain' => $domain->getId(),
  1530.                 'activeOnWeb' => true,
  1531.                 'type' => PaymentType::CashOnDelivery->value,
  1532.             ])->getPrice();
  1533.             $deliveryTags = '';
  1534.             foreach ($shippingMethods as $shippingMethod) {
  1535.                 // Shipping Cost
  1536.                 $shippingPrice = $shippingMethod->getPrice();
  1537.                 // Round Shipping Cost
  1538.                 if (in_array($domain->getId(), [Domain::DOMAIN_ID_RT_HU, Domain::DOMAIN_ID_WS_HU])) {
  1539.                     $shippingPrice = number_format($shippingPrice, 0, '.', '');
  1540.                 }
  1541.                 $DELIVERY_ID = '';
  1542.                 switch ($shippingMethod->getType()) {
  1543.                     case DomainShippingType::SHIPPING_TYPE_CARRIER_EXPRESS_ID:
  1544.                         $DELIVERY_ID = 'GLS';
  1545.                         break;
  1546.                     case DomainShippingType::ShippingType_Carrier_Id:
  1547.                         $DELIVERY_ID = 'DHL';
  1548.                         break;
  1549.                     case DomainShippingType::ShippingType_PICKUP_POINT_Id:
  1550.                         $DELIVERY_ID = 'GLS_PARCELLOCKER';
  1551.                         break;
  1552.                     case DomainShippingType::SHIPPING_TYPE_PACKETA_PICKUP_POINT_ID:
  1553.                         $DELIVERY_ID = 'Z_BOX';
  1554.                         break;
  1555.                 }
  1556.                 $DELIVERY_PRICE_COD = $shippingPrice + $cashOndeliveryPrice;
  1557.                 if ($DELIVERY_ID != '') {
  1558.                     $deliveryTags .= "<DELIVERY>
  1559.                                         <DELIVERY_ID>$DELIVERY_ID</DELIVERY_ID>
  1560.                                         <DELIVERY_PRICE>$shippingPrice</DELIVERY_PRICE>
  1561.                                         <DELIVERY_PRICE_COD>$DELIVERY_PRICE_COD</DELIVERY_PRICE_COD>
  1562.                                     </DELIVERY>";
  1563.                 }
  1564.             }
  1565.             foreach ($products as $product) {
  1566.                 $product_meta = $product->getDomainMeta($domain);
  1567.                 if ($product_meta === false || $product->getType()->getId() == 82) {
  1568.                     continue;
  1569.                 }
  1570.                 if (!$product->isAvailable()
  1571.                     || !$product_meta->isActive()
  1572.                     || !$product_meta->isReady()) {
  1573.                     continue;
  1574.                 }
  1575.                 $price = $product_meta->isDiscounted() ? $product_meta->getDomainVatDiscount() : $product_meta->getDomainVatPrice();
  1576.                 $thumb = '';
  1577.                 $photos = $product->getAlbum()->getPhotos();
  1578.                 if (count($photos) > 0) {
  1579.                     $photos = Collections::sort($photos, false);
  1580.                     $photo = $photos[array_keys($photos)[0]];
  1581.                     if (is_object($photo)) {
  1582.                         $thumb = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  1583.                     }
  1584.                 } elseif (isset($_GET['debug'])) {
  1585.                     echo sprintf(
  1586.                         '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  1587.                         "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  1588.                         $product->getCode()
  1589.                     );
  1590.                 }
  1591.                 $ean = $product->getEAN();
  1592.                 $exp_name = explode(' ', $product->getFullTitle($translator));
  1593.                 $categorytext = trim($product->getType()->getTitle());
  1594.                 switch (mb_strtolower($categorytext)) {
  1595.                     case 'software':
  1596.                         if (in_array('Office', $exp_name)) {
  1597.                             $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Software | Kancelárske aplikácie';
  1598.                         }
  1599.                         if (in_array('Windows', $exp_name)) {
  1600.                             $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Software | Operačné systémy';
  1601.                         }
  1602.                         break;
  1603.                     case 'notebook':
  1604.                     case 'notebook 2 in 1':
  1605.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Notebooky';
  1606.                         break;
  1607.                     case 'monitor':
  1608.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Monitory';
  1609.                         break;
  1610.                     case 'pc':
  1611.                     case 'pc set':
  1612.                     case 'all in one':
  1613.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Stolné počítače';
  1614.                         break;
  1615.                     case 'tablet':
  1616.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tablety';
  1617.                         break;
  1618.                     case 'mouse':
  1619.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Myši';
  1620.                         break;
  1621.                     case 'keyboard':
  1622.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Klávesnice';
  1623.                         break;
  1624.                     case 'interactive accessory':
  1625.                     case 'reduction':
  1626.                     case 'cable video':
  1627.                     case 'cable hdmi':
  1628.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | VGA, DVI, HDMI káble';
  1629.                         break;
  1630.                     case 'cable data':
  1631.                     case 'pc accessory':
  1632.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | Dátové prepínače';
  1633.                         break;
  1634.                     case 'power bank':
  1635.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Batérie | Powerbanky';
  1636.                         break;
  1637.                     case 'card reader':
  1638.                     case 'usb card reader':
  1639.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Čítačky pamäťových kariet';
  1640.                         break;
  1641.                     case 'headphones':
  1642.                     case 'headset':
  1643.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Slúchadlá';
  1644.                         break;
  1645.                     case 'toner':
  1646.                     case 'cartridge':
  1647.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Náplne a tonery - kompatibilné';
  1648.                         break;
  1649.                     case 'notebook battery':
  1650.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Batérie do notebookov - originálne';
  1651.                         break;
  1652.                     case 'ssd':
  1653.                     case 'hdd 3,5"':
  1654.                     case 'hdd 2,5"':
  1655.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Pevné disky';
  1656.                         break;
  1657.                     case 'motherboard':
  1658.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Základné dosky';
  1659.                         break;
  1660.                     case 'webcam':
  1661.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Webkamery';
  1662.                         break;
  1663.                     case 'ram pc':
  1664.                     case 'ram nb':
  1665.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Pamäte';
  1666.                         break;
  1667.                     case 'odd pc':
  1668.                     case 'odd nb':
  1669.                     case 'usb other':
  1670.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Mechaniky';
  1671.                         break;
  1672.                     case 'usb wifi':
  1673.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Sieťové prvky | WiFi antény';
  1674.                         break;
  1675.                     case 'docking station':
  1676.                     case 'usb bluetooth':
  1677.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Dokovacie stanice a replikátory portov';
  1678.                         break;
  1679.                     case 'notebook display':
  1680.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Displeje pre notebooky';
  1681.                         break;
  1682.                     case 'vga':
  1683.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Grafické karty';
  1684.                         break;
  1685.                     case 'notebook bag':
  1686.                     case 'notebook backpack':
  1687.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Brašny a batohy pre notebooky';
  1688.                         break;
  1689.                     case 'cleaning pc/nb':
  1690.                         $categorytext = 'Heureka.' . $languageCode . ' | Dom a záhrada | Domácnosť | Čistiace prostriedky pre domácnosť | Prípravky na čistenie | Čistiace prostriedky na spotrebiče';
  1691.                         break;
  1692.                     case 'notebook keyboard':
  1693.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Náhradné klávesnice pre notebooky';
  1694.                         break;
  1695.                     case 'notebook bay':
  1696.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Podložky a stojany k notebookom';
  1697.                         break;
  1698.                     case 'speaker':
  1699.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Reprosústavy a reproduktory';
  1700.                         break;
  1701.                     case 'hdd adapter':
  1702.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Výmenné kity a boxy';
  1703.                         break;
  1704.                     case 'power supply':
  1705.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Zdroje';
  1706.                         break;
  1707.                     case 'battery':
  1708.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Batérie | Batérie primárne';
  1709.                         break;
  1710.                     case 'notebook cooler':
  1711.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Chladenie';
  1712.                         break;
  1713.                     case 'usb hub':
  1714.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | USB huby';
  1715.                         break;
  1716.                     case 'usb ethernet':
  1717.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Sieťové karty';
  1718.                         break;
  1719.                     case 'microphone':
  1720.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Mikrofóny';
  1721.                         break;
  1722.                     case 'printer drum':
  1723.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Zobrazovacie valce';
  1724.                         break;
  1725.                     case 'surge arrest':
  1726.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Záložné zdroje | Prepäťové ochrany';
  1727.                         break;
  1728.                     case 'projector':
  1729.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Projekčná technika | Projektory';
  1730.                         break;
  1731.                     case 'case pc':
  1732.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | PC skrinky';
  1733.                         break;
  1734.                     case 'mouse pad':
  1735.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Podložky pod myš';
  1736.                         break;
  1737.                     case 'power adapter':
  1738.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | AC adaptéry - originálne';
  1739.                         break;
  1740.                     case 'projector accessory':
  1741.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Projekčná technika | Držiaky k projektorom';
  1742.                         break;
  1743.                     case 'cpu':
  1744.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Procesory';
  1745.                         break;
  1746.                     case 'sound card':
  1747.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Zvukové karty';
  1748.                         break;
  1749.                     case 'cable usb':
  1750.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | USB káble';
  1751.                         break;
  1752.                     case 'pci express card':
  1753.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Radiče';
  1754.                         break;
  1755.                     case 'printer':
  1756.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Tlačiarne';
  1757.                         break;
  1758.                     case 'microsd card':
  1759.                     case 'sd card':
  1760.                     case 'flash card':
  1761.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Pamäťové karty';
  1762.                         break;
  1763.                     case 'smartphone':
  1764.                     case 'phone':
  1765.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Mobily, GPS | Mobilné telefóny';
  1766.                         break;
  1767.                     case 'smartwatch':
  1768.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Mobily, GPS | Wearables | Inteligentné hodinky';
  1769.                         break;
  1770.                     case 'monitor stand':
  1771.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | TV a video príslušenstvo | Držiaky a stojany na TV a monitory';
  1772.                         break;
  1773.                     case 'usb flash':
  1774.                         $categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | USB flash disky';
  1775.                         break;
  1776.                     default:
  1777.                         $categorytext = 'do not include';
  1778.                 }
  1779.                 if ($categorytext == 'do not include') {
  1780.                     continue;
  1781.                 }
  1782.                 $itemType = in_array($product->getQualityStatus(), [Product::QualityStatus_Platinum, Product::QualityStatus_New]) ? '' : '<ITEM_TYPE>bazar</ITEM_TYPE>';
  1783.                 $category = $product->getType()->getTitle($translator);
  1784.                 $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  1785.                 $productName = $product->getName();
  1786.                 $productCode = $product->getCode();
  1787.                 $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  1788.                 $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  1789.                 if ($productCode == '1460061') {
  1790.                     $description = 'Biela bezdrôtová mýš, 1000/1600 dpi';
  1791.                 } else {
  1792.                     $description = strip_tags($product->getDescription());
  1793.                 }
  1794.                 $defaultProductName = ($vendor != '' ? $vendor . ' ' : '') . $product->getName();
  1795.                 $productName = $product->getExternalFeedNameByLanguage($domain->getLanguage()) ? $product->getExternalFeedNameByLanguage($domain->getLanguage())->getName() : $defaultProductName;
  1796.                 $xml .= "<SHOPITEM>
  1797.                     <ITEM_ID>" . $product->getId() . "</ITEM_ID>
  1798.                     <PRODUCTNAME><![CDATA[$productName]]></PRODUCTNAME>
  1799.                     <PRODUCT><![CDATA[" . ($vendor != '' ? $vendor . ' ' : '') . $product->getName() . "]]></PRODUCT>
  1800.                     <DESCRIPTION><![CDATA[$description]]></DESCRIPTION>
  1801.                     <URL>https://www.furbify.sk/$link</URL>
  1802.                     <EAN>$ean</EAN>
  1803.                     <IMGURL>$thumb</IMGURL>
  1804.                     <PRICE>" . round($price / 1.2, 2) . "</PRICE>
  1805.                     <PRICE_VAT>$price</PRICE_VAT>
  1806.                     <VAT>$vat%</VAT>
  1807.                     <MANUFACTURER><![CDATA[$vendor]]></MANUFACTURER>
  1808.                     <DELIVERY_DATE>" . ($product->getAvailable() > 0 ? 0 : '') . "</DELIVERY_DATE>
  1809.                     $deliveryTags
  1810.                     <CATEGORYTEXT>" . trim($categorytext) . "</CATEGORYTEXT>
  1811.                     $itemType
  1812.                 </SHOPITEM>";
  1813.             }
  1814.             $xml .= '</SHOP>';
  1815.             $entityManager = $this->getEntityManager();
  1816.             $entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_HEUREKA);
  1817.             $xmlData = $xml;
  1818.             $heurekaCacheItem->set($xml);
  1819.             $heurekaCacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
  1820.             $cache->save($heurekaCacheItem);
  1821.         }
  1822.         $response = new Response($xmlData);
  1823.         $response->headers->set('Content-Type', 'xml');
  1824.         return $response;
  1825.     }
  1826.     /**
  1827.      * @Route("/zbozi.xml", name="zbozi_cz_feed")
  1828.      * @param Request $request
  1829.      * @return Response
  1830.      * @throws Exception
  1831.      */
  1832.     public function zboziFeedAction(Request $request): Response
  1833.     {
  1834.         $translator = $this->getDatabaseTranslator($request);
  1835.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  1836.         $serviceTranslator = $this->getTranslator();
  1837.         if (!$request->get('token') || $request->get('token') != "a192ab15f83a16a07c34a71f9379c0ea" || $domain->getLanguage()->getCode() != 'cz') {
  1838.             return $this->redirectToRoute('homepage');
  1839.         }
  1840.         $cache = $this->cache;
  1841.         $zboziCacheKey = 'zbozi.cz.products.v2';
  1842.         $zboziCacheItem = $cache->getItem($zboziCacheKey);
  1843.         if ($zboziCacheItem->isHit()) {
  1844.             $xml = $zboziCacheItem->get();
  1845.         } else {
  1846.             $xml = '<?xml version="1.0" encoding="utf-8" ?><SHOP xmlns="http://www.zbozi.cz/ns/offer/1.0">';
  1847.             $products = $this->getEntityManager()
  1848.                 ->createQuery("SELECT p
  1849.                     FROM AtechNetCoreBundle:Product p
  1850.                     LEFT JOIN p.metas pm
  1851.                     LEFT JOIN p.type pt
  1852.                     WHERE p.archived = 0 AND p.available > 0 AND IDENTITY(pm.domain) = " . Domain::DOMAIN_ID_RT_CZ . " AND pm.active = 1 AND pm.orderable = 1 AND pt.id NOT IN (" . ProductType::PRODUCT_TYPE_ID_SOFTWARE . ", " . ProductType::PRODUCT_TYPE_ID_SERVICE . ")")
  1853.                 ->getResult();
  1854.             $shippingMethodPrice = CartHelper::getShippingMethodWithHighestPriceForDomain($domain, $this->getEntityManager());
  1855.             $cashOnDeliveryPrice = $this->getEntityManager()->getRepository(DomainPaymentType::class)->findOneBy([
  1856.                 'domain' => $domain->getId(),
  1857.                 'type' => PaymentType::CashOnDelivery->value,
  1858.             ])->getPrice();
  1859.             foreach ($products as $product) {
  1860.                 $productMeta = $product->getDomainMeta($domain);
  1861.                 $categorytext = trim($product->getType()->getTitle());
  1862.                 switch (mb_strtolower($categorytext)) {
  1863.                     case 'notebook':
  1864.                         $categorytext = 'Počítače | Notebooky';
  1865.                         break;
  1866.                     case 'monitor':
  1867.                         $categorytext = 'Počítače | Počítačové příslušenství | Monitory';
  1868.                         break;
  1869.                     case 'pc':
  1870.                     case 'pc set':
  1871.                     case 'all in one':
  1872.                         $categorytext = 'Počítače | Stolní počítače';
  1873.                         break;
  1874.                     case 'tablet':
  1875.                         $categorytext = 'Počítače | Tablety';
  1876.                         break;
  1877.                     case 'mouse':
  1878.                         $categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Myši';
  1879.                         break;
  1880.                     case 'keyboard':
  1881.                         $categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Klávesnice';
  1882.                         break;
  1883.                     case 'interactive accessory':
  1884.                     case 'reduction':
  1885.                     case 'cable video':
  1886.                     case 'cable hdmi':
  1887.                         $categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | Video kabely';
  1888.                         break;
  1889.                     case 'cable data':
  1890.                     case 'pc accessory':
  1891.                         $categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | USB kabely';
  1892.                         break;
  1893.                     case 'power bank':
  1894.                         $categorytext = 'Elektronika | Baterie a nabíjení | Baterie a akumulátory | Powerbanky';
  1895.                         break;
  1896.                     case 'card reader':
  1897.                     case 'usb card reader':
  1898.                         $categorytext = 'Počítače | Ukládání dat | Příslušenství pro datové nosiče | Čtečky paměťových karet';
  1899.                         break;
  1900.                     case 'headphones':
  1901.                     case 'headset':
  1902.                         $categorytext = 'Elektronika | TV a audio-video | Audio | Sluchátka';
  1903.                         break;
  1904.                     case 'toner':
  1905.                     case 'cartridge':
  1906.                         $categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Náplně a tonery';
  1907.                         break;
  1908.                     case 'notebook battery':
  1909.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Baterie k notebookům';
  1910.                         break;
  1911.                     case 'ssd':
  1912.                         $categorytext = 'Počítače | Ukládání dat | Pevné disky | SSD disky';
  1913.                         break;
  1914.                     case 'hdd 3,5"':
  1915.                     case 'hdd 2,5"':
  1916.                         $categorytext = 'Počítače | Ukládání dat | Pevné disky | Interní pevné disky';
  1917.                         break;
  1918.                     case 'motherboard':
  1919.                         $categorytext = 'Počítače | Počítačové komponenty | Základní desky';
  1920.                         break;
  1921.                     case 'webcam':
  1922.                         $categorytext = 'Počítače | Počítačové příslušenství | Webkamery';
  1923.                         break;
  1924.                     case 'ram pc':
  1925.                     case 'ram nb':
  1926.                         $categorytext = 'Počítače | Počítačové komponenty | Operační paměti';
  1927.                         break;
  1928.                     case 'odd pc':
  1929.                     case 'odd nb':
  1930.                     case 'usb other':
  1931.                         $categorytext = 'Počítače | Počítačové komponenty | Mechaniky';
  1932.                         break;
  1933.                     case 'usb wifi':
  1934.                         $categorytext = 'Počítače | Počítačové příslušenství | Síťové prvky | Wi-Fi a Bluetooth adaptéry';
  1935.                         break;
  1936.                     case 'docking station':
  1937.                     case 'usb bluetooth':
  1938.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Dokovací stanice a replikátory portů';
  1939.                         break;
  1940.                     case 'notebook display':
  1941.                         $categorytext = 'Počítače | Náhradní díly pro notebooky | Náhradní displeje pro notebooky';
  1942.                         break;
  1943.                     case 'vga':
  1944.                         $categorytext = 'Počítače | Počítačové komponenty | Grafické karty';
  1945.                         break;
  1946.                     case 'notebook bag':
  1947.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Brašny';
  1948.                         break;
  1949.                     case 'cleaning pc/nb':
  1950.                         $categorytext = 'Kosmetika a drogerie | Drogerie | Čisticí prostředky | Ostatní čisticí prostředky';
  1951.                         break;
  1952.                     case 'notebook keyboard':
  1953.                         $categorytext = 'Počítače | Náhradní díly pro notebooky | Náhradní klávesnice pro notebooky';
  1954.                         break;
  1955.                     case 'notebook bay':
  1956.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Stojany a podložky pro notebooky';
  1957.                         break;
  1958.                     case 'speaker':
  1959.                         $categorytext = 'Elektronika | TV a audio-video | Audio | Reprosoustavy a reproduktory';
  1960.                         break;
  1961.                     case 'hdd adapter':
  1962.                         $categorytext = 'Počítače | Ukládání dat | Příslušenství pro datové nosiče | Rámečky a boxy pro pevné disky';
  1963.                         break;
  1964.                     case 'power supply':
  1965.                         $categorytext = 'Počítače | Počítačové komponenty | Počítačové zdroje';
  1966.                         break;
  1967.                     case 'battery':
  1968.                         $categorytext = 'Elektronika | Baterie a nabíjení | Baterie a akumulátory | Článkové baterie';
  1969.                         break;
  1970.                     case 'notebook cooler':
  1971.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Stojany a podložky pro notebooky';
  1972.                         break;
  1973.                     case 'usb hub':
  1974.                         $categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | USB huby';
  1975.                         break;
  1976.                     case 'usb ethernet':
  1977.                         $categorytext = 'Počítače | Počítačové příslušenství | Síťové prvky | Síťové karty';
  1978.                         break;
  1979.                     case 'microphone':
  1980.                         $categorytext = 'Elektronika | TV a audio-video | Audio | Mikrofony';
  1981.                         break;
  1982.                     case 'printer drum':
  1983.                         $categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Tiskové válce';
  1984.                         break;
  1985.                     case 'surge arrest':
  1986.                         $categorytext = 'Dům, byt a zahrada | Stavebniny | Elektroinstalační materiál | Přepěťové ochrany';
  1987.                         break;
  1988.                     case 'projector':
  1989.                         $categorytext = 'Elektronika | TV a audio-video | Projekční technika | Projektorys';
  1990.                         break;
  1991.                     case 'case pc':
  1992.                         $categorytext = 'Počítače | Počítačové komponenty | PC skříně';
  1993.                         break;
  1994.                     case 'mouse pad':
  1995.                         $categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Podložky pod myš';
  1996.                         break;
  1997.                     case 'power adapter':
  1998.                         $categorytext = 'Počítače | Příslušenství pro notebooky | Adaptéry k notebookům';
  1999.                         break;
  2000.                     case 'projector accessory':
  2001.                         $categorytext = 'Elektronika | TV a audio-video | Projekční technika | Držáky na projektory';
  2002.                         break;
  2003.                     case 'cpu':
  2004.                         $categorytext = 'Počítače | Počítačové komponenty | Procesory';
  2005.                         break;
  2006.                     case 'sound card':
  2007.                         $categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | Zvukové karty';
  2008.                         break;
  2009.                     case 'cable usb':
  2010.                         $categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | USB kabely';
  2011.                         break;
  2012.                     case 'pci express card':
  2013.                         $categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | Ostatní rozšiřující karty a řadiče';
  2014.                         break;
  2015.                     case 'printer':
  2016.                         $categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Tiskárny';
  2017.                         break;
  2018.                     case 'microsd card':
  2019.                         $categorytext = 'Počítače | Ukládání dat | Paměťové karty';
  2020.                         break;
  2021.                     default:
  2022.                         $categorytext = false;
  2023.                 }
  2024.                 if (!$categorytext) {
  2025.                     continue;
  2026.                 }
  2027.                 $parameters = '';
  2028.                 $condition = 'refurbished';
  2029.                 $conditionDescription = 'Repasovaný produkt s mírnými známkami použití, v dokonalém technickém stavu. Z estetického hlediska skoro shodný s novým produktem.';
  2030.                 foreach ($product->getSpecificationProductAttributeOptions() as $spec) {
  2031.                     $option = $spec->getOption();
  2032.                     $attributeId = $option->getAttribute()->getId();
  2033.                     if ($attributeId != 101 /* Kvalita */) {
  2034.                         $parameters .= "<PARAM>
  2035.                                             <PARAM_NAME>" . $option->getAttribute()->getTitle($translator) . "</PARAM_NAME>";
  2036.                         $title = $option->getLongTitle($translator);
  2037.                         if (empty($title)) {
  2038.                             $title = $option->getTitle($translator);
  2039.                         }
  2040.                         $parameters .= "
  2041.                                             <VAL>$title</VAL>
  2042.                                         </PARAM>";
  2043.                     } else {
  2044.                         $condition = $option->getTitle() == 'New' ? 'new' : 'refurbished';
  2045.                         if ($option->getTitle() == 'New') {
  2046.                             $conditionDescription = $serviceTranslator->trans('quality description ' . mb_strtolower($option->getTitle()));
  2047.                         }
  2048.                     }
  2049.                 }
  2050.                 $price = $productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice();
  2051.                 $deliveryDate = 0;
  2052.                 $thumb = '';
  2053.                 $photos = $product->getAlbum()->getPhotos();
  2054.                 if (count($photos) > 0) {
  2055.                     $photos = Collections::sort($photos, false);
  2056.                     $photo = $photos[array_keys($photos)[0]];
  2057.                     if (is_object($photo)) {
  2058.                         $thumb = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  2059.                     }
  2060.                 } elseif (isset($_GET['debug'])) {
  2061.                     echo sprintf(
  2062.                         '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  2063.                         "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  2064.                         $product->getCode()
  2065.                     );
  2066.                 }
  2067.                 $eanValue = $product->getEan();
  2068.                 $eanTag = $eanValue && is_numeric($eanValue) && (strlen($eanValue) == 8 || strlen($eanValue) == 13 || strlen($eanValue) == 14) ? "<EAN>$eanValue</EAN>" : '';
  2069.                 $category = $product->getType()->getTitle($translator);
  2070.                 $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  2071.                 $productName = $product->getName();
  2072.                 $productCode = $product->getCode();
  2073.                 $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2074.                 $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  2075.                 $warrantyInYears = $this->getWarrantyForProductType($domain->getId(), $product->getType()->getId())['year'];
  2076.                 $warranty = $warrantyInYears * 12;
  2077.                 $productNo = $product->getCode();
  2078.                 $customLabels = [];
  2079.                 if ($productMeta->isTimedSaleActive(true)) {
  2080.                     array_push($customLabels, $serviceTranslator->trans('Flash sale') . ' ' . $serviceTranslator->trans('for limited time'));
  2081.                 }
  2082.                 $availableText = false;
  2083.                 if ($product->getAvailable() > 10) {
  2084.                     $availableText = $serviceTranslator->trans('10+ in stock');
  2085.                 } elseif ($product->getAvailable() >= 5) {
  2086.                     $availableText = $serviceTranslator->trans('5-10 in stock');
  2087.                 } elseif ($product->getAvailable() > 1) {
  2088.                     $availableText = $serviceTranslator->trans('2-4 in stock');
  2089.                 } elseif ($product->getAvailable() == 1) {
  2090.                     $availableText = $serviceTranslator->trans('Only one left');
  2091.                 }
  2092.                 if ($availableText) {
  2093.                     array_push($customLabels, $availableText);
  2094.                 }
  2095.                 $deliveryPrice = 0;
  2096.                 if ($price > $shippingMethodPrice->getFreeShipLimit()) {
  2097.                     array_push($customLabels, $serviceTranslator->trans('Free delivery'));
  2098.                 } else {
  2099.                     $deliveryPrice = $shippingMethodPrice->getPrice();
  2100.                 }
  2101.                 $brandTag = $vendor ? "<BRAND><![CDATA[$vendor]]></BRAND>" : '';
  2102.                 $customLabelTags = '';
  2103.                 if (count($customLabels) > 0) {
  2104.                     for ($i = 0; $i < count($customLabels); $i++) {
  2105.                         $customLabelTags .= "<CUSTOM_LABEL_$i>" . $customLabels[$i] . "</CUSTOM_LABEL_$i>";
  2106.                     }
  2107.                 }
  2108.                 $listPriceTag = '';
  2109.                 if ($productMeta->isDiscounted()) {
  2110.                     $originalPrice = $productMeta->getDomainVatPrice();
  2111.                     $listPriceTag = "<LIST_PRICE>$originalPrice</LIST_PRICE>";
  2112.                 }
  2113.                 $releaseDate = $productMeta->getCreated()->format('Y-m-d');
  2114.                 $releaseDateTag = "<RELEASE_DATE>$releaseDate</RELEASE_DATE>";
  2115.                 $productName = ($vendor != '' ? $vendor . ' ' : '') . $productName;
  2116.                 $productNameValue = is_numeric($productName[0]) ? $category . ' ' . $productName : $productName;
  2117.                 // More info: https://napoveda.zbozi.cz/xml-feed/specifikace/
  2118.                 $xml .= "<SHOPITEM>
  2119.                             <PRODUCTNAME><![CDATA[$productNameValue]]></PRODUCTNAME>
  2120.                             <DESCRIPTION><![CDATA[" . strip_tags($product->getDescription()) . "]]></DESCRIPTION>
  2121.                             <URL>https://www.furbify.cz/$link</URL>
  2122.                             <PRICE_VAT>$price</PRICE_VAT>
  2123.                             <DELIVERY_DATE>$deliveryDate</DELIVERY_DATE>
  2124.                             <IMGURL>$thumb</IMGURL>
  2125.                             <PRODUCT><![CDATA[$productNameValue]]></PRODUCT>
  2126.                             <MANUFACTURER><![CDATA[$vendor]]></MANUFACTURER>
  2127.                             <DELIVERY>
  2128.                                 <DELIVERY_ID>GLS</DELIVERY_ID>
  2129.                                 <DELIVERY_PRICE>$deliveryPrice</DELIVERY_PRICE>
  2130.                                 <DELIVERY_PRICE_COD>$cashOnDeliveryPrice</DELIVERY_PRICE_COD>
  2131.                             </DELIVERY>
  2132.                             <ITEM_ID>" . $product->getId() . "</ITEM_ID>
  2133.                             <CATEGORYTEXT>" . trim($categorytext) . "</CATEGORYTEXT>
  2134.                             $eanTag
  2135.                             $parameters
  2136.                             <CONDITION>$condition</CONDITION>
  2137.                             <CONDITION_DESC>$conditionDescription</CONDITION_DESC>
  2138.                             <WARRANTY>$warranty</WARRANTY>
  2139.                             <PRODUCTNO>$productNo</PRODUCTNO>
  2140.                             <VISIBILITY>1</VISIBILITY>
  2141.                             $brandTag
  2142.                             $customLabelTags
  2143.                             $listPriceTag
  2144.                             $releaseDateTag
  2145.                         </SHOPITEM>";
  2146.             }
  2147.             $xml .= '</SHOP>';
  2148.             $zboziCacheItem->set($xml);
  2149.             $zboziCacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
  2150.             $cache->save($zboziCacheItem);
  2151.         }
  2152.         $entityManager = $this->getEntityManager();
  2153.         $entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_ZBOZI);
  2154.         $response = new Response($xml);
  2155.         $response->headers->set('Content-Type', 'xml');
  2156.         return $response;
  2157.     }
  2158.     /**
  2159.      * @Route("/facebook.xml", name="facebook_feed")
  2160.      * @param Request $request
  2161.      * @return Response
  2162.      * @throws Exception
  2163.      */
  2164.     public function facebookFeedAction(Request $request): Response
  2165.     {
  2166.         ini_set('memory_limit', '768M');
  2167.         $entityManager = $this->getEntityManager();
  2168.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  2169.         $domainLanguage = strtolower($domain->getLanguage()->getCode());
  2170.         // Domain TLD
  2171.         $domainTLD = $domainLanguage;
  2172.         if ($domainTLD == 'en') {
  2173.             $domainTLD = 'eu';
  2174.         }
  2175.         // Translator
  2176.         $translator = $this->getDatabaseTranslator($request);
  2177.         $xml = '<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  2178.             <channel>
  2179.             <title>' . $domain->getTitle() . '</title>
  2180.             <link>' . $domain->getUrl() . '</link>';
  2181.         $products = $entityManager
  2182.             ->createQuery("SELECT p
  2183.                 FROM AtechNetCoreBundle:Product p
  2184.                 WHERE p.archived = 0
  2185.                   AND p.available > 0
  2186.                   AND p.type != 82
  2187.                   AND p.qualityStatus != :bazar")
  2188.             ->setParameter('bazar', Product::QualityStatus_Bazaar)
  2189.             ->getResult();
  2190.         /**
  2191.          * @var Product $product
  2192.          */
  2193.         foreach ($products as $product) {
  2194.             $product_meta = $product->getDomainMeta($domain);
  2195.             if ($product_meta === false) {
  2196.                 continue;
  2197.             }
  2198.             if (!$product->isAvailable()
  2199.                 || !$product_meta->isActive()
  2200.                 || !$product_meta->isListed()
  2201.                 || !$product_meta->isReady()
  2202.                 || $product->getDescription() == '') {
  2203.                 continue;
  2204.             }
  2205.             $product_meta = $product->getDomainMeta($domain);
  2206.             $price = $product_meta->getDomainVatPrice();
  2207.             $discount = $product_meta->getDomainVatDiscount();
  2208.             $price = $product_meta->isDiscounted() ? $discount : $price;
  2209.             $imageLinks = [];
  2210.             $photos = $product->getAlbum()->getPhotos();
  2211.             if (count($photos) > 0) {
  2212.                 $photos = Collections::sort($photos, false);
  2213.                 foreach ($photos as $photo) {
  2214.                     $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  2215.                 }
  2216.             } elseif (isset($_GET['debug'])) {
  2217.                 echo sprintf(
  2218.                     '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  2219.                     "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  2220.                     $product->getCode()
  2221.                 );
  2222.             }
  2223.             $currency = 'EUR';
  2224.             switch ($domain->getId()) {
  2225.                 case Domain::DOMAIN_ID_RT_SK:
  2226.                 case Domain::DOMAIN_ID_WS_SK:
  2227.                 case Domain::DOMAIN_ID_WS_EU:
  2228.                     $currency = 'EUR';
  2229.                     break;
  2230.                 case Domain::DOMAIN_ID_RT_HU:
  2231.                 case Domain::DOMAIN_ID_WS_HU:
  2232.                     $currency = 'HUF';
  2233.                     break;
  2234.                 case Domain::DOMAIN_ID_RT_CZ:
  2235.                 case Domain::DOMAIN_ID_WS_CZ:
  2236.                     $currency = 'CZK';
  2237.                     break;
  2238.             }
  2239.             $imageLinksString = '';
  2240.             $googleProductCategories = [
  2241.                 ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
  2242.                 ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
  2243.                 ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
  2244.                 ProductType::PRODUCT_TYPE_ID_PC => 325,
  2245.                 ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
  2246.                 ProductType::PRODUCT_TYPE_ID_SERVER => 331,
  2247.                 ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
  2248.                 ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
  2249.                 ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
  2250.                 ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
  2251.                 ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
  2252.                 ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
  2253.                 ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
  2254.             ];
  2255.             foreach ($imageLinks as $imageLink) {
  2256.                 if ($imageLinksString == '') {
  2257.                     $imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
  2258.                 } else {
  2259.                     $imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
  2260.                 }
  2261.             }
  2262.             if ($imageLinksString == '') {
  2263.                 continue;
  2264.             }
  2265.             $category = $product->getType()->getTitle($translator);
  2266.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  2267.             $productName = $product->getName();
  2268.             $productCode = $product->getCode();
  2269.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2270.             $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  2271.             $description = str_replace(' | Win 7 Pro COA', '', $product->getDescription());
  2272.             if ($description == 'NEW') {
  2273.                 $description = strtolower($description);
  2274.             }
  2275.             if (in_array($product->getType()->getId(), [
  2276.                 ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
  2277.                 ProductType::PRODUCT_TYPE_ID_MONITOR,
  2278.                 ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
  2279.                 ProductType::PRODUCT_TYPE_ID_PC,
  2280.                 ProductType::PRODUCT_TYPE_ID_PC_SET,
  2281.                 ProductType::PRODUCT_TYPE_ID_SERVER,
  2282.                 ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
  2283.                 ProductType::PRODUCT_TYPE_ID_TABLET,
  2284.                 ProductType::PRODUCT_TYPE_ID_SMARTWATCH,
  2285.                 ProductType::PRODUCT_TYPE_ID_CONSOLE,
  2286.                 ProductType::PRODUCT_TYPE_ID_PROJECTOR,
  2287.                 ProductType::PRODUCT_TYPE_ID_PRINTER,
  2288.                 ProductType::PRODUCT_TYPE_ID_SOFTWARE,
  2289.             ])
  2290.                 && !in_array('2in1 notebook', $product->getBadges())
  2291.                 && !in_array('Chromebook', $product->getBadges())) {
  2292.                 $categoryTitle = $product->getType()->getTitle($translator);
  2293.             } elseif (in_array('2in1 notebook', $product->getBadges())) {
  2294.                 $categoryTitle = '2in1 notebook';
  2295.             } elseif (in_array('Chromebook', $product->getBadges())) {
  2296.                 $categoryTitle = 'Chromebook';
  2297.             } else {
  2298.                 $categoryTitle = 'Komponent';
  2299.             }
  2300.             $xml .= '<item>
  2301.                 <g:id>' . $product->getCode() . '</g:id>
  2302.                 <g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>
  2303.                 <g:description>' . strip_tags($description) . '</g:description>
  2304.                 <g:link>https://www.furbify.' . $domainTLD . '/' . $link . '</g:link>
  2305.                 ' . $imageLinksString . '
  2306.                 <g:brand>' . str_replace('&', 'and', $product->getVendor()->getName()) . '</g:brand>
  2307.                 <g:product_type>' . $categoryTitle . '</g:product_type>
  2308.                 <g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>
  2309.                 <g:availability>in stock</g:availability>
  2310.                 <g:google_product_category>' . (isset($googleProductCategories[$product->getType()->getId()]) ? $googleProductCategories[$product->getType()->getId()] : '285') . '</g:google_product_category>
  2311.                 <g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>
  2312.                 <g:bestseller>' . $product_meta->isBestSeller() . '</g:bestseller>
  2313.                 <g:gamer>' . in_array('gamer', $product->getBadges()) . '</g:gamer>
  2314.             </item>';
  2315.         }
  2316.         $xml .= '</channel>
  2317.         </rss>';
  2318.         $entityManager = $this->getEntityManager();
  2319.         $entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_FACEBOOK);
  2320.         $response = new Response($xml);
  2321.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  2322.         return $response;
  2323.     }
  2324.     /**
  2325.      * @Route("/google.xml", name="google_feed")
  2326.      * @param Request $request
  2327.      * @return Response
  2328.      * @throws Exception
  2329.      */
  2330.     public function googleFeedAction(Request $request): Response
  2331.     {
  2332.         ini_set('memory_limit', '2048M');
  2333.         // Entity Manager
  2334.         $entityManager = $this->getEntityManager();
  2335.         // Multi-Store
  2336.         $multiStore = $this->getMultiStoreHelper($request);
  2337.         $domain = $multiStore->getDomain();
  2338.         $domainLanguage = strtolower($domain->getLanguage()->getCode());
  2339.         // Default Language Id
  2340.         $defaultLanguageId = $multiStore->getDefaultLanguageId();
  2341.         // Seo Url
  2342.         $seoUrl = $this->getSeoUrlHelper($request);
  2343.         // Product Seo Urls
  2344.         $productSeoUrlResults = $entityManager
  2345.             ->createQuery("SELECT su 
  2346.                 FROM AtechNetCoreBundle:Product p
  2347.                 JOIN AtechNetCoreBundle:SeoUrl su WITH su.query = CONCAT('product_id=', p.id) 
  2348.                 WHERE p.archived = 0 AND p.type NOT IN (70, 71, 82) AND p.available > 0 AND p.qualityStatus != :bazar AND su.archived = '0' AND su.language = :language")
  2349.             ->setParameter('language', $defaultLanguageId)
  2350.             ->setParameter('bazar', Product::QualityStatus_Bazaar)
  2351.             ->getResult()
  2352.         ;
  2353.         $productSeoUrls = [];
  2354.         foreach ( $productSeoUrlResults as $result ) {
  2355.             [, $productId] = explode('=', $result->getQuery());
  2356.             $productSeoUrls[(int)$productId] = $result->getKeyword();
  2357.         }
  2358.         // Domain TLD
  2359.         $domainTLD = $domainLanguage;
  2360.         if ($domainTLD == 'en') {
  2361.             $domainTLD = 'eu';
  2362.         }
  2363.         // Translator
  2364.         $translator = $this->getDatabaseTranslator($request);
  2365.         $tr = $this->getTranslator();
  2366.         $xmlHeader = '<?xml version="1.0"?>
  2367.             <rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  2368.             <channel>
  2369.             <title>Furbify</title>
  2370.             <link>https://www.furbify.' . $domainTLD . '</link>';
  2371.         $xmlItems = [];
  2372.         $products = $entityManager
  2373.             ->createQuery("SELECT p, pt, v, a, pm
  2374.                 FROM AtechNetCoreBundle:Product p
  2375.                 LEFT JOIN p.type pt
  2376.                 LEFT JOIN p.vendor v
  2377.                 LEFT JOIN p.album a
  2378.                 JOIN p.metas pm WITH pm.domain = :domain
  2379.                 WHERE p.archived = 0
  2380.                   AND p.available > 0 AND pt.id NOT IN (70,71,82)
  2381.                   AND p.qualityStatus != :bazar
  2382.                   AND p.cacheDescription != ''
  2383.                   AND pm.active = true
  2384.                   AND pm.listed = true
  2385.                   AND (pm.price > 0 OR pm.discount > 0)")
  2386.             ->setParameter('bazar', Product::QualityStatus_Bazaar)
  2387.             ->setParameter('domain', $domain)
  2388.             ->getResult();
  2389.         // Prefetch spec attribute options for main product types (avoids N+1 lazy loads in the loop below)
  2390.         // Filters mirror the main query above so this only touches the same product set.
  2391.         $entityManager->createQuery("SELECT p, pa, o, oa
  2392.                 FROM AtechNetCoreBundle:Product p
  2393.                 JOIN p.metas pm WITH pm.domain = :domain
  2394.                 LEFT JOIN p.productAttributes pa
  2395.                 LEFT JOIN pa.option o
  2396.                 LEFT JOIN o.attribute oa
  2397.                 WHERE p.archived = 0
  2398.                   AND p.available > 0
  2399.                   AND p.qualityStatus != :bazar
  2400.                   AND p.type IN (:mainTypes)
  2401.                   AND p.cacheDescription != ''
  2402.                   AND pm.active = true
  2403.                   AND pm.listed = true
  2404.                   AND (pm.price > 0 OR pm.discount > 0)")
  2405.             ->setParameter('bazar', Product::QualityStatus_Bazaar)
  2406.             ->setParameter('domain', $domain)
  2407.             ->setParameter('mainTypes', ProductType::getMainProductTypeIds())
  2408.             ->getResult();
  2409.         // Photos fetched separately (not joined) to avoid multiplying product/type/vendor/album
  2410.         // columns across the network for every photo row; grouped + pre-sorted by album id.
  2411.         $albumIds = [];
  2412.         foreach ($products as $product) {
  2413.             if ($product->getAlbum()) {
  2414.                 $albumIds[] = $product->getAlbum()->getId();
  2415.             }
  2416.         }
  2417.         $photosByAlbumId = [];
  2418.         if ($albumIds !== []) {
  2419.             $photoResults = $entityManager->createQuery("SELECT ph
  2420.                     FROM AtechNetCoreBundle:Photo ph
  2421.                     WHERE ph.album IN (:albumIds)
  2422.                     ORDER BY ph.sortIndex ASC")
  2423.                 ->setParameter('albumIds', array_unique($albumIds))
  2424.                 ->getResult();
  2425.             foreach ($photoResults as $photo) {
  2426.                 $photosByAlbumId[$photo->getAlbum()->getId()][] = $photo;
  2427.             }
  2428.         }
  2429.         $shippingPrices = $entityManager->createQuery("SELECT dst.price
  2430.             FROM AtechNetCoreBundle:DomainShippingType dst
  2431.             WHERE dst.activeOnWeb = 1 AND dst.domain = :domain
  2432.             ORDER BY dst.price ASC")
  2433.             ->setParameters([
  2434.                 'domain' => $domain,
  2435.             ])
  2436.             ->setMaxResults(1)
  2437.             ->getResult();
  2438.         $shippingPrice = 0;
  2439.         if (isset($shippingPrices[0]['price'])) {
  2440.             $shippingPrice = $shippingPrices[0]['price'];
  2441.         }
  2442.         $currentDate = (int)(new \DateTime())->format('Ymd');
  2443.         $isBlackFriday = $currentDate >= 20241123 && $currentDate <= 20241130;
  2444.         // Google Product Categories
  2445.         $googleProductCategories = [
  2446.             ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
  2447.             ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
  2448.             ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
  2449.             ProductType::PRODUCT_TYPE_ID_PC => 325,
  2450.             ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
  2451.             ProductType::PRODUCT_TYPE_ID_SERVER => 331,
  2452.             ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
  2453.             ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
  2454.             ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
  2455.             ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
  2456.             ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
  2457.             ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
  2458.             ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
  2459.         ];
  2460.         $googleProductCategoryIDs = array_keys($googleProductCategories);
  2461.         $mainProductTypeIds = ProductType::getMainProductTypeIds();
  2462.     
  2463.         // Currency
  2464.         switch ( $domain->getId() ) {
  2465.             case Domain::DOMAIN_ID_RT_SK:
  2466.             case Domain::DOMAIN_ID_WS_SK:
  2467.             case Domain::DOMAIN_ID_WS_EU:
  2468.                 $currency = 'EUR';
  2469.                 break;
  2470.             case Domain::DOMAIN_ID_RT_HU:
  2471.             case Domain::DOMAIN_ID_WS_HU:
  2472.                 $currency = 'HUF';
  2473.                 break;
  2474.             case Domain::DOMAIN_ID_WS_CZ:
  2475.             case Domain::DOMAIN_ID_RT_CZ:
  2476.                 $currency = 'CZK';
  2477.                 break;
  2478.             default:
  2479.                 $currency = 'EUR';
  2480.         }
  2481.         if ( $currency !== 'EUR' ) {
  2482.             $yesterday = ( new \Datetime('now') )->sub(new \DateInterval('P1D'))->format('Y-m-d');
  2483.             $currencyRate = $this->historicalEuroRate->getRate($currency, $yesterday);
  2484.         } else {
  2485.             $currencyRate = 1;
  2486.         }
  2487.         /**
  2488.          * @var Product $product
  2489.          */
  2490.         foreach ($products as $product) {
  2491.             $product_meta = $product->getDomainMeta($domain);
  2492.             if ($product_meta === false) {
  2493.                 continue;
  2494.             }
  2495.             if (!$product->isAvailable()
  2496.                 || !$product_meta->isActive()
  2497.                 || !$product_meta->isListed()
  2498.                 || !$product_meta->isReady()
  2499.                 || $product->getDescription() == '') {
  2500.                 continue;
  2501.             }
  2502.             $price = $product_meta->getDomainVatPrice();
  2503.             $discount = $product_meta->getDomainVatDiscount();
  2504.             $imageLinks = [];
  2505.             $photos = $photosByAlbumId[$product->getAlbum()?->getId()] ?? [];
  2506.             if (count($photos) > 0) {
  2507.                 foreach ($photos as $photo) {
  2508.                     $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  2509.                 }
  2510.             } elseif (isset($_GET['debug'])) {
  2511.                 echo sprintf(
  2512.                     '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  2513.                     "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  2514.                     $product->getCode()
  2515.                 );
  2516.             }
  2517.             $imageLinksString = '';
  2518.             foreach ($imageLinks as $imageLink) {
  2519.                 if ($imageLinksString == '') {
  2520.                     $imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
  2521.                 } else {
  2522.                     $imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
  2523.                 }
  2524.             }
  2525.             if ($imageLinksString == '') {
  2526.                 continue;
  2527.             }
  2528.             $productTypeEntity = $product->getType();
  2529.             $typeId = $productTypeEntity->getId();
  2530.             $typeTitle = $productTypeEntity->getTitle($translator);
  2531.             $vendorEntity = $product->getVendor();
  2532.             $vendorName = $vendorEntity->getName();
  2533.             $isMainProductType = in_array($typeId, $mainProductTypeIds);
  2534.             $category = $typeTitle;
  2535.             $vendor = $vendorName != 'VARIOUS' ? $vendorName : '';
  2536.             $productName = $product->getName();
  2537.             $productCode = $product->getCode();
  2538.             $productId = $product->getId();
  2539.             // Product Url
  2540.             if ( !empty($productSeoUrls[$productId]) ) {
  2541.                 $link = $productSeoUrls[$productId];
  2542.             } else {
  2543.                 $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2544.                 $link = $seoUrl->slug($linkRaw);
  2545.                 #echo 'he';
  2546.             }
  2547.             if ($isMainProductType) {
  2548.                 $description = $vendorName . ' ' . $product->getName() . ' - ';
  2549.                 $description .= $this->getTranslator()->trans('Google feed product type description', [
  2550.                     'product_type' => strtolower($typeTitle),
  2551.                 ]);
  2552.                 $config = ' ';
  2553.                 /** @var ProductAttribute $productAttributeOption */
  2554.                 foreach ($product->getSpecificationProductAttributeOptions() as $productAttributeOption) {
  2555.                     $attributeOption = $productAttributeOption->getOption();
  2556.                     if ($config != ' ') {
  2557.                         $config .= ', ';
  2558.                     }
  2559.                     if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_QUALITY) {
  2560.                         $grade = $tr->trans('grades.' . match (strtolower($attributeOption->getTitle())) {
  2561.                                 'gold' => 'A',
  2562.                                 'silver' => 'B',
  2563.                                 'bronze' => 'C',
  2564.                                 default => $attributeOption->getTitle(),
  2565.                             });
  2566.                         $config .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $grade;
  2567.                     }
  2568.                     else {
  2569.                         $config .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
  2570.                     }
  2571.                 }
  2572.                 $description .= $config;
  2573.             } else {
  2574.                 $description = $product->getDescription();
  2575.                 if ($description == 'NEW') {
  2576.                     $description = strtolower($description);
  2577.                 }
  2578.             }
  2579.             if ($isMainProductType && $isBlackFriday) {
  2580.                 $shippingPrice = 0;
  2581.             }
  2582.             $productTypeText = (in_array($typeId, $googleProductCategoryIDs)
  2583.                 ? (
  2584.                     in_array('workstation', $product->getBadges())
  2585.                         ? $typeTitle . '-workstation'
  2586.                         : $typeTitle
  2587.                 )
  2588.                 : 'Komponent');
  2589.             $windowsLabel = $product->hasBadgeItem('Windows 11')
  2590.                 ? 'win11'
  2591.                 : (
  2592.                     $product->hasBadgeItem('win10')
  2593.                     ? 'win10'
  2594.                     : ''
  2595.                 );
  2596.             // Price for Margin Level
  2597.             $marginLevelPrice = $product_meta->getDomainPrice();
  2598.             if ( $product_meta->isDiscounted() ) {
  2599.                 $marginLevelPrice = $product_meta->getDomainDiscount();
  2600.             }
  2601.             if ( $currency !== 'EUR' ) {
  2602.                 $marginLevelPrice = $marginLevelPrice / $currencyRate;
  2603.             }
  2604.             // Margin Level
  2605.             if ( in_array($typeId, [ ProductType::PRODUCT_TYPE_ID_NOTEBOOK, ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_MONITOR, ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE ]) ) {
  2606.                 $marginLevel = $product->getCalculatedMarginLevel($marginLevelPrice);
  2607.             }
  2608.             elseif ( $productTypeText == 'Komponent' ) {
  2609.                 $marginLevel = Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_F] ?? Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
  2610.             }
  2611.             elseif ( $product->getMarginLevel() > Product::MARGIN_LEVEL_NO ) {
  2612.                 $marginLevel = Product::getMarginLevelChoices()[$product->getMarginLevel()] ?? Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
  2613.             }
  2614.             else {
  2615.                 $marginLevel = Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
  2616.             }
  2617.             $xmlItems[] = '<item>'
  2618.                 . '<g:id>' . $product->getCode() . '</g:id>'
  2619.                 . '<g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>'
  2620.                 . '<g:description>' . strip_tags($description) . '</g:description>'
  2621.                 . '<g:link>https://www.furbify.' . $domainTLD . '/' . $link . '</g:link>'
  2622.                 . $imageLinksString
  2623.                 . '<g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>'
  2624.                 . '<g:availability>in_stock</g:availability>'
  2625.                 . '<g:quantity>' . $product->getAvailable() . '</g:quantity>'
  2626.                 . '<g:shipping>'
  2627.                     . '<g:country>' . strtoupper($domainTLD) . '</g:country>'
  2628.                     . '<g:service>Standard</g:service>'
  2629.                     . '<g:price>' . $shippingPrice . ' ' . $currency . '</g:price>'
  2630.                 . '</g:shipping>'
  2631.                 . '<g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>'
  2632.                 . ($product_meta->isDiscounted() ? '<g:sale_price>' . $discount . ' ' . $currency . '</g:sale_price>' : '')
  2633.                 . '<g:google_product_category>' . ($googleProductCategories[$typeId] ?? '285') . '</g:google_product_category>'
  2634.                 . ($vendor != '' ? '<g:brand>' . str_replace('&', 'and', $vendorName) . '</g:brand>' : '')
  2635.                 . '<g:product_type>' . $productTypeText . '</g:product_type>'
  2636.                 . '<g:custom_label_0>' . $marginLevel . '</g:custom_label_0>'
  2637.                 . '<g:custom_label_2>' . $windowsLabel . '</g:custom_label_2>'
  2638.             . '</item>';
  2639.         }
  2640.         $xml = $xmlHeader . implode(PHP_EOL, $xmlItems) . '</channel></rss>';
  2641.         $entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_GOOGLE);
  2642.         $response = new Response($xml);
  2643.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  2644.         return $response;
  2645.     }
  2646.     /**
  2647.      * @Route("/tiktok.xml", name="tiktok_feed")
  2648.      * @param Request $request
  2649.      * @return Response
  2650.      * @throws Exception
  2651.      */
  2652.     public function tiktokFeedAction(Request $request): Response
  2653.     {
  2654.         ini_set('memory_limit', '768M');
  2655.         $entityManager = $this->getEntityManager();
  2656.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  2657.         $domainLanguage = strtolower($domain->getLanguage()->getCode());
  2658.         $translator = $this->getDatabaseTranslator($request);
  2659.         $xml = '<?xml version="1.0"?>
  2660.             <rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  2661.             <channel>
  2662.             <title>Furbify</title>
  2663.             <link>https://www.furbify.' . $domainLanguage . '</link>';
  2664.         $products = $entityManager
  2665.             ->createQuery("SELECT p
  2666.                 FROM AtechNetCoreBundle:Product p
  2667.                 LEFT JOIN p.type pt
  2668.                 WHERE p.archived = 0
  2669.                   AND (p.available > 0 OR p.outOfStockStatus = " . Product::OutOfStockStatus_VisibleShadow . ") AND pt.id NOT IN (70,71,82)")
  2670.             ->getResult();
  2671.         $shippingPrices = $entityManager->createQuery("SELECT dst.price
  2672.             FROM AtechNetCoreBundle:DomainShippingType dst
  2673.             WHERE dst.activeOnWeb = 1 AND dst.domain = :domain
  2674.             ORDER BY dst.price ASC")
  2675.             ->setParameters([
  2676.                 'domain' => $domain,
  2677.             ])
  2678.             ->setMaxResults(1)
  2679.             ->getResult();
  2680.         $shippingPrice = 0;
  2681.         if (isset($shippingPrices[0]['price'])) {
  2682.             $shippingPrice = $shippingPrices[0]['price'];
  2683.         }
  2684.         /**
  2685.          * @var Product $product
  2686.          */
  2687.         foreach ($products as $product) {
  2688.             $product_meta = $product->getDomainMeta($domain);
  2689.             if ($product_meta === false) {
  2690.                 continue;
  2691.             }
  2692.             if (!$product->isAvailable()
  2693.                 || !$product_meta->isActive()
  2694.                 || !$product_meta->isListed()
  2695.                 || !$product_meta->isReady()
  2696.                 || $product->getDescription() == '') {
  2697.                 continue;
  2698.             }
  2699.             $product_meta = $product->getDomainMeta($domain);
  2700.             $price = $product_meta->getDomainVatPrice();
  2701.             $discount = $product_meta->getDomainVatDiscount();
  2702.             $imageLinks = [];
  2703.             $photos = $product->getAlbum()->getPhotos();
  2704.             if (count($photos) > 0) {
  2705.                 $photos = Collections::sort($photos, false);
  2706.                 foreach ($photos as $photo) {
  2707.                     $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  2708.                 }
  2709.             } elseif (isset($_GET['debug'])) {
  2710.                 echo sprintf(
  2711.                     '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  2712.                     "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  2713.                     $product->getCode()
  2714.                 );
  2715.             }
  2716.             switch ($domain->getId()) {
  2717.                 case Domain::DOMAIN_ID_RT_SK:
  2718.                 case Domain::DOMAIN_ID_WS_SK:
  2719.                 case Domain::DOMAIN_ID_WS_EU:
  2720.                     $currency = 'EUR';
  2721.                     break;
  2722.                 case Domain::DOMAIN_ID_RT_HU:
  2723.                 case Domain::DOMAIN_ID_WS_HU:
  2724.                     $currency = 'HUF';
  2725.                     break;
  2726.                 case Domain::DOMAIN_ID_WS_CZ:
  2727.                 case Domain::DOMAIN_ID_RT_CZ:
  2728.                     $currency = 'CZK';
  2729.                     break;
  2730.                 default:
  2731.                     $currency = 'EUR';
  2732.             }
  2733.             $imageLinksString = '';
  2734.             $googleProductCategories = [
  2735.                 ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
  2736.                 ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
  2737.                 ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
  2738.                 ProductType::PRODUCT_TYPE_ID_PC => 325,
  2739.                 ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
  2740.                 ProductType::PRODUCT_TYPE_ID_SERVER => 331,
  2741.                 ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
  2742.                 ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
  2743.                 ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
  2744.                 ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
  2745.                 ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
  2746.                 ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
  2747.                 ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
  2748.             ];
  2749.             $googleProductCategoryIDs = array_keys($googleProductCategories);
  2750.             foreach ($imageLinks as $imageLink) {
  2751.                 if ($imageLinksString == '') {
  2752.                     $imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
  2753.                 } else {
  2754.                     $imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
  2755.                 }
  2756.             }
  2757.             if ($imageLinksString == '') {
  2758.                 continue;
  2759.             }
  2760.             $category = $product->getType()->getTitle($translator);
  2761.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  2762.             $productName = $product->getName();
  2763.             $productCode = $product->getCode();
  2764.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2765.             $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  2766.             $description = $product->getDescription();
  2767.             if ($description == 'NEW') {
  2768.                 $description = strtolower($description);
  2769.             }
  2770.             $xml .= '<item>
  2771.                 <g:sku_id>' . $product->getCode() . '</g:sku_id>
  2772.                 <g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>
  2773.                 <g:description>' . strip_tags($description) . '</g:description>
  2774.                 <g:link>https://www.furbify.' . $domainLanguage . '/' . $link . '</g:link>
  2775.                 ' . $imageLinksString . '
  2776.                 <g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>
  2777.                 <g:availability>in stock</g:availability>
  2778.                 <g:shipping> ' . strtoupper($domainLanguage) . ':::' . $shippingPrice . ' ' . $currency . ':Standard 
  2779.                 </g:shipping>
  2780.                 <g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>
  2781.                 ' . ($product_meta->isDiscounted() ? '<g:sale_price>' . $discount . ' ' . $currency . '</g:sale_price>' : '') . '
  2782.                 <g:google_product_category>' . (isset($googleProductCategories[$product->getType()->getId()]) ? $googleProductCategories[$product->getType()->getId()] : '285') . '</g:google_product_category>
  2783.                 ' . ($vendor != '' ? '<g:brand>' . str_replace('&', 'and', $product->getVendor()->getName()) . '</g:brand>' : '') . '
  2784.                 <g:product_type>' . (in_array($product->getType()->getId(), $googleProductCategoryIDs) ? $product->getType()->getTitle($translator) : 'Komponent') . '</g:product_type>
  2785.             </item>';
  2786.         }
  2787.         $xml .= '</channel>
  2788.         </rss>';
  2789.         $entityManager = $this->getEntityManager();
  2790.         $entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_GOOGLE);
  2791.         $response = new Response($xml);
  2792.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  2793.         return $response;
  2794.     }
  2795.     /**
  2796.      * @Route("/olcsobbat.xml", name="olcsobbat_feed")
  2797.      * @param Request $request
  2798.      * @return Response
  2799.      * @throws Exception
  2800.      */
  2801.     public function olcsobbatFeedAction(Request $request)
  2802.     {
  2803.         $entityManager = $this->getEntityManager();
  2804.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  2805.         $translator = $this->getDatabaseTranslator($request);
  2806.         $xml = '<?xml version="1.0" encoding="UTF-8" ?>
  2807.             <catalog>';
  2808.         $products = $entityManager
  2809.             ->createQuery("SELECT p
  2810.                 FROM AtechNetCoreBundle:Product p
  2811.                 LEFT JOIN p.type pt
  2812.                 WHERE p.archived = 0
  2813.                   AND (p.available > 0 OR p.outOfStockStatus = " . Product::OutOfStockStatus_VisibleShadow . ") AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id NOT IN (70,71)")
  2814.             ->getResult();
  2815.         foreach ($products as $product) {
  2816.             $product_meta = $product->getDomainMeta($domain);
  2817.             if ($product_meta === false) {
  2818.                 continue;
  2819.             }
  2820.             if (!$product->isAvailable()
  2821.                 || !$product_meta->isActive()
  2822.                 || !$product_meta->isListed()
  2823.                 || !$product_meta->isReady()
  2824.                 || $product->getDescription() == '') {
  2825.                 continue;
  2826.             }
  2827.             $product_meta = $product->getDomainMeta($domain);
  2828.             $price = $product_meta->isDiscounted() ? $product_meta->getDomainVatDiscount() : $product_meta->getDomainVatPrice();
  2829.             $imageLinks = [];
  2830.             $photos = $product->getAlbum()->getPhotos();
  2831.             if (count($photos) > 0) {
  2832.                 $photo = $photos->first();
  2833.                 $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  2834.             } elseif (isset($_GET['debug'])) {
  2835.                 echo sprintf(
  2836.                     '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  2837.                     "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  2838.                     $product->getCode()
  2839.                 );
  2840.             }
  2841.             $imageLinksString = '';
  2842.             foreach ($imageLinks as $imageLink) {
  2843.                 if ($imageLinksString == '') {
  2844.                     $imageLinksString .= $imageLink;
  2845.                 }
  2846.             }
  2847.             if ($imageLinksString == '') {
  2848.                 continue;
  2849.             }
  2850.             $category = $product->getType()->getTitle($translator);
  2851.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  2852.             $productName = $product->getName();
  2853.             $productCode = $product->getCode();
  2854.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2855.             $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  2856.             $description = $product->getDescription();
  2857.             if ($description == 'NEW') {
  2858.                 $description = strtolower($description);
  2859.             }
  2860.             $xml .= '<product>
  2861.                 <id>' . $product->getCode() . '</id>
  2862.                 <manufacturer><![CDATA[' . str_replace('&', 'and', $product->getVendor()->getName()) . ']]></manufacturer>
  2863.                 <name><![CDATA[' . $product->getName() . ']]></name>
  2864.                 <grossprice>' . str_replace(' ', '', $price) . '</grossprice>
  2865.                 <grosspricecarriage>' . str_replace(' ', '', $price) . '</grosspricecarriage>
  2866.                 <deliveryprice>0</deliveryprice>
  2867.                 <deliverytime>2</deliverytime>
  2868.                 <warranty>24</warranty>
  2869.                 <stock>' . $product->getAvailable() . '</stock>
  2870.                 <urlsite><![CDATA[https://www.furbify.hu/' . $link . ']]></urlsite>
  2871.                 <urlpicture>' . $imageLinksString . '</urlpicture>
  2872.                 <describe><![CDATA[' . strip_tags($description) . ']]></describe>
  2873.                 <category><![CDATA[' . $category . ']]></category>
  2874.             </product>';
  2875.         }
  2876.         $xml .= '</catalog>';
  2877.         $response = new Response($xml);
  2878.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  2879.         return $response;
  2880.     }
  2881.     /**
  2882.      * @Route("/argep.xml", name="argep_feed")
  2883.      * @param Request $request
  2884.      * @return Response
  2885.      * @throws Exception
  2886.      */
  2887.     public function argepFeedAction(Request $request)
  2888.     {
  2889.         $entityManager = $this->getEntityManager();
  2890.         $domain = $entityManager->getRepository(Domain::class)->findOneById(3);
  2891.         $translator = $this->getDatabaseTranslator($request);
  2892.         $products = $entityManager->createQuery("SELECT p
  2893.               FROM AtechNetCoreBundle:Product p
  2894.               LEFT JOIN p.type pt
  2895.               WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82")
  2896.             ->getResult();
  2897.         $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><termeklista></termeklista>');
  2898.         /**
  2899.          * @var Product $p
  2900.          * @var Photo $photo
  2901.          */
  2902.         foreach ($products as $product) {
  2903.             $pm = $product->getDomainMeta($domain);
  2904.             if (!$pm->isActive() || !$pm->isReady()) {
  2905.                 continue;
  2906.             }
  2907.             $category = $product->getType()->getTitle($translator);
  2908.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  2909.             $productName = $product->getName();
  2910.             $productCode = $product->getCode();
  2911.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  2912.             $link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
  2913.             $imageLink = '';
  2914.             $photos = $product->getAlbum()->getPhotos();
  2915.             if (count($photos) > 0) {
  2916.                 $photos = Collections::sort($photos, false);
  2917.                 foreach ($photos as $photo) {
  2918.                     if ($imageLink != '') {
  2919.                         continue;
  2920.                     }
  2921.                     $imageLink = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  2922.                 }
  2923.             }
  2924.             if ($imageLink == '') {
  2925.                 continue;
  2926.             }
  2927.             $price = $pm->isDiscounted() ? $pm->getDomainVatDiscount() : $pm->getDomainVatPrice();
  2928.             $delivery_time = '2-3 nap';
  2929.             $xmlNode = $xml->addChild('termek');
  2930.             $xmlNode->addChild('cikkszam', $product->getCode());
  2931.             $xmlNode->addChild('nev', htmlspecialchars($product->getFullTitle($translator)));
  2932.             $xmlNode->addChild('leiras', htmlspecialchars(strip_tags($product->getDescription())));
  2933.             $xmlNode->addChild('ar', number_format($price, 0, '', ''));
  2934.             $xmlNode->addChild('fotolink', $imageLink);
  2935.             $xmlNode->addChild('termeklink', 'https://www.furbify.hu/' . $link);
  2936.             $xmlNode->addChild('ido', $delivery_time);
  2937.             $xmlNode->addChild('szallitas', 0);
  2938.         }
  2939.         $fileData = $xml->asXML();
  2940.         $response = new Response($fileData);
  2941.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  2942.         return $response;
  2943.     }
  2944.     /**
  2945.      * @Route("/arukereso.xml", name="arukereso_feed")
  2946.      * @param Request $request
  2947.      * @return Response
  2948.      * @throws Exception
  2949.      */
  2950.     public function arukeresoFeedAction(Request $request): Response
  2951.     {
  2952.         $entityManager = $this->getEntityManager();
  2953.         $domain = $entityManager->getRepository(Domain::class)->findOneById(Domain::DOMAIN_ID_RT_HU);
  2954.         $translator = $this->getDatabaseTranslator($request);
  2955.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  2956.         $products = $entityManager->createQuery("SELECT p, pt, v, a, pm
  2957.               FROM AtechNetCoreBundle:Product p
  2958.               LEFT JOIN p.type pt
  2959.               LEFT JOIN p.vendor v
  2960.               LEFT JOIN p.album a
  2961.               JOIN p.metas pm WITH pm.domain = :domain
  2962.               WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82
  2963.                 AND pm.active = true
  2964.                 AND (pm.price > 0 OR pm.discount > 0)")
  2965.             ->setParameter('domain', $domain)
  2966.             ->getResult();
  2967.         // Prefetch spec attribute options (avoids N+1 lazy loads in the loop below).
  2968.         // Filters mirror the main query so this only touches the same product set.
  2969.         $entityManager->createQuery("SELECT p, pa, o, oa
  2970.               FROM AtechNetCoreBundle:Product p
  2971.               LEFT JOIN p.type pt
  2972.               JOIN p.metas pm WITH pm.domain = :domain
  2973.               LEFT JOIN p.productAttributes pa
  2974.               LEFT JOIN pa.option o
  2975.               LEFT JOIN o.attribute oa
  2976.               WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82
  2977.                 AND pm.active = true
  2978.                 AND (pm.price > 0 OR pm.discount > 0)")
  2979.             ->setParameter('domain', $domain)
  2980.             ->getResult();
  2981.         // Photos fetched separately (not joined) to avoid multiplying product/type/vendor/album
  2982.         // columns across the network for every photo row; grouped + pre-sorted by album id.
  2983.         $albumIds = [];
  2984.         foreach ($products as $product) {
  2985.             if ($product->getAlbum()) {
  2986.                 $albumIds[] = $product->getAlbum()->getId();
  2987.             }
  2988.         }
  2989.         $photosByAlbumId = [];
  2990.         if ($albumIds !== []) {
  2991.             $photoResults = $entityManager->createQuery("SELECT ph
  2992.                     FROM AtechNetCoreBundle:Photo ph
  2993.                     WHERE ph.album IN (:albumIds)
  2994.                     ORDER BY ph.sortIndex ASC")
  2995.                 ->setParameter('albumIds', array_unique($albumIds))
  2996.                 ->getResult();
  2997.             foreach ($photoResults as $photo) {
  2998.                 $photosByAlbumId[$photo->getAlbum()->getId()][] = $photo;
  2999.             }
  3000.         }
  3001.         // Shipping method is domain-wide, so it is resolved once instead of per product.
  3002.         $shippingMethod = $entityManager->getRepository(DomainShippingType::class)->findOneBy([
  3003.             'domain' => $domain,
  3004.             'type' => DomainShippingType::ShippingType_Carrier_Id,
  3005.             'activeOnWeb' => true,
  3006.         ]);
  3007.         $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><Products></Products>');
  3008.         foreach ($products as $product) {
  3009.             $productMeta = $product->getDomainMeta($domain);
  3010.             if (!$productMeta->isActive() || !$productMeta->isReady()) {
  3011.                 continue;
  3012.             }
  3013.             $imageLink = '';
  3014.             $photos = $photosByAlbumId[$product->getAlbum()?->getId()] ?? [];
  3015.             if (count($photos) > 0) {
  3016.                 $imageLink = $this->getImage(reset($photos), 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  3017.             }
  3018.             if ($imageLink == '') {
  3019.                 continue;
  3020.             }
  3021.             $price = $productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice();
  3022.             $netPrice = $productMeta->isDiscounted() ? $productMeta->getDomainDiscount() : $productMeta->getDomainPrice();
  3023.             $exp_name = explode(' ', $product->getFullTitle($translator));
  3024.             $categorytext = trim($product->getType()->getTitle());
  3025.             switch (strtolower($categorytext)) {
  3026.                 case 'software':
  3027.                     if (in_array('Office', $exp_name)) {
  3028.                         $categorytext = 'Számítógép > Irodai programok > Microsoft Irodai programok';
  3029.                     }
  3030.                     if (in_array('Windows', $exp_name)) {
  3031.                         $categorytext = 'Számítógép > Operációs rendszer > Microsoft Operációs rendszer';
  3032.                     }
  3033.                     if (in_array('ESET', $exp_name)) {
  3034.                         $categorytext = 'Számítógép > Vírusirtó';
  3035.                     }
  3036.                     break;
  3037.                 case 'notebook':
  3038.                     $categorytext = 'Számítógép > Notebook';
  3039.                     break;
  3040.                 case 'monitor':
  3041.                     $categorytext = 'Számítógép > Monitor';
  3042.                     break;
  3043.                 case 'pc':
  3044.                     if (in_array('GAMER', $exp_name)) {
  3045.                         $categorytext = 'Számítógép > Számítógép konfiguráció';
  3046.                     } else {
  3047.                         $categorytext = 'Számítógép';
  3048.                     }
  3049.                     break;
  3050.                 case 'tablet':
  3051.                     $categorytext = 'Számítógép > Tablet PC';
  3052.                     break;
  3053.                 case 'mouse':
  3054.                     $categorytext = 'Számítógép > Egér';
  3055.                     break;
  3056.                 case 'keyboard':
  3057.                     $categorytext = 'Számítógép > Billentyűzet';
  3058.                     break;
  3059.                 case 'interactive accessory':
  3060.                 case 'cable data':
  3061.                 case 'card reader':
  3062.                 case 'usb wifi':
  3063.                     $categorytext = 'Számítógép > Kábel, csatlakozó';
  3064.                     break;
  3065.                 case 'power bank':
  3066.                     $categorytext = 'Műszaki cikk > Power bank, külső akkumulátor';
  3067.                     break;
  3068.                 case 'headphones':
  3069.                     $categorytext = 'Műszaki cikk > Fülhallgató, fejhallgató';
  3070.                     break;
  3071.                 case 'pc accessory':
  3072.                     $categorytext = 'Számítógép > Kábel, csatlakozó';
  3073.                     break;
  3074.                 case 'toner':
  3075.                     $categorytext = 'Számítógép > Nyomtató patron, toner';
  3076.                     break;
  3077.                 case 'notebook battery':
  3078.                     $categorytext = 'Számítógép > Laptop akkumulátor';
  3079.                     break;
  3080.                 case 'ssd':
  3081.                     $categorytext = 'Számítógép > SSD meghajtó';
  3082.                     break;
  3083.                 case 'all in one':
  3084.                     $categorytext = 'Számítógép > Számítógép konfiguráció';
  3085.                     break;
  3086.             }
  3087.             $category = $product->getType()->getTitle($translator);
  3088.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  3089.             $productName = $product->getName();
  3090.             $productCode = $product->getCode();
  3091.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  3092.             $link = 'https://www.furbify.hu/' . $seoUrlHelper->slug($linkRaw);
  3093.             $xmlNode = $xml->addChild('product');
  3094.             $xmlNode->addChild('Identifier', $product->getId());
  3095.             $xmlNode->addChild('EanCode', $product->getEan());
  3096.             $xmlNode->addChild('Manufacturer', str_replace('&', 'and', $product->getVendor()->getName()));
  3097.             $xmlNode->addChild('Name', htmlspecialchars($product->getFullTitle($translator)));
  3098.             $xmlNode->addChild('Price', number_format($price, 0, '', ''));
  3099.             $xmlNode->addChild('NetPrice', number_format($netPrice, 0, '', ''));
  3100.             $xmlNode->addChild('DeliveryTime', 1);
  3101.             $xmlNode->addChild('ProductUrl', $link);
  3102.             $xmlNode->addChild('ImageUrl', $imageLink);
  3103.             $xmlNode->addChild('Description', htmlspecialchars(strip_tags($product->getDescription())));
  3104.             $xmlNode->addChild('Category', $categorytext);
  3105.             // Determine Delivery Cost
  3106.             if ($shippingMethod) {
  3107.                 if ($shippingMethod->getFreeShipLimit() > 0 && $price > $shippingMethod->getFreeShipLimit()) {
  3108.                     $xmlNode->addChild('DeliveryCost', 'FREE');
  3109.                 } else {
  3110.                     $xmlNode->addChild('DeliveryCost', number_format($shippingMethod->getPrice(), 0, '', ''));
  3111.                 }
  3112.             }
  3113.             if ($product->getSpecificationProductAttributeOptions()) {
  3114.                 $attributes = [];
  3115.                 foreach ($product->getSpecificationProductAttributeOptions() as $attributeOption) {
  3116.                     $option = $attributeOption->getOption();
  3117.                     $attributeId = $option->getAttribute()->getId();
  3118.                     // Skip OS & Quality
  3119.                     if ($attributeId == 41 || $attributeId == 101) {
  3120.                         continue;
  3121.                     }
  3122.                     if (!isset($attributes[$attributeId])) {
  3123.                         $attributes[$attributeId] = [
  3124.                             'title' => $option->getAttribute()->getTitle($translator),
  3125.                             'options' => [],
  3126.                         ];
  3127.                     }
  3128.                     $title = $option->getLongTitle($translator);
  3129.                     if (empty($title)) {
  3130.                         $title = $option->getTitle($translator);
  3131.                     }
  3132.                     $attributes[$attributeId]['options'][$attributeOption->getId()] = [
  3133.                         'title' => $title,
  3134.                         'multiplier' => $attributeOption->getMultiplier(),
  3135.                     ];
  3136.                 }
  3137.                 if (!empty($attributes)) {
  3138.                     $xmlAttributesNode = $xmlNode->addChild('Attributes');
  3139.                     foreach ($attributes as $attribute) {
  3140.                         $xmlAttributeNode = $xmlAttributesNode->addChild('Attribute');
  3141.                         $xmlAttributeNode->addChild('Attribute_name', $attribute['title']);
  3142.                         $attributeValue = '';
  3143.                         foreach ($attribute['options'] as $option) {
  3144.                             $attributeValue .= ($attributeValue != '' ? ', ' : '') . ($option['multiplier'] > 0 ? $option['multiplier'] . ' x ' : '') . $option['title'];
  3145.                         }
  3146.                         $xmlAttributeNode->addChild('Attribute_value', $attributeValue);
  3147.                     }
  3148.                 }
  3149.             }
  3150.         }
  3151.         $fileData = $xml->asXML();
  3152.         $response = new Response($fileData);
  3153.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  3154.         return $response;
  3155.     }
  3156.     /**
  3157.      * @Route("/{type}/active-campaign.xml", name="active_campaign_feed")
  3158.      * @param Request $request
  3159.      * @param $type
  3160.      * @return Response
  3161.      * @throws Exception
  3162.      */
  3163.     public function activeCampaignFeedAction(Request $request, $type)
  3164.     {
  3165.         $entityManager = $this->getEntityManager();
  3166.         $multistore = $this->getMultiStoreHelper($request);
  3167.         $seoUrl = $this->getSeoUrlHelper($request);
  3168.         $language = strtolower($multistore->getDefaultLanguage()->getCode());
  3169.         // Domain TLD
  3170.         $domainTLD = $language;
  3171.         if ($domainTLD == 'en') {
  3172.             $domainTLD = 'eu';
  3173.         }
  3174.         // Determine Domain ID
  3175.         $domainId = 0;
  3176.         $digits = 2;
  3177.         if ($type == 'wholesale') {
  3178.             switch ($language) {
  3179.                 case 'sk':
  3180.                     $domainId = Domain::DOMAIN_ID_WS_SK;
  3181.                     $digits = 2;
  3182.                     break;
  3183.                 case 'hu':
  3184.                     $domainId = Domain::DOMAIN_ID_WS_HU;
  3185.                     $digits = 0;
  3186.                     break;
  3187.                 case 'cz':
  3188.                     $domainId = Domain::DOMAIN_ID_WS_CZ;
  3189.                     $digits = 2;
  3190.                     break;
  3191.             }
  3192.         } elseif ($type == 'retail') {
  3193.             switch ($language) {
  3194.                 case 'sk':
  3195.                     $domainId = Domain::DOMAIN_ID_RT_SK;
  3196.                     $digits = 2;
  3197.                     break;
  3198.                 case 'hu':
  3199.                     $domainId = Domain::DOMAIN_ID_RT_HU;
  3200.                     $digits = 0;
  3201.                     break;
  3202.                 case 'cz':
  3203.                     $domainId = Domain::DOMAIN_ID_RT_CZ;
  3204.                     $digits = 2;
  3205.                     break;
  3206.             }
  3207.         }
  3208.         if ($domainId == 0) {
  3209.             return new Response('Feed not found! :(');
  3210.         }
  3211.         $domain = $entityManager->getRepository(Domain::class)->findOneById($domainId);
  3212.         $translator = $this->getDatabaseTranslator($request);
  3213.         // TypeId => productCount
  3214.         $productTypeListForActiveCampaignRSS = [
  3215.             ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 1,
  3216.             ProductType::PRODUCT_TYPE_ID_PC => 1,
  3217.             ProductType::PRODUCT_TYPE_ID_MONITOR => 1,
  3218.             ProductType::PRODUCT_TYPE_ID_TABLET => 1,
  3219.         ];
  3220.         $productList = [];
  3221.         foreach ($productTypeListForActiveCampaignRSS as $productTypeId => $count) {
  3222.             $productListToAdd = $entityManager->createQuery(
  3223.                 "SELECT p FROM AtechNetCoreBundle:Product p
  3224.                     LEFT JOIN p.metas pm
  3225.                     LEFT JOIN p.type pt
  3226.                     WHERE
  3227.                         p.available > 0 AND
  3228.                         pm.product = p AND pm.domain = :domainId AND
  3229.                         pm.discount > 0 AND
  3230.                         pm.discounted = 1 AND
  3231.                         pm.active = 1 AND
  3232.                         pm.listed = 1 AND
  3233.                         pm.orderable = 1 AND
  3234.                         pt.id = $productTypeId
  3235.                         AND p.qualityStatus != :qualityBazar
  3236.                     ORDER BY p.soldDuringTimeFrame DESC, pm.discount ASC")
  3237.                 ->setParameters([
  3238.                     'domainId' => $domainId,
  3239.                     'qualityBazar' => Product::QualityStatus_Bazaar,
  3240.                 ])
  3241.                 ->setMaxResults($count)
  3242.                 ->getResult()
  3243.             ;
  3244.             $productList = array_merge([], $productList, $productListToAdd);
  3245.         }
  3246.         if ($language == 'hu') {
  3247.             $oldPriceTxt = 'Eredeti ár:';
  3248.         } else {
  3249.             $oldPriceTxt = 'Pôvodná cena:';
  3250.         }
  3251.         $rss = '<?xml version="1.0" encoding="UTF-8" ?>
  3252.         <rss version="2.0">';
  3253.         foreach ($productList as $dp) {
  3254.             $category = $dp->getType()->getTitle($translator);
  3255.             $vendor = $dp->getVendor()->getName() != 'VARIOUS' ? $dp->getVendor()->getName() : '';
  3256.             $productName = $dp->getName();
  3257.             $productCode = $dp->getCode();
  3258.             $partnerLoginParameter = $type == 'wholesale' ? '?partner-link=1' : '';
  3259.             $linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
  3260.             $link = 'https://www.furbify.' . $domainTLD . '/' . $seoUrl->slug($linkRaw) . $partnerLoginParameter;
  3261.             $imageLink = '';
  3262.             $photos = $dp->getAlbum()->getPhotos();
  3263.             if (count($photos) > 0) {
  3264.                 $photos = Collections::sort($photos);
  3265.                 foreach ($photos as $photo) {
  3266.                     if ($imageLink != '') {
  3267.                         continue;
  3268.                     }
  3269.                     $imageLink = $this->getImage($photo, 'product/' . $dp->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  3270.                 }
  3271.             }
  3272.             if ($imageLink == '') {
  3273.                 continue;
  3274.             }
  3275.             $productMeta = $dp->getDomainMeta($domain);
  3276.             if ($dp->getAlbum()->getPhotos()->count() > 0) {
  3277.                 $rss .= '<channel>
  3278.                     <title>' . str_replace('&', '+', $dp->getName()) . '</title>
  3279.                     <link>' . $link . '</link>
  3280.                     <description>' . $dp->getDescription() . '</description>
  3281.                     <item>
  3282.                         <title>' . str_replace('&', '+', $dp->getVendor()->getName() . ' ' . $dp->getName()) . '</title>
  3283.                         <full_title>' . str_replace('&', '+', $dp->getVendor()->getName() . ' ' . $dp->getName()) . '</full_title>
  3284.                         <link>' . $link . '</link>
  3285.                         <description>' . $dp->getDescription() . '</description>
  3286.                         <price>' . number_format($domain->createVatPrice($productMeta->getDiscount()), $digits, '.', ' ') . ' ' . $domain->getCurrency() . '</price>
  3287.                         <old_price>' . $oldPriceTxt . ' ' . number_format($domain->createVatPrice($productMeta->getPrice()), $digits, '.', ' ') . ' ' . $domain->getCurrency() . '</old_price>
  3288.                         <image>
  3289.                             <url>' . $imageLink . '</url>
  3290.                         </image>
  3291.                     </item>
  3292.                 </channel>';
  3293.             }
  3294.         }
  3295.         $rss .= '</rss>';
  3296.         $response = new Response($rss);
  3297.         $response->headers->set('Content-Type', 'rss+xml;charset=utf-8');
  3298.         return $response;
  3299.     }
  3300.     /**
  3301.      * @Route("/klaviyo.xml", name="klaviyo_feed")
  3302.      * @param Request $request
  3303.      *
  3304.      * @return Response
  3305.      */
  3306.     public function klaviyoFeedAction(Request $request): Response
  3307.     {
  3308.         $products = $this->getEntityManager()->getRepository(Product::class)->createQueryBuilder('p')
  3309.             ->select(
  3310.                 'p.id',
  3311.                 'p.name',
  3312.                 'p.code',
  3313.                 'p.cacheDescription AS description',
  3314.                 't.title AS type',
  3315.                 'v.name AS vendor',
  3316.                 "CONCAT(t.title, ',', v.name) AS categories",
  3317.             )
  3318.             ->innerJoin('p.type', 't')
  3319.             ->innerJoin('p.vendor', 'v')
  3320.             ->where('p.available > 0')
  3321.             ->andWhere('p.inStock > 0')
  3322.             ->andWhere('p.archived = 0')
  3323.             ->andWhere('p.qualityStatus != :qualityBazar')
  3324.             ->setParameter('qualityBazar', Product::QualityStatus_Bazaar)
  3325.             ->andWhere('p.type in (:type)')
  3326.             ->setParameter('type', ProductType::getMainProductTypeIds())
  3327.             ->getQuery()->getResult();
  3328.         // Create a new DOMDocument
  3329.         $dom = new \DOMDocument('1.0', 'UTF-8');
  3330.         $dom->formatOutput = true; // Indent and pretty print output
  3331.         // Root element <Products>
  3332.         $productsElement = $dom->createElement('Products');
  3333.         $dom->appendChild($productsElement);
  3334.         // Add each product
  3335.         foreach ($products as $product) {
  3336.             $productElement = $dom->createElement('Product');
  3337.             foreach ($product as $key => $value) {
  3338.                 $childElement = $dom->createElement($key, htmlspecialchars($value));
  3339.                 $productElement->appendChild($childElement);
  3340.             }
  3341.             $productsElement->appendChild($productElement);
  3342.         }
  3343.         // Convert DOM to XML string
  3344.         $xmlContent = $dom->saveXML();
  3345.         return new Response($xmlContent, 200, [
  3346.             'Content-Type' => 'application/xml',
  3347.         ]);
  3348.     }
  3349.     /**
  3350.      * @Route("/pricemania.xml", name="pricemania_feed")
  3351.      * @param Request $request
  3352.      * @return Response
  3353.      */
  3354.     public function pricemaniaFeedAction(Request $request): Response
  3355.     {
  3356.         // Entity Manager
  3357.         $entityManager = $this->getEntityManager();
  3358.         // Multi-store
  3359.         $multistore = $this->getMultiStoreHelper($request);
  3360.         // Domain
  3361.         $domain = $multistore->getDomain();
  3362.         // Translator
  3363.         $translator = $this->getDatabaseTranslator($request);
  3364.         // Products
  3365.         $products = $entityManager->createQuery("SELECT p
  3366.                 FROM AtechNetCoreBundle:Product p 
  3367.                 WHERE p.archived = 0 AND p.available > 0 AND p.qualityStatus != " . Product::QualityStatus_New)
  3368.             ->getResult();
  3369.         // XML
  3370.         $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><products></products>');
  3371.         // Insert Products to XML
  3372.         foreach ($products as $product) {
  3373.             // Meta
  3374.             $productMeta = $product->getDomainMeta($domain);
  3375.             // Skip Inactive Product
  3376.             if (!$productMeta->isActive() || !$productMeta->isReady() || !$productMeta->isOrderable()) {
  3377.                 continue;
  3378.             }
  3379.             // Category
  3380.             $categorytext = trim($product->getType()->getTitle());
  3381.             switch (mb_strtolower($categorytext)) {
  3382.                 case 'notebook':
  3383.                     $categorytext = 'Počítače a kancelária > Notebooky';
  3384.                     break;
  3385.                 case 'monitor':
  3386.                     $categorytext = 'Počítače a kancelária > Monitory';
  3387.                     break;
  3388.                 case 'pc':
  3389.                 case 'pc set':
  3390.                     $categorytext = 'Počítače a kancelária > PC zostavy > Stolné počítače';
  3391.                     break;
  3392.                 case 'all in one':
  3393.                     $categorytext = 'Počítače a kancelária > PC zostavy > All in One počítače';
  3394.                     break;
  3395.                 case 'tablet':
  3396.                     $categorytext = 'Počítače a kancelária > Tablety';
  3397.                     break;
  3398.                 case 'mouse':
  3399.                     $categorytext = 'Počítače a kancelária > Klávesnice a myši > Myši';
  3400.                     break;
  3401.                 case 'keyboard':
  3402.                     $categorytext = 'Počítače a kancelária > Klávesnice a myši > Klávesnice';
  3403.                     break;
  3404.                 case 'interactive accessory':
  3405.                 case 'reduction':
  3406.                 case 'cable video':
  3407.                 case 'cable hdmi':
  3408.                     $categorytext = 'Počítače a kancelária > Káble a konektory > Video káble';
  3409.                     break;
  3410.                 case 'cable data':
  3411.                 case 'pc accessory':
  3412.                 case 'cable usb':
  3413.                     $categorytext = 'Počítače a kancelária > Káble a konektory > PC káble';
  3414.                     break;
  3415.                 case 'power bank':
  3416.                     $categorytext = 'TV, audio, video > Batérie a nabíjačky > Powerbanky';
  3417.                     break;
  3418.                 case 'card reader':
  3419.                 case 'usb card reader':
  3420.                     $categorytext = 'Počítače a kancelária > PC komponenty > Čítačky pamäťových kariet';
  3421.                     break;
  3422.                 case 'headphones':
  3423.                 case 'headset':
  3424.                     $categorytext = 'TV, audio, video > Audio > Slúchadlá';
  3425.                     break;
  3426.                 case 'toner':
  3427.                     $categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Tonery';
  3428.                     break;
  3429.                 case 'cartridge':
  3430.                     $categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Cartridge';
  3431.                     break;
  3432.                 case 'notebook battery':
  3433.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Batérie pre notebooky';
  3434.                     break;
  3435.                 case 'ssd':
  3436.                     $categorytext = 'Počítače a kancelária > PC komponenty > Pevné disky';
  3437.                     break;
  3438.                 case 'hdd 3,5"':
  3439.                 case 'hdd 2,5"':
  3440.                     $categorytext = 'Počítače a kancelária > PC komponenty > Pevné disky';
  3441.                     break;
  3442.                 case 'motherboard':
  3443.                     $categorytext = 'Počítače a kancelária > PC komponenty > Základné dosky';
  3444.                     break;
  3445.                 case 'webcam':
  3446.                     $categorytext = 'Počítače a kancelária > Webkamery';
  3447.                     break;
  3448.                 case 'ram pc':
  3449.                 case 'ram nb':
  3450.                     $categorytext = 'Počítače a kancelária > PC komponenty > Pamäte RAM';
  3451.                     break;
  3452.                 case 'odd pc':
  3453.                 case 'odd nb':
  3454.                 case 'usb other':
  3455.                     $categorytext = 'Počítače a kancelária > PC komponenty > Mechaniky';
  3456.                     break;
  3457.                 case 'usb wifi':
  3458.                     $categorytext = 'Počítače a kancelária > Sieťové prvky > WiFi adaptéry';
  3459.                     break;
  3460.                 case 'usb bluetooth':
  3461.                     $categorytext = 'Počítače a kancelária > Sieťové prvky > Bluetooth adaptéry';
  3462.                     break;
  3463.                 case 'docking station':
  3464.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Dokovacie stanice pre notebooky';
  3465.                     break;
  3466.                 case 'notebook display':
  3467.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky';
  3468.                     break;
  3469.                 case 'vga':
  3470.                     $categorytext = 'Počítače a kancelária > PC komponenty > Grafické karty';
  3471.                     break;
  3472.                 case 'notebook bag':
  3473.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Tašky a batohy pre notebooky';
  3474.                     break;
  3475.                 case 'cleaning pc/nb':
  3476.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Čistiace prostriedky a sady pre počítače';
  3477.                     break;
  3478.                 case 'notebook keyboard':
  3479.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky';
  3480.                     break;
  3481.                 case 'notebook bay':
  3482.                 case 'notebook cooler':
  3483.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Stojany a chladiace podložky pre notebooky';
  3484.                     break;
  3485.                 case 'speaker':
  3486.                     $categorytext = 'TV, audio, video > Audio > Reproduktory a reprosústavy';
  3487.                     break;
  3488.                 case 'hdd adapter':
  3489.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre pevné disky';
  3490.                     break;
  3491.                 case 'power supply':
  3492.                     $categorytext = 'Počítače a kancelária > PC komponenty > PC zdroje';
  3493.                     break;
  3494.                 case 'battery':
  3495.                     $categorytext = 'TV, audio, video > Batérie a nabíjačky > Alkalické a nabíjacie batérie';
  3496.                     break;
  3497.                 case 'usb hub':
  3498.                     $categorytext = 'Počítače a kancelária > PC komponenty > USB huby';
  3499.                     break;
  3500.                 case 'usb ethernet':
  3501.                     $categorytext = 'Počítače a kancelária > Sieťové prvky > Sieťové karty';
  3502.                     break;
  3503.                 case 'microphone':
  3504.                     $categorytext = 'TV, audio, video > Audio > Mikrofóny';
  3505.                     break;
  3506.                 case 'printer drum':
  3507.                     $categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Optické valce';
  3508.                     break;
  3509.                 case 'surge arrest':
  3510.                     $categorytext = 'Dom, byt a záhrada > Meracia technika a elektronika > Prepäťové ochrany';
  3511.                     break;
  3512.                 case 'projector':
  3513.                     $categorytext = 'TV, audio, video > Projekčná technika > Projektory';
  3514.                     break;
  3515.                 case 'case pc':
  3516.                     $categorytext = 'Počítače a kancelária > PC komponenty > PC skrinky';
  3517.                     break;
  3518.                 case 'mouse pad':
  3519.                     $categorytext = 'Počítače a kancelária > Klávesnice a myši > Podložky pod myš';
  3520.                     break;
  3521.                 case 'power adapter':
  3522.                     $categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Napájacie adaptéry pre notebooky';
  3523.                     break;
  3524.                 case 'projector accessory':
  3525.                     $categorytext = 'TV, audio, video > Projekčná technika > Príslušenstvo pre projektory';
  3526.                     break;
  3527.                 case 'cpu':
  3528.                     $categorytext = 'Počítače a kancelária > PC komponenty > Procesory';
  3529.                     break;
  3530.                 case 'sound card':
  3531.                     $categorytext = 'Počítače a kancelária > PC komponenty > Zvukové karty';
  3532.                     break;
  3533.                 case 'pci express card':
  3534.                     $categorytext = 'Počítače a kancelária > PC komponenty > Grafické karty';
  3535.                     break;
  3536.                 case 'printer':
  3537.                     $categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Tlačiarne';
  3538.                     break;
  3539.                 case 'microsd card':
  3540.                     $categorytext = 'Počítače a kancelária > PC komponenty > Pamäťové karty';
  3541.                     break;
  3542.                 default:
  3543.                     $categorytext = false;
  3544.             }
  3545.             if (!$categorytext) {
  3546.                 continue;
  3547.             }
  3548.             // Price
  3549.             $price = ($productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice());
  3550.             // Link
  3551.             $category = $product->getType()->getTitle($translator);
  3552.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  3553.             $productName = $product->getName();
  3554.             $productCode = $product->getCode();
  3555.             $link = $domain->getUrl() . '/' . ($this->getSeoUrlHelper($request))->slug(
  3556.                 $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode
  3557.             );
  3558.             // Image
  3559.             $image = '';
  3560.             $photos = $product->getAlbum()->getPhotos();
  3561.             if (count($photos) > 0) {
  3562.                 $photos = Collections::sort($photos, false);
  3563.                 $photo = $photos[array_keys($photos)[0]];
  3564.                 if (is_object($photo)) {
  3565.                     $image = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  3566.                 }
  3567.             }
  3568.             // Delivery Cost
  3569.             $deliveryCost = 0;
  3570.             $shippingMethod = $entityManager->getRepository(DomainShippingType::class)->findOneBy([
  3571.                 'domain' => $domain,
  3572.                 'type' => DomainShippingType::ShippingType_Carrier_Id,
  3573.                 'activeOnWeb' => true,
  3574.             ]);
  3575.             if ($shippingMethod) {
  3576.                 if ($price > $shippingMethod->getFreeShipLimit()) {
  3577.                     $deliveryCost = 0;
  3578.                 } else {
  3579.                     $deliveryCost = number_format($shippingMethod->getPrice(), 0, '', '');
  3580.                 }
  3581.             }
  3582.             // Quality
  3583.             if (in_array($product->getQualityStatus(), [Product::QualityStatus_Platinum, Product::QualityStatus_Unpacked, Product::QualityStatus_Refurbished_A_Plus])) {
  3584.                 $condition = 'a';
  3585.             } elseif (in_array($product->getQualityStatus(), [Product::QualityStatus_Gold, Product::QualityStatus_Silver])) {
  3586.                 $condition = 'b';
  3587.             } else {
  3588.                 $condition = 'c';
  3589.             }
  3590.             // Details - Mandatory
  3591.             $productNode = $xml->addChild('product');
  3592.             $productNode->addChild('id', $product->getId());
  3593.             $productNode->addChild('name', htmlspecialchars($product->getFullTitle($translator)));
  3594.             $productNode->addChild('description', htmlspecialchars(strip_tags($product->getDescription())));
  3595.             $productNode->addChild('Price', number_format($price, 2, '.', ''));
  3596.             $productNode->addChild('category', $categorytext);
  3597.             $productNode->addChild('manufacturer', str_replace('&', 'and', $product->getVendor()->getName()));
  3598.             $productNode->addChild('url', $link);
  3599.             $productNode->addChild('picture', $image);
  3600.             $productNode->addChild('shipping', $deliveryCost);
  3601.             $productNode->addChild('availability', 1);
  3602.             $productNode->addChild('product_type', 'refurbished');
  3603.             $productNode->addChild('condition', $condition);
  3604.             // Details - Additional
  3605.             $productNode->addChild('ean', $product->getEan());
  3606.             // Params
  3607.             if ($product->getSpecificationProductAttributeOptions()) {
  3608.                 $attributes = [];
  3609.                 foreach ($product->getSpecificationProductAttributeOptions() as $attributeOption) {
  3610.                     $option = $attributeOption->getOption();
  3611.                     $attributeId = $option->getAttribute()->getId();
  3612.                     // Skip OS & Quality
  3613.                     if ($attributeId == 41 || $attributeId == 101) {
  3614.                         continue;
  3615.                     }
  3616.                     if (!isset($attributes[$attributeId])) {
  3617.                         $attributes[$attributeId] = [
  3618.                             'title' => $option->getAttribute()->getTitle($translator),
  3619.                             'options' => [],
  3620.                         ];
  3621.                     }
  3622.                     $title = $option->getLongTitle($translator);
  3623.                     if (empty($title)) {
  3624.                         $title = $option->getTitle($translator);
  3625.                     }
  3626.                     $attributes[$attributeId]['options'][$attributeOption->getId()] = [
  3627.                         'title' => $title,
  3628.                         'multiplier' => $attributeOption->getMultiplier(),
  3629.                     ];
  3630.                 }
  3631.                 if (!empty($attributes)) {
  3632.                     $attributesNode = $productNode->addChild('params');
  3633.                     foreach ($attributes as $attribute) {
  3634.                         // Param
  3635.                         $attributeNode = $attributesNode->addChild('param');
  3636.                         // Param Name
  3637.                         $attributeNode->addChild('param_name', $attribute['title']);
  3638.                         // Param Values
  3639.                         $attributeValue = '';
  3640.                         foreach ($attribute['options'] as $option) {
  3641.                             $attributeValue .= ($attributeValue != '' ? ', ' : '') . ($option['multiplier'] > 0 ? $option['multiplier'] . ' x ' : '') . $option['title'];
  3642.                         }
  3643.                         $attributeNode->addChild('param_value', $attributeValue);
  3644.                     }
  3645.                 }
  3646.             }
  3647.         }
  3648.         // XML Output
  3649.         $output = $xml->asXML();
  3650.         // Response
  3651.         $response = new Response($output);
  3652.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  3653.         return $response;
  3654.     }
  3655.     /**
  3656.      * @Route("/cheapest-products-html", name="cheapest_products_html")
  3657.      * @param Request $request
  3658.      * @return Response
  3659.      * @throws \Psr\SimpleCache\InvalidArgumentException
  3660.      */
  3661.     public function cheapestProductsHtmlAction(Request $request)
  3662.     {
  3663.         $savedToken = '9653g4kg49fk094ut5rk094tk459t4';
  3664.         if ($savedToken !== $request->query->get('token')) {
  3665.             throw new AccessDeniedException();
  3666.         }
  3667.         $multistore = $this->getMultiStoreHelper($request);
  3668.         $domain = $multistore->getDomain();
  3669.         $languageCode = $domain->getLanguage()->getCode();
  3670.         $currency = $domain->getCurrency();
  3671.         $cache = $this->cache;
  3672.         // Domain TLD
  3673.         $domainTLD = $languageCode;
  3674.         if ($languageCode == 'en') {
  3675.             $domainTLD = 'eu';
  3676.         }
  3677.         $cacheKey = 'cheapest.product.feed.1.' . $domain->getId();
  3678.         $cacheItem = $cache->getItem($cacheKey);
  3679.         if ($languageCode == 'hu') {
  3680.             $iWantNotebook = 'Laptop érdekel';
  3681.             $iWantPcSet = 'PC-szett érdekel';
  3682.             $iWantPc = 'Asztali gép érdekel';
  3683.         } else {
  3684.             $iWantNotebook = 'Chcel by som notebook';
  3685.             $iWantPcSet = 'Chcel by som PC zostavu';
  3686.             $iWantPc = 'Chcel by som počítač';
  3687.         }
  3688.         if ($cacheItem->isHit()) {
  3689.             $data = $cacheItem->get();
  3690.         } else {
  3691.             $entityManager = $this->getEntityManager();
  3692.             $productHelper = $this->getProductHelper($request);
  3693.             $cheapestNotebook = $entityManager
  3694.                 ->createQuery("SELECT p
  3695.                 FROM AtechNetCoreBundle:Product p
  3696.                 LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
  3697.                 WHERE p.archived = 0 AND p.type = 52 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
  3698.                 ORDER BY pm.currentVatPrice ASC")
  3699.                 ->setParameters([
  3700.                     'domain' => $domain,
  3701.                 ])
  3702.                 ->setMaxResults(1)
  3703.                 ->getResult();
  3704.             if (count($cheapestNotebook) > 0) {
  3705.                 $cheapestNotebook = $cheapestNotebook[0];
  3706.             }
  3707.             $cheapestPcSet = $entityManager
  3708.                 ->createQuery("SELECT p
  3709.                 FROM AtechNetCoreBundle:Product p
  3710.                 LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
  3711.                 WHERE p.archived = 0 AND p.type = 107 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
  3712.                 ORDER BY pm.currentVatPrice ASC")
  3713.                 ->setParameters([
  3714.                     'domain' => $domain,
  3715.                 ])
  3716.                 ->setMaxResults(1)
  3717.                 ->getResult();
  3718.             if (count($cheapestPcSet) > 0) {
  3719.                 $cheapestPcSet = $cheapestPcSet[0];
  3720.             }
  3721.             $cheapestPc = $entityManager
  3722.                 ->createQuery("SELECT p
  3723.                 FROM AtechNetCoreBundle:Product p
  3724.                 LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
  3725.                 WHERE p.archived = 0 AND p.type = 60 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
  3726.                 ORDER BY pm.currentVatPrice ASC")
  3727.                 ->setParameters([
  3728.                     'domain' => $domain,
  3729.                 ])
  3730.                 ->setMaxResults(1)
  3731.                 ->getResult();
  3732.             if (count($cheapestPc) > 0) {
  3733.                 $cheapestPc = $cheapestPc[0];
  3734.             }
  3735.             $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  3736.             $data = '<div class="row bgCover noBorder borderSolid border3px cornersAll radius0 shadow0 P0-top P0-bottom P0H noTopMargin" id="row--46361-171-133" data-trigger="none" data-animate="fade" data-delay="500" data-title="3 column row - Clone" style="padding-top: 20px; padding-bottom: 60px; margin: 0px; outline: none;">';
  3737.             if ($cheapestNotebook instanceof Product) {
  3738.                 $notebook = $productHelper->getStructuredDataForProduct($cheapestNotebook);
  3739.                 $notebookImage = $placeholder;
  3740.                 if (is_object($notebook['images'])) {
  3741.                     $notebookImage = $this->getImage($notebook['images']->first(), 'product/' . $notebook['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  3742.                 }
  3743.                 $notebookPrice = number_format($notebook['isDiscounted'] ? $notebook['discountVatPrice'] : $notebook['vatPrice'], 0, '.', ' ');
  3744.                 $slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  3745.                     'query' => 'product_id=' . $cheapestNotebook->getId(),
  3746.                     'language' => $domain->getLanguage(),
  3747.                 ]);
  3748.                 if ($slug) {
  3749.                     $notebookLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
  3750.                 } else {
  3751.                     $notebookLink = 'https://www.furbify.' . $domainTLD . '/product/' . $notebook['id'];
  3752.                 }
  3753.                 $notebookCategoryLink = $notebookLink;
  3754.                 $data .= '<div id="col-left-121-152-185-125" class="col-md-4 innerContent col_left ui-resizable" data-col="left" data-trigger="none" data-animate="fade" data-delay="500" data-title="1st column" style="outline: none;"><div class="col-inner bgCover  noBorder borderSolid border3px cornersAll radius0 shadow0 P0-top P0-bottom P0H noTopMargin" style="padding: 0 10px">
  3755.                 <div class="de elImageWrapper de-image-block elAlign_center elMargin0 ui-droppable de-editable" id="tmp_image-57065-100-168" data-de-type="img" data-de-editing="false" data-title="image" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 0px; outline: none; cursor: pointer;" aria-disabled="false" data-imagelink="' . $notebookCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc">
  3756.                 <img decoding="async" src="' . $notebookImage . '" class="elIMG ximg" alt="' . $notebook['title'] . '" data-imagelink="' . $notebookCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" tabindex="0">
  3757.                 </div>
  3758.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-17960-163-164" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 30px; outline: none; cursor: pointer;" aria-disabled="false">
  3759.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 20px;" data-bold="inherit" data-gramm="false" contenteditable="false"><font color="#149adb"><b><a href="' . $notebookLink . '?utm_source=clickfunnels&amp;utm_medium=cpc&amp;utm_campaign=landing-netezes" id="link-74417" class="" target="_parent" rel="noopener noreferrer" style="color: rgb(20, 154, 219);">' . $notebook['vendor'] . ' ' . $notebook['title'] . '</a></b></font></div>
  3760.                 </div>
  3761.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="tmp_paragraph-27767-133-162" data-de-type="headline" data-de-editing="false" data-title="Paragraph" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 15px; outline: none; cursor: pointer;" aria-disabled="false">
  3762.                 <div class="ne elHeadline hsSize1 lh5 elMargin0 elBGStyle0 hsTextShadow0 lh2" data-bold="inherit" style="text-align: center; color: rgb(71, 71, 71); font-size: 12px;" data-gramm="false" contenteditable="false">
  3763.                 <div>' . $notebook['shortDescription'] . '</div>
  3764.                 <div><br></div>
  3765.                 </div>
  3766.                 </div>
  3767.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-61989-167-139" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 20px; outline: none; cursor: pointer;" aria-disabled="false">
  3768.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 32px; color: rgb(29, 56, 75);" data-bold="inherit" data-gramm="false" contenteditable="false"><b>' . $notebookPrice . ' ' . $currency . '</b></div>
  3769.                 </div>
  3770.                 <div class="de elBTN elAlign_center elMargin0 ui-droppable de-editable" id="button-93471-119-149-108" data-de-type="button" data-de-editing="false" data-title="button" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 30px; outline: none; cursor: pointer;" data-elbuttontype="1" aria-disabled="false" data-element-theme="customized">
  3771.                 <a href="' . $notebookCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" class="elButton elButtonSize1 elButtonColor1 elButtonPadding2 elButtonCorner60 elButtonTxtColor1 elBTN_b_none elButtonShadowFlatHighlight elBTNone elButtonBlock elBtnVP_15 elBtnHP_30 elButtonFull" style="color: rgb(255, 255, 255); background: rgb(250, 137, 0); font-size: 20px;" rel="noopener noreferrer" target="_blank" id="undefined-569-374-1180-895"><span class="elButtonMain">' . $iWantNotebook . '</span><span class="elButtonSub"></span></a>
  3772.                 </div>
  3773.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-10987-171" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 0px; outline: none; cursor: pointer;" aria-disabled="false">
  3774.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 22px; color: rgb(71, 71, 71);" data-bold="inherit" data-gramm="false" contenteditable="false"><br></div>
  3775.                 </div>
  3776.                 </div></div>';
  3777.             }
  3778.             if ($cheapestPcSet instanceof Product) {
  3779.                 $pcSet = $productHelper->getStructuredDataForProduct($cheapestPcSet);
  3780.                 $pcSetImage = $placeholder;
  3781.                 if (is_object($notebook['images'])) {
  3782.                     $pcSetImage = $this->getImage($pcSet['images']->first(), 'product/' . $pcSet['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  3783.                 }
  3784.                 $pcSetPrice = number_format($pcSet['isDiscounted'] ? $pcSet['discountVatPrice'] : $pcSet['vatPrice'], 0, '.', ' ');
  3785.                 ;
  3786.                 $slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  3787.                     'query' => 'product_id=' . $cheapestPcSet->getId(),
  3788.                     'language' => $domain->getLanguage(),
  3789.                 ]);
  3790.                 if ($slug) {
  3791.                     $pcSetLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
  3792.                 } else {
  3793.                     $pcSetLink = 'https://www.furbify.' . $domainTLD . '/product/' . $pcSet['id'];
  3794.                 }
  3795.                 $pcSetCategoryLink = $pcSetLink;
  3796.                 $data .= '<div id="col-center-154-102-179-130" class="col-md-4 innerContent col_right ui-resizable" data-col="center" data-trigger="none" data-animate="fade" data-delay="500" data-title="2nd column" style="outline: none;"><div class="col-inner bgCover  noBorder borderSolid border3px cornersAll radius0 shadow0 P0-top P0-bottom P0H noTopMargin" style="padding: 0 10px">
  3797.                 <div class="de elImageWrapper de-image-block elAlign_center elMargin0 ui-droppable de-editable" id="img-21938-151-144" data-de-type="img" data-de-editing="false" data-title="image" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 0px; outline: none; cursor: pointer;" aria-disabled="false" data-imagelink="' . $pcSetCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc">
  3798.                 <img decoding="async" src="' . $pcSetImage . '" class="elIMG ximg" alt="' . $pcSet['title'] . '" data-imagelink="' . $pcSetCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" tabindex="0">
  3799.                 </div>
  3800.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-62446-142-103" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 30px; outline: none; cursor: pointer;" aria-disabled="false">
  3801.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 20px;" data-bold="inherit" data-gramm="false" contenteditable="false"><b><a href="' . $pcSetLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" id="link-39965" class="" target="_parent" rel="noopener noreferrer"></a><a href="' . $pcSetLink . '?utm_source=clickfunnels&amp;utm_medium=cpc&amp;utm_campaign=landing-netezes" id="link-23143" class="" target="_parent" rel="noopener noreferrer" style="color: rgb(20, 154, 219);">' . $pcSet['vendor'] . ' ' . $pcSet['title'] . '</a></b></div>
  3802.                 </div>
  3803.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-53989-126-140" data-de-type="headline" data-de-editing="false" data-title="Paragraph" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 15px; outline: none; cursor: pointer;" aria-disabled="false">
  3804.                 <div class="ne elHeadline hsSize1 lh5 elMargin0 elBGStyle0 hsTextShadow0 lh2" data-bold="inherit" style="text-align: center; color: rgb(71, 71, 71); font-size: 12px;" data-gramm="false" contenteditable="false">
  3805.                 <div>' . $pcSet['shortDescription'] . '</div>
  3806.                 <div><br></div>
  3807.                 </div>
  3808.                 </div>
  3809.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-86005-186-138" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 20px; outline: none; cursor: pointer;" aria-disabled="false">
  3810.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 32px; color: rgb(248, 109, 93);" data-bold="inherit" data-gramm="false" contenteditable="false"><b>' . $pcSetPrice . ' ' . $currency . '</b></div>
  3811.                 </div>
  3812.                 <div class="de elBTN elAlign_center elMargin0 ui-droppable de-editable" id="button-38091-137-125" data-de-type="button" data-de-editing="false" data-title="button" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 30px; outline: none; cursor: pointer;" data-elbuttontype="1" aria-disabled="false" data-element-theme="customized">
  3813.                 <a href="' . $pcSetCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" class="elButton elButtonSize1 elButtonColor1 elButtonPadding2 elButtonCorner60 elButtonTxtColor1 elBTN_b_none elButtonShadowFlatHighlight elBTNone elButtonBlock elBtnVP_15 elBtnHP_30 elButtonFull" style="color: rgb(255, 255, 255); background: rgb(250, 137, 0); font-size: 20px;" rel="noopener noreferrer" target="_blank" id="undefined-569-374-1180-895-397"><span class="elButtonMain">' . $iWantPcSet . '</span><span class="elButtonSub"></span></a>
  3814.                 </div>
  3815.                 </div></div>';
  3816.             }
  3817.             if ($cheapestPc instanceof Product) {
  3818.                 $pc = $productHelper->getStructuredDataForProduct($cheapestPc);
  3819.                 $pcImage = $placeholder;
  3820.                 if (is_object($notebook['images'])) {
  3821.                     $pcImage = $this->getImage($pc['images']->first(), 'product/' . $pc['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  3822.                 }
  3823.                 $pcPrice = number_format($pc['isDiscounted'] ? $pc['discountVatPrice'] : $pc['vatPrice'], 0, '.', ' ');
  3824.                 ;
  3825.                 $slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  3826.                     'query' => 'product_id=' . $cheapestPc->getId(),
  3827.                     'language' => $domain->getLanguage(),
  3828.                 ]);
  3829.                 if ($slug) {
  3830.                     $pcLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
  3831.                 } else {
  3832.                     $pcLink = 'https://www.furbify.' . $domainTLD . '/product/' . $pc['id'];
  3833.                 }
  3834.                 $pcCategoryLink = $pcLink;
  3835.                 $data .= '<div id="col-right-108-143-131-131" class="col-md-4 innerContent col_right ui-resizable" data-col="right" data-trigger="none" data-animate="fade" data-delay="500" data-title="3rd column" style="outline: none;"><div class="col-inner bgCover  noBorder borderSolid border3px cornersAll radius0 shadow0 P0-top P0-bottom P0H noTopMargin" style="padding: 0 10px">
  3836.                 <div class="de elImageWrapper de-image-block elAlign_center elMargin0 ui-droppable de-editable" id="tmp_image-79866-151-158" data-de-type="img" data-de-editing="false" data-title="image" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 0px; outline: none; cursor: pointer;" aria-disabled="false" data-imagelink="' . $pcCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc">
  3837.                 <img decoding="async" src="' . $pcImage . '" class="elIMG ximg" alt="' . $pc['title'] . '" data-imagelink="' . $pcCategoryLink . '?utm_source=clickfunnels&amp;utm_medium=cpc" tabindex="0">
  3838.                 </div>
  3839.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-57471-181-104" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 30px; outline: none; cursor: pointer;" aria-disabled="false">
  3840.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 20px;" data-bold="inherit" data-gramm="false" contenteditable="false"><b><a href="' . $pcLink . '?utm_source=clickfunnels&amp;utm_medium=cpc&amp;utm_campaign=landing-netezes" id="link-41098" class="" target="_parent" rel="noopener noreferrer" style="color: rgb(20, 154, 219);">' . $pc['vendor'] . ' ' . $pc['title'] . '</a></b></div>
  3841.                 </div>
  3842.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="tmp_paragraph-65692-134-167" data-de-type="headline" data-de-editing="false" data-title="Paragraph" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 15px; outline: none; cursor: pointer;" aria-disabled="false">
  3843.                 <div class="ne elHeadline hsSize1 lh5 elMargin0 elBGStyle0 hsTextShadow0 lh2" data-bold="inherit" style="text-align: center; color: rgb(71, 71, 71); font-size: 12px;" data-gramm="false" contenteditable="false">
  3844.                 <div>' . $pc['shortDescription'] . '</div>
  3845.                 <div><br></div>
  3846.                 </div>
  3847.                 </div>
  3848.                 <div class="de elHeadlineWrapper ui-droppable de-editable" id="headline-39973-150-123" data-de-type="headline" data-de-editing="false" data-title="sub-headline" data-ce="true" data-trigger="none" data-animate="fade" data-delay="500" data-gramm="false" style="margin-top: 20px; outline: none; cursor: pointer;" aria-disabled="false">
  3849.                 <div class="ne elHeadline hsSize2 lh3 elMargin0 elBGStyle0 hsTextShadow0" style="text-align: center; font-size: 32px; color: rgb(29, 56, 75);" data-bold="inherit" data-gramm="false" contenteditable="false"><b>' . $pcPrice . ' ' . $currency . '</b></div>
  3850.                 </div>
  3851.                 <div class="de elBTN elAlign_center elMargin0 ui-droppable de-editable" id="button-80574-149-162" data-de-type="button" data-de-editing="false" data-title="button" data-ce="false" data-trigger="none" data-animate="fade" data-delay="500" style="margin-top: 30px; outline: none; cursor: pointer;" data-elbuttontype="1" aria-disabled="false" data-element-theme="customized">
  3852.                 <a href="' . $pcCategoryLink . 'utm_source=clickfunnels&amp;utm_medium=cpc" class="elButton elButtonSize1 elButtonColor1 elButtonPadding2 elButtonCorner60 elButtonTxtColor1 elBTN_b_none elButtonShadowFlatHighlight elBTNone elButtonBlock elBtnHP_30 elBtnVP_15 elButtonFull" style="color: rgb(255, 255, 255); background: rgb(250, 137, 0); font-size: 20px;" rel="noopener noreferrer" target="_blank" id="undefined-569-374-1180-895-397-558"><span class="elButtonMain">' . $iWantPc . '</span><span class="elButtonSub"></span></a>
  3853.                 </div>
  3854.                 </div></div>';
  3855.             }
  3856.             $data .= '</div>';
  3857.             $cacheItem->set($data);
  3858.             $cacheItem->expiresAfter(self::CACHE_LIFETIME_1_HOUR);
  3859.             $cache->save($cacheItem);
  3860.         }
  3861.         return new Response($data, 200, [
  3862.             'Access-Control-Allow-Origin' => '*',
  3863.         ]);
  3864.     }
  3865.     /**
  3866.      * @Route("/set-cookies", name="set_cookies")
  3867.      * @param Request $request
  3868.      * @return JsonResponse
  3869.      */
  3870.     public function setCookiesAction(Request $request)
  3871.     {
  3872.         $cookieConsent = [];
  3873.         $userCookieSettings = $request->request->get('cookieConsent');
  3874.         //> Google Tag Manager
  3875.             // Cookie Name
  3876.             $gtmCookieName = 'frb_gtm_cookie_consent';
  3877.             // Cookie Value
  3878.             $gtmCookieValue = '';
  3879.             // Necessary Cookies
  3880.             $cookieConsent['acceptNecessaryCookies'] = true;
  3881.             // Statistical Cookies
  3882.             if ( isset($userCookieSettings['statistical']) && $userCookieSettings['statistical'] == 'granted' ) {
  3883.                 $cookieConsent['acceptStatisticalCookies'] = true;
  3884.                 $gtmCookieValue = 'analyticsConsentGranted';
  3885.             }
  3886.             // Marketing Cookies
  3887.             if ( isset($userCookieSettings['marketing']) && $userCookieSettings['marketing'] == 'granted' ) {
  3888.                 $cookieConsent['acceptMarketingCookies'] = true;
  3889.                 $gtmCookieValue .= ( !empty($gtmCookieValue) ? ',' : '' ) . 'adConsentGranted';
  3890.             }
  3891.             // Save Cookie
  3892.             setcookie($gtmCookieName, $gtmCookieValue, time() + ( 60 * 60 * 24 * 30 * 6 ));
  3893.         //< Google Tag Manager
  3894.         // All Cookies Accepted
  3895.         if ( count($cookieConsent) == 3 ) {
  3896.             $json['accept'] = true;
  3897.             setcookie('frb_cookie_consent', 'all', time() + ( 60 * 60 * 24 * 30 * 6 ));
  3898.         }
  3899.         // Selected Cookies Accepted
  3900.         elseif ( count($cookieConsent) > 1 ) {
  3901.             $json['custom'] = $cookieConsent;
  3902.             setcookie('frb_cookie_consent', implode(',', array_keys($cookieConsent)), time() + ( 60 * 60 * 24 * 30 * 6 ));
  3903.         }
  3904.         // All Cookies Declined
  3905.         else {
  3906.             $json['decline'] = true;
  3907.             setcookie('frb_cookie_consent', 'decline', time() + ( 60 * 60 * 24 * 30 ));
  3908.         }
  3909.         return new JsonResponse($json);
  3910.     }
  3911.     /**
  3912.      * @return array
  3913.      */
  3914.     protected function getCookieChoices(): array
  3915.     {
  3916.         return [
  3917.             'read-cookies-consent',
  3918.         ];
  3919.     }
  3920.     /**
  3921.      * @Route("/survey/save-answer", name="survey_save_answer")
  3922.      * @param Request $request
  3923.      * @return JsonResponse
  3924.      */
  3925.     public function saveSurveyAnswerAction(Request $request)
  3926.     {
  3927.         $req = $request->request;
  3928.         $questionId = $req->get('questionId');
  3929.         $questionType = $req->get('questionType');
  3930.         $wasLastQuestion = $req->get('wasLastQuestion');
  3931.         $answers = $req->get('answers');
  3932.         $orderId = $req->get('orderId');
  3933.         $question = false;
  3934.         $order = false;
  3935.         $entityManager = $this->getEntityManager();
  3936.         if (!is_numeric($questionId) || !is_numeric($questionType) || !is_numeric($wasLastQuestion) || !is_numeric($orderId)) {
  3937.             $data = [
  3938.                 'result' => 'failed',
  3939.             ];
  3940.         } else {
  3941.             foreach ($answers as $answer) {
  3942.                 $surveyOptionAnswer = null;
  3943.                 $surveyTextAnswer = null;
  3944.                 if (!$question) {
  3945.                     $question = $entityManager->getRepository(SurveyQuestion::class)->findOneById($questionId);
  3946.                 }
  3947.                 if (!$order) {
  3948.                     $order = $entityManager->getRepository(Order::class)->findOneById($orderId);
  3949.                 }
  3950.                 if (in_array($questionType, [SurveyQuestion::TYPE_OPTIONS, SurveyQuestion::TYPE_CHECKBOXES])) {
  3951.                     if ($questionType == SurveyQuestion::TYPE_OPTIONS) {
  3952.                         $surveyOptionAnswer = $entityManager->getRepository(SurveyQuestionOption::class)->findOneById($answer);
  3953.                     }
  3954.                     if ($questionType == SurveyQuestion::TYPE_CHECKBOXES) {
  3955.                         $questionData = $this->getQuestionData($answer);
  3956.                         $surveyOptionAnswer = $entityManager->getRepository(SurveyQuestionOption::class)->findOneById($questionData['optionId']);
  3957.                     }
  3958.                 } else {
  3959.                     $surveyTextAnswer = $answer;
  3960.                 }
  3961.                 $this->createSurveyAnswer($question, $order, $surveyOptionAnswer, $surveyTextAnswer);
  3962.             }
  3963.             $this->getEntityManager()->flush();
  3964.             $data = [
  3965.                 'result' => 'success',
  3966.             ];
  3967.         }
  3968.         return new JsonResponse($data);
  3969.     }
  3970.     /**
  3971.      * @param $string
  3972.      * @return array
  3973.      */
  3974.     private function getQuestionData($string)
  3975.     {
  3976.         $data = explode('_', str_replace('answer_', '', $string));
  3977.         $responseArray = [
  3978.             'questionId' => false,
  3979.             'optionId' => false,
  3980.         ];
  3981.         if (isset($data[0])) {
  3982.             $responseArray['questionId'] = $data[0];
  3983.         }
  3984.         if (isset($data[1])) {
  3985.             $responseArray['optionId'] = $data[1];
  3986.         }
  3987.         return $responseArray;
  3988.     }
  3989.     /**
  3990.      * @param SurveyQuestion $question
  3991.      * @param Order|null $order
  3992.      * @param SurveyQuestionOption|null $surveyQuestionOption
  3993.      * @param null $textAnswer
  3994.      * @return bool
  3995.      */
  3996.     private function createSurveyAnswer(SurveyQuestion $question, Order $order = null, SurveyQuestionOption $surveyQuestionOption = null, $textAnswer = null)
  3997.     {
  3998.         $surveyAnswer = new SurveyAnswer();
  3999.         $surveyAnswer->setQuestion($question);
  4000.         if (!is_null($order)) {
  4001.             $surveyAnswer->setOrder($order);
  4002.         }
  4003.         if (!is_null($surveyQuestionOption)) {
  4004.             $surveyAnswer->setOptionAnswer($surveyQuestionOption);
  4005.         }
  4006.         if (!is_null($textAnswer)) {
  4007.             $surveyAnswer->setTextAnswer(TextHelper::removeSymbols($textAnswer));
  4008.         }
  4009.         $this->getEntityManager()->persist($surveyAnswer);
  4010.         return true;
  4011.     }
  4012.     /**
  4013.      * @Route("/unbox", name="post_order_survey_gate")
  4014.      * @param Request $request
  4015.      * @param $orderId
  4016.      * @param $token
  4017.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
  4018.      */
  4019.     public function postOrderSurveyGateAction(Request $request)
  4020.     {
  4021.         $req = $request->request;
  4022.         $data = [];
  4023.         $data['orderId'] = '';
  4024.         $data['customerEmail'] = '';
  4025.         $data['showError'] = $alreadyRegistered = false;
  4026.         $multistoreHelper = $this->getMultiStoreHelper($request);
  4027.         $entityManager = $this->getEntityManager();
  4028.         $domain = $multistoreHelper->getDomain();
  4029.         if ($domain->getLanguage()->getId() == Language::LANGUAGE_ID_CZ) {
  4030.             return $this->redirectToRoute('review_list');
  4031.         }
  4032.         $data['domainId'] = $domain->getId();
  4033.         if (
  4034.             !is_null($req->get('customerEmail')) &&
  4035.             $req->get('customerEmail') != '' &&
  4036.             !is_null($req->get('orderId')) &&
  4037.             $req->get('orderId') != '' &&
  4038.             is_numeric($req->get('orderId'))
  4039.         ) {
  4040.             $data['orderId'] = $orderId = $request->get('orderId');
  4041.             $data['customerEmail'] = $customerEmail = $request->get('customerEmail');
  4042.             $orders = $entityManager->createQuery(
  4043.                 "SELECT o
  4044.                   FROM AtechNetCoreBundle:Order o
  4045.                   LEFT JOIN o.documents d
  4046.                   WHERE o.billingEmail = :customerEmail
  4047.                     AND (o.id = :orderId OR d.code = :orderId)
  4048.                     AND o.domain = :domain
  4049.                     AND o.status = :status"
  4050.             )
  4051.                 ->setParameters([
  4052.                     'customerEmail' => $customerEmail,
  4053.                     'orderId' => $orderId,
  4054.                     'domain' => $domain,
  4055.                     'status' => Order::STATUS_FINISHED,
  4056.                 ])
  4057.                 ->setMaxResults(1)
  4058.                 ->getResult();
  4059.             if (isset($orders[0])) {
  4060.                 $order = $orders[0];
  4061.                 $alreadyRegistered = $entityManager->createQuery(
  4062.                     "SELECT r
  4063.                         FROM AtechNetCoreBundle:Review r
  4064.                         WHERE IDENTITY(r.order) = :orderId AND IDENTITY(r.customer) = :customerId"
  4065.                 )
  4066.                     ->setParameters([
  4067.                         'orderId' => $order->getId(),
  4068.                         'customerId' => $order->getCustomer()->getId(),
  4069.                     ])
  4070.                     ->getResult();
  4071.                 if (!$alreadyRegistered) {
  4072.                     return $this->redirectToRoute(
  4073.                         'post_order_survey',
  4074.                         [
  4075.                             'orderId' => $order->getId(),
  4076.                             'token' => $this->getOrderPrivateKey($order),
  4077.                         ]
  4078.                     );
  4079.                 }
  4080.             }
  4081.             $data['showError'] = $alreadyRegistered ? 'This order has been already registered!' : 'We could not find a matching order!';
  4082.         }
  4083.         $staticPageId = 0;
  4084.         switch ($domain->getLanguage()->getCode()) {
  4085.             case 'sk':
  4086.                 $data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
  4087.                 $data['companyLine2'] = '44827385';
  4088.                 $data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
  4089.                 $data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
  4090.                 $staticPageId = 138;
  4091.                 break;
  4092.             case 'hu':
  4093.                 $data['companyLine1'] = 'Kelemen László utca 1, 2900 Komárom, Magyarország';
  4094.                 $data['companyLine2'] = '11-09-030312';
  4095.                 $data['rulesLink'] = 'https://www.furbify.hu/ertekeloi-nyeremenyjatek-2020-szabalyzat';
  4096.                 $data['privacyLink'] = 'https://www.furbify.hu/adatkezelesi-tajekoztato';
  4097.                 $staticPageId = 137;
  4098.                 break;
  4099.             case 'cz':
  4100.                 $data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
  4101.                 $data['companyLine2'] = '44827385';
  4102.                 $data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
  4103.                 $data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
  4104.                 $staticPageId = 139;
  4105.                 break;
  4106.         }
  4107.         $termsPageLink = $entityManager->createQuery(
  4108.             "SELECT pm.link
  4109.                 FROM AtechNetCoreBundle:PageMeta pm
  4110.                 WHERE IDENTITY(pm.staticPage) = :staticPageId"
  4111.         )
  4112.             ->setParameters([
  4113.                 'staticPageId' => $staticPageId,
  4114.             ])
  4115.             ->getOneOrNullResult();
  4116.         $data['termsPageLink'] = $termsPageLink ? $termsPageLink['link'] : null;
  4117.         return $this->render('AtechNetCoreBundle/Survey/PostOrderSurveyGate.html.twig', $data);
  4118.     }
  4119.     /**
  4120.      * @Route("/post-order-survey/{orderId}/{token}", name="post_order_survey")
  4121.      * @param Request $request
  4122.      * @param $orderId
  4123.      * @param $token
  4124.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
  4125.      */
  4126.     public function postOrderSurveyAction(Request $request, $orderId, $token)
  4127.     {
  4128.         /**
  4129.          * @var Product $product
  4130.          * @var Order $order
  4131.          */
  4132.         $data = [];
  4133.         $inputParametersPassed = true;
  4134.         if (!is_numeric($orderId)) {
  4135.             $inputParametersPassed = false;
  4136.         }
  4137.         $order = $this->getEntityManager()->getRepository(Order::class)->findOneById($orderId);
  4138.         if (!$order) {
  4139.             $inputParametersPassed = false;
  4140.         }
  4141.         if ($this->getOrderPrivateKey($order) !== $token) {
  4142.             $inputParametersPassed = false;
  4143.         }
  4144.         $alreadyRegistered = $this->getEntityManager()->createQuery(
  4145.             "SELECT r
  4146.                 FROM AtechNetCoreBundle:Review r
  4147.                 WHERE IDENTITY(r.order) = :orderId AND IDENTITY(r.customer) = :customerId"
  4148.         )
  4149.             ->setParameters([
  4150.                 'orderId' => $order->getId(),
  4151.                 'customerId' => $order->getCustomer()->getId(),
  4152.             ])
  4153.             ->getResult();
  4154.         if (!$inputParametersPassed || $alreadyRegistered) {
  4155.             return $this->redirectToRoute('not_found');
  4156.         }
  4157.         $req = $request->request;
  4158.         $data['surveySubmited'] = false;
  4159.         $data['domainId'] = $order->getDomain()->getId();
  4160.         if (!is_null($req->get('orderId')) && $req->get('orderId') == $order->getId()) {
  4161.             $name = $order->getBillingFirstName();
  4162.             $language = $order->getDomain()->getLanguage();
  4163.             $customer = $order->getCustomer();
  4164.             $entityManager = $this->getEntityManager();
  4165.             $addedSurveyMedias = [];
  4166.             $addedReviews = [];
  4167.             $files = $request->files->get('reviewImages');
  4168.             $subDirectory = 'survey-images';
  4169.             $fileCount = 0;
  4170.             foreach ($files as $file) {
  4171.                 $response = $this->uploadFile($file, $subDirectory, ['image/jpeg', 'image/jpg', 'image/png']);
  4172.                 if ($response && $fileCount < 3) {
  4173.                     $surveyMedia = new SurveyMedia();
  4174.                     $surveyMedia->setOrder($order);
  4175.                     $surveyMedia->setDomain($order->getDomain());
  4176.                     $surveyMedia->setFilename($response['filename']);
  4177.                     $surveyMedia->setDirectory('uploads/' . $subDirectory);
  4178.                     $surveyMedia->setMimeType($response['mimeType']);
  4179.                     $entityManager->persist($surveyMedia);
  4180.                     $addedSurveyMedias[] = $surveyMedia;
  4181.                     $fileCount++;
  4182.                 }
  4183.             }
  4184.             $siteRating = $req->get('text-review');
  4185.             if (trim($siteRating) != '') {
  4186.                 $sa = new SurveyAnswer();
  4187.                 switch ($order->getDomain()->getId()) {
  4188.                     case 1:
  4189.                         $questionId = 13;
  4190.                         break;
  4191.                     case 3:
  4192.                         $questionId = 14;
  4193.                         break;
  4194.                     default:
  4195.                         $questionId = 13;
  4196.                 }
  4197.                 $surveyQuestion = $entityManager->getRepository(SurveyQuestion::class)->findOneById($questionId);
  4198.                 $sa->setOrder($order);
  4199.                 $sa->setTextAnswer($this->getTextWithoutEmoji($siteRating));
  4200.                 $sa->setQuestion($surveyQuestion);
  4201.                 $entityManager->persist($sa);
  4202.             }
  4203.             $productRatings = $req->get('ratings');
  4204.             foreach ($productRatings as $productid => $stars) {
  4205.                 if (in_array($productid, [82, 10427])) { // Exclode Shipping / Coupon
  4206.                     continue;
  4207.                 }
  4208.                 $product = $entityManager->getRepository(Product::class)->findOneById($productid);
  4209.                 if ($product) {
  4210.                     $pr = new Review();
  4211.                     $pr->setType(Review::TYPE_PRODUCT);
  4212.                     $pr->setProduct($product);
  4213.                     $pr->setApproved(false);
  4214.                     $pr->setLanguage($language);
  4215.                     $pr->setName($name);
  4216.                     $pr->setStars($stars);
  4217.                     if (trim($siteRating) != '') {
  4218.                         $pr->setText($this->getTextWithoutEmoji($siteRating));
  4219.                     }
  4220.                     if ($customer) {
  4221.                         $pr->setCustomer($customer);
  4222.                     }
  4223.                     $pr->setOrder($order);
  4224.                     $entityManager->persist($pr);
  4225.                     $addedReviews[] = $pr;
  4226.                 }
  4227.             }
  4228.             $entityManager->flush();
  4229.             $centralisUser = $entityManager->getRepository(User::class)->findOneById(40);
  4230.             foreach ($addedReviews as $pr) {
  4231.                 foreach ($addedSurveyMedias as $surveyMedia) {
  4232.                     $rsm = new ReviewSurveyMedia();
  4233.                     $rsm->setReview($pr);
  4234.                     $rsm->setSurveyMedia($surveyMedia);
  4235.                     $rsm->setApproved(false);
  4236.                     $rsm->setCreatedBy($centralisUser);
  4237.                     $entityManager->persist($rsm);
  4238.                 }
  4239.             }
  4240.             $entityManager->flush();
  4241.             $data['surveySubmited'] = true;
  4242.         }
  4243.         $multiStoreHelper = $this->getMultiStoreHelper($request);
  4244.         $domain = $multiStoreHelper->getDomain();
  4245.         $data['orderId'] = $orderId;
  4246.         $data['orderCreated'] = $order->getCreated()->format('Y.m.d, H:i');
  4247.         switch ($domain->getLanguage()->getCode()) {
  4248.             case 'sk':
  4249.                 $data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
  4250.                 $data['companyLine2'] = '44827385';
  4251.                 $data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
  4252.                 $data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
  4253.                 break;
  4254.             case 'hu':
  4255.                 $data['companyLine1'] = 'Furbify Hungary Kft., Kelemen László utca 1, 2900 Komárom, Magyarország';
  4256.                 $data['companyLine2'] = '11-09-030312';
  4257.                 $data['rulesLink'] = 'https://www.furbify.hu/ertekeloi-nyeremenyjatek-2020-szabalyzat';
  4258.                 $data['privacyLink'] = 'https://www.furbify.hu/adatkezelesi-tajekoztato';
  4259.                 break;
  4260.             case 'cz':
  4261.                 $data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
  4262.                 $data['companyLine2'] = '44827385';
  4263.                 $data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
  4264.                 $data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
  4265.                 break;
  4266.         }
  4267.         $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
  4268.         $data['products'] = [];
  4269.         foreach ($order->getOrderItems() as $oi) {
  4270.             $product = $oi->getProduct();
  4271.             if ($product->getAlbum()->getPhotos()->first()) {
  4272.                 $image = $this->getImage($product->getAlbum()->getPhotos()->first(), 'product/' . $product->getCode())->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  4273.             } else {
  4274.                 $image = $placeholder;
  4275.             }
  4276.             $data['products'][$product->getId()] = [
  4277.                 'id' => $product->getId(),
  4278.                 'title' => $product->getVendor()->getName() . ' ' . $product->getName(),
  4279.                 'image' => $image,
  4280.             ];
  4281.         }
  4282.         return $this->render('AtechNetCoreBundle/Survey/PostOrderSurvey.html.twig', $data);
  4283.     }
  4284.     /**
  4285.      * @param Domain $domain
  4286.      * @return array|null
  4287.      */
  4288.     private function getHeaderBanner(Domain $domain): ?array
  4289.     {
  4290.         /**
  4291.          * @var Banner $banner
  4292.          */
  4293.         $banner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
  4294.             'domain' => $domain,
  4295.             'type' => Banner::BANNER_MAIN_TYPE,
  4296.         ]);
  4297.         if (!$banner || $banner->getBannerItems()->count() < 1) {
  4298.             return null;
  4299.         }
  4300.         $iterator = $banner->getBannerItems()->getIterator();
  4301.         // Sort by sortIndex values
  4302.         $iterator->uasort(function ($a, $b) {
  4303.             return ($a->getSortIndex() < $b->getSortIndex()) ? -1 : 1;
  4304.         });
  4305.         $bannerItemCollection = new ArrayCollection(iterator_to_array($iterator));
  4306.         $bannerItems = $gtagEventItems = [];
  4307.         /**
  4308.          * @var BannerItem $bannerItem
  4309.          */
  4310.         foreach ($bannerItemCollection as $bannerItem) {
  4311.             if ($bannerItem->getStartDate() != null && date_time_set($bannerItem->getStartDate(), 0, 0, 0, 1) > (new DateTime('now'))) {
  4312.                 continue;
  4313.             }
  4314.             if ($bannerItem->getEndDate() != null && date_time_set($bannerItem->getEndDate(), 23, 59, 59, 59) < (new DateTime('now'))) {
  4315.                 continue;
  4316.             }
  4317.             if ($bannerItem->getFilename() == '' || $bannerItem->getFilename() == null) {
  4318.                 continue;
  4319.             }
  4320.             $fileNames = [
  4321.                 'filename' => $bannerItem->getFilename(),
  4322.                 'originalName' => $bannerItem->getOriginalName(),
  4323.             ];
  4324.             $bannerItems[] = [
  4325.                 'image' => $this->getImage($fileNames, BannerItem::BANNER_DIRECTORY)->resize(Image::BANNER_DESKTOP_WIDTH, Image::BANNER_DESKTOP_HEIGHT),
  4326.                 'link' => $bannerItem->getLink(),
  4327.                 'parentId' => $banner->getId(),
  4328.                 'itemId' => $bannerItem->getId(),
  4329.             ];
  4330.             $gtagEventItems[] = [
  4331.                 'item_id' => "{$banner->getId()}_{$bannerItem->getId()}",
  4332.                 'item_name' => $bannerItem->getLink(),
  4333.                 'index' => $bannerItem->getSortIndex(),
  4334.                 'promotion_id' => "{$banner->getId()}_{$bannerItem->getId()}",
  4335.                 'promotion_name' => $bannerItem->getLink(),
  4336.             ];
  4337.         }
  4338.         return [
  4339.             'interval' => $banner->getCountDown(),
  4340.             'items' => $bannerItems,
  4341.             'gtagEventItems' => $gtagEventItems,
  4342.         ];
  4343.     }
  4344.     private function getSmallBanners(Domain $domain)
  4345.     {
  4346.         /**
  4347.          * @var $upperBanner Banner
  4348.          * @var $lowerBanner Banner
  4349.          */
  4350.         $upperBanner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
  4351.             'domain' => $domain,
  4352.             'type' => Banner::BANNER_SMALL_UPPER_TYPE,
  4353.         ]);
  4354.         $lowerBanner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
  4355.             'domain' => $domain,
  4356.             'type' => Banner::BANNER_SMALL_LOWER_TYPE,
  4357.         ]);
  4358.         $upperBannerItems = $upperBanner->getBannerItems()->getValues();
  4359.         $lowerBannerItems = $lowerBanner->getBannerItems()->getValues();
  4360.         usort($upperBannerItems, function ($a, $b) {
  4361.             return $a->getSortIndex() <=> $b->getSortIndex();
  4362.         });
  4363.         $upperBannerItems = array_filter($upperBannerItems, function ($item) {
  4364.             $now = new DateTime('now');
  4365.             $startDate = $item->getStartDate();
  4366.             $endDate = $item->getEndDate();
  4367.             return (!$startDate || $startDate <= $now) && (!$endDate || date_time_set($endDate, 23, 59, 59) >= $now);
  4368.         });
  4369.         usort($lowerBannerItems, function ($a, $b) {
  4370.             return $a->getSortIndex() <=> $b->getSortIndex();
  4371.         });
  4372.         $lowerBannerItems = array_filter($lowerBannerItems, function ($item) {
  4373.             $now = new DateTime('now');
  4374.             $startDate = $item->getStartDate();
  4375.             $endDate = $item->getEndDate();
  4376.             return (!$startDate || $startDate <= $now) && (!$endDate || date_time_set($endDate, 23, 59, 59) >= $now);
  4377.         });
  4378.         $fileNames = [];
  4379.         $data = [
  4380.             'upper' => [
  4381.                 'display' => $upperBanner->getDisplayType(),
  4382.             ],
  4383.             'lower' => [
  4384.                 'display' => $lowerBanner->getDisplayType(),
  4385.             ],
  4386.         ];
  4387.         if (count($upperBannerItems) > 0) {
  4388.             /**
  4389.              * @var $upperBannerItem BannerItem
  4390.              */
  4391.             $upperBannerItem = $upperBannerItems[array_key_first($upperBannerItems)];
  4392.             $fileNames['upper'] = [
  4393.                 'filename' => $upperBannerItem->getFilename(),
  4394.                 'originalName' => $upperBannerItem->getOriginalName(),
  4395.             ];
  4396.             if ($upperBanner->getDisplayType() == Banner::BANNER_DISPLAY_TYPE_BANNER) {
  4397.                 $data['upper'] = [
  4398.                     'image' => $this->getImage($fileNames['upper'], BannerItem::BANNER_DIRECTORY)->resize(Image::SMALL_BANNER_DESKTOP_WIDTH, Image::SMALL_BANNER_DESKTOP_HEIGHT),
  4399.                     'link' => $upperBannerItem->getLink(),
  4400.                     'title' => $upperBannerItem->getOriginalName(),
  4401.                 ];
  4402.             }
  4403.         }
  4404.         if (count($lowerBannerItems) > 0) {
  4405.             /**
  4406.              * @var $lowerBannerItem BannerItem
  4407.              */
  4408.             $lowerBannerItem = $lowerBannerItems[array_key_first($lowerBannerItems)];
  4409.             $fileNames['lower'] = [
  4410.                 'filename' => $lowerBannerItem->getFilename(),
  4411.                 'originalName' => $lowerBannerItem->getOriginalName(),
  4412.             ];
  4413.             if ($lowerBanner->getDisplayType() == Banner::BANNER_DISPLAY_TYPE_BANNER) {
  4414.                 $data['lower'] = [
  4415.                     'image' => $this->getImage($fileNames['lower'], BannerItem::BANNER_DIRECTORY)->resize(Image::SMALL_BANNER_DESKTOP_WIDTH, Image::SMALL_BANNER_DESKTOP_HEIGHT),
  4416.                     'link' => $lowerBannerItem->getLink(),
  4417.                     'title' => $lowerBannerItem->getOriginalName(),
  4418.                 ];
  4419.             }
  4420.         }
  4421.         return $data;
  4422.     }
  4423.     /**
  4424.      * @Route("/cdn/image/product/{image}-{width}-{height}.{extension}", name="image_cdn")
  4425.      * @param Request $request
  4426.      * @param string $image
  4427.      * @param int $width
  4428.      * @param int $height
  4429.      * @param string $extension
  4430.      *
  4431.      * @return Response
  4432.      */
  4433.     public function cdnAction(Request $request, string $image, int $width, int $height, string $extension): Response
  4434.     {
  4435.         // Get Photo ID
  4436.         $photoId = (int)substr($image, 0, (strlen($image) - 32));
  4437.         // Photo
  4438.         $photo = $this->getEntityManager()->getRepository(Photo::class)->findOneById($photoId);
  4439.         if ($photo) {
  4440.             // Validate Salt
  4441.             if ($photo->getSalt() == str_replace($photoId, '', $image)) {
  4442.                 // Variant
  4443.                 $variant = Image::determineCloudflareVariant($width, $height);
  4444.                 if (!is_null($variant)) {
  4445.                     // Cloudflare
  4446.                     if (!is_null($photo->getCloudflareId())) {
  4447.                         // CDN
  4448.                         $url = $photo->getCdnUrl($variant);
  4449.                         // Image Mime Type
  4450.                         switch ($extension) {
  4451.                             case 'jpg':
  4452.                             case 'jpeg':
  4453.                                 $headerAccept = 'image/jpeg';
  4454.                                 break;
  4455.                             case 'gif':
  4456.                                 $headerAccept = 'image/gif';
  4457.                                 break;
  4458.                             case 'webp':
  4459.                                 $headerAccept = 'image/webp';
  4460.                                 break;
  4461.                             case 'png':
  4462.                                 $headerAccept = 'image/png';
  4463.                                 break;
  4464.                             default:
  4465.                                 $headerAccept = $request->server->get('HTTP_ACCEPT');
  4466.                                 break;
  4467.                         }
  4468.                         // User Agent
  4469.                         $userAgent = $request->server->get('HTTP_USER_AGENT');
  4470.                         // Response Header
  4471.                         $headers = [];
  4472.                         // Get Image
  4473.                         $ch = curl_init();
  4474.                         curl_setopt($ch, CURLOPT_HEADER, false);
  4475.                         curl_setopt($ch, CURLOPT_VERBOSE, false);
  4476.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  4477.                         curl_setopt($ch, CURLOPT_URL, $url);
  4478.                         curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
  4479.                         curl_setopt($ch, CURLOPT_HTTPHEADER, [
  4480.                             'Accept' => $headerAccept,
  4481.                         ]);
  4482.                         curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$headers) {
  4483.                             $length = strlen($header);
  4484.                             // Parse Header
  4485.                             $header = explode(':', $header, 2);
  4486.                             // Ignore invalid Header
  4487.                             if (count($header) < 2) {
  4488.                                 return $length;
  4489.                             }
  4490.                             // Header
  4491.                             $headers[strtolower(trim($header[0]))][] = trim($header[1]);
  4492.                             return $length;
  4493.                         });
  4494.                         // Response
  4495.                         $response = curl_exec($ch);
  4496.                         // HTTP OK
  4497.                         if ((int)curl_getinfo($ch, CURLINFO_HTTP_CODE) == Response::HTTP_OK) {
  4498.                             // Content Type
  4499.                             $contentType = false;
  4500.                             if (isset($headers['content-type'])) {
  4501.                                 $contentType = array_pop($headers['content-type']);
  4502.                             }
  4503.                             // Content Length
  4504.                             $contentLength = false;
  4505.                             if (isset($headers['content-length'])) {
  4506.                                 $contentLength = array_pop($headers['content-length']);
  4507.                             }
  4508.                             if ($contentType && $contentLength) {
  4509.                                 return new Response($response, Response::HTTP_OK, [
  4510.                                     'Access-Control-Allow-Origin' => '*',
  4511.                                     'Cache-Control' => 'public',
  4512.                                     'Content-Type' => $contentType,
  4513.                                     'Content-Length' => $contentLength,
  4514.                                     'Content-Disposition' => 'inline; filename="' . $image . '-' . $width . '-' . $height . '.' . $extension . '"',
  4515.                                 ]);
  4516.                             }
  4517.                         }
  4518.                     }
  4519.                     // Use system photo generation
  4520.                     if ($photo->getAlbum()) {
  4521.                         // Product
  4522.                         $product = $this->getEntityManager()->getRepository(Product::class)->findOneByAlbum($photo->getAlbum());
  4523.                         if ($product) {
  4524.                             $image = $this->getImage($photo, 'product/' . $product->getCode(), false)->resize($width, $height);
  4525.                             $imageContent = file_get_contents(str_replace(' ', '%20', $image));
  4526.                             return new Response($imageContent, Response::HTTP_OK, [
  4527.                                 'Access-Control-Allow-Origin' => '*',
  4528.                                 'Cache-Control' => 'public',
  4529.                                 'Content-Type' => $photo->getMimeType(),
  4530.                                 'Content-Length' => strlen($imageContent),
  4531.                                 'Content-Disposition' => 'inline; filename="' . basename($image) . '"',
  4532.                             ]);
  4533.                         }
  4534.                     }
  4535.                 }
  4536.             }
  4537.         }
  4538.         return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction', []);
  4539.     }
  4540.     /**
  4541.      * @Route("/homepage-bottom-content-ajax", name="homepage_bottom_content_ajax", defaults={"_locale":""})
  4542.      * @Route("/{_locale<%supported_locales%>?}/homepage-bottom-content-ajax", name="homepage_bottom_content_ajax_locale", defaults={"_locale":""})
  4543.      * @param Request $request
  4544.      * @return Response
  4545.      */
  4546.     public function homepageBottomContentAjaxAction(Request $request)
  4547.     {
  4548.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  4549.         $multiStore = $this->getMultiStoreHelper($request);
  4550.         $domain = $multiStore->getDomain();
  4551.         $domainId = $domain->getId();
  4552.         $language = $multiStore->getLanguage();
  4553.         $defaultLanguageCode = $multiStore->getDefaultLocale();
  4554.         $cache = $this->cache;
  4555.         $homepageContentBottomCacheKey = 'homepage.content.bottom.v4.' . $domainId . '.' . $language->getCode();
  4556.         if ( $request->getSession()->get('isBazaarPage') === true ) {
  4557.             $homepageContentBottomCacheKey = 'homepage.bazaar.content.bottom.v4.' . $domainId . '.' . $language->getCode();
  4558.         }
  4559.         $data = [];
  4560.         $homepageContentBottomCacheItem = $cache->getItem($homepageContentBottomCacheKey);
  4561.         if ($homepageContentBottomCacheItem->isHit()) {
  4562.             $data = $homepageContentBottomCacheItem->get();
  4563.         } else {
  4564.             if ( $language->getCode() != 'en' && $request->getSession()->get('isBazaarPage') === false ) {
  4565.                 $data['blogPosts'] = $this->blogListing($request, $domain);
  4566.             }
  4567.             $bottomContentDescriptionStaticId = '';
  4568.             switch ($domainId) {
  4569.                 case Domain::DOMAIN_ID_RT_SK:
  4570.                 case Domain::DOMAIN_ID_WS_SK:
  4571.                     $bottomContentDescriptionStaticId = '4';
  4572.                     break;
  4573.                 case Domain::DOMAIN_ID_RT_HU:
  4574.                 case Domain::DOMAIN_ID_WS_HU:
  4575.                     $bottomContentDescriptionStaticId = '21';
  4576.                     break;
  4577.                 case Domain::DOMAIN_ID_RT_CZ:
  4578.                 case Domain::DOMAIN_ID_WS_CZ:
  4579.                     $bottomContentDescriptionStaticId = '54';
  4580.                     break;
  4581.                 case Domain::DOMAIN_ID_RT_EU:
  4582.                 case Domain::DOMAIN_ID_WS_EU:
  4583.                     $bottomContentDescriptionStaticId = '96';
  4584.                     break;
  4585.             }
  4586.             $data['bottomContentDescriptionLink'] = $seoUrlHelper->link('page', [
  4587.                 'static_id' => $bottomContentDescriptionStaticId,
  4588.             ]);
  4589.             $data['currency'] = $domain->getCurrency();
  4590.             $data['precision'] = $domain->getPricePrecision();
  4591.             $homepageContentBottomCacheItem->set($data);
  4592.             $homepageContentBottomCacheItem->expiresAfter(self::CACHE_LIFTETIME_6_HOURS);
  4593.             $cache->save($homepageContentBottomCacheItem);
  4594.         }
  4595.         if ( in_array($domainId, MultiStore::getWholesaleDomainIDs()) && $request->getSession()->get('isBazaarPage') === false ) {
  4596.             $homepageBazarCacheKey = 'homepage.bazar.v2.' . $domainId . '.' . $language->getCode();
  4597.             $homepageBazarCacheItem = $cache->getItem($homepageBazarCacheKey);
  4598.             if ($homepageBazarCacheItem->isHit()) {
  4599.                 $data['bazar'] = $homepageBazarCacheItem->get();
  4600.             } else {
  4601.                 $data['bazar'] = $this->bazarListing($request, $multiStore, $seoUrlHelper);
  4602.                 $homepageBazarCacheItem->set($data['bazar']);
  4603.                 $homepageBazarCacheItem->expiresAfter(self::CACHE_LIFETIME_15_MINUTES);
  4604.                 $cache->save($homepageBazarCacheItem);
  4605.             }
  4606.         }
  4607.         if (in_array($domainId, [Domain::DOMAIN_ID_RT_SK])) {
  4608.             $homepageHeurekaCacheKey = 'homepage.heureka.v1.' . $domainId . '.' . $defaultLanguageCode;
  4609.             $homepageHeurekaCacheItem = $cache->getItem($homepageHeurekaCacheKey);
  4610.             if ($homepageHeurekaCacheItem->isHit()) {
  4611.                 $data['heurekaReviews'] = $homepageHeurekaCacheItem->get();
  4612.             } else {
  4613.                 $heureka = new Heureka($this->getTwig());
  4614.                 $data['heurekaReviews'] = $heureka->getReviewsView($defaultLanguageCode);
  4615.                 $homepageHeurekaCacheItem->set($data['heurekaReviews']);
  4616.                 $homepageHeurekaCacheItem->expiresAfter(self::CACHE_LIFETIME_15_MINUTES);
  4617.                 $cache->save($homepageHeurekaCacheItem);
  4618.             }
  4619.         }
  4620.         $data['domainId'] = $domainId;
  4621.         return $this->render('AtechNetCoreBundle/Homepage/bottomContent.html.twig', $data);
  4622.     }
  4623.     /**
  4624.      * @param Request $request
  4625.      * @param MultiStore $multiStore
  4626.      * @param SeoUrlHelper $seoUrlHelper
  4627.      * @return array
  4628.      */
  4629.     private function bazarListing(Request $request, MultiStore $multiStore, $seoUrlHelper): array
  4630.     {
  4631.         $domainId = $multiStore->getDomain()->getid();
  4632.         $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  4633.         // Bazar ...
  4634.         // Filter Data
  4635.         switch ($domainId) {
  4636.             case Domain::DOMAIN_ID_RT_SK:
  4637.             case Domain::DOMAIN_ID_WS_SK:
  4638.                 $filterData = [
  4639.                     'domainId' => $multiStore->getDomainId(),
  4640.                     'filterCategoryId' => 250,
  4641.                     'sort' => 'created',
  4642.                     'order' => 'desc',
  4643.                     'start' => 0,
  4644.                     'limit' => 6,
  4645.                 ];
  4646.                 $buttonBazarProducts = $seoUrlHelper->link('category', [
  4647.                     'path' => '250',
  4648.                 ]);
  4649.                 break;
  4650.             case Domain::DOMAIN_ID_RT_HU:
  4651.             case Domain::DOMAIN_ID_WS_HU:
  4652.                 $filterData = [
  4653.                     'domainId' => $multiStore->getDomainId(),
  4654.                     'filterCategoryId' => 249,
  4655.                     'sort' => 'created',
  4656.                     'order' => 'desc',
  4657.                     'start' => 0,
  4658.                     'limit' => 6,
  4659.                 ];
  4660.                 $buttonBazarProducts = $seoUrlHelper->link('category', [
  4661.                     'path' => '249',
  4662.                 ]);
  4663.                 break;
  4664.             case Domain::DOMAIN_ID_RT_CZ:
  4665.             case Domain::DOMAIN_ID_WS_CZ:
  4666.                 $filterData = [
  4667.                     'domainId' => $multiStore->getDomainId(),
  4668.                     'filterCategoryId' => 251,
  4669.                     'sort' => 'created',
  4670.                     'order' => 'desc',
  4671.                     'start' => 0,
  4672.                     'limit' => 6,
  4673.                 ];
  4674.                 $buttonBazarProducts = $seoUrlHelper->link('category', [
  4675.                     'path' => '251',
  4676.                 ]);
  4677.                 break;
  4678.             case Domain::DOMAIN_ID_RT_EU:
  4679.             case Domain::DOMAIN_ID_WS_EU:
  4680.                 $filterData = [
  4681.                     'domainId' => $multiStore->getDomainId(),
  4682.                     'filterCategoryId' => 250,
  4683.                     'sort' => 'created',
  4684.                     'order' => 'desc',
  4685.                     'start' => 0,
  4686.                     'limit' => 6,
  4687.                 ];
  4688.                 $buttonBazarProducts = $seoUrlHelper->link('category', [
  4689.                     'path' => '250',
  4690.                 ]);
  4691.                 break;
  4692.         }
  4693.         // Bazar
  4694.         $results = $this->getProductHelper($request)->getStructuredDataByFilters($filterData);
  4695.         $bazarProducts = [];
  4696.         $bazarProducts = $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder);
  4697.         foreach ($bazarProducts as $key => $value) {
  4698.             $bazarProducts[$key]['warrantyYear'] = 1;
  4699.         }
  4700.         return [
  4701.             'buttonBazarProducts' => $buttonBazarProducts,
  4702.             'products' => $bazarProducts,
  4703.         ];
  4704.     }
  4705.     /**
  4706.      * @param Request $request
  4707.      * @param Domain $domain
  4708.      * @return array
  4709.      */
  4710.     private function blogListing(Request $request, Domain $domain): array
  4711.     {
  4712.         $entityManager = $this->getEntityManager();
  4713.         $domainId = $domain->getId();
  4714.         $language = $domain->getLanguage();
  4715.         $placeholderThumb = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_THUMB_WIDTH, Image::BLOG_BLOCK_THUMB_HEIGHT);
  4716.         $placeholderAdditional = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_ADDITIONAL_WIDTH, Image::BLOG_BLOCK_ADDITIONAL_HEIGHT);
  4717.         $results = $entityManager->createQuery(
  4718.             "SELECT b
  4719.             FROM AtechNetCoreBundle:BlogPage b
  4720.             LEFT JOIN b.metas m
  4721.             WHERE b.domain = " . $domainId . " AND m.language = " . $language->getId() . " AND b.published = 1
  4722.             ORDER BY b.created DESC"
  4723.         )->setMaxResults(3)
  4724.             ->getResult();
  4725.         $blogPosts = [];
  4726.         foreach ($results as $result) {
  4727.             if (!is_null($result->getCoverImageLink())) {
  4728.                 $isBlogNewerThanDate = $result->getCreated() > (new DateTime('2023-10-30'));
  4729.                 $thumb = $this->getImage(
  4730.                     $result->getCoverImageLink(),
  4731.                     'blog'
  4732.                 )->resize(
  4733.                     ($isBlogNewerThanDate ? Image::BLOG_BLOCK_THUMB_730_WIDTH : Image::BLOG_BLOCK_THUMB_16_9_WIDTH),
  4734.                     ($isBlogNewerThanDate ? Image::BLOG_BLOCK_THUMB_300_HEIGHT : Image::BLOG_BLOCK_THUMB_16_9_HEIGHT)
  4735.                 )
  4736.                 ;
  4737.                 $additional = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_ADDITIONAL_WIDTH, Image::BLOG_BLOCK_ADDITIONAL_HEIGHT);
  4738.             } else {
  4739.                 $thumb = $placeholderThumb;
  4740.                 $additional = $placeholderAdditional;
  4741.             }
  4742.             $blogCategoryId = 0;
  4743.             if ($result->getCategoryPage()) {
  4744.                 $blogCategoryId = $result->getCategoryPage()->getId();
  4745.             }
  4746.             if (empty($blogCategoryId)) {
  4747.                 $domainId = $result->getDomain()->getId();
  4748.                 if ($domainId == Domain::DOMAIN_ID_RT_SK) {
  4749.                     $blogCategoryId = 3;
  4750.                 } elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
  4751.                     $blogCategoryId = 77;
  4752.                 } elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
  4753.                     $blogCategoryId = 169;
  4754.                 }
  4755.             }
  4756.             $meta = $result->getMetaByLanguage($language);
  4757.             $blogPosts[] = [
  4758.                 'thumb' => $thumb,
  4759.                 'additional' => $additional,
  4760.                 'title' => $meta->getTitle(),
  4761.                 'created' => $meta->getCreated(),
  4762.                 'text' => $meta->getShortDesc(),
  4763.                 'href' => $this->url($request)->link('blog', [
  4764.                     'blog_category_id' => $blogCategoryId,
  4765.                     'blog_id' => $result->getId(),
  4766.                 ]),
  4767.             ];
  4768.         }
  4769.         return $blogPosts;
  4770.     }
  4771.     /**
  4772.      * @Route("/chech-hu-document-creation", name="check_hu_document_creation")
  4773.      * @param Request $request
  4774.      * @return JsonResponse|RedirectResponse
  4775.      * @throws NoResultException
  4776.      * @throws NonUniqueResultException
  4777.      * @throws TransportExceptionInterface
  4778.      */
  4779.     public function checkCreatedHuDocumentAction(Request $request)
  4780.     {
  4781.         if (!$request->get('token') || $request->get('token') != "fdsftgrejowigjreoig5435joifjeriofjewfgeuwfgew") {
  4782.             return $this->redirectToRoute('not_found');
  4783.         }
  4784.         $entityManger = $this->getEntityManager();
  4785.         $isWorkday = DeliveryUtil::isWorkDay(
  4786.             new \DateTime(),
  4787.             DeliveryUtil::getHolidays(Domain::DOMAIN_ID_RT_SK)
  4788.         );
  4789.         $documents = [];
  4790.         if ($isWorkday) {
  4791.             $documentGroup = $entityManger->createQuery("SELECT dg
  4792.                   FROM AtechNetCoreBundle:DocumentGroup dg
  4793.                   LEFT JOIN dg.year y
  4794.                   WHERE dg.domain = :domain
  4795.                     AND dg.type = :groupType
  4796.                     AND y.year = :year")
  4797.                 ->setParameters([
  4798.                     'domain' => Domain::DOMAIN_ID_WS_HU,
  4799.                     'year' => date('Y'),
  4800.                     'groupType' => DocumentGroup::TYPE_INVOICE_OUT,
  4801.                 ])
  4802.                 ->getSingleResult();
  4803.             $documents = $entityManger->createQuery("SELECT d
  4804.                 FROM AtechNetCoreBundle:Document d
  4805.                 WHERE d.created > :since AND d.group = :documentGroup")
  4806.                 ->setParameters([
  4807.                     'since' => (new \DateTime())->setTime(19, 50),
  4808.                     'documentGroup' => $documentGroup->getId(),
  4809.                 ])
  4810.                 ->getResult();
  4811.         }
  4812.         if ($isWorkday && count($documents) == 0) {
  4813.             $dateString = date('d.m.Y');
  4814.             $mailer = $this->getMailer();
  4815.             $email = (new TemplatedEmail())
  4816.                 ->subject('Furbify HU document not generated for date (frb): ' . $dateString)
  4817.                 ->to('dev@furbify.eu')
  4818.                 ->html('Document has not been generated from SK to HU company on date: ' . $dateString);
  4819.             $mailer->send($email);
  4820.             return new JsonResponse(['sent']);
  4821.         }
  4822.         return new JsonResponse(['not sent']);
  4823.     }
  4824.     /**
  4825.      * @Route("/overenie-zaruky",      name="warranty_chech_page_sk", defaults={"_locale":""})
  4826.      * @Route("/garancia-ellenorzese", name="warranty_chech_page_hu", defaults={"_locale":""})
  4827.      * @Route("/overeni-zaruky",       name="warranty_chech_page_cz", defaults={"_locale":""})
  4828.      * @Route("/warranty-check",       name="warranty_chech_page_en", defaults={"_locale":""})
  4829.      * @Route("/{_locale<%supported_locales%>?}/overenie-zaruky",      name="warranty_chech_page_sk_locale", defaults={"_locale":""})
  4830.      * @Route("/{_locale<%supported_locales%>?}/garancia-ellenorzese", name="warranty_chech_page_hu_locale", defaults={"_locale":""})
  4831.      * @Route("/{_locale<%supported_locales%>?}/overeni-zaruky",       name="warranty_chech_page_cz_locale", defaults={"_locale":""})
  4832.      * @Route("/{_locale<%supported_locales%>?}/warranty-check",       name="warranty_chech_page_en_locale", defaults={"_locale":""})
  4833.      * @param Request $request
  4834.      * @return Response|null
  4835.      * @throws InvalidArgumentException
  4836.      */
  4837.     public function warrantyCheckPageAction(Request $request): ?Response
  4838.     {
  4839.         $data['header'] = $this->getHeader($request);
  4840.         $data['footer'] = $this->getFooter($request);
  4841.         $data['contentBottom'] = $this->getContentBottom($request);
  4842.         // Multi-Store
  4843.         $multiStore = $this->getMultiStoreHelper($request);
  4844.         // Translator
  4845.         $translator = $this->getTranslator();
  4846.         $data['breadcrumbs'] = [];
  4847.         $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  4848.         $data['breadcrumbs'][] = [
  4849.             'text' => $translator->trans('Warranty check'),
  4850.             'href' => $this->generateUrl('warranty_chech_page_' . $multiStore->getDefaultLocale()),
  4851.         ];
  4852.         return $this->render('AtechNetCoreBundle/Page/warrantyCheck.html.twig', $data);
  4853.     }
  4854.     /**
  4855.      * @Route("/warranty-check-service", name="warranty_check_service", defaults={"_locale":""})
  4856.      * @Route("/{_locale<%supported_locales%>?}/warranty-check-service", name="warranty_check_service_locale", defaults={"_locale":""})
  4857.      * @param Request $request
  4858.      * @return Response|null
  4859.      */
  4860.     public function warrantyCheckServiceAction(Request $request): ?Response
  4861.     {
  4862.         $serialToCheck = trim($request->request->get('serialToCheck'));
  4863.         $data = [
  4864.             'result' => 'not_found',
  4865.         ];
  4866.         /**
  4867.          * @var StockItem $stockItem
  4868.          */
  4869.         if (strlen($serialToCheck) > 0) {
  4870.             $stockItem = $this->getEntityManager()->getRepository(StockItem::class)->findOneBySerialNumber($serialToCheck);
  4871.             $multistore = $this->getMultiStoreHelper($request);
  4872.             $domainId = $stockItem?->getLastMovementItem()->getMovement()->getOrder()->getDomain()->getId() == Domain::DOMAIN_ID_B2C_EU && in_array($multistore->getDomainId(), [Domain::DOMAIN_ID_RT_EU, Domain::DOMAIN_ID_WS_EU])
  4873.                 ? Domain::DOMAIN_ID_B2C_EU
  4874.                 : $multistore->getDomainId();
  4875.             if ($stockItem
  4876.                 && $stockItem->isInStock() == 0
  4877.                 && $stockItem->getFirstMovementItem()
  4878.                 && !is_null($stockItem->getLastMovementItem()->getMovement()->getOrder())
  4879.                 && ($domainId == $stockItem->getLastMovementItem()->getMovement()->getOrder()->getDomain()->getId()
  4880.                     || $stockItem->getLastMovementItem()->getMovement()->getMerchant()->getId() == 75785
  4881.                 )
  4882.                 && (
  4883.                     $stockItem->getLastMovementItem()->getMovement()->getOrder()->getDocuments()->count() > 0
  4884.                     || $stockItem->getLastMovementItem()->getMovement()->getOrder()->getBillingoDocuments()->count() > 0
  4885.                 )
  4886.             ) {
  4887.                 $product = $stockItem->getLastMovementItem()->getProduct();
  4888.                 $order = $stockItem->getLastMovementItem()->getMovement()->getOrder();
  4889.                 $documents = $stockItem->getLastMovementItem()->getMovement()->getOrder()->getDocuments();
  4890.                 $billingoDocuments = $stockItem->getLastMovementItem()->getMovement()->getOrder()->getBillingoDocuments();
  4891.                 $translator = $this->getTranslator();
  4892.                 $oderItem = $stockItem->getLastMovementItem()->getOrderItem();
  4893.                 $warrantyStart = $order->getShipDate() ? $order->getShipDate() : $order->getCreated();
  4894.                 if ($documents->count() > 0) {
  4895.                     /**
  4896.                      * @var Document $document
  4897.                      */
  4898.                     foreach ($documents as $document) {
  4899.                         if ($document->getGroup()->getType() == DocumentGroup::TYPE_INVOICE_OUT && $document->getCustomer()->getId() == $order->getCustomer()->getId()) {
  4900.                             $warrantyStart = $document->getCreatedDate();
  4901.                         }
  4902.                     }
  4903.                 } elseif ($billingoDocuments->count() > 0) {
  4904.                     /**
  4905.                      * @var CustomerBillingoData $billingoDocument
  4906.                      */
  4907.                     foreach ($billingoDocuments as $billingoDocument) {
  4908.                         if ($billingoDocument->getType() == BillingoOperation::TYPE_NORMAL && $billingoDocument->getCustomer()->getId() == $order->getCustomer()->getId()) {
  4909.                             $warrantyStart = $billingoDocument->getCreated();
  4910.                         }
  4911.                     }
  4912.                 }
  4913.                 $warrantyEnd = $warrantyStart > (new \DateTime('13-07-2023')) && $product->getQualityStatus() == Product::QualityStatus_Bazaar ? (clone $warrantyStart)->add(new \DateInterval('P1Y')) : $order->getWarrantyEnd($warrantyStart);
  4914.                 $documentGroupPrefix = $this->getEntityManager()->getRepository(DocumentGroup::class)
  4915.                     ->createQueryBuilder('dg')
  4916.                     ->leftJoin('dg.year', 'y')
  4917.                     ->where('dg.domain = :domain')
  4918.                     ->andWhere('dg.type = :groupType')
  4919.                     ->andWhere('y.year = :year')
  4920.                     ->setParameters([
  4921.                         'domain' => $domainId,
  4922.                         'year' => (new DateTime('now'))->format('Y'),
  4923.                         'groupType' => DocumentGroup::TYPE_INVOICE_OUT,
  4924.                     ])->getQuery()->getOneOrNullResult()?->getPrefix();
  4925.                 $data = [
  4926.                     'result'                    => 'success',
  4927.                     'serialNumber'              => $stockItem->getSerialNumber(),
  4928.                     'warrantyLength'            => $translator->trans(Order::getWarrantyChoices()[$order->getWarranty()]),
  4929.                     'warrantyStart'             => $warrantyStart->format('d.m.Y'),
  4930.                     'warrantyEnd'               => $warrantyEnd->format('d.m.Y'),
  4931.                     'hasWarrantyDeadlinePassed' => $warrantyEnd > (new \DateTime()),
  4932.                     'daysLeftOfWarranty'        => (new \DateTime())->diff($warrantyEnd)->days,
  4933.                     'product'                   => [
  4934.                         'code'        => $product->getCode(),
  4935.                         'vendor'      => $product->getVendor()->getName(),
  4936.                         'title'       => $product->getName(),
  4937.                         'description' => $product->getDescription(),
  4938.                     ],
  4939.                     'orderItemId'               => $oderItem->getId(),
  4940.                     'documentPrefix'            => $documentGroupPrefix,
  4941.                     'isB2BOrder'                => $domainId == Domain::DOMAIN_ID_B2C_EU,
  4942.                 ];
  4943.             }
  4944.         }
  4945.         return $this->render('AtechNetCoreBundle/Page/warrantyCheckResults.html.twig', $data);
  4946.     }
  4947.     /**
  4948.      * @Route("/warranty-check/order-item/order", name="warranty_check_order_item_order")
  4949.      */
  4950.     public function isOrderItemPartOfOrder(Request $request)
  4951.     {
  4952.         $givenData = $request->request->get('orderDocumentCode');
  4953.         $orderItemId = $request->request->get('orderItemId');
  4954.         $order = $this->getEntityManager()->getRepository(Order::class)->findOneById($givenData);
  4955.         if (!$order) {
  4956.             $order = $this->getEntityManager()->getRepository(Order::class)
  4957.                 ->createQueryBuilder('o')
  4958.                 ->join('o.documents', 'd')
  4959.                 ->where('d.code = :code')
  4960.                 ->setParameter('code', $givenData)
  4961.                 ->getQuery()->getOneOrNullResult();
  4962.         }
  4963.         $orderItem = $this->getEntityManager()->getRepository(OrderItem::class)->findOneById($orderItemId);
  4964.         if (!is_null($order) && !is_null($orderItem) && $order->getOrderItems()->contains($orderItem)) {
  4965.             return $this->redirectToRoute('customer_claims_new', [
  4966.                 'orderItemId' => $orderItemId,
  4967.             ]);
  4968.         } else {
  4969.             $this->addFlash(
  4970.                 'error',
  4971.                 $this->getTranslator()->trans('The provided data is incorrect. Please verify the order number and try again.')
  4972.             );
  4973.             return $this->redirectToRoute('warranty_chech_page_' . $this->getMultiStoreHelper($request)->getLanguage()->getCode());
  4974.         }
  4975.     }
  4976.     /**
  4977.      * @Route("/kviz", name="quiz_redirect")
  4978.      */
  4979.     public function quizRedirectAction(): RedirectResponse
  4980.     {
  4981.         return $this->redirect('https://docs.google.com/forms/d/e/1FAIpQLSdsqtfaQtq8gaot4A8VP7t6drrR-cs4DREsUdJOEBU80oJD1Q/viewform?usp=sf_link');
  4982.     }
  4983.     /**
  4984.      * @Route("/hide-nanobar", name="hide_nanobar")
  4985.      * @param Request $request
  4986.      * @param string $locale
  4987.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  4988.      */
  4989.     public function hideNanobarAction(Request $request): JsonResponse
  4990.     {
  4991.         $request->getSession()->set('hideNanobar', true);
  4992.         return new JsonResponse([
  4993.             'status' => 'success',
  4994.         ]);
  4995.     }
  4996.     /**
  4997.      * @Route("/vatera.xml", name="vatera_feed")
  4998.      * @param Request $request
  4999.      * @return Response
  5000.      * @throws Exception
  5001.      */
  5002.     public function vateraFeedAction(Request $request)
  5003.     {
  5004.         ini_set('memory_limit', '768M');
  5005.         if ($request->query->get('token') != '32452vfjiuff30-234f932e9223-32fj398gg59f-23hg94kofoewj') {
  5006.             return new Response('Invalid token', Response::HTTP_FORBIDDEN);
  5007.         }
  5008.         $cache = $this->cache;
  5009.         $cacheKey = 'vatera_feed.v3';
  5010.         $cacheItem = $cache->getItem($cacheKey);
  5011.         if ($cacheItem->isHit()) {
  5012.             $response = new Response($cacheItem->get());
  5013.             $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  5014.             return $response;
  5015.         }
  5016.         $entityManager = $this->getEntityManager();
  5017.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  5018.         $translator = $this->getDatabaseTranslator($request);
  5019.         $xml = '<?xml version="1.0" encoding="UTF-8"?>
  5020.         <products>';
  5021.         //        $products = $entityManager
  5022.         //            ->createQuery("SELECT p
  5023.         //                FROM AtechNetCoreBundle:Product p
  5024.         //                LEFT JOIN p.type pt
  5025.         //                WHERE p.archived = 0
  5026.         //                  AND p.available > 0
  5027.         //                  AND p.qualityStatus != " . Product::QualityStatus_Bazaar . "
  5028.         //                  AND pt.id IN (" . implode(',', ProductType::getMainProductTypeIds()) . ")")
  5029.         //            ->getResult();
  5030.         //
  5031.         //        /**
  5032.         //         * @var Product $product
  5033.         //         */
  5034.         //        foreach ($products as $product) {
  5035.         //            $productMeta = $product->getDomainMeta($domain);
  5036.         //
  5037.         //            if ($productMeta === false) {
  5038.         //                continue;
  5039.         //            }
  5040.         //
  5041.         //            if (!$product->isAvailable()
  5042.         //                || !$productMeta->isActive()
  5043.         //                || !$productMeta->isListed()
  5044.         //                || !$productMeta->isReady()
  5045.         //                || $product->getDescription() == '') {
  5046.         //                continue;
  5047.         //            }
  5048.         //
  5049.         //            $productMeta = $product->getDomainMeta($domain);
  5050.         //
  5051.         //            $price = $productMeta->getDomainVatPrice();
  5052.         //            $discount = $productMeta->getDomainVatDiscount();
  5053.         //
  5054.         //            $imageLinks = [];
  5055.         //
  5056.         //            $photos = $product->getAlbum()->getPhotos();
  5057.         //
  5058.         //            if ($this->getEnvironment() == 'prod') {
  5059.         //                if (count($photos) > 0) {
  5060.         //                    $photos = Collections::sort($photos);
  5061.         //
  5062.         //                    foreach ($photos as $photo) {
  5063.         //                        $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  5064.         //                    }
  5065.         //                } elseif (isset($_GET['debug'])) {
  5066.         //                    echo sprintf(
  5067.         //                        '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  5068.         //                        "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  5069.         //                        $product->getCode()
  5070.         //                    );
  5071.         //                }
  5072.         //            }
  5073.         //
  5074.         //            $imageLinksString = '';
  5075.         //
  5076.         //            $categoryId = 0;
  5077.         //
  5078.         //            $vateraProductCategoryIds = [
  5079.         //                ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 10424,
  5080.         //                ProductType::PRODUCT_TYPE_ID_MONITOR    => 104,
  5081.         //                ProductType::PRODUCT_TYPE_ID_NOTEBOOK   => 97,
  5082.         //                ProductType::PRODUCT_TYPE_ID_PC         => 213,
  5083.         //                ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 213,
  5084.         //            ];
  5085.         //
  5086.         //            $vateraProductVendorCategoryIds = [
  5087.         //                ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => [
  5088.         //                    "Apple"   => 9304,
  5089.         //                    "ASUS"    => 9304,
  5090.         //                    "Dell"    => 9304,
  5091.         //                    "Fujitsu" => 9304,
  5092.         //                    "HP"      => 9304,
  5093.         //                    "Lenovo"  => 9304,
  5094.         //                    "MSI"     => 9304,
  5095.         //                ],
  5096.         //                ProductType::PRODUCT_TYPE_ID_NOTEBOOK   => [
  5097.         //                    "Acer"      => 429,
  5098.         //                    "Apple"     => 9606,
  5099.         //                    "ASUS"      => 429,
  5100.         //                    "Dell"      => 9616,
  5101.         //                    "Fujitsu"   => 429,
  5102.         //                    "HP"        => 9626,
  5103.         //                    "Lenovo"    => 9631,
  5104.         //                    "Microsoft" => 429,
  5105.         //                    "Razer"     => 429,
  5106.         //                    "Panasonic" => 429,
  5107.         //                ],
  5108.         //                ProductType::PRODUCT_TYPE_ID_MONITOR    => [
  5109.         //                    "Acer"      => 1735,
  5110.         //                    "AOC"       => 1735,
  5111.         //                    "ASUS"      => 1735,
  5112.         //                    "Canvys"    => 1735,
  5113.         //                    "Dell"      => 9472,
  5114.         //                    "Fujitsu"   => 1735,
  5115.         //                    "HP"        => 9475,
  5116.         //                    "IIYAMA"    => 1735,
  5117.         //                    "Lenovo"    => 1735,
  5118.         //                    "LG"        => 1735,
  5119.         //                    "PARTNER"   => 1735,
  5120.         //                    "Philips"   => 1735,
  5121.         //                    "Samsung"   => 1735,
  5122.         //                    "TERRA"     => 1735,
  5123.         //                    "EIZO"      => 1735,
  5124.         //                    "NEC"       => 1735,
  5125.         //                    "Apple"     => 1735,
  5126.         //                    "Wacom"     => 1735,
  5127.         //                ],
  5128.         //                ProductType::PRODUCT_TYPE_ID_SMARTPHONE => [
  5129.         //                    "Apple"   => 10352,
  5130.         //                    "Google"  => 291,
  5131.         //                    "Nokia"   => 291,
  5132.         //                    "OnePlus" => 291,
  5133.         //                    "Samsung" => 291,
  5134.         //                ],
  5135.         //                ProductType::PRODUCT_TYPE_ID_PC         => [
  5136.         //                    "Apple"   => 9305,
  5137.         //                    "ADesk"   => 9343,
  5138.         //                    "Dell"    => [
  5139.         //                        "OptiPlex"      => 9336,
  5140.         //                        "Precision"     => 9317,
  5141.         //                        "Vostro"        => 9316,
  5142.         //                        "other"         => 9318,
  5143.         //                    ],
  5144.         //                    "Fujitsu" => 9343,
  5145.         //                    "Furbify" => 9343,
  5146.         //                    "HP"      => [
  5147.         //                        "Workstation"   => 9325,
  5148.         //                        "EliteDesk"     => 9327,
  5149.         //                        "ProDesk"       => 9326,
  5150.         //                        "Compaq"        => 9324,
  5151.         //                        "other"         => 9330,
  5152.         //                    ],
  5153.         //                    "Lenovo"  => [
  5154.         //                        "ThinkCentre"   => 9332,
  5155.         //                        "ThinkStation"  => 9334,
  5156.         //                        "other"         => 9335
  5157.         //                    ],
  5158.         //                    "Segotep" => 9343,
  5159.         //                    "Toshiba" => 9343,
  5160.         //                    "OEM"     => 9304,
  5161.         //                ]
  5162.         //            ];
  5163.         //
  5164.         //            if (isset($vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()])) {
  5165.         //                if (is_array($vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()]))
  5166.         //                {
  5167.         //                    $subCategories =  $vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()];
  5168.         //
  5169.         //                    foreach ($subCategories as $key => $subCategory) {
  5170.         //                        if (str_contains($product->getName(), $key)){
  5171.         //                            $categoryId = $subCategory;
  5172.         //                            break;
  5173.         //                        }
  5174.         //                    }
  5175.         //
  5176.         //                    if ($categoryId == 0){
  5177.         //                        $categoryId = $subCategories['other'];
  5178.         //                    }
  5179.         //                } else{
  5180.         //                    $categoryId = $vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()];
  5181.         //                }
  5182.         //            } elseif (isset($vateraProductCategoryIds[$product->getType()->getId()])) {
  5183.         //                $categoryId = $vateraProductCategoryIds[$product->getType()->getId()];
  5184.         //            }
  5185.         //
  5186.         //            $photoCount = 1;
  5187.         //            foreach ($imageLinks as $imageLink) {
  5188.         //                if ($photoCount > 8) {
  5189.         //                    continue;
  5190.         //                }
  5191.         //                $imageLinksString .= '<photo_url' . $photoCount . '><![CDATA[' . $imageLink . ']]></photo_url' . $photoCount . '>';
  5192.         //                $photoCount++;
  5193.         //            }
  5194.         //
  5195.         //            if ($this->getEnvironment() == 'prod' && $imageLinksString == '') {
  5196.         //                continue;
  5197.         //            }
  5198.         //
  5199.         //            $category = $product->getType()->getTitle($translator);
  5200.         //
  5201.         //            $longDescription = '';
  5202.         //            foreach($product->getSpecificationProductAttributeOptions() as $productAttributeOption) {
  5203.         //                $attributeOption = $productAttributeOption->getOption();
  5204.         //                if ($longDescription != '') {
  5205.         //                    $longDescription .= ', ';
  5206.         //                }
  5207.         //                $longDescription .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
  5208.         //            }
  5209.         //
  5210.         //            $productName = strlen($product->getName()) > 6 ? $product->getName() : $product->getVendor()->getName() . ' ' . $product->getName();
  5211.         //
  5212.         //            $xml .= '<product>
  5213.         //                <title><![CDATA[' . $productName . ']]></title>
  5214.         //                <seller_product_id>' . $product->getCode() . '</seller_product_id>
  5215.         //                <product_pieces>' . (int)$product->getAvailable() . '</product_pieces>
  5216.         //                <fix_price>' . ($productMeta->isDiscounted() ? (int)$discount : (int)$price) . '</fix_price>
  5217.         //                <discount_price></discount_price>
  5218.         //                <starting_price></starting_price>
  5219.         //                <minimal_price></minimal_price>
  5220.         //                <duration></duration>
  5221.         //                <start_date>0</start_date>
  5222.         //                <manufacturer>' . $product->getVendor()->getName() . '</manufacturer>
  5223.         //                <weight>' . ($product->getWeight() ? 0 : $product->getWeight() / 1000) . '</weight>
  5224.         //                <category>' . $categoryId . '</category>
  5225.         //                <seller_category>' . $category . '</seller_category>
  5226.         //                <shipping_scheme></shipping_scheme>
  5227.         //                <short_description><![CDATA[' . $product->getDescription() . ']]></short_description>
  5228.         //                <description><![CDATA[' . $longDescription . ']]></description>
  5229.         //                <warranty>8</warranty>
  5230.         //                <state_flag>0</state_flag>
  5231.         //                <video_link></video_link>
  5232.         //                ' . $imageLinksString . '
  5233.         //            </product>';
  5234.         //        }
  5235.         $xml .= '</products>';
  5236.         $cacheItem->set($xml);
  5237.         $cacheItem->expiresAfter(self::CACHE_LIFETIME_1_HOUR);
  5238.         $cache->save($cacheItem);
  5239.         $response = new Response($xml);
  5240.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  5241.         return $response;
  5242.     }
  5243.     /**
  5244.      * @Route("/jofogas.xml", name="jofogas_feed")
  5245.      * @param Request $request
  5246.      * @throws Exception
  5247.      */
  5248.     public function jofogasFeedAction(Request $request): Response
  5249.     {
  5250.         ini_set('memory_limit', '768M');
  5251.         if ($request->query->get('token') != '32452vfjiuff30-234f932e9223-32fj398gg59f-54kokptkrepo435') {
  5252.             return new Response('Invalid token', Response::HTTP_FORBIDDEN);
  5253.         }
  5254.         $cache = $this->cache;
  5255.         $cacheKey = 'jofogas_feed.v1';
  5256.         $cacheItem = $cache->getItem($cacheKey);
  5257.         if ($cacheItem->isHit()) {
  5258.             $response = new Response($cacheItem->get());
  5259.             $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  5260.             return $response;
  5261.         }
  5262.         $entityManager = $this->getEntityManager();
  5263.         $domain = $this->getMultiStoreHelper($request)->getDomain();
  5264.         $translator = $this->getDatabaseTranslator($request);
  5265.         $seoUrlHelper = $this->getSeoUrlHelper($request);
  5266.         $mainProductTypeIDs = [
  5267.             ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
  5268.             ProductType::PRODUCT_TYPE_ID_MONITOR,
  5269.             ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
  5270.             ProductType::PRODUCT_TYPE_ID_PC,
  5271.             ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
  5272.         ];
  5273.         $xml = '<?xml version="1.0" encoding="UTF-8"?>
  5274.           <xml>
  5275.             <version>2.0</version>
  5276.             <contact>
  5277.               <partner_email>webshop@furbify.eu</partner_email>
  5278.               <partner_name>furbify s.r.o.</partner_name>
  5279.               <partner_phone>+3617654657</partner_phone>
  5280.               <partner_id>furbifysro</partner_id>
  5281.             </contact>
  5282.             <accounts>
  5283.               <account>
  5284.                 <email>webshop@furbify.eu</email>
  5285.                 <account_params>
  5286.                   <name>furbify s.r.o.</name>
  5287.                 </account_params>
  5288.                 <ads>';
  5289.         $products = $entityManager
  5290.             ->createQuery("SELECT p
  5291.                 FROM AtechNetCoreBundle:Product p
  5292.                 LEFT JOIN p.type pt
  5293.                 WHERE p.archived = 0
  5294.                   AND p.available > 0
  5295.                   AND p.qualityStatus != " . Product::QualityStatus_Bazaar . "
  5296.                   AND pt.id IN (" . implode(',', $mainProductTypeIDs) . ")")
  5297.             ->getResult();
  5298.         /**
  5299.          * @var Product $product
  5300.          */
  5301.         foreach ($products as $product) {
  5302.             $productMeta = $product->getDomainMeta($domain);
  5303.             if ($productMeta === false) {
  5304.                 continue;
  5305.             }
  5306.             if (!$product->isAvailable()
  5307.                 || !$productMeta->isActive()
  5308.                 || !$productMeta->isListed()
  5309.                 || !$productMeta->isReady()
  5310.                 || $product->getDescription() == '') {
  5311.                 continue;
  5312.             }
  5313.             $productMeta = $product->getDomainMeta($domain);
  5314.             $price = $productMeta->getDomainVatPrice();
  5315.             $discount = $productMeta->getDomainVatDiscount();
  5316.             $imageLinks = [];
  5317.             $photos = $product->getAlbum()->getPhotos();
  5318.             if ($this->getEnvironment() == 'prod') {
  5319.                 if (count($photos) > 0) {
  5320.                     $photos = Collections::sort($photos);
  5321.                     foreach ($photos as $photo) {
  5322.                         $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
  5323.                     }
  5324.                 } elseif (isset($_GET['debug'])) {
  5325.                     echo sprintf(
  5326.                         '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
  5327.                         "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
  5328.                         $product->getCode()
  5329.                     );
  5330.                 }
  5331.             }
  5332.             $jofogasProductCategoryIds = [
  5333.                 ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 5021,
  5334.                 ProductType::PRODUCT_TYPE_ID_MONITOR    => 5006,
  5335.                 ProductType::PRODUCT_TYPE_ID_NOTEBOOK   => 5060,
  5336.                 ProductType::PRODUCT_TYPE_ID_PC         => 5360,
  5337.                 ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 5360,
  5338.                 ProductType::PRODUCT_TYPE_ID_TABLET     => 5370,
  5339.             ];
  5340.             $categoryId = $jofogasProductCategoryIds[$product->getType()->getId()] ?? 0;
  5341.             $jofogasPackageSizes = [
  5342.                 ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 'S',
  5343.                 ProductType::PRODUCT_TYPE_ID_MONITOR    => 'L',
  5344.                 ProductType::PRODUCT_TYPE_ID_NOTEBOOK   => 'M',
  5345.                 ProductType::PRODUCT_TYPE_ID_PC         => 'L',
  5346.                 ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 'L',
  5347.                 ProductType::PRODUCT_TYPE_ID_TABLET     => 'S',
  5348.             ];
  5349.             $packageSize = $jofogasPackageSizes[$product->getType()->getId()] ?? 0;
  5350.             $photoCount = 1;
  5351.             $imageLinksString = '<images>';
  5352.             foreach ($imageLinks as $imageLink) {
  5353.                 if ($photoCount > 8) {
  5354.                     continue;
  5355.                 }
  5356.                 $imageLinksString .= '<image>' . $imageLink . '</image>';
  5357.                 $photoCount++;
  5358.             }
  5359.             $imageLinksString .= '</images>';
  5360.             if ($this->getEnvironment() == 'prod' && $imageLinksString == '') {
  5361.                 continue;
  5362.             }
  5363.             $longDescription = '';
  5364.             $capacityId = 6; // Other
  5365.             $computerCpuTypeId = 21; // Other
  5366.             $computerResolutionId = 10; // Other
  5367.             $electronicSizeId = 7; // Other
  5368.             $opticalDriveTypeId = 5; // No optical drive
  5369.             $computerAccBrandId = 9; // Other
  5370.             $electronicConditionOneId = 2; // Ujszeru
  5371.             $monitorSizeId = 9; // Other
  5372.             $monitorTypeId = 5; // Other
  5373.             $mobileMemoryId = 9; // Other
  5374.             $mobileColorId = 16; // Other
  5375.             $mobileSizeId = 6; // Other
  5376.             $mobileOsId = 3; // Other
  5377.             if ($product->getQualityStatus() == Product::QualityStatus_New) {
  5378.                 $electronicConditionOneId = 1;
  5379.             }
  5380.             foreach($product->getSpecificationAttributeOptions() as $attributeOption) {
  5381.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SSD) {
  5382.                     $capacity = (int)str_ireplace(['GB', 'TB'], ['', '000'], $attributeOption->getTitle());
  5383.                     if ($capacity < 128) {
  5384.                         $capacityId = 1;
  5385.                     } elseif ($capacity >= 128 && $capacity <= 256) {
  5386.                         $capacityId = 2;
  5387.                     } elseif ($capacity > 256 && $capacity <= 500) {
  5388.                         $capacityId = 3;
  5389.                     } elseif ($capacity > 500 && $capacity <= 1000) {
  5390.                         $capacityId = 4;
  5391.                     } elseif ($capacity > 1000) {
  5392.                         $capacityId = 5;
  5393.                     }
  5394.                 }
  5395.                 if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_NOTEBOOK, ProductType::PRODUCT_TYPE_ID_PC])) {
  5396.                     $cpuFamilyAttributeId = $product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK ? Attribute::ATTRIBUTE_ID_CPU_NB_FAMILY : Attribute::ATTRIBUTE_ID_CPU_PC_FAMILY;
  5397.                     if ($attributeOption->getAttribute()->getId() == $cpuFamilyAttributeId) {
  5398.                         switch ($attributeOption->getTitle()) {
  5399.                             case 'Intel Core i3':
  5400.                                 $computerCpuTypeId = 6;
  5401.                                 break;
  5402.                             case 'Intel Core i5':
  5403.                                 $computerCpuTypeId = 5;
  5404.                                 break;
  5405.                             case 'Intel Core i7':
  5406.                                 $computerCpuTypeId = 4;
  5407.                                 break;
  5408.                             case 'Intel Core i9':
  5409.                                 $computerCpuTypeId = 3;
  5410.                                 break;
  5411.                         }
  5412.                         if ($computerCpuTypeId == 21 && str_contains($attributeOption->getTitle(), 'Intel')) {
  5413.                             $computerCpuTypeId = 1;
  5414.                         } else {
  5415.                             $computerCpuTypeId = 2;
  5416.                         }
  5417.                     }
  5418.                 }
  5419.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_MAXIMUM_RESOLUTION) {
  5420.                     switch (str_replace(' ', '', preg_replace('/\s*\(.*?\)/', '', $attributeOption->getTitle()))) {
  5421.                         case '1024x768':
  5422.                             $computerResolutionId = 1;
  5423.                             break;
  5424.                         case '1280x1024':
  5425.                             $computerResolutionId = 2;
  5426.                             break;
  5427.                         case '1366x768':
  5428.                             $computerResolutionId = 3;
  5429.                             break;
  5430.                         case '1440x900':
  5431.                             $computerResolutionId = 4;
  5432.                             break;
  5433.                         case '1600x900':
  5434.                             $computerResolutionId = 5;
  5435.                             break;
  5436.                         case '1600x1200':
  5437.                             $computerResolutionId = 6;
  5438.                             break;
  5439.                         case '1680x1050':
  5440.                             $computerResolutionId = 7;
  5441.                             break;
  5442.                         case '1920x1080':
  5443.                             $computerResolutionId = 8;
  5444.                             break;
  5445.                         case '1920x1200':
  5446.                             $computerResolutionId = 9;
  5447.                             break;
  5448.                         case '4K':
  5449.                             $computerResolutionId = 9;
  5450.                             break;
  5451.                         case '15K':
  5452.                             $computerResolutionId = 9;
  5453.                             break;
  5454.                         case 'UltraWide':
  5455.                             $computerResolutionId = 9;
  5456.                             break;
  5457.                     }
  5458.                 }
  5459.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_OPTICAL_DRIVER) {
  5460.                     switch ($attributeOption->getTitle()) {
  5461.                         case 'Blu-ray ROM':
  5462.                         case 'Blu-ray RE':
  5463.                             $opticalDriveTypeId = 1;
  5464.                             break;
  5465.                         case 'Blu-ray RW':
  5466.                             $opticalDriveTypeId = 2;
  5467.                             break;
  5468.                         case 'DVD-ROM':
  5469.                             $opticalDriveTypeId = 3;
  5470.                             break;
  5471.                         case 'DVD-RW':
  5472.                             $opticalDriveTypeId = 4;
  5473.                             break;
  5474.                         default:
  5475.                             $opticalDriveTypeId = 5;
  5476.                     }
  5477.                 }
  5478.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
  5479.                     $electronicSizeId = '';
  5480.                     $screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
  5481.                     if ($screenSize < 11) {
  5482.                         $electronicSizeId = 1;
  5483.                     } elseif ($screenSize >= 11 && $screenSize < 13) {
  5484.                         $electronicSizeId = 2;
  5485.                     } elseif ($screenSize >= 13 && $screenSize < 14) {
  5486.                         $electronicSizeId = 3;
  5487.                     } elseif ($screenSize >= 14 && $screenSize < 15) {
  5488.                         $electronicSizeId = 4;
  5489.                     } elseif ($screenSize >= 15 && $screenSize < 15.6) {
  5490.                         $electronicSizeId = 5;
  5491.                     } elseif ($screenSize >= 15.6) {
  5492.                         $electronicSizeId = 6;
  5493.                     }
  5494.                 }
  5495.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
  5496.                     $screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
  5497.                     if ($screenSize < 15) {
  5498.                         $monitorSizeId = 1;
  5499.                     } elseif ($screenSize >= 15 && $screenSize <= 17) {
  5500.                         $monitorSizeId = 2;
  5501.                     } elseif ($screenSize >= 18 && $screenSize <= 20) {
  5502.                         $monitorSizeId = 3;
  5503.                     } elseif ($screenSize >= 21 && $screenSize <= 22) {
  5504.                         $monitorSizeId = 4;
  5505.                     } elseif ($screenSize >= 23 && $screenSize <= 24) {
  5506.                         $monitorSizeId = 5;
  5507.                     } elseif ($screenSize >= 25 && $screenSize <= 26) {
  5508.                         $monitorSizeId = 6;
  5509.                     } elseif ($screenSize >= 27 && $screenSize <= 28) {
  5510.                         $monitorSizeId = 7;
  5511.                     } elseif ($screenSize >= 29) {
  5512.                         $monitorSizeId = 8;
  5513.                     }
  5514.                 }
  5515.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_DISPLAY_TECHNOLOGY) {
  5516.                     switch ($attributeOption->getTitle()) {
  5517.                         case 'LED':
  5518.                             $monitorTypeId = 1;
  5519.                             break;
  5520.                         case 'LCD':
  5521.                             $monitorTypeId = 2;
  5522.                             break;
  5523.                         case 'VA':
  5524.                             $monitorTypeId = 3;
  5525.                             break;
  5526.                     }
  5527.                 }
  5528.                 if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
  5529.                     $mobileOsId = 2; // iOS
  5530.                 } else {
  5531.                     $mobileOsId = 1; // Android
  5532.                 }
  5533.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_MEMORY) {
  5534.                     $memorySize = (int)str_ireplace(['GB', 'TB'], ['', '000'], $attributeOption->getTitle());
  5535.                     if ($memorySize < 4) {
  5536.                         $mobileMemoryId = 1;
  5537.                     } elseif ($memorySize >= 4 && $memorySize < 8) {
  5538.                         $mobileMemoryId = 2;
  5539.                     } elseif ($memorySize >= 8 && $memorySize < 16) {
  5540.                         $mobileMemoryId = 3;
  5541.                     } elseif ($memorySize >= 16 && $memorySize < 32) {
  5542.                         $mobileMemoryId = 4;
  5543.                     } elseif ($memorySize >= 32 && $memorySize < 64) {
  5544.                         $mobileMemoryId = 5;
  5545.                     } elseif ($memorySize >= 64 && $memorySize < 128) {
  5546.                         $mobileMemoryId = 6;
  5547.                     } elseif ($memorySize >= 128 && $memorySize < 256) {
  5548.                         $mobileMemoryId = 7;
  5549.                     } elseif ($memorySize >= 256) {
  5550.                         $mobileMemoryId = 8;
  5551.                     }
  5552.                 }
  5553.                 if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
  5554.                     $screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
  5555.                     if ($screenSize < 3.5) {
  5556.                         $mobileSizeId = 1;
  5557.                     } elseif ($screenSize >= 3.5 && $screenSize < 4) {
  5558.                         $mobileSizeId = 2;
  5559.                     } elseif ($screenSize >= 4 && $screenSize < 5) {
  5560.                         $mobileSizeId = 3;
  5561.                     } elseif ($screenSize >= 5 && $screenSize < 5.6) {
  5562.                         $mobileSizeId = 4;
  5563.                     } elseif ($screenSize >= 5.6) {
  5564.                         $mobileSizeId = 5;
  5565.                     }
  5566.                 }
  5567.                 if ($longDescription != '') {
  5568.                     $longDescription .= ', ';
  5569.                 }
  5570.                 $longDescription .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
  5571.             }
  5572.             $productName = strlen($product->getName()) > 6 ? $product->getName() : $product->getVendor()->getName() . ' ' . $product->getName();
  5573.             $computerOsId = 1; // Windows
  5574.             if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
  5575.                 $computerOsId = 4; // MacOS
  5576.             }
  5577.             if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
  5578.                 $laptopTypeId = 4;
  5579.             } else {
  5580.                 if (str_contains(strtolower($productName), 'ultrabook')) {
  5581.                     $laptopTypeId = 3;
  5582.                 } else {
  5583.                     $laptopTypeId = 1;
  5584.                 }
  5585.             }
  5586.             if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK) {
  5587.                 switch (strtolower($product->getVendor()->getName())) {
  5588.                     case 'asus':
  5589.                         $laptopAccBrandId = 1;
  5590.                         break;
  5591.                     case 'lenovo':
  5592.                         $laptopAccBrandId = 2;
  5593.                         break;
  5594.                     case 'hp':
  5595.                         $laptopAccBrandId = 3;
  5596.                         break;
  5597.                     case 'dell':
  5598.                         $laptopAccBrandId = 4;
  5599.                         break;
  5600.                     case 'acer':
  5601.                         $laptopAccBrandId = 5;
  5602.                         break;
  5603.                     case 'apple':
  5604.                         $laptopAccBrandId = 6;
  5605.                         break;
  5606.                     case 'msi':
  5607.                         $laptopAccBrandId = 7;
  5608.                         break;
  5609.                     case 'fujitsu':
  5610.                         $laptopAccBrandId = 8;
  5611.                         break;
  5612.                     case 'toshiba':
  5613.                         $laptopAccBrandId = 9;
  5614.                         break;
  5615.                     default:
  5616.                         $laptopAccBrandId = 10;
  5617.                 }
  5618.             }
  5619.             if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE])) {
  5620.                 switch (strtolower($product->getVendor()->getName())) {
  5621.                     case 'dell':
  5622.                         $computerAccBrandId = 1;
  5623.                         break;
  5624.                     case 'gefors':
  5625.                         $computerAccBrandId = 2;
  5626.                         break;
  5627.                     case 'lenovo':
  5628.                         $computerAccBrandId = 3;
  5629.                         break;
  5630.                     case 'hp':
  5631.                         $computerAccBrandId = 4;
  5632.                         break;
  5633.                     case 'asus':
  5634.                         $computerAccBrandId = 5;
  5635.                         break;
  5636.                     case 'apple':
  5637.                         $computerAccBrandId = 6;
  5638.                         break;
  5639.                     case 'intel':
  5640.                         $computerAccBrandId = 7;
  5641.                         break;
  5642.                     case 'acer':
  5643.                         $computerAccBrandId = 9;
  5644.                         break;
  5645.                     default:
  5646.                         $computerAccBrandId = 9;
  5647.                 }
  5648.             }
  5649.             $category = $product->getType()->getTitle($translator);
  5650.             $vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
  5651.             $productNameForLink = $product->getName();
  5652.             $productCode = $product->getCode();
  5653.             $linkRaw = $category . ' ' . $vendor . ' ' . $productNameForLink . ' ' . $productCode;
  5654.             $link = $seoUrlHelper->slug($linkRaw);
  5655.             // Change for jofogas
  5656.             $productName = trim($vendor . ' ' . $product->getName());
  5657.             if (strlen($productName) < 12) {
  5658.                 $productName = $category . ' ' . $productName;
  5659.             }
  5660.             if (strlen($productName) > 70) {
  5661.                 $productName = mb_substr($productName, 0, 70);
  5662.             }
  5663.             $adParameters = '';
  5664.             if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK) {
  5665.                 $adParameters = '<capacity>' . $capacityId . '</capacity>
  5666.                   <computer_cpu_type>' . $computerCpuTypeId . '</computer_cpu_type>
  5667.                   <computer_os>' . $computerOsId . '</computer_os>
  5668.                   <electronic_size>' . $electronicSizeId . '</electronic_size>
  5669.                   <computer_resolution>' . $computerResolutionId . '</computer_resolution>
  5670.                   <laptop_type>' . $laptopTypeId . '</laptop_type>
  5671.                   <laptop_acc_brand>' . $laptopAccBrandId . '</laptop_acc_brand>';
  5672.             }
  5673.             if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE])) {
  5674.                 $adParameters = '<capacity>' . $capacityId . '</capacity>
  5675.                   <computer_cpu_type>' . $computerCpuTypeId . '</computer_cpu_type>
  5676.                   <computer_os>' . $computerOsId . '</computer_os>
  5677.                   <opticaldrive_type>' . $opticalDriveTypeId . '</opticaldrive_type>
  5678.                   <computer_acc_brand>' . $computerAccBrandId . '</computer_acc_brand>';
  5679.             }
  5680.             if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_MONITOR) {
  5681.                 $adParameters = '<computer_resolution>' . $computerResolutionId . '</computer_resolution>
  5682.                   <electronic_condition_one>' . $electronicConditionOneId . '</electronic_condition_one>
  5683.                   <monitor_size>' . $monitorSizeId . '</monitor_size>
  5684.                   <monitor_type>' . $monitorTypeId . '</monitor_type>';
  5685.             }
  5686.             if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_SMARTPHONE) {
  5687.                 $adParameters = '<mobile_os>' . $mobileOsId . '</mobile_os>
  5688.                     <simcard>1</simcard>
  5689.                     <mobile_memory>' . $mobileMemoryId . '</mobile_memory>
  5690.                     <mobilecam_resolution>3</mobilecam_resolution>
  5691.                     <electronic_condition_one>' . $electronicConditionOneId . '</electronic_condition_one>
  5692.                     <mobile_color>' . $mobileColorId . '</mobile_color>
  5693.                     <mobile_size>' . $mobileSizeId . '</mobile_size>
  5694.                     <mobile_type>1</mobile_type>';
  5695.             }
  5696.             $xml .= '<ad>
  5697.                 <external_ad_id>' . $product->getCode() . '</external_ad_id>
  5698.                 <category>' . $categoryId . '</category>
  5699.                 <type>s</type>
  5700.                 <subject><![CDATA[' . $productName . ']]></subject>
  5701.                 <body><![CDATA[' . $longDescription . ']]></body>
  5702.                 ' . $imageLinksString . '
  5703.                 <ad_params>
  5704.                   <price>' . ($productMeta->isDiscounted() ? (int)$discount : (int)$price) . '</price>
  5705.                   <phone>+36202223322</phone>
  5706.                   <phone_hidden>0</phone_hidden>
  5707.                   <contact_location>Osada Reviczkého 3869/38</contact_location>
  5708.                   <zipcode>1134</zipcode>
  5709.                   <city>Kolárovo</city>
  5710.                   <apply_link>https://www.furbify.hu/' . $link . '?utm_source=jofogas</apply_link>
  5711.                   <package_size>' . $packageSize . '</package_size>
  5712.                   <delivery_enabled>1</delivery_enabled>
  5713.                   ' . $adParameters . '
  5714.                 </ad_params>
  5715.               </ad>';
  5716.         }
  5717.         $xml .= '</ads>
  5718.               </account>
  5719.             </accounts>
  5720.           </xml>';
  5721.         $cacheItem->set($xml);
  5722.         $cacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
  5723.         $cache->save($cacheItem);
  5724.         $response = new Response($xml);
  5725.         $response->headers->set('Content-Type', 'application/xml;charset=utf-8');
  5726.         return $response;
  5727.     }
  5728.     /**
  5729.      * @param ProductHelper $productHelper
  5730.      * @param Domain $domain
  5731.      * @param Request $request
  5732.      * @param string $placeholder
  5733.      * @param mixed $homepageFeaturedProductCacheItem
  5734.      * @param CacheItemPoolInterface $cache
  5735.      * @return array
  5736.      */
  5737.     private function getFeatureProductCacheData(ProductHelper $productHelper, Domain $domain, Request $request, string $placeholder, mixed $homepageFeaturedProductCacheItem, CacheItemPoolInterface $cache): array
  5738.     {
  5739.         $productGroupProductData = $productHelper->getProductGroupProducts('homepage.featured.product.upper', $domain);
  5740.         $productGroupProducts = $productGroupProductData['productGroupProducts'];
  5741.         $featuredProducts = $productHelper->getStructuredDataForProducts($productGroupProducts, true);
  5742.         $listViewData = $productHelper->convertStructuredDataToListViewData($this->url($request), $featuredProducts, $placeholder);
  5743.         $data['featuredProduct']['upper'] = [];
  5744.         if (count($featuredProducts) > 0) {
  5745.             $selectedFeaturedProduct = $productGroupProductData['isRandom']
  5746.                 ? $featuredProducts[array_rand($featuredProducts)]
  5747.                 : $featuredProducts[array_key_first($featuredProducts)];
  5748.             $selectedListViewData = null;
  5749.             foreach ($listViewData as $value) {
  5750.                 if ($value['id'] == $selectedFeaturedProduct['id']) {
  5751.                     $selectedListViewData = $value;
  5752.                     break;
  5753.                 }
  5754.             }
  5755.             $data['featuredProduct']['upper'] = $selectedFeaturedProduct;
  5756.             $data['featuredProduct']['upper']['image'] = $selectedListViewData['image'];
  5757.             $data['featuredProduct']['upper']['price'] = $selectedListViewData['price'];
  5758.             $data['featuredProduct']['upper']['special'] = $selectedListViewData['special'];
  5759.             $data['featuredProduct']['upper']['href'] = str_replace('http:', 'https:', $selectedListViewData['href']);
  5760.             $data['featuredProduct']['upper']['isRandom'] = $productGroupProductData['isRandom'];
  5761.             if (is_array($data['featuredProduct']['upper']['images'])) {
  5762.                 $imagesHelper = [];
  5763.                 foreach ($data['featuredProduct']['upper']['images'] as $key => $image) {
  5764.                     $imagesHelper[$key] =  $this->getImage($image)->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  5765.                 }
  5766.                 $data['featuredProduct']['upper']['carouselImages'] = $imagesHelper;
  5767.             }
  5768.             if (!empty($productGroupProductData['customData']) && isset($productGroupProductData['customData'][$selectedListViewData['id']])) {
  5769.                 $customData = $productGroupProductData['customData'][$selectedListViewData['id']];
  5770.                 if (isset($customData['title'])) {
  5771.                     $data['featuredProduct']['upper']['title'] = $customData['title'];
  5772.                     $data['featuredProduct']['upper']['isCustomTitle'] = true;
  5773.                 }
  5774.                 if (isset($customData['description'])) {
  5775.                     $data['featuredProduct']['upper']['attributesListTxt'] = $customData['description'];
  5776.                     $data['featuredProduct']['upper']['isCustomAttributeListTxt'] = true;
  5777.                 }
  5778.             }
  5779.         }
  5780.         $productGroupProductData = $productHelper->getProductGroupProducts('homepage.featured.product.lower', $domain);
  5781.         $productGroupProducts = $productGroupProductData['productGroupProducts'];
  5782.         $featuredProducts = $productHelper->getStructuredDataForProducts($productGroupProducts, true);
  5783.         $listViewData = $productHelper->convertStructuredDataToListViewData($this->url($request), $featuredProducts, $placeholder);
  5784.         $data['featuredProduct']['lower'] = [];
  5785.         if (count($featuredProducts) > 0) {
  5786.             $selectedFeaturedProduct = $productGroupProductData['isRandom']
  5787.                 ? $featuredProducts[array_rand($featuredProducts)]
  5788.                 : $featuredProducts[array_key_first($featuredProducts)];
  5789.             $selectedListViewData = null;
  5790.             foreach ($listViewData as $value) {
  5791.                 if ($value['id'] == $selectedFeaturedProduct['id']) {
  5792.                     $selectedListViewData = $value;
  5793.                     break;
  5794.                 }
  5795.             }
  5796.             $data['featuredProduct']['lower'] = $selectedFeaturedProduct;
  5797.             $data['featuredProduct']['lower']['image'] = $selectedListViewData['image'];
  5798.             $data['featuredProduct']['lower']['price'] = $selectedListViewData['price'];
  5799.             $data['featuredProduct']['lower']['special'] = $selectedListViewData['special'];
  5800.             $data['featuredProduct']['lower']['href'] = str_replace('http:', 'https:', $selectedListViewData['href']);
  5801.             $data['featuredProduct']['lower']['isRandom'] = $productGroupProductData['isRandom'];
  5802.             if (is_array($data['featuredProduct']['lower']['images'])) {
  5803.                 $imagesHelper = [];
  5804.                 foreach ($data['featuredProduct']['lower']['images'] as $key => $image) {
  5805.                     $imagesHelper[$key] =  $this->getImage($image)->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  5806.                 }
  5807.                 $data['featuredProduct']['lower']['carouselImages'] = $imagesHelper;
  5808.             }
  5809.             if (!empty($productGroupProductData['customData']) && isset($productGroupProductData['customData'][$selectedListViewData['id']])) {
  5810.                 $customData = $productGroupProductData['customData'][$selectedListViewData['id']];
  5811.                 if (isset($customData['title'])) {
  5812.                     $data['featuredProduct']['lower']['title'] = $customData['title'];
  5813.                     $data['featuredProduct']['lower']['isCustomTitle'] = true;
  5814.                 }
  5815.                 if (isset($customData['description'])) {
  5816.                     $data['featuredProduct']['lower']['attributesListTxt'] = $customData['description'];
  5817.                     $data['featuredProduct']['lower']['isCustomAttributeListTxt'] = true;
  5818.                 }
  5819.             }
  5820.         }
  5821.         $homepageFeaturedProductCacheItem->set($data['featuredProduct']);
  5822.         $homepageFeaturedProductCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
  5823.         $cache->save($homepageFeaturedProductCacheItem);
  5824.         return $data['featuredProduct'];
  5825.     }
  5826.     #[Route('/llms.txt', name: 'llms_txt', methods: ['GET'])]
  5827.     public function llmsTxt(Request $request, CacheItemPoolInterface $cache): Response
  5828.     {
  5829.         $locale = $request->getLocale();
  5830.         $cacheItem = $cache->getItem("llms_txt_$locale-V1");
  5831.         if ($cacheItem->isHit()) {
  5832.             return new Response($cacheItem->get());
  5833.         }
  5834.         $filePath = __DIR__ . '/../Resources/public/llms/llms_' . $locale . '.txt';
  5835.         if (!file_exists($filePath)) {
  5836.             $filePath = __DIR__ . '/../Resources/public/llms/llms_en.txt';
  5837.         }
  5838.         $llmsTxt = file_get_contents($filePath);
  5839.         $cacheItem->set($llmsTxt);
  5840.         $cache->save($cacheItem);
  5841.         return new Response($llmsTxt);
  5842.     }
  5843. }