src/Controller/FrontController.php line 1466

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