src/Controller/FrontController.php line 2515

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