<?php
declare(strict_types=1);
namespace App\Application\Service\Menu;
use App\Application\Service\Session\SessionService;
use App\Controller\LegacyController;
use App\Entity\System\Cms;
use App\Entity\System\Customer;
use App\Entity\System\Pack;
use App\Manager\System\BrandLanguageManager;
use App\Manager\System\CustomerManager;
use App\Manager\System\LanguageManager;
use App\Application\Service\Helper\ControlPanelLinkGenerator;
use App\Application\Service\Helper\LegacyTranslator;
use App\Application\Service\Helper\LinkGenerator;
use App\Entity\System\Menu;
use App\Manager\System\PackManager;
use App\Manager\System\ProductManager;
use App\Manager\System\TagManager;
use App\Manager\System\TaxonomyLanguageManager;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\System\Language;
class MenuService
{
public const CORPORATE = 1;
public const SHOP = 2;
protected LegacyTranslator $legacyTranslator;
protected RequestStack $requestStack;
protected LinkGenerator $linkGenerator;
protected string $baseUrl;
private LanguageManager $languageManager;
protected TranslatorInterface $translator;
protected RouterInterface $router;
protected ControlPanelLinkGenerator $controlPanelLinkGenerator;
private Security $security;
private CustomerManager $customerManager;
private PackManager $packManager;
private BrandLanguageManager $brandLanguageManager;
private TaxonomyLanguageManager $taxonomyLanguageManager;
private TagManager $tagManager;
private ProductManager $productManager;
private MenuBaseHeaderService $menuBaseHeaderService;
private ParameterBagInterface $parameterBag;
private SessionService $sessionService;
public function __construct(
LegacyTranslator $legacyTranslator,
LinkGenerator $linkGenerator,
RequestStack $requestStack,
LanguageManager $languageManager,
TranslatorInterface $translator,
RouterInterface $router,
MenuBaseHeaderService $menuBaseHeaderService,
ControlPanelLinkGenerator $controlPanelLinkGenerator,
ParameterBagInterface $parameterBag,
Security $security,
SessionService $sessionService,
CustomerManager $customerManager,
PackManager $packManager,
BrandLanguageManager $brandLanguageManager,
TaxonomyLanguageManager $taxonomyLanguageManager,
TagManager $tagManager,
ProductManager $productManager
) {
$this->parameterBag = $parameterBag;
$this->legacyTranslator = $legacyTranslator;
$this->linkGenerator = $linkGenerator;
$this->baseUrl = $parameterBag->get('base_url');
$this->requestStack = $requestStack;
$this->languageManager = $languageManager;
$this->translator = $translator;
$this->router = $router;
$this->controlPanelLinkGenerator = $controlPanelLinkGenerator;
$this->security = $security;
$this->customerManager = $customerManager;
$this->packManager = $packManager;
$this->brandLanguageManager = $brandLanguageManager;
$this->taxonomyLanguageManager = $taxonomyLanguageManager;
$this->tagManager = $tagManager;
$this->productManager = $productManager;
$this->menuBaseHeaderService = $menuBaseHeaderService;
$this->sessionService = $sessionService;
}
public function getSocialLinks(): array
{
return [
[
'icon' => '/public/img/icons/new-facebook.svg',
'url' => $this->parameterBag->get('facebook_url'),
'name' => 'facebook',
],
[
'icon' => '/public/img/icons/new-instagram.svg',
'url' => $this->parameterBag->get('instagram_url'),
'name' => 'instagram',
],
[
'icon' => '/public/img/icons/new-linkedin.svg',
'url' => $this->parameterBag->get('linkedin_url'),
'name' => 'linkedin',
],
[
'icon' => '/public/img/icons/new-youtube.svg',
'url' => $this->parameterBag->get('youtube_url'),
'name' => 'youtube',
],
[
'icon' => '/public/img/icons/new-twitter.svg',
'url' => $this->parameterBag->get('twitter_url'),
'name' => 'twitter',
],
[
'icon' => '/public/img/icons/new-pinterest.svg',
'url' => $this->parameterBag->get('pinterest_url'),
'name' => 'pinterest',
],
];
}
public function getAwards(): array
{
return [
[
'image' => '/public/img/new_camara.png',
'name' => '2023 - Innovation in the company',
],
[
'image' => '/public/img/landings/awards/mia-award.svg',
'name' => '2023 - International Marketing - Finalist',
],
[
'image' => '/public/img/landings/awards/ecommerce-tools-award.svg',
'name' => '2023 - Best Logistics and Internationalization',
],
[
'image' => '/public/img/landings/awards/ey-award.svg',
'name' => '2023 - Best Scale Up - Finalist',
],
[
'image' => '/public/img/marketplaces-awards.svg',
'name' => '2022 - Best Catalogue Solution',
],
[
'image' => '/public/img/marketplaces-awards.svg',
'name' => '2022 - Best Logistics Solution',
],
[
'image' => '/public/img/marketplaces-awards.svg',
'name' => '2022 - Best Manager',
],
[
'image' => '/public/img/new_camara.png',
'name' => '2022 - International',
],
[
'image' => '/public/img/aster-award.svg',
'name' => '2022 - Best Entrepreneurs',
],
[
'image' => '/public/img/onda-cero.svg',
'name' => '2021 - Best company',
],
[
'image' => '/public/img/new_insentive_awards.svg',
'name' => '2021 - Best Industry Service Provider',
],
[
'image' => '/public/img/new_cepyme.svg',
'name' => '2021 - Best Business Practices',
],
[
'image' => '/public/img/new_camara.png',
'name' => '2020 - Pyme del año',
],
[
'image' => '/public/img/new_cepyme.svg',
'name' => '2018 - Finalist Job Creation',
],
[
'image' => '/public/img/new_eawards.svg',
'name' => '2018 - Best Marketplace Technology',
],
[
'image' => '/public/img/new_ecommerce_awards.svg',
'name' => '2017 - Best B2B E-Commerce',
],
[
'image' => '/public/img/new_eawards.svg',
'name' => '2016 - Best International E-Commerce',
],
[
'image' => '/public/img/new_eawards.svg',
'name' => '2016 - Best Innovative E-Commerce',
],
[
'image' => '/public/img/new_paypal.svg',
'name' => '2015 - Best Innovative E-Commerce',
],
[
'image' => '/public/img/new_ecommerce_awards.svg',
'name' => '2015 - Best Cross Border',
],
];
}
/**
* @return array[]
*/
public function getBottomLinks(): array
{
return [
[
'name' => $this->legacyTranslator->trans('Formas de pago', 'sitemap'),
'url' => $this->linkGenerator->getCmsLink(Cms::CMS_PAYMENTS),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->legacyTranslator->trans('Entrega y envío', 'sitemap'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_SHIPMENT_AND_DELIVERY),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->legacyTranslator->trans('Impuestos', 'sitemap'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_TAXES),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->legacyTranslator->trans('Garantía', 'sitemap'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_WARRANTY),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->translator->trans('footer.bottom_links.general_conditions'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_GENERAL_PRIVACY_TERMS_AND_CONDITIONS),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->translator->trans('footer.bottom_links.cookies', [], 'landings'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_COOKIES),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->translator->trans('footer.bottom_links.privacy_policy'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_PRIVACY_POLICY),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->translator->trans('footer.bottom_links.legal_notice'),
'url' => $this->linkGenerator->getCmsLink(Cms::ID_CMS_LEGAL_NOTICE),
'external_link' => false,
'no_follow' => false,
],
[
'name' => $this->translator->trans('footer.bottom_links.responsible_business'),
'url' => $this->sessionService->getLocaleId() === Language::SPANISH_LANGUAGE_ID ?
'https://responsiblebusiness.bigbuy.eu/' : 'https://responsiblebusiness.bigbuy.eu/en_US/',
'external_link' => true,
'no_follow' => true,
],
];
}
/**
* @return array[]
*/
public function getCorporateLinks(): array
{
return $this->menuBaseHeaderService->createMenuGeneralByMenuId(Menu::FOOTER_ID, $this->requestStack->getSession()->get('lang'));
}
/**
* @return array[]
*/
public function getTopbarLinks(int $selectedLink): array
{
return [
[
'name' => $this->legacyTranslator->trans('Empresa', 'accountController'),
'url' => $this->baseUrl.$this->requestStack->getSession()->get('lang'),
'selected' => $selectedLink === self::CORPORATE,
],
[
'name' => $this->translator->trans('menu.base.shopb2b.title'),
'url' => $this->linkGenerator->getFrontUrl('tiendab2b.html'),
'selected' => $selectedLink === self::SHOP,
],
];
}
public function getLanguages(): array
{
return $this->languageManager->findAllActiveNamesAndIsoCodes();
}
/**
* @return array<int, array{id: int, name: string, isoCode: string, isoCodeReal: string|null, url: string|null}>
*/
public function getLanguageLinks(string $parentController, ?string $url = null): array
{
$languages = $this->languageManager->findAllActiveNamesAndIsoCodes();
$isLegacyController = (false !== strpos($parentController, LegacyController::class));
$languageLinks = $this->getLanguagesController($languages);
if (
$languageLinks
&& (!$isLegacyController || $this->requestStack->getSession()->get('cms_new') === true)
) {
return $languageLinks;
}
$controllerName = $this->requestStack->getSession()->get('controller');
if ($controllerName === 'indexController') {
$controllerName = '';
}
if ($url === LinkGenerator::NAME_URL_TIENDA_B2B_WITH_TERMINATION_HTML) {
$controllerName = LinkGenerator::NAME_URL_TIENDA_B2B;
}
/** @var string $controllerName */
$controllerName = str_replace('Controller', '', $controllerName);
$languagesResult = [];
foreach ($languages as $language) {
$language['url'] = $this->linkGenerator->getCurrentLink($controllerName, $language['id']);
$languagesResult[] = $language;
}
return $languagesResult;
}
public function getLanguagesController(array $languages): ?array
{
foreach ($languages as &$language) {
$shopLink = $this->getShopLanguageLink($language['id']);
if ($shopLink) {
$language['url'] = $shopLink;
continue;
}
$cmsRoute = $this->linkGenerator->getCmsLink(null, $language['id']);
$language['url'] = $cmsRoute;
}
return $languages;
}
public function getShopLanguageLink(int $languageId): ?string
{
$route = $this->requestStack->getMainRequest()->get('_route');
switch ($route) {
case 'shop_brand':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$brandLanguage = $this->brandLanguageManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$brandLanguage) {
return null;
}
return $this->linkGenerator->getManufacturerLink($brandLanguage->getBrand()->getId(), $languageId);
case 'shop_category':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$taxonomyLanguage = $this->taxonomyLanguageManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$taxonomyLanguage) {
return null;
}
return $this->linkGenerator->getTaxonomyLink($taxonomyLanguage->getTaxonomy()->getId(), $languageId);
case 'shop_tag':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$tagOrigin = $this->tagManager->findOneByLinkRewriteAndLanguage(
$params['url'],
$language->getId()
);
if (!$tagOrigin) {
return null;
}
$tag = $this->tagManager->findOneByTagIdAndLanguage(
$tagOrigin->getId(),
$languageId
);
return $this->linkGenerator->getTagLink($tag->getLinkRewrite(), $tag->getLanguage()->getIsoCode());
case 'shop_product':
case 'shop_service':
case 'shop_course':
$params = $this->requestStack->getMainRequest()->get('_route_params');
$language = $this->languageManager->getLanguageByIsoLanguage($params['lang']);
$productLanguage = $this->productManager->findOneProductLangByLinkRewriteAndLanguage(
$params['url'],
$language->getIsoCode()
);
if (!$productLanguage) {
return null;
}
return $this->linkGenerator->getProductLink($productLanguage->getProduct()->getId(), $languageId);
case 'checkout':
$language = $this->languageManager->findOneById($languageId);
return $this->router->generate('checkout', ['_locale' => $language->getIsoCode()]);
}
return null;
}
/**
* @return array|null[]|string[]
*/
public function getCustomerPackInfo(): array
{
/** @var ?Customer $user */
$user = $this->security->getUser();
if (!$user) {
return [
'pack_name' => null,
'pack_id' => null,
];
}
$customer = $this->customerManager->findOneById((int)$user->getId());
if (!$customer) {
return [
'pack_name' => null,
'pack_id' => null,
];
}
/** @var Pack $pack */
$pack = $this->packManager->findOneBy(['id' => $customer->getIdPack(), 'language' => $customer->getLanguage()]);
$packCustomer = $pack->getName();
return [
'pack_name' => $packCustomer,
'pack_id' => $customer->getIdPack(),
];
}
public function getRightMenuData(?Customer $loggedUser): array
{
$data = [];
if ($loggedUser) {
$data['link'] = $this->controlPanelLinkGenerator->getControlPanelLink();
$data['link_text'] = $this->translator->trans('menu.header.general.right.controlpanel');
}
return $data;
}
}