src/Controller/FrontController.php line 2094

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Faqs;
  4. use App\Entity\Avis;
  5. use App\Entity\Themes;
  6. use App\Entity\Galeries;
  7. use App\Entity\Villes;
  8. use App\Entity\Thematiques;
  9. use App\Entity\Actualites;
  10. use App\Entity\Formations;
  11. use App\Entity\References;
  12. use App\Entity\Mentions;
  13. use App\Entity\Managements;
  14. use App\Entity\Bannieres;
  15. use App\Entity\Inscriptions;
  16. use App\Entity\Demandeformations;
  17. use App\Entity\Expertises;
  18. use App\Entity\Themeshanghai;
  19. use App\Entity\Videos;
  20. use App\Entity\Albums;
  21. use App\Form\RechercheFormType;
  22. use App\Form\RechercheNatFormType;
  23. use Doctrine\ORM\EntityManager;
  24. use App\Form\ProduitFormType;
  25. use App\Form\InscriptionFormType;
  26. use App\Form\NewInscriptionFormType;
  27. use App\Service\GeoIpService;
  28. use App\Repository\DemandeformationsRepository;
  29. use App\Repository\InscriptionsRepository;
  30. use App\Repository\AvisRepository;
  31. use App\Repository\ManagementsRepository;
  32. use App\Repository\MentionsRepository;
  33. use App\Repository\VillesRepository;
  34. use App\Repository\GaleriesRepository;
  35. use App\Repository\ThemesRepository;
  36. use App\Repository\FormationsRepository;
  37. use App\Repository\AboutsRepository;
  38. use App\Repository\ThematiquesRepository;
  39. use App\Repository\ValeursRepository;
  40. use App\Repository\BannieresRepository;
  41. use App\Repository\ActualitesRepository;
  42. use App\Repository\PartenairesRepository;
  43. use App\Repository\ReferenceclientsRepository;
  44. use App\Repository\InformationsRepository;
  45. use App\Repository\AlbumsRepository;
  46. use App\Repository\VideosRepository;
  47. use App\Repository\ExpertisesRepository;
  48. use App\Repository\ThemeshanghaiRepository;
  49. use App\Entity\Certificats;
  50. use App\Form\CertificatFormType;
  51. use App\Form\EditCertificatFormType;
  52. use App\Repository\CertificatsRepository;
  53. //use Symfony\Component\Mime\Email;
  54. use Symfony\Component\HttpFoundation\Request;
  55. use Symfony\Component\HttpFoundation\Response;
  56. use Symfony\Component\Routing\Annotation\Route;
  57. use Symfony\Component\String\Slugger\SluggerInterface;
  58. use App\Form\ContactFormType;
  59. use App\Form\DevisFormType;
  60. use App\Form\CombinedFormType;
  61. use App\Form\DemandeformationFormType;
  62. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  63. use Symfony\Component\Mime\Email;
  64. use Symfony\Component\Mailer\MailerInterface;
  65. use Symfony\Component\HttpFoundation\JsonResponse;
  66. use Knp\Component\Pager\PaginatorInterface;
  67. use Doctrine\ORM\EntityManagerInterface;
  68. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  69. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  70. use App\Entity\Certyous;
  71. use App\Form\CertyouFormType;
  72. use App\Entity\Inscriptionpersos;
  73. use App\Form\EditCertyouFormType;
  74. use App\Repository\CertyousRepository;
  75. use App\Form\InscriptionCertyouFormType;
  76. use App\Repository\InscriptionpersosRepository;
  77. use App\Entity\Sessions;
  78. use App\Form\SessionFormType;
  79. use App\Form\EditSessionFormType;
  80. use App\Repository\SessionsRepository;
  81. class FrontController extends AbstractController
  82. {
  83.     #[Route('/'name'front.inter.index'methods:['GET'])]
  84.     public function index(
  85.         Request $request
  86.         MentionsRepository $mentionRepository,
  87.         BannieresRepository $banniereRepository,
  88.         ReferenceclientsRepository $referenceRepository
  89.         EntityManagerInterface $entityManager
  90.     ): Response
  91.     {
  92.         $annee date('Y');
  93.        // 1️⃣ Requête Doctrine (sans tri sur dates_session)
  94.         $queryBuilder $entityManager->createQueryBuilder();
  95.         $queryBuilder
  96.             ->select(
  97.                 'for.id','for.image','for.dates_session','for.prix','for.devise','th.nom',
  98.                 'th.slug','thm.nom AS thmnom','vil.nom AS vilnom','vil.pays'
  99.             )
  100.             ->from(Formations::class, 'for')
  101.             ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  102.             ->innerJoin(Villes::class, 'vil''WITH''for.ville = vil.id')
  103.             ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id');
  104.         $formations $queryBuilder->getQuery()->getResult();
  105.         // 2️⃣ Fonction : extraction DATE DE DÉBUT
  106.         $extractDateDebut = function (?string $datesSession): ?\DateTime {
  107.             if (!$datesSession) {
  108.                 return null;
  109.             }
  110.             $moisFr = [
  111.                 'janv'=>1,'janvier'=>1,
  112.                 'févr'=>2,'fevr'=>2,'février'=>2,
  113.                 'mars'=>3,
  114.                 'avr'=>4,'avril'=>4,
  115.                 'mai'=>5,
  116.                 'juin'=>6,
  117.                 'juil'=>7,'juillet'=>7,
  118.                 'août'=>8,'aout'=>8,
  119.                 'sept'=>9,'septembre'=>9,
  120.                 'oct'=>10,'octobre'=>10,
  121.                 'nov'=>11,'novembre'=>11,
  122.                 'déc'=>12,'dec'=>12,'décembre'=>12
  123.             ];
  124.             // Nettoyage
  125.             $text strtolower(trim($datesSession));
  126.             $text str_replace(['.'','], ''$text);
  127.             /**
  128.              * Exemples acceptés :
  129.              * 23 nov au 04 dec
  130.              * 29 juin au 10 juil
  131.              * 07 au 18 sept
  132.              */
  133.             if (preg_match('/(\d{1,2})\s*(janv|févr|fevr|mars|avr|mai|juin|juil|août|aout|sept|oct|nov|déc)?\s*au\s*\d{1,2}\s*(janv|févr|fevr|mars|avr|mai|juin|juil|août|aout|sept|oct|nov|déc)/i'$text$m)) {
  134.                 $jourDebut = (int) $m[1];
  135.                 $moisDebutTxt $m[2] ?: $m[3]; // parfois avant, parfois après "au"
  136.                 $moisDebut $moisFr[$moisDebutTxt] ?? null;
  137.                 if (!$moisDebut) {
  138.                     return null;
  139.                 }
  140.                 $today = new \DateTime('today');
  141.                 $year = (int) $today->format('Y');
  142.                 $date = new \DateTime(sprintf('%04d-%02d-%02d'$year$moisDebut$jourDebut));
  143.                 // Si la date est déjà passée → année suivante
  144.                 if ($date $today) {
  145.                     $date->modify('+1 year');
  146.                 }
  147.                 return $date;
  148.             }
  149.             return null;
  150.         };
  151.         $today = new \DateTime('today');
  152.         // 3️⃣ Filtrer UNIQUEMENT les formations à venir
  153.         $formations array_filter($formations, function ($f) use ($extractDateDebut) {
  154.             return $extractDateDebut($f['dates_session']) !== null;
  155.         });
  156.         // 4️⃣ Trier : plus proche → plus éloignée
  157.         usort($formations, function ($a$b) use ($extractDateDebut) {
  158.             return $extractDateDebut($a['dates_session'])
  159.                 <=> $extractDateDebut($b['dates_session']);
  160.         });  
  161.         // 5️⃣ Limiter à 3 formations (optionnel)
  162.         $formations array_slice($formations03);
  163.         //dd($formations);
  164.         
  165.         
  166.         
  167.         $queryBuilder $entityManager->createQueryBuilder();
  168.         $queryBuilder
  169.         ->select('actu')
  170.         ->from(Actualites::class, 'actu')
  171.         ->orderBy('actu.createdat''DESC')
  172.         ->setMaxResults(2);
  173.         $actualite $queryBuilder->getQuery()->getResult();
  174.         $reference $referenceRepository->findAll();
  175.         $mentions $mentionRepository->findAll();
  176.         
  177.         $bannieres $banniereRepository->findAll();
  178.         // dd($mentions);
  179.         
  180.         return $this->render('front/index.html.twig',[
  181.             'annee' => $annee,
  182.             'banniere' => $bannieres,
  183.             'mentions' => $mentions,
  184.             'reference' => $reference,
  185.             'formations' => $formations,
  186.             'actualite' => $actualite
  187.         ]);
  188.     }
  189.     
  190.     #[Route('/mediatheque/albums'name'front.inter.album'methods:['GET'])]
  191.     public function album(
  192.         Request $request
  193.         PaginatorInterface $paginator,
  194.         AlbumsRepository $albumRepository,
  195.         VideosRepository $videoRepository,
  196.         MentionsRepository $mentionRepository,
  197.         EntityManagerInterface $entityManager
  198.     ): Response
  199.     {
  200.         /*$queryBuilder = $entityManager->createQueryBuilder();
  201.         $queryBuilder
  202.             ->select('al','al.nom','al.slug','MIN(g.img_gal) AS image')
  203.             ->from(Albums::class, 'al')
  204.             ->innerJoin(Galeries::class, 'g', 'WITH', 'al.slug = g.nom')
  205.             ->where('al.statut = :statut')
  206.             ->setParameter('statut', 'Publié')
  207.             ->orderBy('al.createdat', 'DESC')
  208.             ->groupBy('al.id');
  209.         $albums = $queryBuilder->getQuery()->getResult();*/
  210.         $queryBuilder $entityManager->createQueryBuilder();
  211.         $queryBuilder
  212.             ->select('al, MIN(g.imgGal) AS image')
  213.             ->from(Albums::class, 'al')
  214.             ->innerJoin(Galeries::class, 'g''WITH''al.slug = g.nom')
  215.             ->where('al.statut = :statut')
  216.             ->setParameter('statut''Publié')
  217.             ->groupBy('al.id')
  218.             ->orderBy('al.createdat''DESC');
  219.         $albums $queryBuilder->getQuery()->getResult();
  220.         //dd($albums);
  221.         $pagination $paginator->paginate(
  222.             $queryBuilder,
  223.             $request->query->getInt('page'1),
  224.             12
  225.         );  
  226.         /*$albums = $albumRepository->findAll();
  227.         $videos = $videoRepository->findAll();*/
  228.         $mentions $mentionRepository->findAll();
  229.         return $this->render('front/multimedia/album.html.twig',[
  230.             'pagination' => $pagination,
  231.             'mentions' => $mentions
  232.         ]);
  233.     }
  234.     
  235.     #[Route('/notre-expertise'name'front.inter.expertise'methods:['GET'])]
  236.     public function expertise(
  237.         Request $request
  238.         ReferenceclientsRepository $referenceRepository,
  239.         ExpertisesRepository $expertiseRepository,
  240.         MentionsRepository $mentionRepository,
  241.         EntityManagerInterface $entityManager
  242.     ): Response
  243.     {
  244.         $expertise $expertiseRepository->findBy(['statut' => 'Publié']);
  245.         //dd($expertise);
  246.         $mentions $mentionRepository->findAll();
  247.         $reference $referenceRepository->findAll();
  248.         //dd($reference);
  249.         return $this->render('front/expertise.html.twig',[
  250.             'reference' => $reference,
  251.             'expertise' => $expertise,
  252.             'mentions' => $mentions
  253.         ]);
  254.     }
  255.     
  256.     #[Route('/mediatheque/album/{slug}'name'front.inter.image'methods:['GET'])]
  257.     public function galerie(
  258.         $slug,
  259.         Request $request
  260.         AlbumsRepository $albumRepository,
  261.         GaleriesRepository $galerieRepository,
  262.         MentionsRepository $mentionRepository,
  263.         EntityManagerInterface $entityManager
  264.     ): Response
  265.     {
  266.         //$galerie = $galerieRepository->findBy(['nom' => $slug]);
  267.         $queryBuilder $entityManager->createQueryBuilder()
  268.             ->select('gal.nom, gal.imgGal AS image')
  269.             ->from(Galeries::class, 'gal')
  270.             ->where('gal.nom = :slug')
  271.             ->setParameter('slug'$slug);
  272.         $galerie $queryBuilder->getQuery()->getArrayResult(); // retourne un tableau
  273.         $mentions $mentionRepository->findAll();
  274.         return $this->render('front/multimedia/galerie.html.twig',[
  275.             'slug' => $slug,
  276.             'galeries' => $galerie,
  277.             'mentions' => $mentions
  278.         ]);
  279.     }
  280.     #[Route('/mediatheque/video'name'front.inter.video'methods:['GET'])]
  281.     public function video(
  282.         Request $request
  283.         VideosRepository $videoRepository,
  284.         MentionsRepository $mentionRepository,
  285.         EntityManagerInterface $entityManager
  286.     ): Response
  287.     {
  288.         $videos $videoRepository->findBy(
  289.             ['statut' => 'Publié'],
  290.             ['createdat' => 'DESC']
  291.         );
  292.         //dd($videos);
  293.         $mentions $mentionRepository->findAll();
  294.         return $this->render('front/multimedia/video.html.twig',[
  295.             'videos' => $videos,
  296.             'mentions' => $mentions
  297.         ]);
  298.     }
  299.     
  300.     //-----------------------------------------------------------------------------------------------------
  301.     
  302.     #[Route('/formations/certificats/autres'name'front.inter.certificat.certyou'methods:['GET'])]
  303.     public function certificat_certyou(
  304.         Request $request
  305.         PaginatorInterface $paginator,
  306.         CertyousRepository $certyouRepository,
  307.         ManagementsRepository $managementRepository,
  308.         MentionsRepository $mentionRepository,
  309.         EntityManagerInterface $entityManager
  310.     ): Response
  311.     {
  312.         $certyou $certyouRepository->findAll();
  313.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  314.         
  315.         $queryBuilder $entityManager->createQueryBuilder();
  316.         $queryBuilder
  317.         ->select(
  318.             'cert.id','cert.prixpresentiel','cert.prixvirtuelle',
  319.             'cert.devise','cert.theme','cert.duree','cert.slug',
  320.             'cert.type','cert.createdat'
  321.         )
  322.         ->from(Certyous::class, 'cert');
  323.         $certyous $queryBuilder->getQuery()->getResult();
  324.         
  325.         $pagination $paginator->paginate(
  326.             $queryBuilder,
  327.             $request->query->getInt('page'1),
  328.             12
  329.         );  
  330.         
  331.         $mentions $mentionRepository->findAll();
  332.         return $this->render('front/certyou.html.twig',[
  333.             'manageLimit' => $manageLimit,
  334.             'pagination' => $certyous,
  335.             'mentions' => $mentions,
  336.         ]);
  337.     }
  338.     
  339.     ///---------------------------------------------------------------------------------------------------
  340.     
  341.     #[Route('/formations/certificats/autres/{slug}{id}'name'front.inter.certificat.certyou.inscription'methods:['GET','POST'])]
  342.     public function certificat_certyou_inscription(
  343.         $id,
  344.         $slug,
  345.         Request $request
  346.         MailerInterface $mailer,
  347.         PaginatorInterface $paginator,
  348.         CertyousRepository $certyouRepository,
  349.         SessionsRepository $sessionRepository,
  350.         ManagementsRepository $managementRepository,
  351.         MentionsRepository $mentionRepository,
  352.         EntityManagerInterface $entityManager
  353.     ): Response
  354.     {
  355.         //$certyou = $certyouRepository->findAll();
  356.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  357.         
  358.         $queryBuilder $entityManager->createQueryBuilder();
  359.         $queryBuilder
  360.             ->select('cert')
  361.             ->from(Certyous::class, 'cert')
  362.             ->where('cert.slug = :slug')
  363.             ->setParameter('slug'$slug);
  364.         $certyou $queryBuilder->getQuery()->getOneOrNullResult();
  365.         $sessions $sessionRepository->find($id);  
  366.         if (!$sessions) {
  367.             $this->addFlash(
  368.             'danger','Certificat introuvable');
  369.         }
  370.         
  371.         $Inscriptionpersos = new Inscriptionpersos();
  372.         $InscriptionCertyouForm $this->createForm(InscriptionCertyouFormType::class,null, [
  373.             'certyou' => $certyou
  374.         ]);
  375.         $InscriptionCertyouForm->handleRequest($request);
  376.         
  377.         if($InscriptionCertyouForm->isSubmitted()){
  378.             $theme str_replace('-'' '$slug);
  379.             $choix htmlspecialchars($InscriptionCertyouForm->get('choix')->getData());
  380.             $type htmlspecialchars($InscriptionCertyouForm->get('type')->getData());
  381.             $lieux htmlspecialchars($InscriptionCertyouForm->get('lieu')->getData());
  382.             $sessionEntity $InscriptionCertyouForm->get('session')->getData();
  383.             $session $sessionEntity $sessionEntity->getSession() : '';
  384.             //$choix = $certyou->getType();
  385.             $duree $certyou->getDuree();
  386.             $devise $certyou->getDevise();
  387.             
  388.             //$duree = htmlspecialchars($InscriptionCertyouForm->get('duree')->getData());
  389.             //$prixvirtuelle = htmlspecialchars($InscriptionCertyouForm->get('prixvirtuelle')->getData());
  390.             //$prixpresentiel = htmlspecialchars($InscriptionCertyouForm->get('prixpresentiel')->getData());
  391.             //$prixVirtuelle   = $certificat->getPrixvirtuelle();
  392.             //$prixPresentiel  = $certificat->getPrixpresentiel();
  393.             $civilite $InscriptionCertyouForm->get('civilite')->getData();
  394.             $nom $InscriptionCertyouForm->get('nom')->getData();
  395.             $prenoms $InscriptionCertyouForm->get('prenoms')->getData();
  396.             $fonction $InscriptionCertyouForm->get('fonction')->getData();
  397.             $adresse $InscriptionCertyouForm->get('adresse')->getData();
  398.             $mail $InscriptionCertyouForm->get('mail')->getData();
  399.             $entreprise $InscriptionCertyouForm->get('entreprise')->getData();
  400.             
  401.             $siteweb $InscriptionCertyouForm->get('siteweb')->getData();
  402.             $nbparticipant $InscriptionCertyouForm->get('nbparticipant')->getData();
  403.             $pays $InscriptionCertyouForm->get('pays')->getData();
  404.             $ville $InscriptionCertyouForm->get('ville')->getData();
  405.             $boitepostale $InscriptionCertyouForm->get('boitepostale')->getData();
  406.             $whatsapp $InscriptionCertyouForm->get('whatsapp')->getData();            
  407.             
  408.             $telephone $InscriptionCertyouForm->get('telephone')->getData();
  409.             $commentaire $InscriptionCertyouForm->get('commentaire')->getData(); 
  410.             
  411.             if ($type === 'presentiel') {
  412.                 //$prix = 'presentiel ' . $InscriptionCertyouForm->get('prixpresentiel')->getData();
  413.                 $prix $certyou->getPrixpresentiel();
  414.             } else {
  415.                 //$prix = 'virtuelle ' . $InscriptionCertyouForm->get('prixvirtuelle')->getData();
  416.                 $prix $certyou->getPrixvirtuelle();
  417.             }
  418.             
  419.             if ($lieux === '') {
  420.                 $lieu 'classe uniquement virtuelle';
  421.             } else {
  422.                 $lieu $lieux;
  423.             }
  424.             
  425.             if(!$commentaire){
  426.                 $commentaire " ";
  427.             }else{
  428.                 $commentaire $InscriptionCertyouForm->get('commentaire')->getData();
  429.             }
  430.             
  431.             /*dd($nom ,$prenoms ,$fonction ,$adresse ,$mail ,$entreprise ,$siteweb ,$nbparticipant ,$pays ,$ville ,$boitepostale ,
  432.             $whatsapp, $telephone, $theme, $type, $duree, $lieu, $prix, $session, $commentaire);*/
  433.             
  434.             $destinataire 'inscription@cimef-international.org';
  435.             $expediteur   $mail;
  436.             $reponse      $expediteur;
  437.             $suj "INSCRIPTION FORMATION 2026";
  438.             
  439.             $codehtml '<html><body>'.
  440.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  441.             <tr>
  442.             <td align="center">
  443.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  444.             <tr>
  445.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  446.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  447.             </td>
  448.             </tr>
  449.             <tr>
  450.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  451.             <p>Inscription de '.$civilite.' '.$prenoms.' '.$nom.' à la formation <strong>'.$theme.'</strong> organisée par <strong>CIMEF International</strong>.</p>
  452.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  453.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  454.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  455.             <p>
  456.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  457.             <strong>Fonction :</strong> '.$fonction.'<br>
  458.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  459.             <strong>Adresse :</strong> '.$adresse.'<br>
  460.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  461.             <strong>Boîte postale :</strong> '.$boitepostale.'
  462.             </p>
  463.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  464.             <p>
  465.             <strong>Email :</strong> '.$mail.'<br>
  466.             <strong>Téléphone :</strong> '.$telephone.'<br>
  467.             <strong>WhatsApp :</strong> '.$whatsapp.'<br>
  468.             <strong>Site web :</strong> '.$siteweb.'
  469.             </p>
  470.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  471.             <p>
  472.             <strong>Nombre de participants :</strong> '.$nbparticipant.'<br>
  473.             <strong>Commentaire :</strong> '.$commentaire.'
  474.             </p>
  475.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  476.             <p>
  477.             <strong>Thème :</strong> '.$theme.'<br>
  478.             <strong>Type :</strong> '.$type.'<br>
  479.             <strong>Durée :</strong> '.$duree.'<br>
  480.             <strong>Lieu :</strong> '.$lieu.'<br>
  481.             <strong>Prix :</strong> '.$prix.' '.$devise.'<br>
  482.             <strong>Session :</strong> '.$session.'
  483.             </p>
  484.             </td>
  485.             </tr>
  486.             <tr>
  487.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  488.             © '.date("Y").' CIMEF International — Tous droits réservés
  489.             </td>
  490.             </tr>
  491.             </table>
  492.             </td>
  493.             </tr>
  494.             </table>
  495.             </body></html>';
  496.             
  497.             $email = (new Email())
  498.             ->from('CIMEF International <inscription@cimef-international.org>')
  499.             ->to($destinataire)                 // destinataire principal
  500.             ->cc('medias@cimef-international.com'// COPIE
  501.             ->replyTo($expediteur)              // Reply-To:
  502.             ->subject($suj)     
  503.             ->text(strip_tags($codehtml))
  504.             ->html($codehtml);// Subject:
  505.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  506.             $mailer->send($email);
  507.             
  508.             $Inscriptionpersos->setNom($nom);
  509.             $Inscriptionpersos->setPrenoms($prenoms);
  510.             $Inscriptionpersos->setFonction($fonction);
  511.             $Inscriptionpersos->setAdresse($adresse);
  512.             $Inscriptionpersos->setMail($mail);
  513.             $Inscriptionpersos->setEntreprise($entreprise);
  514.             $Inscriptionpersos->setSiteweb($siteweb);
  515.             $Inscriptionpersos->setNbparticipant($nbparticipant);
  516.             $Inscriptionpersos->setPays($pays);
  517.             $Inscriptionpersos->setVille($ville);
  518.             $Inscriptionpersos->setBoitepostale($boitepostale);
  519.             $Inscriptionpersos->setWhatsapp($whatsapp);
  520.             $Inscriptionpersos->setTelephone($telephone);
  521.             $Inscriptionpersos->setCommentaire($commentaire);
  522.             $Inscriptionpersos->setTheme($theme);
  523.             $Inscriptionpersos->setType($type);
  524.             $Inscriptionpersos->setDuree($duree);
  525.             $Inscriptionpersos->setLieu($lieu);
  526.             $Inscriptionpersos->setPrix($prix);
  527.             $Inscriptionpersos->setSession($session);
  528.             
  529.             $entityManager->persist($Inscriptionpersos);
  530.             $entityManager->flush();
  531.             $this->addFlash(
  532.             'success',
  533.             'Votre inscription à été bien enregistrée');
  534.             return $this->redirectToRoute('front.inter.certificat.certyou',['slug' => $slug,'id' => $id]);
  535.         }
  536.    
  537.         $mentions $mentionRepository->findAll();
  538.         return $this->render('front/inscriptions/inscription-certyou.html.twig',[
  539.             'id' => $id,
  540.             'slug' => $slug,
  541.             'certyou' => $certyou,
  542.             'mentions' => $mentions,
  543.             'sessions' => $sessions,
  544.             'manageLimit' => $manageLimit,
  545.             'inscriptionCertyouForm' => $InscriptionCertyouForm->createView(),
  546.         ]);
  547.     }
  548.     //-----------------------------------------------------------------------------------------------------
  549.     
  550.     #[Route('/formations/certificats/internationaux'name'front.inter.certificat.inter'methods:['GET'])]
  551.     public function certificat(
  552.         Request $request
  553.         PaginatorInterface $paginator,
  554.         CertificatsRepository $certificatRepository,
  555.         ManagementsRepository $managementRepository,
  556.         MentionsRepository $mentionRepository,
  557.         EntityManagerInterface $entityManager
  558.     ): Response
  559.     {
  560.         $certificat $certificatRepository->findAll();
  561.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  562.         
  563.         $queryBuilder $entityManager->createQueryBuilder();
  564.         $sub $entityManager->createQueryBuilder()
  565.             ->select('MAX(c2.createdat)')
  566.             ->from(Certificats::class, 'c2')
  567.             ->where('c2.theme = cert.theme');
  568.         $queryBuilder
  569.             ->select('cert.id','cert.session','cert.prix','cert.slug','cert.devise',
  570.                 'vil.nom AS vilnom','vil.pays','cert.createdat','cert.type','cert.theme')
  571.             ->from(Certificats::class, 'cert')
  572.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  573.             ->where($queryBuilder->expr()->eq('cert.createdat''(' $sub->getDQL() . ')'))
  574.             ->orderBy('cert.createdat''DESC');
  575.         $certificat $queryBuilder->getQuery()->getResult();
  576.         $pagination $paginator->paginate(
  577.             $queryBuilder,
  578.             $request->query->getInt('page'1),
  579.             12
  580.         );  
  581.             
  582.         $mentions $mentionRepository->findAll();
  583.         return $this->render('front/certificat.html.twig',[
  584.             'manageLimit' => $manageLimit,
  585.             'pagination' => $certificat,
  586.             'mentions' => $mentions,
  587.         ]);
  588.     }
  589.     #[Route('/formtaions/certificats/internationaux/{slug}'name'front.inter.detail.certificat'methods:['GET'])]
  590.     public function detail_certificat(
  591.         $slug,
  592.         Request $request
  593.         PaginatorInterface $paginator,
  594.         CertificatsRepository $certificatRepository,
  595.         ManagementsRepository $managementRepository,
  596.         MentionsRepository $mentionRepository,
  597.         EntityManagerInterface $entityManager
  598.     ): Response
  599.     {
  600.         $certificat $certificatRepository->findAll();
  601.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  602.         
  603.         $queryBuilder $entityManager->createQueryBuilder();
  604.         $queryBuilder
  605.             ->select(
  606.                 'cert.id','cert.session','cert.prix','cert.slug',
  607.                 'cert.devise','cert.theme','vil.nom AS vilnom',
  608.                 'vil.pays','cert.createdat','cert.type'
  609.             )
  610.             ->from(Certificats::class, 'cert')
  611.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  612.             ->where('cert.slug = :slug')
  613.             ->setParameter('slug'$slug);
  614.         $certificat $queryBuilder->getQuery()->getResult();
  615.         $pagination $paginator->paginate(
  616.             $queryBuilder,
  617.             $request->query->getInt('page'1),
  618.             12
  619.         ); 
  620.             
  621.         $mentions $mentionRepository->findAll();
  622.         return $this->render('front/liste-certificat.html.twig',[
  623.             'manageLimit' => $manageLimit,
  624.             'pagination' => $pagination,
  625.             'mentions' => $mentions,
  626.             'slug' => $slug
  627.         ]);
  628.     }
  629.     
  630.     #[Route('/presentation'name'front.inter.presentation'methods:['GET'])]
  631.     public function presentation(
  632.         Request $request
  633.         PartenairesRepository $partenaireRepository,
  634.         FormationsRepository $formationRepository,
  635.         AboutsRepository $aboutRepository
  636.         ValeursRepository $valeurRepository,
  637.         AvisRepository $avisRepository,
  638.         MentionsRepository $mentionRepository,
  639.         EntityManagerInterface $entityManager
  640.     ): Response
  641.     {
  642.         $avis $avisRepository->findAll();
  643.         $All_partenaire $partenaireRepository->findAll();
  644.         $All_about $aboutRepository->findAll();
  645.         $All_valeur $valeurRepository->findAll();
  646.         $mentions $mentionRepository->findAll();
  647.         return $this->render('front/qui-sommes-nous.html.twig',[
  648.             'partenaires' => $All_partenaire,
  649.             'valeur' => $All_valeur,
  650.             'mentions' => $mentions,
  651.             'about' => $All_about,
  652.             'avis' => $avis,
  653.         ]);
  654.     }
  655.     #[Route('/formations/rencontre-top-management'name'front.top.management'methods:['GET'])]
  656.     public function management(
  657.         Request $request
  658.         PaginatorInterface $paginator,
  659.         MentionsRepository $mentionRepository,
  660.         ManagementsRepository $managementRepository,
  661.         EntityManagerInterface $entityManager
  662.     ): Response
  663.     {
  664.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  665.         // dd($manageLimit);
  666.         $queryBuilder $entityManager->createQueryBuilder();
  667.         $queryBuilder
  668.         ->select('man')
  669.         ->from(Managements::class, 'man')
  670.         ->orderBy('man.createdat''DESC');
  671.         $listmanagement $queryBuilder->getQuery()->getResult();
  672.         
  673.         $pagination $paginator->paginate(
  674.             $queryBuilder,
  675.             $request->query->getInt('page'1),
  676.             10
  677.         );  
  678.         $mentions $mentionRepository->findAll();
  679.         return $this->render('front/rencontre-management.html.twig',[
  680.             'mentions' => $mentions,
  681.             'pagination' => $listmanagement,
  682.             'manageLimit' => $manageLimit
  683.         ]);
  684.     }
  685.     
  686.     #[Route('/formations/rencontre-top-management/{slug}'name'front.seminaire.management.detail'methods:['GET'])]
  687.     public function detail_management(
  688.         $slug,
  689.         Request $request
  690.         ManagementsRepository $managementRepository,
  691.         MentionsRepository $mentionRepository,
  692.         EntityManagerInterface $entityManager
  693.     ): Response
  694.     {
  695.         $query $managementRepository->findOneBy(array('slug' => $slug));
  696.         $mentions $mentionRepository->findAll();
  697.         // dd($query);
  698.         return $this->render('front/detail/detail-rencontre.html.twig',[
  699.             'mentions' => $mentions,
  700.             'query' => $query
  701.         ]);
  702.     }
  703.     /*#[Route('/formation/seminaires/internationaux', name: 'front.seminaire.internationaux', methods:['GET'])]
  704.     public function sem_inter(
  705.         Request $request, 
  706.         PaginatorInterface $paginator,
  707.         MentionsRepository $mentionRepository,
  708.         EntityManagerInterface $entityManager
  709.     ): Response
  710.     {
  711.         $recherche = $this->createForm(RechercheFormType::class);
  712.         $recherche->handleRequest($request);
  713.         if ($recherche->isSubmitted()) {
  714.             $mot = $recherche->get('mot')->getData() ?? '';
  715.             $ville = $recherche->get('ville')->getData() ?? null;
  716.             $nomVille = $ville ? $ville->getNom() : null;
  717.             $motLike = '%'.$mot.'%';
  718.             // 2️⃣ Construire la requête
  719.             $queryBuilder = $entityManager->createQueryBuilder();
  720.             $queryBuilder
  721.                 ->select('for.id', 'for.dates_session','for.image', 'for.prix', 'for.devise', 'th.nom', 
  722.                 'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at', 'th.slug')
  723.                 ->from(Formations::class, 'for')
  724.                 ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  725.                 ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  726.                  ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  727.                 ->where('th.nom LIKE :mot')
  728.                 ->orwhere('thm.nom LIKE :mot')
  729.                 ->setParameter('mot', $motLike);
  730.                 if ($ville) {
  731.                     $queryBuilder->andWhere('vil.nom = :ville')
  732.                     ->setParameter('ville', $nomVille);
  733.                     $query = $queryBuilder->getQuery()->getResult();
  734.                 }
  735.             $queryBuilder->orderBy('for.created_at', 'DESC');
  736.             // 3️⃣ Pagination
  737.             $pagination = $paginator->paginate(
  738.                 $queryBuilder,
  739.                 $request->query->getInt('page', 1),
  740.                 12
  741.             );
  742.             $annee = date('Y');
  743.             $mentions = $mentionRepository->findAll();
  744.             // 4️⃣ Affichage
  745.             return $this->render('front/seminaire_recherche.html.twig', [
  746.                 'recherche' => $recherche->createView(),
  747.                 'pagination' => $pagination,
  748.                 'mot' => $mot,
  749.                 'mentions' => $mentions,
  750.                 'ville' => $ville,
  751.                 'annee' => $annee,
  752.             ]);
  753.          }
  754.  
  755.         $annee = date('Y');
  756.         $queryBuilder = $entityManager->createQueryBuilder();
  757.         $queryBuilder
  758.         ->select('for.id', 'for.dates_session','for.image', 'for.prix', 'for.devise', 'th.nom', 
  759.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at', 'th.slug'
  760.         )
  761.         ->from(Formations::class, 'for')
  762.         ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  763.         ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  764.         ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  765.         ->orderBy('for.created_at', 'DESC');
  766.         
  767.         $pagination = $paginator->paginate(
  768.             $queryBuilder,
  769.             $request->query->getInt('page', 1),
  770.             12
  771.         );  
  772.         $mentions = $mentionRepository->findAll();
  773.         
  774.         return $this->render('front/seminaire_inter.html.twig',[
  775.             'annee' => $annee,
  776.             'mentions' => $mentions,
  777.             'pagination' => $pagination,
  778.             'recherche' => $recherche->createView()
  779.         ]);
  780.     }*/
  781.     /*
  782.     #[Route('/formation/seminaires/internationaux', name: 'front.seminaire.internationaux', methods:['GET'])]
  783.     public function sem_inter(
  784.         Request $request, 
  785.         PaginatorInterface $paginator,
  786.         MentionsRepository $mentionRepository,
  787.         EntityManagerInterface $entityManager
  788.     ): Response
  789.     {
  790.         $recherche = $this->createForm(RechercheFormType::class);
  791.         $recherche->handleRequest($request);
  792.         $annee = date('Y');
  793.         $mentions = $mentionRepository->findAll();
  794.         //Sous-requête : obtenir la dernière formation par thème
  795.         
  796.         $subQuery = $entityManager->createQueryBuilder()
  797.             ->select('MAX(f2.id)')
  798.             ->from(Formations::class, 'f2')
  799.             ->innerJoin('f2.theme', 't2')
  800.             ->groupBy('t2.id');
  801.     
  802.         //Requête principale
  803.         $queryBuilder = $entityManager->createQueryBuilder();
  804.         $queryBuilder
  805.             ->select('for.id','for.dates_session','for.image','for.prix',
  806.                 'for.devise','for.created_at','th.nom','th.slug',
  807.                 'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays'
  808.             )
  809.             ->from(Formations::class, 'for')
  810.             ->innerJoin('for.theme', 'th')
  811.             ->innerJoin('th.thematique', 'thm')
  812.             ->innerJoin('for.ville', 'vil')
  813.             ->where($queryBuilder->expr()->in('for.id', $subQuery->getDQL()));
  814.             
  815.             
  816.         //Recherche
  817.         if ($recherche->isSubmitted()) {
  818.             $mot = $recherche->get('mot')->getData() ?? '';
  819.             $ville = $recherche->get('ville')->getData() ?? null;
  820.             $nomVille = $ville ? $ville->getNom() : null;
  821.             if ($mot) {
  822.                 $motLike = '%' . $mot . '%';
  823.                 $queryBuilder->andWhere(
  824.                     $queryBuilder->expr()->orX(
  825.                         'th.nom LIKE :mot',
  826.                         'thm.nom LIKE :mot'
  827.                     )
  828.                 )
  829.                 ->setParameter('mot', $motLike);
  830.             }
  831.             if ($ville) {
  832.                 $queryBuilder
  833.                     ->andWhere('vil.nom = :ville')
  834.                     ->setParameter('ville', $nomVille);
  835.             }
  836.         }
  837.         $queryBuilder->orderBy('for.created_at', 'DESC');
  838.     
  839.         //Pagination
  840.         $pagination = $paginator->paginate(
  841.             $queryBuilder,
  842.             $request->query->getInt('page', 1),
  843.             12
  844.         );
  845.     
  846.         return $this->render('front/seminaire_inter.html.twig', [
  847.             'annee' => $annee,
  848.             'mentions' => $mentions,
  849.             'pagination' => $pagination,
  850.             'recherche' => $recherche->createView(),
  851.         ]);
  852.     }*/
  853.     
  854.     #[Route('/formation/seminaires/internationaux'name'front.seminaire.internationaux'methods:['GET'])]
  855.     public function sem_inter(
  856.         Request $request,
  857.         PaginatorInterface $paginator,
  858.         MentionsRepository $mentionRepository,
  859.         EntityManagerInterface $entityManager
  860.     ): Response
  861.     {
  862.         $recherche $this->createForm(RechercheFormType::class);
  863.         $recherche->handleRequest($request);
  864.     
  865.         $annee = (int) date('Y');
  866.         $today = new \DateTime('today');
  867.         $mentions $mentionRepository->findAll();
  868.     
  869.         $qb $entityManager->createQueryBuilder();
  870.         $qb ->select('for','th','thm','vil')
  871.             ->from(Formations::class, 'for')
  872.             ->innerJoin('for.theme''th')
  873.             ->innerJoin('th.thematique''thm')
  874.             ->innerJoin('for.ville''vil')
  875.             ->Where('vil != :ville')
  876.             ->setParameter('ville''SHANGHAI');
  877.     
  878.         if ($recherche->isSubmitted() && $recherche->isValid()) {
  879.             $mot $recherche->get('mot')->getData();
  880.             $ville $recherche->get('ville')->getData();
  881.             if ($ville && strtoupper($ville->getNom()) === 'SHANGHAI') {
  882.                 // On ignore silencieusement
  883.                 $ville null;
  884.             }
  885.             $nom $mot->getNom();
  886.             if ($mot) {
  887.                 $qb ->andWhere($qb->expr()->orX('th.nom LIKE :mot','thm.nom LIKE :mot'))
  888.                     ->setParameter('mot''%' $nom '%');
  889.             }
  890.             if ($ville) {
  891.                 $qb ->andWhere('vil = :ville')
  892.                     ->setParameter('ville'$ville);
  893.             }
  894.         }
  895.     
  896.         $formations $qb->getQuery()->getResult();
  897.     
  898.         $extractDateDebut = function (?string $datesSession): ?\DateTime {
  899.     
  900.             if (!$datesSession) return null;
  901.             $mois = [
  902.                 'janv'=>1,'janvier'=>1,
  903.                 'févr'=>2,'fevr'=>2,'février'=>2,
  904.                 'mars'=>3,
  905.                 'avr'=>4,'avril'=>4,
  906.                 'mai'=>5,
  907.                 'juin'=>6,
  908.                 'juil'=>7,'juillet'=>7,
  909.                 'août'=>8,'aout'=>8,
  910.                 'sept'=>9,'septembre'=>9,
  911.                 'oct'=>10,'octobre'=>10,
  912.                 'nov'=>11,'novembre'=>11,
  913.                 'déc'=>12,'dec'=>12,'décembre'=>12
  914.             ];
  915.             $text strtolower(str_replace(['.'','], ''trim($datesSession)));
  916.             if (!preg_match(
  917.                 '/(\d{1,2})\s*(janv|févr|fevr|mars|avr|mai|juin|juil|août|aout|sept|oct|nov|déc)?\s*au\s*\d{1,2}\s*(janv|févr|fevr|mars|avr|mai|juin|juil|août|aout|sept|oct|nov|déc)/i',
  918.                 $text,
  919.                 $m
  920.             )) {
  921.                 return null;
  922.             }
  923.             $jour = (int) $m[1];
  924.             $moisTxt $m[2] ?: $m[3];
  925.             $moisNum $mois[$moisTxt] ?? null;
  926.             if (!$moisNum) return null;
  927.     
  928.             $date = new \DateTime(sprintf('%d-%02d-%02d'date('Y'), $moisNum$jour));
  929.     
  930.             if ($date < new \DateTime('today')) {
  931.                 $date->modify('+1 year');
  932.             }
  933.             return $date;
  934.         };
  935.     
  936.         $formationsParTheme = [];
  937.         foreach ($formations as $formation) {
  938.     
  939.             $dateDebut $extractDateDebut($formation->getDatesSession());
  940.             if (!$dateDebut || $dateDebut $today || (int)$dateDebut->format('Y') !== $annee) {
  941.                 continue;
  942.             }
  943.             $themeId $formation->getTheme()->getId();
  944.             if (
  945.                 !isset($formationsParTheme[$themeId]) ||
  946.                 $dateDebut $formationsParTheme[$themeId]['date']
  947.             ) {
  948.                 $formationsParTheme[$themeId] = [
  949.                     'formation' => $formation,
  950.                     'date'      => $dateDebut
  951.                 ];
  952.             }
  953.         }
  954.     
  955.         $formationsFinales array_map(fn($f) => $f['formation'], $formationsParTheme);
  956.         usort($formationsFinales, function ($a$b) use ($extractDateDebut) {
  957.             return $extractDateDebut($a->getDatesSession())
  958.                 <=> $extractDateDebut($b->getDatesSession());
  959.         });
  960.     
  961.         $pagination $paginator->paginate(
  962.             $formationsFinales,
  963.             $request->query->getInt('page'1),
  964.             12
  965.         );
  966.     
  967.         return $this->render('front/seminaire_inter.html.twig', [
  968.             'annee'      => $annee,
  969.             'mentions'   => $mentions,
  970.             'pagination' => $pagination,
  971.             'recherche'  => $recherche->createView(),
  972.         ]);
  973.     }
  974.     
  975.     /*
  976.     #[Route('/formations/seminaires/nationaux', name: 'front.seminaire.nationaux', methods:['GET'])]
  977.     public function sem_nat(
  978.         Request $request, 
  979.         GeoIpService $geo,
  980.         PaginatorInterface $paginator,
  981.         MentionsRepository $mentionRepository,
  982.         EntityManagerInterface $entityManager
  983.     ): Response
  984.     {
  985.         $ip = $request->getClientIp(); // récupère IP utilisateur
  986.         $geoData = $geo->getGeoData($ip);
  987.         // dd($geoData);
  988.         // Exemple : utilisation dans le contrôleur
  989.         $pays        = $geoData['country'];
  990.         $codePays    = $geoData['country_code'];
  991.         $ville       = $geoData['city'];
  992.         $ipTrouvee   = $geoData['ip'];
  993.         $annee = date('Y');
  994.         if($pays === 'Local' || $pays === 'Ivory Coast') {
  995.             $getpays = "Côte d'ivoire";
  996.         }else{
  997.             $getpays = $pays;
  998.         }
  999.         
  1000.         
  1001.         
  1002.         $recherche = $this->createForm(RechercheFormType::class);
  1003.         $rechercheNat = $this->createForm(RechercheNatFormType::class);
  1004.         $rechercheNat->handleRequest($request);
  1005.         if ($rechercheNat->isSubmitted()) {
  1006.             $mot = $rechercheNat->get('mot')->getData() ?? '';
  1007.             //$mot = $recherche->get('mot')->getData() ?? '';
  1008.             $motLike = '%'.$mot.'%';
  1009.             // 2️⃣ Construire la requête
  1010.             $queryBuilder = $entityManager->createQueryBuilder();
  1011.             $queryBuilder
  1012.                 ->select('for.id', 'for.dates_session','for.image', 'for.prix', 'for.devise', 'th.nom', 
  1013.                 'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at', 'th.slug')
  1014.                 ->from(Formations::class, 'for')
  1015.                 ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  1016.                 ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  1017.                  ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  1018.                 ->where('th.nom LIKE :mot')
  1019.                 ->orwhere('thm.nom LIKE :mot')
  1020.                 ->setParameter('mot', $motLike);
  1021.                 // Filtrer par ville si sélectionnée/ $queryBu
  1022.             $query = $queryBuilder->getQuery()->getResult();
  1023.             $queryBuilder->orderBy('for.created_at', 'DESC');
  1024.             // 3️⃣ Pagination
  1025.             $pagination = $paginator->paginate(
  1026.                 $queryBuilder,
  1027.                 $request->query->getInt('page', 1),
  1028.                 12
  1029.             );
  1030.             $annee = date('Y');
  1031.             $mentions = $mentionRepository->findAll();
  1032.             // 4️⃣ Affichage
  1033.             return $this->render('front/seminaire_recherche.html.twig', [
  1034.                 'recherche' => $recherche->createView(),
  1035.                 'pagination' => $pagination,
  1036.                 'mot' => $mot,
  1037.                 'mentions' => $mentions,
  1038.                 'ville' => $ville,
  1039.                 'annee' => $annee,
  1040.             ]);
  1041.          }
  1042.         
  1043.         $queryBuilder = $entityManager->createQueryBuilder();
  1044.         $queryBuilder
  1045.         ->select('for.id', 'for.dates_session','for.image', 'for.prix', 'for.devise', 'th.nom', 
  1046.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at', 'th.slug' 
  1047.         )
  1048.         ->from(Formations::class, 'for')
  1049.         ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  1050.         ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  1051.         ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  1052.         ->where('vil.pays = :pays')
  1053.         ->setParameter('pays', $getpays)
  1054.         ->orderBy('for.created_at', 'DESC');
  1055.         $query = $queryBuilder->getQuery()->getResult();
  1056.         
  1057.         $pagination = $paginator->paginate(
  1058.             $queryBuilder,
  1059.             $request->query->getInt('page', 1),
  1060.             12
  1061.         );  
  1062.         $mentions = $mentionRepository->findAll();
  1063.         return $this->render('front/seminaire_nat.html.twig',[
  1064.             'annee' => $annee,
  1065.             'mentions' => $mentions,
  1066.             'recherche' => $rechercheNat->createView(),
  1067.             'pagination' => $pagination
  1068.         ]);
  1069.     }*/
  1070.     
  1071.     #[Route('/formations/seminaires/nationaux'name'front.seminaire.nationaux'methods:['GET'])]
  1072.     public function semNat(
  1073.         Request $request,
  1074.         GeoIpService $geo,
  1075.         PaginatorInterface $paginator,
  1076.         MentionsRepository $mentionRepository,
  1077.         EntityManagerInterface $entityManager
  1078.     ): Response
  1079.     {
  1080.         $annee date('Y');
  1081.         $today = new \DateTime();
  1082.     
  1083.         // 🌍 Géo IP
  1084.         $geoData $geo->getGeoData($request->getClientIp());
  1085.         $pays $geoData['country'] ?? '';
  1086.         $ville $geoData['city'] ?? '';
  1087.     
  1088.     
  1089.         // Correction du nom du pays
  1090.         if ($pays === 'Local' || $pays === 'Ivory Coast') {
  1091.             $getpays "Côte d'ivoire";
  1092.         } else {
  1093.             $getpays $pays;
  1094.         }
  1095.     
  1096.         // 🔍 Formulaire de recherche
  1097.         $rechercheNat $this->createForm(RechercheNatFormType::class);
  1098.         $rechercheNat->handleRequest($request);
  1099.     
  1100.         // 🔹 Requête pour récupérer les formations nationales
  1101.         $qb $entityManager->createQueryBuilder()
  1102.             ->select('f''th''thm''vil')
  1103.             ->from(Formations::class, 'f')
  1104.             ->innerJoin('f.theme''th')
  1105.             ->innerJoin('th.thematique''thm')
  1106.             ->innerJoin('f.ville''vil')
  1107.             ->where('vil.pays = :pays')
  1108.             ->setParameter('pays'$getpays);
  1109.     
  1110.         // 🔍 Filtrer par recherche si soumise
  1111.         if ($rechercheNat->isSubmitted() && $rechercheNat->isValid()) {
  1112.             $mot $rechercheNat->get('mot')->getData() ?? '';
  1113.             $nom $mot->getNom();
  1114.             if ($mot) {
  1115.                 $qb->andWhere(
  1116.                     $qb->expr()->orX(
  1117.                         'th.nom LIKE :mot',
  1118.                         'thm.nom LIKE :mot'
  1119.                     )
  1120.                 )->setParameter('mot''%' $nom '%');
  1121.             }
  1122.         }
  1123.     
  1124.         // 📄 Récupération des formations
  1125.         $formations $qb->getQuery()->getResult();
  1126.     
  1127.         $extractDates = function(?string $datesSession): ?array {
  1128.         if (!$datesSession) return null;
  1129.     
  1130.             $moisFr = [
  1131.                 'janv'=>1,'janvier'=>1,'févr'=>2,'fevr'=>2,'février'=>2,
  1132.                 'mars'=>3,'avr'=>4,'avril'=>4,'mai'=>5,'juin'=>6,
  1133.                 'juil'=>7,'juillet'=>7,'août'=>8,'aout'=>8,
  1134.                 'sept'=>9,'septembre'=>9,'oct'=>10,'octobre'=>10,
  1135.                 'nov'=>11,'novembre'=>11,'déc'=>12,'dec'=>12,'décembre'=>12
  1136.             ];
  1137.         
  1138.             $text strtolower(trim($datesSession));
  1139.             $text str_replace(['.'','], ''$text);
  1140.         
  1141.             if (preg_match('/(\d{1,2})\s*(\w+)?\s*au\s*(\d{1,2})\s*(\w+)?/i'$text$m)) {
  1142.                 $jourDebut = (int)$m[1];
  1143.                 $moisDebut $moisFr[$m[2] ?? ''] ?? null;
  1144.                 $jourFin = (int)$m[3];
  1145.                 $moisFin $moisFr[$m[4] ?? ''] ?? $moisDebut;
  1146.         
  1147.                 if (!$moisDebut || !$moisFin) return null;
  1148.         
  1149.                 $annee = (int)date('Y');
  1150.                 $dateDebut = new \DateTime(sprintf('%04d-%02d-%02d'$annee$moisDebut$jourDebut));
  1151.                 $dateFin = new \DateTime(sprintf('%04d-%02d-%02d'$annee$moisFin$jourFin));
  1152.         
  1153.                 if ($dateFin $dateDebut$dateFin->modify('+1 year');
  1154.         
  1155.                 return ['debut' => $dateDebut'fin' => $dateFin];
  1156.             }
  1157.         
  1158.             return null;
  1159.         };
  1160.         // 🔹 Filtrer uniquement les formations à venir
  1161.         $today = new \DateTime('today');
  1162.         
  1163.         $formations array_filter($formations, function($f) use ($extractDates$today) {
  1164.             $dates $extractDates($f->getDatesSession());
  1165.             if (!$dates) return false;
  1166.         
  1167.             // garder uniquement les formations dont la date de début est après aujourd'hui
  1168.             return $dates['debut'] > $today;
  1169.         });
  1170.         // 🔹 Trier par date la plus proche
  1171.         usort($formations, function($a$b) use ($extractDates) {
  1172.             return $extractDates($a->getDatesSession())['debut'] <=> $extractDates($b->getDatesSession())['debut'];
  1173.         });
  1174.         // 📄 Pagination
  1175.         $pagination $paginator->paginate(
  1176.             $formations,
  1177.             $request->query->getInt('page'1),
  1178.             12
  1179.         );
  1180.     
  1181.         $mentions $mentionRepository->findAll();
  1182.     
  1183.         // 🔹 Rendu Twig
  1184.         return $this->render('front/seminaire_nat.html.twig', [
  1185.             'annee' => $annee,
  1186.             'mentions' => $mentions,
  1187.             'recherche' => $rechercheNat->createView(),
  1188.             'pagination' => $pagination,
  1189.             'ville' => $ville,
  1190.             'pays' => $getpays,
  1191.         ]);
  1192.     }
  1193.     
  1194.     // #[Route('/generate-slugs', name: 'generate_slugs')]
  1195.     // public function generateSlugs(
  1196.     //     SluggerInterface $slugger, 
  1197.     //     VillesRepository $repo,
  1198.     //     EntityManagerInterface $em)
  1199.     // {
  1200.     //     $categories = $repo->findAll();
  1201.     //     foreach ($categories as $cat) {
  1202.             
  1203.     //         $slug = $slugger->slug( $cat->getNom());
  1204.     //         $cat->setSlug($slug);
  1205.     //     }
  1206.     //     $em->flush();
  1207.     //     return new Response("Slugs générés !");
  1208.     // }
  1209.     
  1210.     /*
  1211.     #[Route('/formations/{seminaires}/{slug}/{id}code/inscriptions', name: 'front.inscription', methods:['GET','POST'])]
  1212.     public function inscription_sem(
  1213.         $slug,
  1214.         $seminaires,
  1215.         $id,
  1216.         Request $request,
  1217.         MailerInterface $mailer,
  1218.         InscriptionsRepository $inscriptionRepository,
  1219.         VillesRepository $villeRepository,
  1220.         ThemesRepository $themeRepository,
  1221.         FormationsRepository $formationRepository,
  1222.         MentionsRepository $mentionRepository,
  1223.         EntityManagerInterface $entityManager
  1224.     ): Response
  1225.     {
  1226.         
  1227.         $annee = date('Y');
  1228.         $queryBuilder = $entityManager->createQueryBuilder();
  1229.         $queryBuilder
  1230.         ->select('for.id', 'for.dates_session', 'for.prix', 'for.devise', 'th.nom', 
  1231.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  1232.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  1233.         )
  1234.         ->from(Formations::class, 'for')
  1235.         ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  1236.         ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  1237.         ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  1238.         ->where('th.slug = :theme')
  1239.         ->andwhere('for.id = :forid')
  1240.         ->setParameter('theme', $slug)
  1241.         ->setParameter('forid', $id);
  1242.         $query = $queryBuilder->getQuery()->getResult(); 
  1243.         $mentions = $mentionRepository->findAll();
  1244.         $inscription = new Inscriptions();
  1245.         $inscriptionForm = $this->createForm(InscriptionFormType::class, $inscription);
  1246.         $inscriptionForm->handleRequest($request);
  1247.         
  1248.         if ($inscriptionForm->isSubmitted()) {
  1249.             $nom = $inscriptionForm->get('nom')->getData();
  1250.             $prenoms = $inscriptionForm->get('prenoms')->getData();
  1251.             $fonction = $inscriptionForm->get('fonction')->getData();
  1252.             $adresse = $inscriptionForm->get('adresse')->getData();
  1253.             $mail = $inscriptionForm->get('mail')->getData();
  1254.             $entreprise = $inscriptionForm->get('entreprise')->getData();
  1255.             
  1256.             $siteweb = $inscriptionForm->get('siteweb')->getData();
  1257.             $nbparticipant = $inscriptionForm->get('nbparticipant')->getData();
  1258.             $pays = $inscriptionForm->get('pays')->getData();
  1259.             $ville = $inscriptionForm->get('ville')->getData();
  1260.             $boitepostale = $inscriptionForm->get('boitepostale')->getData();
  1261.             $whatsapp = $inscriptionForm->get('whatsapp')->getData();            
  1262.             
  1263.             $telephone = $inscriptionForm->get('telephone')->getData();
  1264.             $commentaire = $inscriptionForm->get('commentaire')->getData(); 
  1265.             $formation = $formationRepository->find($id);
  1266.             //dd($formation->getId());
  1267.             
  1268.             $theme = $formation->getTheme();
  1269.             $idville = $formation->getVille();
  1270.             $session = $formation->getDatesSession();
  1271.             $prix = $formation->getPrix();
  1272.             $devise = $formation->getDevise();
  1273.             
  1274.             $villes = $villeRepository->find($idville);
  1275.             $nomtheme = $theme->getNom();
  1276.             $nomville = $villes->getNom();
  1277.             
  1278.             if(!$commentaire){
  1279.                 $commentaire = "...";
  1280.             }else{
  1281.                 $commentaire = $inscriptionForm->get('commentaire')->getData();
  1282.             }
  1283.             
  1284.             $codehtml = '<html><body>'.
  1285.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  1286.             <tr>
  1287.             <td align="center">
  1288.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  1289.             <tr>
  1290.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  1291.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  1292.             </td>
  1293.             </tr>
  1294.             <tr>
  1295.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  1296.             <p>Inscription de M/Mme <strong>'.$prenoms.' '.$nom.'</strong> à la formation <strong>'.$nomtheme.'</strong> organisée par <strong>CIMEF International</strong>.</p>
  1297.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  1298.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  1299.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  1300.             <p>
  1301.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  1302.             <strong>Fonction :</strong> '.$fonction.'<br>
  1303.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  1304.             <strong>Adresse :</strong> '.$adresse.'<br>
  1305.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  1306.             <strong>Boîte postale :</strong> '.$boitepostale.'
  1307.             </p>
  1308.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  1309.             <p>
  1310.             <strong>Email :</strong> '.$mail.'<br>
  1311.             <strong>Téléphone :</strong> '.$telephone.'<br>
  1312.             <strong>WhatsApp :</strong> '.$whatsapp.'<br>
  1313.             <strong>Site web :</strong> '.$siteweb.'
  1314.             </p>
  1315.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  1316.             <p>
  1317.             <strong>Nombre de participants :</strong> '.$nbparticipant.'<br>
  1318.             <strong>Commentaire :</strong> '.$commentaire.'
  1319.             </p>
  1320.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  1321.             <p>
  1322.             <strong>Thème :</strong> '.$nomtheme.'<br>
  1323.             <strong>Ville :</strong> '.$nomville.'<br>
  1324.             <strong>Prix :</strong> '.$prix.''.$devise.'<br>
  1325.             <strong>Session :</strong> '.$session.'
  1326.             </p>
  1327.             </td>
  1328.             </tr>
  1329.             <tr>
  1330.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  1331.             © '.date("Y").' CIMEF International — Tous droits réservés
  1332.             </td>
  1333.             </tr>
  1334.             </table>
  1335.             </td>
  1336.             </tr>
  1337.             </table>
  1338.             </body></html>';
  1339.             
  1340.             
  1341.             $secretKey = '6LfPYkosAAAAAJQFLCC-9U5bF6KdFTPrgmbxg5Ux';
  1342.             $value = $request->get('g-recaptcha-response');
  1343.             $userIP = $_SERVER['REMOTE_ADDR'];
  1344.             $url = "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$value&remoteid=$userIP";
  1345.             $response = \file_get_contents($url);
  1346.             $response = json_decode((string)$response);
  1347.             //dd($response);
  1348.             if(!$response->success){
  1349.                 $this->addFlash(
  1350.                     'warning',
  1351.                     'Cocher le champs recaptcha svp!');
  1352.             }else{
  1353.                 $destinataire = 'inscription@cimef-international.org';
  1354.                 $expediteur   = $mail;
  1355.                 $reponse      = $expediteur;
  1356.                 $suj = "INSCRIPTION FORMATION 2026";
  1357.             
  1358.             
  1359.                 $email = (new Email())
  1360.                 ->from('CIMEF International <inscription@cimef-international.org>')
  1361.                 ->to($destinataire)                 // destinataire principal
  1362.                 ->cc('medias@cimef-international.com') // COPIE
  1363.                 ->replyTo($expediteur)              // Reply-To:
  1364.                 ->subject($suj)     
  1365.                 ->text(strip_tags($codehtml))
  1366.                 ->html($codehtml);// Subject:
  1367.                 //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  1368.                 $mailer->send($email);
  1369.                 $inscription->setNom($nom);
  1370.                 $inscription->setPrenoms($prenoms);
  1371.                 $inscription->setFonction($fonction);
  1372.                 $inscription->setAdresse($adresse);
  1373.                 $inscription->setMail($mail);
  1374.                 $inscription->setEntreprise($entreprise);
  1375.                 $inscription->setSiteweb($siteweb);
  1376.                 $inscription->setNbparticipant($nbparticipant);
  1377.                 $inscription->setPays($pays);
  1378.                 $inscription->setVille( $ville);
  1379.                 $inscription->setBoitepostale($boitepostale);
  1380.                 $inscription->setWhatsapp($whatsapp);
  1381.                 $inscription->setTelephone($telephone);
  1382.                 $inscription->setCommentaire($commentaire);
  1383.                 $inscription->setFormation($formation);
  1384.                 $entityManager->persist($inscription);
  1385.                 $entityManager->flush();
  1386.             
  1387.                 $this->addFlash(
  1388.                 'success',
  1389.                 'Votre inscription à été bien enregistrée');
  1390.                 return $this->redirectToRoute('front.seminaire.nationaux',['seminaires' => $seminaires,'slug' => $slug]);
  1391.                 
  1392.             }
  1393.         }
  1394.         
  1395.         return $this->render('front/inscriptions/inscription-seminaire.html.twig',[
  1396.             'query' => $query,
  1397.             'annee' => $annee,
  1398.             'type' => $seminaires,
  1399.             'mentions' => $mentions,
  1400.             'inscriptionForm' => $inscriptionForm->createView(),
  1401.         ]);
  1402.     }
  1403.     */
  1404.     #[Route('/formations/{seminaires}/{slug}/{id}code/inscription'name'front.inscription'methods:['GET','POST'])]
  1405.     public function inscription_sem(
  1406.         $slug,
  1407.         $seminaires,
  1408.         $id,
  1409.         Request $request,
  1410.         MailerInterface $mailer,
  1411.         InscriptionsRepository $inscriptionRepository,
  1412.         ThemeshanghaiRepository $themeshanghaiRepository,
  1413.         VillesRepository $villeRepository,
  1414.         ThemesRepository $themeRepository,
  1415.         FormationsRepository $formationRepository,
  1416.         MentionsRepository $mentionRepository,
  1417.         EntityManagerInterface $entityManager
  1418.     ): Response
  1419.     {
  1420.         $annee date('Y');
  1421.         $queryBuilder $entityManager->createQueryBuilder();
  1422.         $queryBuilder
  1423.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  1424.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  1425.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  1426.         )
  1427.         ->from(Formations::class, 'for')
  1428.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  1429.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  1430.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  1431.         ->where('th.slug = :theme')
  1432.         ->andwhere('for.id = :forid')
  1433.         ->setParameter('theme'$slug)
  1434.         ->setParameter('forid'$id);
  1435.         $query $queryBuilder->getQuery()->getResult();
  1436.         $mentions $mentionRepository->findAll();
  1437.         
  1438.         $queryBuilder1 $entityManager->createQueryBuilder();
  1439.         $queryBuilder1
  1440.             ->select(
  1441.                 'cert.id','cert.session','cert.prix','cert.slug',
  1442.                 'cert.devise','cert.theme','vil.nom AS vilnom',
  1443.                 'vil.pays','cert.createdat','cert.type'
  1444.             )
  1445.             ->from(Certificats::class, 'cert')
  1446.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  1447.             ->where('cert.slug = :slug')
  1448.             ->andwhere('cert.id = :id')
  1449.             ->setParameter('slug'$slug)
  1450.             ->setParameter('id'$id);
  1451.         $certificat $queryBuilder1->getQuery()->getOneOrNullResult();
  1452.         
  1453.         $queryBuilder2 $entityManager->createQueryBuilder();
  1454.         $queryBuilder2
  1455.             ->select(
  1456.                 'shan.id','shan.session','shan.prix','shan.slug',
  1457.                 'shan.devise','shan.theme','shan.ville','shan.createdat','shan.updatedat'
  1458.             )
  1459.             ->from(Themeshanghai::class, 'shan')
  1460.             ->where('shan.slug = :slug')
  1461.             ->andwhere('shan.id = :id')
  1462.             ->setParameter('slug'$slug)
  1463.             ->setParameter('id'$id);
  1464.         $shanghai $queryBuilder2->getQuery()->getOneOrNullResult();
  1465.         
  1466.         $inscription = new Inscriptions();
  1467.         $inscriptionForm $this->createForm(InscriptionFormType::class, $inscription);
  1468.         $inscriptionForm->handleRequest($request);
  1469.         if ($inscriptionForm->isSubmitted()) {
  1470.             $civilite $inscriptionForm->get('civilite')->getData();
  1471.             $nom $inscriptionForm->get('nom')->getData();
  1472.             $prenoms $inscriptionForm->get('prenoms')->getData();
  1473.             $fonction $inscriptionForm->get('fonction')->getData();
  1474.             $adresse $inscriptionForm->get('adresse')->getData();
  1475.             $mail $inscriptionForm->get('mail')->getData();
  1476.             $entreprise $inscriptionForm->get('entreprise')->getData();
  1477.             
  1478.             $site $inscriptionForm->get('siteweb')->getData();
  1479.             $nbparticipant $inscriptionForm->get('nbparticipant')->getData();
  1480.             $pays $inscriptionForm->get('pays')->getData();
  1481.             $ville $inscriptionForm->get('ville')->getData();
  1482.             $boitepostale $inscriptionForm->get('boitepostale')->getData();
  1483.             $whatsapp $inscriptionForm->get('whatsapp')->getData();            
  1484.             
  1485.             $telephone $inscriptionForm->get('telephone')->getData();
  1486.             $commentaire $inscriptionForm->get('commentaire')->getData(); 
  1487.             $formation $formationRepository->find($id);
  1488.             $formationShanghai $themeshanghaiRepository->find($id);
  1489.  
  1490.             if($query){
  1491.                 $theme $formation->getTheme();
  1492.                 $idville $formation->getVille();
  1493.                 $session $formation->getDatesSession();
  1494.                 $prix $formation->getPrix();
  1495.                 $devise $formation->getDevise();
  1496.                 
  1497.                 $villes $villeRepository->find($idville);
  1498.                 $nomtheme $theme->getNom();
  1499.                 $nomville $villes->getNom();
  1500.             }
  1501.             
  1502.             if(!$site){
  1503.                 $siteweb 'Pas renseigné';
  1504.             }else{
  1505.                 $siteweb $inscriptionForm->get('siteweb')->getData();
  1506.             }
  1507.             
  1508.             if($certificat){
  1509.                 $nomtheme $certificat['theme'];
  1510.                 $nomville $certificat['vilnom'];
  1511.                 $nompays $certificat['pays'];
  1512.                 $session $certificat['session'];
  1513.                 $prix $certificat['prix'];
  1514.                 $devise $certificat['devise'];
  1515.             }
  1516.             if($shanghai){
  1517.                 $nomtheme $shanghai['theme'];
  1518.                 $nomville $shanghai['ville'];
  1519.                 $nompays '';
  1520.                 $session $shanghai['session'];
  1521.                 $prix $shanghai['prix'];
  1522.                 $devise $shanghai['devise'];
  1523.             }
  1524.             
  1525.             //dd($certificat);
  1526.             if(!$commentaire){
  1527.                 $commentaire " ";
  1528.             }else{
  1529.                 $commentaire $inscriptionForm->get('commentaire')->getData();
  1530.             }
  1531.             /*
  1532.             $inscription->setNom($nom);
  1533.             $inscription->setPrenoms($prenoms);
  1534.             $inscription->setFonction($fonction);
  1535.             $inscription->setAdresse($adresse);
  1536.             $inscription->setMail($mail);
  1537.             $inscription->setEntreprise($entreprise);
  1538.             $inscription->setSiteweb($siteweb);
  1539.             $inscription->setNbparticipant($nbparticipant);
  1540.             $inscription->setPays($pays);
  1541.             $inscription->setVille( $ville);
  1542.             $inscription->setBoitepostale($boitepostale);
  1543.             $inscription->setWhatsapp($whatsapp);
  1544.             $inscription->setTelephone($telephone);
  1545.             $inscription->setCommentaire($commentaire);
  1546.             $inscription->setFormation($formation);
  1547.             $entityManager->persist($inscription);
  1548.             $entityManager->flush();
  1549.             */
  1550.             
  1551.             $destinataire 'inscription@cimef-international.org';
  1552.             $expediteur   $mail;
  1553.             $reponse      $expediteur;
  1554.             $suj "INSCRIPTION FORMATION 2026";
  1555.             
  1556.             $codehtml '<html><body>'.
  1557.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  1558.             <tr>
  1559.             <td align="center">
  1560.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  1561.             <tr>
  1562.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  1563.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  1564.             </td>
  1565.             </tr>
  1566.             <tr>
  1567.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  1568.             <p>Inscription de '.$civilite.' '.$prenoms.' '.$nom.' à la formation <strong>'.$nomtheme.'</strong> organisée par <strong>CIMEF International</strong>.</p>
  1569.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  1570.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  1571.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  1572.             <p>
  1573.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  1574.             <strong>Fonction :</strong> '.$fonction.'<br>
  1575.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  1576.             <strong>Adresse :</strong> '.$adresse.'<br>
  1577.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  1578.             <strong>Boîte postale :</strong> '.$boitepostale.'
  1579.             </p>
  1580.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  1581.             <p>
  1582.             <strong>Email :</strong> '.$mail.'<br>
  1583.             <strong>Téléphone :</strong> '.$telephone.'<br>
  1584.             <strong>WhatsApp :</strong> '.$whatsapp.'<br>
  1585.             <strong>Site web :</strong> '.$siteweb.'
  1586.             </p>
  1587.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  1588.             <p>
  1589.             <strong>Nombre de participants :</strong> '.$nbparticipant.'<br>
  1590.             <strong>Commentaire :</strong> '.$commentaire.'
  1591.             </p>
  1592.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  1593.             <p>
  1594.             <strong>Thème :</strong> '.$nomtheme.'<br>
  1595.             <strong>Ville :</strong> '.$nomville.'<br>
  1596.             <strong>Prix :</strong> '.$prix.''.$devise.'<br>
  1597.             <strong>Session :</strong> '.$session.'
  1598.             </p>
  1599.             </td>
  1600.             </tr>
  1601.             <tr>
  1602.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  1603.             © '.date("Y").' CIMEF International — Tous droits réservés
  1604.             </td>
  1605.             </tr>
  1606.             </table>
  1607.             </td>
  1608.             </tr>
  1609.             </table>
  1610.             </body></html>';
  1611.             
  1612.             $email = (new Email())
  1613.             ->from('CIMEF International <inscription@cimef-international.org>')
  1614.             ->to($destinataire)                 // destinataire principal
  1615.             ->cc('medias@cimef-international.com'// COPIE
  1616.             ->replyTo($expediteur)              // Reply-To:
  1617.             ->subject($suj)     
  1618.             ->text(strip_tags($codehtml))
  1619.             ->html($codehtml);// Subject:
  1620.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  1621.             $mailer->send($email);
  1622.             $this->addFlash(
  1623.             'success',
  1624.             'Votre inscription à été bien enregistrée');
  1625.             return $this->redirectToRoute('front.seminaire.nationaux',['seminaires' => $seminaires,'slug' => $slug]);
  1626.         }
  1627.         //dd($seminaires);
  1628.         if($query){
  1629.             return $this->render('front/inscriptions/inscription-seminaire.html.twig',[
  1630.                 'slug' => $slug,
  1631.                 'query' => $query,
  1632.                 'annee' => $annee,
  1633.                 'type' => $seminaires,
  1634.                 'mentions' => $mentions,
  1635.                 'inscriptionForm' => $inscriptionForm->createView(),
  1636.             ]);
  1637.         }elseif($shanghai){
  1638.                 $nomtheme $shanghai['theme'];
  1639.                 $nomville $shanghai['ville'];
  1640.                 $nompays '';
  1641.                 $session $shanghai['session'];
  1642.                 $prix $shanghai['prix'];
  1643.                 $devise $shanghai['devise'];
  1644.             
  1645.             return $this->render('front/inscriptions/inscription-certificat.html.twig',[
  1646.                 'slug' => $slug,
  1647.                 'prix' => $prix,
  1648.                 'annee' => $annee,
  1649.                 'pays' => $nompays,
  1650.                 'devise' => $devise,
  1651.                 'ville' => $nomville,
  1652.                 'theme' => $nomtheme,
  1653.                 'type' => $seminaires,
  1654.                 'session' => $session,
  1655.                 'mentions' => $mentions,
  1656.                 'certificat' => $shanghai,
  1657.                 'inscriptionForm' => $inscriptionForm->createView(),
  1658.             ]);
  1659.     
  1660.         }else{
  1661.             $nomtheme $certificat['theme'];
  1662.             $nomville $certificat['vilnom'];
  1663.             $nompays $certificat['pays'];
  1664.             $session $certificat['session'];
  1665.             $prix $certificat['prix'];
  1666.             $devise $certificat['devise'];
  1667.             
  1668.             return $this->render('front/inscriptions/inscription-certificat.html.twig',[
  1669.                 'slug' => $slug,
  1670.                 'prix' => $prix,
  1671.                 'annee' => $annee,
  1672.                 'pays' => $nompays,
  1673.                 'devise' => $devise,
  1674.                 'ville' => $nomville,
  1675.                 'theme' => $nomtheme,
  1676.                 'type' => $seminaires,
  1677.                 'session' => $session,
  1678.                 'mentions' => $mentions,
  1679.                 'certificat' => $certificat,
  1680.                 'inscriptionForm' => $inscriptionForm->createView(),
  1681.             ]);
  1682.         }
  1683.     }
  1684.         
  1685.     #[Route('/formations/rencontre-des-top-management/{slug}/{id}code/inscription-manager'name'front.inscription.management'methods:['GET','POST'])]
  1686.     public function inscription_man(
  1687.         $slug,
  1688.         $id,
  1689.         Request $request,
  1690.         MailerInterface $mailer,
  1691.         InscriptionsRepository $inscriptionRepository,
  1692.         ManagementsRepository $managementRepository,
  1693.         MentionsRepository $mentionRepository,
  1694.         EntityManagerInterface $entityManager
  1695.     ): Response
  1696.     {
  1697.         
  1698.         $annee date('Y');
  1699.         $queryBuilder_1 $entityManager->createQueryBuilder();
  1700.         $queryBuilder_1
  1701.         ->select('man')
  1702.         ->from(Managements::class, 'man')
  1703.         ->where('man.slug = :theme')
  1704.         ->andwhere('man.id = :forid')
  1705.         ->setParameter('theme'$slug)
  1706.         ->setParameter('forid'$id);
  1707.         $query_1 $queryBuilder_1->getQuery()->getResult();
  1708.         $mentions $mentionRepository->findAll();
  1709.         $inscription = new Inscriptions();
  1710.         $inscriptionForm $this->createForm(InscriptionFormType::class, $inscription);
  1711.         $inscriptionForm->handleRequest($request);
  1712.         
  1713.         if ($inscriptionForm->isSubmitted()) {
  1714.             $nom $inscriptionForm->get('nom')->getData();
  1715.             $prenoms $inscriptionForm->get('prenoms')->getData();
  1716.             $fonction $inscriptionForm->get('fonction')->getData();
  1717.             $adresse $inscriptionForm->get('adresse')->getData();
  1718.             $mail $inscriptionForm->get('mail')->getData();
  1719.             $entreprise $inscriptionForm->get('entreprise')->getData();
  1720.             
  1721.             $siteweb $inscriptionForm->get('siteweb')->getData();
  1722.             $nbparticipant $inscriptionForm->get('nbparticipant')->getData();
  1723.             $pays $inscriptionForm->get('pays')->getData();
  1724.             $ville $inscriptionForm->get('ville')->getData();
  1725.             $boitepostale $inscriptionForm->get('boitepostale')->getData();
  1726.             $whatsapp $inscriptionForm->get('whatsapp')->getData();            
  1727.             
  1728.             $telephone $inscriptionForm->get('telephone')->getData();
  1729.             $commentaire $inscriptionForm->get('commentaire')->getData(); 
  1730.             $management $managementRepository->find($id);
  1731.             //dd($formation->getId());
  1732.             
  1733.             $theme $management->getTheme();
  1734.             $ville $management->getVille();
  1735.             $datedebut $management->getDateDebut();
  1736.             $datefin $management->getDateFin();
  1737.             $prix $management->getPrix();
  1738.             $devise $management->getDevise();
  1739.             
  1740.             if(!$commentaire){
  1741.                 $commentaire "...";
  1742.             }else{
  1743.                 $commentaire $inscriptionForm->get('commentaire')->getData();
  1744.             }
  1745.             
  1746.             //$codehtml = "test";
  1747.             
  1748.             $codehtml '<html><body>'.
  1749.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  1750.             <tr>
  1751.             <td align="center">
  1752.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  1753.             <tr>
  1754.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  1755.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  1756.             </td>
  1757.             </tr>
  1758.             <tr>
  1759.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  1760.             <p>Inscription de M/Mme <strong>'.$prenoms.' '.$nom.'</strong> à la formation <strong>'.$nomtheme.'</strong> organisée par <strong>CIMEF International</strong>.</p>
  1761.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  1762.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  1763.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  1764.             <p>
  1765.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  1766.             <strong>Fonction :</strong> '.$fonction.'<br>
  1767.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  1768.             <strong>Adresse :</strong> '.$adresse.'<br>
  1769.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  1770.             <strong>Boîte postale :</strong> '.$boitepostale.'
  1771.             </p>
  1772.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  1773.             <p>
  1774.             <strong>Email :</strong> '.$mail.'<br>
  1775.             <strong>Téléphone :</strong> '.$telephone.'<br>
  1776.             <strong>WhatsApp :</strong> '.$whatsapp.'<br>
  1777.             <strong>Site web :</strong> '.$siteweb.'
  1778.             </p>
  1779.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  1780.             <p>
  1781.             <strong>Nombre de participants :</strong> '.$nbparticipant.'<br>
  1782.             <strong>Commentaire :</strong> '.$commentaire.'
  1783.             </p>
  1784.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  1785.             <p>
  1786.             <strong>Thème :</strong> '.$theme.'<br>
  1787.             <strong>Ville :</strong> '.$ville.'<br>
  1788.             <strong>Prix :</strong> '.$prix.''.$devise.'<br>
  1789.             <strong>Date de la rencontre :</strong> Du'.$datedebut.' au '.$datefin.'<br>
  1790.             </p>
  1791.             </td>
  1792.             </tr>
  1793.             <tr>
  1794.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  1795.             © '.date("Y").' CIMEF International — Tous droits réservés
  1796.             </td>
  1797.             </tr>
  1798.             </table>
  1799.             </td>
  1800.             </tr>
  1801.             </table>
  1802.             </body></html>';
  1803.             
  1804.             
  1805.             $secretKey '6LfPYkosAAAAAJQFLCC-9U5bF6KdFTPrgmbxg5Ux';
  1806.             $value $request->get('g-recaptcha-response');
  1807.             $userIP $_SERVER['REMOTE_ADDR'];
  1808.             $url "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$value&remoteid=$userIP";
  1809.             $response \file_get_contents($url);
  1810.             $response json_decode((string)$response);
  1811.             //dd($response);
  1812.             if(!$response->success){
  1813.                 $this->addFlash(
  1814.                     'warning',
  1815.                     'Cocher le champs recaptcha svp!');
  1816.             }else{
  1817.                 $destinataire 'inscription@cimef-international.org';
  1818.                 $expediteur   $mail;
  1819.                 $reponse      $expediteur;
  1820.                 $suj "INSCRIPTION FORMATION 2026";
  1821.             
  1822.             
  1823.                 $email = (new Email())
  1824.                 ->from('CIMEF International <inscription@cimef-international.org>')
  1825.                 ->to($destinataire)                 // destinataire principal
  1826.                 ->cc('medias@cimef-international.com'// COPIE
  1827.                 ->replyTo($expediteur)              // Reply-To:
  1828.                 ->subject($suj)     
  1829.                 ->text(strip_tags($codehtml))
  1830.                 ->html($codehtml);// Subject:
  1831.                 //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  1832.                 $mailer->send($email);
  1833.                 $inscription->setNom($nom);
  1834.                 $inscription->setPrenoms($prenoms);
  1835.                 $inscription->setFonction($fonction);
  1836.                 $inscription->setAdresse($adresse);
  1837.                 $inscription->setMail($mail);
  1838.                 $inscription->setEntreprise($entreprise);
  1839.                 $inscription->setSiteweb($siteweb);
  1840.                 $inscription->setNbparticipant($nbparticipant);
  1841.                 $inscription->setPays($pays);
  1842.                 $inscription->setVille$ville);
  1843.                 $inscription->setBoitepostale($boitepostale);
  1844.                 $inscription->setWhatsapp($whatsapp);
  1845.                 $inscription->setTelephone($telephone);
  1846.                 $inscription->setCommentaire($commentaire);
  1847.                 $inscription->setFormation($management);
  1848.                 $entityManager->persist($inscription);
  1849.                 $entityManager->flush();
  1850.             
  1851.                 $this->addFlash(
  1852.                 'success',
  1853.                 'Votre inscription à été bien enregistrée');
  1854.                 return $this->redirectToRoute('front.top.management');
  1855.                 
  1856.             }
  1857.         }
  1858.           
  1859.         return $this->render('front/inscriptions/inscription-top-management.html.twig',[
  1860.             'query_1' => $query_1,
  1861.             'annee' => $annee,
  1862.             'mentions' => $mentions,
  1863.             'inscriptionForm' => $inscriptionForm->createView(),
  1864.         ]);    
  1865.     }
  1866.  
  1867.     #[Route('/formations/seminaire-a-la-carte'name'front.seminaire-a-la-carte'methods:['GET','POST'])]
  1868.     public function inscription_seminaire_sur_mesure(
  1869.         Request $request,
  1870.         MailerInterface $mailer,
  1871.         InscriptionsRepository $inscriptionRepository,
  1872.         MentionsRepository $mentionRepository,
  1873.         EntityManagerInterface $entityManager
  1874.     ): Response
  1875.     {
  1876.         //dd($seminaires);
  1877.         $annee date('Y');
  1878.         $mentions $mentionRepository->findAll();
  1879.         $demandeformation = new Demandeformations();
  1880.         $demandeformationsForm $this->createForm(DemandeformationFormType::class, $demandeformation);
  1881.         $demandeformationsForm->handleRequest($request);
  1882.         if ($demandeformationsForm->isSubmitted()) {
  1883.             $civilite $demandeformationsForm->get('civilite')->getData();
  1884.             $nom $demandeformationsForm->get('nom')->getData();
  1885.             $prenoms $demandeformationsForm->get('prenoms')->getData();
  1886.             $fonction $demandeformationsForm->get('fonction')->getData();
  1887.             $adresse $demandeformationsForm->get('adresse')->getData();
  1888.             $mail $demandeformationsForm->get('mail')->getData();
  1889.             $entreprise $demandeformationsForm->get('entreprise')->getData();
  1890.             
  1891.             $siteweb $demandeformationsForm->get('siteweb')->getData();
  1892.             $nombrepart $demandeformationsForm->get('nombrepart')->getData();
  1893.             $lieu $demandeformationsForm->get('lieu')->getData();
  1894.             $theme $demandeformationsForm->get('theme')->getData();
  1895.             $duree $demandeformationsForm->get('duree')->getData();
  1896.             
  1897.             $telephone $demandeformationsForm->get('telephone')->getData();
  1898.             $commentaire $demandeformationsForm->get('commentaire')->getData(); 
  1899.             //dd($formation->getId());
  1900.            
  1901.             if(!$commentaire){
  1902.                 $commentaire "...";
  1903.             }else{
  1904.                 $commentaire $demandeformationsForm->get('commentaire')->getData();
  1905.             }
  1906.             $demandeformation->setNom($nom);
  1907.             $demandeformation->setPrenoms($prenoms);
  1908.             $demandeformation->setFonction($fonction);
  1909.             $demandeformation->setAdresse($adresse);
  1910.             $demandeformation->setMail($mail);
  1911.             $demandeformation->setEntreprise($entreprise);
  1912.             $demandeformation->setSiteweb($siteweb);
  1913.             $demandeformation->setNombrepart($nombrepart);
  1914.             $demandeformation->setLieu($lieu);
  1915.             $demandeformation->setTheme($theme);
  1916.             $demandeformation->setDuree($duree);
  1917.             $demandeformation->setTelephone($telephone);
  1918.             $demandeformation->setCommentaire($commentaire);
  1919.             $entityManager->persist($demandeformation);
  1920.             $entityManager->flush();
  1921.             $destinataire 'inscription@cimef-international.org';
  1922.             $expediteur   $mail;
  1923.             $reponse      $expediteur;
  1924.             $suj "INSCRIPTION FORMATION 2026";
  1925.             //$codehtml = "test";
  1926.             
  1927.             $codehtml '<html><body>'.
  1928.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  1929.             <tr>
  1930.             <td align="center">
  1931.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  1932.             <tr>
  1933.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  1934.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  1935.             </td>
  1936.             </tr>
  1937.             <tr>
  1938.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  1939.             <p>Demande de dévis de '.$civilite.' <strong>'.$prenoms.' '.$nom.'</strong> pour une formation sur mesure avec pour thème :<strong>'.$nomtheme.'</strong>.</p>
  1940.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  1941.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  1942.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  1943.             <p>
  1944.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  1945.             <strong>Fonction :</strong> '.$fonction.'<br>
  1946.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  1947.             <strong>Adresse :</strong> '.$adresse.'<br>
  1948.             </p>
  1949.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  1950.             <p>
  1951.             <strong>Email :</strong> '.$mail.'<br>
  1952.             <strong>Téléphone :</strong> '.$telephone.'<br>
  1953.             <strong>Site web :</strong> '.$siteweb.'
  1954.             </p>
  1955.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  1956.             <p>
  1957.             <strong>Nombre de participants :</strong> '.$nombrepart.'<br>
  1958.             <strong>Commentaire :</strong> '.$commentaire.'
  1959.             </p>
  1960.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  1961.             <p>
  1962.             <strong>Thème :</strong> '.$theme.'<br>
  1963.             <strong>Lieu :</strong> '.$lieu.'<br>
  1964.             <strong>Date :</strong> '.$duree.'
  1965.             </p>
  1966.             </td>
  1967.             </tr>
  1968.             <tr>
  1969.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  1970.             © '.date("Y").' CIMEF International — Tous droits réservés
  1971.             </td>
  1972.             </tr>
  1973.             </table>
  1974.             </td>
  1975.             </tr>
  1976.             </table>
  1977.             </body></html>';
  1978.             
  1979.             $email = (new Email())
  1980.             ->from('CIMEF International <inscription@cimef-international.org>')
  1981.             ->to($destinataire)                 // destinataire principal
  1982.             ->cc('medias@cimef-international.com'// COPIE
  1983.             ->replyTo($expediteur)              // Reply-To:
  1984.             ->subject($suj)     
  1985.             ->text(strip_tags($codehtml))
  1986.             ->html($codehtml);// Subject:
  1987.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  1988.             $mailer->send($email);
  1989.             $this->addFlash(
  1990.             'success',
  1991.             'Votre inscription à été bien enregistrée');
  1992.             return $this->redirectToRoute('front.inter.index');
  1993.         }
  1994.         
  1995.         return $this->render('front/inscriptions/formation-a-la-carte.html.twig',[
  1996.             'annee' => $annee,
  1997.             'mentions' => $mentions,
  1998.             'demandeformationsForm' => $demandeformationsForm->createView(),
  1999.         ]);
  2000.     }
  2001.     
  2002.     #[Route('/formations/seminaires-internationaux/{slug}/{id}code'name'front.seminaire.inter.detail'methods:['GET'])]
  2003.     public function detail_sem_int(
  2004.         $slug,
  2005.         $id,
  2006.         Request $request
  2007.         MentionsRepository $mentionRepository,
  2008.         EntityManagerInterface $entityManager
  2009.     ): Response
  2010.     {
  2011.         $type "Séminaires internationaux";
  2012.         $annee date('Y');
  2013.         $queryBuilder $entityManager->createQueryBuilder();
  2014.         $queryBuilder
  2015.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  2016.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2017.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  2018.         )
  2019.         ->from(Formations::class, 'for')
  2020.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2021.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2022.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2023.         ->where('th.slug = :theme')
  2024.         ->andwhere('for.id = :forid')
  2025.         ->setParameter('theme'$slug)
  2026.         ->setParameter('forid'$id);
  2027.         $query $queryBuilder->getQuery()->getResult();
  2028.         
  2029.         
  2030.         $queryBuilder $entityManager->createQueryBuilder();
  2031.         $queryBuilder
  2032.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  2033.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2034.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude',
  2035.             'for.image'
  2036.         )
  2037.         ->from(Formations::class, 'for')
  2038.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2039.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2040.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2041.         ->where('th.slug = :theme')
  2042.         ->andwhere('for.id != :forid')
  2043.         ->setParameter('theme'$slug)
  2044.         ->setParameter('forid'$id);
  2045.         $formations $queryBuilder->getQuery()->getResult();
  2046.         $mentions $mentionRepository->findAll();
  2047.         
  2048.         $locations = [];
  2049.         foreach ($query as $row) {
  2050.             if (!empty($row['latitude']) && !empty($row['longitude'])) {
  2051.                 $locations[] = [
  2052.                     'lat'   => (float) $row['latitude'],
  2053.                     'lng'   => (float) $row['longitude'],
  2054.                     'ville' => strtoupper($row['vilnom']),
  2055.                     'pays'  => strtoupper($row['pays']),
  2056.                 ];
  2057.             }
  2058.         }
  2059.         return $this->render('front/detail/detail-seminaire-inter.html.twig',[
  2060.             'formations' => $formations,
  2061.             'locations' => $locations,
  2062.             'mentions' => $mentions,
  2063.             'annee' => $annee,
  2064.             'type' => $type,
  2065.             'query' => $query
  2066.         ]);
  2067.     }
  2068.     
  2069.     #[Route('/formations/seminaires-nationaux/{slug}/{id}code'name'front.seminaire.nation.detail'methods:['GET'])]
  2070.     public function detail_sem_nat(
  2071.         $slug,
  2072.         $id,
  2073.         Request $request
  2074.         GeoIpService $geo,
  2075.         MentionsRepository $mentionRepository,
  2076.         EntityManagerInterface $entityManager
  2077.     ): Response
  2078.     {
  2079.         $type "Séminaires nationaux";
  2080.         $annee date('Y');
  2081.                 // 🌍 Géo IP
  2082.         $geoData $geo->getGeoData($request->getClientIp());
  2083.         $pays $geoData['country'] ?? '';
  2084.         $ville $geoData['city'] ?? '';
  2085.         
  2086.         // Correction du nom du pays
  2087.         if ($pays === 'Local' || $pays === 'Ivory Coast') {
  2088.             $getpays "Côte d'ivoire";
  2089.         } else {
  2090.             $getpays $pays;
  2091.         }
  2092.         //dd($getpays);
  2093.         $queryBuilder $entityManager->createQueryBuilder();
  2094.         $queryBuilder
  2095.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  2096.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2097.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  2098.         )
  2099.         ->from(Formations::class, 'for')
  2100.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2101.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2102.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2103.         ->where('th.slug = :theme')
  2104.         ->andwhere('for.id = :forid')
  2105.         ->setParameter('theme'$slug)
  2106.         ->setParameter('forid'$id);
  2107.         $query $queryBuilder->getQuery()->getResult();
  2108.         $mentions $mentionRepository->findAll();
  2109.         
  2110.         $locations = [];
  2111.         foreach ($query as $row) {
  2112.             if (!empty($row['latitude']) && !empty($row['longitude'])) {
  2113.                 $locations[] = [
  2114.                     'lat'   => (float) $row['latitude'],
  2115.                     'lng'   => (float) $row['longitude'],
  2116.                     'ville' => strtoupper($row['vilnom']),
  2117.                     'pays'  => strtoupper($row['pays']),
  2118.                 ];
  2119.             }
  2120.         }
  2121.         $today = new \DateTime('today');
  2122.     // Fonction pour extraire date de début et fin depuis dates_session
  2123.     $extractDates = function(?string $datesSession): ?array {
  2124.         if (!$datesSession) return null;
  2125.     $moisFr = [
  2126.         'janv'=>1,'janvier'=>1,'févr'=>2,'fevr'=>2,'février'=>2,
  2127.         'mars'=>3,'avr'=>4,'avril'=>4,'mai'=>5,'juin'=>6,
  2128.         'juil'=>7,'juillet'=>7,'août'=>8,'aout'=>8,
  2129.         'sept'=>9,'septembre'=>9,'oct'=>10,'octobre'=>10,
  2130.         'nov'=>11,'novembre'=>11,'déc'=>12,'dec'=>12,'décembre'=>12
  2131.     ];
  2132.     $text strtolower(trim($datesSession));
  2133.     $text str_replace(['.'','], ''$text);
  2134.     if (preg_match('/(\d{1,2})\s*(\w+)?\s*au\s*(\d{1,2})\s*(\w+)?/i'$text$m)) {
  2135.         $jourDebut = (int)$m[1];
  2136.         $moisDebut $moisFr[$m[2] ?? ''] ?? null;
  2137.         $jourFin = (int)$m[3];
  2138.         $moisFin $moisFr[$m[4] ?? ''] ?? $moisDebut;
  2139.             if (!$moisDebut || !$moisFin) return null;
  2140.     
  2141.             $annee = (int)date('Y');
  2142.             $dateDebut = new \DateTime(sprintf('%04d-%02d-%02d'$annee$moisDebut$jourDebut));
  2143.             $dateFin = new \DateTime(sprintf('%04d-%02d-%02d'$annee$moisFin$jourFin));
  2144.     
  2145.             if ($dateFin $dateDebut$dateFin->modify('+1 year');
  2146.     
  2147.             return ['debut' => $dateDebut'fin' => $dateFin];
  2148.         }
  2149.     
  2150.         return null;
  2151.     };
  2152.     
  2153.     // Requête Doctrine
  2154.     $queryBuilder $entityManager->createQueryBuilder();
  2155.     $queryBuilder
  2156.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  2157.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2158.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude',
  2159.             'for.image'
  2160.         )
  2161.         ->from(Formations::class, 'for')
  2162.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2163.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2164.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2165.         ->where('th.slug = :theme')
  2166.         ->andWhere('for.id != :forid')
  2167.         ->andWhere('vil.pays = :pays')
  2168.         ->setParameter('theme'$slug)
  2169.         ->setParameter('forid'$id)
  2170.         ->setParameter('pays'$getpays);
  2171.     
  2172.     $results $queryBuilder->getQuery()->getResult();
  2173.     
  2174.     // Filtrer uniquement les formations à venir
  2175.     $formations array_filter($results, function($f) use ($extractDates$today) {
  2176.         $dates $extractDates($f['dates_session']);
  2177.         return $dates && $dates['debut'] > $today;
  2178.     });
  2179.     
  2180.     // Trier par date de début la plus proche
  2181.     usort($formations, function($a$b) use ($extractDates) {
  2182.         return $extractDates($a['dates_session'])['debut'] <=> $extractDates($b['dates_session'])['debut'];
  2183.     });
  2184.     
  2185.     // Maintenant $formationsAvenir contient uniquement les formations à venir
  2186.         /*
  2187.         $queryBuilder = $entityManager->createQueryBuilder();
  2188.         $queryBuilder
  2189.         ->select('for.id', 'for.dates_session', 'for.prix', 'for.devise', 'th.nom', 
  2190.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2191.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude',
  2192.             'for.image'
  2193.         )
  2194.         ->from(Formations::class, 'for')
  2195.         ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  2196.         ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  2197.         ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique = thm.id')
  2198.         ->where('th.slug = :theme')
  2199.         ->andwhere('for.id != :forid')
  2200.         ->andwhere('vil.pays = :pays')
  2201.         ->setParameter('theme', $slug)
  2202.         ->setParameter('forid', $id)
  2203.         ->setParameter('pays', $getpays);
  2204.         $formations = $queryBuilder->getQuery()->getResult();
  2205.         */
  2206.         
  2207.         return $this->render('front/detail/detail-seminaire-inter.html.twig',[
  2208.             'formations' => $formations,
  2209.             'locations' => $locations,
  2210.             'annee' => $annee,
  2211.             'type' => $type,
  2212.             'mentions' => $mentions,
  2213.             'query' => $query
  2214.         ]);
  2215.     }
  2216.     
  2217.     #[Route('/actualites'name'front.actualite'methods:['GET'])]
  2218.     public function actualite(
  2219.         Request $request
  2220.         MentionsRepository $mentionRepository,
  2221.         ManagementsRepository $managementRepository,
  2222.         PaginatorInterface $paginator,
  2223.         ActualitesRepository $actualiteRepository
  2224.         EntityManagerInterface $entityManager
  2225.         ): Response
  2226.     {
  2227.         $All_actu $actualiteRepository->findBy(['statut' => 'Publié'], ['createdat' => 'DESC']);
  2228.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  2229.         $queryBuilder $entityManager->createQueryBuilder();
  2230.         $queryBuilder
  2231.         ->select('actu')
  2232.         ->from(Actualites::class, 'actu')
  2233.         ->where('actu.statut = :statut')
  2234.         ->setParameter('statut''Publié')
  2235.         ->orderBy('actu.createdat''DESC');
  2236.         
  2237.         $pagination $paginator->paginate(
  2238.             $queryBuilder,
  2239.             $request->query->getInt('page'1),
  2240.             12
  2241.         ); 
  2242.         
  2243.         $last_actu $actualiteRepository->findBy(['statut' => 'Publié'], ['createdat' => 'DESC'],limit4);
  2244.         $mentions $mentionRepository->findAll();
  2245.         return $this->render('front/actualite.html.twig',[
  2246.             'mentions' => $mentions,
  2247.             'last_actu' => $last_actu,
  2248.             'pagination' => $pagination,
  2249.             'manageLimit' => $manageLimit
  2250.         ]);
  2251.     }
  2252.     
  2253.     #[Route('/actualite/{slug}'name'front.detail.actu'methods:['GET','POST'])]
  2254.     public function detailactu(
  2255.         $slug,
  2256.         Request $request
  2257.         ActualitesRepository $actuRepository,
  2258.         MentionsRepository $mentionRepository,
  2259.         ManagementsRepository $managementRepository,
  2260.         EntityManagerInterface $entityManager
  2261.     ): Response
  2262.     {
  2263.         $Allactu $actuRepository->findAll();
  2264.         $detactu $actuRepository->findOneBy(array('slug' => $slug));
  2265.         $last_actu $actuRepository->findBy([], ['createdat' => 'ASC']);
  2266.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  2267.         $mentions $mentionRepository->findAll();
  2268.         return $this->render('front/detail/detail-actualite.html.twig',[
  2269.             'detactu' => $detactu,
  2270.             'actualite' => $Allactu,
  2271.             'mentions' => $mentions,
  2272.             'last_actu' => $last_actu,
  2273.             'manageLimit' => $manageLimit
  2274.         ]);
  2275.     }
  2276.     
  2277.     #[Route('/mentions/{slug}'name'front.mention.detail'methods:['GET','POST'])]
  2278.     public function detailmention(
  2279.         $slug,
  2280.         Request $request
  2281.         MentionsRepository $mentionRepository,
  2282.         EntityManagerInterface $entityManager
  2283.     ): Response
  2284.     {
  2285.         $detmention $mentionRepository->findOneBy(array('slug' => $slug));
  2286.         $mentions $mentionRepository->findAll();
  2287.         return $this->render('front/detail/detail-mention.html.twig',[
  2288.             'detmention' => $detmention,
  2289.             'mentions' => $mentions,
  2290.         ]);
  2291.     }
  2292.     
  2293.     #[Route('/presentation/nos-centres'name'front.centres'methods:['GET'])]
  2294.     public function centres(
  2295.         Request $request
  2296.         VillesRepository $villeRepository,
  2297.         MentionsRepository $mentionRepository,
  2298.         EntityManagerInterface $entityManager
  2299.         ): Response
  2300.     {
  2301.         $Ville $villeRepository->findAll();
  2302.         $locations = [
  2303.             [
  2304.                 'lat' => 5.399573993486265
  2305.                 'lng' => -3.9608326481739446
  2306.                 'ville' => 'ABIDJAN',
  2307.                 'Pays' => 'CÔTE D\'IVOIRE',
  2308.             ],
  2309.             [
  2310.                 'lat' => 48.82503553852063
  2311.                 'lng' => 2.3943687952459913
  2312.                 'ville' => 'PARIS',
  2313.                 'pays' => 'FRANCE',
  2314.             ],
  2315.             [
  2316.                 'lat' => 33.61983014582587
  2317.                 'lng' => -7.591902517162099
  2318.                 'ville' => 'CASABLANCA',
  2319.                 'pays' => 'MAROC',
  2320.             ],
  2321.             [
  2322.                 'lat' => 14.671959307245515
  2323.                 'lng' => -17.428349942742518
  2324.                 'ville' => 'DAKAR',
  2325.                 'pays' => 'SENEGAL',
  2326.             ],
  2327.             [
  2328.                 'lat' => 25.222641788192867
  2329.                 'lng' =>  55.4419721341237
  2330.                 'ville' => 'DUBAI',
  2331.                 'pays' => 'EMIRATS ARABES UNIS',
  2332.             ],
  2333.             [
  2334.                 'lat' => 41.008441347309684
  2335.                 'lng' => 28.969801288596543
  2336.                 'ville' => 'ISTANBUL',
  2337.                 'pays' => 'TURQUIE',
  2338.             ],
  2339.             [
  2340.                 'lat' => 40.71278802621601
  2341.                 'lng' => -74.0050546180957
  2342.                 'ville' => 'NEW YORK',
  2343.                 'pays' => 'USA',
  2344.             ],
  2345.             [
  2346.                 'lat' => 45.50191624423104
  2347.                 'lng' => -73.57059318260778
  2348.                 'ville' => 'MONTREAL',
  2349.                 'pays' => 'CANADA',
  2350.             ],
  2351.             [
  2352.                 'lat' => 31.25354887891074
  2353.                 'lng' => 121.44798285112802
  2354.                 'ville' => 'SHANGHAI',
  2355.                 'pays' => 'CHNE',
  2356.             ],
  2357.         ];
  2358.         $mentions $mentionRepository->findAll();
  2359.         return $this->render('front/centres.html.twig',[
  2360.             'locations' => $locations,
  2361.             'mentions' => $mentions,
  2362.             'ville' => $Ville    
  2363.         ]);
  2364.     }
  2365.     
  2366.     #[Route('/presentation/nos-partenaires'name'front.nos-partenaires'methods:['GET'])]
  2367.     public function partenaires(
  2368.         Request $request
  2369.         PartenairesRepository $partenaireRepository,
  2370.         MentionsRepository $mentionRepository,
  2371.         EntityManagerInterface $entityManager
  2372.         ): Response
  2373.     {
  2374.         $partenaires $partenaireRepository->findAll();
  2375.         $groupes = [];
  2376.         foreach ($partenaires as $p) {
  2377.             $groupes[$p->getPaysPart()][] = $p;
  2378.         }
  2379.         $mentions $mentionRepository->findAll();
  2380.         return $this->render('front/partenaire.html.twig',[
  2381.             'mentions' => $mentions,
  2382.             'groupes' => $groupes   
  2383.         ]);
  2384.     }
  2385.     
  2386.     #[Route('/presentation/nos-centres/{slug}'name'front.detail.centre'methods:['GET'])]
  2387.     public function detail_centre(
  2388.         $slug,
  2389.         Request $request,
  2390.         GaleriesRepository $galRepository,
  2391.         VillesRepository $villeRepository,
  2392.         MentionsRepository $mentionRepository,
  2393.         EntityManagerInterface $entityManager
  2394.         ): Response
  2395.     {
  2396.         $queryBuilder $entityManager->createQueryBuilder();
  2397.         $queryBuilder
  2398.         ->select('gal.imgGal''gal.nom')
  2399.         ->from(Galeries::class, 'gal')
  2400.         ->where('gal.nom = :nom')
  2401.         ->setParameter('nom'$slug);
  2402.         $detgal $queryBuilder->getQuery()->getResult();
  2403.         
  2404.         //$detgal = $galRepository->findOneBy(array('nom' => $slug));
  2405.         //$detgal = $galRepository->findAll();
  2406.         $detcentres $villeRepository->findOneBy(array('slug' => $slug));
  2407.         $mentions $mentionRepository->findAll();
  2408.         return $this->render('front/detail/detail-centre.html.twig',[
  2409.             'slug' => $slug,
  2410.             'detcentre' => $detcentres,
  2411.             'mentions' => $mentions,
  2412.             'detgal' => $detgal
  2413.         ]);
  2414.     }
  2415.     
  2416.     #[Route('/financement-des-etudes'name'front.financement.etude'methods:['GET','POST'])]
  2417.     public function financement(): Response
  2418.     {
  2419.         return $this->render('front/admissions/financement.html.twig');
  2420.     }
  2421.     
  2422.     #[Route('/nos-thematiques'name'front.inter.thematique'methods:['GET'])]
  2423.     public function thematiques(
  2424.         Request $request
  2425.         PaginatorInterface $paginator,
  2426.         ThematiquesRepository $thematiqueRepository,
  2427.         ManagementsRepository $managementRepository,
  2428.         MentionsRepository $mentionRepository,
  2429.         EntityManagerInterface $entityManager
  2430.     ): Response
  2431.     {
  2432.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  2433.         $queryBuilder $entityManager->createQueryBuilder();
  2434.         $queryBuilder
  2435.             ->select('thm.id, thm.nom, thm.slug, thm.description, COUNT(th.id) AS nbThemes')
  2436.             ->from(Thematiques::class, 'thm')
  2437.             ->innerJoin(Themes::class, 'th''WITH''thm.id = th.thematique')
  2438.             ->groupBy('thm.id, thm.nom, thm.slug, thm.description');
  2439.         $query $queryBuilder->getQuery()->getResult();
  2440.         $pagination $paginator->paginate(
  2441.             $queryBuilder,
  2442.             $request->query->getInt('page'1),
  2443.             12
  2444.         ); 
  2445.         //dd($query);
  2446.         $mentions $mentionRepository->findAll();
  2447.         return $this->render('front/thematique.html.twig',[
  2448.             'manageLimit' => $manageLimit,
  2449.             'pagination' => $query,
  2450.             'mentions' => $mentions
  2451.         ]);
  2452.     }
  2453.     
  2454.     #[Route('/nos-thematiques/{slug}/code{id}'name'front.thematique.detail'methods: ['GET'])]
  2455.     public function detail_thematique(
  2456.         $id,
  2457.         $slug,
  2458.         Request $request
  2459.         PaginatorInterface $paginator,
  2460.         ThemesRepository $themeRepository,
  2461.         ThematiquesRepository $thematiqueRepository,
  2462.         ManagementsRepository $managementRepository,
  2463.         MentionsRepository $mentionRepository,
  2464.         EntityManagerInterface $entityManager    
  2465.     ): Response
  2466.     {
  2467.         $slug strtolower(trim($slug));
  2468.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  2469.         $thematique $thematiqueRepository->findOneBy(['slug' => $slug]);
  2470.         $nomThematique $thematique->getNom();
  2471.         //dd($nomThematique);
  2472.         
  2473.         if (!$thematique) {
  2474.             $this->addFlash('danger','Cette thématique est introuvable');
  2475.             return $this->redirectToRoute('front.inter.thematique');
  2476.         }
  2477.         
  2478.         $queryBuilder $entityManager->createQueryBuilder();
  2479.         $queryBuilder
  2480.             ->select('th.id''th.nom''th.slug' 'th.description')
  2481.             ->from(Themes::class, 'th')
  2482.             ->where('th.thematique = :id'
  2483.             ->setParameter('id'$id);
  2484.         $query $queryBuilder->getQuery()->getResult();
  2485.         $pagination $paginator->paginate(
  2486.             $queryBuilder,
  2487.             $request->query->getInt('page'1),
  2488.             12
  2489.         ); 
  2490.         //dd($slug);
  2491.         $mentions $mentionRepository->findAll();
  2492.         return $this->render('front/detail/detail-thematique.html.twig',[
  2493.             'nomThematique' => $nomThematique,
  2494.             'manageLimit' => $manageLimit,
  2495.             'thematique' => $thematique,
  2496.             'pagination' => $query,
  2497.             'mentions' => $mentions,
  2498.             'slug' => $slug
  2499.         ]);
  2500.     }
  2501.     
  2502.     #[Route('/nos-thematiques/{slugThematique}/{slug}'name'front.thematique.date.theme'methods: ['GET'])]
  2503.     public function detail_thematique_theme(
  2504.         $slug,
  2505.         $slugThematique,
  2506.         Request $request
  2507.         SluggerInterface $slugger
  2508.         PaginatorInterface $paginator,
  2509.         ThemesRepository $themeRepository,
  2510.         ThematiquesRepository $thematiqueRepository,
  2511.         FormationsRepository $formationRepository,
  2512.         ManagementsRepository $managementRepository,
  2513.         MentionsRepository $mentionRepository,
  2514.         EntityManagerInterface $entityManager    
  2515.     ): Response
  2516.     {
  2517.         $annee date('Y');
  2518.         
  2519.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  2520.         $thematique $thematiqueRepository->findOneBy(['slug' => $slugThematique]);
  2521.         $theme $themeRepository->findOneBy(['slug' => $slug]);
  2522.         if (!$theme) {
  2523.             $this->addFlash('danger','Cette thème est introuvable');
  2524.             return $this->redirectToRoute('front.inter.thematique');
  2525.         }
  2526.         $themeId $theme->getId();
  2527.         $thematiqueId $theme->getId();
  2528.         
  2529.         
  2530.         $queryBuilder $entityManager->createQueryBuilder();
  2531.         $queryBuilder
  2532.             ->select('for.id''for.dates_session AS session''for.prix''for.devise''th.nom'
  2533.                 'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  2534.                 'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  2535.             )
  2536.             ->from(Formations::class, 'for')
  2537.             ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2538.             ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2539.             ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2540.             ->where('for.theme = :id'
  2541.             ->setParameter('id'$themeId)
  2542.             ->groupBy('for.id')
  2543.             ->orderBy('for.created_at''DESC')
  2544.             ->setMaxResults(1);
  2545.         $query $queryBuilder->getQuery()->getResult();
  2546.         
  2547.         $queryBuilder $entityManager->createQueryBuilder();
  2548.         $queryBuilder
  2549.             ->select('for.id','vil.nom AS vilnom','vil.pays')
  2550.             ->from(Formations::class, 'for')
  2551.             ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  2552.             ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  2553.             ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique = thm.id')
  2554.             ->where('for.theme = :id'
  2555.             ->setParameter('id'$themeId);
  2556.         $ville $queryBuilder->getQuery()->getResult();
  2557.         //dd($query);
  2558.         
  2559.         
  2560.         $mentions $mentionRepository->findAll();
  2561.         return $this->render('front/detail/detail-thematique-theme-date.html.twig',[
  2562.             'manageLimit' => $manageLimit,
  2563.             'thematique' => $thematique,
  2564.             'query' => $query,
  2565.             'ville' => $ville,
  2566.             'annee' => $annee,
  2567.             'mentions' => $mentions,
  2568.             'slug' => $slug,
  2569.             'slugThematique' => $slugThematique
  2570.         ]);
  2571.     }
  2572.     #[Route('/inscription-{annee}'name'front.inscriptions'methods: ['GET''POST'])]
  2573.     public function inscription(
  2574.         Request $request,
  2575.         MailerInterface $mailer,
  2576.         ThemesRepository $themesRepository,
  2577.         VillesRepository $villesRepository
  2578.         EntityManagerInterface $entityManager,
  2579.         MentionsRepository $mentionRepository,
  2580.         FormationsRepository $formationsRepository
  2581.     ): Response {
  2582.         
  2583.         $annee date('Y');
  2584.         /* =========================
  2585.            AJAX
  2586.         ========================= */
  2587.         if ($request->isXmlHttpRequest()) {
  2588.             /* THÉMATIQUE → THÈMES */
  2589.             if ($request->request->get('action') === 'themes') {
  2590.                 $thematiqueVal $request->request->get('thematiqueVal');
  2591.                 $themes $themesRepository->findBy(
  2592.                     ['thematique' => $thematiqueVal],
  2593.                     ['nom' => 'ASC']
  2594.                 );
  2595.                 $data = [];
  2596.                 foreach ($themes as $theme) {
  2597.                     $data[] = [
  2598.                         'id'  => $theme->getId(),
  2599.                         'nom' => $theme->getNom(),
  2600.                     ];
  2601.                 }
  2602.                 return new JsonResponse($data);
  2603.             }
  2604.             /* THÈME → LIEUX */
  2605.             if ($request->request->get('action') === 'lieux') {
  2606.                 $themeId $request->request->get('themeVal');
  2607.                 $queryBuilder $entityManager->createQueryBuilder();
  2608.                 $queryBuilder
  2609.                 ->select(
  2610.                     'for.id''for.dates_session AS session''for.prix''for.devise''th.nom'
  2611.                     'vil.nom AS vilnom','vil.pays','for.created_at','th.slug',
  2612.                     'th.description','for.devise'
  2613.                     )
  2614.                 ->from(Formations::class, 'for')
  2615.                 ->innerJoin(Themes::class,'th''WITH''for.theme = th.id')
  2616.                 ->innerJoin(Villes::class, 'vil''WITH''for.ville = vil.id')
  2617.                 ->where('th.id = :idtheme')
  2618.                 ->setParameter('idtheme'$themeId);
  2619.                 $formations $queryBuilder->getQuery()->getResult();
  2620.                 //dump($themeId,$formations);
  2621.                 $data = [];
  2622.                 foreach ($formations as $formation) {
  2623.                     $data[] = [
  2624.                         'id'   => $formation['id'],
  2625.                         'prix' => $formation['prix'],
  2626.                         'lieu' => $formation['vilnom'],
  2627.                         'devise' => $formation['devise'],
  2628.                         'session' => $formation['session'],
  2629.                     ];
  2630.                 }
  2631.                 return new JsonResponse($data);
  2632.             }
  2633.             /* LIEU → SESSION + PRIX */
  2634.             if ($request->request->get('action') === 'lieu_details') {
  2635.                 $formationId $request->request->get('formationId');
  2636.                 $queryBuilder $entityManager->createQueryBuilder();
  2637.                 $queryBuilder
  2638.                     ->select(
  2639.                         'for.dates_session AS session',
  2640.                         'for.prix',
  2641.                         'for.devise'
  2642.                     )
  2643.                     ->from(Formations::class, 'for')
  2644.                     ->where('for.id = :id')
  2645.                     ->setParameter('id'$formationId);
  2646.                 $formation $queryBuilder->getQuery()->getOneOrNullResult();
  2647.                 if (!$formation) {
  2648.                     return new JsonResponse(['error' => 'Formation introuvable'], 404);
  2649.                 }
  2650.                 return new JsonResponse([
  2651.                     'session' => $formation['session'],
  2652.                     'prix'    => $formation['prix'],
  2653.                     'devise'  => $formation['devise'],
  2654.                 ]);
  2655.             }
  2656.         }
  2657.         /* =========================
  2658.            AFFICHAGE NORMAL
  2659.         ========================= */
  2660.         $inscription = new Inscriptions();
  2661.  
  2662.         $form $this->createForm(NewInscriptionFormType::class);
  2663.         $form->handleRequest($request);
  2664.         if ($form->isSubmitted()) {
  2665.             
  2666.             $civilite $form->get('civilite')->getData();
  2667.             $nom $form->get('nom')->getData();
  2668.             $prenoms $form->get('prenoms')->getData();
  2669.             $fonction $form->get('fonction')->getData();
  2670.             $telephone $form->get('telephone')->getData();
  2671.             
  2672.             $adresse $form->get('adresse')->getData();
  2673.             $mail $form->get('mail')->getData();
  2674.             $entreprise $form->get('entreprise')->getData();
  2675.             
  2676.             $siteweb $form->get('siteweb')->getData();
  2677.             $nombrepart $form->get('nbparticipant')->getData();
  2678.             
  2679.             $pays $form->get('pays')->getData();
  2680.             $ville $form->get('ville')->getData();
  2681.             
  2682.             $boitepostale $form->get('boitepostale')->getData();
  2683.             $whatsapp $form->get('whatsapp')->getData();          
  2684.             
  2685.             $theme $form->get('theme')->getData();
  2686.             //$lieu = $form->get('lieu')->getData();
  2687.             $periode $form->get('periode')->getData();
  2688.             
  2689.             $telephone $form->get('telephone')->getData();
  2690.             $commentaire $form->get('commentaire')->getData(); 
  2691.            
  2692.             if(!$commentaire){
  2693.                 $commentaire "pas renseigné";
  2694.             }else{
  2695.                 $commentaire $form->get('commentaire')->getData();
  2696.             }
  2697.             
  2698.             if(!$siteweb){
  2699.                 $siteweb "pas renseigné";
  2700.             }else{
  2701.                 $siteweb $form->get('siteweb')->getData();
  2702.             }
  2703.             
  2704.             if(!$adresse){
  2705.                 $adresse "pas renseigné";
  2706.             }else{
  2707.                 $adresse $form->get('adresse')->getData();
  2708.             }
  2709.             
  2710.             if(!$boitepostale){
  2711.                 $boitepostale "pas renseigné";
  2712.             }else{
  2713.                 $boitepostale $form->get('boitepostale')->getData();
  2714.             }
  2715.             
  2716.             $themeId $theme->getId();
  2717.             $nomtheme $theme->getNom();
  2718.             //dd($form);
  2719.             
  2720.             $Seminaires $formationsRepository->findOneBy(array('theme' => $themeId'dates_session' => $periode));
  2721.             /*$formationId = $formations->getId();*/
  2722.             
  2723.             $queryBuilder $entityManager->createQueryBuilder();
  2724.             $queryBuilder
  2725.             ->select(
  2726.                 'for.id''for.dates_session AS session''for.prix''for.devise''th.nom'
  2727.                 'vil.nom AS vilnom','vil.pays','for.created_at','th.slug''th.id AS themeId'
  2728.                 'th.description','for.devise'
  2729.                 )
  2730.             ->from(Formations::class, 'for')
  2731.             ->innerJoin(Themes::class,'th''WITH''for.theme = th.id')
  2732.             ->innerJoin(Villes::class, 'vil''WITH''for.ville = vil.id')
  2733.             ->where('th.id = :idtheme')
  2734.             ->andwhere('for.dates_session = :sessions')
  2735.             ->setParameter('idtheme'$themeId)
  2736.             ->setParameter('sessions'$periode);
  2737.             $formations $queryBuilder->getQuery()->getResult();
  2738.             $villeForm $formations[0]['vilnom'];
  2739.             $prixForm $formations[0]['prix'];
  2740.             $deviseForm $formations[0]['devise'];
  2741.             $destinataire 'inscription@cimef-international.org';
  2742.             $expediteur   $mail;
  2743.             $reponse      $expediteur;
  2744.             $suj "INSCRIPTION FORMATION 2026";
  2745.             
  2746.             $codehtml '<html><body>'.
  2747.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  2748.             <tr>
  2749.             <td align="center">
  2750.             <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff; border-radius:6px; overflow:hidden; box-shadow:0 2px 6px rgba(0,0,0,0.08);">
  2751.             <tr>
  2752.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  2753.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  2754.             </td>
  2755.             </tr>
  2756.             <tr>
  2757.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  2758.             <p>Demande de dévis de '.$civilite.' <strong>'.$prenoms.' '.$nom.'</strong> pour une formation avec pour thème :<strong>'.$nomtheme.'</strong>.</p>
  2759.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  2760.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  2761.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  2762.             <p>
  2763.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  2764.             <strong>Fonction :</strong> '.$fonction.'<br>
  2765.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  2766.             <strong>Adresse :</strong> '.$adresse.'<br>
  2767.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  2768.             </p>
  2769.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  2770.             <p>
  2771.             <strong>Email :</strong> '.$mail.'<br>
  2772.             <strong>Téléphone :</strong> '.$telephone.'<br>
  2773.             <strong>Whatsapp :</strong> '.$whatsapp.'<br>
  2774.             <strong>Site web :</strong> '.$siteweb.'
  2775.             </p>
  2776.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  2777.             <p>
  2778.             <strong>Nombre de participants :</strong> '.$nombrepart.'<br>
  2779.             <strong>Commentaire :</strong> '.$commentaire.'
  2780.             </p>
  2781.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  2782.             <p>
  2783.             <strong>Thème :</strong> '.$nomtheme.'<br>
  2784.             <strong>Lieu :</strong> '.$villeForm.'<br>
  2785.             <strong>Période :</strong> '.$periode.'<br>
  2786.             <strong>Prix :</strong> '.$prixForm.' '.$deviseForm.'
  2787.             </p>
  2788.             </td>
  2789.             </tr>
  2790.             <tr>
  2791.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  2792.             © '.date("Y").' CIMEF International — Tous droits réservés
  2793.             </td>
  2794.             </tr>
  2795.             </table>
  2796.             </td>
  2797.             </tr>
  2798.             </table>
  2799.             </body></html>';
  2800.             
  2801.             $email = (new Email())
  2802.             ->from('CIMEF International <inscription@cimef-international.org>')
  2803.             ->to($destinataire)                 // destinataire principal
  2804.             ->cc('medias@cimef-international.com'// COPIE
  2805.             ->replyTo($expediteur)              // Reply-To:
  2806.             ->subject($suj)     
  2807.             ->text(strip_tags($codehtml))
  2808.             ->html($codehtml);// Subject:
  2809.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  2810.             $mailer->send($email);
  2811.             $inscription->setNom($nom);
  2812.             $inscription->setPrenoms($prenoms);
  2813.             $inscription->setFonction($fonction);
  2814.             $inscription->setAdresse($adresse);
  2815.             $inscription->setMail($mail);
  2816.             $inscription->setEntreprise($entreprise);
  2817.             $inscription->setSiteweb($siteweb);
  2818.             $inscription->setNbparticipant($nombrepart);
  2819.             $inscription->setPays($pays);
  2820.             $inscription->setVille$ville);
  2821.             $inscription->setBoitepostale($boitepostale);
  2822.             $inscription->setWhatsapp($whatsapp);
  2823.             $inscription->setTelephone($telephone);
  2824.             $inscription->setCommentaire($commentaire);
  2825.             $inscription->setFormation($Seminaires);
  2826.             $entityManager->persist($inscription);
  2827.             $entityManager->flush();
  2828.             $this->addFlash(
  2829.             'success',
  2830.             'Votre inscription à été bien enregistrée');
  2831.             return $this->redirectToRoute('front.inscriptions',['annee' => $annee]);
  2832.         }
  2833.     
  2834.         $mentions $mentionRepository->findAll();
  2835.         return $this->render('front/inscriptions/inscription-index.html.twig', [
  2836.             'annee' => date('Y'),
  2837.             'mentions' => $mentions,
  2838.             'demandeformationsForm' => $form->createView(),
  2839.         ]);
  2840.     }
  2841.     #[Route('/catalogue-CIMEF-INTERNATIONAL-2026'name'front.catalogue'methods:['GET'])]
  2842.     public function catalogue(
  2843.         Request $request
  2844.         ManagementsRepository $managementRepository,
  2845.         MentionsRepository $mentionRepository,
  2846.         EntityManagerInterface $entityManager
  2847.     ): Response
  2848.     {
  2849.         return $this->render('front/cato.html.twig',[
  2850.             'no_base_style' => true
  2851.         ]);
  2852.     }
  2853.     #[Route('/contact'name'front.contact'methods:['GET','POST'])]
  2854.     public function contact(
  2855.         Request $request,
  2856.         MailerInterface $mailer,
  2857.         MentionsRepository $mentionRepository,
  2858.         EntityManagerInterface $entityManager
  2859.     ): Response
  2860.     {
  2861.         $mentions $mentionRepository->findAll();
  2862.         $contactForm $this->createForm(ContactFormType::class);
  2863.         $contactForm->handleRequest($request);
  2864.         
  2865.         if($contactForm->isSubmitted()){
  2866.             $nom htmlspecialchars($contactForm->get('nom')->getData());
  2867.             $mail htmlspecialchars($contactForm->get('email')->getData());
  2868.             $sujet htmlspecialchars($contactForm->get('sujet')->getData());
  2869.             $contact htmlspecialchars($contactForm->get('contact')->getData());
  2870.             $message htmlspecialchars($contactForm->get('message')->getData());
  2871.             
  2872.             $besoinArray $contactForm->get('besoin')->getData();
  2873.             $besoin implode(', 'array_map('htmlspecialchars'$besoinArray));
  2874.             //dd($besoin);
  2875.             $secretKey '6LfPYkosAAAAAJQFLCC-9U5bF6KdFTPrgmbxg5Ux';
  2876.             $value $request->get('g-recaptcha-response');
  2877.             $userIP $_SERVER['REMOTE_ADDR'];
  2878.             $url "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$value&remoteid=$userIP";
  2879.             $response \file_get_contents($url);
  2880.             $response json_decode((string)$response);
  2881.             //dd($response);
  2882.             if(!$response->success){
  2883.                 $this->addFlash(
  2884.                     'warning',
  2885.                     'Cocher le champs recaptcha svp!');
  2886.             }else{
  2887.             $destinataire 'inscription@cimef-international.org';
  2888.             $expediteur   $mail;
  2889.             $reponse      $expediteur;
  2890.             $suj $sujet;
  2891.             $codehtml '
  2892.                 <!DOCTYPE html>
  2893.                     <html lang="fr">
  2894.                     <head>
  2895.                         <meta charset="UTF-8">
  2896.                         <meta name="viewport" content="width=device-width, initial-scale=1.0">
  2897.                         <title>Nouveau message de contact</title>
  2898.                     </head>
  2899.                     <body style="margin: 0; padding: 20px; font-family: Arial, sans-serif; background-color: #f8f9fa;">
  2900.                         <table width="100%" cellpadding="0" cellspacing="0" style="max-width: 700px; margin: 0 auto; background: white; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 12px rgba(5, 26, 83, 0.1);">
  2901.                             <!-- Header -->
  2902.                             <tr>
  2903.                                 <td style="background: linear-gradient(135deg, #051a53 0%, #0a2a7a 100%); padding: 30px 30px 25px 30px; text-align: center; border-top: 4px solid #ff6600;">
  2904.                                     <table width="100%" cellpadding="0" cellspacing="0">
  2905.                                         <tr>
  2906.                                             <td style="color: white; font-size: 28px; font-weight: bold; padding-bottom: 10px;">
  2907.                                                 CIMEF-INTERNATIONAL
  2908.                                             </td>
  2909.                                         </tr>
  2910.                                         <tr>
  2911.                                             <td style="color: white; font-size: 22px; font-weight: 600; padding-bottom: 8px;">
  2912.                                                 Nouveau message de contact
  2913.                                             </td>
  2914.                                         </tr>
  2915.                                         <tr>
  2916.                                             <td style="color: rgba(255, 255, 255, 0.9); font-size: 16px;">
  2917.                                                 Formulaire de contact • Site de CIMEF-INTERNATIONAL
  2918.                                             </td>
  2919.                                         </tr>
  2920.                                     </table>
  2921.                                 </td>
  2922.                             </tr>
  2923.                             
  2924.                             <!-- Content -->
  2925.                             <tr>
  2926.                                 <td style="padding: 30px;">
  2927.                                     <table width="100%" cellpadding="0" cellspacing="0">
  2928.                                         <tr>
  2929.                                             <td style="background-color: rgba(255, 102, 0, 0.1); color: #ff6600; padding: 10px 15px; border-radius: 20px; font-weight: bold; font-size: 14px; text-align: center; margin-bottom: 25px;">
  2930.                                                 Nouveau message reçu
  2931.                                             </td>
  2932.                                         </tr>
  2933.                                         
  2934.                                         <tr>
  2935.                                             <td style="padding-bottom: 20px; color: #555; line-height: 1.6;">
  2936.                                                 Bonjour,<br>
  2937.                                                 Un visiteur a rempli le formulaire de contact de votre site de formation.
  2938.                                             </td>
  2939.                                         </tr>
  2940.                                         
  2941.                                         <!-- Informations -->
  2942.                                         <tr>
  2943.                                             <td>
  2944.                                                 <table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom: 25px;">
  2945.                                                     <tr>
  2946.                                                         <td width="50%" style="padding: 15px; background-color: #f8f9ff; border-left: 4px solid #051a53; border-radius: 5px;">
  2947.                                                             <div style="font-size: 12px; color: #6c757d; font-weight: bold; text-transform: uppercase; margin-bottom: 5px;">
  2948.                                                                 Nom complet
  2949.                                                             </div>
  2950.                                                             <div style="font-size: 16px; color: #051a53; font-weight: bold;">
  2951.                                                                 '.$nom.'
  2952.                                                             </div>
  2953.                                                         </td>
  2954.                                                         <td width="10"></td>
  2955.                                                         <td width="50%" style="padding: 15px; background-color: #f8f9ff; border-left: 4px solid #ff6600; border-radius: 5px;">
  2956.                                                             <div style="font-size: 12px; color: #6c757d; font-weight: bold; text-transform: uppercase; margin-bottom: 5px;">
  2957.                                                                 Adresse email
  2958.                                                             </div>
  2959.                                                             <div style="font-size: 16px; color: #ff6600; font-weight: bold;">
  2960.                                                                 <a href="mailto:'.$mail.'" style="color: #ff6600; text-decoration: none;">'.$mail.'</a>
  2961.                                                             </div>
  2962.                                                         </td>
  2963.                                                     </tr>
  2964.                                                     <tr height="15"></tr>
  2965.                                                     <tr>
  2966.                                                         <td width="50%" style="padding: 15px; background-color: #f8f9ff; border-left: 4px solid #051a53; border-radius: 5px;">
  2967.                                                             <div style="font-size: 12px; color: #6c757d; font-weight: bold; text-transform: uppercase; margin-bottom: 5px;">
  2968.                                                                 Objet du message
  2969.                                                             </div>
  2970.                                                             <div style="font-size: 16px; color: #051a53; font-weight: bold;">
  2971.                                                                 '.$sujet.'
  2972.                                                             </div>
  2973.                                                         </td>
  2974.                                                         <td width="10"></td>
  2975.                                                         <td width="50%" style="padding: 15px; background-color: #f8f9ff; border-left: 4px solid #ff6600; border-radius: 5px;">
  2976.                                                             <div style="font-size: 12px; color: #6c757d; font-weight: bold; text-transform: uppercase; margin-bottom: 5px;">
  2977.                                                                 Date d\'envoi
  2978.                                                             </div>
  2979.                                                             <div style="font-size: 16px; color: #051a53; font-weight: bold;">
  2980.                                                                 '.$contact.'
  2981.                                                             </div>
  2982.                                                         </td>
  2983.                                                     </tr>
  2984.                                                     <tr height="15"></tr>
  2985.                                                     <tr>
  2986.                                                         <td width="100%" style="padding: 15px; background-color: #f8f9ff; border-left: 4px solid #051a53; border-radius: 5px;">
  2987.                                                             <div style="font-size: 12px; color: #6c757d; font-weight: bold; text-transform: uppercase; margin-bottom: 5px;">
  2988.                                                                 Type de besoin
  2989.                                                             </div>
  2990.                                                             <div style="font-size: 16px; color: #051a53; font-weight: bold;">
  2991.                                                                 '.$besoin.'
  2992.                                                             </div>
  2993.                                                         </td>
  2994.                                                     </tr>
  2995.                                                 </table>
  2996.                                             </td>
  2997.                                         </tr>
  2998.                                         
  2999.                                         <!-- Message -->
  3000.                                         <tr>
  3001.                                             <td>
  3002.                                                 <div style="color: #051a53; font-size: 18px; font-weight: bold; padding-bottom: 10px; border-bottom: 2px solid rgba(255, 102, 0, 0.3); margin-bottom: 15px;">
  3003.                                                     Message
  3004.                                                 </div>
  3005.                                                 <div style="background-color: #f8f9ff; padding: 20px; border-radius: 8px; border: 1px solid rgba(5, 26, 83, 0.1); white-space: pre-wrap; line-height: 1.6;">
  3006.                                                     '.$message.'
  3007.                                                 </div>
  3008.                                             </td>
  3009.                                         </tr>
  3010.                                         
  3011.                                         <!-- Info note -->
  3012.                                         <tr>
  3013.                                             <td style="padding-top: 30px;">
  3014.                                                 <div style="background-color: rgba(5, 26, 83, 0.05); padding: 15px; border-radius: 8px; font-size: 14px; color: #555; line-height: 1.5;">
  3015.                                                     <strong style="color: #ff6600;">Information :</strong> Cet email a été envoyé automatiquement depuis le formulaire de contact de votre plateforme de formation.
  3016.                                                 </div>
  3017.                                             </td>
  3018.                                         </tr>
  3019.                                     </table>
  3020.                                 </td>
  3021.                             </tr>
  3022.                             
  3023.                             <!-- Footer -->
  3024.                             <tr>
  3025.                                 <td style="background-color: #f8f9ff; padding: 25px 30px; text-align: center; border-top: 1px solid rgba(5, 26, 83, 0.1);">
  3026.                                     <div style="color: #051a53; font-size: 20px; font-weight: bold; margin-bottom: 10px;">
  3027.                                         CIMEF-INTERNATIONAL
  3028.                                     </div>
  3029.                                     <div style="color: #6c757d; font-size: 14px; line-height: 1.5; margin-bottom: 20px;">
  3030.                                         La formation précède la compétitivité
  3031.                                     </div>
  3032.                                     
  3033.                                     <div style="color: #6c757d; font-size: 12px; padding-top: 20px; border-top: 1px solid rgba(5, 26, 83, 0.1);">
  3034.                                         © 2026 CIMEF-INTERNATIONAL. Tous droits réservés.<br>
  3035.                                         Cet email a été généré automatiquement.
  3036.                                     </div>
  3037.                                 </td>
  3038.                             </tr>
  3039.                         </table>
  3040.                     </body>
  3041.                 </html>';
  3042.             $email = (new Email())
  3043.             ->from('CIMEF International <inscription@cimef-international.org>')
  3044.             ->to($destinataire)                 // destinataire principal
  3045.             ->cc('medias@cimef-international.com'// COPIE
  3046.             ->replyTo($expediteur
  3047.             ->subject($suj)
  3048.            ->text(strip_tags($codehtml))
  3049.             ->html($codehtml);
  3050.             /*->html('<html><body>'.
  3051.             '<p>Bonjour vous avez un nouveau message de M/Mme <b>'.$nom.' </b><br>'.
  3052.             ''.$message.'<br>'.
  3053.             'Vous pouvez mecm\'écrire à l\'adresse suivante <b>'.$mail.'<br>'.
  3054.             '</p>'.
  3055.             '</body></html>');*/
  3056.             $mailer->send($email);
  3057.             $this->addFlash
  3058.             'success',
  3059.             'Votre message a été envoyé');
  3060.             return $this->redirectToRoute('front.contact');
  3061.             }
  3062.         }
  3063.         return $this->render('front/contact.html.twig',[
  3064.             'contactForm' => $contactForm->createView(),
  3065.             'mentions' => $mentions
  3066.         ]);
  3067.     }
  3068.     
  3069.     #[Route('/formations/shanghai'name'front.inter.shanghai'methods:['GET'])]
  3070.     public function shanghai(
  3071.         Request $request,
  3072.         MentionsRepository $mentionRepository,
  3073.         ThemeshanghaiRepository $themeshanghaiRepository,
  3074.         ManagementsRepository $managementRepository,
  3075.         EntityManagerInterface $entityManager
  3076.     ): Response
  3077.     {
  3078.         $shanghai $themeshanghaiRepository->findAll();
  3079.         //dd($shanghai);
  3080.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  3081.         
  3082.         $queryBuilder $entityManager->createQueryBuilder();
  3083.         $queryBuilder
  3084.         ->select('for','th','thm','vil')
  3085.             ->from(Formations::class, 'for')
  3086.             ->innerJoin('for.theme''th')
  3087.             ->innerJoin('th.thematique''thm')
  3088.             ->innerJoin('for.ville''vil')
  3089.             ->Where('vil = :ville')
  3090.             ->setParameter('ville''SHANGHAI');
  3091.         $formationShanghai $queryBuilder->getQuery()->getResult();
  3092.     
  3093.         $mentions $mentionRepository->findAll();
  3094.         return $this->render('front/shanghai.html.twig',[
  3095.             'pagination' => $shanghai,
  3096.             'manageLimit' => $manageLimit,
  3097.             'mentions' => $mentions,
  3098.         ]);
  3099.     }
  3100. }