<?php
namespace App\AtechNet\CoreBundle\Helper\Furbify;
use App\AtechNet\CoreBundle\Entity\Domain;
use App\AtechNet\CoreBundle\Entity\Language;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\Request;
class MultiStore
{
public const CUSTOMER_TYPE_RETAIL = 1;
public const CUSTOMER_TYPE_WHOLESALE = 2;
public const GUEST_CUSTOMER_ID_SK = 29548;
public const GUEST_CUSTOMER_ID_HU = 29549;
public const GUEST_CUSTOMER_ID_CZ = 32742;
public const MINIMAL_LOAN_CETELEM_SK = 100;
public const MINIMAL_LOAN_CETELEM_HU = 10000;
public const MINIMAL_LOAN_QUATRO = 110;
public const BASE_PRICE_GROSS = 'gross';
public const BASE_PRICE_NET = 'net';
private $entityManager;
private $domainId;
private $languageId;
private $localeDomainId;
private $customerTypeId;
private $defaultCountry;
private $defaultLanguageId;
private $defaultLocale;
private $basePrice;
private $languageSwitched = false;
/**
* @param ObjectManager $entityManager
* @param Request $request
*/
public function __construct(ObjectManager $entityManager, Request $request)
{
$this->entityManager = $entityManager;
$this->customerTypeId = self::CUSTOMER_TYPE_RETAIL;
if ($request->getSession()->has('customerTypeId')) {
$this->customerTypeId = (int)$request->getSession()->get('customerTypeId');
}
$this->domainId = 0;
if ($request->getSession()->has('domainId')) {
$this->domainId = (int)$request->getSession()->get('domainId');
}
$this->languageId = 0;
if ($request->getSession()->has('languageId')) {
$this->languageId = (int)$request->getSession()->get('languageId');
}
$this->localeDomainId = 0;
if ($request->getSession()->has('localeDomainId')) {
$this->localeDomainId = (int)$request->getSession()->get('localeDomainId');
}
$this->defaultCountry = '';
if ($request->getSession()->has('defaultCountry')) {
$this->defaultCountry = $request->getSession()->get('defaultCountry');
}
$this->defaultLanguageId = '';
if ($request->getSession()->has('defaultLanguageId')) {
$this->defaultLanguageId = $request->getSession()->get('defaultLanguageId');
}
$this->defaultLocale = '';
if ($request->getSession()->has('defaultLocale')) {
$this->defaultLocale = $request->getSession()->get('defaultLocale');
}
$this->basePrice = 'gross';
if ($request->getSession()->has('basePrice')) {
$this->basePrice = $request->getSession()->get('basePrice');
}
//-> Switch Language
// Parts of URL
if (!is_null($request->get('slug'))) {
$parts = explode('/', $request->get('slug'));
} else {
$parts = explode('/', ltrim($request->getPathInfo(), '/'));
}
// Language Code
$languageCode = array_shift($parts);
// Language
if (in_array($languageCode, Language::SWITCHABLE_LANGUAGE_CODES)) {
$language = $this->entityManager->getRepository(Language::class)->findOneByCode($languageCode);
if ($language) {
$request->getSession()->set('languageId', $language->getId());
$request->getSession()->set('_locale', $language->getCode());
$request->setLocale($language->getCode());
$this->languageId = (int)$request->getSession()->get('languageId');
MultiStore::setLocalDomain($request);
}
}
// State
if ($this->languageId !== $this->defaultLanguageId) {
$this->languageSwitched = true;
}
//<- Switched Language
}
/**
* @return int
*/
public function getDomainId(): int
{
return $this->domainId;
}
/**
* @return null|Domain
*/
public function getDomain(): ?Domain
{
return $this->entityManager->getRepository(Domain::class)->findOneById($this->domainId);
}
/**
* @param Request $request
*/
public static function setDomain(Request $request)
{
$request->getSession()->set(
'domainId',
self::defineDomainId($request->getSession()->get('customerTypeId'), $request->getHost())
);
}
/**
* @param int $customerType
* @param string $host
* @return int
*/
public static function defineDomainId($customerType, $host)
{
if ($customerType == self::CUSTOMER_TYPE_RETAIL) {
switch ($host) {
case 'furbify':
case 'furbify.sk':
case 'www.furbify.sk':
case 'furbify.dev.sk':
case 'www.furbify.dev.sk':
case 'dev66.furbify.sk':
case 'www.dev66.furbify.sk':
case 'furbify-staging.lacne-pc.sk':
case 'lacne-pc.sk':
case 'localhost':
$domainId = Domain::DOMAIN_ID_RT_SK;
break;
case 'furbify.hu':
case 'www.furbify.hu':
case 'furbify.dev.hu':
case 'www.furbify.dev.hu':
case 'dev66.furbify.hu':
case 'www.dev66.furbify.hu':
$domainId = Domain::DOMAIN_ID_RT_HU;
break;
case 'furbify.cz':
case 'www.furbify.cz':
case 'furbify.dev.cz':
case 'www.furbify.dev.cz':
case 'dev66.furbify.cz':
case 'www.dev66.furbify.cz':
$domainId = Domain::DOMAIN_ID_RT_CZ;
break;
case 'furbify.eu':
case 'www.furbify.eu':
case 'furbify.dev.eu':
case 'www.furbify.dev.eu':
case 'dev66.furbify.eu':
case 'www.dev66.furbify.eu':
$domainId = Domain::DOMAIN_ID_RT_EU;
break;
default:
$domainId = Domain::DOMAIN_ID_RT_EU;
}
} else {
switch ($host) {
case 'furbify':
case 'furbify.sk':
case 'www.furbify.sk':
case 'furbify.dev.sk':
case 'www.furbify.dev.sk':
case 'dev66.furbify.sk':
case 'www.dev66.furbify.sk':
case 'furbify-staging.lacne-pc.sk':
case 'lacne-pc.sk':
case 'localhost':
$domainId = Domain::DOMAIN_ID_WS_SK;
break;
case 'furbify.hu':
case 'www.furbify.hu':
case 'furbify.dev.hu':
case 'www.furbify.dev.hu':
case 'dev66.furbify.hu':
case 'www.dev66.furbify.hu':
$domainId = Domain::DOMAIN_ID_WS_HU;
break;
case 'furbify.cz':
case 'www.furbify.cz':
case 'furbify.dev.cz':
case 'www.furbify.dev.cz':
case 'dev66.furbify.cz':
case 'www.dev66.furbify.cz':
$domainId = Domain::DOMAIN_ID_WS_CZ;
break;
case 'furbify.eu':
case 'www.furbify.eu':
case 'furbify.dev.eu':
case 'www.furbify.dev.eu':
case 'dev66.furbify.eu':
case 'www.dev66.furbify.eu':
$domainId = Domain::DOMAIN_ID_WS_EU;
break;
default:
$domainId = Domain::DOMAIN_ID_WS_EU;
}
}
return $domainId;
}
/**
* @return int
*/
public function getLanguageId()
{
return $this->languageId;
}
/**
* @return null|Language
*/
public function getLanguage()
{
$language = $this->entityManager->getRepository(Language::class)->findOneById($this->languageId);
return $language ? $language : null;
}
/**
* @return int
*/
public function getDefaultLanguageId()
{
return $this->defaultLanguageId;
}
/**
* @return null|Language
*/
public function getDefaultLanguage()
{
$language = $this->entityManager->getRepository(Language::class)->findOneById($this->defaultLanguageId);
return $language ? $language : null;
}
/**
* @return string
*/
public function getDefaultLocale(): string
{
if (empty($this->defaultLocale)) {
$this->defaultLocale = $this->setDefaultLocale();
}
return $this->defaultLocale;
}
private function setDefaultLocale()
{
switch ($this->domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
return 'sk';
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
return 'hu';
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
return 'cz';
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
return 'en';
default:
return 'en';
}
}
/**
* @param Request $request
*/
public static function setDefaultLanguage(Request $request)
{
switch ($request->getHost()) {
case 'furbify':
case 'localhost':
case 'furbify.sk':
case 'www.furbify.sk':
case 'dev66.furbify.sk':
case 'www.dev66.furbify.sk':
case 'furbify.dev.sk':
case 'www.furbify.dev.sk':
case 'furbify-staging.lacne-pc.sk':
case 'lacne-pc.sk':
$locale = 'sk';
$languageId = Language::LANGUAGE_ID_SK;
break;
case 'furbify.hu':
case 'www.furbify.hu':
case 'dev66.furbify.hu':
case 'www.dev66.furbify.hu':
case 'furbify.dev.hu':
case 'www.furbify.dev.hu':
$locale = 'hu';
$languageId = Language::LANGUAGE_ID_HU;
break;
case 'furbify.cz':
case 'www.furbify.cz':
case 'dev66.furbify.cz':
case 'www.dev66.furbify.cz':
case 'furbify.dev.cz':
case 'www.furbify.dev.cz':
$locale = 'cz';
$languageId = Language::LANGUAGE_ID_CZ;
break;
case 'furbify.eu':
case 'www.furbify.eu':
case 'dev66.furbify.eu':
case 'www.dev66.furbify.eu':
case 'furbify.dev.eu':
case 'www.furbify.dev.eu':
$locale = 'en';
$languageId = Language::LANGUAGE_ID_EN;
break;
default:
$locale = 'en';
$languageId = Language::LANGUAGE_ID_EN;
}
// Set default language & locale based on domain
$request->getSession()->set('defaultLanguageId', $languageId);
$request->getSession()->set('defaultLocale', $locale);
}
/**
* @param Request $request
*/
public static function setLanguage(Request $request)
{
// Check route parameters for user localisation settings
$routeParams = $request->get('_route_params');
if (isset($routeParams['_locale'])) {
$userLocale = $routeParams['_locale'];
} else {
$userLocale = '';
}
switch ($userLocale) {
// Use language & locale based on user localisation settings
case 'sk':
$request->getSession()->set('_locale', $userLocale);
$request->getSession()->set('languageId', Language::LANGUAGE_ID_SK);
$request->setLocale($userLocale);
break;
case 'hu':
$request->getSession()->set('_locale', $userLocale);
$request->getSession()->set('languageId', Language::LANGUAGE_ID_HU);
$request->setLocale($userLocale);
break;
case 'cz':
$request->getSession()->set('_locale', $userLocale);
$request->getSession()->set('languageId', Language::LANGUAGE_ID_CZ);
$request->setLocale($userLocale);
break;
case 'en':
$request->getSession()->set('_locale', $userLocale);
$request->getSession()->set('languageId', Language::LANGUAGE_ID_EN);
$request->setLocale($userLocale);
break;
// Use default language & locale if user localisation settings is not found
default:
$request->getSession()->set('_locale', $request->getSession()->get('defaultLocale'));
$request->getSession()->set('languageId', $request->getSession()->get('defaultLanguageId'));
$request->setLocale($request->getSession()->get('defaultLocale'));
break;
}
}
/**
* @return int
*/
public function getLocaleDomainId(): int
{
return $this->localeDomainId;
}
/**
* @return null|Domain
*/
public function getLocaleDomain(): ?Domain
{
return $this->entityManager->getRepository(Domain::class)->findOneById($this->localeDomainId);
}
/**
* @param Request $request
*/
public static function setLocalDomain(Request $request)
{
$locale = $request->getLocale();
if ($request->getSession()->get('customerTypeId') == self::CUSTOMER_TYPE_RETAIL) {
switch ($locale) {
case '1':
case 'sk':
$domainId = Domain::DOMAIN_ID_RT_SK;
break;
case '2':
case 'hu':
$domainId = Domain::DOMAIN_ID_RT_HU;
break;
case '3':
case 'cz':
$domainId = Domain::DOMAIN_ID_RT_CZ;
break;
case '4':
case 'en':
$domainId = Domain::DOMAIN_ID_RT_EU;
break;
default:
$domainId = Domain::DOMAIN_ID_RT_EU;
}
} else {
switch ($locale) {
case '1':
case 'sk':
$domainId = Domain::DOMAIN_ID_WS_SK;
break;
case '2':
case 'hu':
$domainId = Domain::DOMAIN_ID_WS_HU;
break;
case '3':
case 'cz':
$domainId = Domain::DOMAIN_ID_WS_CZ;
break;
case '4':
case 'en':
$domainId = Domain::DOMAIN_ID_WS_EU;
break;
default:
$domainId = Domain::DOMAIN_ID_WS_EU;
}
}
$request->getSession()->set('localeDomainId', $domainId);
}
/**
* @return int
*/
public function getCustomerTypeId(): int
{
return $this->customerTypeId;
}
/**
* @param Request $request
* @param int $customerTypeId
*/
public static function setCustomerType(Request $request, int $customerTypeId = self::CUSTOMER_TYPE_RETAIL)
{
$request->getSession()->set('customerTypeId', $customerTypeId);
}
/**
* @return string
*/
public function getDefaultCountry(): string
{
return $this->defaultCountry;
}
/**
* @param Request $request
*/
public static function setDefaultCountry(Request $request)
{
switch ($request->getHost()) {
case 'furbify':
case 'furbify.sk':
case 'www.furbify.sk':
case 'furbify.dev.sk':
case 'www.furbify.dev.sk':
case 'frb.sk':
case 'www.frb.sk':
case 'furbify-staging.lacne-pc.sk':
case 'lacne-pc.sk':
case 'localhost':
$defaultCountry = 'SK';
break;
case 'furbify.hu':
case 'www.furbify.hu':
case 'furbify.dev.hu':
case 'www.furbify.dev.hu':
$defaultCountry = 'HU';
break;
case 'furbify.cz':
case 'www.furbify.cz':
case 'furbify.dev.cz':
case 'www.furbify.dev.cz':
$defaultCountry = 'CZ';
break;
case 'furbify.eu':
case 'www.furbify.eu':
case 'furbify.dev.eu':
case 'www.furbify.dev.eu':
$defaultCountry = 'SK';
break;
default:
$defaultCountry = 'SK';
}
$request->getSession()->set('defaultCountry', $defaultCountry);
}
/**
* @return array
*/
public static function getRetailDomainIDs(): array
{
return [
Domain::DOMAIN_ID_RT_SK,
Domain::DOMAIN_ID_RT_HU,
Domain::DOMAIN_ID_RT_CZ,
Domain::DOMAIN_ID_RT_EU,
];
}
/**
* @return array
*/
public static function getWholesaleDomainIDs(): array
{
return [
Domain::DOMAIN_ID_WS_SK,
Domain::DOMAIN_ID_WS_HU,
Domain::DOMAIN_ID_WS_CZ,
Domain::DOMAIN_ID_WS_EU,
];
}
/**
* @param string $pageLang
* @return string
*/
public static function getBCP47LanguageCode(string $pageLang): string
{
$result = '';
switch ($pageLang) {
case 'cz':
$result = "cs-CZ";
break;
case 'en':
$result = "en-US";
break;
case 'hu':
$result = "hu-HU";
break;
case 'sk':
$result = "sk-SK";
break;
}
return $result;
}
/**
* @return null|Domain
*/
public function getRetailDomainByWholesaleDomain(): ?Domain
{
$domainId = 0;
if ($this->customerTypeId == self::CUSTOMER_TYPE_WHOLESALE) {
if ($this->domainId == Domain::DOMAIN_ID_WS_SK) {
$domainId = Domain::DOMAIN_ID_RT_SK;
} elseif ($this->domainId == Domain::DOMAIN_ID_WS_HU) {
$domainId = Domain::DOMAIN_ID_RT_HU;
} elseif ($this->domainId == Domain::DOMAIN_ID_WS_CZ) {
$domainId = Domain::DOMAIN_ID_RT_CZ;
} elseif ($this->domainId == Domain::DOMAIN_ID_WS_EU) {
$domainId = Domain::DOMAIN_ID_RT_EU;
}
}
return $this->entityManager->getRepository(Domain::class)->findOneById($domainId);
}
/**
* @param int $domainId
* @return int
*/
public function getBlogCategoryIdByDomainId(int $domainId): int
{
$blogCategoryId = 0;
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
$blogCategoryId = 3;
break;
case Domain::DOMAIN_ID_WS_SK:
$blogCategoryId = 252;
break;
case Domain::DOMAIN_ID_RT_HU:
$blogCategoryId = 77;
break;
case Domain::DOMAIN_ID_WS_HU:
$blogCategoryId = 253;
break;
case Domain::DOMAIN_ID_RT_CZ:
$blogCategoryId = 169;
break;
case Domain::DOMAIN_ID_WS_CZ:
$blogCategoryId = 254;
break;
}
return $blogCategoryId;
}
/**
* @return string
*/
public function getBasePrice(): string
{
return $this->basePrice;
}
/**
* @param Request $request
*/
public static function setBasePrice(Request $request)
{
if (in_array($request->getSession()->get('domainId'), [Domain::DOMAIN_ID_WS_SK, Domain::DOMAIN_ID_WS_CZ, Domain::DOMAIN_ID_WS_EU, Domain::DOMAIN_ID_WS_HU])) {
$request->getSession()->set('basePrice', self::BASE_PRICE_NET);
} else {
$request->getSession()->set('basePrice', self::BASE_PRICE_GROSS);
}
}
/**
* @param int $domainId
* @return int
*/
public function getLanguageIdByDomainId(int $domainId): int
{
switch ($domainId) {
case Domain::DOMAIN_ID_RT_SK:
case Domain::DOMAIN_ID_WS_SK:
return Language::LANGUAGE_ID_SK;
case Domain::DOMAIN_ID_RT_HU:
case Domain::DOMAIN_ID_WS_HU:
return Language::LANGUAGE_ID_HU;
case Domain::DOMAIN_ID_RT_CZ:
case Domain::DOMAIN_ID_WS_CZ:
return Language::LANGUAGE_ID_CZ;
case Domain::DOMAIN_ID_RT_EU:
case Domain::DOMAIN_ID_WS_EU:
return Language::LANGUAGE_ID_EN;
}
return Language::LANGUAGE_ID_EN;
}
/**
* @param bool $state
*/
public function setLanguageSwitched(bool $state)
{
$this->languageSwitched = $state;
}
/**
* @return bool
*/
public function isLanguageSwitched(): bool
{
return $this->languageSwitched;
}
}