src/Controller/FrontController.php line 1002

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