<?php
namespace App\EventSubscriber;
use App\Controller\Site_web\ApiFactoryInterfaceController;
use App\Controller\TokenAuthenticatedController;
use App\Entity\Webfactory\WebfactoryPage;
use App\Entity\Webfactory\WebfactoryWidget;
use App\Entity\Webfactory\Widget\GeneralWidget;
use App\Manager\DatasProgress;
use App\Manager\QueryProgress;
use App\Manager\Webfactory\WebfactoryManager;
use App\Manager\WsProgressManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
class ApiFactorySubscriber implements EventSubscriberInterface
{
private int $nbWidget = 5;
public function __construct(
private readonly WsProgressManager $wsProgressManager,
private readonly WebfactoryManager $webfactoryManager,
private readonly SessionInterface $session,
private readonly Security $security,
private readonly EntityManagerInterface $entityManager,
private readonly DatasProgress $datasProgress
)
{
}
public function getNbWidgetByContrat(): void
{
$kAdherent = $this->security->getUser()->getKAdherent();
$contrat = $this->webfactoryManager->getContratFactory($kAdherent);
$this->wsProgressManager->selectTenant($kAdherent);
if (isset($contrat['K_TYPE_CONTRAT'])) {
$type = str_replace("CTSDLO_", "", $contrat['K_TYPE_CONTRAT']);
$exFitting = ['FT01', 'FT02', 'FT03', 'FT04', 'FT05', 'FT06', 'ALL02', 'ALL03'];
if (in_array($type, $exFitting) || $contrat['K_TYPE_CONTRAT'] == "CTSDLO_FAC") {
$query = (new QueryProgress("adh_contrat_param"))
->where("K_ADH_CONTRAT", "=", $contrat['K_ADH_CONTRAT'])
->andWhere("K_ADH_CONTRAT_PARAM", "=", 'NOMBREWIDGETS');
$contratParams = $this->wsProgressManager->findOneBy($query);
if (!empty($contratParams)) {
$this->nbWidget = intval($contratParams['VAL']);
} else {
$this->nbWidget = 5;
}
}
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => [['onKernelController', 33]],
];
}
public function onKernelController(ControllerEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof ApiFactoryInterfaceController) {
$this->getNbWidgetByContrat();
$user = $this->security->getUser();
$config = $this->webfactoryManager->getFactoryConfig($user->getKAdherent());
if ((is_countable($config) ? count($config) : 0) != 0 && $config['offer']['name'] != 'Offre Landing page') {
$dateUpdateConfigFactory = new \DateTime($config['updated_at']);
if (!$this->session->has('webfactory') || (empty($this->session->get('webfactory'))) || (array_key_exists('session_updated_at', $this->session->get('webfactory')) && $dateUpdateConfigFactory > $this->session->get('webfactory')['session_updated_at']) || ($this->session->get('webfactory')['adherent'] != $user->getKADHERENT())) {
$domains = $this->getUrlsMagasin($config);
$multiLang = [];
foreach ($config['shop_domains'] as $domain) {
if (!in_array($domain['language'], $multiLang)) {
$multiLang[] = $domain['language'];
}
}
$multiLang = (count($multiLang) >= 2 || !empty($multiLang) && strtoupper($multiLang[0]) == "NL");
// Parcours des pages pour rechercher les widgets active
// On ajoute aussi la liste des widgets dans un tableau pour avec une liste distinct des widgets
$widgetList = [];
$pages = [];
$accessPersonnalPages = ['access' => false, 'page_id' => ''];
foreach ($config['pages'] as $key => $page) {
if ($page['identifier'] !== "renouvellement_lentilles") {
if (strtolower($page['identifier']) === 'personal_pages' && $page['active']) {
$accessPersonnalPages['access'] = true;
$accessPersonnalPages['page_id'] = 'personal_pages';
}
$pages[$page['id']] = $this->entityManager->getRepository(WebfactoryPage::class)->find(['identifier' => $page['identifier']]);
$widgets = $page['widgets'];
// Gestion des pages
$widgetTab = [];
foreach ($widgets as $widget) {
$widgetActive = $widget['active'];
$widget = $this->entityManager->getRepository(WebfactoryWidget::class)->find($widget['identifier']);
if (!empty($widget)) {
$widgetTab[$widget->getIdentifier()] = $widget;
if ($page['active'] && $widgetActive) {
$widget->addPage(['id' => $page['id'], 'name' => $page['name'], 'identifier' => $page['identifier'], 'editable' => $pages[$page['id']]->getEditable()]);
$widgetList[$widget->getIdentifier()] = $widget;
}
}
}
$pages[$page['id']]->setWidgets($widgetTab);
$pages[$page['id']]->setActive($page['active']);
} else {
unset($config['pages'][$key]);
}
}
// Classement des pages par ordre
uasort($pages, fn($a, $b) => $a->getOrdre() > $b->getOrdre());
// Check si l'adhérent est présent sur OPC
// $onOpc = $this->datasProgress->existOnOpc($user->getKAdherent());
$datas = [];
// if ($onOpc) {
$cityAdh = strtolower(mb_strtoupper(str_replace(' ', '-', $user->getVille())));
$nameAdh = strtolower(mb_strtoupper(str_replace(' ', '-', $user->getLib())));
$opcUrl = $cityAdh . "/" . $nameAdh;
// Conversion DOM-TOM en FR
$array_fr_tab = ['FR', 'F', 'RE', 'GP', 'PF', 'MQ', 'PM', 'GF', 'MF', 'YT', 'MYT', 'NC'];
$pays = (in_array(strtoupper($user->getPays()), $array_fr_tab)) ? 'FR' : $user->getPays();
switch ($pays) {
case 'FR':
$datas['fr'] = [
'label' => 'Opticiens par conviction',
'url' => 'https://www.opticiensparconviction.fr/votre-opticien-a-' . $opcUrl
];
break;
case 'BE':
$datas['fr'] = [
'label' => 'Opticiens zero-concession',
'url' => 'https://www.opticiens-oc.be/votre-opticien-a-' . $opcUrl
];
$datas['nl'] = [
'label' => 'Opticiens zero-concession',
'url' => 'https://www.opticiens-oc.be/nl/uw-opticien-in-' . $opcUrl
];
break;
}
// Controle des widgets
$this->checkGeneralWidget($user, $config, $widgetList);
// Controle pour les articles
$articlesCheck = [
'custom' => 0,
'library' => 0
];
switch ($config['offer']['name']) {
case (preg_match("/(?i)présence/", $config['offer']['name']) ? true : false):
// Présence
$articlesCheck = [
'custom' => 0,
'library' => 0
];
break;
case (preg_match("/(?i)vitrine/", $config['offer']['name']) ? true : false):
// Vitrine
$articlesCheck = [
'custom' => 0,
'library' => 3
];
break;
case (preg_match("/(?i)tremplin/", $config['offer']['name']) ? true : false):
// Tremplin
$articlesCheck = [
'custom' => 'unlimited',
'library' => 3
];
break;
case (preg_match("/(?i)essayage/", $config['offer']['name']) ? true : false):
// Essayage
$articlesCheck = [
'custom' => 'unlimited',
'library' => 5
];
break;
case (preg_match("/(?i)main/", $config['offer']['name']) ? true : false):
// Clé en main
$articlesCheck = [
'custom' => 'unlimited',
'library' => 10
];
break;
case (preg_match("/(?i)référencement/", $config['offer']['name']) ? true : false):
// Référencement
$articlesCheck = [
'custom' => 'unlimited',
'library' => 10
];
break;
}
if (in_array($user->getKAdherent(), ['C9920', 'B9920', 'B9921', 'R9920', 'L9920'])) {
$articlesCheck = [
'custom' => 'unlimited',
'library' => 3
];
}
// Ajout en session
$this->session->set('webfactory', [
'adherent' => $user->getKADHERENT(),
'pages' => $pages,
'widgets' => $widgetList,
'theme' => $config['offer']['theme']['name'],
'offer' => $config['offer'],
'domains' => $domains,
'multiLang' => $multiLang,
'websites' => $datas,
'nb_widget' => $this->nbWidget,
'articles' => $articlesCheck,
'access_personnal_pages' => $accessPersonnalPages,
'tracking' => [
'gtm_code' => 'GTM-MRVF455',
'axeptio_code' => $config['axeptio_code'],
'piano_identifier' => $config['piano_identifier'],
'advanced_stats' => (in_array($user->getContratSiteWeb()['K_PACK_CONTRAT'], ['SIRE', "SIRE2", 'SIRE3', 'SICM']))
],
'default_lang' => $config['proprietary']['languages'],
'multimag' => (array_key_exists('multimag', $config)) ? $config['multimag'] : [],
'session_updated_at' => new \DateTime('now'),
'styles_predefined' => $config['styles'] ?? ''
]);
}
} else {
$this->session->set('webfactory', []);
}
}
}
/**
* @param $user
* @param $config
* @return void
*/
private function checkGeneralWidget($user, $config, $widgetListAdh = [])
{
$widgetsESV = ['esv', 'deals'];
$widgetsCRM = ['crm_reviews'];
$baseWidgets = ['hours', 'contact', 'social_networks', 'news'];
$fittingWidget = ['virtual_fitting'];
$theme = ucfirst($config['offer']['theme']['name']);
$generalWidgets = $this->entityManager->getRepository(WebfactoryWidget::class)->widgetShouldBeGenerate($user->getKAdherent());
foreach ($generalWidgets as $widget) {
$widgetGeneral = $this->entityManager->getRepository(GeneralWidget::class)->findOneBy([
'identifier' => $widget->getIdentifier(),
'magasin' => $user->getKAdherent(),
'theme' => $theme,
'lang' => 'fr'
]);
$widgetGeneralNl = $this->entityManager->getRepository(GeneralWidget::class)->findOneBy([
'identifier' => $widget->getIdentifier(),
'magasin' => $user->getKAdherent(),
'theme' => $theme,
'lang' => 'nl'
]);
$cloneWigetG = new GeneralWidget();
$cloneWigetG->setMagasin($user->getMagasin());
$cloneWigetG->setTheme($theme);
$cloneWigetG->setWidget($widget);
$cloneWigetG->setIdentifier($widget->getIdentifier());
$cloneWigetG->setName($widget->getName());
if (empty($widgetGeneral)) {
$widgetGeneral = clone $cloneWigetG;
$widgetGeneral->setLang('fr');
}
if (empty($widgetGeneralNl) && (!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL"))) {
$widgetGeneralNl = clone $cloneWigetG;
$widgetGeneralNl->setLang('nl');
}
if (in_array($widget->getIdentifier(), $widgetsESV)) {
if ($user->getESV() == true) {
if ($widget->getIdentifier() !== "deals" || ($widget->getIdentifier() == "deals" && strtoupper($user->getPays()) == "FR")) {
$this->entityManager->persist($widgetGeneral);
(!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->persist($widgetGeneralNl) : "";
}
} else {
$this->entityManager->remove($widgetGeneral);
(!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->remove($widgetGeneralNl) : "";
}
}
if (in_array($widget->getIdentifier(), $widgetsCRM)) {
if ($user->getCRM()['access'] == true) {
$this->entityManager->persist($widgetGeneral);
} else {
$this->entityManager->remove($widgetGeneral);
}
}
if (in_array($widget->getIdentifier(), $fittingWidget)) {
if (!empty($config['fittingbox_url'])) {
$this->entityManager->persist($widgetGeneral);
} else {
$this->entityManager->remove($widgetGeneral);
}
}
if (in_array($widget->getIdentifier(), $baseWidgets)) {
if (array_key_exists($widget->getIdentifier(), $widgetListAdh)) {
$this->entityManager->persist($widgetGeneral);
(!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->persist($widgetGeneralNl) : "";
} else {
(!is_null($widgetGeneral)) ? $this->entityManager->remove($widgetGeneral) : null;
(!is_null($widgetGeneralNl)) ? $this->entityManager->remove($widgetGeneralNl) : null;
}
}
}
$this->entityManager->flush();
}
private function getUrlsMagasin($configFactory)
{
$domains = ['default' => null, 'FR' => null, 'NL' => null];
foreach ($configFactory['proprietary']['domains'] as $proprietaryDom) {
if ($proprietaryDom['main']) {
$domains['default'] = (str_starts_with($proprietaryDom['domain'], 'www.')) ? 'https://' . $proprietaryDom['domain'] : 'https://www.' . $proprietaryDom['domain'];
$domains[$configFactory['proprietary']['languages']] = (str_starts_with($proprietaryDom['domain'], 'www.')) ? 'https://' . $proprietaryDom['domain'] : 'https://www.' . $proprietaryDom['domain'];
}
}
if (!empty($configFactory['shop_domains'])) {
foreach ($configFactory['shop_domains'] as $shop_domain) {
if ($shop_domain['type'] == 'sous-dossier') {
if (count($configFactory['shop_domains']) > 1) {
$domains[$shop_domain['language']] = $domains['default'] . '/' . strtolower($shop_domain['language']) . '/' . (empty($shop_domain['domain']) ? $shop_domain['language'] : $shop_domain['domain']) . ((strtolower($shop_domain['language']) == 'fr') ? '/accueil' : '/homepage');
} else {
$domains[$shop_domain['language']] = $domains['default'] . '/' . (empty($shop_domain['domain']) ? $shop_domain['language'] : $shop_domain['domain']) . ((strtolower($shop_domain['language']) == 'fr') ? '/accueil' : '/homepage');
}
} else {
$domains[$shop_domain['language']] = (str_starts_with($shop_domain['domain'], 'www.')) ? 'https://' . $shop_domain['domain'] : 'https://www.' . $shop_domain['domain'];
}
}
}
return $domains;
}
}