src/Controller/HomeController.php line 1495

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\CategorieElearning;
  4. use App\Entity\Commande;
  5. use App\Entity\Formation;
  6. use App\Entity\Offresinscrit;
  7. use App\Entity\Utilisation;
  8. use App\Form\OffresinscritType;
  9. use App\Repository\CategorieElearningRepository;
  10. use App\Repository\CertifElearningRepository;
  11. use App\Repository\CommandeFormationRepository;
  12. use App\Repository\CommandeRepository;
  13. use App\Repository\ConditionGeneralRepository;
  14. use App\Repository\CouponRepository;
  15. use App\Repository\EmailsadminRepository;
  16. use App\Repository\FormationElearningRepository;
  17. use App\Repository\LotCouponRepository;
  18. use App\Repository\OffresinscritRepository;
  19. use App\Repository\PackRepository;
  20. use App\Repository\SectionElearningRepository;
  21. use App\Repository\SectionRepository;
  22. use App\Repository\TemoignageElearningRepository;
  23. use App\Repository\UtilisationRepository;
  24. use App\Repository\VoucherRepository;
  25. use DateTime;
  26. use Knp\Component\Pager\PaginatorInterface;
  27. use App\Entity\Contact;
  28. use App\Entity\InscritSession;
  29. use App\Entity\Newsletter;
  30. use App\Entity\User;
  31. use App\Form\ContactType;
  32. use App\Form\InscritSessionType;
  33. use App\Form\NewsletterType;
  34. use App\Repository\ActualiteRepository;
  35. use App\Repository\BanniereRepository;
  36. use App\Repository\ContactRepository;
  37. use App\Repository\EvenementRepository;
  38. use App\Repository\FormationRepository;
  39. use App\Repository\GalleryRepository;
  40. use App\Repository\InscritSessionRepository;
  41. use App\Repository\NewsletterRepository;
  42. use App\Repository\OffresRepository;
  43. use App\Repository\PartnersRepository;
  44. use App\Repository\ServiceRepository;
  45. use App\Repository\SettingRepository;
  46. use App\Repository\SponsorsRepository;
  47. use App\Repository\StatistiqueRepository;
  48. use App\Repository\TeamRepository;
  49. use App\Repository\TemoignageRepository;
  50. use App\Repository\UserRepository;
  51. use App\Repository\VideoRepository;
  52. use Doctrine\ORM\EntityManagerInterface;
  53. use PhpOffice\PhpWord\TemplateProcessor;
  54. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  55. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  56. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  57. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  58. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  59. use Symfony\Component\HttpFoundation\JsonResponse;
  60. use Symfony\Component\HttpFoundation\Request;
  61. use Symfony\Component\HttpFoundation\Response;
  62. use Symfony\Component\Mailer\MailerInterface;
  63. use Symfony\Component\Mime\Address;
  64. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  65. use Symfony\Component\Routing\Annotation\Route;
  66. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  67. use DateTimeZone;
  68. class HomeController extends AbstractController
  69. {
  70.     private $fromAddress;
  71.     public function __construct(
  72.         ParameterBagInterface $parameterBag  // Injection du service ParameterBagInterface
  73.     ) {
  74.         $this->fromAddress $parameterBag->get('mailer_from_address');
  75.     }
  76.     #[Route('/facture/generer/{id}'name'facture_generer')]
  77.     public function genererFacture(
  78.         Commande $commande,
  79.         CommandeFormationRepository $commandeFormationRepository
  80.     ): Response {
  81.         $templatePath $this->getParameter('kernel.project_dir') . '/public/facture_template.docx';
  82.         $templateProcessor = new TemplateProcessor($templatePath);
  83.         // Remplacement dynamique simple
  84.         $templateProcessor->setValue('client_nom'$commande->getUser()->getNom().' '.$commande->getUser()->getPrenom());
  85.         // Récupération des commandes formations associées à cette commande
  86.         $commandeFormations $commandeFormationRepository->findBy(['commande' => $commande]);
  87.         // Préparer les données à injecter dans le tableau
  88.         $formationsData = [];
  89.         foreach ($commandeFormations as $commandeFormation) {
  90.             $formationsData[] = [
  91.                 'quantity' => '01'// ou $commandeFormation->getQuantite() si existant
  92.                 'description' => $commandeFormation->getFormation()->getTitre(),
  93.                 'prix_unitaire' => $commandeFormation->getFormation()->getPrix() ,
  94.                 'total' => $commandeFormation->getFormation()->getPrix() , // ajustez selon quantité si nécessaire
  95.             ];
  96.         }
  97.         // Clonage dynamique des lignes du tableau
  98.         $templateProcessor->cloneRowAndSetValues('description'$formationsData);
  99.         // Calcul du sous-total, TVA et total
  100.         $sousTotal array_sum(array_column($formationsData'prix_unitaire'));
  101.         $tva $sousTotal 0.19;
  102.         $total $sousTotal $tva;
  103.         // Remplacement dynamique des totaux
  104.         $templateProcessor->setValue('sous_total'$sousTotal );
  105.         $templateProcessor->setValue('tva'$tva );
  106.         $templateProcessor->setValue('total_general'$total );
  107.         $outputPath tempnam(sys_get_temp_dir(), 'facture_') . '.docx';
  108.         $templateProcessor->saveAs($outputPath);
  109.         return new Response(file_get_contents($outputPath), 200, [
  110.             'Content-Type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  111.             'Content-Disposition' => 'attachment; filename="facture.docx"',
  112.         ]);
  113.     }
  114.     #[Route('/formationElearningDetails/{slug}'name'app_formation_detailsfrontElearning'methods: ['GET'])]
  115.     public function showformationFrontElearning(CertifElearningRepository $certifElearningRepository,TemoignageElearningRepository $temoignageElearningRepository,SectionElearningRepository $sectionElearningRepository,CategorieElearningRepository $categorieElearningRepository,FormationElearningRepository $formationElearningRepository,EvenementRepository $evenementRepository,ActualiteRepository $actualiteRepository,SectionRepository $sectionRepository,UserRepository $userRepository,$slug,TemoignageRepository $temoignageRepository,VideoRepository $videoRepository,EntityManagerInterface $entityManager,PartnersRepository $partnersRepository,GalleryRepository $galleryRepository,TeamRepository $teamRepository,StatistiqueRepository $statistiqueRepository,FormationRepository $formationRepository,ServiceRepository $serviceRepository,SettingRepository $settingRepository,SponsorsRepository $sponsorsRepository): Response
  116.     {
  117.         $actualites=$actualiteRepository->last3();
  118.         $type="Ordinaire";
  119.         $evenements=$evenementRepository->prochainsEvent();
  120.         $ancienevents=$evenementRepository->ancienEvent();
  121.         $formation=$formationElearningRepository->findOneBy(['slug'=>$slug]);
  122.         $reqvid="SELECT *  FROM `video` LIMIT 3;";
  123.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  124.         $sections=$sectionElearningRepository->findBy(['formation'=>$formation]);
  125.         $temoignages=$temoignageElearningRepository->findBy(['formation'=>$formation]);
  126.         $certifs=$certifElearningRepository->findBy(['formation'=>$formation]);
  127.         return $this->render('formation_elearning/detailsFront.html.twig', [
  128.             'formation' => $formation,
  129.             'video'=>$resPharma,
  130.             'temoi'=>$temoignageRepository->findAll(),
  131.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  132.             'spon'=>$sponsorsRepository->findAll(),
  133.             'service'=>$serviceRepository->findAll(),
  134.             'for'=>$formationRepository->findAll(),
  135.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  136.             'teams'=>$teamRepository->findAll(),
  137.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  138.             'par'=>$partnersRepository->findAll(),
  139.             'sections'=>$sections,
  140.             'actualites'=>$actualites,
  141.             'evenements'=>$evenements,
  142.             'ancienevents'=>$ancienevents,
  143.             'categories'=>$categorieElearningRepository->findAll(),
  144.             'temoignages'=>$temoignages,
  145.             'certifs'=>$certifs
  146.         ]);
  147.     }
  148.     #[Route('/packElearning'name'app_pack_elearning_front'methods: ['GET'],  defaults: ['slug' => null])]
  149.     public function packsElearning(SessionInterface $session,
  150.                                        CategorieElearningRepository $categorieElearningRepository,
  151.                                        SettingRepository $settingRepository,
  152.                                        FormationElearningRepository $formationElearningRepository,
  153.                                    PackRepository $packRepository
  154.     ): Response {
  155.         // Récupérer toutes les catégories pour le menu
  156.         // Récupérer toutes les catégories pour le menu
  157.         $categories $categorieElearningRepository->findAll();
  158.         // Récupérer les formations en fonction de la catégorie sélectionnée
  159.         // 2. Récupérer les infos du panier
  160.         $panier $session->get('panier', []);
  161.         // Récupérer uniquement les clés (IDs) en panier
  162.         $idsInCart array_keys($panier);
  163.         $packs=$packRepository->findAll();
  164.         return $this->render('pack/packFront.html.twig', [
  165.             'packs' => $packs,
  166.             'setting' => $settingRepository->find(1),
  167.             'categories' => $categories,
  168.             'idsInCart' => $idsInCart
  169.         ]);
  170.     }
  171.     #[Route('/formationElearning/{slug}'name'app_formation_elearning_front'methods: ['GET'],  defaults: ['slug' => null])]
  172.     public function formationElearning(SessionInterface $session,
  173.                                        CategorieElearningRepository $categorieElearningRepository,
  174.         SettingRepository $settingRepository,
  175.         FormationElearningRepository $formationElearningRepository,
  176.         ?string $slug
  177.     ): Response {
  178.         // Récupérer toutes les catégories pour le menu
  179.         $categories $categorieElearningRepository->findAll();
  180.         // Récupérer les formations en fonction de la catégorie sélectionnée
  181.         if ($slug) {
  182.             $categorie=$categorieElearningRepository->findOneBy(['slug'=>$slug]);
  183.             $formations $formationElearningRepository->findBy(['categorie' => $categorie]);
  184.         } else {
  185.             $formations $formationElearningRepository->findAll();
  186.         }
  187.         // 2. Récupérer les infos du panier
  188.         $panier $session->get('panier', []);
  189.         // Récupérer uniquement les clés (IDs) en panier
  190.         $idsInCart array_keys($panier);
  191.         return $this->render('formation_elearning/formationFront.html.twig', [
  192.             'formation_elearnings' => $formations,
  193.             'setting' => $settingRepository->find(1),
  194.             'categories' => $categories,
  195.             'slug'=>$slug,
  196.             'idsInCart' => $idsInCart
  197.         ]);
  198.     }
  199.     #[Route('/sinature'name'app_sign'methods: ['GET'])]
  200.     public function signature(CategorieElearningRepository $categorieElearningRepository,SettingRepository $settingRepository,ActualiteRepository $actualiteRepository): Response
  201.     {
  202.         return $this->render('admin/signature.html.twig', [
  203.             'actualites' =>  $actualiteRepository->findAll(),
  204.             'setting'=>$settingRepository->find(1),'categories'=>$categorieElearningRepository->findAll(),
  205.         ]);
  206.     }
  207.     #[Route('/rechercheFormations'name'app_formations_recherche')]
  208. public function rechercheFormations(CategorieElearningRepository $categorieElearningRepository,PaginatorInterface $paginator,OffresRepository $offresRepository,Request $request,FormationRepository $formationRepository,UserRepository $userRepository,ServiceRepository $serviceRepository,EntityManagerInterface $entityManager,VideoRepository $videoRepository,TemoignageRepository $temoignageRepository,GalleryRepository $galleryRepository,PartnersRepository $partnersRepository,SponsorsRepository $sponsorsRepository,SettingRepository $settingRepository,StatistiqueRepository $statistiqueRepository,BanniereRepository $banniereRepository,TeamRepository $teamRepository): Response
  209. {
  210.     $titre $request->request->get('titre');
  211.     $cat $request->request->get('categorie');
  212.     $niveau $request->request->get('niveau');
  213.     $formateur $userRepository->findByRoleCoach();
  214.     $reqvid "SELECT *  FROM `video` LIMIT 4;";
  215.     $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  216.     $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  217.     $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  218.     $pagination=$paginator->paginate(
  219.         $foramtion $formationRepository->findBy(['categorie'=>$cat]),
  220.         $request->query->get('page',),
  221.         6
  222.     );
  223.     if ($cat == "BootCamp") {
  224.         return $this->render('formation/formationsBootcamp.html.twig', [
  225.             'controller_name' => 'HomeController',
  226.             'service' => $serviceRepository->findAll(),
  227.             'video' => $resPharma'formateurs' => $formateur,
  228.             'ban' => $banniereRepository->findAll(),
  229.             'formations' => $formationRepository->findByRecherche($titre$cat$niveau),
  230.             'teams' => $teamRepository->findAll(),
  231.             'temoi' => $temoignageRepository->findAll(),
  232.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  233.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  234.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  235.             'spon' => $sponsorsRepository->findAll(),
  236.             'par' => $partnersRepository->findAll(),
  237.             'for'=>$formationRepository->last3(),
  238.             'formateur' => $userRepository->findByRoleCoach(),
  239.             'off'=>$offresRepository->findAll(),
  240.             'formation'=>$pagination,
  241.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  242.         ]);
  243.     }
  244.     elseif ($cat == "Certifiante") {
  245.         return $this->render('formation/formationsCertif.html.twig', [
  246.             'controller_name' => 'HomeController',
  247.             'service' => $serviceRepository->findAll(),
  248.             'video' => $resPharma'formateurs' => $formateur,
  249.             'ban' => $banniereRepository->findAll(),
  250.             'formations' => $formationRepository->findByRecherche($titre$cat$niveau),
  251.             'teams' => $teamRepository->findAll(),
  252.             'temoi' => $temoignageRepository->findAll(),
  253.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  254.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  255.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  256.             'spon' => $sponsorsRepository->findAll(),
  257.             'par' => $partnersRepository->findAll(),
  258.             'for'=>$formationRepository->last3(),
  259.             'formateur' => $userRepository->findByRoleCoach(),
  260.             'formation'=>$pagination,
  261.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  262.         ]);
  263.     }
  264.     elseif ($cat == "Cursus") {
  265.         return $this->render('formation/formationsCursus.html.twig', [
  266.             'controller_name' => 'HomeController',
  267.             'service' => $serviceRepository->findAll(),
  268.             'video' => $resPharma'formateurs' => $formateur,
  269.             'ban' => $banniereRepository->findAll(),
  270.             'formations' => $formationRepository->findByRecherche($titre$cat$niveau),
  271.             'teams' => $teamRepository->findAll(),
  272.             'temoi' => $temoignageRepository->findAll(),
  273.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  274.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  275.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  276.             'spon' => $sponsorsRepository->findAll(),
  277.             'par' => $partnersRepository->findAll(),
  278.             'for'=>$formationRepository->last3(),
  279.             'formateur' => $userRepository->findByRoleCoach(),
  280.             'formation'=>$pagination,
  281.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  282.         ]);
  283.     }
  284.     elseif ($cat == "Pratique") {
  285.         return $this->render('formation/formationsPratique.html.twig', [
  286.             'controller_name' => 'HomeController',
  287.             'service' => $serviceRepository->findAll(),
  288.             'video' => $resPharma'formateurs' => $formateur,
  289.             'ban' => $banniereRepository->findAll(),
  290.             'formations' => $formationRepository->findByRecherche($titre$cat$niveau),
  291.             'teams' => $teamRepository->findAll(),
  292.             'temoi' => $temoignageRepository->findAll(),
  293.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  294.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  295.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  296.             'spon' => $sponsorsRepository->findAll(),
  297.             'par' => $partnersRepository->findAll(),
  298.             'for'=>$formationRepository->last3(),
  299.             'formateur' => $userRepository->findByRoleCoach(),
  300.             'formation'=>$pagination,
  301.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  302.         ]);
  303.     }
  304.     else {
  305.         $pagination=$paginator->paginate(
  306.             $foramtion =$formationRepository->findByRecherche($titre$cat$niveau),
  307.             $request->query->get('page',),
  308.             6
  309.         );
  310.         return $this->render('formation/formations.html.twig', [
  311.             'controller_name' => 'HomeController',
  312.             'service' => $serviceRepository->findAll(),
  313.             'video' => $resPharma'formateurs' => $formateur,
  314.             'ban' => $banniereRepository->findAll(),
  315.             'formations' => $formationRepository->findByRecherche($titre$cat$niveau),
  316.             'teams' => $teamRepository->findAll(),
  317.             'temoi' => $temoignageRepository->findAll(),
  318.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  319.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  320.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  321.             'spon' => $sponsorsRepository->findAll(),
  322.             'par' => $partnersRepository->findAll(),
  323.             'for'=>$formationRepository->last3(),
  324.             'formateur' => $userRepository->findByRoleCoach(),
  325.             'formation'=>$pagination,
  326.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  327.         ]);
  328.     }
  329. }
  330.     #[Route('/formationsCursus'name'app_formations_cursus')]
  331.     public function indexFormationsCursus(CategorieElearningRepository $categorieElearningRepository,Request $request,PaginatorInterface $paginator,OffresRepository $offresRepository,FormationRepository $formationRepository,UserRepository $userRepository,ServiceRepository $serviceRepository,EntityManagerInterface $entityManager,VideoRepository $videoRepository,TemoignageRepository $temoignageRepository,GalleryRepository $galleryRepository,PartnersRepository $partnersRepository,SponsorsRepository $sponsorsRepository,SettingRepository $settingRepository,StatistiqueRepository $statistiqueRepository,BanniereRepository $banniereRepository,TeamRepository $teamRepository): Response
  332.     {
  333.         $formateur=$userRepository->findByRoleCoach();
  334.         $reqvid="SELECT *  FROM `video` LIMIT 4;";
  335.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  336.         $reqfor="SELECT *  FROM `formation` LIMIT 3;";
  337.         $resfor=$entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  338.         $categorie="Cursus";
  339.         $pagination=$paginator->paginate(
  340.             $foramtion $formationRepository->findBy(['categorie'=>$categorie]),
  341.             $request->query->get('page',),
  342.             6
  343.         );
  344.         return $this->render('formation/formationsCursus.html.twig', [
  345.             'controller_name' => 'HomeController',
  346.             'service'=>$serviceRepository->findAll(),
  347.             'video'=>$resPharma,'formateurs'=>$formateur,
  348.             'ban'=>$banniereRepository->findAll(),
  349.             'formations'=>$formationRepository->findBy(['categorie'=>$categorie]),
  350.             'teams'=>$teamRepository->findAll(),
  351.             'temoi'=>$temoignageRepository->findAll(),
  352.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  353.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  354.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  355.             'spon'=>$sponsorsRepository->findAll(),
  356.             'par'=>$partnersRepository->findAll(),
  357.             'for'=>$formationRepository->last3(),
  358.             'formateur'=>$userRepository->findByRoleCoach(),
  359.             'off'=>$offresRepository->findAll(),
  360.             'formation'=>$pagination,
  361.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  362.         ]);
  363.     }
  364.     #[Route('/formationsBootcamp'name'app_formations_bootcamp')]
  365.     public function indexFormationsBootcamp(CategorieElearningRepository $categorieElearningRepository,Request $request,PaginatorInterface $paginator,OffresRepository $offresRepository,FormationRepository $formationRepository,UserRepository $userRepository,ServiceRepository $serviceRepository,EntityManagerInterface $entityManager,VideoRepository $videoRepository,TemoignageRepository $temoignageRepository,GalleryRepository $galleryRepository,PartnersRepository $partnersRepository,SponsorsRepository $sponsorsRepository,SettingRepository $settingRepository,StatistiqueRepository $statistiqueRepository,BanniereRepository $banniereRepository,TeamRepository $teamRepository): Response
  366.     {
  367.         $formateur=$userRepository->findByRoleCoach();
  368.         $reqvid="SELECT *  FROM `video` LIMIT 4;";
  369.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  370.         $reqfor="SELECT *  FROM `formation` LIMIT 3;";
  371.         $resfor=$entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  372.         $categorie="BootCamp";
  373.         $pagination=$paginator->paginate(
  374.             $foramtion $formationRepository->findBy(['categorie'=>$categorie]),
  375.             $request->query->get('page',),
  376.             6
  377.         );
  378.         return $this->render('formation/formationsBootcamp.html.twig', [
  379.             'controller_name' => 'HomeController',
  380.             'service'=>$serviceRepository->findAll(),
  381.             'video'=>$resPharma,'formateurs'=>$formateur,
  382.             'ban'=>$banniereRepository->findAll(),
  383.             'formations'=>$formationRepository->findBy(['categorie'=>$categorie]),
  384.             'teams'=>$teamRepository->findAll(),
  385.             'temoi'=>$temoignageRepository->findAll(),
  386.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  387.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  388.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  389.             'spon'=>$sponsorsRepository->findAll(),
  390.             'par'=>$partnersRepository->findAll(),
  391.             'for'=>$formationRepository->last3(),
  392.             'formateur'=>$userRepository->findByRoleCoach(),
  393.             'off'=>$offresRepository->findAll(),
  394.             'formation'=>$pagination,
  395.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  396.         ]);
  397.     }
  398.     #[Route('/formationsPratiques'name'app_formations_pratique')]
  399.     public function indexFormationsPratique(CategorieElearningRepository $categorieElearningRepository,Request $request,PaginatorInterface $paginator,OffresRepository $offresRepository,FormationRepository $formationRepository,UserRepository $userRepository,ServiceRepository $serviceRepository,EntityManagerInterface $entityManager,VideoRepository $videoRepository,TemoignageRepository $temoignageRepository,GalleryRepository $galleryRepository,PartnersRepository $partnersRepository,SponsorsRepository $sponsorsRepository,SettingRepository $settingRepository,StatistiqueRepository $statistiqueRepository,BanniereRepository $banniereRepository,TeamRepository $teamRepository): Response
  400.     {
  401.         $formateur=$userRepository->findByRoleCoach();
  402.         $reqvid="SELECT *  FROM `video` LIMIT 4;";
  403.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  404.         $reqfor="SELECT *  FROM `formation` LIMIT 3;";
  405.         $resfor=$entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  406.         $categorie="Pratique";
  407.         $pagination=$paginator->paginate(
  408.             $foramtion $formationRepository->findBy(['categorie'=>$categorie]),
  409.             $request->query->get('page',),
  410.             6
  411.         );
  412.         return $this->render('formation/formationsPratique.html.twig', [
  413.             'controller_name' => 'HomeController',
  414.             'service'=>$serviceRepository->findAll(),
  415.             'video'=>$resPharma,'formateurs'=>$formateur,
  416.             'ban'=>$banniereRepository->findAll(),
  417.             'formations'=>$formationRepository->findBy(['categorie'=>$categorie]),
  418.             'teams'=>$teamRepository->findAll(),
  419.             'temoi'=>$temoignageRepository->findAll(),
  420.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  421.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  422.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  423.             'spon'=>$sponsorsRepository->findAll(),
  424.             'par'=>$partnersRepository->findAll(),
  425.             'for'=>$formationRepository->last3(),
  426.             'formateur'=>$userRepository->findByRoleCoach(),
  427.             'off'=>$offresRepository->findAll(),
  428.             'formation'=>$pagination,
  429.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  430.         ]);
  431.     }
  432.     #[Route('/formationsCertifiantes'name'app_formations_certifiantes')]
  433.     public function indexFormationsCertifiantes(CategorieElearningRepository $categorieElearningRepository,Request $request,PaginatorInterface $paginator,OffresRepository $offresRepository,FormationRepository $formationRepository,UserRepository $userRepository,ServiceRepository $serviceRepository,EntityManagerInterface $entityManager,VideoRepository $videoRepository,TemoignageRepository $temoignageRepository,GalleryRepository $galleryRepository,PartnersRepository $partnersRepository,SponsorsRepository $sponsorsRepository,SettingRepository $settingRepository,StatistiqueRepository $statistiqueRepository,BanniereRepository $banniereRepository,TeamRepository $teamRepository): Response
  434.     {
  435.         $formateur=$userRepository->findByRoleCoach();
  436.         $reqvid="SELECT *  FROM `video` LIMIT 4;";
  437.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  438.         $reqfor="SELECT *  FROM `formation` LIMIT 3;";
  439.         $resfor=$entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  440.         $categorie="Certifiante";
  441.         $pagination=$paginator->paginate(
  442.             $foramtion $formationRepository->findBy(['categorie'=>$categorie]),
  443.             $request->query->get('page',),
  444.             6
  445.         );
  446.         return $this->render('formation/formationsCertif.html.twig', [
  447.             'controller_name' => 'HomeController',
  448.             'service'=>$serviceRepository->findAll(),
  449.             'video'=>$resPharma,'formateurs'=>$formateur,
  450.             'ban'=>$banniereRepository->findAll(),
  451.             'formations'=>$formationRepository->findBy(['categorie'=>$categorie]),
  452.             'teams'=>$teamRepository->findAll(),
  453.             'temoi'=>$temoignageRepository->findAll(),
  454.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  455.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  456.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  457.             'spon'=>$sponsorsRepository->findAll(),
  458.             'par'=>$partnersRepository->findAll(),
  459.             'for'=>$resfor,
  460.             'formateur'=>$userRepository->findByRoleCoach(),
  461.             'off'=>$offresRepository->findAll(),
  462.             'formation'=>$pagination,
  463.             'paginator' => $pagination,'categories'=>$categorieElearningRepository->findAll(),
  464.         ]);
  465.     }
  466.     #[Route('/showformationFront/{slug}'name'app_formation_detailsfront'methods: ['GET'])]
  467.     public function showformationFront(CategorieElearningRepository $categorieElearningRepository,EvenementRepository $evenementRepository,ActualiteRepository $actualiteRepository,SectionRepository $sectionRepository,Formation $formation,UserRepository $userRepository,$slug,TemoignageRepository $temoignageRepository,VideoRepository $videoRepository,EntityManagerInterface $entityManager,PartnersRepository $partnersRepository,GalleryRepository $galleryRepository,TeamRepository $teamRepository,StatistiqueRepository $statistiqueRepository,FormationRepository $formationRepository,ServiceRepository $serviceRepository,SettingRepository $settingRepository,SponsorsRepository $sponsorsRepository): Response
  468.     {
  469.         $actualites=$actualiteRepository->last3();
  470.         $type="Ordinaire";
  471.         $evenements=$evenementRepository->prochainsEvent();
  472.         $ancienevents=$evenementRepository->ancienEvent();
  473.         $formation=$formationRepository->findOneBy(['slug'=>$slug]);
  474.         $reqvid="SELECT *  FROM `video` LIMIT 3;";
  475.         $resPharma=$entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  476.         $sections=$sectionRepository->findBy(['formation'=>$formation]);
  477.         return $this->render('formation/detailsFront.html.twig', [
  478.             'formation' => $formation,
  479.             'video'=>$resPharma,
  480.             'temoi'=>$temoignageRepository->findAll(),
  481.             'setting'=>$settingRepository->findOneBy(["id"=>1]),
  482.             'spon'=>$sponsorsRepository->findAll(),
  483.             'service'=>$serviceRepository->findAll(),
  484.             'for'=>$formationRepository->findAll(),
  485.             'stat'=>$statistiqueRepository->findOneBy(["id"=>1]),
  486.             'teams'=>$teamRepository->findAll(),
  487.             'gallery'=>$galleryRepository->findOneBy(["id"=>1]),
  488.             'par'=>$partnersRepository->findAll(),
  489.             'sections'=>$sections,
  490.             'actualites'=>$actualites,
  491.             'evenements'=>$evenements,
  492.             'ancienevents'=>$ancienevents,'categories'=>$categorieElearningRepository->findAll(),
  493.         ]);
  494.     }
  495.     #[Route('/allSessions'name'app_home_session')]
  496.     public function indexAllSessions(
  497.         CategorieElearningRepository $categorieElearningRepository,
  498.         EvenementRepository $evenementRepository,
  499.         Request $request,
  500.         PaginatorInterface $paginator,
  501.         FormationRepository $formationRepository,
  502.         OffresRepository $offresRepository,
  503.         UserRepository $userRepository,
  504.         ServiceRepository $serviceRepository,
  505.         EntityManagerInterface $entityManager,
  506.         VideoRepository $videoRepository,
  507.         TemoignageRepository $temoignageRepository,
  508.         GalleryRepository $galleryRepository,
  509.         PartnersRepository $partnersRepository,
  510.         SponsorsRepository $sponsorsRepository,
  511.         SettingRepository $settingRepository,
  512.         StatistiqueRepository $statistiqueRepository,
  513.         BanniereRepository $banniereRepository,
  514.         TeamRepository $teamRepository
  515.     ): Response
  516.     {
  517.         $formateur $userRepository->findByRoleCoach();
  518.         $type "Ordinaire";
  519.         // Récupérer toutes les sessions pour l'affichage (sans pagination)
  520.         $evenements $evenementRepository->prochainsEvent();
  521.         // PAGINATION POUR LES SESSIONS PASSÉES
  522.         $allAnciennevents $evenementRepository->ancienEvent(); // Récupère toutes les sessions passées
  523.         $ancieneventsPaginated $paginator->paginate(
  524.             $allAnciennevents,  // Toutes les sessions passées
  525.             $request->query->getInt('page'1),  // Page courante
  526.             6  // 6 éléments par page
  527.         );
  528.         $sessions $evenementRepository->findBy(['type' => $type'isArchive' => false]);
  529.         // Requête vidéo
  530.         $reqvid "SELECT * FROM `video` LIMIT 4";
  531.         $resPharma $entityManager->getConnection()->prepare($reqvid)->executeQuery()->fetchAllAssociative();
  532.         // Requête formation
  533.         $reqfor "SELECT * FROM `formation` LIMIT 3";
  534.         $resfor $entityManager->getConnection()->prepare($reqfor)->executeQuery()->fetchAllAssociative();
  535.         return $this->render('evenement/sessionsFront.html.twig', [
  536.             'controller_name' => 'HomeController',
  537.             'service' => $serviceRepository->findAll(),
  538.             'video' => $resPharma,
  539.             'formateurs' => $formateur,
  540.             'ban' => $banniereRepository->findAll(),
  541.             'formations' => $formationRepository->findAll(),
  542.             'formation' => $formationRepository->findAll(),
  543.             'teams' => $teamRepository->findAll(),
  544.             'temoi' => $temoignageRepository->findAll(),
  545.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  546.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  547.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  548.             'spon' => $sponsorsRepository->findAll(),
  549.             'par' => $partnersRepository->findAll(),
  550.             'for' => $resfor,
  551.             'off' => $offresRepository->findAll(),
  552.             'formateur' => $userRepository->findByRoleCoach(),
  553.             'sessions' => $sessions,
  554.             'evenements' => $evenements,
  555.             'ancienevents' => $ancieneventsPaginated,  // Version paginée des sessions passées
  556.             'ancienevents_all' => $allAnciennevents,   // Version complète (si besoin)
  557.             'categories' => $categorieElearningRepository->findAll(),
  558.         ]);
  559.     }
  560.     #[Route('/ConditionsGénérales'name'app_home_conditiongeneral')]
  561.     public function conditionGeneral(CategorieElearningRepository $categorieElearningRepository,ConditionGeneralRepository $conditionGeneralRepository,GalleryRepository $galleryRepositoryOffresRepository $offresRepositoryFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  562.     {
  563.         $galleries $galleryRepository->findAll();
  564.         $formateur $userRepository->findByRoleCoach();
  565.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  566.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  567.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  568.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  569.         return $this->render('condition_general/conditionFront.html.twig', [
  570.             'controller_name' => 'HomeController',
  571.             'condition'=>$conditionGeneralRepository->find(1),
  572.             'service' => $serviceRepository->findAll(),
  573.             'video' => $resPharma'formateurs' => $formateur,
  574.             'ban' => $banniereRepository->findAll(),
  575.             'formations' => $formationRepository->findAll(),
  576.             'teams' => $teamRepository->findAll(),
  577.             'temoi' => $temoignageRepository->findAll(),
  578.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  579.             'off' => $offresRepository->findAll(),
  580.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  581.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  582.             'spon' => $sponsorsRepository->findAll(),
  583.             'par' => $partnersRepository->findAll(),
  584.             'for' => $resfor,
  585.             'formateur' => $userRepository->findByRoleCoach(),
  586.             'partenaires' => $userRepository->findByRolePartenaire(),
  587.             'galleries' => $galleries,'categories'=>$categorieElearningRepository->findAll(),
  588.         ]);
  589.     }
  590.     #[Route('/galleries'name'app_galleries_front')]
  591.     public function indexGalleries(CategorieElearningRepository $categorieElearningRepository,GalleryRepository $galleryRepositoryOffresRepository $offresRepositoryFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  592.     {
  593.         $galleries $galleryRepository->findAll();
  594.         $formateur $userRepository->findByRoleCoach();
  595.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  596.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  597.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  598.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  599.         return $this->render('gallery/gallerieFront.html.twig', [
  600.             'controller_name' => 'HomeController',
  601.             'service' => $serviceRepository->findAll(),
  602.             'video' => $resPharma'formateurs' => $formateur,
  603.             'ban' => $banniereRepository->findAll(),
  604.             'formations' => $formationRepository->findAll(),
  605.             'teams' => $teamRepository->findAll(),
  606.             'temoi' => $temoignageRepository->findAll(),
  607.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  608.             'off' => $offresRepository->findAll(),
  609.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  610.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  611.             'spon' => $sponsorsRepository->findAll(),
  612.             'par' => $partnersRepository->findAll(),
  613.             'for' => $resfor,
  614.             'formateur' => $userRepository->findByRoleCoach(),
  615.             'partenaires' => $userRepository->findByRolePartenaire(),
  616.             'galleries' => $galleries,'categories'=>$categorieElearningRepository->findAll(),
  617.         ]);
  618.     }
  619.     #[Route('/detailsActualite/{slug}'name'app_details_actualite'methods: ['GET''POST'])]
  620.     public function detailsActualite(CategorieElearningRepository $categorieElearningRepository,ActualiteRepository $actualiteRepositoryOffresRepository $offresRepositorySessionInterface $sessionRequest $requestInscritSessionRepository $inscritSessionRepository$slugEvenementRepository $evenementRepositoryFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  621.     {
  622.         $actualites $actualiteRepository->last3();
  623.         $type "Ordinaire";
  624.         $evenements $evenementRepository->prochainsEvent();
  625.         $ancienEvent $evenementRepository->ancienEvent();
  626.         $actualite $actualiteRepository->findOneBy(['slug' => $slug]);
  627.         $formateur $userRepository->findByRoleCoach();
  628.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  629.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  630.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  631.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  632.         return $this->renderForm('actualite/detailsFront.html.twig', [
  633.             'controller_name' => 'HomeController',
  634.             'service' => $serviceRepository->findAll(),
  635.             'video' => $resPharma'formateurs' => $formateur,
  636.             'ban' => $banniereRepository->findAll(),
  637.             'formations' => $formationRepository->findAll(),
  638.             'teams' => $teamRepository->findAll(),
  639.             'temoi' => $temoignageRepository->findAll(),
  640.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  641.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  642.             'off' => $offresRepository->findAll(),
  643.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  644.             'spon' => $sponsorsRepository->findAll(),
  645.             'par' => $partnersRepository->findAll(),
  646.             'for' => $resfor,
  647.             'formateur' => $userRepository->findByRoleCoach(),
  648.             'actualite' => $actualite'actualites' => $actualites,
  649.             'evenements' => $evenements,
  650.             'ancienEvent'=>$ancienEvent,'categories'=>$categorieElearningRepository->findAll(),
  651.         ]);
  652.     }
  653.     #[Route('/detailsSession/{slug}'name'app_details_session'methods: ['GET''POST'])]
  654.     public function detailsEvenement(
  655.         CategorieElearningRepository $categorieElearningRepository,
  656.         EmailsadminRepository $emailsadminRepository,
  657.         SectionRepository $sectionRepository,
  658.         ActualiteRepository $actualiteRepository,
  659.         UtilisationRepository $utilisationRepository,
  660.         VoucherRepository $voucherRepository,
  661.         OffresRepository $offresRepository,
  662.         MailerInterface $mailer,
  663.         SessionInterface $session,
  664.         Request $request,
  665.         InscritSessionRepository $inscritSessionRepository,
  666.                                      $slug,
  667.         EvenementRepository $evenementRepository,
  668.         FormationRepository $formationRepository,
  669.         UserRepository $userRepository,
  670.         ServiceRepository $serviceRepository,
  671.         EntityManagerInterface $entityManager,
  672.         TemoignageRepository $temoignageRepository,
  673.         GalleryRepository $galleryRepository,
  674.         PartnersRepository $partnersRepository,
  675.         SponsorsRepository $sponsorsRepository,
  676.         SettingRepository $settingRepository,
  677.         StatistiqueRepository $statistiqueRepository,
  678.         BanniereRepository $banniereRepository,
  679.         TeamRepository $teamRepository,
  680.         LotCouponRepository $lotCouponRepository,
  681.         CouponRepository $couponRepository
  682.     ): Response {
  683.         $actualites $actualiteRepository->last3();
  684.         $type "Ordinaire";
  685.         $evenements $evenementRepository->prochainsEvent();
  686.         $ancienevents $evenementRepository->ancienEvent();
  687.         $date = new \DateTime('now', new DateTimeZone('Africa/Tunis'));
  688.         $evenement $evenementRepository->findOneBy(['slug' => $slug]);
  689.         $formateur $userRepository->findByRoleCoach();
  690.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  691.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  692.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  693.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  694.         $inscritSession = new InscritSession();
  695.         $form $this->createForm(InscritSessionType::class, $inscritSession);
  696.         $form->handleRequest($request);
  697.         if ($form->isSubmitted() && $form->isValid()) {
  698.             $ustest $inscritSessionRepository->findOneBy(["email" => $inscritSession->getEmail(), "session" => $evenement]);
  699.             if (!$ustest) {
  700.                 $inscritSession->setIsActive(true);
  701.                 $inscritSession->setSession($evenement);
  702.                 $inscritSession->setDate($date);
  703.                 $inscritSession->setTotalmontant(0);
  704.                 $user $userRepository->findOneBy(['email' => $inscritSession->getEmail()]);
  705.                 if ($user) {
  706.                     $inscritSession->setStagiaire($user);
  707.                 }
  708.                 $inscritSession->setIsValid(false);
  709.                 $inscritSession->setVue(false);
  710.                 $inscritSession->setIsActive(true);
  711.                 $inscritSessionRepository->save($inscritSessiontrue);
  712.                 // ========== NOUVEAU CODE POUR LES COUPONS SIPACADEMY ==========
  713.                 $voucher $request->get('idvoucher');
  714.                 // Vérifier si c'est un coupon SIPACADEMY
  715.                 if ($voucher && strpos($voucher'SIPACADEMY-') === 0) {
  716.                     $coupon $couponRepository->findOneBy(['code' => $voucher]);
  717.                     if ($coupon && $coupon->isIsActif()) {
  718.                         // Vérifier si le coupon est expiré
  719.                         $lot $coupon->getLotCoupon();
  720.                         $isExpired $lot && $lot->getDateExpiration() && $lot->getDateExpiration() < $date;
  721.                         if (!$isExpired) {
  722.                             // Marquer le coupon comme utilisé
  723.                             $coupon->setStatut('utilise');
  724.                             $coupon->setIsActif(false);
  725.                             if ($user) {
  726.                                 $coupon->setUser($user);
  727.                             }
  728.                             $coupon->setInscrit($inscritSession);
  729.                             // Mettre à jour le stock du lot
  730.                             if ($lot) {
  731.                                 $oldStock $lot->getStock();
  732.                                 $newStock $oldStock 1;
  733.                                 $lot->setStock($newStock);
  734.                                 $entityManager->persist($lot);
  735.                                 $seuilAlerte $lot->getSeuilAlerte();
  736.                                 if ($seuilAlerte && $newStock <= $seuilAlerte) {
  737.                                     // Envoyer un email aux admins
  738.                                     $this->sendStockAlertEmail(
  739.                                         $lot,
  740.                                         $oldStock,
  741.                                         $newStock,
  742.                                         $seuilAlerte,
  743.                                         $userRepository,
  744.                                         $emailsadminRepository,
  745.                                         $settingRepository,
  746.                                         $mailer
  747.                                     );
  748.                                 }
  749.                             }
  750.                             $entityManager->persist($coupon);
  751.                             $entityManager->flush();
  752.                             $session->getFlashBag()->add('success''🎫 Coupon SIPACADEMY appliqué avec succès ! Réduction de ' . ($lot $lot->getPourcentage() : '') . '%');
  753.                         } else {
  754.                             $session->getFlashBag()->add('error''❌ Ce coupon est expiré.');
  755.                         }
  756.                     } else {
  757.                         $session->getFlashBag()->add('error''❌ Coupon invalide ou déjà utilisé.');
  758.                     }
  759.                 }
  760.                 // ========== FIN NOUVEAU CODE ==========
  761.                 // Code existant pour les anciens vouchers
  762.                 $vouch $voucherRepository->findOneBy(['code' => $voucher]);
  763.                 $currentDate $date->format('Y-m-d');
  764.                 $utli count($utilisationRepository->findBy(['voucher' => $vouch]));
  765.                 if ($utli == 4) {
  766.                     $vouch->setEtat(1);
  767.                     $voucherRepository->save($vouchtrue);
  768.                 }
  769.                 if ($vouch && $vouch->getDate()->modify('+1 year')->format('Y-m-d') < $currentDate) {
  770.                     $vouch->setEtat(2);
  771.                     $voucherRepository->save($vouchtrue);
  772.                 }
  773.                 if ($vouch && $vouch->getEtat() == && $vouch->getUserinscrit()->getRelationus() == $user && $vouch->getDate()->modify('+1 year')->format('Y-m-d') >= $currentDate) {
  774.                     $nbr 0;
  775.                     foreach ($vouch->getOffres()->getFormation() as $a) {
  776.                         if ($a->getId() == $evenement->getFormation()->getId()) {
  777.                             $nbr $nbr 1;
  778.                             break;
  779.                         }
  780.                     }
  781.                     if ($nbr == 1) {
  782.                         $utilisation = new Utilisation();
  783.                         $utilisation->setDate($date);
  784.                         $utilisation->setUtilisationsession($evenement);
  785.                         $utilisation->setSessioninscrit($inscritSession);
  786.                         $utilisation->setVoucher($vouch);
  787.                         $utilisationRepository->save($utilisationtrue);
  788.                     }
  789.                     $session->getFlashBag()->add('success''Inscription avec succès! avec voucher');
  790.                 } else {
  791.                     $session->getFlashBag()->add('success''Inscription avec succès!');
  792.                 }
  793.                 // Envoi des emails...
  794.                 $tabadmin = array();
  795.                 $admins $userRepository->findByRoleAdmin();
  796.                 foreach ($admins as $a) {
  797.                     array_push($tabadmin$a->getEmail());
  798.                     $emailsadmin $emailsadminRepository->findBy(['user' => $a]);
  799.                     foreach ($emailsadmin as $item) {
  800.                         if ($item->getEmail()) {
  801.                             array_push($tabadmin$item->getEmail());
  802.                         }
  803.                     }
  804.                 }
  805.                 $setting $settingRepository->findOneBy(["id" => 1]);
  806.                 $emailInscrit $inscritSession->getEmail();
  807.                 $userInscrit $userRepository->findOneBy(['email' => $emailInscrit]);
  808.                 if ($userInscrit != null) {
  809.                     $inscritSession->setStagiaire($userInscrit);
  810.                 }
  811.                 $inscritSession->setIsActive(true);
  812.                 $inscritSessionRepository->save($inscritSessiontrue);
  813.                 try {
  814.                     $email = (new TemplatedEmail())
  815.                         ->from(new Address($this->fromAddress'Sip Academy'))
  816.                         ->to(...$tabadmin)
  817.                         ->subject('Nouvelle Inscription ' $evenement->getTitre())
  818.                         ->htmlTemplate('evenement/mailInscit.html.twig')
  819.                         ->context([
  820.                             'inscrit' => $inscritSession,
  821.                             'setting' => $setting,
  822.                             'session' => $evenement
  823.                         ]);
  824.                     if ($evenement->getImgprog()) {
  825.                         $attachmentPath $this->getParameter('evenement_directory') . '/' $evenement->getImgprog();
  826.                         $email->attachFromPath($attachmentPath);
  827.                     }
  828.                     $mailer->send($email);
  829.                 } catch (\Exception $e) {
  830.                     return $this->redirectToRoute('app_details_session', ['slug' => $evenement->getSlug()], Response::HTTP_SEE_OTHER);
  831.                 }
  832.                 try {
  833.                     $emailpre = (new TemplatedEmail())
  834.                         ->from(new Address($this->fromAddress'Sip Academy'))
  835.                         ->to($inscritSession->getEmail())
  836.                         ->subject("Inscription à la formation " $evenement->getTitre())
  837.                         ->htmlTemplate('inscrit_session/mailPreInscrit.html.twig')
  838.                         ->context([
  839.                             'inscrit' => $inscritSession,
  840.                             'setting' => $setting,
  841.                             'session' => $evenement,
  842.                             'coupon' => $coupon ?? null
  843.                         ]);
  844.                     if ($evenement->getImgprog()) {
  845.                         $attachmentPath $this->getParameter('evenement_directory') . '/' $evenement->getImgprog();
  846.                         $emailpre->attachFromPath($attachmentPath);
  847.                     }
  848.                     $mailer->send($emailpre);
  849.                 } catch (\Exception $e) {
  850.                     return $this->redirectToRoute('app_details_session', ['slug' => $evenement->getSlug()], Response::HTTP_SEE_OTHER);
  851.                 }
  852.                 return $this->redirectToRoute('app_details_session', ['slug' => $evenement->getSlug()], Response::HTTP_SEE_OTHER);
  853.             } else {
  854.                 $session->getFlashBag()->add('success''Vous êtes déjà inscrit à cette session');
  855.                 return $this->redirectToRoute('app_details_session', ['slug' => $evenement->getSlug()], Response::HTTP_SEE_OTHER);
  856.             }
  857.         }
  858.         // Récupérer les lots de coupons actifs pour cet événement
  859.         $activeLotCoupons $lotCouponRepository->createQueryBuilder('l')
  860.             ->leftJoin('l.coupons''c')
  861.             ->where('l.evenement = :evenement')
  862.             ->andWhere('l.isActif = true')
  863.             ->andWhere('l.dateExpiration >= :today OR l.dateExpiration IS NULL')
  864.             ->andWhere('c.statut = :statut OR c.statut IS NULL')
  865.             ->setParameter('evenement'$evenement)
  866.             ->setParameter('today', new \DateTime())
  867.             ->setParameter('statut''valide')
  868.             ->groupBy('l.id')
  869.             ->having('COUNT(c.id) > 0')
  870.             ->getQuery()
  871.             ->getResult();
  872.         $sections $sectionRepository->findBy(['formation' => $evenement->getFormation()]);
  873.         return $this->renderForm('evenement/detailsFront.html.twig', [
  874.             'controller_name' => 'HomeController',
  875.             'service' => $serviceRepository->findAll(),
  876.             'sections' => $sections,
  877.             'video' => $resPharma,
  878.             'formateurs' => $formateur,
  879.             'ban' => $banniereRepository->findAll(),
  880.             'formations' => $formationRepository->findAll(),
  881.             'teams' => $teamRepository->findAll(),
  882.             'temoi' => $temoignageRepository->findAll(),
  883.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  884.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  885.             'off' => $offresRepository->findAll(),
  886.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  887.             'spon' => $sponsorsRepository->findAll(),
  888.             'par' => $partnersRepository->findAll(),
  889.             'for' => $resfor,
  890.             'formateur' => $userRepository->findByRoleCoach(),
  891.             'evenement' => $evenement,
  892.             'inscrit_session' => $inscritSession,
  893.             'form' => $form,
  894.             'actualites' => $actualites,
  895.             'evenements' => $evenements,
  896.             'ancienevents' => $ancienevents,
  897.             'categories' => $categorieElearningRepository->findAll(),
  898.             'activeLotCoupons' => $activeLotCoupons// Passer les coupons actifs au template
  899.         ]);
  900.     }
  901.     /**
  902.      * Envoyer un email d'alerte de stock bas aux admins
  903.      */
  904.     private function sendStockAlertEmail(
  905.         $lot,
  906.         int $oldStock,
  907.         int $newStock,
  908.         int $seuilAlerte,
  909.         UserRepository $userRepository,
  910.         EmailsadminRepository $emailsadminRepository,
  911.         SettingRepository $settingRepository,
  912.         MailerInterface $mailer
  913.     ): void {
  914.         // Récupérer tous les admins
  915.         $admins $userRepository->findByRoleAdmin();
  916.         $destinataires = [];
  917.         foreach ($admins as $admin) {
  918.             $destinataires[] = $admin->getEmail();
  919.             $emailsadmin $emailsadminRepository->findBy(['user' => $admin]);
  920.             foreach ($emailsadmin as $item) {
  921.                 if ($item->getEmail()) {
  922.                     $destinataires[] = $item->getEmail();
  923.                 }
  924.             }
  925.         }
  926.         if (empty($destinataires)) {
  927.             return;
  928.         }
  929.         $setting $settingRepository->findOneBy(["id" => 1]);
  930.         $evenement $lot->getEvenement();
  931.         try {
  932.             $email = (new TemplatedEmail())
  933.                 ->from(new Address($this->fromAddress'Sip Academy'))
  934.                 ->to(...array_unique($destinataires))
  935.                 ->subject('⚠️ ALERTE STOCK BAS - ' $lot->getLibelle() .' - '.$lot->getEvenement()->getTitre())
  936.                 ->htmlTemplate('lot_coupon/stock_alert.html.twig')
  937.                 ->context([
  938.                     'lot' => $lot,
  939.                     'oldStock' => $oldStock,
  940.                     'newStock' => $newStock,
  941.                     'seuilAlerte' => $seuilAlerte,
  942.                     'evenement' => $evenement,
  943.                     'setting' => $setting,
  944.                     'date' => new \DateTime()
  945.                 ]);
  946.             $mailer->send($email);
  947.         } catch (\Exception $e) {
  948.             // Log l'erreur sans bloquer le processus
  949.             error_log('Erreur lors de l\'envoi de l\'email d\'alerte stock: ' $e->getMessage());
  950.         }
  951.     }
  952.     function generePassword($size)
  953.     {
  954.         // Initialisation des caractères utilisables
  955.         $characters = array(0123456789"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z");
  956.         $password '';
  957.         for ($i 0$i $size$i++) {
  958.             $password .= ($i 2) ? strtoupper($characters[array_rand($characters)]) : $characters[array_rand($characters)];
  959.         }
  960.         return $password;
  961.     }
  962.     #[Route('/details-offres/{slug}'name'app_details_offres'methods: ['GET''POST'])]
  963.     public function detailsoffres(CategorieElearningRepository $categorieElearningRepository,EmailsadminRepository $emailsadminRepository,ActualiteRepository $actualiteRepositoryUserPasswordHasherInterface $userPasswordHasher$slugOffresinscritRepository $offresinscritRepositoryOffresRepository $offresRepositoryMailerInterface $mailerSessionInterface $sessionRequest $requestEvenementRepository $evenementRepositoryFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  964.     {
  965.         $user $this->getUser();
  966. //        dd($user);
  967.         $actualites $actualiteRepository->last3();
  968.         $type "Ordinaire";
  969.         $evenements $evenementRepository->prochainsEvent();
  970.         $ancienEvents $evenementRepository->ancienEvent();
  971.         $date = new \DateTime('now', new DateTimeZone('Africa/Tunis'));
  972.         $evenement $evenementRepository->findOneBy(['slug' => $slug]);
  973.         $offres $offresRepository->findOneBy(['slug' => $slug]);
  974.         $formateur $userRepository->findByRoleCoach();
  975.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  976.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  977.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  978.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  979.         $inscritSession = new Offresinscrit();
  980. //        $form = $this->createForm(OffresinscritType::class, $inscritSession);
  981. //        $form->handleRequest($request);
  982.         return $this->renderForm('offres/detailsfront.html.twig', [
  983.             'controller_name' => 'HomeController',
  984.             'service' => $serviceRepository->findAll(),
  985.             'video' => $resPharma'formateurs' => $formateur,
  986.             'ban' => $banniereRepository->findAll(),
  987.             'formations' => $formationRepository->findAll(),
  988.             'teams' => $teamRepository->findAll(),
  989.             'temoi' => $temoignageRepository->findAll(),
  990.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  991.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  992.             'off' => $offresRepository->findAll(),
  993.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  994.             'spon' => $sponsorsRepository->findAll(),
  995.             'par' => $partnersRepository->findAll(),
  996.             'for' => $resfor,
  997.             'offf' => $offres,
  998.             'formateur' => $userRepository->findByRoleCoach(),
  999.             'evenement' => $evenement,
  1000.             'inscrit_session' => $inscritSession,
  1001. //            'form' => $form,
  1002.             'actualites' => $actualites,
  1003.             'evenements' => $evenements,
  1004.             'user' => $user,
  1005.             'ancienEvents'=>$ancienEvents,'categories'=>$categorieElearningRepository->findAll(),
  1006.         ]);
  1007.     }
  1008.     #[Route('/newOffre'name'app_offre_newoffre'methods: ['POST''GET'])]
  1009.     public function newOffre(
  1010.         OffresRepository $offresRepository,
  1011.         OffresinscritRepository $offresinscritRepository,
  1012.         Request $request,
  1013.         SessionInterface $session,
  1014.         MailerInterface $mailer
  1015.     ): Response {
  1016.         if ($request->isMethod('POST') && !$request->request->get('verification_code')) {
  1017.             // Récupération de l'ID de l'offre et de l'email de l'utilisateur
  1018.             $idOffre $request->request->get('offre_id');
  1019.             $offres $offresRepository->find($idOffre); // Trouver l'offre avec l'ID
  1020.             // Vérifier si l'utilisateur est déjà inscrit à l'offre
  1021.             $ustest $offresinscritRepository->findOneBy(["email" => $request->request->get('email'), "offres" => $offres]);
  1022.             if ($ustest) {
  1023.                 // Si l'utilisateur est déjà inscrit, rediriger avec un message flash
  1024.                 $session->getFlashBag()->add('success''Vous êtes déjà inscrit à cette offre!');
  1025.                 return $this->redirectToRoute('app_details_offres', ['slug' => $offres->getSlug()], Response::HTTP_SEE_OTHER);
  1026.             } else {
  1027.                 // Préparer les données à enregistrer dans la session
  1028.                 $offreData = [
  1029.                     'nom' => $request->request->get('nom'),
  1030.                     'prenom' => $request->request->get('prenom'),
  1031.                     'email' => $request->request->get('email'),
  1032.                     'offre_id' => $request->request->get('offre_id'),
  1033.                     'tel' => $request->request->get('tel'),
  1034.                     'offre_type' => $request->request->get('offre_type'), // Type d'offre
  1035.                 ];
  1036.                 // Données spécifiques à chaque type d'offre
  1037.                 switch ($offreData['offre_type']) {
  1038.                     case 'Etudiant':
  1039.                         $offreData['university'] = $request->request->get('university');
  1040.                         $carte $request->files->get('carte');
  1041.                         if ($carte) {
  1042.                             // Déplacer le fichier "carte" dans le répertoire spécifique
  1043.                             $originalLogoname pathinfo($carte->getClientOriginalName(), PATHINFO_FILENAME);
  1044.                             $newLogoname $originalLogoname '-' uniqid() . '.' $carte->guessExtension();
  1045.                             $carte->move($this->getParameter('carte_directory'), $newLogoname);
  1046.                             $offreData['carte'] = $newLogoname// Enregistrer le nom du fichier
  1047.                         }
  1048.                         break;
  1049.                     case 'Pro':
  1050.                         $offreData['societeact'] = $request->request->get('societeact');
  1051.                         break;
  1052.                     case 'Entreprise':
  1053.                         $offreData['societeact'] = $request->request->get('societeact');
  1054.                         $offreData['adressesociete'] = $request->request->get('adressesociete');
  1055.                         $patente $request->files->get('patente');
  1056.                         if ($patente) {
  1057.                             // Déplacer le fichier "patente" dans le répertoire spécifique
  1058.                             $originalLogoname pathinfo($patente->getClientOriginalName(), PATHINFO_FILENAME);
  1059.                             $newLogoname $originalLogoname '-' uniqid() . '.' $patente->guessExtension();
  1060.                             $patente->move($this->getParameter('patente_directory'), $newLogoname);
  1061.                             $offreData['patente'] = $newLogoname// Enregistrer le nom du fichier
  1062.                         }
  1063.                         break;
  1064.                 }
  1065.                 // Sauvegarde des données dans la session
  1066.                 $session->set('offre_data'$offreData);
  1067.                 // Générer un code de vérification aléatoire
  1068.                 $verificationCode rand(100000999999);
  1069.                 $session->set('verification_code'$verificationCode);
  1070.                 // Envoi du code de vérification par email
  1071.                 $verificationEmail = (new TemplatedEmail())
  1072.                     ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1073.                     ->to($offreData['email'])
  1074.                     ->subject('Code de vérification')
  1075.                     ->htmlTemplate('contact/verification_email.html.twig')
  1076.                     ->context(['verification_code' => $verificationCode]);
  1077.                 $mailer->send($verificationEmail);
  1078.                 // Redirection vers la page de saisie du code de vérification
  1079.                 return $this->redirectToRoute('app_offre_verifycode');
  1080.             }
  1081.         }
  1082.         return $this->redirectToRoute('app_details_offres');
  1083.     }
  1084.     #[Route('/verifycodeOffre'name'app_offre_verifycode'methods: ['GET''POST'])]
  1085.     public function verifyCodeOffre(
  1086.         CategorieElearningRepository $categorieElearningRepository,
  1087.         EmailsadminRepository $emailsadminRepository,
  1088.         UserRepository $userRepository,
  1089.         MailerInterface $mailer,
  1090.         Request $request,
  1091.         SessionInterface $session,
  1092.         ContactRepository $contactRepository,
  1093.         SettingRepository $settingRepository,OffresRepository $offresRepository,
  1094.         OffresInscritRepository $offresinscritRepository,EntityManagerInterface $entityManager,
  1095.         UserPasswordHasherInterface $userPasswordHasher
  1096.     ): Response {
  1097.         $setting $settingRepository->find(1);
  1098.         // Vérification si la requête est de type POST
  1099.         if ($request->isMethod('POST')) {
  1100.             $verificationCode $request->request->get('verification_code');
  1101.             // Vérification du code saisi par l'utilisateur
  1102.             if ($verificationCode == $session->get('verification_code')) {
  1103.                 // Récupération des données de l'offre et de l'utilisateur depuis la session
  1104.                 $offreData $session->get('offre_data'); // Les données doivent être stockées dans la session
  1105.                 $inscritSession = new Offresinscrit();
  1106.                 // Remplir l'inscription avec les données récupérées
  1107.                 $inscritSession->setNom($offreData['nom']);
  1108.                 $inscritSession->setPrenom($offreData['prenom']);
  1109.                 $inscritSession->setEmail($offreData['email']);
  1110.                 $inscritSession->setZphone($offreData['tel']);
  1111.                 $inscritSession->setType($offreData['offre_type']);
  1112.                 // Ajouter des données spécifiques en fonction du type d'offre
  1113.                 switch ($offreData['offre_type']) {
  1114.                     case 'Etudiant':
  1115.                         $inscritSession->setUniversity($offreData['university']);
  1116.                         $inscritSession->setCarteetd($offreData['carte']);
  1117.                         break;
  1118.                     case 'Pro':
  1119.                         $inscritSession->setSocieteActuelle($offreData['societeact']);
  1120.                         break;
  1121.                     case 'Entreprise':
  1122.                         $inscritSession->setSocieteActuelle($offreData['societeact']);
  1123.                         $inscritSession->setAdresseSociete($offreData['adressesociete']);
  1124.                         $inscritSession->setPatente($offreData['patente']);
  1125.                         break;
  1126.                 }
  1127.                 // Récupérer l'offre à partir des données de la session
  1128.                 $offre $offresRepository->findOneBy(['id' => $offreData['offre_id']]);
  1129.                 $inscritSession->setType($offre->getTitre());
  1130.                 $inscritSession->setVu(0);
  1131.                 $inscritSession->setOffres($offre);
  1132.                 $inscritSession->setStatut("En cours");
  1133.                 $inscritSession->setDate(new \DateTime('now', new DateTimeZone('Africa/Tunis')));
  1134.                 // Enregistrer l'inscription dans la base de données
  1135.                 $offresinscritRepository->save($inscritSessiontrue);
  1136.                 $us $userRepository->findBy(["email" => $inscritSession->getEmail()]);
  1137.                 $password $this->generePassword(7);
  1138.                 if (!$us) {
  1139.                     $useroffre = new User();
  1140.                     $useroffre->setEmail($inscritSession->getEmail());
  1141.                     $useroffre->setPassword(
  1142.                         $userPasswordHasher->hashPassword($useroffre$password)
  1143.                     );
  1144.                     $useroffre->setNom($inscritSession->getNom());
  1145.                     $useroffre->setPrenom($inscritSession->getPrenom());
  1146.                     $useroffre->setVu(0);
  1147.                     $useroffre->setDate($date = new \DateTime('now', new DateTimeZone('Africa/Tunis')));
  1148.                     if ($offre->getTitre() == "Etudiant") {
  1149.                         $useroffre->setRoles(["ROLE_STUDENT"]);
  1150.                     } elseif ($offre->getTitre() == "Pro") {
  1151.                         $useroffre->setRoles(["ROLE_COACH"]);
  1152.                     } else {
  1153.                         $useroffre->setRoles(["ROLE_PARTNER"]);
  1154.                     }
  1155.                     $entityManager->persist($useroffre);
  1156.                     $entityManager->flush();
  1157.                     $email9 = (new TemplatedEmail())
  1158.                         ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1159. //            ->to("athimni.afrah@gmail.com")
  1160.                         ->to($useroffre->getEmail())
  1161.                         ->subject('Bienvenue sur Sip Academy')
  1162.                         ->htmlTemplate(
  1163.                             'registration/send_email.html.twig'
  1164.                         )
  1165.                         ->context([
  1166.                             'emails' => $useroffre->getEmail(),
  1167.                             'password' => $password'user' => $useroffre,
  1168.                             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1169.                         ]);
  1170.                     $mailer->send($email9);
  1171.                 }
  1172.                 // Envoi des emails de confirmation
  1173.                 $tabadmin = [];
  1174.                 $admins $userRepository->findByRoleAdmin();
  1175.                 foreach ($admins as $a) {
  1176.                     array_push($tabadmin$a->getEmail());
  1177.                 }
  1178.                 // Envoyer un email aux administrateurs
  1179.                 $email = (new TemplatedEmail())
  1180.                     ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1181.                     ->to(...$tabadmin)
  1182.                     ->subject('Nouvelle Inscription ' $inscritSession->getOffres()->getTitre())
  1183.                     ->htmlTemplate('offres/mailInscit.html.twig')
  1184.                     ->context(['inscrit' => $inscritSession'setting' => $setting  ,    'session' => $offre]);
  1185.                 $mailer->send($email);
  1186.                 // Envoyer un email à l'utilisateur inscrit
  1187.                 $emailpre = (new TemplatedEmail())
  1188.                     ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1189.                     ->to($inscritSession->getEmail())
  1190.                     ->subject("Inscription à l'offre " $inscritSession->getOffres()->getTitre())
  1191.                     ->htmlTemplate('offres/inscrit.html.twig')
  1192.                     ->context(['inscrit' => $inscritSession'setting' => $setting,    'session' => $offre]);
  1193.                 $mailer->send($emailpre);
  1194.                 // Flash message et redirection
  1195.                 $this->addFlash('success''Votre inscription a été confirmée avec succès!');
  1196.                 $session->remove('verification_code');
  1197.                 $session->remove('offre_data');
  1198.                 return $this->redirectToRoute('app_details_offres', ['slug' => $inscritSession->getOffres()->getSlug()]);
  1199.             } else {
  1200.                 $this->addFlash('error''Code de vérification incorrect. Veuillez réessayer.');
  1201.             }
  1202.         }
  1203.         return $this->render('offres/verifyCode.html.twig', [
  1204.           'setting' => $settingRepository->findOneBy(["id" => 1]),
  1205.             'formateur' => $userRepository->findByRoleCoach(),
  1206.             'partenaires' => $userRepository->findByRolePartenaire(),'categories'=>$categorieElearningRepository->findAll(),
  1207.         ]);
  1208.     }
  1209.     #[Route('/partenaires'name'app_partenaires')]
  1210.     public function indexAllPartenaires(CategorieElearningRepository $categorieElearningRepository,FormationRepository $formationRepositoryOffresRepository $offresRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1211.     {
  1212.         $formateur $userRepository->findByRoleCoach();
  1213.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  1214.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  1215.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1216.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1217.         return $this->render('partenaire/partenairesFront.html.twig', [
  1218.             'controller_name' => 'HomeController',
  1219.             'service' => $serviceRepository->findAll(),
  1220.             'video' => $resPharma'formateurs' => $formateur,
  1221.             'off' => $offresRepository->findAll(),
  1222.             'ban' => $banniereRepository->findAll(),
  1223.             'formations' => $formationRepository->findAll(),
  1224.             'teams' => $teamRepository->findAll(),
  1225.             'temoi' => $temoignageRepository->findAll(),
  1226.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1227.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1228.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1229.             'spon' => $sponsorsRepository->findAll(),
  1230.             'par' => $partnersRepository->findAll(),
  1231.             'for' => $resfor,
  1232.             'formateur' => $userRepository->findByRoleCoach(),
  1233.             'partenaires' => $userRepository->findByRolePartenaire(),
  1234.             'categories'=>$categorieElearningRepository->findAll(),
  1235.         ]);
  1236.     }
  1237.     #[Route('/newcontact'name'app_contact_newcontact'methods: ['POST''GET'])]
  1238.     public function newcontact(CategorieElearningRepository $categorieElearningRepository,Request $requestSessionInterface $sessionMailerInterface $mailer): Response
  1239.     {
  1240.         if ($request->isMethod('POST') && !$request->request->get('verification_code')) {
  1241.             // Récupérer les données du formulaire
  1242.             $contactData = [
  1243.                 'nom' => $request->request->get('nom'),
  1244.                 'email' => $request->request->get('email'),
  1245.                 'phone' => $request->request->get('phone'),
  1246.                 'message' => $request->request->get('message')
  1247.             ];
  1248.             // Enregistrer les données du formulaire dans la session
  1249.             $session->set('contact_data'$contactData);
  1250.             // Générez un code de vérification aléatoire
  1251.             $verificationCode rand(100000999999);
  1252.             $session->set('verification_code'$verificationCode);
  1253.             // Envoyez le code à l'adresse e-mail de contact
  1254.             $verificationEmail = (new TemplatedEmail())
  1255.                 ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1256.                 ->to($contactData['email'])
  1257.                 ->subject('Code de vérification')
  1258.                 ->htmlTemplate('contact/verification_email.html.twig')
  1259.                 ->context(['verification_code' => $verificationCode]);
  1260.             $mailer->send($verificationEmail);
  1261.             // Rediriger vers une autre interface pour entrer le code
  1262.             return $this->redirectToRoute('app_contact_verifycode');
  1263.         }
  1264.         return $this->render('contact/contactFront.html.twig');
  1265.     }
  1266.     #[Route('/verifycode'name'app_contact_verifycode'methods: ['GET''POST'])]
  1267.     public function verifyCode(CategorieElearningRepository $categorieElearningRepository,EmailsadminRepository $emailsadminRepository,UserRepository $userRepository,MailerInterface $mailer,Request $requestSessionInterface $sessionContactRepository $contactRepositorySettingRepository $settingRepository): Response
  1268.     {
  1269.         $setting=$settingRepository->find(1);
  1270.         if ($request->isMethod('POST')) {
  1271.             $verificationCode $request->request->get('verification_code');
  1272.             if ($verificationCode == $session->get('verification_code')) {
  1273.                 // Récupérer les données du message depuis la session
  1274.                 $contactData $session->get('contact_data');
  1275.                 // Créer et enregistrer le message dans la base de données
  1276.                 $contact = new Contact();
  1277.                 $contact->setNom($contactData['nom']);
  1278.                 $contact->setPhone($contactData['phone']);
  1279.                 $contact->setEmail($contactData['email']);
  1280.                 $contact->setMessage($contactData['message']);
  1281.                 $contact->setDatemessage(new \DateTime('now', new DateTimeZone('Africa/Tunis')));
  1282.                 $contactRepository->save($contacttrue);
  1283.                 $tabadmin = array();
  1284.                 $admins $userRepository->findByRoleAdmin();
  1285.                 foreach ($admins as $a) {
  1286.                     array_push($tabadmin$a->getEmail());
  1287.                     $emailsadmin=$emailsadminRepository->findBy(['user'=>$a]);
  1288.                     foreach ($emailsadmin as $item) {
  1289.                         if ($item->getEmail()) {
  1290.                             array_push($tabadmin$item->getEmail());
  1291.                         }
  1292.                     }
  1293.                 }
  1294.                 $email = (new TemplatedEmail())
  1295.                     ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1296.                     ->to(...$tabadmin)
  1297.                     ->subject('Nouveau Contact')
  1298.                     ->htmlTemplate(
  1299.                         'contact/mail.html.twig'
  1300.                     )
  1301.                     ->context([
  1302.                         'contact' => $contact'setting' => $setting
  1303.                     ]);
  1304.                 $mailer->send($email);
  1305.                 $nb $setting->getNbmessage();
  1306.                 $setting->setNbmessage($nb 1);
  1307.                 $settingRepository->save($settingtrue);
  1308.                 $this->addFlash('success''Votre message a été envoyé avec succès!');
  1309.                 // Effacer les données de session
  1310.                 $session->remove('verification_code');
  1311.                 $session->remove('contact_data');
  1312.                 return $this->redirectToRoute('app_contact_contact', [], Response::HTTP_SEE_OTHER);
  1313.             } else {
  1314.                 $this->addFlash('error''Code de vérification incorrect. Veuillez réessayer.');
  1315.             }
  1316.         }
  1317.         return $this->render('contact/verifyCode.html.twig', [
  1318.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1319.             'formateur' => $userRepository->findByRoleCoach(),
  1320.             'partenaires' => $userRepository->findByRolePartenaire(),'categories'=>$categorieElearningRepository->findAll(),
  1321.         ]);
  1322.     }
  1323.     #[Route('/contact'name'app_contact_contact'methods: ['GET''POST'])]
  1324.     public function contact(CategorieElearningRepository $categorieElearningRepository,FormationRepository $formationRepositoryOffresRepository $offresRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepositoryRequest $requestContactRepository $contactRepository): Response
  1325.     {
  1326.         $formateur $userRepository->findByRoleCoach();
  1327.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  1328.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  1329.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1330.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1331.         $contact = new Contact();
  1332.         $form $this->createForm(ContactType::class, $contact);
  1333.         $form->handleRequest($request);
  1334.         if ($form->isSubmitted() && $form->isValid()) {
  1335.             $contactRepository->save($contacttrue);
  1336.             return $this->redirectToRoute('app_contact_index', [], Response::HTTP_SEE_OTHER);
  1337.         }
  1338.         return $this->renderForm('contact/contactFront.html.twig', [
  1339.             'contact' => $contact,
  1340.             'form' => $form,
  1341.             'service' => $serviceRepository->findAll(),
  1342.             'video' => $resPharma'formateurs' => $formateur,
  1343.             'ban' => $banniereRepository->findAll(),
  1344.             'formations' => $formationRepository->findAll(),
  1345.             'teams' => $teamRepository->findAll(),
  1346.             'temoi' => $temoignageRepository->findAll(),
  1347.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1348.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1349.             'off' => $offresRepository->findAll(),
  1350.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1351.             'spon' => $sponsorsRepository->findAll(),
  1352.             'par' => $partnersRepository->findAll(), 'formateur' => $userRepository->findByRoleCoach(),
  1353.             'show_verification' => false,'categories'=>$categorieElearningRepository->findAll(),
  1354.         ]);
  1355.     }
  1356.     #[Route('/detailsCoach/{id}'name'app_details_coach')]
  1357.     public function detailsCoach(CategorieElearningRepository $categorieElearningRepository,User $coachOffresRepository $offresRepositoryFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1358.     {
  1359.         $formateur $userRepository->findByRoleCoach();
  1360.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  1361.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  1362.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1363.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1364.         return $this->render('formateur/detailsCoach.html.twig', [
  1365.             'controller_name' => 'HomeController',
  1366.             'service' => $serviceRepository->findAll(),
  1367.             'video' => $resPharma'formateurs' => $formateur,
  1368.             'ban' => $banniereRepository->findAll(),
  1369.             'formations' => $formationRepository->findAll(),
  1370.             'teams' => $teamRepository->findAll(),
  1371.             'temoi' => $temoignageRepository->findAll(),
  1372.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1373.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1374.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1375.             'spon' => $sponsorsRepository->findAll(),
  1376.             'par' => $partnersRepository->findAll(),
  1377.             'for' => $resfor,
  1378.             'off' => $offresRepository->findAll(),
  1379.             'coach' => $coach'formateur' => $userRepository->findByRoleCoach(),
  1380.             'categories'=>$categorieElearningRepository->findAll(),
  1381.         ]);
  1382.     }
  1383.     #[Route('/formations'name'app_formations')]
  1384.     public function indexAllFormations(CategorieElearningRepository $categorieElearningRepository,Request $requestPaginatorInterface $paginatorFormationRepository $formationRepositoryOffresRepository $offresRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1385.     {
  1386.         $formateur $userRepository->findByRoleCoach();
  1387.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  1388.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  1389.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1390.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1391.         $pagination $paginator->paginate(
  1392.             $foramtion $formationRepository->findAll(),
  1393.             $request->query->get('page'1),
  1394.             6
  1395.         );
  1396.         return $this->render('formation/formations.html.twig', [
  1397.             'controller_name' => 'HomeController',
  1398.             'service' => $serviceRepository->findAll(),
  1399.             'video' => $resPharma'formateurs' => $formateur,
  1400.             'ban' => $banniereRepository->findAll(),
  1401.             'formations' => $formationRepository->findAll(),
  1402.             'formation' => $pagination,
  1403.             'paginator' => $pagination,
  1404.             'teams' => $teamRepository->findAll(),
  1405.             'temoi' => $temoignageRepository->findAll(),
  1406.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1407.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1408.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1409.             'spon' => $sponsorsRepository->findAll(),
  1410.             'par' => $partnersRepository->findAll(),
  1411.             'for' => $resfor,
  1412.             'off' => $offresRepository->findAll(),
  1413.             'formateur' => $userRepository->findByRoleCoach(),
  1414.             'categories'=>$categorieElearningRepository->findAll(),
  1415.         ]);
  1416.     }
  1417.     #[Route('/offres'name'app_offres')]
  1418.     public function indexAlloffres(CategorieElearningRepository $categorieElearningRepository,Request $requestOffresRepository $offresRepositoryPaginatorInterface $paginatorFormationRepository $formationRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1419.     {
  1420.         return $this->render('offres/offfront.html.twig', [
  1421.             'controller_name' => 'HomeController',
  1422.             'service' => $serviceRepository->findAll(),
  1423.             'ban' => $banniereRepository->findAll(),
  1424.             'formations' => $formationRepository->findAll(),
  1425.             'teams' => $teamRepository->findAll(),
  1426.             'temoi' => $temoignageRepository->findAll(),
  1427.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1428.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1429.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1430.             'spon' => $sponsorsRepository->findAll(),
  1431.             'par' => $partnersRepository->findAll(),
  1432.             'off' => $offresRepository->findAll(),'categories'=>$categorieElearningRepository->findAll(),
  1433.         ]);
  1434.     }
  1435.     #[Route('/apropos'name'app_about')]
  1436.     public function indexAbout(CategorieElearningRepository $categorieElearningRepository,UserRepository $userRepositoryOffresRepository $offresRepositoryServiceRepository $serviceRepositoryFormationRepository $formationRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1437.     {
  1438.         $formateur $userRepository->findByRoleCoach();
  1439.         $reqvid "SELECT *  FROM `video` LIMIT 4;";
  1440.         $resPharma $entityManager->getConnection()->prepare($reqvid)->execute()->fetchAll();
  1441.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1442.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1443.         return $this->render('home/about.html.twig', [
  1444.             'controller_name' => 'HomeController',
  1445.             'service' => $serviceRepository->findAll(),
  1446.             'video' => $resPharma'formateurs' => $formateur,
  1447.             'ban' => $banniereRepository->findAll(),
  1448.             'teams' => $teamRepository->findAll(),
  1449.             'temoi' => $temoignageRepository->findAll(),
  1450.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1451.             'off' => $offresRepository->findAll(),
  1452.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1453.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1454.             'spon' => $sponsorsRepository->findAll(),
  1455.             'par' => $partnersRepository->findAll(),
  1456.             'for' => $resfor'formateur' => $userRepository->findByRoleCoach(),
  1457.             'categories'=>$categorieElearningRepository->findAll(),
  1458.         ]);
  1459.     }
  1460.     #[Route('/'name'app_home')]
  1461.     public function index(CategorieElearningRepository $categorieElearningRepository,ActualiteRepository $actualiteRepositoryOffresRepository $offresRepositoryEvenementRepository $evenementRepositoryUserRepository $userRepositoryServiceRepository $serviceRepositoryFormationRepository $formationRepositoryEntityManagerInterface $entityManagerVideoRepository $videoRepositoryTemoignageRepository $temoignageRepositoryGalleryRepository $galleryRepositoryPartnersRepository $partnersRepositorySponsorsRepository $sponsorsRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1462.     {
  1463.         $actualites $actualiteRepository->last3();
  1464.         $evenemets $evenementRepository->prochainsEvent();
  1465.         $reqvid "SELECT * FROM `video` ORDER BY id DESC LIMIT 4";
  1466.         $videos $entityManager->getConnection()->prepare($reqvid)->executeQuery()->fetchAllAssociative();
  1467.         $reqfor "SELECT *  FROM `formation` LIMIT 3;";
  1468.         $resfor $entityManager->getConnection()->prepare($reqfor)->execute()->fetchAll();
  1469.         return $this->render('home/index.html.twig', [
  1470.             'controller_name' => 'HomeController''evenements' => $evenemets,
  1471.             'service' => $serviceRepository->findAll(),
  1472.             'video' => $videos'actualites' => $actualites,
  1473.             'ban' => $banniereRepository->findAll(),
  1474.             'teams' => $teamRepository->findAll(),
  1475.             'temoi' => $temoignageRepository->findAll(),
  1476.             'gallery' => $galleryRepository->findOneBy(["id" => 1]),
  1477.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1478.             'setting' => $settingRepository->findOneBy(["id" => 1]),
  1479.             'spon' => $sponsorsRepository->findAll(),
  1480.             'par' => $partnersRepository->findAll(),
  1481.             'for' => $formationRepository->last3(),
  1482.             'off' => $offresRepository->findAll(),
  1483.             'formateur' => $userRepository->findByRoleCoach(),
  1484.             'categories'=>$categorieElearningRepository->findAll()
  1485.         ]);
  1486.     }
  1487.     #[Route('/newsletter'name'app_newsletter_new_ajax')]
  1488.     public function newAjax(CategorieElearningRepository $categorieElearningRepository,MailerInterface $mailerEntityManagerInterface $entityManagerNewsletterRepository $newsletterRepositoryRequest $requestSettingRepository $settingRepository): Response
  1489.     {
  1490.         $newsletter = new Newsletter();
  1491.         $email $request->get('email');
  1492.         $news $newsletterRepository->findOneBy(["email" => $email]);
  1493.         if ($news) {
  1494.             $output 0;
  1495.         } else {
  1496.             if ($request->getMethod() == "POST") {
  1497.                 $email $request->get('email');
  1498.                 $news $newsletterRepository->findBy(['email' => $email]);
  1499.                 if (!$news) {
  1500.                     $msj = (new TemplatedEmail())
  1501.                         ->from(new Address($this->fromAddress'Sip Academy'))  // Utilisation de Address pour inclure l'email et le nom
  1502.                         ->To($email)
  1503.                         ->subject('Merci de vous être inscrit(e) à notre newsletter !')
  1504.                         ->htmlTemplate(
  1505.                             'newsletter/email.html.twig'
  1506.                         )
  1507.                         ->context([
  1508.                             'setting' => $settingRepository->find(1)
  1509.                         ]);
  1510.                     $mailer->send($msj);
  1511.                     $newsletter->setEmail($email);
  1512.                     $newsletter->setDateinscription(new \DateTime('now'));
  1513.                     $newsletterRepository->save($newslettertrue);
  1514.                 }
  1515.             }
  1516.             $output 1;
  1517.         }
  1518.         return new JsonResponse($output);
  1519.     }
  1520.     #[Route('/back'name'app_back')]
  1521.     public function back(CategorieElearningRepository $categorieElearningRepository,ServiceRepository $serviceRepositorySettingRepository $settingRepositoryStatistiqueRepository $statistiqueRepositoryBanniereRepository $banniereRepositoryTeamRepository $teamRepository): Response
  1522.     {
  1523.         return $this->render('baseback.html.twig', [
  1524.             'controller_name' => 'HomeController',
  1525.             'service' => $serviceRepository->findAll(),
  1526.             'ban' => $banniereRepository->findAll(),
  1527.             'teams' => $teamRepository->findAll(),
  1528.             'stat' => $statistiqueRepository->findOneBy(["id" => 1]),
  1529.             'setting' => $settingRepository->findOneBy(["id" => 1]),'categories'=>$categorieElearningRepository->findAll(),
  1530.         ]);
  1531.     }
  1532. }