<?php
namespace App\AtechNet\CoreBundle\Controller;
use App\AtechNet\CoreBundle\Entity\Attribute;
use App\AtechNet\CoreBundle\Entity\Banner;
use App\AtechNet\CoreBundle\Entity\BannerItem;
use App\AtechNet\CoreBundle\Entity\BlogPage;
use App\AtechNet\CoreBundle\Entity\CategoryGroup;
use App\AtechNet\CoreBundle\Entity\CategoryPage;
use App\AtechNet\CoreBundle\Entity\Customer;
use App\AtechNet\CoreBundle\Entity\CustomerBillingoData;
use App\AtechNet\CoreBundle\Entity\CustomerProductFeed;
use App\AtechNet\CoreBundle\Entity\Document;
use App\AtechNet\CoreBundle\Entity\DocumentGroup;
use App\AtechNet\CoreBundle\Entity\Domain;
use App\AtechNet\CoreBundle\Entity\DomainPaymentType;
use App\AtechNet\CoreBundle\Entity\DomainShippingType;
use App\AtechNet\CoreBundle\Entity\Language;
use App\AtechNet\CoreBundle\Entity\Order;
use App\AtechNet\CoreBundle\Entity\OrderItem;
use App\AtechNet\CoreBundle\Entity\OrderSetting;
use App\AtechNet\CoreBundle\Entity\Photo;
use App\AtechNet\CoreBundle\Entity\Product;
use App\AtechNet\CoreBundle\Entity\ProductAttribute;
use App\AtechNet\CoreBundle\Entity\ProductType;
use App\AtechNet\CoreBundle\Entity\Review;
use App\AtechNet\CoreBundle\Entity\ReviewSurveyMedia;
use App\AtechNet\CoreBundle\Entity\SeoUrl;
use App\AtechNet\CoreBundle\Entity\StockItem;
use App\AtechNet\CoreBundle\Entity\SurveyAnswer;
use App\AtechNet\CoreBundle\Entity\SurveyMedia;
use App\AtechNet\CoreBundle\Entity\SurveyQuestion;
use App\AtechNet\CoreBundle\Entity\SurveyQuestionOption;
use App\AtechNet\CoreBundle\Entity\User;
use App\AtechNet\CoreBundle\Entity\Vendor;
use App\AtechNet\CoreBundle\Enum\PaymentType;
use App\AtechNet\CoreBundle\Helper\BillingoOperation;
use App\AtechNet\CoreBundle\Helper\Collections;
use App\AtechNet\CoreBundle\Helper\DeliveryUtil;
use App\AtechNet\CoreBundle\Helper\Furbify\CartHelper;
use App\AtechNet\CoreBundle\Helper\Furbify\Heureka;
use App\AtechNet\CoreBundle\Helper\Furbify\Image;
use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
use App\AtechNet\CoreBundle\Helper\Furbify\ProductHelper;
use App\AtechNet\CoreBundle\Helper\Furbify\SeoUrlHelper;
use App\AtechNet\CoreBundle\Helper\Furbify\TextHelper;
use App\AtechNet\CoreBundle\Helper\KlaviyoConnect;
use App\AtechNet\CoreBundle\Service\Furbify\BazaarService;
use App\AtechNet\CoreBundle\Service\Furbify\ProductService;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Exception;
use Google\Service\Dataform\Notebook;
use Psr\Cache\CacheItemPoolInterface;
use Psr\SimpleCache\InvalidArgumentException;
use SimpleXMLElement;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Exception\InvalidParameterException;
class DefaultController extends AbstractController
{
/**
* @Route("/", name="homepage", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}", name="homepage_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
* @throws Exception
*/
public function indexAction(Request $request): Response
{
// Set Bazaar Flag
$request->getSession()->set('isBazaarPage', false);
$pastPayPaymentResult = $request->get('pastPayPayment');
$orderId = base64_decode($request->get('pastPayId'));
if ($pastPayPaymentResult == 'success' && $orderId > 0) {
$entityManager = $this->getEntityManager();
$order = $entityManager->getRepository(Order::class)->findOneById($orderId);
if (count($order->getPastPayPaymentSettings()) == 0) {
$orderSettingApplicationStatus = OrderSetting::createSetting(
$order,
OrderSetting::TYPE_PAST_PAY_RESERVE,
'CREATED'
);
$entityManager->persist($orderSettingApplicationStatus);
$entityManager->flush();
}
$this->addFlash(
'pastPayResult',
"PastPay payment SUCCESS!"
);
} elseif ($pastPayPaymentResult == 'failure' && $orderId > 0) {
$this->addFlash(
'pastPayResult',
"PastPay payment Failed!"
);
}
// Set back to products link for cart
$request->getSession()->set('cartBackToProductsLink', $request->getSchemeAndHttpHost() . $request->getBaseUrl());
// partner dashboard
if ( $request->getSession()->get('customerTypeId') == 2 ) {
return $this->partnerIndex($request);
} else { // retail homepage
return $this->retailIndex($request);
}
}
/**
* @param Request $request
* @return Response
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
private function retailIndex(Request $request): Response
{
$data = [];
$entityManager = $this->getEntityManager();
$translator = $this->getTranslator();
$multiStore = $this->getMultiStoreHelper($request);
$seoUrlHelper = $this->getSeoUrlHelper($request);
$domain = $multiStore->getDomain();
$domainId = $domain->getId();
$cache = $this->cache;
$language = $multiStore->getLanguage();
$cacheLifetime = self::CACHE_LIFETIME_15_MINUTES;
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
$data['precision'] = $domain->getPricePrecision();
$data['currency'] = $domain->getCurrency();
$data['warrantyYear'] = $this->getWarrantyForNonProductText($domainId);
$data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domainId, 'priceWarrantyDay');
$data['mainProducts'] = [];
$productHelper = $this->getProductHelper($request);
// Main Products
$homepageMainProductsCacheKey = 'homepage.main.products.v3.' . $domainId . '.' . $language->getCode();
$homepageMainProductsCacheItem = $cache->getItem($homepageMainProductsCacheKey);
if ($homepageMainProductsCacheItem->isHit()) {
$data['mainProducts'] = $homepageMainProductsCacheItem->get();
} else {
$productGroupProductData = $productHelper->getProductGroupProducts('homepage.main', $domain);
$productGroupProducts = $productGroupProductData['productGroupProducts'];
$groupProductCodesAdded = $productGroupProductData['productGroupCodesAdded'];
$productsToDisplay = $productGroupProductData['productsToDisplay'];
$productGroupResults = $productHelper->getStructuredDataForProducts($productGroupProducts);
$data['mainProducts'] = $productHelper->convertStructuredDataToListViewData($this->url($request), $productGroupResults, $placeholder);
// Fill in
if (count($groupProductCodesAdded) < $productsToDisplay) {
$maxResults = $productsToDisplay - count($groupProductCodesAdded);
// Already Added
$productAlreadyAddedWhere = '';
if (count($groupProductCodesAdded) > 0) {
$productAlreadyAddedWhere = ' AND p.code NOT IN (' . implode(',', $groupProductCodesAdded) . ')';
}
$retailPage = $domain->getType() == 'retail';
$notebookSaleProducts = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $domainId . "
)
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 . "
ORDER BY pm.currentVatPrice ASC, p.updated DESC")
->setMaxResults($maxResults)
->getResult();
$results = $productHelper->getStructuredDataForProducts($notebookSaleProducts);
$data['mainProducts'] = array_merge($data['mainProducts'], $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder));
}
foreach ($data['mainProducts'] as $key => $value) {
$data['mainProducts'][$key]['warrantyYear'] = $value['qualityStatusId'] == Product::QualityStatus_Bazaar ? 1 : $this->getWarrantyForProductType($domain->getId(), $value['typeId'])['year'];
}
$homepageMainProductsCacheItem->set($data['mainProducts']);
$homepageMainProductsCacheItem->expiresAfter($cacheLifetime);
$cache->save($homepageMainProductsCacheItem);
}
// Header Featured Category
$homepageFeaturedCategoryCacheKey = 'homepage.featured.category.v6.' . $domainId . '.' . $language->getCode();
$homepageFeaturedCategoryCacheItem = $cache->getItem($homepageFeaturedCategoryCacheKey);
if ($homepageFeaturedCategoryCacheItem->isHit()) {
$data['featuredCategory'] = $homepageFeaturedCategoryCacheItem->get();
} else {
$featuredCategoryUpper = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_UPPER, $seoUrlHelper);
$featuredCategoryLower = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_LOWER, $seoUrlHelper);
$data['featuredCategory'] = [];
if (!empty($featuredCategoryUpper)) {
$data['featuredCategory']['upper'] = $featuredCategoryUpper;
}
if (!empty($featuredCategoryLower)) {
$data['featuredCategory']['lower'] = $featuredCategoryLower;
}
$homepageFeaturedCategoryCacheItem->set($data['featuredCategory']);
$homepageFeaturedCategoryCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
$cache->save($homepageFeaturedCategoryCacheItem);
}
// Featured Products
$homepageFeaturedProductCacheKey = 'homepage.featured.products.v7.' . $domainId . '.' . $language->getCode();
$homepageFeaturedProductCacheItem = $cache->getItem($homepageFeaturedProductCacheKey);
if ($homepageFeaturedProductCacheItem->isHit()) {
$data['featuredProduct'] = $homepageFeaturedProductCacheItem->get();
if (isset($data['featuredProduct']['upper']) && (array_key_exists('isRandom', $data['featuredProduct']['upper']) && $data['featuredProduct']['upper']['isRandom'])
|| isset($data['featuredProduct']['lower']) && (array_key_exists('isRandom', $data['featuredProduct']['upper']) && $data['featuredProduct']['lower']['isRandom'])) {
$data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
}
} else {
$data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
}
$featuredCategoriesCacheKey = 'homepage.featured.categories.v4.' . $domainId . '.' . $language->getCode();
$featuredCategoriesCacheItem = $cache->getItem($featuredCategoriesCacheKey);
if ($featuredCategoriesCacheItem->isHit()) {
$data['featuredCategories'] = $featuredCategoriesCacheItem->get();
} else {
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptops'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '5']),
], [
'title' => $translator->trans('MacBook'),
'href' => $seoUrlHelper->link('category', [ 'path' => '584' ]),
'image' => 'macbook-200x150.png',
], [
'title' => $translator->trans('Workstation laptops'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '113']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '241']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '4']),
], [
'title' => $translator->trans('Notebook with new battery'),
'href' => $seoUrlHelper->link('category', [ 'path' => '648' ]),
'image' => 'laptop-200x150.png',
], [
'title' => 'Mini PC',
'href' => $seoUrlHelper->link('category', ['path' => '177']),
'image' => 'mini-pc-200x150.png',
], [
'title' => $translator->trans('Gamer laptops'),
'href' => $seoUrlHelper->link('category', [ 'path' => '24' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Tablets'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '269']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '5', 'fd' => 1]),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptop'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '56']),
], [
'title' => $translator->trans('MacBook'),
'href' => $seoUrlHelper->link('category', [ 'path' => '583' ]),
'image' => 'macbook-200x150.png',
], [
'title' => $translator->trans('Workstation laptop'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '112']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '240']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '48']),
], [
'title' => $translator->trans('Notebook with new battery'),
'href' => $seoUrlHelper->link('category', [ 'path' => '647' ]),
'image' => 'laptop-200x150.png',
], [
'title' => 'Mini PC',
'href' => $seoUrlHelper->link('category', ['path' => '178']),
'image' => 'mini-pc-200x150.png',
], [
'title' => $translator->trans('Gamer laptop'),
'href' => $seoUrlHelper->link('category', [ 'path' => '62' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Tablet'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '268']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '56', 'fd' => 1]),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptops'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '130']),
], [
'title' => $translator->trans('MacBook'),
'href' => $seoUrlHelper->link('category', [ 'path' => '585' ]),
'image' => 'macbook-200x150.png',
], [
'title' => $translator->trans('Workstation laptops'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '175']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '242']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '122']),
], [
'title' => $translator->trans('Notebook with new battery'),
'href' => $seoUrlHelper->link('category', [ 'path' => '650' ]),
'image' => 'laptop-200x150.png',
], [
'title' => 'Mini PC',
'href' => $seoUrlHelper->link('category', ['path' => '179']),
'image' => 'mini-pc-200x150.png',
], [
'title' => $translator->trans('Gamer laptops'),
'href' => $seoUrlHelper->link('category', [ 'path' => '136' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Tablets'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '270']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '130', 'fd' => 1]),
],[
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptop'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '285']),
], [
'title' => $translator->trans('MacBook'),
'href' => $seoUrlHelper->link('category', [ 'path' => '596' ]),
'image' => 'macbook-200x150.png',
], [
'title' => 'Workstation laptop',
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '346']),
], [
'title' => $translator->trans('2 in 1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '352']),
], [
'title' => $translator->trans('Gaming laptop'),
'href' => $seoUrlHelper->link('category', [ 'path' => '291' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Desktop computers'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '277']),
], [
'title' => 'Mini PC',
'href' => $seoUrlHelper->link('category', ['path' => '323']),
'image' => 'mini-pc-200x150.png',
], [
'title' => $translator->trans('Notebook with new battery'),
'href' => $seoUrlHelper->link('category', [ 'path' => '651' ]),
'image' => 'laptop-200x150.png',
], [
'title' => $translator->trans('Tablet'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '360']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '285', 'fd' => 1]),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
default:
$data['featuredCategories'] = [];
}
$featuredCategoriesCacheItem->set($data['featuredCategories']);
$featuredCategoriesCacheItem->expiresAfter($cacheLifetime);
$cache->save($featuredCategoriesCacheItem);
}
$data['banners'] = $this->getHeaderBanner($domain);
$data['smallBanners'] = $this->getSmallBanners($domain);
$data['lang'] = $language->getCode();
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['content_top'] = $this->getContentTop($request);
$data['content_bottom'] = $this->getContentBottom($request);
$data['content_reviews'] = $this->getModuleHelper($request)->blockTestimonial('full', true);
$data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
return $this->render('AtechNetCoreBundle/Homepage/index.html.twig', $data);
}
/**
* @param Request $request
* @return Response
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
private function partnerIndex(Request $request): Response
{
$data = [];
$entityManager = $this->getEntityManager();
$translator = $this->getTranslator();
$multiStore = $this->getMultiStoreHelper($request);
$seoUrlHelper = $this->getSeoUrlHelper($request);
$domain = $multiStore->getDomain();
$domainId = $domain->getId();
$cache = $this->cache;
$language = $multiStore->getLanguage();
$cacheLifetime = self::CACHE_LIFETIME_15_MINUTES;
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
$data['precision'] = $domain->getPricePrecision();
$data['currency'] = $domain->getCurrency();
$data['warrantyYear'] = $this->getWarrantyForNonProductText($domainId);
$data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domainId, 'priceWarrantyDay');
$data['mainProducts'] = [];
$productHelper = $this->getProductHelper($request);
// Main Products
$homepageMainProductsCacheKey = 'homepage.main.products.v4.' . $domainId . '.' . $language->getCode();
$homepageMainProductsCacheItem = $cache->getItem($homepageMainProductsCacheKey);
if ($homepageMainProductsCacheItem->isHit()) {
$data['mainProducts'] = $homepageMainProductsCacheItem->get();
} else {
$productGroupProductData = $productHelper->getProductGroupProducts('homepage.main', $domain);
$productGroupProducts = $productGroupProductData['productGroupProducts'];
$groupProductCodesAdded = $productGroupProductData['productGroupCodesAdded'];
$productsToDisplay = $productGroupProductData['productsToDisplay'];
$productGroupResults = $productHelper->getStructuredDataForProducts($productGroupProducts);
$data['mainProducts'] = $productHelper->convertStructuredDataToListViewData($this->url($request), $productGroupResults, $placeholder);
// Fill in
if (count($groupProductCodesAdded) < $productsToDisplay) {
$maxResults = $productsToDisplay - count($groupProductCodesAdded);
// Already Added
$productAlreadyAddedWhere = '';
if (count($groupProductCodesAdded) > 0) {
$productAlreadyAddedWhere = ' AND p.code NOT IN (' . implode(',', $groupProductCodesAdded) . ')';
}
$retailPage = $domain->getType() == 'retail';
$notebookSaleProducts = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $domainId . "
)
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 . "
ORDER BY pm.currentVatPrice ASC, p.updated DESC")
->setMaxResults($maxResults)
->getResult();
$results = $productHelper->getStructuredDataForProducts($notebookSaleProducts);
$data['mainProducts'] = array_merge($data['mainProducts'], $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder));
}
foreach ($data['mainProducts'] as $key => $value) {
$data['mainProducts'][$key]['warrantyYear'] = $value['qualityStatusId'] == Product::QualityStatus_Bazaar ? 1 : $this->getWarrantyForProductType($domain->getId(), $value['typeId'])['year'];
}
$homepageMainProductsCacheItem->set($data['mainProducts']);
$homepageMainProductsCacheItem->expiresAfter($cacheLifetime);
$cache->save($homepageMainProductsCacheItem);
}
// Header Featured Category
$homepageFeaturedCategoryCacheKey = 'homepage.featured.category.v4.' . $domainId . '.' . $language->getCode();
$homepageFeaturedCategoryCacheItem = $cache->getItem($homepageFeaturedCategoryCacheKey);
if ($homepageFeaturedCategoryCacheItem->isHit()) {
$data['featuredCategory'] = $homepageFeaturedCategoryCacheItem->get();
} else {
$featuredCategoryUpper = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_UPPER, $seoUrlHelper);
$featuredCategoryLower = $productHelper->getCategoryGroup($domain, CategoryGroup::CG_TYPE_FEATURED_CATEGORIES_LOWER, $seoUrlHelper);
$data['featuredCategory'] = [];
if (!empty($featuredCategoryUpper)) {
$data['featuredCategory']['upper'] = $featuredCategoryUpper;
}
if (!empty($featuredCategoryLower)) {
$data['featuredCategory']['lower'] = $featuredCategoryLower;
}
$homepageFeaturedCategoryCacheItem->set($data['featuredCategory']);
$homepageFeaturedCategoryCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
$cache->save($homepageFeaturedCategoryCacheItem);
}
// Featured Products
$homepageFeaturedProductCacheKey = 'homepage.featured.products.v5.' . $domainId . '.' . $language->getCode();
$homepageFeaturedProductCacheItem = $cache->getItem($homepageFeaturedProductCacheKey);
if ($homepageFeaturedProductCacheItem->isHit()) {
$data['featuredProduct'] = $homepageFeaturedProductCacheItem->get();
if (isset($data['featuredProduct']['upper']['isRandom']) && $data['featuredProduct']['upper']['isRandom']
|| isset($data['featuredProduct']['lower']['isRandom']) && $data['featuredProduct']['lower']['isRandom']) {
$data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
}
}
else {
$data['featuredProduct'] = $this->getFeatureProductCacheData($productHelper, $domain, $request, $placeholder, $homepageFeaturedProductCacheItem, $cache);
}
$featuredCategoriesCacheKey = 'homepage.featured.categories.v1.' . $domainId . '.' . $language->getCode();
$featuredCategoriesCacheItem = $cache->getItem($featuredCategoriesCacheKey);
if ($featuredCategoriesCacheItem->isHit()) {
$data['featuredCategories'] = $featuredCategoriesCacheItem->get();
} else {
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptops'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '5']),
], [
'title' => $translator->trans('Gamer laptops'),
'href' => $seoUrlHelper->link('category', [ 'path' => '24' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Workstation laptops'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '113']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '241']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '4']),
], [
'title' => $translator->trans('Gamer PCs'),
'href' => $seoUrlHelper->link('category', [ 'path' => '17' ]),
'image' => 'gamer-pc-200x150.png',
], [
'title' => 'Chromebook',
'href' => $seoUrlHelper->link('category', ['path' => '244']),
'image' => 'chromebook-quicklink.png',
], [
'title' => $translator->trans('Tablets'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '269']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '5', 'fd' => 1]),
], [
'title' => $translator->trans('Bazaar'),
'image' => 'bazar-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '250']),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptop'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '56']),
], [
'title' => $translator->trans('Gamer laptop'),
'href' => $seoUrlHelper->link('category', [ 'path' => '62' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Workstation laptop'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '112']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '240']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '48']),
], [
'title' => $translator->trans('Gamer PC'),
'href' => $seoUrlHelper->link('category', [ 'path' => '48_55' ]),
'image' => 'gamer-pc-200x150.png',
], [
'title' => 'Chromebook',
'href' => $seoUrlHelper->link('category', ['path' => '243']),
'image' => 'chromebook-quicklink.png',
], [
'title' => $translator->trans('Tablet'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '268']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '56', 'fd' => 1]),
], [
'title' => $translator->trans('Bazaar'),
'image' => 'bazar-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '249']),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptops'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '130']),
], [
'title' => $translator->trans('Gamer laptops'),
'href' => $seoUrlHelper->link('category', [ 'path' => '136' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => $translator->trans('Workstation laptops'),
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '175']),
], [
'title' => $translator->trans('2in1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '242']),
], [
'title' => $translator->trans('Desktop PC'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '122']),
], [
'title' => $translator->trans('Gamer PCs'),
'href' => $seoUrlHelper->link('category', [ 'path' => '129' ]),
'image' => 'gamer-pc-200x150.png',
], [
'title' => 'Chromebook',
'href' => $seoUrlHelper->link('category', ['path' => '245']),
'image' => 'chromebook-quicklink.png',
], [
'title' => $translator->trans('Tablets'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '270']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '130', 'fd' => 1]),
], [
'title' => $translator->trans('Bazaar'),
'image' => 'bazar-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '251']),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
$data['featuredCategories'] = [
[
'title' => $translator->trans('Laptop'),
'image' => 'laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '285']),
], [
'title' => $translator->trans('Gaming laptop'),
'href' => $seoUrlHelper->link('category', [ 'path' => '291' ]),
'image' => 'gamer-laptop-200x150.png',
], [
'title' => 'Workstation laptop',
'image' => 'workstation-laptop-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '346']),
], [
'title' => $translator->trans('2 in 1 notebooks'),
'image' => '2in1-notebooks-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '352']),
], [
'title' => $translator->trans('All in one computers'),
'image' => 'all-in-one-pc-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '310']),
], [
'title' => $translator->trans('Desktop computers'),
'image' => 'pc-set-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '277']),
], [
'title' => 'Mini PC',
'href' => $seoUrlHelper->link('category', ['path' => '323']),
'image' => 'mini-pc-200x150.png',
], [
'title' => $translator->trans('Monitor'),
'image' => 'monitor-quicklink.png',
'href' => $seoUrlHelper->link('category', ['path' => '304']),
], [
'title' => $translator->trans('Tablet'),
'image' => 'tablet-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '360']),
], [
'title' => $translator->trans('Parts only'),
'href' => $this->generateUrl('product_parts_' . $multiStore->getDefaultLocale()),
'image' => 'components-200x150.png',
], [
'title' => $translator->trans('Discounted notebooks'),
'image' => 'laptop-sale-200x150.png',
'href' => $seoUrlHelper->link('category', ['path' => '285', 'fd' => 1]),
], [
'title' => $translator->trans('wizard_home'),
'image' => 'wizard_icon.svg',
'href' => '/wizard',
],
];
break;
default:
$data['featuredCategories'] = [];
}
$featuredCategoriesCacheItem->set($data['featuredCategories']);
$featuredCategoriesCacheItem->expiresAfter($cacheLifetime);
$cache->save($featuredCategoriesCacheItem);
}
$data['banners'] = $this->getHeaderBanner($domain);
$data['smallBanners'] = $this->getSmallBanners($domain);
$data['lang'] = $language->getCode();
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['content_top'] = $this->getContentTop($request);
$data['content_bottom'] = $this->getContentBottom($request);
$data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
return $this->render('AtechNetCoreBundle/Homepage/partnerDashboard.html.twig', $data);
}
/**
* @Route("/bazar", name="bazar", defaults={"_locale":""})
* @Route("/bazaar", name="bazaar", defaults={"_locale":"en"})
* @Route("/{_locale<%supported_locales%>?}/bazaar", name="bazaar_locale", defaults={"_locale":""})
*
* @todo refactor helpers as service
*
* @param Request $request
*
* @return Response
*/
public function bazaarAction(Request $request, BazaarService $bazaarService, ProductService $productService): Response
{
// Set Bazaar Flag
$request->getSession()->set('isBazaarPage', true);
/** @var MultiStore $multiStoreHelper */
$multiStoreHelper = $this->getMultiStoreHelper($request);
/** @var ProductHelper $productHelper */
$productHelper = $this->getProductHelper($request);
/** @var SeoUrlHelper $seoUrlHelper */
$seoUrlHelper = $this->url($request);
// Data
$data = $bazaarService->homepageData(
$multiStoreHelper,
$productHelper,
$seoUrlHelper
);
// Domain
$domain = $multiStoreHelper->getDomain();
// Language
$language = $multiStoreHelper->getLanguage();
// Additional Data
$data['precision'] = $domain->getPricePrecision();
$data['currency'] = $domain->getCurrency();
$data['warrantyYear'] = $productService->getWarrantyForNonProductText($domain->getId(), 'year', true);
$data['priceWarrantyDay'] = $productService->getWarrantyForNonProductText($domain->getId(), 'priceWarrantyDay', true);
// Common
$data['lang'] = $language->getCode();
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['content_top'] = $this->getContentTop($request);
$data['content_bottom'] = $this->getContentBottom($request);
$data['content_reviews'] = $this->getModuleHelper($request)->blockTestimonial('full', true);
$data['reviewCount'] = $this->getModuleHelper($request)->testimonialCount();
return $this->render('AtechNetCoreBundle/Homepage/bazaar.html.twig', $data);
}
/**
* @Route("/contact", name="contact", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/contact", name="contact_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
* @throws Exception
*/
public function contactAction(Request $request)
{
$data = [];
$multiStore = $this->getMultiStoreHelper($request);
$domain = $multiStore->getDomain();
$translator = $this->getDatabaseTranslator($request);
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $translator->trans('Contact'),
'href' => $this->generateUrl('contact'),
];
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['contentBottom'] = $this->getContentBottom($request);
$data['priceWarrantyDay'] = $this->getWarrantyForNonProductText($domain->getId(), 'priceWarrantyDay');
$contactInfos = $this->getContactInfos();
$domainLanguageCode = $domain->getLanguage()->getCode();
$domainType = $domain->getType();
$data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_RETAIL;
$data['salesManager'] = [];
if (in_array($domain->getId(), [Domain::DOMAIN_ID_WS_SK, Domain::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
$data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_WHOLESALE;
$salesManager = $this->getLoginHelper($request)->getLoggedInCustomer()->getSalesManager();
$data['salesManager']['id'] = $salesManager->getId();
$data['salesManager']['name'] = $salesManager->getFirstName();
$data['salesManager']['username'] = $salesManager->getUsername();
$data['salesManager']['email'] = $salesManager->getEmail();
$data['salesManager']['phone'] = $domainLanguageCode != 'hu' ? $salesManager->getPhone() : $contactInfos['phone.webshop.' . $domainLanguageCode . '.' . $domainType];
} else if ($domain->getId() == Domain::DOMAIN_ID_WS_EU) {
$data['customerTypeId'] = MultiStore::CUSTOMER_TYPE_WHOLESALE;
$salesManager = $this->getEntityManager()->getRepository(User::class)->findOneById(User::USER_ID_KATARINA_JOBBAGYOVA);
$data['salesManager']['id'] = $salesManager->getId();
$data['salesManager']['name'] = $salesManager->getFirstName();
$data['salesManager']['username'] = $salesManager->getUsername();
$data['salesManager']['email'] = $salesManager->getEmail();
$data['salesManager']['phone'] = $salesManager->getPhone();
}
switch ($domainLanguageCode) {
case 'sk':
$data['return_policy_link'] = $this->url($request)->link('page', [
'static_id' => 36,
]);
break;
case 'hu':
$data['return_policy_link'] = $this->url($request)->link('page', [
'static_id' => 31,
]);
break;
case 'cz':
$data['return_policy_link'] = $this->url($request)->link('page', [
'static_id' => 64,
]);
break;
default:
$data['return_policy_link'] = $this->url($request)->link('page', [
'static_id' => 36,
]);
}
$data['webshop_email'] = $contactInfos['mail.webshop.' . $domainLanguageCode . '.' . $domainType];
$data['webshop_phone'] = $contactInfos['phone.webshop.' . $domainLanguageCode . '.' . $domainType];
$data['webshop_phone_trim'] = str_replace(' ', '', $data['webshop_phone']);
$data['warranty_email'] = $contactInfos['mail.warranty.' . $domainLanguageCode . '.' . $domainType];
$data['warranty_phone'] = $contactInfos['phone.warranty.' . $domainLanguageCode . '.' . $domainType];
$data['warranty_phone_trim'] = str_replace(' ', '', $data['warranty_phone']);
$data['company_name'] = $contactInfos['company.' . $domainLanguageCode . '.name'];
$data['company_street'] = $contactInfos['company.' . $domainLanguageCode . '.street'];
$data['company_city'] = $contactInfos['company.' . $domainLanguageCode . '.city'];
$data['company_zip'] = $contactInfos['company.' . $domainLanguageCode . '.zip'];
$data['company_country'] = $contactInfos['company.' . $domainLanguageCode . '.country'];
$data['company_id'] = $contactInfos['company.' . $domainLanguageCode . '.id'];
$data['company_vatId'] = $contactInfos['company.' . $domainLanguageCode . '.vatId'];
$data['company_bankAccount'] = $contactInfos['company.' . $domainLanguageCode . '.bankAccount'];
$data['company_iban'] = $contactInfos['company.' . $domainLanguageCode . '.iban'];
return $this->render('AtechNetCoreBundle/Page/contact.html.twig', $data);
}
/**
* @Route("/language/{locale}", name="set_locale")
* @param Request $request
* @param string $locale
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function setLocaleAction(Request $request, $locale)
{
if (!in_array($locale, Language::SWITCHABLE_LANGUAGE_CODES, true)) {
throw new InvalidParameterException();
}
$session = $request->getSession();
$oldLocale = $request->getLocale();
match ($locale) {
'en' => $session->set('languageId', Language::LANGUAGE_ID_EN),
'sk' => $session->set('languageId', Language::LANGUAGE_ID_SK),
'hu' => $session->set('languageId', Language::LANGUAGE_ID_HU),
'cz' => $session->set('languageId', Language::LANGUAGE_ID_CZ),
};
// Symfony locale
$session->set('_locale', $locale);
$request->setLocale($locale);
MultiStore::setLocalDomain($request);
if ($request->query->get('productId')) {
$redirect = $this->url($request)->link('product', [
'product_id' => $request->query->get('productId'),
]);
return $this->redirect($redirect);
} elseif ($request->query->get('categoryId')) {
$query = $request->query->all();
$categoryId = $request->query->get('categoryId');
if (isset($query['fa'])) {
$filterAttribute = $query['fa'];
unset($query['fa']);
foreach ($filterAttribute as $attributeId => $values) {
$query['fa[' . $attributeId . ']'] = $values;
}
}
unset($query['categoryId']);
$redirect = $this->url($request)->link('category', array_merge([
'path' => $categoryId,
], $query));
return $this->redirect($redirect);
} elseif ($request->query->get('pageId')) {
$redirect = $this->url($request)->link('page', [
'static_id' => $request->query->get('pageId'),
]);
return $this->redirect($redirect);
} elseif ($request->query->get('blogId')) {
$redirect = $this->url($request)->link('blog', [
'blog_id' => $request->query->get('blogId'),
]);
return $this->redirect($redirect);
} elseif ($request->query->get('blogCategoryId')) {
$redirect = $this->url($request)->link('blog_category', [
'blog_category_id' => $request->query->get('blogCategoryId'),
]);
return $this->redirect($redirect);
} elseif ($request->query->get('slug')) {
$parts = explode('/', $request->query->get('slug'));
// Remove any empty arrays from trailing
if (mb_strlen(end($parts)) == 0) {
array_pop($parts);
}
// Domain
$domainId = $request->getSession()->get('domainId');
// Default Language
$defaultLanguageId = $request->getSession()->get('defaultLanguageId');
// Remove Language
if (isset($parts[0])) {
$language = $this->getEntityManager()->getRepository(Language::class)->findOneByCode($parts[0]);
if ($language) {
array_shift($parts);
}
}
// Check Route
if (isset($parts[0]) && isset($parts[1])) {
if ($parts[0] == 'product') {
if ($parts[1] == 'search') {
$query = $request->query->all();
if (isset($query['fa'])) {
$filterAttribute = $query['fa'];
unset($query['fa']);
foreach ($filterAttribute as $attributeId => $values) {
$query['fa[' . $attributeId . ']'] = $values;
}
}
unset($query['slug']);
$redirect = $this->url($request)->link('search', $query);
return $this->redirect($redirect);
} else {
$redirect = $this->url($request)->link('product', [
'product_id' => $parts[1],
]);
return $this->redirect($redirect);
}
} elseif ($parts[0] == 'category') {
$query = $request->query->all();
if (isset($query['fa'])) {
$filterAttribute = $query['fa'];
unset($query['fa']);
foreach ($filterAttribute as $attributeId => $values) {
$query['fa[' . $attributeId . ']'] = $values;
}
}
unset($query['slug']);
$redirect = $this->url($request)->link('category', array_merge([
'path' => $parts[1],
], $query));
return $this->redirect($redirect);
} elseif ($parts[0] == 'page') {
$redirect = $this->url($request)->link('page', [
'static_id' => $parts[1],
]);
return $this->redirect($redirect);
} elseif ($parts[0] == 'blog') {
if (isset($parts[2]) && $parts[2] == 'category') {
$redirect = $this->url($request)->link('blog_category', [
'blog_category_id' => $parts[1],
]);
return $this->redirect($redirect);
} else {
$redirect = $this->url($request)->link('blog', [
'blog_id' => $parts[1],
]);
return $this->redirect($redirect);
}
}
}
// Jump to last Part
$lastPart = end($parts);
$seo_url = $this->getEntityManager()->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $lastPart,
'language' => $defaultLanguageId,
'domain' => [$domainId, null],
]);
if ($seo_url) {
$url = explode('=', $seo_url->getQuery());
if ($url[0] == 'product_id') {
// Bazaar
$isBazaar = false;
if ( isset($parts[0]) && in_array($parts[0], [ 'bazar', 'bazaar' ]) ) {
$isBazaar = true;
}
$redirect = $this->url($request)->link('product', [
'product_id' => (int)$url[1],
'isBazaar' => $isBazaar
]);
return $this->redirect($redirect);
} elseif ($url[0] == 'category_id') {
$query = $request->query->all();
if (isset($query['fa'])) {
$filterAttribute = $query['fa'];
unset($query['fa']);
foreach ($filterAttribute as $attributeId => $values) {
$query['fa[' . $attributeId . ']'] = $values;
}
}
$redirect = $this->url($request)->link('category', array_merge([
'path' => (int)$url[1],
], $query));
return $this->redirect($redirect);
} elseif ($url[0] == 'static_id') {
$redirect = $this->url($request)->link('page', [
'static_id' => (int)$url[1],
]);
return $this->redirect($redirect);
} elseif ($url[0] == 'blog_id') {
$redirect = $this->url($request)->link('blog', [
'blog_id' => (int)$url[1],
]);
return $this->redirect($redirect);
} elseif ($url[0] == 'blog_category_id') {
$redirect = $this->url($request)->link('blog_category', [
'blog_category_id' => (int)$url[1],
]);
return $this->redirect($redirect);
}
}
} elseif ($request->query->get('route')) {
$route = str_replace($oldLocale, $locale, $request->query->get('route'));
return $this->redirectToRoute($route);
}
return $this->redirectToRoute('homepage');
}
/**
* @Route("/not-found", name="not_found", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/not-found", name="not_found_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
*/
public function notFoundAction(Request $request)
{
if ($request->getPathInfo() == '/outsourcing') {
return $this->redirect('https://pc.furbify.sk/outsourcing', 301);
}
$data = [];
$seoUrlHelper = $this->getSeoUrlHelper($request);
$multiStore = $this->getMultiStoreHelper($request);
$domainId = $multiStore->getDomain()->getId();
$translator = $this->getTranslator();
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
if ($request->getSession()->get('blankPage') != null) {
$request->getSession()->remove('blankPage');
$data['blankPage'] = true;
}
$data['contentBottom'] = $this->getContentBottom($request);
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $translator->trans('The page you requested was not found'),
'href' => '',
];
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
$data['category_link_notebook'] = $seoUrlHelper->link('category', [
'path' => 4,
]);
$data['category_link_pc'] = $seoUrlHelper->link('category', [
'path' => 5,
]);
$data['category_link_monitor'] = $seoUrlHelper->link('category', [
'path' => 6,
]);
$data['category_link_parts'] = $seoUrlHelper->link('category', [
'path' => 7,
]);
$data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
'path' => 84,
]);
$data['blog_link'] = $seoUrlHelper->link('category', [
'path' => 3,
]);
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$data['category_link_notebook'] = $seoUrlHelper->link('category', [
'path' => 56,
]);
$data['category_link_pc'] = $seoUrlHelper->link('category', [
'path' => 48,
]);
$data['category_link_monitor'] = $seoUrlHelper->link('category', [
'path' => 78,
]);
$data['category_link_parts'] = $seoUrlHelper->link('category', [
'path' => 44,
]);
$data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
'path' => 85,
]);
$data['blog_link'] = $seoUrlHelper->link('category', [
'path' => 77,
]);
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$data['category_link_notebook'] = $seoUrlHelper->link('category', [
'path' => 130,
]);
$data['category_link_pc'] = $seoUrlHelper->link('category', [
'path' => 122,
]);
$data['category_link_monitor'] = $seoUrlHelper->link('category', [
'path' => 149,
]);
$data['category_link_parts'] = $seoUrlHelper->link('category', [
'path' => 118,
]);
$data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
'path' => 155,
]);
$data['blog_link'] = $seoUrlHelper->link('category', [
'path' => 169,
]);
break;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
$data['category_link_notebook'] = $seoUrlHelper->link('category', [
'path' => 285,
]);
$data['category_link_pc'] = $seoUrlHelper->link('category', [
'path' => 277,
]);
$data['category_link_monitor'] = $seoUrlHelper->link('category', [
'path' => 304,
]);
$data['category_link_parts'] = $seoUrlHelper->link('category', [
'path' => 458,
]);
$data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
'path' => 310,
]);
$data['blog_link'] = $seoUrlHelper->link('category', [
'path' => 340,
]);
break;
default:
$data['category_link_notebook'] = $seoUrlHelper->link('category', [
'path' => 4,
]);
$data['category_link_pc'] = $seoUrlHelper->link('category', [
'path' => 5,
]);
$data['category_link_monitor'] = $seoUrlHelper->link('category', [
'path' => 6,
]);
$data['category_link_parts'] = $seoUrlHelper->link('category', [
'path' => 7,
]);
$data['category_link_all_in_one'] = $seoUrlHelper->link('category', [
'path' => 84,
]);
$data['blog_link'] = $seoUrlHelper->link('category', [
'path' => 3,
]);
break;
}
$view = $this->renderView('AtechNetCoreBundle/Error/404.html.twig', $data);
return new Response($view, 404);
}
/**
* @Route("/error/exception", name="exception_page", defaults={"_locale":""})
* @param Request $request
*/
public function exceptionPageAction(Request $request)
{
$data = [];
$multiStore = $this->getMultiStoreHelper($request);
$domainId = $multiStore->getDomain()->getId();
$translator = $this->getTranslator();
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
if ($request->getSession()->get('blankPage') != null) {
$request->getSession()->remove('blankPage');
$data['blankPage'] = true;
}
$view = $this->renderView('AtechNetCoreBundle/Error/exception.html.twig', $data);
return new Response($view);
}
/**
* @Route("/request-callback", name="request_callback", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/request-callback", name="request_callback_locale", defaults={"_locale":""})
* @param Request $request
* @return JsonResponse
* @throws Exception
*/
public function requestCallbackAction(Request $request)
{
$phoneNumber = $request->request->get('phoneNumber') ?? false;
$timeType = $request->request->get('timeType');
$firstName = $request->request->get('firstName') ?? false;
$customerId = $request->request->get('customerId') ?? false;
$productId = $request->request->get('productId') ?? false;
$captchaResponse = $request->get('gRecaptchaResponse');
$captchaResult = $this->verifyGoogleCaptcha($captchaResponse);
if ($captchaResult && $phoneNumber && !is_null($timeType) && $firstName) {
$callBackData = [
'phoneNumber' => preg_replace("/[^0-9.]/", "", $phoneNumber),
'timeType' => strip_tags($timeType),
'firstName' => strip_tags($firstName),
'host' => $request->getHost(),
'locale' => $request->getLocale(),
];
$entityManager = $this->getEntityManager();
$customerRepo = $entityManager->getRepository(Customer::class);
$multistoreHelper = $this->getMultiStoreHelper($request);
$callBackData['domain'] = $multistoreHelper->getDomain();
$entityManager = $this->getEntityManager();
$callBackData['customer'] = $customerId > 0 ? $entityManager->getRepository(Customer::class)->findOneById($customerId) : null;
$callBackData['product'] = $productId > 0 ? $entityManager->getRepository(Product::class)->findOneById($productId) : null;
$callbackEntity = $customerRepo->createCustomerCallback($callBackData);
$entityManager->persist($callbackEntity);
$entityManager->flush();
$callBackData['id'] = $callbackEntity->getId();
$translator = $this->getTranslator();
$response = $customerRepo->sendCallbackEmailToSalesManager($translator, $callBackData, $this->getMailer(), $this->getLoginHelper($request)->getLoggedInCustomer());
}
return new JsonResponse($response);
}
/**
* @Route("/init-cetelem-sk", name="init_cetelem_sk")
* @param Request $request
* @return false|null|string
*/
public function initCetelemSkAction(Request $request)
{
$response = null;
if (!is_null($request->request->get('price'))) {
$price = (float)$request->request->get('price');
$cetelemCalculator = $this->getCetelemHelperSK();
$response = $cetelemCalculator->getCalculatorView([
'cenaTovaru' => $price,
]);
}
return new Response($response);
}
/**
* @Route("/recalculate-cetelem-sk", name="recalculate_cetelem_sk")
* @param Request $request
* @return Response
*/
public function reCalculateCetelemSkAction(Request $request)
{
$calculatorView = '';
$req = $request->request;
$cetelemRequest['cenaTovaru'] = (float)$req->get('cenaTovaru');
if (!is_null($req->get('kodBaremu')) && $req->get('kodBaremu') != ''
&& !is_null($req->get('kodPoistenia')) && $req->get('kodPoistenia') != ''
&& !is_null($req->get('kodMaterialu')) && $req->get('kodMaterialu') != ''
&& !is_null($req->get('priamaPlatba')) && $req->get('priamaPlatba') != ''
&& !is_null($req->get('pocetSplatok')) && $req->get('pocetSplatok') != ''
&& !is_null($req->get('odklad')) && $req->get('odklad') != '') {
$cetelemRequest['kodBaremu'] = $req->get('kodBaremu');
$cetelemRequest['kodPoistenia'] = $req->get('kodPoistenia');
$cetelemRequest['kodMaterialu'] = $req->get('kodMaterialu');
$cetelemRequest['priamaPlatba'] = $req->get('priamaPlatba');
$cetelemRequest['pocetSplatok'] = $req->get('pocetSplatok');
$cetelemRequest['odklad'] = $req->get('odklad');
$cetelem = $this->getCetelemHelperSK();
$calculatorView = $cetelem->getCalculatorView($cetelemRequest);
if (is_array($calculatorView) && $cetelem->isDebugActive()) {
var_dump($calculatorView);
}
}
return new Response($calculatorView);
}
/**
* @Route("/sitemap.xml", name="regenerate_sitemaps")
* @param Request $request
* @return Response
* @throws Exception
*/
public function sitemapAction(Request $request): Response
{
$multistoreHelper = $this->getMultiStoreHelper($request);
$entityManager = $this->getEntityManager();
$domain = $multistoreHelper->getDomain();
$language = $domain->getLanguage();
$translator = $this->getDatabaseTranslator($request);
$seoUrlHelper = $this->getSeoUrlHelper($request);
// Domain TLD
$domainTLD = $language->getCode();
if ($domainTLD == 'en') {
$domainTLD = 'eu';
}
$urls = [];
$urls[] = $homepage = 'https://www.furbify.' . $domainTLD;
$urls[] = $homepage . $this->generateUrl('contact');
switch ($domain->getLanguage()->getCode()) {
case 'sk':
$urls[] = "$homepage/hodnotenia-zakaznikov";
break;
case 'hu':
$urls[] = "$homepage/vasarloi-velemenyek";
break;
case 'cz':
$urls[] = "$homepage/hodnoceni-zakaznikov";
break;
case 'en':
$urls[] = "$homepage/reviews";
break;
}
$excludeStaticPages = [
7, 24, // Resellers
9, 25, // ESET
];
// static pages
$staticPages = $entityManager->createQuery("SELECT sp
FROM AtechNetCoreBundle:StaticPage sp
WHERE sp.domain = :domain AND sp.published = :published AND sp.indexable = :indexable AND sp.id NOT IN (" . implode(',', $excludeStaticPages) . ")")
->setParameters([
'domain' => $domain,
'published' => true,
'indexable' => true,
])
->getResult();
foreach ($staticPages as $staticPage) {
$urls[] = $homepage . '/' . $staticPage->getMetaByLanguage($language)->getLink();
}
// blog
$urls[] = $homepage . $this->generateUrl('blog_main');
// blog posts
$blogPages = $entityManager->getRepository(BlogPage::class)->findBy([
'domain' => $domain,
'published' => true,
'indexable' => true,
]);
foreach ($blogPages as $blogPage) {
$blogCategoryId = $blogPage->getCategoryPage() && $blogPage->getCategoryPage()->getId() > 0 ? $blogPage->getCategoryPage()->getId() : $multistoreHelper->getBlogCategoryIdByDomainId($domain->getId());
$urls[] = $this->url($request)->link('blog', [
'blog_category_id' => $blogCategoryId,
'blog_id' => $blogPage->getId(),
]);
}
// product categories
$productCategories = $entityManager->getRepository(CategoryPage::class)->findBy([
'domain' => $domain,
'published' => true,
'indexable' => true,
'type' => CategoryPage::CATEGORY_TYPE_PRODUCT,
]);
/**
* @var CategoryPage $productCategory
*/
foreach ($productCategories as $productCategory) {
$urls[] = $homepage . (!is_null($productCategory->getParentCategory()) ? '/' . $productCategory->getParentCategory()->getMetaByLanguage($language)->getLink() : '') . '/' . $productCategory->getMetaByLanguage($language)->getLink();
}
$excludeProducts = [
2493,
8521,
7316,
7317,
];
// products
$products = $entityManager->createQuery("SELECT p.code, v.name AS vendor, pt.title AS productType, p.name AS title
FROM AtechNetCoreBundle:ProductMeta pm
LEFT JOIN pm.product p
LEFT JOIN p.type pt
LEFT JOIN p.vendor v
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) . ")")
->getResult();
foreach ($products as $product) {
$urls[] = $homepage . '/' . $seoUrlHelper->slug($translator->trans($product['productType']) . ($product['vendor'] != 'VARIOUS' ? ' ' . $product['vendor'] : '') . ' ' . $product['title'] . ' ' . $product['code']);
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach ($urls as $url) {
$xml .= '<url><loc>' . $url . '</loc></url>';
}
$xml .= '</urlset>';
$response = new Response($xml);
$response->headers->set('Content-Type', 'xml');
return $response;
}
/**
* @Route("/site.webmanifest", name="regenerate_webmanifests")
* @param Request $request
* @return JsonResponse
* @throws Exception
*/
public function webmanifestAction(Request $request): JsonResponse
{
$translator = $this->getTranslator();
$response = new JsonResponse([
'name' => $translator->trans('default page title'),
'short_name' => 'furbify',
'icons' => [
'src' => '/android-chrome-96x96.png',
'sizes' => '96x96',
'type' => 'image/png',
],
'theme_color' => '#ffffff',
'background_color' => '#ffffff',
'display' => 'standalone',
]);
$response->headers->set('Content-Type', 'application/manifest+json');
return $response;
}
/**
* @Route("/robots.txt", name="robots")
* @param Request $request
* @return Response
*/
public function robotsAction(Request $request): Response
{
// MultiStore
$multiStore = $this->getMultiStoreHelper($request);
// Domain TLD
$domainTLD = $multiStore->getDefaultLocale();
if ($domainTLD == 'en') {
$domainTLD = 'eu';
}
$txt = 'User-agent: *
Disallow: /hu/
Disallow: /sk/
Disallow: /cz/
Disallow: /en/
Sitemap: https://www.furbify.' . $domainTLD . '/sitemap.xml';
$response = new Response($txt);
$response->headers->set('Content-Type', 'text/plain');
return $response;
}
/**
* @Route("/heureka.xml", name="heureka_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function heurekaFeedAction(Request $request): Response
{
$translator = $this->getDatabaseTranslator($request);
$domain = $this->getMultiStoreHelper($request)->getDomain();
$vat = $domain->getVat();
$languageCode = $domain->getLanguage()->getCode();
$cache = $this->cache;
$cacheKey = 'heureka.' . $domain->getId() . '.v7';
$heurekaCacheItem = $cache->getItem($cacheKey);
if ($heurekaCacheItem->isHit()) {
$xmlData = $heurekaCacheItem->get();
} else {
$xml = '<?xml version="1.0" encoding="utf-8" ?><SHOP>';
$products = $this->getEntityManager()
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
WHERE p.archived = 0 AND p.available > 0 AND p.qualityStatus IN (" . Product::QualityStatus_Platinum . " ," . Product::QualityStatus_New . ")")
->getResult();
$entityManager = $this->getEntityManager();
$shippingMethods = $entityManager->getRepository(DomainShippingType::class)->findBy([
'domain' => $domain->getId(),
'activeOnWeb' => true,
], [
'sortIndex' => 'ASC',
]);
$cashOndeliveryPrice = $entityManager->getRepository(DomainPaymentType::class)->findOneBy([
'domain' => $domain->getId(),
'activeOnWeb' => true,
'type' => PaymentType::CashOnDelivery->value,
])->getPrice();
$deliveryTags = '';
foreach ($shippingMethods as $shippingMethod) {
// Shipping Cost
$shippingPrice = $shippingMethod->getPrice();
// Round Shipping Cost
if (in_array($domain->getId(), [Domain::DOMAIN_ID_RT_HU, Domain::DOMAIN_ID_WS_HU])) {
$shippingPrice = number_format($shippingPrice, 0, '.', '');
}
$DELIVERY_ID = '';
switch ($shippingMethod->getType()) {
case DomainShippingType::SHIPPING_TYPE_CARRIER_EXPRESS_ID:
$DELIVERY_ID = 'GLS';
break;
case DomainShippingType::ShippingType_Carrier_Id:
$DELIVERY_ID = 'DHL';
break;
case DomainShippingType::ShippingType_PICKUP_POINT_Id:
$DELIVERY_ID = 'GLS_PARCELLOCKER';
break;
case DomainShippingType::SHIPPING_TYPE_PACKETA_PICKUP_POINT_ID:
$DELIVERY_ID = 'Z_BOX';
break;
}
$DELIVERY_PRICE_COD = $shippingPrice + $cashOndeliveryPrice;
if ($DELIVERY_ID != '') {
$deliveryTags .= "<DELIVERY>
<DELIVERY_ID>$DELIVERY_ID</DELIVERY_ID>
<DELIVERY_PRICE>$shippingPrice</DELIVERY_PRICE>
<DELIVERY_PRICE_COD>$DELIVERY_PRICE_COD</DELIVERY_PRICE_COD>
</DELIVERY>";
}
}
foreach ($products as $product) {
$product_meta = $product->getDomainMeta($domain);
if ($product_meta === false || $product->getType()->getId() == 82) {
continue;
}
if (!$product->isAvailable()
|| !$product_meta->isActive()
|| !$product_meta->isReady()) {
continue;
}
$price = $product_meta->isDiscounted() ? $product_meta->getDomainVatDiscount() : $product_meta->getDomainVatPrice();
$thumb = '';
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
$photo = $photos[array_keys($photos)[0]];
if (is_object($photo)) {
$thumb = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
$ean = $product->getEAN();
$exp_name = explode(' ', $product->getFullTitle($translator));
$categorytext = trim($product->getType()->getTitle());
switch (mb_strtolower($categorytext)) {
case 'software':
if (in_array('Office', $exp_name)) {
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Software | Kancelárske aplikácie';
}
if (in_array('Windows', $exp_name)) {
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Software | Operačné systémy';
}
break;
case 'notebook':
case 'notebook 2 in 1':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Notebooky';
break;
case 'monitor':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Monitory';
break;
case 'pc':
case 'pc set':
case 'all in one':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Stolné počítače';
break;
case 'tablet':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tablety';
break;
case 'mouse':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Myši';
break;
case 'keyboard':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Klávesnice';
break;
case 'interactive accessory':
case 'reduction':
case 'cable video':
case 'cable hdmi':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | VGA, DVI, HDMI káble';
break;
case 'cable data':
case 'pc accessory':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | Dátové prepínače';
break;
case 'power bank':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Batérie | Powerbanky';
break;
case 'card reader':
case 'usb card reader':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Čítačky pamäťových kariet';
break;
case 'headphones':
case 'headset':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Slúchadlá';
break;
case 'toner':
case 'cartridge':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Náplne a tonery - kompatibilné';
break;
case 'notebook battery':
$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';
break;
case 'ssd':
case 'hdd 3,5"':
case 'hdd 2,5"':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Pevné disky';
break;
case 'motherboard':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Základné dosky';
break;
case 'webcam':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Webkamery';
break;
case 'ram pc':
case 'ram nb':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Pamäte';
break;
case 'odd pc':
case 'odd nb':
case 'usb other':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Mechaniky';
break;
case 'usb wifi':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Sieťové prvky | WiFi antény';
break;
case 'docking station':
case 'usb bluetooth':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Dokovacie stanice a replikátory portov';
break;
case 'notebook display':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Príslušenstvo k notebookom | Displeje pre notebooky';
break;
case 'vga':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Grafické karty';
break;
case 'notebook bag':
case 'notebook backpack':
$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';
break;
case 'cleaning pc/nb':
$categorytext = 'Heureka.' . $languageCode . ' | Dom a záhrada | Domácnosť | Čistiace prostriedky pre domácnosť | Prípravky na čistenie | Čistiace prostriedky na spotrebiče';
break;
case 'notebook keyboard':
$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';
break;
case 'notebook bay':
$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';
break;
case 'speaker':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Reprosústavy a reproduktory';
break;
case 'hdd adapter':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Výmenné kity a boxy';
break;
case 'power supply':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Zdroje';
break;
case 'battery':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Batérie | Batérie primárne';
break;
case 'notebook cooler':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Chladenie';
break;
case 'usb hub':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | USB huby';
break;
case 'usb ethernet':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Sieťové karty';
break;
case 'microphone':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Audio | Mikrofóny';
break;
case 'printer drum':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Zobrazovacie valce';
break;
case 'surge arrest':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Záložné zdroje | Prepäťové ochrany';
break;
case 'projector':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Projekčná technika | Projektory';
break;
case 'case pc':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | PC skrinky';
break;
case 'mouse pad':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Klávesnice a myši | Podložky pod myš';
break;
case 'power adapter':
$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';
break;
case 'projector accessory':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | Projekčná technika | Držiaky k projektorom';
break;
case 'cpu':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Procesory';
break;
case 'sound card':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Zvukové karty';
break;
case 'cable usb':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Káble a konektory | USB káble';
break;
case 'pci express card':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové komponenty | Radiče';
break;
case 'printer':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Tlačiarne a príslušenstvo | Tlačiarne';
break;
case 'microsd card':
case 'sd card':
case 'flash card':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | Pamäťové karty';
break;
case 'smartphone':
case 'phone':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Mobily, GPS | Mobilné telefóny';
break;
case 'smartwatch':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Mobily, GPS | Wearables | Inteligentné hodinky';
break;
case 'monitor stand':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | TV, video, audio | TV a video príslušenstvo | Držiaky a stojany na TV a monitory';
break;
case 'usb flash':
$categorytext = 'Heureka.' . $languageCode . ' | Elektronika | Počítače a kancelária | Počítačové príslušenstvo | USB flash disky';
break;
default:
$categorytext = 'do not include';
}
if ($categorytext == 'do not include') {
continue;
}
$itemType = in_array($product->getQualityStatus(), [Product::QualityStatus_Platinum, Product::QualityStatus_New]) ? '' : '<ITEM_TYPE>bazar</ITEM_TYPE>';
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
if ($productCode == '1460061') {
$description = 'Biela bezdrôtová mýš, 1000/1600 dpi';
} else {
$description = strip_tags($product->getDescription());
}
$defaultProductName = ($vendor != '' ? $vendor . ' ' : '') . $product->getName();
$productName = $product->getExternalFeedNameByLanguage($domain->getLanguage()) ? $product->getExternalFeedNameByLanguage($domain->getLanguage())->getName() : $defaultProductName;
$xml .= "<SHOPITEM>
<ITEM_ID>" . $product->getId() . "</ITEM_ID>
<PRODUCTNAME><![CDATA[$productName]]></PRODUCTNAME>
<PRODUCT><![CDATA[" . ($vendor != '' ? $vendor . ' ' : '') . $product->getName() . "]]></PRODUCT>
<DESCRIPTION><![CDATA[$description]]></DESCRIPTION>
<URL>https://www.furbify.sk/$link</URL>
<EAN>$ean</EAN>
<IMGURL>$thumb</IMGURL>
<PRICE>" . round($price / 1.2, 2) . "</PRICE>
<PRICE_VAT>$price</PRICE_VAT>
<VAT>$vat%</VAT>
<MANUFACTURER><![CDATA[$vendor]]></MANUFACTURER>
<DELIVERY_DATE>" . ($product->getAvailable() > 0 ? 0 : '') . "</DELIVERY_DATE>
$deliveryTags
<CATEGORYTEXT>" . trim($categorytext) . "</CATEGORYTEXT>
$itemType
</SHOPITEM>";
}
$xml .= '</SHOP>';
$entityManager = $this->getEntityManager();
$entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_HEUREKA);
$xmlData = $xml;
$heurekaCacheItem->set($xml);
$heurekaCacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
$cache->save($heurekaCacheItem);
}
$response = new Response($xmlData);
$response->headers->set('Content-Type', 'xml');
return $response;
}
/**
* @Route("/zbozi.xml", name="zbozi_cz_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function zboziFeedAction(Request $request): Response
{
$translator = $this->getDatabaseTranslator($request);
$domain = $this->getMultiStoreHelper($request)->getDomain();
$serviceTranslator = $this->getTranslator();
if (!$request->get('token') || $request->get('token') != "a192ab15f83a16a07c34a71f9379c0ea" || $domain->getLanguage()->getCode() != 'cz') {
return $this->redirectToRoute('homepage');
}
$cache = $this->cache;
$zboziCacheKey = 'zbozi.cz.products.v2';
$zboziCacheItem = $cache->getItem($zboziCacheKey);
if ($zboziCacheItem->isHit()) {
$xml = $zboziCacheItem->get();
} else {
$xml = '<?xml version="1.0" encoding="utf-8" ?><SHOP xmlns="http://www.zbozi.cz/ns/offer/1.0">';
$products = $this->getEntityManager()
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.metas pm
LEFT JOIN p.type pt
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 . ")")
->getResult();
$shippingMethodPrice = CartHelper::getShippingMethodWithHighestPriceForDomain($domain, $this->getEntityManager());
$cashOnDeliveryPrice = $this->getEntityManager()->getRepository(DomainPaymentType::class)->findOneBy([
'domain' => $domain->getId(),
'type' => PaymentType::CashOnDelivery->value,
])->getPrice();
foreach ($products as $product) {
$productMeta = $product->getDomainMeta($domain);
$categorytext = trim($product->getType()->getTitle());
switch (mb_strtolower($categorytext)) {
case 'notebook':
$categorytext = 'Počítače | Notebooky';
break;
case 'monitor':
$categorytext = 'Počítače | Počítačové příslušenství | Monitory';
break;
case 'pc':
case 'pc set':
case 'all in one':
$categorytext = 'Počítače | Stolní počítače';
break;
case 'tablet':
$categorytext = 'Počítače | Tablety';
break;
case 'mouse':
$categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Myši';
break;
case 'keyboard':
$categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Klávesnice';
break;
case 'interactive accessory':
case 'reduction':
case 'cable video':
case 'cable hdmi':
$categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | Video kabely';
break;
case 'cable data':
case 'pc accessory':
$categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | USB kabely';
break;
case 'power bank':
$categorytext = 'Elektronika | Baterie a nabíjení | Baterie a akumulátory | Powerbanky';
break;
case 'card reader':
case 'usb card reader':
$categorytext = 'Počítače | Ukládání dat | Příslušenství pro datové nosiče | Čtečky paměťových karet';
break;
case 'headphones':
case 'headset':
$categorytext = 'Elektronika | TV a audio-video | Audio | Sluchátka';
break;
case 'toner':
case 'cartridge':
$categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Náplně a tonery';
break;
case 'notebook battery':
$categorytext = 'Počítače | Příslušenství pro notebooky | Baterie k notebookům';
break;
case 'ssd':
$categorytext = 'Počítače | Ukládání dat | Pevné disky | SSD disky';
break;
case 'hdd 3,5"':
case 'hdd 2,5"':
$categorytext = 'Počítače | Ukládání dat | Pevné disky | Interní pevné disky';
break;
case 'motherboard':
$categorytext = 'Počítače | Počítačové komponenty | Základní desky';
break;
case 'webcam':
$categorytext = 'Počítače | Počítačové příslušenství | Webkamery';
break;
case 'ram pc':
case 'ram nb':
$categorytext = 'Počítače | Počítačové komponenty | Operační paměti';
break;
case 'odd pc':
case 'odd nb':
case 'usb other':
$categorytext = 'Počítače | Počítačové komponenty | Mechaniky';
break;
case 'usb wifi':
$categorytext = 'Počítače | Počítačové příslušenství | Síťové prvky | Wi-Fi a Bluetooth adaptéry';
break;
case 'docking station':
case 'usb bluetooth':
$categorytext = 'Počítače | Příslušenství pro notebooky | Dokovací stanice a replikátory portů';
break;
case 'notebook display':
$categorytext = 'Počítače | Náhradní díly pro notebooky | Náhradní displeje pro notebooky';
break;
case 'vga':
$categorytext = 'Počítače | Počítačové komponenty | Grafické karty';
break;
case 'notebook bag':
$categorytext = 'Počítače | Příslušenství pro notebooky | Brašny';
break;
case 'cleaning pc/nb':
$categorytext = 'Kosmetika a drogerie | Drogerie | Čisticí prostředky | Ostatní čisticí prostředky';
break;
case 'notebook keyboard':
$categorytext = 'Počítače | Náhradní díly pro notebooky | Náhradní klávesnice pro notebooky';
break;
case 'notebook bay':
$categorytext = 'Počítače | Příslušenství pro notebooky | Stojany a podložky pro notebooky';
break;
case 'speaker':
$categorytext = 'Elektronika | TV a audio-video | Audio | Reprosoustavy a reproduktory';
break;
case 'hdd adapter':
$categorytext = 'Počítače | Ukládání dat | Příslušenství pro datové nosiče | Rámečky a boxy pro pevné disky';
break;
case 'power supply':
$categorytext = 'Počítače | Počítačové komponenty | Počítačové zdroje';
break;
case 'battery':
$categorytext = 'Elektronika | Baterie a nabíjení | Baterie a akumulátory | Článkové baterie';
break;
case 'notebook cooler':
$categorytext = 'Počítače | Příslušenství pro notebooky | Stojany a podložky pro notebooky';
break;
case 'usb hub':
$categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | USB huby';
break;
case 'usb ethernet':
$categorytext = 'Počítače | Počítačové příslušenství | Síťové prvky | Síťové karty';
break;
case 'microphone':
$categorytext = 'Elektronika | TV a audio-video | Audio | Mikrofony';
break;
case 'printer drum':
$categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Tiskové válce';
break;
case 'surge arrest':
$categorytext = 'Dům, byt a zahrada | Stavebniny | Elektroinstalační materiál | Přepěťové ochrany';
break;
case 'projector':
$categorytext = 'Elektronika | TV a audio-video | Projekční technika | Projektorys';
break;
case 'case pc':
$categorytext = 'Počítače | Počítačové komponenty | PC skříně';
break;
case 'mouse pad':
$categorytext = 'Počítače | Počítačové příslušenství | Klávesnice a myši | Podložky pod myš';
break;
case 'power adapter':
$categorytext = 'Počítače | Příslušenství pro notebooky | Adaptéry k notebookům';
break;
case 'projector accessory':
$categorytext = 'Elektronika | TV a audio-video | Projekční technika | Držáky na projektory';
break;
case 'cpu':
$categorytext = 'Počítače | Počítačové komponenty | Procesory';
break;
case 'sound card':
$categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | Zvukové karty';
break;
case 'cable usb':
$categorytext = 'Počítače | Počítačové příslušenství | Kabely a konektory | Kabely | USB kabely';
break;
case 'pci express card':
$categorytext = 'Počítače | Počítačové komponenty | Rozšiřující karty a huby | Ostatní rozšiřující karty a řadiče';
break;
case 'printer':
$categorytext = 'Počítače | Počítačové příslušenství | Tiskárny a příslušenství | Tiskárny';
break;
case 'microsd card':
$categorytext = 'Počítače | Ukládání dat | Paměťové karty';
break;
default:
$categorytext = false;
}
if (!$categorytext) {
continue;
}
$parameters = '';
$condition = 'refurbished';
$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.';
foreach ($product->getSpecificationProductAttributeOptions() as $spec) {
$option = $spec->getOption();
$attributeId = $option->getAttribute()->getId();
if ($attributeId != 101 /* Kvalita */) {
$parameters .= "<PARAM>
<PARAM_NAME>" . $option->getAttribute()->getTitle($translator) . "</PARAM_NAME>";
$title = $option->getLongTitle($translator);
if (empty($title)) {
$title = $option->getTitle($translator);
}
$parameters .= "
<VAL>$title</VAL>
</PARAM>";
} else {
$condition = $option->getTitle() == 'New' ? 'new' : 'refurbished';
if ($option->getTitle() == 'New') {
$conditionDescription = $serviceTranslator->trans('quality description ' . mb_strtolower($option->getTitle()));
}
}
}
$price = $productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice();
$deliveryDate = 0;
$thumb = '';
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
$photo = $photos[array_keys($photos)[0]];
if (is_object($photo)) {
$thumb = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
$eanValue = $product->getEan();
$eanTag = $eanValue && is_numeric($eanValue) && (strlen($eanValue) == 8 || strlen($eanValue) == 13 || strlen($eanValue) == 14) ? "<EAN>$eanValue</EAN>" : '';
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
$warrantyInYears = $this->getWarrantyForProductType($domain->getId(), $product->getType()->getId())['year'];
$warranty = $warrantyInYears * 12;
$productNo = $product->getCode();
$customLabels = [];
if ($productMeta->isTimedSaleActive(true)) {
array_push($customLabels, $serviceTranslator->trans('Flash sale') . ' ' . $serviceTranslator->trans('for limited time'));
}
$availableText = false;
if ($product->getAvailable() > 10) {
$availableText = $serviceTranslator->trans('10+ in stock');
} elseif ($product->getAvailable() >= 5) {
$availableText = $serviceTranslator->trans('5-10 in stock');
} elseif ($product->getAvailable() > 1) {
$availableText = $serviceTranslator->trans('2-4 in stock');
} elseif ($product->getAvailable() == 1) {
$availableText = $serviceTranslator->trans('Only one left');
}
if ($availableText) {
array_push($customLabels, $availableText);
}
$deliveryPrice = 0;
if ($price > $shippingMethodPrice->getFreeShipLimit()) {
array_push($customLabels, $serviceTranslator->trans('Free delivery'));
} else {
$deliveryPrice = $shippingMethodPrice->getPrice();
}
$brandTag = $vendor ? "<BRAND><![CDATA[$vendor]]></BRAND>" : '';
$customLabelTags = '';
if (count($customLabels) > 0) {
for ($i = 0; $i < count($customLabels); $i++) {
$customLabelTags .= "<CUSTOM_LABEL_$i>" . $customLabels[$i] . "</CUSTOM_LABEL_$i>";
}
}
$listPriceTag = '';
if ($productMeta->isDiscounted()) {
$originalPrice = $productMeta->getDomainVatPrice();
$listPriceTag = "<LIST_PRICE>$originalPrice</LIST_PRICE>";
}
$releaseDate = $productMeta->getCreated()->format('Y-m-d');
$releaseDateTag = "<RELEASE_DATE>$releaseDate</RELEASE_DATE>";
$productName = ($vendor != '' ? $vendor . ' ' : '') . $productName;
$productNameValue = is_numeric($productName[0]) ? $category . ' ' . $productName : $productName;
// More info: https://napoveda.zbozi.cz/xml-feed/specifikace/
$xml .= "<SHOPITEM>
<PRODUCTNAME><![CDATA[$productNameValue]]></PRODUCTNAME>
<DESCRIPTION><![CDATA[" . strip_tags($product->getDescription()) . "]]></DESCRIPTION>
<URL>https://www.furbify.cz/$link</URL>
<PRICE_VAT>$price</PRICE_VAT>
<DELIVERY_DATE>$deliveryDate</DELIVERY_DATE>
<IMGURL>$thumb</IMGURL>
<PRODUCT><![CDATA[$productNameValue]]></PRODUCT>
<MANUFACTURER><![CDATA[$vendor]]></MANUFACTURER>
<DELIVERY>
<DELIVERY_ID>GLS</DELIVERY_ID>
<DELIVERY_PRICE>$deliveryPrice</DELIVERY_PRICE>
<DELIVERY_PRICE_COD>$cashOnDeliveryPrice</DELIVERY_PRICE_COD>
</DELIVERY>
<ITEM_ID>" . $product->getId() . "</ITEM_ID>
<CATEGORYTEXT>" . trim($categorytext) . "</CATEGORYTEXT>
$eanTag
$parameters
<CONDITION>$condition</CONDITION>
<CONDITION_DESC>$conditionDescription</CONDITION_DESC>
<WARRANTY>$warranty</WARRANTY>
<PRODUCTNO>$productNo</PRODUCTNO>
<VISIBILITY>1</VISIBILITY>
$brandTag
$customLabelTags
$listPriceTag
$releaseDateTag
</SHOPITEM>";
}
$xml .= '</SHOP>';
$zboziCacheItem->set($xml);
$zboziCacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
$cache->save($zboziCacheItem);
}
$entityManager = $this->getEntityManager();
$entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_ZBOZI);
$response = new Response($xml);
$response->headers->set('Content-Type', 'xml');
return $response;
}
/**
* @Route("/facebook.xml", name="facebook_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function facebookFeedAction(Request $request): Response
{
ini_set('memory_limit', '768M');
$entityManager = $this->getEntityManager();
$domain = $this->getMultiStoreHelper($request)->getDomain();
$domainLanguage = strtolower($domain->getLanguage()->getCode());
// Domain TLD
$domainTLD = $domainLanguage;
if ($domainTLD == 'en') {
$domainTLD = 'eu';
}
// Translator
$translator = $this->getDatabaseTranslator($request);
$xml = '<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<title>' . $domain->getTitle() . '</title>
<link>' . $domain->getUrl() . '</link>';
$products = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
WHERE p.archived = 0
AND p.available > 0
AND p.type != 82
AND p.qualityStatus != :bazar")
->setParameter('bazar', Product::QualityStatus_Bazaar)
->getResult();
/**
* @var Product $product
*/
foreach ($products as $product) {
$product_meta = $product->getDomainMeta($domain);
if ($product_meta === false) {
continue;
}
if (!$product->isAvailable()
|| !$product_meta->isActive()
|| !$product_meta->isListed()
|| !$product_meta->isReady()
|| $product->getDescription() == '') {
continue;
}
$product_meta = $product->getDomainMeta($domain);
$price = $product_meta->getDomainVatPrice();
$discount = $product_meta->getDomainVatDiscount();
$price = $product_meta->isDiscounted() ? $discount : $price;
$imageLinks = [];
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
foreach ($photos as $photo) {
$imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
$currency = 'EUR';
switch ($domain->getId()) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
case Domain::DOMAIN_ID_WS_EU:
$currency = 'EUR';
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$currency = 'HUF';
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$currency = 'CZK';
break;
}
$imageLinksString = '';
$googleProductCategories = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
ProductType::PRODUCT_TYPE_ID_PC => 325,
ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
ProductType::PRODUCT_TYPE_ID_SERVER => 331,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
];
foreach ($imageLinks as $imageLink) {
if ($imageLinksString == '') {
$imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
} else {
$imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
}
}
if ($imageLinksString == '') {
continue;
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
$description = str_replace(' | Win 7 Pro COA', '', $product->getDescription());
if ($description == 'NEW') {
$description = strtolower($description);
}
if (in_array($product->getType()->getId(), [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
ProductType::PRODUCT_TYPE_ID_MONITOR,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
ProductType::PRODUCT_TYPE_ID_PC,
ProductType::PRODUCT_TYPE_ID_PC_SET,
ProductType::PRODUCT_TYPE_ID_SERVER,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
ProductType::PRODUCT_TYPE_ID_TABLET,
ProductType::PRODUCT_TYPE_ID_SMARTWATCH,
ProductType::PRODUCT_TYPE_ID_CONSOLE,
ProductType::PRODUCT_TYPE_ID_PROJECTOR,
ProductType::PRODUCT_TYPE_ID_PRINTER,
ProductType::PRODUCT_TYPE_ID_SOFTWARE,
])
&& !in_array('2in1 notebook', $product->getBadges())
&& !in_array('Chromebook', $product->getBadges())) {
$categoryTitle = $product->getType()->getTitle($translator);
} elseif (in_array('2in1 notebook', $product->getBadges())) {
$categoryTitle = '2in1 notebook';
} elseif (in_array('Chromebook', $product->getBadges())) {
$categoryTitle = 'Chromebook';
} else {
$categoryTitle = 'Komponent';
}
$xml .= '<item>
<g:id>' . $product->getCode() . '</g:id>
<g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>
<g:description>' . strip_tags($description) . '</g:description>
<g:link>https://www.furbify.' . $domainTLD . '/' . $link . '</g:link>
' . $imageLinksString . '
<g:brand>' . str_replace('&', 'and', $product->getVendor()->getName()) . '</g:brand>
<g:product_type>' . $categoryTitle . '</g:product_type>
<g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>
<g:availability>in stock</g:availability>
<g:google_product_category>' . (isset($googleProductCategories[$product->getType()->getId()]) ? $googleProductCategories[$product->getType()->getId()] : '285') . '</g:google_product_category>
<g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>
<g:bestseller>' . $product_meta->isBestSeller() . '</g:bestseller>
<g:gamer>' . in_array('gamer', $product->getBadges()) . '</g:gamer>
</item>';
}
$xml .= '</channel>
</rss>';
$entityManager = $this->getEntityManager();
$entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_FACEBOOK);
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/google.xml", name="google_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function googleFeedAction(Request $request): Response
{
ini_set('memory_limit', '2048M');
// Entity Manager
$entityManager = $this->getEntityManager();
// Multi-Store
$multiStore = $this->getMultiStoreHelper($request);
$domain = $multiStore->getDomain();
$domainLanguage = strtolower($domain->getLanguage()->getCode());
// Default Language Id
$defaultLanguageId = $multiStore->getDefaultLanguageId();
// Seo Url
$seoUrl = $this->getSeoUrlHelper($request);
// Product Seo Urls
$productSeoUrlResults = $entityManager
->createQuery("SELECT su
FROM AtechNetCoreBundle:Product p
JOIN AtechNetCoreBundle:SeoUrl su WITH su.query = CONCAT('product_id=', p.id)
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")
->setParameter('language', $defaultLanguageId)
->setParameter('bazar', Product::QualityStatus_Bazaar)
->getResult()
;
$productSeoUrls = [];
foreach ( $productSeoUrlResults as $result ) {
[, $productId] = explode('=', $result->getQuery());
$productSeoUrls[(int)$productId] = $result->getKeyword();
}
// Domain TLD
$domainTLD = $domainLanguage;
if ($domainTLD == 'en') {
$domainTLD = 'eu';
}
// Translator
$translator = $this->getDatabaseTranslator($request);
$tr = $this->getTranslator();
$xmlHeader = '<?xml version="1.0"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<title>Furbify</title>
<link>https://www.furbify.' . $domainTLD . '</link>';
$xmlItems = [];
$products = $entityManager
->createQuery("SELECT p, pt, v, a, pm
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
LEFT JOIN p.vendor v
LEFT JOIN p.album a
JOIN p.metas pm WITH pm.domain = :domain
WHERE p.archived = 0
AND p.available > 0 AND pt.id NOT IN (70,71,82)
AND p.qualityStatus != :bazar
AND p.cacheDescription != ''
AND pm.active = true
AND pm.listed = true
AND (pm.price > 0 OR pm.discount > 0)")
->setParameter('bazar', Product::QualityStatus_Bazaar)
->setParameter('domain', $domain)
->getResult();
// Prefetch spec attribute options for main product types (avoids N+1 lazy loads in the loop below)
// Filters mirror the main query above so this only touches the same product set.
$entityManager->createQuery("SELECT p, pa, o, oa
FROM AtechNetCoreBundle:Product p
JOIN p.metas pm WITH pm.domain = :domain
LEFT JOIN p.productAttributes pa
LEFT JOIN pa.option o
LEFT JOIN o.attribute oa
WHERE p.archived = 0
AND p.available > 0
AND p.qualityStatus != :bazar
AND p.type IN (:mainTypes)
AND p.cacheDescription != ''
AND pm.active = true
AND pm.listed = true
AND (pm.price > 0 OR pm.discount > 0)")
->setParameter('bazar', Product::QualityStatus_Bazaar)
->setParameter('domain', $domain)
->setParameter('mainTypes', ProductType::getMainProductTypeIds())
->getResult();
// Photos fetched separately (not joined) to avoid multiplying product/type/vendor/album
// columns across the network for every photo row; grouped + pre-sorted by album id.
$albumIds = [];
foreach ($products as $product) {
if ($product->getAlbum()) {
$albumIds[] = $product->getAlbum()->getId();
}
}
$photosByAlbumId = [];
if ($albumIds !== []) {
$photoResults = $entityManager->createQuery("SELECT ph
FROM AtechNetCoreBundle:Photo ph
WHERE ph.album IN (:albumIds)
ORDER BY ph.sortIndex ASC")
->setParameter('albumIds', array_unique($albumIds))
->getResult();
foreach ($photoResults as $photo) {
$photosByAlbumId[$photo->getAlbum()->getId()][] = $photo;
}
}
$shippingPrices = $entityManager->createQuery("SELECT dst.price
FROM AtechNetCoreBundle:DomainShippingType dst
WHERE dst.activeOnWeb = 1 AND dst.domain = :domain
ORDER BY dst.price ASC")
->setParameters([
'domain' => $domain,
])
->setMaxResults(1)
->getResult();
$shippingPrice = 0;
if (isset($shippingPrices[0]['price'])) {
$shippingPrice = $shippingPrices[0]['price'];
}
$currentDate = (int)(new \DateTime())->format('Ymd');
$isBlackFriday = $currentDate >= 20241123 && $currentDate <= 20241130;
// Google Product Categories
$googleProductCategories = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
ProductType::PRODUCT_TYPE_ID_PC => 325,
ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
ProductType::PRODUCT_TYPE_ID_SERVER => 331,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
];
$googleProductCategoryIDs = array_keys($googleProductCategories);
$mainProductTypeIds = ProductType::getMainProductTypeIds();
// Currency
switch ( $domain->getId() ) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
case Domain::DOMAIN_ID_WS_EU:
$currency = 'EUR';
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$currency = 'HUF';
break;
case Domain::DOMAIN_ID_WS_CZ:
case Domain::DOMAIN_ID_RT_CZ:
$currency = 'CZK';
break;
default:
$currency = 'EUR';
}
if ( $currency !== 'EUR' ) {
$yesterday = ( new \Datetime('now') )->sub(new \DateInterval('P1D'))->format('Y-m-d');
$currencyRate = $this->historicalEuroRate->getRate($currency, $yesterday);
} else {
$currencyRate = 1;
}
/**
* @var Product $product
*/
foreach ($products as $product) {
$product_meta = $product->getDomainMeta($domain);
if ($product_meta === false) {
continue;
}
if (!$product->isAvailable()
|| !$product_meta->isActive()
|| !$product_meta->isListed()
|| !$product_meta->isReady()
|| $product->getDescription() == '') {
continue;
}
$price = $product_meta->getDomainVatPrice();
$discount = $product_meta->getDomainVatDiscount();
$imageLinks = [];
$photos = $photosByAlbumId[$product->getAlbum()?->getId()] ?? [];
if (count($photos) > 0) {
foreach ($photos as $photo) {
$imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
$imageLinksString = '';
foreach ($imageLinks as $imageLink) {
if ($imageLinksString == '') {
$imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
} else {
$imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
}
}
if ($imageLinksString == '') {
continue;
}
$productTypeEntity = $product->getType();
$typeId = $productTypeEntity->getId();
$typeTitle = $productTypeEntity->getTitle($translator);
$vendorEntity = $product->getVendor();
$vendorName = $vendorEntity->getName();
$isMainProductType = in_array($typeId, $mainProductTypeIds);
$category = $typeTitle;
$vendor = $vendorName != 'VARIOUS' ? $vendorName : '';
$productName = $product->getName();
$productCode = $product->getCode();
$productId = $product->getId();
// Product Url
if ( !empty($productSeoUrls[$productId]) ) {
$link = $productSeoUrls[$productId];
} else {
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = $seoUrl->slug($linkRaw);
#echo 'he';
}
if ($isMainProductType) {
$description = $vendorName . ' ' . $product->getName() . ' - ';
$description .= $this->getTranslator()->trans('Google feed product type description', [
'product_type' => strtolower($typeTitle),
]);
$config = ' ';
/** @var ProductAttribute $productAttributeOption */
foreach ($product->getSpecificationProductAttributeOptions() as $productAttributeOption) {
$attributeOption = $productAttributeOption->getOption();
if ($config != ' ') {
$config .= ', ';
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_QUALITY) {
$grade = $tr->trans('grades.' . match (strtolower($attributeOption->getTitle())) {
'gold' => 'A',
'silver' => 'B',
'bronze' => 'C',
default => $attributeOption->getTitle(),
});
$config .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $grade;
}
else {
$config .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
}
}
$description .= $config;
} else {
$description = $product->getDescription();
if ($description == 'NEW') {
$description = strtolower($description);
}
}
if ($isMainProductType && $isBlackFriday) {
$shippingPrice = 0;
}
$productTypeText = (in_array($typeId, $googleProductCategoryIDs)
? (
in_array('workstation', $product->getBadges())
? $typeTitle . '-workstation'
: $typeTitle
)
: 'Komponent');
$windowsLabel = $product->hasBadgeItem('Windows 11')
? 'win11'
: (
$product->hasBadgeItem('win10')
? 'win10'
: ''
);
// Price for Margin Level
$marginLevelPrice = $product_meta->getDomainPrice();
if ( $product_meta->isDiscounted() ) {
$marginLevelPrice = $product_meta->getDomainDiscount();
}
if ( $currency !== 'EUR' ) {
$marginLevelPrice = $marginLevelPrice / $currencyRate;
}
// Margin Level
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 ]) ) {
$marginLevel = $product->getCalculatedMarginLevel($marginLevelPrice);
}
elseif ( $productTypeText == 'Komponent' ) {
$marginLevel = Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_F] ?? Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
}
elseif ( $product->getMarginLevel() > Product::MARGIN_LEVEL_NO ) {
$marginLevel = Product::getMarginLevelChoices()[$product->getMarginLevel()] ?? Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
}
else {
$marginLevel = Product::getMarginLevelChoices()[Product::MARGIN_LEVEL_NO];
}
$xmlItems[] = '<item>'
. '<g:id>' . $product->getCode() . '</g:id>'
. '<g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>'
. '<g:description>' . strip_tags($description) . '</g:description>'
. '<g:link>https://www.furbify.' . $domainTLD . '/' . $link . '</g:link>'
. $imageLinksString
. '<g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>'
. '<g:availability>in_stock</g:availability>'
. '<g:quantity>' . $product->getAvailable() . '</g:quantity>'
. '<g:shipping>'
. '<g:country>' . strtoupper($domainTLD) . '</g:country>'
. '<g:service>Standard</g:service>'
. '<g:price>' . $shippingPrice . ' ' . $currency . '</g:price>'
. '</g:shipping>'
. '<g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>'
. ($product_meta->isDiscounted() ? '<g:sale_price>' . $discount . ' ' . $currency . '</g:sale_price>' : '')
. '<g:google_product_category>' . ($googleProductCategories[$typeId] ?? '285') . '</g:google_product_category>'
. ($vendor != '' ? '<g:brand>' . str_replace('&', 'and', $vendorName) . '</g:brand>' : '')
. '<g:product_type>' . $productTypeText . '</g:product_type>'
. '<g:custom_label_0>' . $marginLevel . '</g:custom_label_0>'
. '<g:custom_label_2>' . $windowsLabel . '</g:custom_label_2>'
. '</item>';
}
$xml = $xmlHeader . implode(PHP_EOL, $xmlItems) . '</channel></rss>';
$entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_GOOGLE);
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/tiktok.xml", name="tiktok_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function tiktokFeedAction(Request $request): Response
{
ini_set('memory_limit', '768M');
$entityManager = $this->getEntityManager();
$domain = $this->getMultiStoreHelper($request)->getDomain();
$domainLanguage = strtolower($domain->getLanguage()->getCode());
$translator = $this->getDatabaseTranslator($request);
$xml = '<?xml version="1.0"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<title>Furbify</title>
<link>https://www.furbify.' . $domainLanguage . '</link>';
$products = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
WHERE p.archived = 0
AND (p.available > 0 OR p.outOfStockStatus = " . Product::OutOfStockStatus_VisibleShadow . ") AND pt.id NOT IN (70,71,82)")
->getResult();
$shippingPrices = $entityManager->createQuery("SELECT dst.price
FROM AtechNetCoreBundle:DomainShippingType dst
WHERE dst.activeOnWeb = 1 AND dst.domain = :domain
ORDER BY dst.price ASC")
->setParameters([
'domain' => $domain,
])
->setMaxResults(1)
->getResult();
$shippingPrice = 0;
if (isset($shippingPrices[0]['price'])) {
$shippingPrice = $shippingPrices[0]['price'];
}
/**
* @var Product $product
*/
foreach ($products as $product) {
$product_meta = $product->getDomainMeta($domain);
if ($product_meta === false) {
continue;
}
if (!$product->isAvailable()
|| !$product_meta->isActive()
|| !$product_meta->isListed()
|| !$product_meta->isReady()
|| $product->getDescription() == '') {
continue;
}
$product_meta = $product->getDomainMeta($domain);
$price = $product_meta->getDomainVatPrice();
$discount = $product_meta->getDomainVatDiscount();
$imageLinks = [];
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
foreach ($photos as $photo) {
$imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
switch ($domain->getId()) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
case Domain::DOMAIN_ID_WS_EU:
$currency = 'EUR';
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$currency = 'HUF';
break;
case Domain::DOMAIN_ID_WS_CZ:
case Domain::DOMAIN_ID_RT_CZ:
$currency = 'CZK';
break;
default:
$currency = 'EUR';
}
$imageLinksString = '';
$googleProductCategories = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 267,
ProductType::PRODUCT_TYPE_ID_MONITOR => 305,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 961,
ProductType::PRODUCT_TYPE_ID_PC => 325,
ProductType::PRODUCT_TYPE_ID_PC_SET => 325,
ProductType::PRODUCT_TYPE_ID_SERVER => 331,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 325,
ProductType::PRODUCT_TYPE_ID_TABLET => 4745,
ProductType::PRODUCT_TYPE_ID_SMARTWATCH => 201,
ProductType::PRODUCT_TYPE_ID_CONSOLE => 1294,
ProductType::PRODUCT_TYPE_ID_PROJECTOR => 396,
ProductType::PRODUCT_TYPE_ID_PRINTER => 500106,
ProductType::PRODUCT_TYPE_ID_SOFTWARE => 2092,
];
$googleProductCategoryIDs = array_keys($googleProductCategories);
foreach ($imageLinks as $imageLink) {
if ($imageLinksString == '') {
$imageLinksString .= '<g:image_link>' . $imageLink . '</g:image_link>';
} else {
$imageLinksString .= '<g:additional_image_link>' . $imageLink . '</g:additional_image_link>';
}
}
if ($imageLinksString == '') {
continue;
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
$description = $product->getDescription();
if ($description == 'NEW') {
$description = strtolower($description);
}
$xml .= '<item>
<g:sku_id>' . $product->getCode() . '</g:sku_id>
<g:title>' . str_replace('&', 'and', $product->getFullTitle($translator)) . '</g:title>
<g:description>' . strip_tags($description) . '</g:description>
<g:link>https://www.furbify.' . $domainLanguage . '/' . $link . '</g:link>
' . $imageLinksString . '
<g:condition>' . ($product->getQualityStatus() == Product::QualityStatus_New ? 'new' : 'refurbished') . '</g:condition>
<g:availability>in stock</g:availability>
<g:shipping> ' . strtoupper($domainLanguage) . ':::' . $shippingPrice . ' ' . $currency . ':Standard
</g:shipping>
<g:price>' . str_replace(' ', '', $price) . ' ' . $currency . '</g:price>
' . ($product_meta->isDiscounted() ? '<g:sale_price>' . $discount . ' ' . $currency . '</g:sale_price>' : '') . '
<g:google_product_category>' . (isset($googleProductCategories[$product->getType()->getId()]) ? $googleProductCategories[$product->getType()->getId()] : '285') . '</g:google_product_category>
' . ($vendor != '' ? '<g:brand>' . str_replace('&', 'and', $product->getVendor()->getName()) . '</g:brand>' : '') . '
<g:product_type>' . (in_array($product->getType()->getId(), $googleProductCategoryIDs) ? $product->getType()->getTitle($translator) : 'Komponent') . '</g:product_type>
</item>';
}
$xml .= '</channel>
</rss>';
$entityManager = $this->getEntityManager();
$entityManager->getRepository(Customer::class)->increaseCustomerValidRequest(CustomerProductFeed::CUSTOMER_ID_GOOGLE);
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/olcsobbat.xml", name="olcsobbat_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function olcsobbatFeedAction(Request $request)
{
$entityManager = $this->getEntityManager();
$domain = $this->getMultiStoreHelper($request)->getDomain();
$translator = $this->getDatabaseTranslator($request);
$xml = '<?xml version="1.0" encoding="UTF-8" ?>
<catalog>';
$products = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
WHERE p.archived = 0
AND (p.available > 0 OR p.outOfStockStatus = " . Product::OutOfStockStatus_VisibleShadow . ") AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id NOT IN (70,71)")
->getResult();
foreach ($products as $product) {
$product_meta = $product->getDomainMeta($domain);
if ($product_meta === false) {
continue;
}
if (!$product->isAvailable()
|| !$product_meta->isActive()
|| !$product_meta->isListed()
|| !$product_meta->isReady()
|| $product->getDescription() == '') {
continue;
}
$product_meta = $product->getDomainMeta($domain);
$price = $product_meta->isDiscounted() ? $product_meta->getDomainVatDiscount() : $product_meta->getDomainVatPrice();
$imageLinks = [];
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photo = $photos->first();
$imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
$imageLinksString = '';
foreach ($imageLinks as $imageLink) {
if ($imageLinksString == '') {
$imageLinksString .= $imageLink;
}
}
if ($imageLinksString == '') {
continue;
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
$description = $product->getDescription();
if ($description == 'NEW') {
$description = strtolower($description);
}
$xml .= '<product>
<id>' . $product->getCode() . '</id>
<manufacturer><![CDATA[' . str_replace('&', 'and', $product->getVendor()->getName()) . ']]></manufacturer>
<name><![CDATA[' . $product->getName() . ']]></name>
<grossprice>' . str_replace(' ', '', $price) . '</grossprice>
<grosspricecarriage>' . str_replace(' ', '', $price) . '</grosspricecarriage>
<deliveryprice>0</deliveryprice>
<deliverytime>2</deliverytime>
<warranty>24</warranty>
<stock>' . $product->getAvailable() . '</stock>
<urlsite><![CDATA[https://www.furbify.hu/' . $link . ']]></urlsite>
<urlpicture>' . $imageLinksString . '</urlpicture>
<describe><![CDATA[' . strip_tags($description) . ']]></describe>
<category><![CDATA[' . $category . ']]></category>
</product>';
}
$xml .= '</catalog>';
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/argep.xml", name="argep_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function argepFeedAction(Request $request)
{
$entityManager = $this->getEntityManager();
$domain = $entityManager->getRepository(Domain::class)->findOneById(3);
$translator = $this->getDatabaseTranslator($request);
$products = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82")
->getResult();
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><termeklista></termeklista>');
/**
* @var Product $p
* @var Photo $photo
*/
foreach ($products as $product) {
$pm = $product->getDomainMeta($domain);
if (!$pm->isActive() || !$pm->isReady()) {
continue;
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = ($this->getSeoUrlHelper($request))->slug($linkRaw);
$imageLink = '';
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
foreach ($photos as $photo) {
if ($imageLink != '') {
continue;
}
$imageLink = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
}
if ($imageLink == '') {
continue;
}
$price = $pm->isDiscounted() ? $pm->getDomainVatDiscount() : $pm->getDomainVatPrice();
$delivery_time = '2-3 nap';
$xmlNode = $xml->addChild('termek');
$xmlNode->addChild('cikkszam', $product->getCode());
$xmlNode->addChild('nev', htmlspecialchars($product->getFullTitle($translator)));
$xmlNode->addChild('leiras', htmlspecialchars(strip_tags($product->getDescription())));
$xmlNode->addChild('ar', number_format($price, 0, '', ''));
$xmlNode->addChild('fotolink', $imageLink);
$xmlNode->addChild('termeklink', 'https://www.furbify.hu/' . $link);
$xmlNode->addChild('ido', $delivery_time);
$xmlNode->addChild('szallitas', 0);
}
$fileData = $xml->asXML();
$response = new Response($fileData);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/arukereso.xml", name="arukereso_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function arukeresoFeedAction(Request $request): Response
{
$entityManager = $this->getEntityManager();
$domain = $entityManager->getRepository(Domain::class)->findOneById(Domain::DOMAIN_ID_RT_HU);
$translator = $this->getDatabaseTranslator($request);
$seoUrlHelper = $this->getSeoUrlHelper($request);
$products = $entityManager->createQuery("SELECT p, pt, v, a, pm
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
LEFT JOIN p.vendor v
LEFT JOIN p.album a
JOIN p.metas pm WITH pm.domain = :domain
WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82
AND pm.active = true
AND (pm.price > 0 OR pm.discount > 0)")
->setParameter('domain', $domain)
->getResult();
// Prefetch spec attribute options (avoids N+1 lazy loads in the loop below).
// Filters mirror the main query so this only touches the same product set.
$entityManager->createQuery("SELECT p, pa, o, oa
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
JOIN p.metas pm WITH pm.domain = :domain
LEFT JOIN p.productAttributes pa
LEFT JOIN pa.option o
LEFT JOIN o.attribute oa
WHERE p.available > 0 AND p.qualityStatus = " . Product::QualityStatus_New . " AND pt.id != 82
AND pm.active = true
AND (pm.price > 0 OR pm.discount > 0)")
->setParameter('domain', $domain)
->getResult();
// Photos fetched separately (not joined) to avoid multiplying product/type/vendor/album
// columns across the network for every photo row; grouped + pre-sorted by album id.
$albumIds = [];
foreach ($products as $product) {
if ($product->getAlbum()) {
$albumIds[] = $product->getAlbum()->getId();
}
}
$photosByAlbumId = [];
if ($albumIds !== []) {
$photoResults = $entityManager->createQuery("SELECT ph
FROM AtechNetCoreBundle:Photo ph
WHERE ph.album IN (:albumIds)
ORDER BY ph.sortIndex ASC")
->setParameter('albumIds', array_unique($albumIds))
->getResult();
foreach ($photoResults as $photo) {
$photosByAlbumId[$photo->getAlbum()->getId()][] = $photo;
}
}
// Shipping method is domain-wide, so it is resolved once instead of per product.
$shippingMethod = $entityManager->getRepository(DomainShippingType::class)->findOneBy([
'domain' => $domain,
'type' => DomainShippingType::ShippingType_Carrier_Id,
'activeOnWeb' => true,
]);
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><Products></Products>');
foreach ($products as $product) {
$productMeta = $product->getDomainMeta($domain);
if (!$productMeta->isActive() || !$productMeta->isReady()) {
continue;
}
$imageLink = '';
$photos = $photosByAlbumId[$product->getAlbum()?->getId()] ?? [];
if (count($photos) > 0) {
$imageLink = $this->getImage(reset($photos), 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
if ($imageLink == '') {
continue;
}
$price = $productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice();
$netPrice = $productMeta->isDiscounted() ? $productMeta->getDomainDiscount() : $productMeta->getDomainPrice();
$exp_name = explode(' ', $product->getFullTitle($translator));
$categorytext = trim($product->getType()->getTitle());
switch (strtolower($categorytext)) {
case 'software':
if (in_array('Office', $exp_name)) {
$categorytext = 'Számítógép > Irodai programok > Microsoft Irodai programok';
}
if (in_array('Windows', $exp_name)) {
$categorytext = 'Számítógép > Operációs rendszer > Microsoft Operációs rendszer';
}
if (in_array('ESET', $exp_name)) {
$categorytext = 'Számítógép > Vírusirtó';
}
break;
case 'notebook':
$categorytext = 'Számítógép > Notebook';
break;
case 'monitor':
$categorytext = 'Számítógép > Monitor';
break;
case 'pc':
if (in_array('GAMER', $exp_name)) {
$categorytext = 'Számítógép > Számítógép konfiguráció';
} else {
$categorytext = 'Számítógép';
}
break;
case 'tablet':
$categorytext = 'Számítógép > Tablet PC';
break;
case 'mouse':
$categorytext = 'Számítógép > Egér';
break;
case 'keyboard':
$categorytext = 'Számítógép > Billentyűzet';
break;
case 'interactive accessory':
case 'cable data':
case 'card reader':
case 'usb wifi':
$categorytext = 'Számítógép > Kábel, csatlakozó';
break;
case 'power bank':
$categorytext = 'Műszaki cikk > Power bank, külső akkumulátor';
break;
case 'headphones':
$categorytext = 'Műszaki cikk > Fülhallgató, fejhallgató';
break;
case 'pc accessory':
$categorytext = 'Számítógép > Kábel, csatlakozó';
break;
case 'toner':
$categorytext = 'Számítógép > Nyomtató patron, toner';
break;
case 'notebook battery':
$categorytext = 'Számítógép > Laptop akkumulátor';
break;
case 'ssd':
$categorytext = 'Számítógép > SSD meghajtó';
break;
case 'all in one':
$categorytext = 'Számítógép > Számítógép konfiguráció';
break;
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = 'https://www.furbify.hu/' . $seoUrlHelper->slug($linkRaw);
$xmlNode = $xml->addChild('product');
$xmlNode->addChild('Identifier', $product->getId());
$xmlNode->addChild('EanCode', $product->getEan());
$xmlNode->addChild('Manufacturer', str_replace('&', 'and', $product->getVendor()->getName()));
$xmlNode->addChild('Name', htmlspecialchars($product->getFullTitle($translator)));
$xmlNode->addChild('Price', number_format($price, 0, '', ''));
$xmlNode->addChild('NetPrice', number_format($netPrice, 0, '', ''));
$xmlNode->addChild('DeliveryTime', 1);
$xmlNode->addChild('ProductUrl', $link);
$xmlNode->addChild('ImageUrl', $imageLink);
$xmlNode->addChild('Description', htmlspecialchars(strip_tags($product->getDescription())));
$xmlNode->addChild('Category', $categorytext);
// Determine Delivery Cost
if ($shippingMethod) {
if ($shippingMethod->getFreeShipLimit() > 0 && $price > $shippingMethod->getFreeShipLimit()) {
$xmlNode->addChild('DeliveryCost', 'FREE');
} else {
$xmlNode->addChild('DeliveryCost', number_format($shippingMethod->getPrice(), 0, '', ''));
}
}
if ($product->getSpecificationProductAttributeOptions()) {
$attributes = [];
foreach ($product->getSpecificationProductAttributeOptions() as $attributeOption) {
$option = $attributeOption->getOption();
$attributeId = $option->getAttribute()->getId();
// Skip OS & Quality
if ($attributeId == 41 || $attributeId == 101) {
continue;
}
if (!isset($attributes[$attributeId])) {
$attributes[$attributeId] = [
'title' => $option->getAttribute()->getTitle($translator),
'options' => [],
];
}
$title = $option->getLongTitle($translator);
if (empty($title)) {
$title = $option->getTitle($translator);
}
$attributes[$attributeId]['options'][$attributeOption->getId()] = [
'title' => $title,
'multiplier' => $attributeOption->getMultiplier(),
];
}
if (!empty($attributes)) {
$xmlAttributesNode = $xmlNode->addChild('Attributes');
foreach ($attributes as $attribute) {
$xmlAttributeNode = $xmlAttributesNode->addChild('Attribute');
$xmlAttributeNode->addChild('Attribute_name', $attribute['title']);
$attributeValue = '';
foreach ($attribute['options'] as $option) {
$attributeValue .= ($attributeValue != '' ? ', ' : '') . ($option['multiplier'] > 0 ? $option['multiplier'] . ' x ' : '') . $option['title'];
}
$xmlAttributeNode->addChild('Attribute_value', $attributeValue);
}
}
}
}
$fileData = $xml->asXML();
$response = new Response($fileData);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/{type}/active-campaign.xml", name="active_campaign_feed")
* @param Request $request
* @param $type
* @return Response
* @throws Exception
*/
public function activeCampaignFeedAction(Request $request, $type)
{
$entityManager = $this->getEntityManager();
$multistore = $this->getMultiStoreHelper($request);
$seoUrl = $this->getSeoUrlHelper($request);
$language = strtolower($multistore->getDefaultLanguage()->getCode());
// Domain TLD
$domainTLD = $language;
if ($domainTLD == 'en') {
$domainTLD = 'eu';
}
// Determine Domain ID
$domainId = 0;
$digits = 2;
if ($type == 'wholesale') {
switch ($language) {
case 'sk':
$domainId = Domain::DOMAIN_ID_WS_SK;
$digits = 2;
break;
case 'hu':
$domainId = Domain::DOMAIN_ID_WS_HU;
$digits = 0;
break;
case 'cz':
$domainId = Domain::DOMAIN_ID_WS_CZ;
$digits = 2;
break;
}
} elseif ($type == 'retail') {
switch ($language) {
case 'sk':
$domainId = Domain::DOMAIN_ID_RT_SK;
$digits = 2;
break;
case 'hu':
$domainId = Domain::DOMAIN_ID_RT_HU;
$digits = 0;
break;
case 'cz':
$domainId = Domain::DOMAIN_ID_RT_CZ;
$digits = 2;
break;
}
}
if ($domainId == 0) {
return new Response('Feed not found! :(');
}
$domain = $entityManager->getRepository(Domain::class)->findOneById($domainId);
$translator = $this->getDatabaseTranslator($request);
// TypeId => productCount
$productTypeListForActiveCampaignRSS = [
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 1,
ProductType::PRODUCT_TYPE_ID_PC => 1,
ProductType::PRODUCT_TYPE_ID_MONITOR => 1,
ProductType::PRODUCT_TYPE_ID_TABLET => 1,
];
$productList = [];
foreach ($productTypeListForActiveCampaignRSS as $productTypeId => $count) {
$productListToAdd = $entityManager->createQuery(
"SELECT p FROM AtechNetCoreBundle:Product p
LEFT JOIN p.metas pm
LEFT JOIN p.type pt
WHERE
p.available > 0 AND
pm.product = p AND pm.domain = :domainId AND
pm.discount > 0 AND
pm.discounted = 1 AND
pm.active = 1 AND
pm.listed = 1 AND
pm.orderable = 1 AND
pt.id = $productTypeId
AND p.qualityStatus != :qualityBazar
ORDER BY p.soldDuringTimeFrame DESC, pm.discount ASC")
->setParameters([
'domainId' => $domainId,
'qualityBazar' => Product::QualityStatus_Bazaar,
])
->setMaxResults($count)
->getResult()
;
$productList = array_merge([], $productList, $productListToAdd);
}
if ($language == 'hu') {
$oldPriceTxt = 'Eredeti ár:';
} else {
$oldPriceTxt = 'Pôvodná cena:';
}
$rss = '<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">';
foreach ($productList as $dp) {
$category = $dp->getType()->getTitle($translator);
$vendor = $dp->getVendor()->getName() != 'VARIOUS' ? $dp->getVendor()->getName() : '';
$productName = $dp->getName();
$productCode = $dp->getCode();
$partnerLoginParameter = $type == 'wholesale' ? '?partner-link=1' : '';
$linkRaw = $category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode;
$link = 'https://www.furbify.' . $domainTLD . '/' . $seoUrl->slug($linkRaw) . $partnerLoginParameter;
$imageLink = '';
$photos = $dp->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos);
foreach ($photos as $photo) {
if ($imageLink != '') {
continue;
}
$imageLink = $this->getImage($photo, 'product/' . $dp->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
}
if ($imageLink == '') {
continue;
}
$productMeta = $dp->getDomainMeta($domain);
if ($dp->getAlbum()->getPhotos()->count() > 0) {
$rss .= '<channel>
<title>' . str_replace('&', '+', $dp->getName()) . '</title>
<link>' . $link . '</link>
<description>' . $dp->getDescription() . '</description>
<item>
<title>' . str_replace('&', '+', $dp->getVendor()->getName() . ' ' . $dp->getName()) . '</title>
<full_title>' . str_replace('&', '+', $dp->getVendor()->getName() . ' ' . $dp->getName()) . '</full_title>
<link>' . $link . '</link>
<description>' . $dp->getDescription() . '</description>
<price>' . number_format($domain->createVatPrice($productMeta->getDiscount()), $digits, '.', ' ') . ' ' . $domain->getCurrency() . '</price>
<old_price>' . $oldPriceTxt . ' ' . number_format($domain->createVatPrice($productMeta->getPrice()), $digits, '.', ' ') . ' ' . $domain->getCurrency() . '</old_price>
<image>
<url>' . $imageLink . '</url>
</image>
</item>
</channel>';
}
}
$rss .= '</rss>';
$response = new Response($rss);
$response->headers->set('Content-Type', 'rss+xml;charset=utf-8');
return $response;
}
/**
* @Route("/klaviyo.xml", name="klaviyo_feed")
* @param Request $request
*
* @return Response
*/
public function klaviyoFeedAction(Request $request): Response
{
$products = $this->getEntityManager()->getRepository(Product::class)->createQueryBuilder('p')
->select(
'p.id',
'p.name',
'p.code',
'p.cacheDescription AS description',
't.title AS type',
'v.name AS vendor',
"CONCAT(t.title, ',', v.name) AS categories",
)
->innerJoin('p.type', 't')
->innerJoin('p.vendor', 'v')
->where('p.available > 0')
->andWhere('p.inStock > 0')
->andWhere('p.archived = 0')
->andWhere('p.qualityStatus != :qualityBazar')
->setParameter('qualityBazar', Product::QualityStatus_Bazaar)
->andWhere('p.type in (:type)')
->setParameter('type', ProductType::getMainProductTypeIds())
->getQuery()->getResult();
// Create a new DOMDocument
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // Indent and pretty print output
// Root element <Products>
$productsElement = $dom->createElement('Products');
$dom->appendChild($productsElement);
// Add each product
foreach ($products as $product) {
$productElement = $dom->createElement('Product');
foreach ($product as $key => $value) {
$childElement = $dom->createElement($key, htmlspecialchars($value));
$productElement->appendChild($childElement);
}
$productsElement->appendChild($productElement);
}
// Convert DOM to XML string
$xmlContent = $dom->saveXML();
return new Response($xmlContent, 200, [
'Content-Type' => 'application/xml',
]);
}
/**
* @Route("/pricemania.xml", name="pricemania_feed")
* @param Request $request
* @return Response
*/
public function pricemaniaFeedAction(Request $request): Response
{
// Entity Manager
$entityManager = $this->getEntityManager();
// Multi-store
$multistore = $this->getMultiStoreHelper($request);
// Domain
$domain = $multistore->getDomain();
// Translator
$translator = $this->getDatabaseTranslator($request);
// Products
$products = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
WHERE p.archived = 0 AND p.available > 0 AND p.qualityStatus != " . Product::QualityStatus_New)
->getResult();
// XML
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><products></products>');
// Insert Products to XML
foreach ($products as $product) {
// Meta
$productMeta = $product->getDomainMeta($domain);
// Skip Inactive Product
if (!$productMeta->isActive() || !$productMeta->isReady() || !$productMeta->isOrderable()) {
continue;
}
// Category
$categorytext = trim($product->getType()->getTitle());
switch (mb_strtolower($categorytext)) {
case 'notebook':
$categorytext = 'Počítače a kancelária > Notebooky';
break;
case 'monitor':
$categorytext = 'Počítače a kancelária > Monitory';
break;
case 'pc':
case 'pc set':
$categorytext = 'Počítače a kancelária > PC zostavy > Stolné počítače';
break;
case 'all in one':
$categorytext = 'Počítače a kancelária > PC zostavy > All in One počítače';
break;
case 'tablet':
$categorytext = 'Počítače a kancelária > Tablety';
break;
case 'mouse':
$categorytext = 'Počítače a kancelária > Klávesnice a myši > Myši';
break;
case 'keyboard':
$categorytext = 'Počítače a kancelária > Klávesnice a myši > Klávesnice';
break;
case 'interactive accessory':
case 'reduction':
case 'cable video':
case 'cable hdmi':
$categorytext = 'Počítače a kancelária > Káble a konektory > Video káble';
break;
case 'cable data':
case 'pc accessory':
case 'cable usb':
$categorytext = 'Počítače a kancelária > Káble a konektory > PC káble';
break;
case 'power bank':
$categorytext = 'TV, audio, video > Batérie a nabíjačky > Powerbanky';
break;
case 'card reader':
case 'usb card reader':
$categorytext = 'Počítače a kancelária > PC komponenty > Čítačky pamäťových kariet';
break;
case 'headphones':
case 'headset':
$categorytext = 'TV, audio, video > Audio > Slúchadlá';
break;
case 'toner':
$categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Tonery';
break;
case 'cartridge':
$categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Cartridge';
break;
case 'notebook battery':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Batérie pre notebooky';
break;
case 'ssd':
$categorytext = 'Počítače a kancelária > PC komponenty > Pevné disky';
break;
case 'hdd 3,5"':
case 'hdd 2,5"':
$categorytext = 'Počítače a kancelária > PC komponenty > Pevné disky';
break;
case 'motherboard':
$categorytext = 'Počítače a kancelária > PC komponenty > Základné dosky';
break;
case 'webcam':
$categorytext = 'Počítače a kancelária > Webkamery';
break;
case 'ram pc':
case 'ram nb':
$categorytext = 'Počítače a kancelária > PC komponenty > Pamäte RAM';
break;
case 'odd pc':
case 'odd nb':
case 'usb other':
$categorytext = 'Počítače a kancelária > PC komponenty > Mechaniky';
break;
case 'usb wifi':
$categorytext = 'Počítače a kancelária > Sieťové prvky > WiFi adaptéry';
break;
case 'usb bluetooth':
$categorytext = 'Počítače a kancelária > Sieťové prvky > Bluetooth adaptéry';
break;
case 'docking station':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Dokovacie stanice pre notebooky';
break;
case 'notebook display':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky';
break;
case 'vga':
$categorytext = 'Počítače a kancelária > PC komponenty > Grafické karty';
break;
case 'notebook bag':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Tašky a batohy pre notebooky';
break;
case 'cleaning pc/nb':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Čistiace prostriedky a sady pre počítače';
break;
case 'notebook keyboard':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky';
break;
case 'notebook bay':
case 'notebook cooler':
$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';
break;
case 'speaker':
$categorytext = 'TV, audio, video > Audio > Reproduktory a reprosústavy';
break;
case 'hdd adapter':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre pevné disky';
break;
case 'power supply':
$categorytext = 'Počítače a kancelária > PC komponenty > PC zdroje';
break;
case 'battery':
$categorytext = 'TV, audio, video > Batérie a nabíjačky > Alkalické a nabíjacie batérie';
break;
case 'usb hub':
$categorytext = 'Počítače a kancelária > PC komponenty > USB huby';
break;
case 'usb ethernet':
$categorytext = 'Počítače a kancelária > Sieťové prvky > Sieťové karty';
break;
case 'microphone':
$categorytext = 'TV, audio, video > Audio > Mikrofóny';
break;
case 'printer drum':
$categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Spotrebný materiál > Optické valce';
break;
case 'surge arrest':
$categorytext = 'Dom, byt a záhrada > Meracia technika a elektronika > Prepäťové ochrany';
break;
case 'projector':
$categorytext = 'TV, audio, video > Projekčná technika > Projektory';
break;
case 'case pc':
$categorytext = 'Počítače a kancelária > PC komponenty > PC skrinky';
break;
case 'mouse pad':
$categorytext = 'Počítače a kancelária > Klávesnice a myši > Podložky pod myš';
break;
case 'power adapter':
$categorytext = 'Počítače a kancelária > Počítačové príslušenstvo > Príslušenstvo pre notebooky > Napájacie adaptéry pre notebooky';
break;
case 'projector accessory':
$categorytext = 'TV, audio, video > Projekčná technika > Príslušenstvo pre projektory';
break;
case 'cpu':
$categorytext = 'Počítače a kancelária > PC komponenty > Procesory';
break;
case 'sound card':
$categorytext = 'Počítače a kancelária > PC komponenty > Zvukové karty';
break;
case 'pci express card':
$categorytext = 'Počítače a kancelária > PC komponenty > Grafické karty';
break;
case 'printer':
$categorytext = 'Počítače a kancelária > Tlačiarne a multifunkčné zariadenia > Tlačiarne';
break;
case 'microsd card':
$categorytext = 'Počítače a kancelária > PC komponenty > Pamäťové karty';
break;
default:
$categorytext = false;
}
if (!$categorytext) {
continue;
}
// Price
$price = ($productMeta->isDiscounted() ? $productMeta->getDomainVatDiscount() : $productMeta->getDomainVatPrice());
// Link
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productName = $product->getName();
$productCode = $product->getCode();
$link = $domain->getUrl() . '/' . ($this->getSeoUrlHelper($request))->slug(
$category . ' ' . $vendor . ' ' . $productName . ' ' . $productCode
);
// Image
$image = '';
$photos = $product->getAlbum()->getPhotos();
if (count($photos) > 0) {
$photos = Collections::sort($photos, false);
$photo = $photos[array_keys($photos)[0]];
if (is_object($photo)) {
$image = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
}
// Delivery Cost
$deliveryCost = 0;
$shippingMethod = $entityManager->getRepository(DomainShippingType::class)->findOneBy([
'domain' => $domain,
'type' => DomainShippingType::ShippingType_Carrier_Id,
'activeOnWeb' => true,
]);
if ($shippingMethod) {
if ($price > $shippingMethod->getFreeShipLimit()) {
$deliveryCost = 0;
} else {
$deliveryCost = number_format($shippingMethod->getPrice(), 0, '', '');
}
}
// Quality
if (in_array($product->getQualityStatus(), [Product::QualityStatus_Platinum, Product::QualityStatus_Unpacked, Product::QualityStatus_Refurbished_A_Plus])) {
$condition = 'a';
} elseif (in_array($product->getQualityStatus(), [Product::QualityStatus_Gold, Product::QualityStatus_Silver])) {
$condition = 'b';
} else {
$condition = 'c';
}
// Details - Mandatory
$productNode = $xml->addChild('product');
$productNode->addChild('id', $product->getId());
$productNode->addChild('name', htmlspecialchars($product->getFullTitle($translator)));
$productNode->addChild('description', htmlspecialchars(strip_tags($product->getDescription())));
$productNode->addChild('Price', number_format($price, 2, '.', ''));
$productNode->addChild('category', $categorytext);
$productNode->addChild('manufacturer', str_replace('&', 'and', $product->getVendor()->getName()));
$productNode->addChild('url', $link);
$productNode->addChild('picture', $image);
$productNode->addChild('shipping', $deliveryCost);
$productNode->addChild('availability', 1);
$productNode->addChild('product_type', 'refurbished');
$productNode->addChild('condition', $condition);
// Details - Additional
$productNode->addChild('ean', $product->getEan());
// Params
if ($product->getSpecificationProductAttributeOptions()) {
$attributes = [];
foreach ($product->getSpecificationProductAttributeOptions() as $attributeOption) {
$option = $attributeOption->getOption();
$attributeId = $option->getAttribute()->getId();
// Skip OS & Quality
if ($attributeId == 41 || $attributeId == 101) {
continue;
}
if (!isset($attributes[$attributeId])) {
$attributes[$attributeId] = [
'title' => $option->getAttribute()->getTitle($translator),
'options' => [],
];
}
$title = $option->getLongTitle($translator);
if (empty($title)) {
$title = $option->getTitle($translator);
}
$attributes[$attributeId]['options'][$attributeOption->getId()] = [
'title' => $title,
'multiplier' => $attributeOption->getMultiplier(),
];
}
if (!empty($attributes)) {
$attributesNode = $productNode->addChild('params');
foreach ($attributes as $attribute) {
// Param
$attributeNode = $attributesNode->addChild('param');
// Param Name
$attributeNode->addChild('param_name', $attribute['title']);
// Param Values
$attributeValue = '';
foreach ($attribute['options'] as $option) {
$attributeValue .= ($attributeValue != '' ? ', ' : '') . ($option['multiplier'] > 0 ? $option['multiplier'] . ' x ' : '') . $option['title'];
}
$attributeNode->addChild('param_value', $attributeValue);
}
}
}
}
// XML Output
$output = $xml->asXML();
// Response
$response = new Response($output);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/cheapest-products-html", name="cheapest_products_html")
* @param Request $request
* @return Response
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function cheapestProductsHtmlAction(Request $request)
{
$savedToken = '9653g4kg49fk094ut5rk094tk459t4';
if ($savedToken !== $request->query->get('token')) {
throw new AccessDeniedException();
}
$multistore = $this->getMultiStoreHelper($request);
$domain = $multistore->getDomain();
$languageCode = $domain->getLanguage()->getCode();
$currency = $domain->getCurrency();
$cache = $this->cache;
// Domain TLD
$domainTLD = $languageCode;
if ($languageCode == 'en') {
$domainTLD = 'eu';
}
$cacheKey = 'cheapest.product.feed.1.' . $domain->getId();
$cacheItem = $cache->getItem($cacheKey);
if ($languageCode == 'hu') {
$iWantNotebook = 'Laptop érdekel';
$iWantPcSet = 'PC-szett érdekel';
$iWantPc = 'Asztali gép érdekel';
} else {
$iWantNotebook = 'Chcel by som notebook';
$iWantPcSet = 'Chcel by som PC zostavu';
$iWantPc = 'Chcel by som počítač';
}
if ($cacheItem->isHit()) {
$data = $cacheItem->get();
} else {
$entityManager = $this->getEntityManager();
$productHelper = $this->getProductHelper($request);
$cheapestNotebook = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
WHERE p.archived = 0 AND p.type = 52 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
ORDER BY pm.currentVatPrice ASC")
->setParameters([
'domain' => $domain,
])
->setMaxResults(1)
->getResult();
if (count($cheapestNotebook) > 0) {
$cheapestNotebook = $cheapestNotebook[0];
}
$cheapestPcSet = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
WHERE p.archived = 0 AND p.type = 107 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
ORDER BY pm.currentVatPrice ASC")
->setParameters([
'domain' => $domain,
])
->setMaxResults(1)
->getResult();
if (count($cheapestPcSet) > 0) {
$cheapestPcSet = $cheapestPcSet[0];
}
$cheapestPc = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.product = p.id AND pm.domain = :domain
WHERE p.archived = 0 AND p.type = 60 AND p.available > 0 AND pm.active = 1 AND pm.orderable = 1
ORDER BY pm.currentVatPrice ASC")
->setParameters([
'domain' => $domain,
])
->setMaxResults(1)
->getResult();
if (count($cheapestPc) > 0) {
$cheapestPc = $cheapestPc[0];
}
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
$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;">';
if ($cheapestNotebook instanceof Product) {
$notebook = $productHelper->getStructuredDataForProduct($cheapestNotebook);
$notebookImage = $placeholder;
if (is_object($notebook['images'])) {
$notebookImage = $this->getImage($notebook['images']->first(), 'product/' . $notebook['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
}
$notebookPrice = number_format($notebook['isDiscounted'] ? $notebook['discountVatPrice'] : $notebook['vatPrice'], 0, '.', ' ');
$slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'product_id=' . $cheapestNotebook->getId(),
'language' => $domain->getLanguage(),
]);
if ($slug) {
$notebookLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
} else {
$notebookLink = 'https://www.furbify.' . $domainTLD . '/product/' . $notebook['id'];
}
$notebookCategoryLink = $notebookLink;
$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">
<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&utm_medium=cpc">
<img decoding="async" src="' . $notebookImage . '" class="elIMG ximg" alt="' . $notebook['title'] . '" data-imagelink="' . $notebookCategoryLink . '?utm_source=clickfunnels&utm_medium=cpc" tabindex="0">
</div>
<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">
<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&utm_medium=cpc&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>
</div>
<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">
<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">
<div>' . $notebook['shortDescription'] . '</div>
<div><br></div>
</div>
</div>
<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">
<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>
</div>
<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">
<a href="' . $notebookCategoryLink . '?utm_source=clickfunnels&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>
</div>
<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">
<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>
</div>
</div></div>';
}
if ($cheapestPcSet instanceof Product) {
$pcSet = $productHelper->getStructuredDataForProduct($cheapestPcSet);
$pcSetImage = $placeholder;
if (is_object($notebook['images'])) {
$pcSetImage = $this->getImage($pcSet['images']->first(), 'product/' . $pcSet['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
}
$pcSetPrice = number_format($pcSet['isDiscounted'] ? $pcSet['discountVatPrice'] : $pcSet['vatPrice'], 0, '.', ' ');
;
$slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'product_id=' . $cheapestPcSet->getId(),
'language' => $domain->getLanguage(),
]);
if ($slug) {
$pcSetLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
} else {
$pcSetLink = 'https://www.furbify.' . $domainTLD . '/product/' . $pcSet['id'];
}
$pcSetCategoryLink = $pcSetLink;
$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">
<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&utm_medium=cpc">
<img decoding="async" src="' . $pcSetImage . '" class="elIMG ximg" alt="' . $pcSet['title'] . '" data-imagelink="' . $pcSetCategoryLink . '?utm_source=clickfunnels&utm_medium=cpc" tabindex="0">
</div>
<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">
<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&utm_medium=cpc" id="link-39965" class="" target="_parent" rel="noopener noreferrer"></a><a href="' . $pcSetLink . '?utm_source=clickfunnels&utm_medium=cpc&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>
</div>
<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">
<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">
<div>' . $pcSet['shortDescription'] . '</div>
<div><br></div>
</div>
</div>
<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">
<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>
</div>
<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">
<a href="' . $pcSetCategoryLink . '?utm_source=clickfunnels&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>
</div>
</div></div>';
}
if ($cheapestPc instanceof Product) {
$pc = $productHelper->getStructuredDataForProduct($cheapestPc);
$pcImage = $placeholder;
if (is_object($notebook['images'])) {
$pcImage = $this->getImage($pc['images']->first(), 'product/' . $pc['code'], true)->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
}
$pcPrice = number_format($pc['isDiscounted'] ? $pc['discountVatPrice'] : $pc['vatPrice'], 0, '.', ' ');
;
$slug = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'product_id=' . $cheapestPc->getId(),
'language' => $domain->getLanguage(),
]);
if ($slug) {
$pcLink = 'https://www.furbify.' . $domainTLD . '/' . $slug->getKeyword();
} else {
$pcLink = 'https://www.furbify.' . $domainTLD . '/product/' . $pc['id'];
}
$pcCategoryLink = $pcLink;
$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">
<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&utm_medium=cpc">
<img decoding="async" src="' . $pcImage . '" class="elIMG ximg" alt="' . $pc['title'] . '" data-imagelink="' . $pcCategoryLink . '?utm_source=clickfunnels&utm_medium=cpc" tabindex="0">
</div>
<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">
<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&utm_medium=cpc&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>
</div>
<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">
<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">
<div>' . $pc['shortDescription'] . '</div>
<div><br></div>
</div>
</div>
<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">
<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>
</div>
<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">
<a href="' . $pcCategoryLink . 'utm_source=clickfunnels&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>
</div>
</div></div>';
}
$data .= '</div>';
$cacheItem->set($data);
$cacheItem->expiresAfter(self::CACHE_LIFETIME_1_HOUR);
$cache->save($cacheItem);
}
return new Response($data, 200, [
'Access-Control-Allow-Origin' => '*',
]);
}
/**
* @Route("/set-cookies", name="set_cookies")
* @param Request $request
* @return JsonResponse
*/
public function setCookiesAction(Request $request)
{
$cookieConsent = [];
$userCookieSettings = $request->request->get('cookieConsent');
//> Google Tag Manager
// Cookie Name
$gtmCookieName = 'frb_gtm_cookie_consent';
// Cookie Value
$gtmCookieValue = '';
// Necessary Cookies
$cookieConsent['acceptNecessaryCookies'] = true;
// Statistical Cookies
if ( isset($userCookieSettings['statistical']) && $userCookieSettings['statistical'] == 'granted' ) {
$cookieConsent['acceptStatisticalCookies'] = true;
$gtmCookieValue = 'analyticsConsentGranted';
}
// Marketing Cookies
if ( isset($userCookieSettings['marketing']) && $userCookieSettings['marketing'] == 'granted' ) {
$cookieConsent['acceptMarketingCookies'] = true;
$gtmCookieValue .= ( !empty($gtmCookieValue) ? ',' : '' ) . 'adConsentGranted';
}
// Save Cookie
setcookie($gtmCookieName, $gtmCookieValue, time() + ( 60 * 60 * 24 * 30 * 6 ));
//< Google Tag Manager
// All Cookies Accepted
if ( count($cookieConsent) == 3 ) {
$json['accept'] = true;
setcookie('frb_cookie_consent', 'all', time() + ( 60 * 60 * 24 * 30 * 6 ));
}
// Selected Cookies Accepted
elseif ( count($cookieConsent) > 1 ) {
$json['custom'] = $cookieConsent;
setcookie('frb_cookie_consent', implode(',', array_keys($cookieConsent)), time() + ( 60 * 60 * 24 * 30 * 6 ));
}
// All Cookies Declined
else {
$json['decline'] = true;
setcookie('frb_cookie_consent', 'decline', time() + ( 60 * 60 * 24 * 30 ));
}
return new JsonResponse($json);
}
/**
* @return array
*/
protected function getCookieChoices(): array
{
return [
'read-cookies-consent',
];
}
/**
* @Route("/survey/save-answer", name="survey_save_answer")
* @param Request $request
* @return JsonResponse
*/
public function saveSurveyAnswerAction(Request $request)
{
$req = $request->request;
$questionId = $req->get('questionId');
$questionType = $req->get('questionType');
$wasLastQuestion = $req->get('wasLastQuestion');
$answers = $req->get('answers');
$orderId = $req->get('orderId');
$question = false;
$order = false;
$entityManager = $this->getEntityManager();
if (!is_numeric($questionId) || !is_numeric($questionType) || !is_numeric($wasLastQuestion) || !is_numeric($orderId)) {
$data = [
'result' => 'failed',
];
} else {
foreach ($answers as $answer) {
$surveyOptionAnswer = null;
$surveyTextAnswer = null;
if (!$question) {
$question = $entityManager->getRepository(SurveyQuestion::class)->findOneById($questionId);
}
if (!$order) {
$order = $entityManager->getRepository(Order::class)->findOneById($orderId);
}
if (in_array($questionType, [SurveyQuestion::TYPE_OPTIONS, SurveyQuestion::TYPE_CHECKBOXES])) {
if ($questionType == SurveyQuestion::TYPE_OPTIONS) {
$surveyOptionAnswer = $entityManager->getRepository(SurveyQuestionOption::class)->findOneById($answer);
}
if ($questionType == SurveyQuestion::TYPE_CHECKBOXES) {
$questionData = $this->getQuestionData($answer);
$surveyOptionAnswer = $entityManager->getRepository(SurveyQuestionOption::class)->findOneById($questionData['optionId']);
}
} else {
$surveyTextAnswer = $answer;
}
$this->createSurveyAnswer($question, $order, $surveyOptionAnswer, $surveyTextAnswer);
}
$this->getEntityManager()->flush();
$data = [
'result' => 'success',
];
}
return new JsonResponse($data);
}
/**
* @param $string
* @return array
*/
private function getQuestionData($string)
{
$data = explode('_', str_replace('answer_', '', $string));
$responseArray = [
'questionId' => false,
'optionId' => false,
];
if (isset($data[0])) {
$responseArray['questionId'] = $data[0];
}
if (isset($data[1])) {
$responseArray['optionId'] = $data[1];
}
return $responseArray;
}
/**
* @param SurveyQuestion $question
* @param Order|null $order
* @param SurveyQuestionOption|null $surveyQuestionOption
* @param null $textAnswer
* @return bool
*/
private function createSurveyAnswer(SurveyQuestion $question, Order $order = null, SurveyQuestionOption $surveyQuestionOption = null, $textAnswer = null)
{
$surveyAnswer = new SurveyAnswer();
$surveyAnswer->setQuestion($question);
if (!is_null($order)) {
$surveyAnswer->setOrder($order);
}
if (!is_null($surveyQuestionOption)) {
$surveyAnswer->setOptionAnswer($surveyQuestionOption);
}
if (!is_null($textAnswer)) {
$surveyAnswer->setTextAnswer(TextHelper::removeSymbols($textAnswer));
}
$this->getEntityManager()->persist($surveyAnswer);
return true;
}
/**
* @Route("/unbox", name="post_order_survey_gate")
* @param Request $request
* @param $orderId
* @param $token
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*/
public function postOrderSurveyGateAction(Request $request)
{
$req = $request->request;
$data = [];
$data['orderId'] = '';
$data['customerEmail'] = '';
$data['showError'] = $alreadyRegistered = false;
$multistoreHelper = $this->getMultiStoreHelper($request);
$entityManager = $this->getEntityManager();
$domain = $multistoreHelper->getDomain();
if ($domain->getLanguage()->getId() == Language::LANGUAGE_ID_CZ) {
return $this->redirectToRoute('review_list');
}
$data['domainId'] = $domain->getId();
if (
!is_null($req->get('customerEmail')) &&
$req->get('customerEmail') != '' &&
!is_null($req->get('orderId')) &&
$req->get('orderId') != '' &&
is_numeric($req->get('orderId'))
) {
$data['orderId'] = $orderId = $request->get('orderId');
$data['customerEmail'] = $customerEmail = $request->get('customerEmail');
$orders = $entityManager->createQuery(
"SELECT o
FROM AtechNetCoreBundle:Order o
LEFT JOIN o.documents d
WHERE o.billingEmail = :customerEmail
AND (o.id = :orderId OR d.code = :orderId)
AND o.domain = :domain
AND o.status = :status"
)
->setParameters([
'customerEmail' => $customerEmail,
'orderId' => $orderId,
'domain' => $domain,
'status' => Order::STATUS_FINISHED,
])
->setMaxResults(1)
->getResult();
if (isset($orders[0])) {
$order = $orders[0];
$alreadyRegistered = $entityManager->createQuery(
"SELECT r
FROM AtechNetCoreBundle:Review r
WHERE IDENTITY(r.order) = :orderId AND IDENTITY(r.customer) = :customerId"
)
->setParameters([
'orderId' => $order->getId(),
'customerId' => $order->getCustomer()->getId(),
])
->getResult();
if (!$alreadyRegistered) {
return $this->redirectToRoute(
'post_order_survey',
[
'orderId' => $order->getId(),
'token' => $this->getOrderPrivateKey($order),
]
);
}
}
$data['showError'] = $alreadyRegistered ? 'This order has been already registered!' : 'We could not find a matching order!';
}
$staticPageId = 0;
switch ($domain->getLanguage()->getCode()) {
case 'sk':
$data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
$data['companyLine2'] = '44827385';
$data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
$data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
$staticPageId = 138;
break;
case 'hu':
$data['companyLine1'] = 'Kelemen László utca 1, 2900 Komárom, Magyarország';
$data['companyLine2'] = '11-09-030312';
$data['rulesLink'] = 'https://www.furbify.hu/ertekeloi-nyeremenyjatek-2020-szabalyzat';
$data['privacyLink'] = 'https://www.furbify.hu/adatkezelesi-tajekoztato';
$staticPageId = 137;
break;
case 'cz':
$data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
$data['companyLine2'] = '44827385';
$data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
$data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
$staticPageId = 139;
break;
}
$termsPageLink = $entityManager->createQuery(
"SELECT pm.link
FROM AtechNetCoreBundle:PageMeta pm
WHERE IDENTITY(pm.staticPage) = :staticPageId"
)
->setParameters([
'staticPageId' => $staticPageId,
])
->getOneOrNullResult();
$data['termsPageLink'] = $termsPageLink ? $termsPageLink['link'] : null;
return $this->render('AtechNetCoreBundle/Survey/PostOrderSurveyGate.html.twig', $data);
}
/**
* @Route("/post-order-survey/{orderId}/{token}", name="post_order_survey")
* @param Request $request
* @param $orderId
* @param $token
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*/
public function postOrderSurveyAction(Request $request, $orderId, $token)
{
/**
* @var Product $product
* @var Order $order
*/
$data = [];
$inputParametersPassed = true;
if (!is_numeric($orderId)) {
$inputParametersPassed = false;
}
$order = $this->getEntityManager()->getRepository(Order::class)->findOneById($orderId);
if (!$order) {
$inputParametersPassed = false;
}
if ($this->getOrderPrivateKey($order) !== $token) {
$inputParametersPassed = false;
}
$alreadyRegistered = $this->getEntityManager()->createQuery(
"SELECT r
FROM AtechNetCoreBundle:Review r
WHERE IDENTITY(r.order) = :orderId AND IDENTITY(r.customer) = :customerId"
)
->setParameters([
'orderId' => $order->getId(),
'customerId' => $order->getCustomer()->getId(),
])
->getResult();
if (!$inputParametersPassed || $alreadyRegistered) {
return $this->redirectToRoute('not_found');
}
$req = $request->request;
$data['surveySubmited'] = false;
$data['domainId'] = $order->getDomain()->getId();
if (!is_null($req->get('orderId')) && $req->get('orderId') == $order->getId()) {
$name = $order->getBillingFirstName();
$language = $order->getDomain()->getLanguage();
$customer = $order->getCustomer();
$entityManager = $this->getEntityManager();
$addedSurveyMedias = [];
$addedReviews = [];
$files = $request->files->get('reviewImages');
$subDirectory = 'survey-images';
$fileCount = 0;
foreach ($files as $file) {
$response = $this->uploadFile($file, $subDirectory, ['image/jpeg', 'image/jpg', 'image/png']);
if ($response && $fileCount < 3) {
$surveyMedia = new SurveyMedia();
$surveyMedia->setOrder($order);
$surveyMedia->setDomain($order->getDomain());
$surveyMedia->setFilename($response['filename']);
$surveyMedia->setDirectory('uploads/' . $subDirectory);
$surveyMedia->setMimeType($response['mimeType']);
$entityManager->persist($surveyMedia);
$addedSurveyMedias[] = $surveyMedia;
$fileCount++;
}
}
$siteRating = $req->get('text-review');
if (trim($siteRating) != '') {
$sa = new SurveyAnswer();
switch ($order->getDomain()->getId()) {
case 1:
$questionId = 13;
break;
case 3:
$questionId = 14;
break;
default:
$questionId = 13;
}
$surveyQuestion = $entityManager->getRepository(SurveyQuestion::class)->findOneById($questionId);
$sa->setOrder($order);
$sa->setTextAnswer($this->getTextWithoutEmoji($siteRating));
$sa->setQuestion($surveyQuestion);
$entityManager->persist($sa);
}
$productRatings = $req->get('ratings');
foreach ($productRatings as $productid => $stars) {
if (in_array($productid, [82, 10427])) { // Exclode Shipping / Coupon
continue;
}
$product = $entityManager->getRepository(Product::class)->findOneById($productid);
if ($product) {
$pr = new Review();
$pr->setType(Review::TYPE_PRODUCT);
$pr->setProduct($product);
$pr->setApproved(false);
$pr->setLanguage($language);
$pr->setName($name);
$pr->setStars($stars);
if (trim($siteRating) != '') {
$pr->setText($this->getTextWithoutEmoji($siteRating));
}
if ($customer) {
$pr->setCustomer($customer);
}
$pr->setOrder($order);
$entityManager->persist($pr);
$addedReviews[] = $pr;
}
}
$entityManager->flush();
$centralisUser = $entityManager->getRepository(User::class)->findOneById(40);
foreach ($addedReviews as $pr) {
foreach ($addedSurveyMedias as $surveyMedia) {
$rsm = new ReviewSurveyMedia();
$rsm->setReview($pr);
$rsm->setSurveyMedia($surveyMedia);
$rsm->setApproved(false);
$rsm->setCreatedBy($centralisUser);
$entityManager->persist($rsm);
}
}
$entityManager->flush();
$data['surveySubmited'] = true;
}
$multiStoreHelper = $this->getMultiStoreHelper($request);
$domain = $multiStoreHelper->getDomain();
$data['orderId'] = $orderId;
$data['orderCreated'] = $order->getCreated()->format('Y.m.d, H:i');
switch ($domain->getLanguage()->getCode()) {
case 'sk':
$data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
$data['companyLine2'] = '44827385';
$data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
$data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
break;
case 'hu':
$data['companyLine1'] = 'Furbify Hungary Kft., Kelemen László utca 1, 2900 Komárom, Magyarország';
$data['companyLine2'] = '11-09-030312';
$data['rulesLink'] = 'https://www.furbify.hu/ertekeloi-nyeremenyjatek-2020-szabalyzat';
$data['privacyLink'] = 'https://www.furbify.hu/adatkezelesi-tajekoztato';
break;
case 'cz':
$data['companyLine1'] = 'furbify s.r.o., Osada Reviczkého 3869/38, 946 03 Kolárovo, Slovenská republika';
$data['companyLine2'] = '44827385';
$data['rulesLink'] = 'https://www.furbify.sk/pravidla-sutaze-zakaznikov-2020';
$data['privacyLink'] = 'https://www.furbify.sk/informacie-o-ochrane-osobnych-udajov';
break;
}
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_VIEW_POPUP_WIDTH, Image::PRODUCT_VIEW_POPUP_HEIGHT);
$data['products'] = [];
foreach ($order->getOrderItems() as $oi) {
$product = $oi->getProduct();
if ($product->getAlbum()->getPhotos()->first()) {
$image = $this->getImage($product->getAlbum()->getPhotos()->first(), 'product/' . $product->getCode())->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
} else {
$image = $placeholder;
}
$data['products'][$product->getId()] = [
'id' => $product->getId(),
'title' => $product->getVendor()->getName() . ' ' . $product->getName(),
'image' => $image,
];
}
return $this->render('AtechNetCoreBundle/Survey/PostOrderSurvey.html.twig', $data);
}
/**
* @param Domain $domain
* @return array|null
*/
private function getHeaderBanner(Domain $domain): ?array
{
/**
* @var Banner $banner
*/
$banner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
'domain' => $domain,
'type' => Banner::BANNER_MAIN_TYPE,
]);
if (!$banner || $banner->getBannerItems()->count() < 1) {
return null;
}
$iterator = $banner->getBannerItems()->getIterator();
// Sort by sortIndex values
$iterator->uasort(function ($a, $b) {
return ($a->getSortIndex() < $b->getSortIndex()) ? -1 : 1;
});
$bannerItemCollection = new ArrayCollection(iterator_to_array($iterator));
$bannerItems = $gtagEventItems = [];
/**
* @var BannerItem $bannerItem
*/
foreach ($bannerItemCollection as $bannerItem) {
if ($bannerItem->getStartDate() != null && date_time_set($bannerItem->getStartDate(), 0, 0, 0, 1) > (new DateTime('now'))) {
continue;
}
if ($bannerItem->getEndDate() != null && date_time_set($bannerItem->getEndDate(), 23, 59, 59, 59) < (new DateTime('now'))) {
continue;
}
if ($bannerItem->getFilename() == '' || $bannerItem->getFilename() == null) {
continue;
}
$fileNames = [
'filename' => $bannerItem->getFilename(),
'originalName' => $bannerItem->getOriginalName(),
];
$bannerItems[] = [
'image' => $this->getImage($fileNames, BannerItem::BANNER_DIRECTORY)->resize(Image::BANNER_DESKTOP_WIDTH, Image::BANNER_DESKTOP_HEIGHT),
'link' => $bannerItem->getLink(),
'parentId' => $banner->getId(),
'itemId' => $bannerItem->getId(),
];
$gtagEventItems[] = [
'item_id' => "{$banner->getId()}_{$bannerItem->getId()}",
'item_name' => $bannerItem->getLink(),
'index' => $bannerItem->getSortIndex(),
'promotion_id' => "{$banner->getId()}_{$bannerItem->getId()}",
'promotion_name' => $bannerItem->getLink(),
];
}
return [
'interval' => $banner->getCountDown(),
'items' => $bannerItems,
'gtagEventItems' => $gtagEventItems,
];
}
private function getSmallBanners(Domain $domain)
{
/**
* @var $upperBanner Banner
* @var $lowerBanner Banner
*/
$upperBanner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
'domain' => $domain,
'type' => Banner::BANNER_SMALL_UPPER_TYPE,
]);
$lowerBanner = $this->getEntityManager()->getRepository(Banner::class)->findOneBy([
'domain' => $domain,
'type' => Banner::BANNER_SMALL_LOWER_TYPE,
]);
$upperBannerItems = $upperBanner->getBannerItems()->getValues();
$lowerBannerItems = $lowerBanner->getBannerItems()->getValues();
usort($upperBannerItems, function ($a, $b) {
return $a->getSortIndex() <=> $b->getSortIndex();
});
$upperBannerItems = array_filter($upperBannerItems, function ($item) {
$now = new DateTime('now');
$startDate = $item->getStartDate();
$endDate = $item->getEndDate();
return (!$startDate || $startDate <= $now) && (!$endDate || date_time_set($endDate, 23, 59, 59) >= $now);
});
usort($lowerBannerItems, function ($a, $b) {
return $a->getSortIndex() <=> $b->getSortIndex();
});
$lowerBannerItems = array_filter($lowerBannerItems, function ($item) {
$now = new DateTime('now');
$startDate = $item->getStartDate();
$endDate = $item->getEndDate();
return (!$startDate || $startDate <= $now) && (!$endDate || date_time_set($endDate, 23, 59, 59) >= $now);
});
$fileNames = [];
$data = [
'upper' => [
'display' => $upperBanner->getDisplayType(),
],
'lower' => [
'display' => $lowerBanner->getDisplayType(),
],
];
if (count($upperBannerItems) > 0) {
/**
* @var $upperBannerItem BannerItem
*/
$upperBannerItem = $upperBannerItems[array_key_first($upperBannerItems)];
$fileNames['upper'] = [
'filename' => $upperBannerItem->getFilename(),
'originalName' => $upperBannerItem->getOriginalName(),
];
if ($upperBanner->getDisplayType() == Banner::BANNER_DISPLAY_TYPE_BANNER) {
$data['upper'] = [
'image' => $this->getImage($fileNames['upper'], BannerItem::BANNER_DIRECTORY)->resize(Image::SMALL_BANNER_DESKTOP_WIDTH, Image::SMALL_BANNER_DESKTOP_HEIGHT),
'link' => $upperBannerItem->getLink(),
'title' => $upperBannerItem->getOriginalName(),
];
}
}
if (count($lowerBannerItems) > 0) {
/**
* @var $lowerBannerItem BannerItem
*/
$lowerBannerItem = $lowerBannerItems[array_key_first($lowerBannerItems)];
$fileNames['lower'] = [
'filename' => $lowerBannerItem->getFilename(),
'originalName' => $lowerBannerItem->getOriginalName(),
];
if ($lowerBanner->getDisplayType() == Banner::BANNER_DISPLAY_TYPE_BANNER) {
$data['lower'] = [
'image' => $this->getImage($fileNames['lower'], BannerItem::BANNER_DIRECTORY)->resize(Image::SMALL_BANNER_DESKTOP_WIDTH, Image::SMALL_BANNER_DESKTOP_HEIGHT),
'link' => $lowerBannerItem->getLink(),
'title' => $lowerBannerItem->getOriginalName(),
];
}
}
return $data;
}
/**
* @Route("/cdn/image/product/{image}-{width}-{height}.{extension}", name="image_cdn")
* @param Request $request
* @param string $image
* @param int $width
* @param int $height
* @param string $extension
*
* @return Response
*/
public function cdnAction(Request $request, string $image, int $width, int $height, string $extension): Response
{
// Get Photo ID
$photoId = (int)substr($image, 0, (strlen($image) - 32));
// Photo
$photo = $this->getEntityManager()->getRepository(Photo::class)->findOneById($photoId);
if ($photo) {
// Validate Salt
if ($photo->getSalt() == str_replace($photoId, '', $image)) {
// Variant
$variant = Image::determineCloudflareVariant($width, $height);
if (!is_null($variant)) {
// Cloudflare
if (!is_null($photo->getCloudflareId())) {
// CDN
$url = $photo->getCdnUrl($variant);
// Image Mime Type
switch ($extension) {
case 'jpg':
case 'jpeg':
$headerAccept = 'image/jpeg';
break;
case 'gif':
$headerAccept = 'image/gif';
break;
case 'webp':
$headerAccept = 'image/webp';
break;
case 'png':
$headerAccept = 'image/png';
break;
default:
$headerAccept = $request->server->get('HTTP_ACCEPT');
break;
}
// User Agent
$userAgent = $request->server->get('HTTP_USER_AGENT');
// Response Header
$headers = [];
// Get Image
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept' => $headerAccept,
]);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$headers) {
$length = strlen($header);
// Parse Header
$header = explode(':', $header, 2);
// Ignore invalid Header
if (count($header) < 2) {
return $length;
}
// Header
$headers[strtolower(trim($header[0]))][] = trim($header[1]);
return $length;
});
// Response
$response = curl_exec($ch);
// HTTP OK
if ((int)curl_getinfo($ch, CURLINFO_HTTP_CODE) == Response::HTTP_OK) {
// Content Type
$contentType = false;
if (isset($headers['content-type'])) {
$contentType = array_pop($headers['content-type']);
}
// Content Length
$contentLength = false;
if (isset($headers['content-length'])) {
$contentLength = array_pop($headers['content-length']);
}
if ($contentType && $contentLength) {
return new Response($response, Response::HTTP_OK, [
'Access-Control-Allow-Origin' => '*',
'Cache-Control' => 'public',
'Content-Type' => $contentType,
'Content-Length' => $contentLength,
'Content-Disposition' => 'inline; filename="' . $image . '-' . $width . '-' . $height . '.' . $extension . '"',
]);
}
}
}
// Use system photo generation
if ($photo->getAlbum()) {
// Product
$product = $this->getEntityManager()->getRepository(Product::class)->findOneByAlbum($photo->getAlbum());
if ($product) {
$image = $this->getImage($photo, 'product/' . $product->getCode(), false)->resize($width, $height);
$imageContent = file_get_contents(str_replace(' ', '%20', $image));
return new Response($imageContent, Response::HTTP_OK, [
'Access-Control-Allow-Origin' => '*',
'Cache-Control' => 'public',
'Content-Type' => $photo->getMimeType(),
'Content-Length' => strlen($imageContent),
'Content-Disposition' => 'inline; filename="' . basename($image) . '"',
]);
}
}
}
}
}
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction', []);
}
/**
* @Route("/homepage-bottom-content-ajax", name="homepage_bottom_content_ajax", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/homepage-bottom-content-ajax", name="homepage_bottom_content_ajax_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
*/
public function homepageBottomContentAjaxAction(Request $request)
{
$seoUrlHelper = $this->getSeoUrlHelper($request);
$multiStore = $this->getMultiStoreHelper($request);
$domain = $multiStore->getDomain();
$domainId = $domain->getId();
$language = $multiStore->getLanguage();
$defaultLanguageCode = $multiStore->getDefaultLocale();
$cache = $this->cache;
$homepageContentBottomCacheKey = 'homepage.content.bottom.v4.' . $domainId . '.' . $language->getCode();
if ( $request->getSession()->get('isBazaarPage') === true ) {
$homepageContentBottomCacheKey = 'homepage.bazaar.content.bottom.v4.' . $domainId . '.' . $language->getCode();
}
$data = [];
$homepageContentBottomCacheItem = $cache->getItem($homepageContentBottomCacheKey);
if ($homepageContentBottomCacheItem->isHit()) {
$data = $homepageContentBottomCacheItem->get();
} else {
if ( $language->getCode() != 'en' && $request->getSession()->get('isBazaarPage') === false ) {
$data['blogPosts'] = $this->blogListing($request, $domain);
}
$bottomContentDescriptionStaticId = '';
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
$bottomContentDescriptionStaticId = '4';
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$bottomContentDescriptionStaticId = '21';
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$bottomContentDescriptionStaticId = '54';
break;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
$bottomContentDescriptionStaticId = '96';
break;
}
$data['bottomContentDescriptionLink'] = $seoUrlHelper->link('page', [
'static_id' => $bottomContentDescriptionStaticId,
]);
$data['currency'] = $domain->getCurrency();
$data['precision'] = $domain->getPricePrecision();
$homepageContentBottomCacheItem->set($data);
$homepageContentBottomCacheItem->expiresAfter(self::CACHE_LIFTETIME_6_HOURS);
$cache->save($homepageContentBottomCacheItem);
}
if ( in_array($domainId, MultiStore::getWholesaleDomainIDs()) && $request->getSession()->get('isBazaarPage') === false ) {
$homepageBazarCacheKey = 'homepage.bazar.v2.' . $domainId . '.' . $language->getCode();
$homepageBazarCacheItem = $cache->getItem($homepageBazarCacheKey);
if ($homepageBazarCacheItem->isHit()) {
$data['bazar'] = $homepageBazarCacheItem->get();
} else {
$data['bazar'] = $this->bazarListing($request, $multiStore, $seoUrlHelper);
$homepageBazarCacheItem->set($data['bazar']);
$homepageBazarCacheItem->expiresAfter(self::CACHE_LIFETIME_15_MINUTES);
$cache->save($homepageBazarCacheItem);
}
}
if (in_array($domainId, [Domain::DOMAIN_ID_RT_SK])) {
$homepageHeurekaCacheKey = 'homepage.heureka.v1.' . $domainId . '.' . $defaultLanguageCode;
$homepageHeurekaCacheItem = $cache->getItem($homepageHeurekaCacheKey);
if ($homepageHeurekaCacheItem->isHit()) {
$data['heurekaReviews'] = $homepageHeurekaCacheItem->get();
} else {
$heureka = new Heureka($this->getTwig());
$data['heurekaReviews'] = $heureka->getReviewsView($defaultLanguageCode);
$homepageHeurekaCacheItem->set($data['heurekaReviews']);
$homepageHeurekaCacheItem->expiresAfter(self::CACHE_LIFETIME_15_MINUTES);
$cache->save($homepageHeurekaCacheItem);
}
}
$data['domainId'] = $domainId;
return $this->render('AtechNetCoreBundle/Homepage/bottomContent.html.twig', $data);
}
/**
* @param Request $request
* @param MultiStore $multiStore
* @param SeoUrlHelper $seoUrlHelper
* @return array
*/
private function bazarListing(Request $request, MultiStore $multiStore, $seoUrlHelper): array
{
$domainId = $multiStore->getDomain()->getid();
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
// Bazar ...
// Filter Data
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
$filterData = [
'domainId' => $multiStore->getDomainId(),
'filterCategoryId' => 250,
'sort' => 'created',
'order' => 'desc',
'start' => 0,
'limit' => 6,
];
$buttonBazarProducts = $seoUrlHelper->link('category', [
'path' => '250',
]);
break;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
$filterData = [
'domainId' => $multiStore->getDomainId(),
'filterCategoryId' => 249,
'sort' => 'created',
'order' => 'desc',
'start' => 0,
'limit' => 6,
];
$buttonBazarProducts = $seoUrlHelper->link('category', [
'path' => '249',
]);
break;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
$filterData = [
'domainId' => $multiStore->getDomainId(),
'filterCategoryId' => 251,
'sort' => 'created',
'order' => 'desc',
'start' => 0,
'limit' => 6,
];
$buttonBazarProducts = $seoUrlHelper->link('category', [
'path' => '251',
]);
break;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
$filterData = [
'domainId' => $multiStore->getDomainId(),
'filterCategoryId' => 250,
'sort' => 'created',
'order' => 'desc',
'start' => 0,
'limit' => 6,
];
$buttonBazarProducts = $seoUrlHelper->link('category', [
'path' => '250',
]);
break;
}
// Bazar
$results = $this->getProductHelper($request)->getStructuredDataByFilters($filterData);
$bazarProducts = [];
$bazarProducts = $this->getProductHelper($request)->convertStructuredDataToListViewData($this->url($request), $results, $placeholder);
foreach ($bazarProducts as $key => $value) {
$bazarProducts[$key]['warrantyYear'] = 1;
}
return [
'buttonBazarProducts' => $buttonBazarProducts,
'products' => $bazarProducts,
];
}
/**
* @param Request $request
* @param Domain $domain
* @return array
*/
private function blogListing(Request $request, Domain $domain): array
{
$entityManager = $this->getEntityManager();
$domainId = $domain->getId();
$language = $domain->getLanguage();
$placeholderThumb = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_THUMB_WIDTH, Image::BLOG_BLOCK_THUMB_HEIGHT);
$placeholderAdditional = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_ADDITIONAL_WIDTH, Image::BLOG_BLOCK_ADDITIONAL_HEIGHT);
$results = $entityManager->createQuery(
"SELECT b
FROM AtechNetCoreBundle:BlogPage b
LEFT JOIN b.metas m
WHERE b.domain = " . $domainId . " AND m.language = " . $language->getId() . " AND b.published = 1
ORDER BY b.created DESC"
)->setMaxResults(3)
->getResult();
$blogPosts = [];
foreach ($results as $result) {
if (!is_null($result->getCoverImageLink())) {
$isBlogNewerThanDate = $result->getCreated() > (new DateTime('2023-10-30'));
$thumb = $this->getImage(
$result->getCoverImageLink(),
'blog'
)->resize(
($isBlogNewerThanDate ? Image::BLOG_BLOCK_THUMB_730_WIDTH : Image::BLOG_BLOCK_THUMB_16_9_WIDTH),
($isBlogNewerThanDate ? Image::BLOG_BLOCK_THUMB_300_HEIGHT : Image::BLOG_BLOCK_THUMB_16_9_HEIGHT)
)
;
$additional = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_ADDITIONAL_WIDTH, Image::BLOG_BLOCK_ADDITIONAL_HEIGHT);
} else {
$thumb = $placeholderThumb;
$additional = $placeholderAdditional;
}
$blogCategoryId = 0;
if ($result->getCategoryPage()) {
$blogCategoryId = $result->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $result->getDomain()->getId();
if ($domainId == Domain::DOMAIN_ID_RT_SK) {
$blogCategoryId = 3;
} elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
$blogCategoryId = 77;
} elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
$blogCategoryId = 169;
}
}
$meta = $result->getMetaByLanguage($language);
$blogPosts[] = [
'thumb' => $thumb,
'additional' => $additional,
'title' => $meta->getTitle(),
'created' => $meta->getCreated(),
'text' => $meta->getShortDesc(),
'href' => $this->url($request)->link('blog', [
'blog_category_id' => $blogCategoryId,
'blog_id' => $result->getId(),
]),
];
}
return $blogPosts;
}
/**
* @Route("/chech-hu-document-creation", name="check_hu_document_creation")
* @param Request $request
* @return JsonResponse|RedirectResponse
* @throws NoResultException
* @throws NonUniqueResultException
* @throws TransportExceptionInterface
*/
public function checkCreatedHuDocumentAction(Request $request)
{
if (!$request->get('token') || $request->get('token') != "fdsftgrejowigjreoig5435joifjeriofjewfgeuwfgew") {
return $this->redirectToRoute('not_found');
}
$entityManger = $this->getEntityManager();
$isWorkday = DeliveryUtil::isWorkDay(
new \DateTime(),
DeliveryUtil::getHolidays(Domain::DOMAIN_ID_RT_SK)
);
$documents = [];
if ($isWorkday) {
$documentGroup = $entityManger->createQuery("SELECT dg
FROM AtechNetCoreBundle:DocumentGroup dg
LEFT JOIN dg.year y
WHERE dg.domain = :domain
AND dg.type = :groupType
AND y.year = :year")
->setParameters([
'domain' => Domain::DOMAIN_ID_WS_HU,
'year' => date('Y'),
'groupType' => DocumentGroup::TYPE_INVOICE_OUT,
])
->getSingleResult();
$documents = $entityManger->createQuery("SELECT d
FROM AtechNetCoreBundle:Document d
WHERE d.created > :since AND d.group = :documentGroup")
->setParameters([
'since' => (new \DateTime())->setTime(19, 50),
'documentGroup' => $documentGroup->getId(),
])
->getResult();
}
if ($isWorkday && count($documents) == 0) {
$dateString = date('d.m.Y');
$mailer = $this->getMailer();
$email = (new TemplatedEmail())
->subject('Furbify HU document not generated for date (frb): ' . $dateString)
->to('dev@furbify.eu')
->html('Document has not been generated from SK to HU company on date: ' . $dateString);
$mailer->send($email);
return new JsonResponse(['sent']);
}
return new JsonResponse(['not sent']);
}
/**
* @Route("/overenie-zaruky", name="warranty_chech_page_sk", defaults={"_locale":""})
* @Route("/garancia-ellenorzese", name="warranty_chech_page_hu", defaults={"_locale":""})
* @Route("/overeni-zaruky", name="warranty_chech_page_cz", defaults={"_locale":""})
* @Route("/warranty-check", name="warranty_chech_page_en", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/overenie-zaruky", name="warranty_chech_page_sk_locale", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/garancia-ellenorzese", name="warranty_chech_page_hu_locale", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/overeni-zaruky", name="warranty_chech_page_cz_locale", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/warranty-check", name="warranty_chech_page_en_locale", defaults={"_locale":""})
* @param Request $request
* @return Response|null
* @throws InvalidArgumentException
*/
public function warrantyCheckPageAction(Request $request): ?Response
{
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['contentBottom'] = $this->getContentBottom($request);
// Multi-Store
$multiStore = $this->getMultiStoreHelper($request);
// Translator
$translator = $this->getTranslator();
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $translator->trans('Warranty check'),
'href' => $this->generateUrl('warranty_chech_page_' . $multiStore->getDefaultLocale()),
];
return $this->render('AtechNetCoreBundle/Page/warrantyCheck.html.twig', $data);
}
/**
* @Route("/warranty-check-service", name="warranty_check_service", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/warranty-check-service", name="warranty_check_service_locale", defaults={"_locale":""})
* @param Request $request
* @return Response|null
*/
public function warrantyCheckServiceAction(Request $request): ?Response
{
$serialToCheck = trim($request->request->get('serialToCheck'));
$data = [
'result' => 'not_found',
];
/**
* @var StockItem $stockItem
*/
if (strlen($serialToCheck) > 0) {
$stockItem = $this->getEntityManager()->getRepository(StockItem::class)->findOneBySerialNumber($serialToCheck);
$multistore = $this->getMultiStoreHelper($request);
$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])
? Domain::DOMAIN_ID_B2C_EU
: $multistore->getDomainId();
if ($stockItem
&& $stockItem->isInStock() == 0
&& $stockItem->getFirstMovementItem()
&& !is_null($stockItem->getLastMovementItem()->getMovement()->getOrder())
&& ($domainId == $stockItem->getLastMovementItem()->getMovement()->getOrder()->getDomain()->getId()
|| $stockItem->getLastMovementItem()->getMovement()->getMerchant()->getId() == 75785
)
&& (
$stockItem->getLastMovementItem()->getMovement()->getOrder()->getDocuments()->count() > 0
|| $stockItem->getLastMovementItem()->getMovement()->getOrder()->getBillingoDocuments()->count() > 0
)
) {
$product = $stockItem->getLastMovementItem()->getProduct();
$order = $stockItem->getLastMovementItem()->getMovement()->getOrder();
$documents = $stockItem->getLastMovementItem()->getMovement()->getOrder()->getDocuments();
$billingoDocuments = $stockItem->getLastMovementItem()->getMovement()->getOrder()->getBillingoDocuments();
$translator = $this->getTranslator();
$oderItem = $stockItem->getLastMovementItem()->getOrderItem();
$warrantyStart = $order->getShipDate() ? $order->getShipDate() : $order->getCreated();
if ($documents->count() > 0) {
/**
* @var Document $document
*/
foreach ($documents as $document) {
if ($document->getGroup()->getType() == DocumentGroup::TYPE_INVOICE_OUT && $document->getCustomer()->getId() == $order->getCustomer()->getId()) {
$warrantyStart = $document->getCreatedDate();
}
}
} elseif ($billingoDocuments->count() > 0) {
/**
* @var CustomerBillingoData $billingoDocument
*/
foreach ($billingoDocuments as $billingoDocument) {
if ($billingoDocument->getType() == BillingoOperation::TYPE_NORMAL && $billingoDocument->getCustomer()->getId() == $order->getCustomer()->getId()) {
$warrantyStart = $billingoDocument->getCreated();
}
}
}
$warrantyEnd = $warrantyStart > (new \DateTime('13-07-2023')) && $product->getQualityStatus() == Product::QualityStatus_Bazaar ? (clone $warrantyStart)->add(new \DateInterval('P1Y')) : $order->getWarrantyEnd($warrantyStart);
$documentGroupPrefix = $this->getEntityManager()->getRepository(DocumentGroup::class)
->createQueryBuilder('dg')
->leftJoin('dg.year', 'y')
->where('dg.domain = :domain')
->andWhere('dg.type = :groupType')
->andWhere('y.year = :year')
->setParameters([
'domain' => $domainId,
'year' => (new DateTime('now'))->format('Y'),
'groupType' => DocumentGroup::TYPE_INVOICE_OUT,
])->getQuery()->getOneOrNullResult()?->getPrefix();
$data = [
'result' => 'success',
'serialNumber' => $stockItem->getSerialNumber(),
'warrantyLength' => $translator->trans(Order::getWarrantyChoices()[$order->getWarranty()]),
'warrantyStart' => $warrantyStart->format('d.m.Y'),
'warrantyEnd' => $warrantyEnd->format('d.m.Y'),
'hasWarrantyDeadlinePassed' => $warrantyEnd > (new \DateTime()),
'daysLeftOfWarranty' => (new \DateTime())->diff($warrantyEnd)->days,
'product' => [
'code' => $product->getCode(),
'vendor' => $product->getVendor()->getName(),
'title' => $product->getName(),
'description' => $product->getDescription(),
],
'orderItemId' => $oderItem->getId(),
'documentPrefix' => $documentGroupPrefix,
'isB2BOrder' => $domainId == Domain::DOMAIN_ID_B2C_EU,
];
}
}
return $this->render('AtechNetCoreBundle/Page/warrantyCheckResults.html.twig', $data);
}
/**
* @Route("/warranty-check/order-item/order", name="warranty_check_order_item_order")
*/
public function isOrderItemPartOfOrder(Request $request)
{
$givenData = $request->request->get('orderDocumentCode');
$orderItemId = $request->request->get('orderItemId');
$order = $this->getEntityManager()->getRepository(Order::class)->findOneById($givenData);
if (!$order) {
$order = $this->getEntityManager()->getRepository(Order::class)
->createQueryBuilder('o')
->join('o.documents', 'd')
->where('d.code = :code')
->setParameter('code', $givenData)
->getQuery()->getOneOrNullResult();
}
$orderItem = $this->getEntityManager()->getRepository(OrderItem::class)->findOneById($orderItemId);
if (!is_null($order) && !is_null($orderItem) && $order->getOrderItems()->contains($orderItem)) {
return $this->redirectToRoute('customer_claims_new', [
'orderItemId' => $orderItemId,
]);
} else {
$this->addFlash(
'error',
$this->getTranslator()->trans('The provided data is incorrect. Please verify the order number and try again.')
);
return $this->redirectToRoute('warranty_chech_page_' . $this->getMultiStoreHelper($request)->getLanguage()->getCode());
}
}
/**
* @Route("/kviz", name="quiz_redirect")
*/
public function quizRedirectAction(): RedirectResponse
{
return $this->redirect('https://docs.google.com/forms/d/e/1FAIpQLSdsqtfaQtq8gaot4A8VP7t6drrR-cs4DREsUdJOEBU80oJD1Q/viewform?usp=sf_link');
}
/**
* @Route("/hide-nanobar", name="hide_nanobar")
* @param Request $request
* @param string $locale
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function hideNanobarAction(Request $request): JsonResponse
{
$request->getSession()->set('hideNanobar', true);
return new JsonResponse([
'status' => 'success',
]);
}
/**
* @Route("/vatera.xml", name="vatera_feed")
* @param Request $request
* @return Response
* @throws Exception
*/
public function vateraFeedAction(Request $request)
{
ini_set('memory_limit', '768M');
if ($request->query->get('token') != '32452vfjiuff30-234f932e9223-32fj398gg59f-23hg94kofoewj') {
return new Response('Invalid token', Response::HTTP_FORBIDDEN);
}
$cache = $this->cache;
$cacheKey = 'vatera_feed.v3';
$cacheItem = $cache->getItem($cacheKey);
if ($cacheItem->isHit()) {
$response = new Response($cacheItem->get());
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
$entityManager = $this->getEntityManager();
$domain = $this->getMultiStoreHelper($request)->getDomain();
$translator = $this->getDatabaseTranslator($request);
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<products>';
// $products = $entityManager
// ->createQuery("SELECT p
// FROM AtechNetCoreBundle:Product p
// LEFT JOIN p.type pt
// WHERE p.archived = 0
// AND p.available > 0
// AND p.qualityStatus != " . Product::QualityStatus_Bazaar . "
// AND pt.id IN (" . implode(',', ProductType::getMainProductTypeIds()) . ")")
// ->getResult();
//
// /**
// * @var Product $product
// */
// foreach ($products as $product) {
// $productMeta = $product->getDomainMeta($domain);
//
// if ($productMeta === false) {
// continue;
// }
//
// if (!$product->isAvailable()
// || !$productMeta->isActive()
// || !$productMeta->isListed()
// || !$productMeta->isReady()
// || $product->getDescription() == '') {
// continue;
// }
//
// $productMeta = $product->getDomainMeta($domain);
//
// $price = $productMeta->getDomainVatPrice();
// $discount = $productMeta->getDomainVatDiscount();
//
// $imageLinks = [];
//
// $photos = $product->getAlbum()->getPhotos();
//
// if ($this->getEnvironment() == 'prod') {
// if (count($photos) > 0) {
// $photos = Collections::sort($photos);
//
// foreach ($photos as $photo) {
// $imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
// }
// } elseif (isset($_GET['debug'])) {
// echo sprintf(
// '<p>No photo for <a href="%s" target="_blank">%s</a></p>',
// "http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
// $product->getCode()
// );
// }
// }
//
// $imageLinksString = '';
//
// $categoryId = 0;
//
// $vateraProductCategoryIds = [
// ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 10424,
// ProductType::PRODUCT_TYPE_ID_MONITOR => 104,
// ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 97,
// ProductType::PRODUCT_TYPE_ID_PC => 213,
// ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 213,
// ];
//
// $vateraProductVendorCategoryIds = [
// ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => [
// "Apple" => 9304,
// "ASUS" => 9304,
// "Dell" => 9304,
// "Fujitsu" => 9304,
// "HP" => 9304,
// "Lenovo" => 9304,
// "MSI" => 9304,
// ],
// ProductType::PRODUCT_TYPE_ID_NOTEBOOK => [
// "Acer" => 429,
// "Apple" => 9606,
// "ASUS" => 429,
// "Dell" => 9616,
// "Fujitsu" => 429,
// "HP" => 9626,
// "Lenovo" => 9631,
// "Microsoft" => 429,
// "Razer" => 429,
// "Panasonic" => 429,
// ],
// ProductType::PRODUCT_TYPE_ID_MONITOR => [
// "Acer" => 1735,
// "AOC" => 1735,
// "ASUS" => 1735,
// "Canvys" => 1735,
// "Dell" => 9472,
// "Fujitsu" => 1735,
// "HP" => 9475,
// "IIYAMA" => 1735,
// "Lenovo" => 1735,
// "LG" => 1735,
// "PARTNER" => 1735,
// "Philips" => 1735,
// "Samsung" => 1735,
// "TERRA" => 1735,
// "EIZO" => 1735,
// "NEC" => 1735,
// "Apple" => 1735,
// "Wacom" => 1735,
// ],
// ProductType::PRODUCT_TYPE_ID_SMARTPHONE => [
// "Apple" => 10352,
// "Google" => 291,
// "Nokia" => 291,
// "OnePlus" => 291,
// "Samsung" => 291,
// ],
// ProductType::PRODUCT_TYPE_ID_PC => [
// "Apple" => 9305,
// "ADesk" => 9343,
// "Dell" => [
// "OptiPlex" => 9336,
// "Precision" => 9317,
// "Vostro" => 9316,
// "other" => 9318,
// ],
// "Fujitsu" => 9343,
// "Furbify" => 9343,
// "HP" => [
// "Workstation" => 9325,
// "EliteDesk" => 9327,
// "ProDesk" => 9326,
// "Compaq" => 9324,
// "other" => 9330,
// ],
// "Lenovo" => [
// "ThinkCentre" => 9332,
// "ThinkStation" => 9334,
// "other" => 9335
// ],
// "Segotep" => 9343,
// "Toshiba" => 9343,
// "OEM" => 9304,
// ]
// ];
//
// if (isset($vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()])) {
// if (is_array($vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()]))
// {
// $subCategories = $vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()];
//
// foreach ($subCategories as $key => $subCategory) {
// if (str_contains($product->getName(), $key)){
// $categoryId = $subCategory;
// break;
// }
// }
//
// if ($categoryId == 0){
// $categoryId = $subCategories['other'];
// }
// } else{
// $categoryId = $vateraProductVendorCategoryIds[$product->getType()->getId()][$product->getVendor()->getName()];
// }
// } elseif (isset($vateraProductCategoryIds[$product->getType()->getId()])) {
// $categoryId = $vateraProductCategoryIds[$product->getType()->getId()];
// }
//
// $photoCount = 1;
// foreach ($imageLinks as $imageLink) {
// if ($photoCount > 8) {
// continue;
// }
// $imageLinksString .= '<photo_url' . $photoCount . '><![CDATA[' . $imageLink . ']]></photo_url' . $photoCount . '>';
// $photoCount++;
// }
//
// if ($this->getEnvironment() == 'prod' && $imageLinksString == '') {
// continue;
// }
//
// $category = $product->getType()->getTitle($translator);
//
// $longDescription = '';
// foreach($product->getSpecificationProductAttributeOptions() as $productAttributeOption) {
// $attributeOption = $productAttributeOption->getOption();
// if ($longDescription != '') {
// $longDescription .= ', ';
// }
// $longDescription .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
// }
//
// $productName = strlen($product->getName()) > 6 ? $product->getName() : $product->getVendor()->getName() . ' ' . $product->getName();
//
// $xml .= '<product>
// <title><![CDATA[' . $productName . ']]></title>
// <seller_product_id>' . $product->getCode() . '</seller_product_id>
// <product_pieces>' . (int)$product->getAvailable() . '</product_pieces>
// <fix_price>' . ($productMeta->isDiscounted() ? (int)$discount : (int)$price) . '</fix_price>
// <discount_price></discount_price>
// <starting_price></starting_price>
// <minimal_price></minimal_price>
// <duration></duration>
// <start_date>0</start_date>
// <manufacturer>' . $product->getVendor()->getName() . '</manufacturer>
// <weight>' . ($product->getWeight() ? 0 : $product->getWeight() / 1000) . '</weight>
// <category>' . $categoryId . '</category>
// <seller_category>' . $category . '</seller_category>
// <shipping_scheme></shipping_scheme>
// <short_description><![CDATA[' . $product->getDescription() . ']]></short_description>
// <description><![CDATA[' . $longDescription . ']]></description>
// <warranty>8</warranty>
// <state_flag>0</state_flag>
// <video_link></video_link>
// ' . $imageLinksString . '
// </product>';
// }
$xml .= '</products>';
$cacheItem->set($xml);
$cacheItem->expiresAfter(self::CACHE_LIFETIME_1_HOUR);
$cache->save($cacheItem);
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @Route("/jofogas.xml", name="jofogas_feed")
* @param Request $request
* @throws Exception
*/
public function jofogasFeedAction(Request $request): Response
{
ini_set('memory_limit', '768M');
if ($request->query->get('token') != '32452vfjiuff30-234f932e9223-32fj398gg59f-54kokptkrepo435') {
return new Response('Invalid token', Response::HTTP_FORBIDDEN);
}
$cache = $this->cache;
$cacheKey = 'jofogas_feed.v1';
$cacheItem = $cache->getItem($cacheKey);
if ($cacheItem->isHit()) {
$response = new Response($cacheItem->get());
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
$entityManager = $this->getEntityManager();
$domain = $this->getMultiStoreHelper($request)->getDomain();
$translator = $this->getDatabaseTranslator($request);
$seoUrlHelper = $this->getSeoUrlHelper($request);
$mainProductTypeIDs = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
ProductType::PRODUCT_TYPE_ID_MONITOR,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
ProductType::PRODUCT_TYPE_ID_PC,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
];
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<xml>
<version>2.0</version>
<contact>
<partner_email>webshop@furbify.eu</partner_email>
<partner_name>furbify s.r.o.</partner_name>
<partner_phone>+3617654657</partner_phone>
<partner_id>furbifysro</partner_id>
</contact>
<accounts>
<account>
<email>webshop@furbify.eu</email>
<account_params>
<name>furbify s.r.o.</name>
</account_params>
<ads>';
$products = $entityManager
->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN p.type pt
WHERE p.archived = 0
AND p.available > 0
AND p.qualityStatus != " . Product::QualityStatus_Bazaar . "
AND pt.id IN (" . implode(',', $mainProductTypeIDs) . ")")
->getResult();
/**
* @var Product $product
*/
foreach ($products as $product) {
$productMeta = $product->getDomainMeta($domain);
if ($productMeta === false) {
continue;
}
if (!$product->isAvailable()
|| !$productMeta->isActive()
|| !$productMeta->isListed()
|| !$productMeta->isReady()
|| $product->getDescription() == '') {
continue;
}
$productMeta = $product->getDomainMeta($domain);
$price = $productMeta->getDomainVatPrice();
$discount = $productMeta->getDomainVatDiscount();
$imageLinks = [];
$photos = $product->getAlbum()->getPhotos();
if ($this->getEnvironment() == 'prod') {
if (count($photos) > 0) {
$photos = Collections::sort($photos);
foreach ($photos as $photo) {
$imageLinks[] = $this->getImage($photo, 'product/' . $product->getCode(), true)->resize(Image::PRODUCT_VIEW_THUMB_WIDTH, Image::PRODUCT_VIEW_THUMB_HEIGHT);
}
} elseif (isset($_GET['debug'])) {
echo sprintf(
'<p>No photo for <a href="%s" target="_blank">%s</a></p>',
"http://centralis.lacne-pc.sk/product/{$product->getId()}/show",
$product->getCode()
);
}
}
$jofogasProductCategoryIds = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 5021,
ProductType::PRODUCT_TYPE_ID_MONITOR => 5006,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 5060,
ProductType::PRODUCT_TYPE_ID_PC => 5360,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 5360,
ProductType::PRODUCT_TYPE_ID_TABLET => 5370,
];
$categoryId = $jofogasProductCategoryIds[$product->getType()->getId()] ?? 0;
$jofogasPackageSizes = [
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => 'S',
ProductType::PRODUCT_TYPE_ID_MONITOR => 'L',
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => 'M',
ProductType::PRODUCT_TYPE_ID_PC => 'L',
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => 'L',
ProductType::PRODUCT_TYPE_ID_TABLET => 'S',
];
$packageSize = $jofogasPackageSizes[$product->getType()->getId()] ?? 0;
$photoCount = 1;
$imageLinksString = '<images>';
foreach ($imageLinks as $imageLink) {
if ($photoCount > 8) {
continue;
}
$imageLinksString .= '<image>' . $imageLink . '</image>';
$photoCount++;
}
$imageLinksString .= '</images>';
if ($this->getEnvironment() == 'prod' && $imageLinksString == '') {
continue;
}
$longDescription = '';
$capacityId = 6; // Other
$computerCpuTypeId = 21; // Other
$computerResolutionId = 10; // Other
$electronicSizeId = 7; // Other
$opticalDriveTypeId = 5; // No optical drive
$computerAccBrandId = 9; // Other
$electronicConditionOneId = 2; // Ujszeru
$monitorSizeId = 9; // Other
$monitorTypeId = 5; // Other
$mobileMemoryId = 9; // Other
$mobileColorId = 16; // Other
$mobileSizeId = 6; // Other
$mobileOsId = 3; // Other
if ($product->getQualityStatus() == Product::QualityStatus_New) {
$electronicConditionOneId = 1;
}
foreach($product->getSpecificationAttributeOptions() as $attributeOption) {
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SSD) {
$capacity = (int)str_ireplace(['GB', 'TB'], ['', '000'], $attributeOption->getTitle());
if ($capacity < 128) {
$capacityId = 1;
} elseif ($capacity >= 128 && $capacity <= 256) {
$capacityId = 2;
} elseif ($capacity > 256 && $capacity <= 500) {
$capacityId = 3;
} elseif ($capacity > 500 && $capacity <= 1000) {
$capacityId = 4;
} elseif ($capacity > 1000) {
$capacityId = 5;
}
}
if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_NOTEBOOK, ProductType::PRODUCT_TYPE_ID_PC])) {
$cpuFamilyAttributeId = $product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK ? Attribute::ATTRIBUTE_ID_CPU_NB_FAMILY : Attribute::ATTRIBUTE_ID_CPU_PC_FAMILY;
if ($attributeOption->getAttribute()->getId() == $cpuFamilyAttributeId) {
switch ($attributeOption->getTitle()) {
case 'Intel Core i3':
$computerCpuTypeId = 6;
break;
case 'Intel Core i5':
$computerCpuTypeId = 5;
break;
case 'Intel Core i7':
$computerCpuTypeId = 4;
break;
case 'Intel Core i9':
$computerCpuTypeId = 3;
break;
}
if ($computerCpuTypeId == 21 && str_contains($attributeOption->getTitle(), 'Intel')) {
$computerCpuTypeId = 1;
} else {
$computerCpuTypeId = 2;
}
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_MAXIMUM_RESOLUTION) {
switch (str_replace(' ', '', preg_replace('/\s*\(.*?\)/', '', $attributeOption->getTitle()))) {
case '1024x768':
$computerResolutionId = 1;
break;
case '1280x1024':
$computerResolutionId = 2;
break;
case '1366x768':
$computerResolutionId = 3;
break;
case '1440x900':
$computerResolutionId = 4;
break;
case '1600x900':
$computerResolutionId = 5;
break;
case '1600x1200':
$computerResolutionId = 6;
break;
case '1680x1050':
$computerResolutionId = 7;
break;
case '1920x1080':
$computerResolutionId = 8;
break;
case '1920x1200':
$computerResolutionId = 9;
break;
case '4K':
$computerResolutionId = 9;
break;
case '15K':
$computerResolutionId = 9;
break;
case 'UltraWide':
$computerResolutionId = 9;
break;
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_OPTICAL_DRIVER) {
switch ($attributeOption->getTitle()) {
case 'Blu-ray ROM':
case 'Blu-ray RE':
$opticalDriveTypeId = 1;
break;
case 'Blu-ray RW':
$opticalDriveTypeId = 2;
break;
case 'DVD-ROM':
$opticalDriveTypeId = 3;
break;
case 'DVD-RW':
$opticalDriveTypeId = 4;
break;
default:
$opticalDriveTypeId = 5;
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
$electronicSizeId = '';
$screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
if ($screenSize < 11) {
$electronicSizeId = 1;
} elseif ($screenSize >= 11 && $screenSize < 13) {
$electronicSizeId = 2;
} elseif ($screenSize >= 13 && $screenSize < 14) {
$electronicSizeId = 3;
} elseif ($screenSize >= 14 && $screenSize < 15) {
$electronicSizeId = 4;
} elseif ($screenSize >= 15 && $screenSize < 15.6) {
$electronicSizeId = 5;
} elseif ($screenSize >= 15.6) {
$electronicSizeId = 6;
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
$screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
if ($screenSize < 15) {
$monitorSizeId = 1;
} elseif ($screenSize >= 15 && $screenSize <= 17) {
$monitorSizeId = 2;
} elseif ($screenSize >= 18 && $screenSize <= 20) {
$monitorSizeId = 3;
} elseif ($screenSize >= 21 && $screenSize <= 22) {
$monitorSizeId = 4;
} elseif ($screenSize >= 23 && $screenSize <= 24) {
$monitorSizeId = 5;
} elseif ($screenSize >= 25 && $screenSize <= 26) {
$monitorSizeId = 6;
} elseif ($screenSize >= 27 && $screenSize <= 28) {
$monitorSizeId = 7;
} elseif ($screenSize >= 29) {
$monitorSizeId = 8;
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_DISPLAY_TECHNOLOGY) {
switch ($attributeOption->getTitle()) {
case 'LED':
$monitorTypeId = 1;
break;
case 'LCD':
$monitorTypeId = 2;
break;
case 'VA':
$monitorTypeId = 3;
break;
}
}
if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
$mobileOsId = 2; // iOS
} else {
$mobileOsId = 1; // Android
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_MEMORY) {
$memorySize = (int)str_ireplace(['GB', 'TB'], ['', '000'], $attributeOption->getTitle());
if ($memorySize < 4) {
$mobileMemoryId = 1;
} elseif ($memorySize >= 4 && $memorySize < 8) {
$mobileMemoryId = 2;
} elseif ($memorySize >= 8 && $memorySize < 16) {
$mobileMemoryId = 3;
} elseif ($memorySize >= 16 && $memorySize < 32) {
$mobileMemoryId = 4;
} elseif ($memorySize >= 32 && $memorySize < 64) {
$mobileMemoryId = 5;
} elseif ($memorySize >= 64 && $memorySize < 128) {
$mobileMemoryId = 6;
} elseif ($memorySize >= 128 && $memorySize < 256) {
$mobileMemoryId = 7;
} elseif ($memorySize >= 256) {
$mobileMemoryId = 8;
}
}
if ($attributeOption->getAttribute()->getId() == Attribute::ATTRIBUTE_ID_SCREEN_SIZE) {
$screenSize = (float)str_ireplace(['"', '“', '”', 'inches', 'inch', 'Inches', 'Inch'], '', $attributeOption->getTitle());
if ($screenSize < 3.5) {
$mobileSizeId = 1;
} elseif ($screenSize >= 3.5 && $screenSize < 4) {
$mobileSizeId = 2;
} elseif ($screenSize >= 4 && $screenSize < 5) {
$mobileSizeId = 3;
} elseif ($screenSize >= 5 && $screenSize < 5.6) {
$mobileSizeId = 4;
} elseif ($screenSize >= 5.6) {
$mobileSizeId = 5;
}
}
if ($longDescription != '') {
$longDescription .= ', ';
}
$longDescription .= $attributeOption->getAttribute()->getTitle($translator) . ': ' . $attributeOption->getTitle($translator);
}
$productName = strlen($product->getName()) > 6 ? $product->getName() : $product->getVendor()->getName() . ' ' . $product->getName();
$computerOsId = 1; // Windows
if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
$computerOsId = 4; // MacOS
}
if ($product->getVendor()->getId() == Vendor::VENDOR_ID_APPLE) {
$laptopTypeId = 4;
} else {
if (str_contains(strtolower($productName), 'ultrabook')) {
$laptopTypeId = 3;
} else {
$laptopTypeId = 1;
}
}
if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK) {
switch (strtolower($product->getVendor()->getName())) {
case 'asus':
$laptopAccBrandId = 1;
break;
case 'lenovo':
$laptopAccBrandId = 2;
break;
case 'hp':
$laptopAccBrandId = 3;
break;
case 'dell':
$laptopAccBrandId = 4;
break;
case 'acer':
$laptopAccBrandId = 5;
break;
case 'apple':
$laptopAccBrandId = 6;
break;
case 'msi':
$laptopAccBrandId = 7;
break;
case 'fujitsu':
$laptopAccBrandId = 8;
break;
case 'toshiba':
$laptopAccBrandId = 9;
break;
default:
$laptopAccBrandId = 10;
}
}
if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE])) {
switch (strtolower($product->getVendor()->getName())) {
case 'dell':
$computerAccBrandId = 1;
break;
case 'gefors':
$computerAccBrandId = 2;
break;
case 'lenovo':
$computerAccBrandId = 3;
break;
case 'hp':
$computerAccBrandId = 4;
break;
case 'asus':
$computerAccBrandId = 5;
break;
case 'apple':
$computerAccBrandId = 6;
break;
case 'intel':
$computerAccBrandId = 7;
break;
case 'acer':
$computerAccBrandId = 9;
break;
default:
$computerAccBrandId = 9;
}
}
$category = $product->getType()->getTitle($translator);
$vendor = $product->getVendor()->getName() != 'VARIOUS' ? $product->getVendor()->getName() : '';
$productNameForLink = $product->getName();
$productCode = $product->getCode();
$linkRaw = $category . ' ' . $vendor . ' ' . $productNameForLink . ' ' . $productCode;
$link = $seoUrlHelper->slug($linkRaw);
// Change for jofogas
$productName = trim($vendor . ' ' . $product->getName());
if (strlen($productName) < 12) {
$productName = $category . ' ' . $productName;
}
if (strlen($productName) > 70) {
$productName = mb_substr($productName, 0, 70);
}
$adParameters = '';
if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_NOTEBOOK) {
$adParameters = '<capacity>' . $capacityId . '</capacity>
<computer_cpu_type>' . $computerCpuTypeId . '</computer_cpu_type>
<computer_os>' . $computerOsId . '</computer_os>
<electronic_size>' . $electronicSizeId . '</electronic_size>
<computer_resolution>' . $computerResolutionId . '</computer_resolution>
<laptop_type>' . $laptopTypeId . '</laptop_type>
<laptop_acc_brand>' . $laptopAccBrandId . '</laptop_acc_brand>';
}
if (in_array($product->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE])) {
$adParameters = '<capacity>' . $capacityId . '</capacity>
<computer_cpu_type>' . $computerCpuTypeId . '</computer_cpu_type>
<computer_os>' . $computerOsId . '</computer_os>
<opticaldrive_type>' . $opticalDriveTypeId . '</opticaldrive_type>
<computer_acc_brand>' . $computerAccBrandId . '</computer_acc_brand>';
}
if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_MONITOR) {
$adParameters = '<computer_resolution>' . $computerResolutionId . '</computer_resolution>
<electronic_condition_one>' . $electronicConditionOneId . '</electronic_condition_one>
<monitor_size>' . $monitorSizeId . '</monitor_size>
<monitor_type>' . $monitorTypeId . '</monitor_type>';
}
if ($product->getType()->getId() == ProductType::PRODUCT_TYPE_ID_SMARTPHONE) {
$adParameters = '<mobile_os>' . $mobileOsId . '</mobile_os>
<simcard>1</simcard>
<mobile_memory>' . $mobileMemoryId . '</mobile_memory>
<mobilecam_resolution>3</mobilecam_resolution>
<electronic_condition_one>' . $electronicConditionOneId . '</electronic_condition_one>
<mobile_color>' . $mobileColorId . '</mobile_color>
<mobile_size>' . $mobileSizeId . '</mobile_size>
<mobile_type>1</mobile_type>';
}
$xml .= '<ad>
<external_ad_id>' . $product->getCode() . '</external_ad_id>
<category>' . $categoryId . '</category>
<type>s</type>
<subject><![CDATA[' . $productName . ']]></subject>
<body><![CDATA[' . $longDescription . ']]></body>
' . $imageLinksString . '
<ad_params>
<price>' . ($productMeta->isDiscounted() ? (int)$discount : (int)$price) . '</price>
<phone>+36202223322</phone>
<phone_hidden>0</phone_hidden>
<contact_location>Osada Reviczkého 3869/38</contact_location>
<zipcode>1134</zipcode>
<city>Kolárovo</city>
<apply_link>https://www.furbify.hu/' . $link . '?utm_source=jofogas</apply_link>
<package_size>' . $packageSize . '</package_size>
<delivery_enabled>1</delivery_enabled>
' . $adParameters . '
</ad_params>
</ad>';
}
$xml .= '</ads>
</account>
</accounts>
</xml>';
$cacheItem->set($xml);
$cacheItem->expiresAfter(self::CACHE_LIFETIME_4_HOUR);
$cache->save($cacheItem);
$response = new Response($xml);
$response->headers->set('Content-Type', 'application/xml;charset=utf-8');
return $response;
}
/**
* @param ProductHelper $productHelper
* @param Domain $domain
* @param Request $request
* @param string $placeholder
* @param mixed $homepageFeaturedProductCacheItem
* @param CacheItemPoolInterface $cache
* @return array
*/
private function getFeatureProductCacheData(ProductHelper $productHelper, Domain $domain, Request $request, string $placeholder, mixed $homepageFeaturedProductCacheItem, CacheItemPoolInterface $cache): array
{
$productGroupProductData = $productHelper->getProductGroupProducts('homepage.featured.product.upper', $domain);
$productGroupProducts = $productGroupProductData['productGroupProducts'];
$featuredProducts = $productHelper->getStructuredDataForProducts($productGroupProducts, true);
$listViewData = $productHelper->convertStructuredDataToListViewData($this->url($request), $featuredProducts, $placeholder);
$data['featuredProduct']['upper'] = [];
if (count($featuredProducts) > 0) {
$selectedFeaturedProduct = $productGroupProductData['isRandom']
? $featuredProducts[array_rand($featuredProducts)]
: $featuredProducts[array_key_first($featuredProducts)];
$selectedListViewData = null;
foreach ($listViewData as $value) {
if ($value['id'] == $selectedFeaturedProduct['id']) {
$selectedListViewData = $value;
break;
}
}
$data['featuredProduct']['upper'] = $selectedFeaturedProduct;
$data['featuredProduct']['upper']['image'] = $selectedListViewData['image'];
$data['featuredProduct']['upper']['price'] = $selectedListViewData['price'];
$data['featuredProduct']['upper']['special'] = $selectedListViewData['special'];
$data['featuredProduct']['upper']['href'] = str_replace('http:', 'https:', $selectedListViewData['href']);
$data['featuredProduct']['upper']['isRandom'] = $productGroupProductData['isRandom'];
if (is_array($data['featuredProduct']['upper']['images'])) {
$imagesHelper = [];
foreach ($data['featuredProduct']['upper']['images'] as $key => $image) {
$imagesHelper[$key] = $this->getImage($image)->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$data['featuredProduct']['upper']['carouselImages'] = $imagesHelper;
}
if (!empty($productGroupProductData['customData']) && isset($productGroupProductData['customData'][$selectedListViewData['id']])) {
$customData = $productGroupProductData['customData'][$selectedListViewData['id']];
if (isset($customData['title'])) {
$data['featuredProduct']['upper']['title'] = $customData['title'];
$data['featuredProduct']['upper']['isCustomTitle'] = true;
}
if (isset($customData['description'])) {
$data['featuredProduct']['upper']['attributesListTxt'] = $customData['description'];
$data['featuredProduct']['upper']['isCustomAttributeListTxt'] = true;
}
}
}
$productGroupProductData = $productHelper->getProductGroupProducts('homepage.featured.product.lower', $domain);
$productGroupProducts = $productGroupProductData['productGroupProducts'];
$featuredProducts = $productHelper->getStructuredDataForProducts($productGroupProducts, true);
$listViewData = $productHelper->convertStructuredDataToListViewData($this->url($request), $featuredProducts, $placeholder);
$data['featuredProduct']['lower'] = [];
if (count($featuredProducts) > 0) {
$selectedFeaturedProduct = $productGroupProductData['isRandom']
? $featuredProducts[array_rand($featuredProducts)]
: $featuredProducts[array_key_first($featuredProducts)];
$selectedListViewData = null;
foreach ($listViewData as $value) {
if ($value['id'] == $selectedFeaturedProduct['id']) {
$selectedListViewData = $value;
break;
}
}
$data['featuredProduct']['lower'] = $selectedFeaturedProduct;
$data['featuredProduct']['lower']['image'] = $selectedListViewData['image'];
$data['featuredProduct']['lower']['price'] = $selectedListViewData['price'];
$data['featuredProduct']['lower']['special'] = $selectedListViewData['special'];
$data['featuredProduct']['lower']['href'] = str_replace('http:', 'https:', $selectedListViewData['href']);
$data['featuredProduct']['lower']['isRandom'] = $productGroupProductData['isRandom'];
if (is_array($data['featuredProduct']['lower']['images'])) {
$imagesHelper = [];
foreach ($data['featuredProduct']['lower']['images'] as $key => $image) {
$imagesHelper[$key] = $this->getImage($image)->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$data['featuredProduct']['lower']['carouselImages'] = $imagesHelper;
}
if (!empty($productGroupProductData['customData']) && isset($productGroupProductData['customData'][$selectedListViewData['id']])) {
$customData = $productGroupProductData['customData'][$selectedListViewData['id']];
if (isset($customData['title'])) {
$data['featuredProduct']['lower']['title'] = $customData['title'];
$data['featuredProduct']['lower']['isCustomTitle'] = true;
}
if (isset($customData['description'])) {
$data['featuredProduct']['lower']['attributesListTxt'] = $customData['description'];
$data['featuredProduct']['lower']['isCustomAttributeListTxt'] = true;
}
}
}
$homepageFeaturedProductCacheItem->set($data['featuredProduct']);
$homepageFeaturedProductCacheItem->expiresAfter(self::CACHE_LIFETIME_30_MINUTES);
$cache->save($homepageFeaturedProductCacheItem);
return $data['featuredProduct'];
}
#[Route('/llms.txt', name: 'llms_txt', methods: ['GET'])]
public function llmsTxt(Request $request, CacheItemPoolInterface $cache): Response
{
$locale = $request->getLocale();
$cacheItem = $cache->getItem("llms_txt_$locale-V1");
if ($cacheItem->isHit()) {
return new Response($cacheItem->get());
}
$filePath = __DIR__ . '/../Resources/public/llms/llms_' . $locale . '.txt';
if (!file_exists($filePath)) {
$filePath = __DIR__ . '/../Resources/public/llms/llms_en.txt';
}
$llmsTxt = file_get_contents($filePath);
$cacheItem->set($llmsTxt);
$cache->save($cacheItem);
return new Response($llmsTxt);
}
}