src/Controller/Buzz/IndexController.php line 711

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * @author Mehrez Labidi
  5.  */
  6. namespace App\Controller\Buzz;
  7. use App\Helper\Utils;
  8. use App\Services\MetaTag;
  9. use App\Services\Buzz\CanonicalUrlService;
  10. use App\Services\Buzz\BuzzIndexPageProvider;
  11. use App\Services\LangCodePaysHandler;
  12. use App\Controller\EntityUsingController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use App\Repository\Buzz\BuzzActualitesRepository;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use App\Entity\{
  19.     Societes,
  20.     Utilisateur,
  21.     BuzzLiensNewsletter,
  22.     UtilisateursNewsletter,
  23.     InteractionUtilisateur
  24. };
  25. use App\Entity\SocietesPrestataire;
  26. use App\Services\ManagerEntity\DroitsAccesManagers;
  27. use App\Form\Type\Buzz\SendActualiteType;
  28. class IndexController extends EntityUsingController {
  29.     public const MAX_AGE 43200// 12heures
  30.     private LangCodePaysHandler $codePaysHandler;
  31.     private BuzzIndexPageProvider $buzzIndexPageProvider;
  32.     private BuzzActualitesRepository $buzzActualitesRepository;
  33.     private CanonicalUrlService $canonicalUrlService;
  34.     /**
  35.      * @param MetaTag $metaTag
  36.      * @param LangCodePaysHandler $codePaysHandler
  37.      * @param BuzzIndexPageProvider $buzzIndexPageProvider
  38.      * @param BuzzActualitesRepository $buzzActualitesRepository
  39.      * @param CanonicalUrlService $canonicalUrlService
  40.      */
  41.     public function __construct(EntityManagerInterface $emMetaTag $metaTagLangCodePaysHandler $codePaysHandlerBuzzIndexPageProvider $buzzIndexPageProviderBuzzActualitesRepository $buzzActualitesRepositoryCanonicalUrlService $canonicalUrlService) {
  42.         $this->em $em;
  43.         $this->metaTag $metaTag;
  44.         $this->codePaysHandler $codePaysHandler;
  45.         $this->buzzIndexPageProvider $buzzIndexPageProvider;
  46.         $this->buzzActualitesRepository $buzzActualitesRepository;
  47.         $this->canonicalUrlService $canonicalUrlService;
  48.     }
  49.     /**
  50.      * Page d'accueil des actualités Buzz
  51.      * @param Request $request
  52.      * @param string $codePays
  53.      * @return Response
  54.      */
  55.     public function index(Request $request$codePays): Response {
  56.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  57.         $canonicalUrl $this->canonicalUrlService->getBuzzIndexCanonical($cleanCodePays);
  58.         $metaTag $this->metaTag
  59.                 ->setTitle("Toute l'actualité des Fusions-Acquisition et du Capital Investissement")
  60.                 ->setDescription("Suivez en temps réel toute l'actualité des Fusions-Acquisition et du Capital Investissement")
  61.                 ->setCanonical($canonicalUrl);
  62.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_index', [], null$cleanCodePays);
  63.         $countriesWithNewLogic = ['ch''ca''be'];
  64.         if (in_array(strtolower($codePays), $countriesWithNewLogic)) {
  65.             $date $request->query->get('date');
  66.             $pageData $this->buzzIndexPageProvider->getPageDataByWeekForCountry($codePays$date);
  67.             $featured = [];
  68.             if (!empty($pageData['first_featured'])) {
  69.                 $ff $pageData['first_featured'];
  70.                 $featured[] = [
  71.                     'id_actualite' => $ff['id_actualite'],
  72.                     'titreActualite' => $ff['titreActualite'] ?? '',
  73.                     'descriptionActualite' => $ff['descriptionActualite'] ?? '',
  74.                     'imgAffichage' => $ff['imgAffichage'] ?? '',
  75.                     'imgAffichageEnError' => $ff['imgAffichageEnError'] ?? ($ff['imgAffichage'] ?? ''),
  76.                     'date_formatee' => $ff['date_formatee'] ?? null,
  77.                     'date_formatee_jour' => $ff['date_formatee_jour'] ?? null,
  78.                     'css_class' => $ff['css_class'] ?? null,
  79.                 ];
  80.             }
  81.             $response $this->render("buzz/index/index_" Utils::codePaysWithoutDash($codePays) . ".html.twig", [
  82.                 'metaTag' => $metaTag,
  83.                 'dateRange' => null,
  84.                 'featuredBlog' => null,
  85.                 'featured' => $featured,
  86.                 'first_featured' => $pageData['first_featured'],
  87.                 'next_articles' => $pageData['next_articles'],
  88.                 'grouped_articles' => $pageData['grouped_articles'],
  89.                 'exclude_ids' => $pageData['exclude_ids'],
  90.                 'derniers_jours' => $pageData['derniers_jours'],
  91.                 'hreflangLinks' => $hreflangLinks,
  92.                 'lastMonthsHavingActu' => $this->buzzIndexPageProvider->getLastMonthsHavingActuForCountry($codePays6),
  93.             ]);
  94.         } else {
  95.             $now = new \DateTimeImmutable();
  96.             $dayOfWeek = (int) $now->format('N');
  97.             $isWeekend = ($dayOfWeek === || $dayOfWeek === 7);
  98.             if ($isWeekend && $codePays === 'fr') {
  99.                 $weekendData $this->buzzIndexPageProvider->getWeekendPageData($codePays);
  100.                 $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  101.                 $codePaysWithUnderScore '_' $cleanCodePays '_';
  102.                 $weekendPageData = [
  103.                     'grouped_articles' => $weekendData['grouped_articles'],
  104.                 ];
  105.                 $displayedArticleIds $this->buzzIndexPageProvider->collectDisplayedArticleIds($weekendPageData);
  106.                 
  107.                 $mostReadRaw $this->buzzActualitesRepository->findMostReadArticlesFromIds($displayedArticleIds5$codePays);
  108.                 $mostReadArticles array_map([$this->buzzIndexPageProvider'formatArticle'], $mostReadRaw);
  109.                 $experts_alaune $this->buzzIndexPageProvider->getExpertsALaUneFromOperations(4'fr');
  110.                 $response $this->render("buzz/index/index_fr.html.twig", [
  111.                     'metaTag' => $metaTag,
  112.                     'is_weekend_mode' => true,
  113.                     'weekend_data' => $weekendData,
  114.                     'grouped_articles' => $weekendData['grouped_articles'],
  115.                     'week_label' => $weekendData['week_label'],
  116.                     'dateRange' => null,
  117.                     'featuredBlog' => null,
  118.                     'first_featured' => null,
  119.                     'next_articles' => [],
  120.                     'exclude_ids' => [],
  121.                     'derniers_jours' => $weekendData['derniers_jours'],
  122.                     'articles_plus_lus' => $mostReadArticles,
  123.                     'experts_alaune' => $experts_alaune,
  124.                     'codePays' => $cleanCodePays,
  125.                     'codePaysWithUnderScore' => $codePaysWithUnderScore,
  126.                     'lang' => 'fr',
  127.                     'currentRoute' => $request->attributes->get('_route'),
  128.                     'hreflangLinks' => $hreflangLinks,
  129.                     'authFrom' => $request->query->get('authFrom'''),
  130.                 ]);
  131.                 return $response;
  132.             }
  133.             $pageData $this->buzzIndexPageProvider->getPageData($codePays);
  134.             $featuredIds = [];
  135.             $jours $this->buzzIndexPageProvider->getDerniersJours(6);
  136.             $grouped $pageData['grouped_articles'];
  137.             $dateRange null;
  138.             if (empty($grouped)) {
  139.                 $excludeIds = [];
  140.                 if (!empty($pageData['first_featured'])) {
  141.                     $excludeIds[] = (string) $pageData['first_featured']['id_actualite'];
  142.                 }
  143.                 foreach ($pageData['next_articles'] as $a) {
  144.                     $excludeIds[] = (string) $a['id_actualite'];
  145.                 }
  146.                 if (!empty($pageData['actualites_a_la_une_du_jour'])) {
  147.                     foreach ($pageData['actualites_a_la_une_du_jour'] as $a) {
  148.                         $excludeIds[] = (string) $a['id_actualite'];
  149.                     }
  150.                 }
  151.                 if (!empty($pageData['actualites_a_ce_moment'])) {
  152.                     foreach ($pageData['actualites_a_ce_moment'] as $a) {
  153.                         $excludeIds[] = (string) $a['id_actualite'];
  154.                     }
  155.                 }
  156.                 $excludeIds array_unique($excludeIds);
  157.                 if ($codePays === 'fr') {
  158.                     $ymds = [];
  159.                     $latestYmd $this->buzzActualitesRepository->getLatestDayYmd($codePays);
  160.                     if ($latestYmd) {
  161.                         $ymds[] = $latestYmd;
  162.                         $prev1 $this->buzzActualitesRepository->getPreviousDayYmd($latestYmd$codePays);
  163.                         if ($prev1) {
  164.                             $ymds[] = $prev1;
  165.                             $prev2 $this->buzzActualitesRepository->getPreviousDayYmd($prev1$codePays);
  166.                             if ($prev2) {
  167.                                 $ymds[] = $prev2;
  168.                             }
  169.                         }
  170.                     }
  171.                     $articlesFallback = [];
  172.                     foreach ($ymds as $ymd) {
  173.                         $rows $this->buzzActualitesRepository->findFranceNewsByYmd($ymd50$excludeIds$codePays);
  174.                         $articlesFallback array_merge($articlesFallback$rows);
  175.                     }
  176.                     $articlesFallback array_map([$this->buzzIndexPageProvider'formatArticle'], $articlesFallback);
  177.                     $grouped $this->buzzIndexPageProvider->groupArticlesByDay($articlesFallback);
  178.                     $pageData['grouped_articles'] = $grouped;
  179.                 } else {
  180.                     $dateRange $this->buzzIndexPageProvider->getLastNWorkingDays(5);
  181.                     $articlesFallback $this->buzzActualitesRepository->findNewsInDateRange($dateRange['start'], $dateRange['end'], $codePays$excludeIds);
  182.                     $articlesFallback array_map([$this->buzzIndexPageProvider'formatArticle'], $articlesFallback);
  183.                     $grouped $this->buzzIndexPageProvider->groupArticlesByWeek($articlesFallback);
  184.                     $pageData['grouped_articles'] = $grouped;
  185.                 }
  186.             }
  187.             $i 1;
  188.             while (empty($grouped) && $i <= 4) {
  189.                 $lastWeekStart = (new \DateTimeImmutable("monday -$i week"))->setTime(000);
  190.                 $lastWeekEnd $lastWeekStart->modify('+4 days')->setTime(235959);
  191.                 $excludeIds = [];
  192.                 if (!empty($pageData['first_featured'])) {
  193.                     $excludeIds[] = (string) $pageData['first_featured']['id_actualite'];
  194.                 }
  195.                 foreach ($pageData['next_articles'] as $a) {
  196.                     $excludeIds[] = (string) $a['id_actualite'];
  197.                 }
  198.                 if (!empty($pageData['actualites_a_la_une_du_jour'])) {
  199.                     foreach ($pageData['actualites_a_la_une_du_jour'] as $a) {
  200.                         $excludeIds[] = (string) $a['id_actualite'];
  201.                     }
  202.                 }
  203.                 if (!empty($pageData['actualites_a_ce_moment'])) {
  204.                     foreach ($pageData['actualites_a_ce_moment'] as $a) {
  205.                         $excludeIds[] = (string) $a['id_actualite'];
  206.                     }
  207.                 }
  208.                 $excludeIds array_unique($excludeIds);
  209.                 $articlesFallback $this->buzzActualitesRepository->findNewsInDateRange($lastWeekStart$lastWeekEnd$codePays$excludeIds);
  210.                 $articlesFallback array_map([$this->buzzIndexPageProvider'formatArticle'], $articlesFallback);
  211.                 if ($codePays === 'fr') {
  212.                     $grouped $this->buzzIndexPageProvider->groupArticlesByDay($articlesFallback);
  213.                 } else {
  214.                     $grouped $this->buzzIndexPageProvider->groupArticlesByWeek($articlesFallback);
  215.                 }
  216.                 $pageData['grouped_articles'] = $grouped;
  217.                 $dateRange = ['start' => $lastWeekStart'end' => $lastWeekEnd];
  218.                 $i++;
  219.             }
  220.             $featuredBlog null;
  221.             $featured $this->buzzIndexPageProvider->getFeaturedActualite($codePays1);
  222.             $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  223.             $codePaysWithUnderScore '_' $cleanCodePays '_';
  224.             $experts_alaune $this->buzzIndexPageProvider->getExpertsALaUneFromOperations(4'fr');
  225.             $response $this->render("buzz/index/index_fr.html.twig", [
  226.                 'metaTag' => $metaTag,
  227.                 'grouped_articles' => $pageData['grouped_articles'],
  228.                 'dateRange' => $dateRange,
  229.                 'featuredBlog' => $featuredBlog,
  230.                 'first_featured' => $pageData['first_featured'] ?? null,
  231.                 'next_articles' => $pageData['next_articles'] ?? [],
  232.                 'exclude_ids' => $pageData['exclude_ids'] ?? [],
  233.                 'derniers_jours' => $pageData['derniers_jours'],
  234.                 'actualites_a_la_une_du_jour' => $pageData['actualites_a_la_une_du_jour'] ?? [],
  235.                 'actualites_a_ce_moment' => $pageData['actualites_a_ce_moment'] ?? [],
  236.                 'articles_plus_lus' => $pageData['articles_plus_lus'] ?? [],
  237.                 'experts_alaune' => $experts_alaune,
  238.                 'codePays' => $cleanCodePays,
  239.                 'codePaysWithUnderScore' => $codePaysWithUnderScore,
  240.                 'lang' => 'fr',
  241.                 'currentRoute' => $request->get('_route'),
  242.                 'authFrom' => null,
  243.                 'hreflangLinks' => $hreflangLinks,
  244.             ]);
  245.         }
  246.         $response->setPublic();
  247.         $response->setMaxAge(self::MAX_AGE);
  248.         $response->headers->addCacheControlDirective('must-revalidate'true);
  249.         return $response;
  250.     }
  251.     /**
  252.      * Page des actualités internationales
  253.      * @param Request $request
  254.      * @param string $codePays
  255.      * @return Response
  256.      */
  257.     public function actualiteInternationale(Request $request$codePays): Response {
  258.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  259.         $canonicalUrl $this->canonicalUrlService->getBuzzActualiteInternationaleCanonical($cleanCodePays);
  260.         $metaTag $this->metaTag
  261.                 ->setTitle("L'actualité internationale des Fusions-Acquisitions et du Capital Investissement")
  262.                 ->setDescription("Suivez en temps réel l'actualité internationale des Fusions-Acquisitions et du Capital Investissement")
  263.                 ->setCanonical($canonicalUrl);
  264.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_internationale', [], null$cleanCodePays);
  265.         $data $this->buzzIndexPageProvider->getInternationalPageData($codePays);
  266.         $juridique $this->buzzIndexPageProvider->getSidebarJuridiqueData($codePays3);
  267.         if (empty($juridique) && $codePays !== 'fr') {
  268.             $juridique $this->buzzIndexPageProvider->getSidebarJuridiqueData('fr'3);
  269.         }
  270.         $experts $this->buzzIndexPageProvider->getSidebarDirectExpertsData('fr');
  271.         $derniers_jours $this->buzzIndexPageProvider->getDerniersJours(6);
  272.         $html $this->renderView('buzz/actualite_internationale.html.twig'array_merge([
  273.             'metaTag' => $metaTag,
  274.             'codePays' => str_replace('_'''$codePays),
  275.             'codePaysWithUnderScore' => $codePays,
  276.             'lang' => 'fr',
  277.             'currentRoute' => $request->get('_route'),
  278.             'authFrom' => null,
  279.             'juridique' => $juridique,
  280.             'experts' => $experts,
  281.             'derniers_jours' => $derniers_jours,
  282.             'hreflangLinks' => $hreflangLinks,
  283.                         ], $data));
  284.         $etag md5($html);
  285.         $response = new Response($html);
  286.         $response->setEtag($etag);
  287.         if ($response->isNotModified($request)) {
  288.             return $response;
  289.         }
  290.         $response->setPublic();
  291.         $response->setMaxAge(self::MAX_AGE);
  292.         return $response;
  293.     }
  294.     /**
  295.      * Page des actualités françaises depuis les autres pays
  296.      * @param Request $request
  297.      * @param string $codePays
  298.      * @return Response
  299.      */
  300.     public function actualiteFrance(Request $request$codePays): Response {
  301.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  302.         $canonicalUrl $this->canonicalUrlService->getBuzzActualiteFranceCanonical($cleanCodePays);
  303.         $metaTag $this->metaTag
  304.                 ->setTitle("L'actualité française des Fusions-Acquisitions et du Capital Investissement")
  305.                 ->setDescription("Suivez en temps réel l'actualité française des Fusions-Acquisitions et du Capital Investissement")
  306.                 ->setCanonical($canonicalUrl);
  307.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_france', [], null$cleanCodePays);
  308.         $pageData $this->buzzIndexPageProvider->getPageData('fr');
  309.         $juridique $this->buzzIndexPageProvider->getSidebarJuridiqueData('fr'3);
  310.         $experts $this->buzzIndexPageProvider->getSidebarDirectExpertsData('fr');
  311.         $experts_alaune $this->buzzIndexPageProvider->getExpertsALaUneFromOperations(4'fr');
  312.         $html $this->renderView('buzz/actualite_france.html.twig'array_merge($pageData, [
  313.             'metaTag' => $metaTag,
  314.             'codePays' => str_replace('_'''$codePays),
  315.             'codePaysWithUnderScore' => $codePays,
  316.             'lang' => 'fr',
  317.             'currentRoute' => $request->get('_route'),
  318.             'authFrom' => null,
  319.             'juridique' => $juridique,
  320.             'experts' => $experts,
  321.             'experts_alaune' => $experts_alaune,
  322.             'hreflangLinks' => $hreflangLinks,
  323.             'buzz_calendar_date_route' => 'buzz_actualite_france_par_date',
  324.         ]));
  325.         $etag md5($html);
  326.         $response = new Response($html);
  327.         $response->setEtag($etag);
  328.         if ($response->isNotModified($request)) {
  329.             return $response;
  330.         }
  331.         $response->setPublic();
  332.         $response->setMaxAge(self::MAX_AGE);
  333.         return $response;
  334.     }
  335.     /**
  336.      * Page "En direct des experts" avec filtrage par type
  337.      * @param BuzzIndexPageProvider $buzzIndexPageProvider
  338.      * @param Request $request
  339.      * @param string $codePays
  340.      * @return Response
  341.      */
  342.     public function enDirectDesExperts(BuzzIndexPageProvider $buzzIndexPageProviderRequest $request$codePays): Response {
  343.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  344.         $type $request->query->get('type''');
  345.         $canonicalUrl $this->canonicalUrlService->getBuzzEnDirectDesExpertsCanonical($cleanCodePays$type);
  346.         $metaTag $this->getMetaTagForExpertType($type);
  347.         $metaTag->setCanonical($canonicalUrl);
  348.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_en_direct_des_experts', [], $type$cleanCodePays);
  349.         $page max(1, (int) $request->query->get('page'1));
  350.         $limit 20;
  351.         $offset = ($page 1) * $limit;
  352.         $total $buzzIndexPageProvider->countEnDirectDesExperts($type$codePays);
  353.         $actualites $buzzIndexPageProvider->getEnDirectDesExpertsFormatted($type$limit$codePays$offset);
  354.         $totalPages = (int) ceil($total $limit);
  355.         $paginationLinks $this->canonicalUrlService->getBuzzPaginationLinks('buzz_en_direct_des_experts', [], $type$cleanCodePays$page$totalPages);
  356.         $first_featured $actualites[0] ?? null;
  357.         $next_articles array_slice($actualites12);
  358.         $main_articles array_slice($actualites317);
  359.         $juridique $buzzIndexPageProvider->getSidebarJuridiqueData($codePays3);
  360.         if (empty($juridique) && $codePays !== 'fr') {
  361.             $juridique $buzzIndexPageProvider->getSidebarJuridiqueData('fr'3);
  362.         }
  363.         $remaining_articles array_slice($actualites3);
  364.         $grouped_articles $buzzIndexPageProvider->groupArticlesByDay($remaining_articles);
  365.         $webinarFormationData $buzzIndexPageProvider->getWebinarFormationData();
  366.         if (isset($webinarFormationData['webinar']) && is_array($webinarFormationData['webinar'])) {
  367.             if (!isset($webinarFormationData['webinar']['titre'])) {
  368.                 $webinarFormationData['webinar']['titre'] = '';
  369.             }
  370.         }
  371.         $html $this->renderView('buzz/en_direct_des_experts.html.twig', [
  372.             'metaTag' => $metaTag,
  373.             'first_featured' => $first_featured,
  374.             'next_articles' => $next_articles,
  375.             'main_articles' => $main_articles,
  376.             'grouped_articles' => $grouped_articles,
  377.             'type' => $type,
  378.             'juridique' => $juridique,
  379.             'page' => $page,
  380.             'limit' => $limit,
  381.             'total' => $total,
  382.             'nbPages' => ceil($total $limit),
  383.             'webinarData' => $webinarFormationData['webinar'],
  384.             'formationData' => $webinarFormationData['formation'],
  385.             'hreflangLinks' => $hreflangLinks,
  386.             'paginationLinks' => $paginationLinks,
  387.         ]);
  388.         $etag md5($html);
  389.         $response = new Response($html);
  390.         $response->setEtag($etag);
  391.         if ($response->isNotModified($request)) {
  392.             return $response// 304 Not Modified
  393.         }
  394.         $response->setPublic();
  395.         $response->setMaxAge(self::MAX_AGE);
  396.         return $response;
  397.     }
  398.     /**
  399.      * Récupère les métadonnées appropriées selon le type d'expert
  400.      * 
  401.      * @param string $type
  402.      * @return MetaTag
  403.      */
  404.     private function getMetaTagForExpertType(string $type): MetaTag {
  405.         switch ($type) {
  406.             case 'reference':
  407.                 return $this->metaTag
  408.                                 ->setTitle("Toutes les opérations réalisées par les experts en cession d'entreprise")
  409.                                 ->setDescription("Suivez en temps réel toutes les opérations réalisées par les experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  410.             case 'autre':
  411.                 return $this->metaTag
  412.                                 ->setTitle("Toutes les autres actualités des conseils en cession d'entreprise")
  413.                                 ->setDescription("Suivez en temps réel toutes les autres actualités postées par les experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  414.             case 'nomination':
  415.                 return $this->metaTag
  416.                                 ->setTitle("Toutes les nominations des conseils en cession d'entreprise")
  417.                                 ->setDescription("Suivez en temps réel toutes les nominations des experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  418.             case 'evenement':
  419.                 return $this->metaTag
  420.                                 ->setTitle("Tous les événements des experts en cession d'entreprise")
  421.                                 ->setDescription("Suivez en temps réel tous les événements auxquels participent les experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  422.             case 'expertise':
  423.                 return $this->metaTag
  424.                                 ->setTitle("Tous les avis d'experts des conseils en cession d'entreprise")
  425.                                 ->setDescription("Suivez en temps réel tous les avis d'expert rédigés par les conseils en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  426.             case 'reflexion':
  427.                 return $this->metaTag
  428.                                 ->setTitle("Tous les billets d'humeur des conseils en cession d'entreprise")
  429.                                 ->setDescription("Suivez en temps réel tous les billets d'humeur rédigés par les experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  430.             case 'emploi':
  431.                 return $this->metaTag
  432.                                 ->setTitle("Toutes les offres d'emploi des conseils en cession d'entreprise")
  433.                                 ->setDescription("Suivez en temps réel toutes les offres d'emploi proposées par les experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  434.             default:
  435.                 return $this->metaTag
  436.                                 ->setTitle("L'actualité collaborative des Experts - Toutes les actualités")
  437.                                 ->setDescription("Suivez en temps réel toute l'actualité collaborative des experts en cession d'entreprise, fusions-acquisitions et en levée de fonds");
  438.         }
  439.     }
  440.     /**
  441.      * Récupère les métadonnées appropriées pour les détails d'articles
  442.      * 
  443.      * @param array $articleData
  444.      * @return MetaTag
  445.      */
  446.     private function getMetaTagForArticleDetail(array $articleData): MetaTag {
  447.         $titre $articleData['titre_actualite'] ?? '';
  448.         $sousTitre $articleData['sous_titre'] ?? '';
  449.         $description $articleData['description_actualite'] ?? '';
  450.         $title = !empty($titre) ? $titre "Actualité - Fusions-Acquisitions et Capital Investissement";
  451.         if (!empty($sousTitre)) {
  452.             $desc $sousTitre;
  453.         } elseif (!empty($description)) {
  454.             $desc strlen($description) > 160 substr($description0157) . '...' $description;
  455.         } else {
  456.             $desc "Consultez cette actualité dans le domaine des fusions-acquisitions et du capital investissement";
  457.         }
  458.         return $this->metaTag
  459.                         ->setTitle($title)
  460.                         ->setDescription($desc);
  461.     }
  462.     /**
  463.      * Récupère les métadonnées appropriées pour les pages de sociétés
  464.      * 
  465.      * @param array $infos
  466.      * @param string $typeSociete
  467.      * @return MetaTag
  468.      */
  469.     private function getMetaTagForSociete(array $infosstring $typeSociete): MetaTag {
  470.         $raisonSociale $infos['raison_sociale'] ?? '';
  471.         $description $infos['description'] ?? '';
  472.         $secteur $infos['secteur'] ?? '';
  473.         $title $typeSociete === 'prestataire' ? (!empty($raisonSociale) ? $raisonSociale " - Cabinet de conseil en fusions-acquisitions" "Cabinet de conseil en fusions-acquisitions") : (!empty($raisonSociale) ? $raisonSociale " - Actualités fusions-acquisitions" "Actualités fusions-acquisitions");
  474.         if (!empty($description)) {
  475.             $desc strlen($description) > 160 substr($description0157) . '...' $description;
  476.         } elseif (!empty($secteur)) {
  477.             $desc "Découvrez " $raisonSociale " dans le secteur " $secteur " - Actualités et informations sur les fusions-acquisitions";
  478.         } else {
  479.             $desc "Consultez les actualités et informations sur " $raisonSociale " dans le domaine des fusions-acquisitions et du capital investissement";
  480.         }
  481.         return $this->metaTag
  482.                         ->setTitle($title)
  483.                         ->setDescription($desc);
  484.     }
  485.     /**
  486.      * Page de détail d'une actualité
  487.      * 
  488.      * @param Request $request
  489.      * @param string $slug
  490.      * @param string $id
  491.      * @param string $codePays
  492.      * @param BuzzIndexPageProvider $provider
  493.      * @param DroitsAccesManagers $droitsAccesManagers
  494.      * @return Response
  495.      */
  496.     public function detail(Request $request$slug$id$codePaysBuzzIndexPageProvider $providerDroitsAccesManagers $droitsAccesManagers): Response {
  497.         $backUrl $this->computeBackUrl($request$codePays);
  498.         $articleData $provider->getArticleDetailById((int) $id);
  499.   
  500.         if (!$articleData) {
  501.             $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  502.             $url $this->generateUrl('buzz_index', ['codePays' => $cleanCodePays]);
  503.             return new RedirectResponse($urlResponse::HTTP_MOVED_PERMANENTLY);
  504.         }
  505.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  506.         $canonicalUrl $this->canonicalUrlService->getBuzzActualiteCanonical((int) $id$slug$cleanCodePays);
  507.         $metaTag $this->getMetaTagForArticleDetail($articleData);
  508.         $metaTag->setCanonical($canonicalUrl);
  509.         if (!empty($articleData['should_noindex']) && $articleData['should_noindex'] === true) {
  510.             $metaTag->setRobots('noindex, nofollow');
  511.         }
  512.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_detail', ['slug' => $slug'id' => $id], null$cleanCodePays);
  513.         $alternates $this->canonicalUrlService->convertHreflangToAlternates($hreflangLinks);
  514.         $metaTag->setAlternates($alternates);
  515.         $operationId null;
  516.         if (!empty($articleData['id_operation'])) {
  517.             $operationId = (int) $articleData['id_operation'];
  518.         }
  519.         $stripInvestisseurAcquereurRoles = !empty($articleData['autorisation_blog']) && $articleData['autorisation_blog'] === 'non';
  520.         $sidebarBundle $this->buzzIndexPageProvider->getBuzzArticleDetailSidebarBundleCached((int) $id$operationId$stripInvestisseurAcquereurRoles);
  521.         $idSecteur $sidebarBundle['idSecteur'];
  522.         $investisseurs_experts $sidebarBundle['investisseurs_experts'];
  523.         $societesAReprendre $sidebarBundle['societes_a_reprendre'];
  524.         $acquereursSecteur $sidebarBundle['acquereurs_secteur'];
  525.         $secteurInfo $sidebarBundle['secteur_info'];
  526.         $lastActualites = [];
  527.         if (!empty($articleData['id_societe_prestataire'])) {
  528.             $lastActualites $provider->getLastActualitesBySocietePrestataire($articleData['id_societe_prestataire']);
  529.         }
  530.         $societe_toutes_actualites = [];
  531.         if (empty($articleData['autorisation_blog']) || $articleData['autorisation_blog'] !== 'non') {
  532.             $societe_toutes_actualites $this->buzzIndexPageProvider->getSocieteToutesActualites($operationId);
  533.         }
  534.         $user $this->getUser();
  535.         $typeActualite $articleData['type_actualite'] ?? null;
  536.         $canSeeSousTitre true;
  537.         $statusAuth 2;
  538.         if ($typeActualite === 'juridique_et_fiscale') {
  539.             if (!$user) {
  540.                 $canSeeSousTitre false;
  541.                 $statusAuth 0;
  542.             } else {
  543.                 $hasAccess $droitsAccesManagers->hasJuridiqueAccess($user);
  544.                 $canSeeSousTitre $hasAccess;
  545.                 $statusAuth $canSeeSousTitre 1;
  546.             }
  547.         }
  548.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  549.         $sendForm $this->createForm(SendActualiteType::class, null, [
  550.             'id_actualite' => (int) $id,
  551.         ]);
  552.         $publicKey $this->getParameter('RECAPTCHA_PUBLIC_KEY') ?? '';
  553.         $response $this->render('buzz/fragments/detail.html.twig', [
  554.                     'article' => $articleData,
  555.                     'backUrl' => $backUrl,
  556.                     'codePays' => $cleanCodePays,
  557.                     'codePaysWithUnderScore' => $codePays,
  558.                     'idSecteur' => $idSecteur,
  559.                     'operationId' => $operationId,
  560.                     'lang' => 'fr',
  561.                     'currentRoute' => $request->get('_route'),
  562.                     'authFrom' => null,
  563.                     'metaTag' => $metaTag,
  564.                     'show_experts_references' => true,
  565.                     'investisseurs_experts' => $investisseurs_experts,
  566.                     'societe_toutes_actualites' => $societe_toutes_actualites,
  567.                     'canSeeSousTitre' => $canSeeSousTitre,
  568.                     'statusAuth' => $statusAuth,
  569.                     'societes_a_reprendre' => $societesAReprendre,
  570.                     'acquereurs_secteur' => $acquereursSecteur,
  571.                     'secteur_info' => $secteurInfo,
  572.                     'hreflangLinks' => $hreflangLinks,
  573.                     'send_form' => $sendForm->createView(),
  574.                     'RECAPTCHA_PUBLIC_KEY' => $publicKey,
  575.         ]);
  576.         if (!empty($articleData['should_noindex']) && $articleData['should_noindex'] === true) {
  577.             $response->headers->set('X-Robots-Tag''noindex, nofollow');
  578.         }
  579.         return $response;
  580.     }
  581.     /**
  582.      * Calcule une URL de retour fiable pour la page détail
  583.      */
  584.     private function computeBackUrl(Request $requeststring $codePays): string {
  585.         $returnParam = (string) ($request->query->get('return''') ?: $request->query->get('f_return'''));
  586.         if ($returnParam !== '') {
  587.             if (strpos($returnParam'http') !== 0) {
  588.                 return $returnParam;
  589.             }
  590.             $retHost parse_url($returnParamPHP_URL_HOST);
  591.             if (!empty($retHost) && $retHost === $request->getHost()) {
  592.                 return $returnParam;
  593.             }
  594.         }
  595.         $referer = (string) $request->headers->get('referer''');
  596.         $currentUrl = (string) $request->getUri();
  597.         if ($referer !== '' && $referer !== $currentUrl) {
  598.             $isLoginRef strpos($referer'/login') !== false;
  599.             $isSocieteRef strpos($referer'/actualite-societe-') !== false;
  600.             if (!$isLoginRef && !$isSocieteRef) {
  601.                 return $referer;
  602.             }
  603.         }
  604.         return $this->generateUrl('buzz_index', [
  605.                     'codePays' => Utils::codePaysWithoutDash($codePays)
  606.         ]);
  607.     }
  608.     /**
  609.      * Page des actualités d'une société
  610.      * 
  611.      * @param Request $request
  612.      * @param string $slug
  613.      * @param string $id
  614.      * @param string $codePays
  615.      * @param EntityManagerInterface $em
  616.      * @param BuzzIndexPageProvider $provider
  617.      * @return Response
  618.      */
  619.     public function actualiteSocietes(Request $request$slug$id$codePaysEntityManagerInterface $emBuzzIndexPageProvider $provider): Response {
  620.         $idActualiteContexte $request->query->get('idActualite');
  621.         $idActualiteFromQuery null;
  622.         if (!empty($idActualiteContexte) && ctype_digit((string) $idActualiteContexte)) {
  623.             $idActualiteFromQuery = (int) $idActualiteContexte;
  624.         }
  625.         $societe $em->getRepository(SocietesPrestataire::class)->find($id);
  626.         if ($societe) {
  627.             $typeSociete 'prestataire';
  628.         } else {
  629.             $societe $em->getRepository(Societes::class)->find($id);
  630.             if ($societe) {
  631.                 $typeSociete 'news';
  632.             } else {
  633.                 throw $this->createNotFoundException('Société non trouvée');
  634.             }
  635.         }
  636.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  637.         $pageData $provider->getActualiteSocietePageDataCached((int) $id$typeSociete$cleanCodePays$idActualiteFromQuery);
  638.         $infos $pageData['infos'];
  639.         $dernieresActualites $pageData['dernieresActualites'];
  640.         $mainActualiteTitre $pageData['mainActualiteTitre'];
  641.         $idActualiteRef $pageData['idActualiteRef'];
  642.         $idSecteur $pageData['idSecteur'];
  643.         $operationId $pageData['operationId'];
  644.         $societesAReprendre $pageData['societes_a_reprendre'];
  645.         $acquereursSecteur $pageData['acquereurs_secteur'];
  646.         $secteurInfo $pageData['secteur_info'];
  647.         $canonicalUrl $this->canonicalUrlService->getBuzzActualiteSocieteCanonical((int) $id$slug$cleanCodePays);
  648.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_societe', ['slug' => $slug'id' => $id], null$cleanCodePays);
  649.         $metaTag $this->getMetaTagForSociete($infos$typeSociete);
  650.         $metaTag->setCanonical($canonicalUrl);
  651.         $article array_merge($infos, [
  652.             'societe_infos' => $infos,
  653.             'imgAffichage' => $infos['imgAffichage'] ?? null,
  654.             'imgAffichageEnError' => $infos['imgAffichageEnError'] ?? null,
  655.             'raison_sociale' => $infos['raison_sociale'] ?? '',
  656.             'dernieres_actualites_societe' => $dernieresActualites,
  657.             'lienSocieteCom' => $infos['lienSocieteCom'] ?? '',
  658.             'lienAnnuaireParticipation' => $infos['lienAnnuaireParticipation'] ?? '',
  659.             'lienFicheComplete' => $infos['lienFicheComplete'] ?? '',
  660.             'adresse_complete' => $infos['adresse_complete'] ?? '',
  661.             'caEffectif' => $infos['caEffectif'] ?? '',
  662.             'utiliserArtviper' => $infos['utiliserArtviper'] ?? '',
  663.             'carteAffichage' => $infos['carteAffichage'] ?? '',
  664.             'lienParticipation' => $infos['lienParticipation'] ?? '',
  665.             'numero_siren' => $infos['numero_siren'] ?? '',
  666.             'ca_n' => $infos['ca_n'] ?? '',
  667.             'annee_n' => $infos['annee_n'] ?? '',
  668.             'effectif_salarie_n' => $infos['effectif_salarie_n'] ?? '',
  669.             'url_site_web' => $infos['url_site_web'] ?? '',
  670.             'site_internet' => $infos['site_internet'] ?? '',
  671.             'nom_contact1' => $infos['nom_contact1'] ?? '',
  672.             'telephone' => $infos['telephone'] ?? '',
  673.             'adresse' => $infos['adresse'] ?? '',
  674.             'code_postal' => $infos['code_postal'] ?? '',
  675.             'ville' => $infos['ville'] ?? '',
  676.             'pays' => $infos['pays'] ?? '',
  677.             'id_pays' => $infos['id_pays'] ?? '',
  678.             'resume_service' => $infos['resume_service'] ?? '',
  679.             'resume_activite' => $infos['resume_activite'] ?? '',
  680.             'description_activite' => $infos['description_activite'] ?? '',
  681.             'fax' => $infos['fax'] ?? '',
  682.             'mail_contact' => $infos['mail_contact'] ?? '',
  683.         ]);
  684.         $html $this->renderView('buzz/fragments/actualite_societe.html.twig', [
  685.             'article' => $article,
  686.             'metaTag' => $metaTag,
  687.             'codePays' => $cleanCodePays,
  688.             'codePaysWithUnderScore' => $codePays,
  689.             'lang' => 'fr',
  690.             'currentRoute' => $request->get('_route'),
  691.             'authFrom' => null,
  692.             'show_experts_references' => true,
  693.             'mainActualiteTitre' => $mainActualiteTitre,
  694.             'firstActualite' => $idActualiteRef ? ['id_actualite' => $idActualiteRef] : null,
  695.             'idSecteur' => $idSecteur,
  696.             'operationId' => $operationId,
  697.             'idActualite' => $idActualiteRef,
  698.             'societes_a_reprendre' => $societesAReprendre,
  699.             'acquereurs_secteur' => $acquereursSecteur,
  700.             'secteur_info' => $secteurInfo,
  701.             'hreflangLinks' => $hreflangLinks,
  702.         ]);
  703.         $etag md5($html);
  704.         $response = new Response($html);
  705.         $response->setEtag($etag);
  706.         if ($response->isNotModified($request)) {
  707.             return $response;
  708.         }
  709.         $response->setPublic();
  710.         $response->setMaxAge(self::MAX_AGE);
  711.         return $response;
  712.     }
  713.     /**
  714.      * Page des actualités par date spécifique
  715.      * 
  716.      * @param Request $request
  717.      * @param string $date
  718.      * @param string $codePays
  719.      * @return Response
  720.      */
  721.     public function actualitesParDate(Request $request$date$codePays): Response {
  722.         if (!preg_match('/^\d{8}$/', (string) $date)) {
  723.             $clean Utils::codePaysWithoutDash($codePays);
  724.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  725.         }
  726.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  727.         if (!$dateObj) {
  728.             $clean Utils::codePaysWithoutDash($codePays);
  729.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  730.         }
  731.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  732.         if ($cleanCodePays !== 'fr') {
  733.             return $this->redirectToRoute('buzz_actualite_france_par_date', [
  734.                         'date' => $date,
  735.                         'codePays' => $codePays
  736.             ]);
  737.         }
  738.         $now = new \DateTimeImmutable();
  739.         $twoYearsAgo $now->modify('-2 years');
  740.         if ($dateObj $now || $dateObj $twoYearsAgo) {
  741.             $clean Utils::codePaysWithoutDash($codePays);
  742.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  743.         }
  744.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  745.         $date_label_fr $dateObj $this->buzzIndexPageProvider->formatDateLongFr($dateObj) : '';
  746.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  747.         $canonicalUrl $this->canonicalUrlService->getBuzzDateCanonical($date$cleanCodePays);
  748.         $metaTag $this->metaTag
  749.                 ->setTitle("Actualités du " $date_label_fr " - Fusions-Acquisitions et Capital Investissement")
  750.                 ->setDescription("Consultez toutes les actualités du " $date_label_fr " dans le domaine des fusions-acquisitions et du capital investissement")
  751.                 ->setCanonical($canonicalUrl);
  752.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_par_date', ['date' => $date], null$cleanCodePays);
  753.         $listing $this->buzzIndexPageProvider->getFranceBuzzListingByDate($date'_fr_');
  754.         $actualitesALaUne $listing['actualites_a_la_une_du_jour'];
  755.         $articles $listing['articles'];
  756.         $derniers_jours $this->buzzIndexPageProvider->getDerniersJours(5$dateObj);
  757.         return $this->render('buzz/index/actualites_par_date.html.twig', [
  758.                     'metaTag' => $metaTag,
  759.                     'articles' => $articles,
  760.                     'actualites_a_la_une_du_jour' => $actualitesALaUne,
  761.                     'date' => $dateObj,
  762.                     'date_label_fr' => $date_label_fr,
  763.                     'codePays' => str_replace('_'''$codePays),
  764.                     'codePaysWithUnderScore' => $codePays,
  765.                     'lang' => 'fr',
  766.                     'currentRoute' => $request->get('_route'),
  767.                     'authFrom' => null,
  768.                     'derniers_jours' => $derniers_jours,
  769.                     'hreflangLinks' => $hreflangLinks,
  770.         ]);
  771.     }
  772.     /**
  773.      * Page des actualités internationales par date spécifique
  774.      * 
  775.      * @param string $date
  776.      * @param string $codePays
  777.      * @return Response
  778.      */
  779.     public function actualitesInternationalesParDate($date$codePays): Response {
  780.         if (!preg_match('/^\d{8}$/', (string) $date)) {
  781.             $clean Utils::codePaysWithoutDash($codePays);
  782.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  783.         }
  784.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  785.         if (!$dateObj) {
  786.             $clean Utils::codePaysWithoutDash($codePays);
  787.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  788.         }
  789.         $now = new \DateTimeImmutable();
  790.         $twoYearsAgo $now->modify('-2 years');
  791.         if ($dateObj $now || $dateObj $twoYearsAgo) {
  792.             $clean Utils::codePaysWithoutDash($codePays);
  793.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  794.         }
  795.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  796.         $date_label_fr $dateObj $this->buzzIndexPageProvider->formatDateLongFr($dateObj) : '';
  797.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  798.         $canonicalUrl $this->canonicalUrlService->getBuzzActualiteInternationaleParDateCanonical($date$cleanCodePays);
  799.         $metaTag $this->metaTag
  800.                 ->setTitle("Actualités internationales du " $date_label_fr " - Fusions-Acquisitions et Capital Investissement")
  801.                 ->setDescription("Consultez toutes les actualités internationales du " $date_label_fr " dans le domaine des fusions-acquisitions et du capital investissement")
  802.                 ->setCanonical($canonicalUrl);
  803.         $listing $this->buzzIndexPageProvider->getInternationalBuzzListingByDate($date$codePays);
  804.         $actualitesALaUne $listing['actualites_a_la_une_du_jour'];
  805.         $articles $listing['articles'];
  806.         $featured $articles[0] ?? null;
  807.         $next_articles array_slice($articles12);
  808.         $other_articles array_slice($articles3);
  809.         $derniers_jours $this->buzzIndexPageProvider->getDerniersJours(5$dateObj);
  810.         return $this->render('buzz/actualite_internationale_par_date.html.twig', [
  811.                     'metaTag' => $metaTag,
  812.                     'featured' => $featured,
  813.                     'next_articles' => $next_articles,
  814.                     'other_articles' => $other_articles,
  815.                     'actualites_a_la_une_du_jour' => $actualitesALaUne,
  816.                     'date' => $dateObj,
  817.                     'date_label_fr' => $date_label_fr,
  818.                     'codePaysWithUnderScore' => $codePays,
  819.                     'derniers_jours' => $derniers_jours,
  820.         ]);
  821.     }
  822.     /**
  823.      * Page des actualités françaises par date spécifique (pour les pays non-français)
  824.      * 
  825.      * @param Request $request
  826.      * @param string $date
  827.      * @param string $codePays
  828.      * @return Response
  829.      */
  830.     public function actualitesFranceParDate(Request $request$date$codePays): Response {
  831.         if (!preg_match('/^\d{8}$/', (string) $date)) {
  832.             $clean Utils::codePaysWithoutDash($codePays);
  833.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  834.         }
  835.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  836.         if (!$dateObj) {
  837.             $clean Utils::codePaysWithoutDash($codePays);
  838.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  839.         }
  840.         $now = new \DateTimeImmutable();
  841.         $twoYearsAgo $now->modify('-2 years');
  842.         if ($dateObj $now || $dateObj $twoYearsAgo) {
  843.             $clean Utils::codePaysWithoutDash($codePays);
  844.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  845.         }
  846.         $dateObj = \DateTimeImmutable::createFromFormat('Ymd'$date);
  847.         $date_label_fr $dateObj $this->buzzIndexPageProvider->formatDateLongFr($dateObj) : '';
  848.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  849.         $canonicalUrl $this->canonicalUrlService->getBuzzDateCanonical($date$cleanCodePays);
  850.         $metaTag $this->metaTag
  851.                 ->setTitle("Actualités françaises du " $date_label_fr " - Fusions-Acquisitions et Capital Investissement")
  852.                 ->setDescription("Consultez toutes les actualités françaises du " $date_label_fr " dans le domaine des fusions-acquisitions et du capital investissement")
  853.                 ->setCanonical($canonicalUrl);
  854.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_actualite_france_par_date', ['date' => $date], null$cleanCodePays);
  855.         $listing $this->buzzIndexPageProvider->getFranceBuzzListingByDate($date'_fr_');
  856.         $actualitesALaUne $listing['actualites_a_la_une_du_jour'];
  857.         $articles $listing['articles'];
  858.         $derniers_jours $this->buzzIndexPageProvider->getDerniersJours(5$dateObj);
  859.         return $this->render('buzz/actualite_france_par_date.html.twig', [
  860.                     'metaTag' => $metaTag,
  861.                     'articles' => $articles,
  862.                     'actualites_a_la_une_du_jour' => $actualitesALaUne,
  863.                     'date' => $dateObj,
  864.                     'date_label_fr' => $date_label_fr,
  865.                     'codePays' => $cleanCodePays,
  866.                     'codePaysWithUnderScore' => $codePays,
  867.                     'lang' => 'fr',
  868.                     'currentRoute' => $request->get('_route'),
  869.                     'authFrom' => null,
  870.                     'derniers_jours' => $derniers_jours,
  871.                     'hreflangLinks' => $hreflangLinks,
  872.         ]);
  873.     }
  874.     /**
  875.      * Page des actualités par mois
  876.      * 
  877.      * @param string $month
  878.      * @param string $codePays
  879.      * @return Response
  880.      */
  881.     public function actualitesParMois($month$codePays): Response {
  882.         if (!is_numeric($month) || $month || $month 12) {
  883.             $clean Utils::codePaysWithoutDash($codePays);
  884.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  885.         }
  886.         $year date('Y');
  887.         $lastMonths $this->buzzIndexPageProvider->getLastMonthsHavingActuForCountry(Utils::codePaysWithoutDash($codePays), 6);
  888.         $monthExists false;
  889.         foreach ($lastMonths as $allowedMonth) {
  890.             if ($allowedMonth['year'] == $year && $allowedMonth['number'] == $month) {
  891.                 $monthExists true;
  892.                 break;
  893.             }
  894.         }
  895.         if (!$monthExists) {
  896.             $clean Utils::codePaysWithoutDash($codePays);
  897.             return $this->redirectToRoute('buzz_index', ['codePays' => $clean]);
  898.         }
  899.         $date = \DateTimeImmutable::createFromFormat('!m'$month);
  900.         $monthName $date Utils::$moisFR[$date->format('n') - 1] : $month;
  901.         $monthSlug sprintf('%02d'$month);
  902.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  903.         $canonicalUrl $this->canonicalUrlService->getBuzzActualitesParMoisCanonical($monthSlug$cleanCodePays);
  904.         $metaTag $this->metaTag
  905.                 ->setTitle("Actualités de " $monthName " " $year " - Fusions-Acquisitions et Capital Investissement")
  906.                 ->setDescription("Consultez toutes les actualités de " $monthName " " $year " dans le domaine des fusions-acquisitions et du capital investissement")
  907.                 ->setCanonical($canonicalUrl);
  908.         $featuredRaw $this->buzzActualitesRepository->findFeaturedActualiteOfMonth((int) $year, (int) $month$codePays);
  909.         $firstFeatured $featuredRaw $this->buzzIndexPageProvider->formatArticle($featuredRaw) : null;
  910.         $featuredIds $firstFeatured ? [$firstFeatured['id_actualite']] : [];
  911.         $mainArticlesRaw $this->buzzActualitesRepository->findNewsByMonth((int) $year, (int) $month$codePays$featuredIds);
  912.         $mainArticles array_map(
  913.                 [$this->buzzIndexPageProvider'formatArticle'],
  914.                 array_map(function ($a) {
  915.                     return (array) $a;
  916.                 }, $mainArticlesRaw)
  917.         );
  918.         return $this->render('buzz/mois_avec_actualites.html.twig', [
  919.                     'first_featured' => $firstFeatured,
  920.                     'main_articles' => $mainArticles,
  921.                     'year' => $year,
  922.                     'metaTag' => $metaTag,
  923.                     'month' => $month,
  924.                     'monthName' => $monthName,
  925.                     'codePaysWithUnderScore' => $codePays,
  926.                     'lastMonthsHavingActu' => $this->buzzIndexPageProvider->getLastMonthsHavingActuForCountry($codePays6),
  927.         ]);
  928.     }
  929.     /**
  930.      * Page des actualités weekend
  931.      * 
  932.      * @param string $codePays
  933.      * @param string|null $date
  934.      * @return Response
  935.      */
  936.     public function weekend($codePays, ?string $date null): Response {
  937.         $codePaysClean Utils::codePaysWithoutDash($codePays);
  938.         $weekendData $this->buzzIndexPageProvider->getWeekendPageData($codePaysClean$date);
  939.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  940.         $canonicalUrl $this->canonicalUrlService->getBuzzWeekendCanonical($cleanCodePays$date);
  941.         $metaTag = new MetaTag();
  942.         $metaTag->setTitle('Revue de presse de la semaine - FUSACQ Buzz');
  943.         $metaTag->setDescription('Retrouvez les actualités sélectionnées de la semaine dans le domaine des fusions-acquisitions et du capital-investissement.');
  944.         $metaTag->setCanonical($canonicalUrl);
  945.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_weekend', ['date' => $date], null$cleanCodePays);
  946.         return $this->render('buzz/index/weekend.html.twig', [
  947.                     'grouped_articles' => $weekendData['grouped_articles'],
  948.                     'week_start' => $weekendData['week_start'],
  949.                     'week_end' => $weekendData['week_end'],
  950.                     'week_label' => $weekendData['week_label'],
  951.                     'derniers_jours' => $weekendData['derniers_jours'],
  952.                     'metaTag' => $metaTag,
  953.                     'codePaysWithUnderScore' => $codePays,
  954.                     'hreflangLinks' => $hreflangLinks,
  955.         ]);
  956.     }
  957.     /**
  958.      * Page "Publier des actualités"
  959.      */
  960.     public function publierDesActualites(Request $request$codePays): Response {
  961.         $cleanCodePays $this->canonicalUrlService->cleanCodePays($codePays);
  962.         $canonicalUrl $this->canonicalUrlService->getBuzzPublierActualitesCanonical($cleanCodePays);
  963.         $metaTag $this->metaTag
  964.                 ->setTitle("Publiez vos actualités - FUSACQ Buzz")
  965.                 ->setDescription("Publiez vos actualités sur FUSACQ Buzz. Experts, sociétés et repreneurs, diffusez vos opérations de fusions-acquisitions.")
  966.                 ->setCanonical($canonicalUrl);
  967.         $hreflangLinks $this->canonicalUrlService->getBuzzHreflangLinks('buzz_publier_actualites', [], null$cleanCodePays);
  968.         return $this->render('buzz/fragments/publier_des_actualites.html.twig', [
  969.                     'metaTag' => $metaTag,
  970.                     'codePays' => $cleanCodePays,
  971.                     'codePaysWithUnderScore' => $codePays,
  972.                     'lang' => 'fr',
  973.                     'currentRoute' => $request->get('_route'),
  974.                     'authFrom' => null,
  975.                     'hreflangLinks' => $hreflangLinks,
  976.         ]);
  977.     } 
  978. }