src/Controller/FrontController.php line 282

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Faqs;
  4. use App\Entity\Avis;
  5. use App\Entity\Themes;
  6. use App\Entity\Galeries;
  7. use App\Entity\Villes;
  8. use App\Entity\Thematiques;
  9. use App\Entity\Actualites;
  10. use App\Entity\Formations;
  11. use App\Entity\References;
  12. use App\Entity\Mentions;
  13. use App\Entity\Managements;
  14. use App\Entity\Bannieres;
  15. use App\Entity\Inscriptions;
  16. use App\Entity\Demandeformations;
  17. use Doctrine\ORM\EntityManager;
  18. use App\Form\ProduitFormType;
  19. use App\Form\InscriptionFormType;
  20. use App\Form\NewInscriptionFormType;
  21. use App\Service\GeoIpService;
  22. use App\Entity\Certificats;
  23. use App\Form\CertificatFormType;
  24. use App\Form\EditCertificatFormType;
  25. use App\Repository\CertificatsRepository;
  26. use App\Repository\DemandeformationsRepository;
  27. use App\Repository\InscriptionsRepository;
  28. use App\Repository\AvisRepository;
  29. use App\Repository\ManagementsRepository;
  30. use App\Repository\MentionsRepository;
  31. use App\Repository\VillesRepository;
  32. use App\Repository\GaleriesRepository;
  33. use App\Repository\ThemesRepository;
  34. use App\Repository\FormationsRepository;
  35. use App\Repository\AboutsRepository;
  36. use App\Repository\ThematiquesRepository;
  37. use App\Repository\ValeursRepository;
  38. use App\Repository\BannieresRepository;
  39. use App\Repository\ActualitesRepository;
  40. use App\Repository\PartenairesRepository;
  41. use App\Repository\ReferenceclientsRepository;
  42. use App\Repository\InformationsRepository;
  43. //use Symfony\Component\Mime\Email;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\HttpFoundation\Response;
  46. use Symfony\Component\Routing\Annotation\Route;
  47. use Symfony\Component\String\Slugger\SluggerInterface;
  48. use App\Form\ContactFormType;
  49. use App\Form\DevisFormType;
  50. use App\Form\CombinedFormType;
  51. use App\Form\DemandeformationFormType;
  52. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  53. use Symfony\Component\Mime\Email;
  54. use Symfony\Component\Mailer\MailerInterface;
  55. use Symfony\Component\HttpFoundation\JsonResponse;
  56. use Knp\Component\Pager\PaginatorInterface;
  57. use Doctrine\ORM\EntityManagerInterface;
  58. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  59. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  60. class FrontController extends AbstractController
  61. {
  62.     #[Route('/'name'front.inter.index'methods:['GET'])]
  63.     public function index(
  64.         Request $request
  65.         MentionsRepository $mentionRepository,
  66.         BannieresRepository $banniereRepository,
  67.         ReferenceclientsRepository $referenceRepository
  68.         EntityManagerInterface $entityManager
  69.     ): Response
  70.     {
  71.         $annee date('Y');
  72.         $queryBuilder $entityManager->createQueryBuilder();
  73.         $queryBuilder
  74.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  75.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at''th.slug' 
  76.         )
  77.         ->from(Formations::class, 'for')
  78.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  79.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  80.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  81.         ->orderBy('for.created_at''DESC')
  82.         ->setMaxResults(3);
  83.         $query $queryBuilder->getQuery()->getResult();
  84.         
  85.         $queryBuilder $entityManager->createQueryBuilder();
  86.         $queryBuilder
  87.         ->select('actu')
  88.         ->from(Actualites::class, 'actu')
  89.         ->orderBy('actu.createdat''DESC')
  90.         ->setMaxResults(2);
  91.         $actualite $queryBuilder->getQuery()->getResult();
  92.         $reference $referenceRepository->findAll();
  93.         $mentions $mentionRepository->findAll();
  94.         
  95.         $bannieres $banniereRepository->findAll();
  96.         // dd($mentions);
  97.         
  98.         return $this->render('front/index.html.twig',[
  99.             'annee' => $annee,
  100.             'banniere' => $bannieres,
  101.             'mentions' => $mentions,
  102.             'reference' => $reference,
  103.             'formations' => $query,
  104.             'actualite' => $actualite
  105.         ]);
  106.     }
  107.     #[Route('/certificats-internationaux'name'front.inter.certificat'methods:['GET'])]
  108.     public function certificat(
  109.         Request $request
  110.         PaginatorInterface $paginator,
  111.         CertificatsRepository $certificatRepository,
  112.         ManagementsRepository $managementRepository,
  113.         MentionsRepository $mentionRepository,
  114.         EntityManagerInterface $entityManager
  115.     ): Response
  116.     {
  117.         $certificat $certificatRepository->findAll();
  118.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  119.         $queryBuilder $entityManager->createQueryBuilder();
  120.         $queryBuilder
  121.             ->select(
  122.                 'cert.id','cert.session','cert.prix','cert.slug',
  123.                 'cert.devise','cert.theme','vil.nom AS vilnom',
  124.                 'vil.pays','cert.createdat','cert.type'
  125.             )
  126.             ->from(Certificats::class, 'cert')
  127.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  128.             ->orderBy('cert.createdat''DESC')
  129.             ->groupBy('cert.theme');
  130.         $certificat $queryBuilder->getQuery()->getResult();
  131.         $pagination $paginator->paginate(
  132.             $queryBuilder,
  133.             $request->query->getInt('page'1),
  134.             12
  135.         );  
  136.             
  137.         $mentions $mentionRepository->findAll();
  138.         return $this->render('front/certificat.html.twig',[
  139.             'manageLimit' => $manageLimit,
  140.             'pagination' => $pagination,
  141.             'mentions' => $mentions,
  142.         ]);
  143.     }
  144.     #[Route('/certificats-internationaux/{slug}'name'front.inter.detail.certificat'methods:['GET'])]
  145.     public function detail_certificat(
  146.         $slug,
  147.         Request $request
  148.         PaginatorInterface $paginator,
  149.         CertificatsRepository $certificatRepository,
  150.         ManagementsRepository $managementRepository,
  151.         MentionsRepository $mentionRepository,
  152.         EntityManagerInterface $entityManager
  153.     ): Response
  154.     {
  155.         $certificat $certificatRepository->findAll();
  156.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  157.         $queryBuilder $entityManager->createQueryBuilder();
  158.         $queryBuilder
  159.             ->select(
  160.                 'cert.id','cert.session','cert.prix','cert.slug',
  161.                 'cert.devise','cert.theme','vil.nom AS vilnom',
  162.                 'vil.pays','cert.createdat','cert.type'
  163.             )
  164.             ->from(Certificats::class, 'cert')
  165.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  166.             ->where('cert.slug = :slug')
  167.             ->setParameter('slug'$slug);
  168.         $certificat $queryBuilder->getQuery()->getResult();
  169.         $pagination $paginator->paginate(
  170.             $queryBuilder,
  171.             $request->query->getInt('page'1),
  172.             12
  173.         );  
  174.             
  175.         $mentions $mentionRepository->findAll();
  176.         return $this->render('front/liste-certificat.html.twig',[
  177.             'manageLimit' => $manageLimit,
  178.             'pagination' => $pagination,
  179.             'mentions' => $mentions,
  180.             'slug' => $slug
  181.         ]);
  182.     }
  183.     
  184.     #[Route('/presentation'name'front.inter.presentation'methods:['GET'])]
  185.     public function presentation(
  186.         Request $request
  187.         PartenairesRepository $partenaireRepository,
  188.         FormationsRepository $formationRepository,
  189.         AboutsRepository $aboutRepository
  190.         ValeursRepository $valeurRepository,
  191.         AvisRepository $avisRepository,
  192.         MentionsRepository $mentionRepository,
  193.         EntityManagerInterface $entityManager
  194.     ): Response
  195.     {
  196.         $avis $avisRepository->findAll();
  197.         $All_partenaire $partenaireRepository->findAll();
  198.         $All_about $aboutRepository->findAll();
  199.         $All_valeur $valeurRepository->findAll();
  200.         $mentions $mentionRepository->findAll();
  201.         return $this->render('front/qui-sommes-nous.html.twig',[
  202.             'partenaires' => $All_partenaire,
  203.             'valeur' => $All_valeur,
  204.             'mentions' => $mentions,
  205.             'about' => $All_about,
  206.             'avis' => $avis,
  207.         ]);
  208.     }
  209.     #[Route('/formations/rencontre-top-management'name'front.top.management'methods:['GET'])]
  210.     public function management(
  211.         Request $request
  212.         PaginatorInterface $paginator,
  213.         MentionsRepository $mentionRepository,
  214.         ManagementsRepository $managementRepository,
  215.         EntityManagerInterface $entityManager
  216.     ): Response
  217.     {
  218.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  219.         // dd($manageLimit);
  220.         $queryBuilder $entityManager->createQueryBuilder();
  221.         $queryBuilder
  222.         ->select('man')
  223.         ->from(Managements::class, 'man')
  224.         ->orderBy('man.createdat''DESC');
  225.         
  226.         $pagination $paginator->paginate(
  227.             $queryBuilder,
  228.             $request->query->getInt('page'1),
  229.             10
  230.         );  
  231.         $mentions $mentionRepository->findAll();
  232.         return $this->render('front/rencontre-management.html.twig',[
  233.             'mentions' => $mentions,
  234.             'pagination' => $pagination,
  235.             'manageLimit' => $manageLimit
  236.         ]);
  237.     }
  238.     
  239.     #[Route('/formations/rencontre-top-management/{slug}'name'front.seminaire.management.detail'methods:['GET'])]
  240.     public function detail_management(
  241.         $slug,
  242.         Request $request
  243.         ManagementsRepository $managementRepository,
  244.         MentionsRepository $mentionRepository,
  245.         EntityManagerInterface $entityManager
  246.     ): Response
  247.     {
  248.         $query $managementRepository->findOneBy(array('slug' => $slug));
  249.         $mentions $mentionRepository->findAll();
  250.         // dd($query);
  251.         return $this->render('front/detail/detail-rencontre.html.twig',[
  252.             'mentions' => $mentions,
  253.             'query' => $query
  254.         ]);
  255.     }
  256.     #[Route('/seminaires-internationaux'name'front.seminaire.internationaux'methods:['GET'])]
  257.     public function sem_inter(
  258.         Request $request
  259.         PaginatorInterface $paginator,
  260.         MentionsRepository $mentionRepository,
  261.         EntityManagerInterface $entityManager
  262.     ): Response
  263.     {
  264.         $annee date('Y');
  265.         // dd($annee);
  266.         /*$queryBuilder = $entityManager->createQueryBuilder();
  267.         $queryBuilder
  268.         ->select('for.id','for.dates_session', 'for.prix', 'for.devise', 'th.nom', 
  269.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at', 'th.slug'
  270.         )
  271.         ->from(Formations::class, 'for')
  272.         ->innerJoin(Themes::class, 'th', 'WITH', 'for.theme = th.id')
  273.         ->innerJoin(Villes::class,  'vil', 'WITH', 'for.ville = vil.id')
  274.         ->innerJoin(Thematiques::class, 'thm', 'WITH', 'th.thematique= thm.id')
  275.         ->orderBy('for.created_at', 'DESC');*/
  276.         $subQuery $entityManager->createQueryBuilder()
  277.             ->select('MAX(f2.id)')
  278.             ->from(Formations::class, 'f2')
  279.             ->groupBy('f2.theme');
  280.         
  281.         $queryBuilder $entityManager->createQueryBuilder();
  282.         $queryBuilder
  283.             ->select('for.id','for.dates_session''for.prix''for.devise''th.nom'
  284.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at''th.slug')
  285.             ->from(Formations::class, 'for')
  286.             ->innerJoin('for.theme''th')
  287.             ->innerJoin('for.ville''vil')
  288.             ->innerJoin('th.thematique''thm')
  289.             ->where($queryBuilder->expr()->in('for.id'$subQuery->getDQL()))
  290.             ->orderBy('for.created_at''DESC');        
  291.         
  292.         $pagination $paginator->paginate(
  293.             $queryBuilder,
  294.             $request->query->getInt('page'1),
  295.             12
  296.         );  
  297.         //dd($pagination);
  298.         $mentions $mentionRepository->findAll();
  299.         
  300.         return $this->render('front/seminaire_inter.html.twig',[
  301.             'annee' => $annee,
  302.             'mentions' => $mentions,
  303.             'pagination' => $pagination
  304.         ]);
  305.     }
  306.     
  307.     #[Route('/seminaires-nationaux'name'front.seminaire.nationaux'methods:['GET'])]
  308.     public function sem_nat(
  309.         Request $request
  310.         GeoIpService $geo,
  311.         PaginatorInterface $paginator,
  312.         MentionsRepository $mentionRepository,
  313.         EntityManagerInterface $entityManager
  314.     ): Response
  315.     {
  316.         $ip $request->getClientIp(); // récupère IP utilisateur
  317.         $geoData $geo->getGeoData($ip);
  318.         // dd($geoData);
  319.         // Exemple : utilisation dans le contrôleur
  320.         $pays        $geoData['country'];
  321.         $codePays    $geoData['country_code'];
  322.         $ville       $geoData['city'];
  323.         $ipTrouvee   $geoData['ip'];
  324.         $annee date('Y');
  325.         if($pays === 'Local' || $pays === 'Ivory Coast') {
  326.             $getpays "Côte d'ivoire";
  327.         }else{
  328.             $getpays $pays;
  329.         }
  330.         $queryBuilder $entityManager->createQueryBuilder();
  331.         $queryBuilder
  332.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  333.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at''th.slug' 
  334.         )
  335.         ->from(Formations::class, 'for')
  336.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  337.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  338.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  339.         ->where('vil.pays = :pays')
  340.         ->setParameter('pays'$getpays)
  341.         ->orderBy('for.created_at''DESC');
  342.         $query $queryBuilder->getQuery()->getResult();
  343.         
  344.         $pagination $paginator->paginate(
  345.             $queryBuilder,
  346.             $request->query->getInt('page'1),
  347.             12
  348.         );  
  349.         $mentions $mentionRepository->findAll();
  350.         return $this->render('front/seminaire_nat.html.twig',[
  351.             'annee' => $annee,
  352.             'mentions' => $mentions,
  353.             'pagination' => $pagination
  354.         ]);
  355.     }
  356.     // #[Route('/generate-slugs', name: 'generate_slugs')]
  357.     // public function generateSlugs(
  358.     //     SluggerInterface $slugger, 
  359.     //     VillesRepository $repo,
  360.     //     EntityManagerInterface $em)
  361.     // {
  362.     //     $categories = $repo->findAll();
  363.     //     foreach ($categories as $cat) {
  364.             
  365.     //         $slug = $slugger->slug( $cat->getNom());
  366.     //         $cat->setSlug($slug);
  367.     //     }
  368.     //     $em->flush();
  369.     //     return new Response("Slugs générés !");
  370.     // }
  371.     
  372.     #[Route('/formations/{seminaires}/{slug}/{id}code/inscription'name'front.inscription'methods:['GET','POST'])]
  373.     public function inscription_sem(
  374.         $slug,
  375.         $seminaires,
  376.         $id,
  377.         Request $request,
  378.         MailerInterface $mailer,
  379.         InscriptionsRepository $inscriptionRepository,
  380.         VillesRepository $villeRepository,
  381.         ThemesRepository $themeRepository,
  382.         FormationsRepository $formationRepository,
  383.         MentionsRepository $mentionRepository,
  384.         EntityManagerInterface $entityManager
  385.     ): Response
  386.     {
  387.         //dd($seminaires);
  388.         $annee date('Y');
  389.         $queryBuilder $entityManager->createQueryBuilder();
  390.         $queryBuilder
  391.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  392.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  393.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  394.         )
  395.         ->from(Formations::class, 'for')
  396.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  397.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  398.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  399.         ->where('th.slug = :theme')
  400.         ->andwhere('for.id = :forid')
  401.         ->setParameter('theme'$slug)
  402.         ->setParameter('forid'$id);
  403.         $query $queryBuilder->getQuery()->getResult();
  404.         $mentions $mentionRepository->findAll();
  405.         
  406.         $queryBuilder1 $entityManager->createQueryBuilder();
  407.         $queryBuilder1
  408.             ->select(
  409.                 'cert.id','cert.session','cert.prix','cert.slug',
  410.                 'cert.devise','cert.theme','vil.nom AS vilnom',
  411.                 'vil.pays','cert.createdat','cert.type'
  412.             )
  413.             ->from(Certificats::class, 'cert')
  414.             ->innerJoin(Villes::class, 'vil''WITH''cert.ville = vil.id')
  415.             ->where('cert.slug = :slug')
  416.             ->andwhere('cert.id = :id')
  417.             ->setParameter('slug'$slug)
  418.             ->setParameter('id'$id);
  419.         $certificat $queryBuilder1->getQuery()->getResult();
  420.         //dd($certificat);
  421.         $inscription = new Inscriptions();
  422.         $inscriptionForm $this->createForm(InscriptionFormType::class, $inscription);
  423.         $inscriptionForm->handleRequest($request);
  424.         if ($inscriptionForm->isSubmitted() && $inscriptionForm->isValid()) {
  425.         dd($inscriptionForm);
  426.             $nom $inscriptionForm->get('nom')->getData();
  427.             $prenoms $inscriptionForm->get('prenoms')->getData();
  428.             $fonction $inscriptionForm->get('fonction')->getData();
  429.             $adresse $inscriptionForm->get('adresse')->getData();
  430.             $mail $inscriptionForm->get('mail')->getData();
  431.             $entreprise $inscriptionForm->get('entreprise')->getData();
  432.             
  433.             $siteweb $inscriptionForm->get('siteweb')->getData();
  434.             $nbparticipant $inscriptionForm->get('nbparticipant')->getData();
  435.             $pays $inscriptionForm->get('pays')->getData();
  436.             $ville $inscriptionForm->get('ville')->getData();
  437.             $boitepostale $inscriptionForm->get('boitepostale')->getData();
  438.             $whatsapp $inscriptionForm->get('whatsapp')->getData();            
  439.             
  440.             $telephone $inscriptionForm->get('telephone')->getData();
  441.             $commentaire $inscriptionForm->get('commentaire')->getData(); 
  442.             $formation $formationRepository->find($id);
  443.             //dd($formation->getId());
  444.             if($query){
  445.                 $theme $formation->getTheme();
  446.                 $idville $formation->getVille();
  447.                 $session $formation->getDatesSession();
  448.                 $prix $formation->getPrix();
  449.                 $devise $formation->getDevise();
  450.                 
  451.                 $villes $villeRepository->find($idville);
  452.                 $nomtheme $theme->getNom();
  453.                 $nomville $villes->getNom();
  454.             }
  455.             
  456.             if($certificat){
  457.                 $nomtheme $certificat->getTheme();
  458.                 $nomville $certificat->getVille();
  459.                 $session $formation->getSession();
  460.                 $prix $certificat->getPrix();
  461.                 $devise $certificat->getDevise();
  462.                 
  463.                 //$villes = $villeRepository->find($idville);
  464.                 //$nomtheme = $theme->getNom();
  465.                 //$nomville = $villes->getNom();
  466.             }
  467.             
  468.             
  469.             
  470.             if(!$commentaire){
  471.                 $commentaire " ";
  472.             }else{
  473.                 $commentaire $inscriptionForm->get('commentaire')->getData();
  474.             }
  475.             
  476.             $destinataire 'inscription@cimef-international.com';
  477.             $expediteur   $mail;
  478.             $reponse      $expediteur;
  479.             $suj "INSCRIPTION FORMATION 2026";
  480.             //$codehtml = "test";
  481.             
  482.             $codehtml '<html><body>'.
  483.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  484.             <tr>
  485.             <td align="center">
  486.             <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);">
  487.             <tr>
  488.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  489.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  490.             </td>
  491.             </tr>
  492.             <tr>
  493.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  494.             <p>Inscription de M/Mme <strong>'.$prenoms.' '.$nom.'</strong> à la formation <strong>'.$nomtheme.'</strong> organisée par <strong>CIMEF International</strong>.</p>
  495.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  496.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  497.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  498.             <p>
  499.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  500.             <strong>Fonction :</strong> '.$fonction.'<br>
  501.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  502.             <strong>Adresse :</strong> '.$adresse.'<br>
  503.             <strong>Pays / Ville :</strong> '.$pays.' / '.$ville.'<br>
  504.             <strong>Boîte postale :</strong> '.$boitepostale.'
  505.             </p>
  506.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  507.             <p>
  508.             <strong>Email :</strong> '.$mail.'<br>
  509.             <strong>Téléphone :</strong> '.$telephone.'<br>
  510.             <strong>WhatsApp :</strong> '.$whatsapp.'<br>
  511.             <strong>Site web :</strong> '.$siteweb.'
  512.             </p>
  513.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  514.             <p>
  515.             <strong>Nombre de participants :</strong> '.$nbparticipant.'<br>
  516.             <strong>Commentaire :</strong> '.$commentaire.'
  517.             </p>
  518.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  519.             <p>
  520.             <strong>Thème :</strong> '.$nomtheme.'<br>
  521.             <strong>Ville :</strong> '.$nomville.'<br>
  522.             <strong>Prix :</strong> '.$prix.'<br>
  523.             <strong>Devise :</strong> '.$devise.'<br>
  524.             <strong>Session :</strong> '.$session.'
  525.             </p>
  526.             </td>
  527.             </tr>
  528.             <tr>
  529.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  530.             © '.date("Y").' CIMEF International — Tous droits réservés
  531.             </td>
  532.             </tr>
  533.             </table>
  534.             </td>
  535.             </tr>
  536.             </table>
  537.             </body></html>';
  538.             
  539.             $email = (new Email())
  540.             ->from('CIMEF International <inscription@cimef-international.com>')
  541.             ->to($destinataire)                 // destinataire principal
  542.             ->cc('medias@cimef-international.com'// COPIE
  543.             ->replyTo($expediteur)              // Reply-To:
  544.             ->subject($suj)     
  545.             ->text(strip_tags($codehtml))
  546.             ->html($codehtml);// Subject:
  547.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  548.             $mailer->send($email);
  549.             $inscription->setNom($nom);
  550.             $inscription->setPrenoms($prenoms);
  551.             $inscription->setFonction($fonction);
  552.             $inscription->setAdresse($adresse);
  553.             $inscription->setMail($mail);
  554.             $inscription->setEntreprise($entreprise);
  555.             $inscription->setSiteweb($siteweb);
  556.             $inscription->setNbparticipant($nbparticipant);
  557.             $inscription->setPays($pays);
  558.             $inscription->setVille$ville);
  559.             $inscription->setBoitepostale($boitepostale);
  560.             $inscription->setWhatsapp($whatsapp);
  561.             $inscription->setTelephone($telephone);
  562.             $inscription->setCommentaire($commentaire);
  563.             $inscription->setFormation($formation);
  564.             $entityManager->persist($inscription);
  565.             $entityManager->flush();
  566.             $this->addFlash(
  567.             'success',
  568.             'Votre inscription à été bien enregistrée');
  569.             return $this->redirectToRoute('front.seminaire.nationaux',['seminaires' => $seminaires,'slug' => $slug]);
  570.         }
  571.         if($query){
  572.             return $this->render('front/inscriptions/inscription-seminaire.html.twig',[
  573.                 'query' => $query,
  574.                 'certificat' => $certificat,
  575.                 'annee' => $annee,
  576.                 'type' => $seminaires,
  577.                 'mentions' => $mentions,
  578.                 'inscriptionForm' => $inscriptionForm->createView(),
  579.             ]);
  580.         }else{
  581.             return $this->render('front/inscriptions/inscription-certificat.html.twig',[
  582.                 'slug' => $slug,
  583.                 'query' => $query,
  584.                 'certificat' => $certificat,
  585.                 'annee' => $annee,
  586.                 'type' => $seminaires,
  587.                 'mentions' => $mentions,
  588.                 'inscriptionForm' => $inscriptionForm->createView(),
  589.             ]);
  590.         }
  591.     }
  592.     
  593.     
  594.     
  595.         
  596.     #[Route('/formations/seminaire-sur-mesure'name'front.seminaire-sur-mesure'methods:['GET','POST'])]
  597.     public function inscription_seminaire_sur_mesure(
  598.         Request $request,
  599.         MailerInterface $mailer,
  600.         InscriptionsRepository $inscriptionRepository,
  601.         MentionsRepository $mentionRepository,
  602.         EntityManagerInterface $entityManager
  603.     ): Response
  604.     {
  605.         //dd($seminaires);
  606.         $annee date('Y');
  607.         $mentions $mentionRepository->findAll();
  608.         $demandeformation = new Demandeformations();
  609.         $demandeformationsForm $this->createForm(DemandeformationFormType::class, $demandeformation);
  610.         $demandeformationsForm->handleRequest($request);
  611.         if ($demandeformationsForm->isSubmitted()) {
  612.             $nom $demandeformationsForm->get('nom')->getData();
  613.             $prenoms $demandeformationsForm->get('prenoms')->getData();
  614.             $fonction $demandeformationsForm->get('fonction')->getData();
  615.             $adresse $demandeformationsForm->get('adresse')->getData();
  616.             $mail $demandeformationsForm->get('mail')->getData();
  617.             $entreprise $demandeformationsForm->get('entreprise')->getData();
  618.             
  619.             $siteweb $demandeformationsForm->get('siteweb')->getData();
  620.             $nombrepart $demandeformationsForm->get('nombrepart')->getData();
  621.             $lieu $demandeformationsForm->get('lieu')->getData();
  622.             $theme $demandeformationsForm->get('theme')->getData();
  623.             $duree $demandeformationsForm->get('duree')->getData();
  624.             
  625.             $telephone $demandeformationsForm->get('telephone')->getData();
  626.             $commentaire $demandeformationsForm->get('commentaire')->getData(); 
  627.             //dd($formation->getId());
  628.            
  629.             if(!$commentaire){
  630.                 $commentaire "...";
  631.             }else{
  632.                 $commentaire $demandeformationsForm->get('commentaire')->getData();
  633.             }
  634.             
  635.             $destinataire 'inscription@cimef-international.com';
  636.             $expediteur   $mail;
  637.             $reponse      $expediteur;
  638.             $suj "INSCRIPTION FORMATION 2026";
  639.             //$codehtml = "test";
  640.             
  641.             $codehtml '<html><body>'.
  642.             '<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f6f8; padding:20px;">
  643.             <tr>
  644.             <td align="center">
  645.             <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);">
  646.             <tr>
  647.             <td style="background-color:#051a53; padding:20px; color:#ffffff; text-align:center;">
  648.             <h2 style="margin:0;">Confirmation d\'inscription</h2>
  649.             </td>
  650.             </tr>
  651.             <tr>
  652.             <td style="padding:25px; color:#333333; font-size:14px; line-height:1.6;">
  653.             <p>Demande de dévis de M/Mme <strong>'.$prenoms.' '.$nom.'</strong> pour une formation sur mesure avec pour thème :<strong>'.$nomtheme.'</strong>.</p>
  654.             <p>Veuillez trouver ci-dessous le récapitulatif :</p>
  655.             <hr style="border:none; border-top:1px solid #e0e0e0; margin:20px 0;">
  656.             <h4 style="margin-bottom:8px; color:#0d6efd;">Informations personnelles</h4>
  657.             <p>
  658.             <strong>Nom & Prénoms :</strong> '.$prenoms.' '.$nom.'<br>
  659.             <strong>Fonction :</strong> '.$fonction.'<br>
  660.             <strong>Entreprise :</strong> '.$entreprise.'<br>
  661.             <strong>Adresse :</strong> '.$adresse.'<br>
  662.             </p>
  663.             <h4 style="margin-bottom:8px; color:#0d6efd;">Coordonnées</h4>
  664.             <p>
  665.             <strong>Email :</strong> '.$mail.'<br>
  666.             <strong>Téléphone :</strong> '.$telephone.'<br>
  667.             <strong>Site web :</strong> '.$siteweb.'
  668.             </p>
  669.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détails de participation</h4>
  670.             <p>
  671.             <strong>Nombre de participants :</strong> '.$nombrepart.'<br>
  672.             <strong>Commentaire :</strong> '.$commentaire.'
  673.             </p>
  674.             <h4 style="margin-bottom:8px; color:#0d6efd;">Détail de la formation</h4>
  675.             <p>
  676.             <strong>Thème :</strong> '.$theme.'<br>
  677.             <strong>Lieu :</strong> '.$lieu.'<br>
  678.             <strong>Date :</strong> '.$duree.'
  679.             </p>
  680.             </td>
  681.             </tr>
  682.             <tr>
  683.             <td style="background-color:#f1f1f1; padding:15px; text-align:center; font-size:12px; color:#777777;">
  684.             © '.date("Y").' CIMEF International — Tous droits réservés
  685.             </td>
  686.             </tr>
  687.             </table>
  688.             </td>
  689.             </tr>
  690.             </table>
  691.             </body></html>';
  692.             
  693.             $email = (new Email())
  694.             ->from('CIMEF International <inscription@cimef-international.com>')
  695.             ->to($destinataire)                 // destinataire principal
  696.             ->cc('medias@cimef-international.com'// COPIE
  697.             ->replyTo($expediteur)              // Reply-To:
  698.             ->subject($suj)     
  699.             ->text(strip_tags($codehtml))
  700.             ->html($codehtml);// Subject:
  701.             //->html($codehtml, 'text/html');   // Content-Type + charset utf-8
  702.             $mailer->send($email);
  703.             $demandeformation->setNom($nom);
  704.             $demandeformation->setPrenoms($prenoms);
  705.             $demandeformation->setFonction($fonction);
  706.             $demandeformation->setAdresse($adresse);
  707.             $demandeformation->setMail($mail);
  708.             $demandeformation->setEntreprise($entreprise);
  709.             $demandeformation->setSiteweb($siteweb);
  710.             $demandeformation->setNombrepart($nombrepart);
  711.             $demandeformation->setLieu($lieu);
  712.             $demandeformation->setTheme($theme);
  713.             $demandeformation->setDuree($duree);
  714.             $demandeformation->setTelephone($telephone);
  715.             $demandeformation->setCommentaire($commentaire);
  716.             $entityManager->persist($demandeformation);
  717.             $entityManager->flush();
  718.             $this->addFlash(
  719.             'success',
  720.             'Votre inscription à été bien enregistrée');
  721.             return $this->redirectToRoute('front.inter.index');
  722.         }
  723.         
  724.         return $this->render('front/inscriptions/formation-sur-mesure.html.twig',[
  725.             'annee' => $annee,
  726.             'mentions' => $mentions,
  727.             'demandeformationsForm' => $demandeformationsForm->createView(),
  728.         ]);
  729.     }
  730.     
  731.     
  732.     #[Route('/formations/seminaires-internationaux/{slug}/{id}code'name'front.seminaire.inter.detail'methods:['GET'])]
  733.     public function detail_sem_int(
  734.         $slug,
  735.         $id,
  736.         Request $request
  737.         MentionsRepository $mentionRepository,
  738.         EntityManagerInterface $entityManager
  739.     ): Response
  740.     {
  741.         $type "Séminaires internationaux";
  742.         $annee date('Y');
  743.         $queryBuilder $entityManager->createQueryBuilder();
  744.         $queryBuilder
  745.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  746.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  747.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  748.         )
  749.         ->from(Formations::class, 'for')
  750.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  751.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  752.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  753.         ->where('th.slug = :theme')
  754.         ->andwhere('for.id = :forid')
  755.         ->setParameter('theme'$slug)
  756.         ->setParameter('forid'$id);
  757.         $query $queryBuilder->getQuery()->getResult();
  758.         $mentions $mentionRepository->findAll();
  759.         
  760.         $locations = [];
  761.         foreach ($query as $row) {
  762.             if (!empty($row['latitude']) && !empty($row['longitude'])) {
  763.                 $locations[] = [
  764.                     'lat'   => (float) $row['latitude'],
  765.                     'lng'   => (float) $row['longitude'],
  766.                     'ville' => strtoupper($row['vilnom']),
  767.                     'pays'  => strtoupper($row['pays']),
  768.                 ];
  769.             }
  770.         }
  771.         
  772.         /*
  773.         $locations = [
  774.             [
  775.                 'lat' => 5.399573993486265, 
  776.                 'lng' => -3.9608326481739446, 
  777.                 'ville' => 'ABIDJAN',
  778.                 'Pays' => 'CÔTE D\'IVOIRE',
  779.             ],
  780.             [
  781.                 'lat' => 48.82503553852063, 
  782.                 'lng' => 2.3943687952459913, 
  783.                 'ville' => 'PARIS',
  784.                 'pays' => 'FRANCE',
  785.             ],
  786.             [
  787.                 'lat' => 33.61983014582587, 
  788.                 'lng' => -7.591902517162099, 
  789.                 'ville' => 'CASABLANCA',
  790.                 'pays' => 'MAROC',
  791.             ],
  792.             [
  793.                 'lat' => 14.671959307245515, 
  794.                 'lng' => -17.428349942742518, 
  795.                 'ville' => 'DAKAR',
  796.                 'pays' => 'SENEGAL',
  797.             ],
  798.             [
  799.                 'lat' => 25.222641788192867, 
  800.                 'lng' =>  55.4419721341237, 
  801.                 'ville' => 'DUBAI',
  802.                 'pays' => 'EMIRATS ARABES UNIS',
  803.             ],
  804.             [
  805.                 'lat' => 41.008441347309684, 
  806.                 'lng' => 28.969801288596543, 
  807.                 'ville' => 'ISTANBUL',
  808.                 'pays' => 'TURQUIE',
  809.             ],
  810.         ];*/
  811.         return $this->render('front/detail/detail-seminaire-inter.html.twig',[
  812.             'locations' => $locations,
  813.             'annee' => $annee,
  814.             'type' => $type,
  815.             'mentions' => $mentions,
  816.             'query' => $query
  817.         ]);
  818.     }
  819.     
  820.     #[Route('/formations/seminaires-nationaux/{slug}/{id}code'name'front.seminaire.nation.detail'methods:['GET'])]
  821.     public function detail_sem_nat(
  822.         $slug,
  823.         $id,
  824.         Request $request
  825.         MentionsRepository $mentionRepository,
  826.         EntityManagerInterface $entityManager
  827.     ): Response
  828.     {
  829.         $type "Séminaires nationaux";
  830.         $annee date('Y');
  831.         $queryBuilder $entityManager->createQueryBuilder();
  832.         $queryBuilder
  833.         ->select('for.id''for.dates_session''for.prix''for.devise''th.nom'
  834.             'thm.nom AS thmnom','vil.nom AS vilnom','vil.pays','for.created_at',
  835.             'th.slug','th.description','for.devise','vil.longitude','vil.latitude'
  836.         )
  837.         ->from(Formations::class, 'for')
  838.         ->innerJoin(Themes::class, 'th''WITH''for.theme = th.id')
  839.         ->innerJoin(Villes::class,  'vil''WITH''for.ville = vil.id')
  840.         ->innerJoin(Thematiques::class, 'thm''WITH''th.thematique= thm.id')
  841.         ->where('th.slug = :theme')
  842.         ->andwhere('for.id = :forid')
  843.         ->setParameter('theme'$slug)
  844.         ->setParameter('forid'$id);
  845.         $query $queryBuilder->getQuery()->getResult();
  846.         $mentions $mentionRepository->findAll();
  847.         
  848.         $locations = [];
  849.         foreach ($query as $row) {
  850.             if (!empty($row['latitude']) && !empty($row['longitude'])) {
  851.                 $locations[] = [
  852.                     'lat'   => (float) $row['latitude'],
  853.                     'lng'   => (float) $row['longitude'],
  854.                     'ville' => strtoupper($row['vilnom']),
  855.                     'pays'  => strtoupper($row['pays']),
  856.                 ];
  857.             }
  858.         }
  859.         
  860.         return $this->render('front/detail/detail-seminaire-inter.html.twig',[
  861.             'locations' => $locations,
  862.             'annee' => $annee,
  863.             'type' => $type,
  864.             'mentions' => $mentions,
  865.             'query' => $query
  866.         ]);
  867.     }
  868.     
  869.     
  870.     #[Route('/actualites'name'front.actualite'methods:['GET'])]
  871.     public function actualite(
  872.         Request $request
  873.         MentionsRepository $mentionRepository,
  874.         ManagementsRepository $managementRepository,
  875.         PaginatorInterface $paginator,
  876.         ActualitesRepository $actualiteRepository
  877.         EntityManagerInterface $entityManager
  878.         ): Response
  879.     {
  880.         $All_actu $actualiteRepository->findBy(['statut' => 'Publié'], ['createdat' => 'DESC']);
  881.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  882.         $queryBuilder $entityManager->createQueryBuilder();
  883.         $queryBuilder
  884.         ->select('actu')
  885.         ->from(Actualites::class, 'actu')
  886.         ->where('actu.statut = :statut')
  887.         ->setParameter('statut''Publié')
  888.         ->orderBy('actu.createdat''DESC');
  889.         
  890.         $pagination $paginator->paginate(
  891.             $queryBuilder,
  892.             $request->query->getInt('page'1),
  893.             12
  894.         ); 
  895.         // dd($pagination);
  896.         
  897.         $last_actu $actualiteRepository->findBy(['statut' => 'Publié'], ['createdat' => 'DESC'],limit4);
  898.         $mentions $mentionRepository->findAll();
  899.         return $this->render('front/actualite.html.twig',[
  900.             'mentions' => $mentions,
  901.             'last_actu' => $last_actu,
  902.             'pagination' => $pagination,
  903.             'manageLimit' => $manageLimit
  904.         ]);
  905.     }
  906.     
  907.     #[Route('/actualite/{slug}'name'front.detail.actu'methods:['GET','POST'])]
  908.     public function detailactu(
  909.         $slug,
  910.         Request $request
  911.         ActualitesRepository $actuRepository,
  912.         MentionsRepository $mentionRepository,
  913.         ManagementsRepository $managementRepository,
  914.         EntityManagerInterface $entityManager
  915.     ): Response
  916.     {
  917.         $Allactu $actuRepository->findAll();
  918.         $detactu $actuRepository->findOneBy(array('slug' => $slug));
  919.         $last_actu $actuRepository->findBy([], ['createdat' => 'ASC']);
  920.         $manageLimit $managementRepository->findBy([], ['id' => 'DESC'], );
  921.         $mentions $mentionRepository->findAll();
  922.         return $this->render('front/detail/detail-actualite.html.twig',[
  923.             'detactu' => $detactu,
  924.             'actualite' => $Allactu,
  925.             'mentions' => $mentions,
  926.             'last_actu' => $last_actu,
  927.             'manageLimit' => $manageLimit
  928.         ]);
  929.     }
  930.     
  931.     #[Route('/mentions/{slug}'name'front.mention.detail'methods:['GET','POST'])]
  932.     public function detailmention(
  933.         $slug,
  934.         Request $request
  935.         MentionsRepository $mentionRepository,
  936.         EntityManagerInterface $entityManager
  937.     ): Response
  938.     {
  939.         $detmention $mentionRepository->findOneBy(array('slug' => $slug));
  940.         $mentions $mentionRepository->findAll();
  941.         return $this->render('front/detail/detail-mention.html.twig',[
  942.             'detmention' => $detmention,
  943.             'mentions' => $mentions,
  944.         ]);
  945.     }
  946.     
  947.     
  948.     #[Route('/presentation/nos-centres'name'front.centres'methods:['GET'])]
  949.     public function centres(
  950.         Request $request
  951.         VillesRepository $villeRepository,
  952.         MentionsRepository $mentionRepository,
  953.         EntityManagerInterface $entityManager
  954.         ): Response
  955.     {
  956.         $Ville $villeRepository->findAll();
  957.         $locations = [
  958.             [
  959.                 'lat' => 5.399573993486265
  960.                 'lng' => -3.9608326481739446
  961.                 'ville' => 'ABIDJAN',
  962.                 'Pays' => 'CÔTE D\'IVOIRE',
  963.             ],
  964.             [
  965.                 'lat' => 48.82503553852063
  966.                 'lng' => 2.3943687952459913
  967.                 'ville' => 'PARIS',
  968.                 'pays' => 'FRANCE',
  969.             ],
  970.             [
  971.                 'lat' => 33.61983014582587
  972.                 'lng' => -7.591902517162099
  973.                 'ville' => 'CASABLANCA',
  974.                 'pays' => 'MAROC',
  975.             ],
  976.             [
  977.                 'lat' => 14.671959307245515
  978.                 'lng' => -17.428349942742518
  979.                 'ville' => 'DAKAR',
  980.                 'pays' => 'SENEGAL',
  981.             ],
  982.             [
  983.                 'lat' => 25.222641788192867
  984.                 'lng' =>  55.4419721341237
  985.                 'ville' => 'DUBAI',
  986.                 'pays' => 'EMIRATS ARABES UNIS',
  987.             ],
  988.             [
  989.                 'lat' => 41.008441347309684
  990.                 'lng' => 28.969801288596543
  991.                 'ville' => 'ISTANBUL',
  992.                 'pays' => 'TURQUIE',
  993.             ],
  994.         ];
  995.         $mentions $mentionRepository->findAll();
  996.         return $this->render('front/centres.html.twig',[
  997.             'locations' => $locations,
  998.             'mentions' => $mentions,
  999.             'ville' => $Ville    
  1000.         ]);
  1001.     }
  1002.     
  1003.     #[Route('/presentation/nos-partenaires'name'front.nos-partenaires'methods:['GET'])]
  1004.     public function partenaires(
  1005.         Request $request
  1006.         PartenairesRepository $partenaireRepository,
  1007.         MentionsRepository $mentionRepository,
  1008.         EntityManagerInterface $entityManager
  1009.         ): Response
  1010.     {
  1011.         $partenaires $partenaireRepository->findAll();
  1012.         $groupes = [];
  1013.         foreach ($partenaires as $p) {
  1014.             $groupes[$p->getPaysPart()][] = $p;
  1015.         }
  1016.         $mentions $mentionRepository->findAll();
  1017.         return $this->render('front/partenaire.html.twig',[
  1018.             'mentions' => $mentions,
  1019.             'groupes' => $groupes   
  1020.         ]);
  1021.     }
  1022.     
  1023.     #[Route('/presentation/nos-centres/{slug}'name'front.detail.centre'methods:['GET'])]
  1024.     public function detail_centre(
  1025.         $slug,
  1026.         Request $request,
  1027.         GaleriesRepository $galRepository,
  1028.         VillesRepository $villeRepository,
  1029.         MentionsRepository $mentionRepository,
  1030.         EntityManagerInterface $entityManager
  1031.         ): Response
  1032.     {
  1033.         $queryBuilder $entityManager->createQueryBuilder();
  1034.         $queryBuilder
  1035.         ->select('gal.img_gal''gal.nom')
  1036.         ->from(Galeries::class, 'gal')
  1037.         ->where('gal.nom = :nom')
  1038.         ->setParameter('nom'$slug);
  1039.         $detgal $queryBuilder->getQuery()->getResult();
  1040.         
  1041.         //$detgal = $galRepository->findOneBy(array('nom' => $slug));
  1042.         //$detgal = $galRepository->findAll();
  1043.         $detcentres $villeRepository->findOneBy(array('slug' => $slug));
  1044.         $mentions $mentionRepository->findAll();
  1045.         return $this->render('front/detail/detail-centre.html.twig',[
  1046.             'slug' => $slug,
  1047.             'detcentre' => $detcentres,
  1048.             'mentions' => $mentions,
  1049.             'detgal' => $detgal
  1050.         ]);
  1051.     }
  1052.     
  1053.     
  1054.     #[Route('/financement-des-etudes'name'front.financement.etude'methods:['GET'])]
  1055.     public function financement(): Response
  1056.     {
  1057.         return $this->render('front/admissions/financement.html.twig');
  1058.     }
  1059.     #[Route('/inscription-{annee}'name'front.inscriptions'methods:['GET','POST'])]
  1060.     public function inscription(
  1061.         Request $request
  1062.         $annee,
  1063.         MentionsRepository $mentionRepository
  1064.         ): Response
  1065.     {
  1066.         $annee date('Y');
  1067.         $demandeformation = new Demandeformations();
  1068.         $NewInscriptionFormType $this->createForm(NewInscriptionFormType::class);
  1069.         $NewInscriptionFormType->handleRequest($request);
  1070.         $mentions $mentionRepository->findAll();
  1071.         return $this->render('front/inscriptions/inscription-index.html.twig',[
  1072.             'annee' => $annee,
  1073.             'mentions' => $mentions,
  1074.             'demandeformationsForm' => $NewInscriptionFormType->createView(),
  1075.         ]);
  1076.     }
  1077.     #[Route('/contact'name'front.contact'methods:['GET'])]
  1078.     public function contact(): Response
  1079.     {
  1080.         return $this->render('front/contact.html.twig');
  1081.     }
  1082. }