src/EventSubscriber/ApiFactorySubscriber.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Controller\Site_web\ApiFactoryInterfaceController;
  4. use App\Controller\TokenAuthenticatedController;
  5. use App\Entity\Webfactory\WebfactoryPage;
  6. use App\Entity\Webfactory\WebfactoryWidget;
  7. use App\Entity\Webfactory\Widget\GeneralWidget;
  8. use App\Manager\DatasProgress;
  9. use App\Manager\QueryProgress;
  10. use App\Manager\Webfactory\WebfactoryManager;
  11. use App\Manager\WsProgressManager;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  16. use Symfony\Component\HttpKernel\KernelEvents;
  17. use Symfony\Component\Security\Core\Security;
  18. class ApiFactorySubscriber implements EventSubscriberInterface
  19. {
  20.     private int $nbWidget 5;
  21.     public function __construct(
  22.         private readonly WsProgressManager      $wsProgressManager,
  23.         private readonly WebfactoryManager      $webfactoryManager,
  24.         private readonly SessionInterface       $session,
  25.         private readonly Security               $security,
  26.         private readonly EntityManagerInterface $entityManager,
  27.         private readonly DatasProgress          $datasProgress
  28.     )
  29.     {
  30.     }
  31.     public function getNbWidgetByContrat(): void
  32.     {
  33.         $kAdherent $this->security->getUser()->getKAdherent();
  34.         $contrat $this->webfactoryManager->getContratFactory($kAdherent);
  35.         $this->wsProgressManager->selectTenant($kAdherent);
  36.         if (isset($contrat['K_TYPE_CONTRAT'])) {
  37.             $type str_replace("CTSDLO_"""$contrat['K_TYPE_CONTRAT']);
  38.             $exFitting = ['FT01''FT02''FT03''FT04''FT05''FT06''ALL02''ALL03'];
  39.             if (in_array($type$exFitting) || $contrat['K_TYPE_CONTRAT'] == "CTSDLO_FAC") {
  40.                 $query = (new QueryProgress("adh_contrat_param"))
  41.                     ->where("K_ADH_CONTRAT""="$contrat['K_ADH_CONTRAT'])
  42.                     ->andWhere("K_ADH_CONTRAT_PARAM""="'NOMBREWIDGETS');
  43.                 $contratParams $this->wsProgressManager->findOneBy($query);
  44.                 if (!empty($contratParams)) {
  45.                     $this->nbWidget intval($contratParams['VAL']);
  46.                 } else {
  47.                     $this->nbWidget 5;
  48.                 }
  49.             }
  50.         }
  51.     }
  52.     public static function getSubscribedEvents()
  53.     {
  54.         return [
  55.             KernelEvents::CONTROLLER => [['onKernelController'33]],
  56.         ];
  57.     }
  58.     public function onKernelController(ControllerEvent $event): void
  59.     {
  60.         if (!$event->isMainRequest()) {
  61.             return;
  62.         }
  63.         $controller $event->getController();
  64.         if (is_array($controller)) {
  65.             $controller $controller[0];
  66.         }
  67.         if ($controller instanceof ApiFactoryInterfaceController) {
  68.             $this->getNbWidgetByContrat();
  69.             $user $this->security->getUser();
  70.             $config $this->webfactoryManager->getFactoryConfig($user->getKAdherent());
  71.             if ((is_countable($config) ? count($config) : 0) != && $config['offer']['name'] != 'Offre Landing page') {
  72.                 $dateUpdateConfigFactory = new \DateTime($config['updated_at']);
  73.                 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())) {
  74.                     $domains $this->getUrlsMagasin($config);
  75.                     $multiLang = [];
  76.                     foreach ($config['shop_domains'] as $domain) {
  77.                         if (!in_array($domain['language'], $multiLang)) {
  78.                             $multiLang[] = $domain['language'];
  79.                         }
  80.                     }
  81.                     $multiLang = (count($multiLang) >= || !empty($multiLang) && strtoupper($multiLang[0]) == "NL");
  82.                     // Parcours des pages pour rechercher les widgets active
  83.                     // On ajoute aussi la liste des widgets dans un tableau pour avec une liste distinct des widgets
  84.                     $widgetList = [];
  85.                     $pages = [];
  86.                     $accessPersonnalPages = ['access' => false'page_id' => ''];
  87.                     foreach ($config['pages'] as $key => $page) {
  88.                         if ($page['identifier'] !== "renouvellement_lentilles") {
  89.                             if (strtolower($page['identifier']) === 'personal_pages' && $page['active']) {
  90.                                 $accessPersonnalPages['access'] = true;
  91.                                 $accessPersonnalPages['page_id'] = 'personal_pages';
  92.                             }
  93.                             $pages[$page['id']] = $this->entityManager->getRepository(WebfactoryPage::class)->find(['identifier' => $page['identifier']]);
  94.                             $widgets $page['widgets'];
  95.                             // Gestion des pages
  96.                             $widgetTab = [];
  97.                             foreach ($widgets as $widget) {
  98.                                 $widgetActive $widget['active'];
  99.                                 $widget $this->entityManager->getRepository(WebfactoryWidget::class)->find($widget['identifier']);
  100.                                 if (!empty($widget)) {
  101.                                     $widgetTab[$widget->getIdentifier()] = $widget;
  102.                                     if ($page['active'] && $widgetActive) {
  103.                                         $widget->addPage(['id' => $page['id'], 'name' => $page['name'], 'identifier' => $page['identifier'], 'editable' => $pages[$page['id']]->getEditable()]);
  104.                                         $widgetList[$widget->getIdentifier()] = $widget;
  105.                                     }
  106.                                 }
  107.                             }
  108.                             $pages[$page['id']]->setWidgets($widgetTab);
  109.                             $pages[$page['id']]->setActive($page['active']);
  110.                         } else {
  111.                             unset($config['pages'][$key]);
  112.                         }
  113.                     }
  114.                     // Classement des pages par ordre
  115.                     uasort($pages, fn($a$b) => $a->getOrdre() > $b->getOrdre());
  116.                     // Check si l'adhérent est présent sur OPC
  117. //                $onOpc = $this->datasProgress->existOnOpc($user->getKAdherent());
  118.                     $datas = [];
  119.                     // if ($onOpc) {
  120.                     $cityAdh strtolower(mb_strtoupper(str_replace(' ''-'$user->getVille())));
  121.                     $nameAdh strtolower(mb_strtoupper(str_replace(' ''-'$user->getLib())));
  122.                     $opcUrl $cityAdh "/" $nameAdh;
  123.                     // Conversion DOM-TOM en FR
  124.                     $array_fr_tab = ['FR''F''RE''GP''PF''MQ''PM''GF''MF''YT''MYT''NC'];
  125.                     $pays = (in_array(strtoupper($user->getPays()), $array_fr_tab)) ? 'FR' $user->getPays();
  126.                     switch ($pays) {
  127.                         case 'FR':
  128.                             $datas['fr'] = [
  129.                                 'label' => 'Opticiens par conviction',
  130.                                 'url' => 'https://www.opticiensparconviction.fr/votre-opticien-a-' $opcUrl
  131.                             ];
  132.                             break;
  133.                         case 'BE':
  134.                             $datas['fr'] = [
  135.                                 'label' => 'Opticiens zero-concession',
  136.                                 'url' => 'https://www.opticiens-oc.be/votre-opticien-a-' $opcUrl
  137.                             ];
  138.                             $datas['nl'] = [
  139.                                 'label' => 'Opticiens zero-concession',
  140.                                 'url' => 'https://www.opticiens-oc.be/nl/uw-opticien-in-' $opcUrl
  141.                             ];
  142.                             break;
  143.                     }
  144.                     // Controle des widgets
  145.                     $this->checkGeneralWidget($user$config$widgetList);
  146.                     // Controle pour les articles
  147.                     $articlesCheck = [
  148.                         'custom' => 0,
  149.                         'library' => 0
  150.                     ];
  151.                     switch ($config['offer']['name']) {
  152.                         case (preg_match("/(?i)présence/"$config['offer']['name']) ? true false):
  153.                             // Présence
  154.                             $articlesCheck = [
  155.                                 'custom' => 0,
  156.                                 'library' => 0
  157.                             ];
  158.                             break;
  159.                         case (preg_match("/(?i)vitrine/"$config['offer']['name']) ? true false):
  160.                             // Vitrine
  161.                             $articlesCheck = [
  162.                                 'custom' => 0,
  163.                                 'library' => 3
  164.                             ];
  165.                             break;
  166.                         case (preg_match("/(?i)tremplin/"$config['offer']['name']) ? true false):
  167.                             // Tremplin
  168.                             $articlesCheck = [
  169.                                 'custom' => 'unlimited',
  170.                                 'library' => 3
  171.                             ];
  172.                             break;
  173.                         case (preg_match("/(?i)essayage/"$config['offer']['name']) ? true false):
  174.                             // Essayage
  175.                             $articlesCheck = [
  176.                                 'custom' => 'unlimited',
  177.                                 'library' => 5
  178.                             ];
  179.                             break;
  180.                         case (preg_match("/(?i)main/"$config['offer']['name']) ? true false):
  181.                             // Clé en main
  182.                             $articlesCheck = [
  183.                                 'custom' => 'unlimited',
  184.                                 'library' => 10
  185.                             ];
  186.                             break;
  187.                         case (preg_match("/(?i)référencement/"$config['offer']['name']) ? true false):
  188.                             // Référencement
  189.                             $articlesCheck = [
  190.                                 'custom' => 'unlimited',
  191.                                 'library' => 10
  192.                             ];
  193.                             break;
  194.                     }
  195.                     if (in_array($user->getKAdherent(), ['C9920''B9920''B9921''R9920''L9920'])) {
  196.                         $articlesCheck = [
  197.                             'custom' => 'unlimited',
  198.                             'library' => 3
  199.                         ];
  200.                     }
  201.                     // Ajout en session
  202.                     $this->session->set('webfactory', [
  203.                         'adherent' => $user->getKADHERENT(),
  204.                         'pages' => $pages,
  205.                         'widgets' => $widgetList,
  206.                         'theme' => $config['offer']['theme']['name'],
  207.                         'offer' => $config['offer'],
  208.                         'domains' => $domains,
  209.                         'multiLang' => $multiLang,
  210.                         'websites' => $datas,
  211.                         'nb_widget' => $this->nbWidget,
  212.                         'articles' => $articlesCheck,
  213.                         'access_personnal_pages' => $accessPersonnalPages,
  214.                         'tracking' => [
  215.                             'gtm_code' => 'GTM-MRVF455',
  216.                             'axeptio_code' => $config['axeptio_code'],
  217.                             'piano_identifier' => $config['piano_identifier'],
  218.                             'advanced_stats' => (in_array($user->getContratSiteWeb()['K_PACK_CONTRAT'], ['SIRE'"SIRE2"'SIRE3''SICM']))
  219.                         ],
  220.                         'default_lang' => $config['proprietary']['languages'],
  221.                         'multimag' => (array_key_exists('multimag'$config)) ? $config['multimag'] : [],
  222.                         'session_updated_at' => new \DateTime('now'),
  223.                         'styles_predefined' => $config['styles'] ?? ''
  224.                     ]);
  225.                 }
  226.             } else {
  227.                 $this->session->set('webfactory', []);
  228.             }
  229.         }
  230.     }
  231.     /**
  232.      * @param $user
  233.      * @param $config
  234.      * @return void
  235.      */
  236.     private function checkGeneralWidget($user$config$widgetListAdh = [])
  237.     {
  238.         $widgetsESV = ['esv''deals'];
  239.         $widgetsCRM = ['crm_reviews'];
  240.         $baseWidgets = ['hours''contact''social_networks''news'];
  241.         $fittingWidget = ['virtual_fitting'];
  242.         $theme ucfirst($config['offer']['theme']['name']);
  243.         $generalWidgets $this->entityManager->getRepository(WebfactoryWidget::class)->widgetShouldBeGenerate($user->getKAdherent());
  244.         foreach ($generalWidgets as $widget) {
  245.             $widgetGeneral $this->entityManager->getRepository(GeneralWidget::class)->findOneBy([
  246.                 'identifier' => $widget->getIdentifier(),
  247.                 'magasin' => $user->getKAdherent(),
  248.                 'theme' => $theme,
  249.                 'lang' => 'fr'
  250.             ]);
  251.             $widgetGeneralNl $this->entityManager->getRepository(GeneralWidget::class)->findOneBy([
  252.                 'identifier' => $widget->getIdentifier(),
  253.                 'magasin' => $user->getKAdherent(),
  254.                 'theme' => $theme,
  255.                 'lang' => 'nl'
  256.             ]);
  257.             $cloneWigetG = new GeneralWidget();
  258.             $cloneWigetG->setMagasin($user->getMagasin());
  259.             $cloneWigetG->setTheme($theme);
  260.             $cloneWigetG->setWidget($widget);
  261.             $cloneWigetG->setIdentifier($widget->getIdentifier());
  262.             $cloneWigetG->setName($widget->getName());
  263.             if (empty($widgetGeneral)) {
  264.                 $widgetGeneral = clone $cloneWigetG;
  265.                 $widgetGeneral->setLang('fr');
  266.             }
  267.             if (empty($widgetGeneralNl) && (!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL"))) {
  268.                 $widgetGeneralNl = clone $cloneWigetG;
  269.                 $widgetGeneralNl->setLang('nl');
  270.             }
  271.             if (in_array($widget->getIdentifier(), $widgetsESV)) {
  272.                 if ($user->getESV() == true) {
  273.                     if ($widget->getIdentifier() !== "deals" || ($widget->getIdentifier() == "deals" && strtoupper($user->getPays()) == "FR")) {
  274.                         $this->entityManager->persist($widgetGeneral);
  275.                         (!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->persist($widgetGeneralNl) : "";
  276.                     }
  277.                 } else {
  278.                     $this->entityManager->remove($widgetGeneral);
  279.                     (!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->remove($widgetGeneralNl) : "";
  280.                 }
  281.             }
  282.             if (in_array($widget->getIdentifier(), $widgetsCRM)) {
  283.                 if ($user->getCRM()['access'] == true) {
  284.                     $this->entityManager->persist($widgetGeneral);
  285.                 } else {
  286.                     $this->entityManager->remove($widgetGeneral);
  287.                 }
  288.             }
  289.             if (in_array($widget->getIdentifier(), $fittingWidget)) {
  290.                 if (!empty($config['fittingbox_url'])) {
  291.                     $this->entityManager->persist($widgetGeneral);
  292.                 } else {
  293.                     $this->entityManager->remove($widgetGeneral);
  294.                 }
  295.             }
  296.             if (in_array($widget->getIdentifier(), $baseWidgets)) {
  297.                 if (array_key_exists($widget->getIdentifier(), $widgetListAdh)) {
  298.                     $this->entityManager->persist($widgetGeneral);
  299.                     (!empty($this->session->get('webfactory')) && ($this->session->get('webfactory')["multiLang"] || strtoupper($this->session->get('webfactory')["default_lang"]) === "NL")) ? $this->entityManager->persist($widgetGeneralNl) : "";
  300.                 } else {
  301.                     (!is_null($widgetGeneral)) ? $this->entityManager->remove($widgetGeneral) : null;
  302.                     (!is_null($widgetGeneralNl)) ? $this->entityManager->remove($widgetGeneralNl) : null;
  303.                 }
  304.             }
  305.         }
  306.         $this->entityManager->flush();
  307.     }
  308.     private function getUrlsMagasin($configFactory)
  309.     {
  310.         $domains = ['default' => null'FR' => null'NL' => null];
  311.         foreach ($configFactory['proprietary']['domains'] as $proprietaryDom) {
  312.             if ($proprietaryDom['main']) {
  313.                 $domains['default'] = (str_starts_with($proprietaryDom['domain'], 'www.')) ? 'https://' $proprietaryDom['domain'] : 'https://www.' $proprietaryDom['domain'];
  314.                 $domains[$configFactory['proprietary']['languages']] = (str_starts_with($proprietaryDom['domain'], 'www.')) ? 'https://' $proprietaryDom['domain'] : 'https://www.' $proprietaryDom['domain'];
  315.             }
  316.         }
  317.         if (!empty($configFactory['shop_domains'])) {
  318.             foreach ($configFactory['shop_domains'] as $shop_domain) {
  319.                 if ($shop_domain['type'] == 'sous-dossier') {
  320.                     if (count($configFactory['shop_domains']) > 1) {
  321.                         $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');
  322.                     } else {
  323.                         $domains[$shop_domain['language']] = $domains['default'] . '/' . (empty($shop_domain['domain']) ? $shop_domain['language'] : $shop_domain['domain']) . ((strtolower($shop_domain['language']) == 'fr') ? '/accueil' '/homepage');
  324.                     }
  325.                 } else {
  326.                     $domains[$shop_domain['language']] = (str_starts_with($shop_domain['domain'], 'www.')) ? 'https://' $shop_domain['domain'] : 'https://www.' $shop_domain['domain'];
  327.                 }
  328.             }
  329.         }
  330.         return $domains;
  331.     }
  332. }