src/Controller/AccueilController.php line 191

Open in your IDE?
  1. <?php
  2. // src/Controller/AccueilController
  3. /*
  4.  * 
  5.  * Date de modification:16/05/2025
  6.  * Description:Controller LayoutAccueil 5sur5 Séjour
  7.  *
  8.  */
  9. namespace App\Controller;
  10. use App\Entity\Fonctions;
  11. use App\Entity\User;
  12. use App\Service\AttachementService;
  13. use App\Service\BlogService;
  14. use App\Service\EmailsCmdService;
  15. use App\Service\SejourService;
  16. use App\Service\SiteService;
  17. use App\Service\TypeProduiteService;
  18. use App\Service\UserService;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Symfony\Component\Mailer\MailerInterface;
  26. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  27. use Symfony\Component\Mime\Address;
  28. use Psr\Log\LoggerInterface;
  29. class AccueilController extends AbstractController
  30. {
  31.     private $typeProduiteService;
  32.     private $siteService;
  33.     private $blogService;
  34.     private $UserService;
  35.     private $sejourService;
  36.     private $attachementService;
  37.     private $mailer;
  38.     private $logger;
  39.     private $emailsCmdService;
  40.     public function __construct(TypeProduiteService $typeProduiteServiceSiteService $siteServiceBlogService $blogServiceUserService $UserServiceSejourService $sejourServiceAttachementService $attachementServiceMailerInterface $mailerLoggerInterface $loggerEmailsCmdService $emailsCmdService)
  41.     {
  42.         $this->typeProduiteService $typeProduiteService;
  43.         $this->siteService $siteService;
  44.         $this->blogService $blogService;
  45.         $this->UserService $UserService;
  46.         $this->sejourService $sejourService;
  47.         $this->attachementService $attachementService;
  48.         $this->mailer $mailer;
  49.         $this->logger $logger;
  50.         $this->emailsCmdService $emailsCmdService;
  51.     }
  52.     /**
  53.      * @Route("/Accueil5sur5", name="layoutAccueil")
  54.      * */
  55.     public function layoutAccueil()
  56.     {
  57.         return $this->render('Accueil/layoutAccueil.html.twig');
  58.     }
  59.     /**
  60.      * @Route("/Accueil5sur5/header_layoutAccueil", name="header_layoutAccueil")
  61.      */
  62.     public function header(Request $request): Response
  63.     {
  64.         $produit $this->typeProduiteService;
  65.         $liste $produit->produitlistType();
  66.         // dd($liste);
  67.         $session $request->getSession();
  68.         $Products $session->get("Panier");
  69.         if ($Products == Null) {
  70.             $Products = [];
  71.         }
  72.         return $this->render('Accueil/header.html.twig', [
  73.             'produit' => $liste,
  74.             'Products' => $Products,
  75.         ]);
  76.     }
  77.     /**
  78.      * @Route("/Accueil5sur5/header_Parent", name="header_Parent")
  79.      */
  80.     public function header_Parent(Request $request): Response
  81.     {
  82.         $produit $this->typeProduiteService;
  83.         $liste $produit->produitlistType();
  84.         // dd($liste);
  85.         $session $request->getSession();
  86.         $Products $session->get("Panier");
  87.         if ($Products == Null) {
  88.             $Products = [];
  89.         }
  90.         return $this->render('Accueil/headerParents.html.twig', [
  91.             'produit' => $liste,
  92.             'Products' => $Products,
  93.         ]);
  94.     }
  95.     /**
  96.      * @Route("/Accueil5sur5/headerLogin", name="headerLogin")
  97.      */
  98.     public function headerLogin(Request $request): Response
  99.     {
  100.         $produit $this->typeProduiteService;
  101.         $liste $produit->produitlistType();
  102.         // dd($liste);
  103.         $session $request->getSession();
  104.         $Products $session->get("Panier");
  105.         if ($Products == Null) {
  106.             $Products = [];
  107.         }
  108.         return $this->render('Accueil/headerLogin.html.twig', [
  109.             'produit' => $liste,
  110.             'Products' => $Products,
  111.         ]);
  112.     }
  113.     /**
  114.      * @Route("/", name="page_Accueil")
  115.      */
  116.     public function PageAccueil()
  117.     {
  118.         $produit $this->typeProduiteService;
  119.         $liste $produit->produitlistType();
  120.         $siteservice $this->siteService;
  121.         $site $siteservice->getActiveSite();
  122.         $list $this->blogService->allblog();
  123.         //dd($list);
  124.         return $this->render('Accueil/PageAccueil.html.twig', ["site" => $site'list' => $list'produit' => $liste]);
  125.     }
  126.     /**
  127.      * @Route("/Parent/", name="Parent")
  128.      */
  129.     public function Acceuil(Request $request)
  130.     {
  131.         $produit $this->typeProduiteService;
  132.         $liste $produit->produitlistType();
  133.         $siteservice $this->siteService;
  134.         $site $siteservice->getActiveSite();
  135.         $list $this->blogService->allblog();
  136.         $session $request->getSession();
  137.         $Products $session->get("Panier");
  138.         if ($Products == Null) {
  139.             $Products = [];
  140.         }
  141.         return $this->render('Accueil/PageAccueil.html.twig', ["site" => $site'list' => $list'produit' => $liste'Products' => $Products]);
  142.     }
  143.     /**
  144.      * @Route("/Accueil5sur5/footer_layoutAccueil", name="footer_layoutAccueil")
  145.      */
  146.     public function footer()
  147.     {
  148.         return $this->render('Accueil/footer.html.twig');
  149.     }
  150.     /**
  151.      * @Route("/Accompagnateur/register", name="accomp_register",methods={"POST","GET"})
  152.      */
  153.     public function register(Request $request)
  154.     {
  155.         // Forcer type_user=EF si la requête vient de la page écoles publiques
  156.         $referer $request->headers->get('referer');
  157.         if ($referer && strpos($referer'/ecoles-publiques/creer') !== false) {
  158.             $request->request->set('type_user''EF');
  159.             error_log("🏫 Création depuis page écoles publiques → Force type_user=EF");
  160.         }
  161.         
  162.         ini_set("max_execution_time", -1);
  163.         ini_set('memory_limit''-1');
  164.         $em $this->getDoctrine()->getManager();
  165.         $UserService $this->UserService;
  166.         $SejourService $this->sejourService;
  167.         $AttachementService $this->attachementService;
  168.         $nom $request->get("nom_acc");
  169.         $prenom $request->get('prenom_acc');
  170.         $etablisment $request->get("etablisment");
  171.         $fonction $request->get("fonction");
  172.         $EntityFonction $em->getRepository(Fonctions::class)->find($fonction);
  173.         if ($EntityFonction) {
  174.             $nameFonction $EntityFonction->getName();
  175.         } else {
  176.             $nameFonction "";
  177.         }
  178.         $adressetablisment $request->get("adressetablisment");
  179.         // prix et reverse
  180.         $prixcnxparent 2.90;
  181.         $prixcnxpartenaire 0;
  182.         $reversecnxpart 0;
  183.         $reverseventepart 0;
  184.         $phoneacc $request->get("phone_acc");
  185.         $mail $request->get("email");
  186.         $password $request->get("password");
  187.         $role "ROLE_ACC";
  188.         $themSejour $request->get('theme_sejour');
  189.         $adressSejour $request->get("adress_sejour");
  190.         $codePostal $request->get("codePostal");
  191.         $dateDebut $request->get("date_debut_sejour");
  192.         $FinSejour $request->get("date_fin_sejour");
  193.         $AgeDugroupe $request->get("age_dugroupe_sejour");
  194.         $NbEnfant $request->get("NbEnfant");
  195.         $pays $request->get("pays");
  196.         $ville $request->get("ville");
  197.         $CODEpOSTALetablisment $request->get("CODEpOSTALetablisment");
  198.         $villeetablisment $request->get("villeetablisment");
  199.         
  200.         // Récupérer le type de séjour depuis le formulaire (EP, EF, PF)
  201.         $type_user $request->get("type_user");
  202.         if (!$type_user) {
  203.             $type_user "EP"// Par défaut: École Publique (parents paient)
  204.         }
  205.     
  206.         // Mapper le type_user vers le type de séjour et connpay
  207.         // Logique du code séjour : [Type][Pay][Timestamp]
  208.         // Type: E=École, P=Partenaire, C=CSE
  209.         // Pay: P=Payant (parents), F=Free (gratuit/structure)
  210.         switch ($type_user) {
  211.             case 'EF':
  212.                 // École Française (page dédiée) = École + Gratuit
  213.         $type "ECOLES/AUTRES";
  214.                 $connpay 0// Gratuit (0 = Free)
  215.                 break;
  216.             case 'PF':
  217.                 // Partenaire Financé (structure prend en charge) = Partenaire + Structure finance
  218.                 $type "PARTENAIRES/VOYAGISTES";
  219.                 $connpay 0// Structure finance (0 = Free)
  220.                 break;
  221.             case 'EP':
  222.             default:
  223.                 // École Publique (parents paient par défaut) = École + Parents paient
  224.                 $type "ECOLES/AUTRES";
  225.                 $connpay 1// Parents paient (1 = Payant)
  226.                 break;
  227.         }
  228.         
  229.         error_log("🔍 Type reçu du formulaire: type_user=$type_user → Type séjour=$type, connpay=$connpay");
  230.      
  231.         $bytes random_bytes(5);
  232.         $passAcommpa bin2hex($bytes);
  233.         if ($NbEnfant) {
  234.             $NbEnfant $NbEnfant;
  235.         } else {
  236.             $NbEnfant 0;
  237.         }
  238.         $dateSJoue = new \Datetime();
  239.         $Milliseconde $dateSJoue->format('u');
  240.         $annes $dateSJoue->format('y');
  241.         $joours $dateSJoue->format('d');
  242.         $joours $dateSJoue->format('t');
  243.         $emailaccf "Acompa" $annes $joours $Milliseconde "@fictif.com";
  244.         //CREATION ACCOMPAGNATEUR
  245.         $accomp $UserService->creationNewAcommpa($nom$prenom$etablisment$nameFonction$adressetablisment$phoneacc$emailaccf$role$passAcommpa$mail);
  246.         $accomp->setIdFonction($EntityFonction);
  247.         $em->persist($accomp);
  248.         $em->flush();
  249.         //CREATION PARTENAIRE
  250.         $part $em->getRepository(User::class)->VerifierAddresseEmailPartenaire($mail'ROLE_PARTENAIRE');
  251.         if (is_null($part)) {
  252.             $part $UserService->creationNewUser($nom$prenom$etablisment$nameFonction$adressetablisment$phoneacc$mail$passAcommpa"ROLE_PARTENAIRE");
  253.             $part->setIdFonction($EntityFonction);
  254.             $em->persist($part);
  255.             $em->flush();
  256.         }
  257.         //CREATION ETABLISSEMENT + PARTENAIRE
  258.         $Etablisment $UserService->creationNewEtablisment($part$nom$prenom$etablisment$fonction$adressetablisment$phoneacc$mail"ROLE_PARTENAIRE"$password$prixcnxparent$prixcnxpartenaire$reversecnxpart$reverseventepart);
  259.         if ($CODEpOSTALetablisment == "") {
  260.             $CODEpOSTALetablisment null;
  261.         }
  262.         $Etablisment->setCodepostaleatb($CODEpOSTALetablisment);
  263.         $Etablisment->setVille($villeetablisment);
  264.         $em->persist($Etablisment);
  265.         $em->flush();
  266.         //CREATION SEJOUR ACCOM + PARTENAIRE + ETABILSSEMENT
  267.         // Ne pas surcharger $connpay via la fonction (ex: VIP)
  268.         // Le code séjour doit refléter exclusivement le choix utilisateur (type_user)
  269.         $sejour $SejourService->CreationNouveauSejourParAccompagnateur($themSejour$adressSejour$dateDebut$FinSejour$AgeDugroupe$type$NbEnfant$connpay$pays$ville$prixcnxparent$prixcnxpartenaire$reversecnxpart$reverseventepart);
  270.         $sejour->setCodePostal(intval($codePostal));
  271.         $SejourService->affecterAccompaniateur($sejour$accomp);
  272.         $SejourService->affecterPartenaire($sejour$part);
  273.         $SejourService->affecteretablisment($sejour$Etablisment);
  274.         $em->persist($sejour);
  275.         $em->flush();
  276.         //AFFECTAION LOGO TO USER PARTENAIRE ADN ACCOMPAGNATEUR
  277.         if ($request->request->has('path')) {
  278.             $ty "logo séjour";
  279.             $AttachementService->creationLogoSejour($accomp$request->get('path'), $ty);
  280.             $AttachementService->creationLogoSejour($part$request->get('path'), $ty);
  281.         }
  282.         $TypeSejour 8;
  283.         
  284.         // DEBUG: Log avant envoi email
  285.         error_log("🔔 AVANT ENVOI EMAIL - Sejour ID: " $sejour->getId() . ", Email: " $accomp->getReponseemail());
  286.         
  287.         $UserService->EnvoyerEmailAcommpatActivationNewMail($sejour$accomp);
  288.     
  289.         error_log("🔔 APRÈS ENVOI EMAIL");
  290.        
  291.         $session $request->getSession();
  292.         $session->set('Sejour'$sejour->getId());
  293.         //$this->redirectToRoute('app_back_Acommpa');
  294.         return new JsonResponse(["idSejour" => $sejour->getId()]);
  295.     }
  296.     //inscription du parent 
  297.     /**
  298.      * @Route("/Parent/register", name="parent_register",methods={"POST","GET"})
  299.      */
  300.     public function registerparent(Request $request)
  301.     {
  302.         $UserService $this->UserService;
  303.         //
  304.         $nom $request->get("nomparent");
  305.         $prenom $request->get('prenomparent');
  306.         $mailparent $request->get("mailprent");
  307.         $numtel $request->get("numtel");
  308.         $passwordparent $request->get("passwordparent");
  309.         $confirmpassword $request->get("confirmpassword");
  310.         $notifsms $request->get("sms");
  311.         $notifmail $request->get('mailnotif');
  312.         if ($confirmpassword != $passwordparent) {
  313.             return new JsonResponse('erorpasswordconfirm');
  314.         }
  315.         $role "ROLE_PARENT";
  316.         $verification $UserService->verifmailold($mailparent);
  317.         //var_dump($verification);
  318.         if ($verification == NULL) {
  319.             $accomp $UserService->creationNewParent($nom$prenom$mailparent$numtel$role$passwordparent$notifsms$notifmail);
  320.             return new JsonResponse('done');
  321.         } else {
  322.             return new JsonResponse('eror');
  323.         }
  324.     }
  325.     /**
  326.      * @Route("/Accueil5sur5/5sur5", name="sur5")
  327.      */
  328.     public function sur5()
  329.     {
  330.         $produit $this->typeProduiteService;
  331.         $liste $produit->produitlistType();
  332.         //dd($liste);
  333.         return $this->render('Accueil/5sur5.html.twig', [
  334.             'produit' => $liste,
  335.         ]);
  336.     }
  337.     /**
  338.      * @Route("/Parent/Accueil5sur5/5sur5", name="5sur5Parent")
  339.      */
  340.     public function sur5Parent()
  341.     {
  342.         $produit $this->typeProduiteService;
  343.         $liste $produit->produitlistType();
  344.         //dd($liste);
  345.         return $this->render('Accueil/5sur5.html.twig', [
  346.             'produit' => $liste,
  347.         ]);
  348.     }
  349.     /**
  350.      * @Route("/Accueil5sur5/album/{id}", name="album")
  351.      */
  352.     public function produitlist($id)
  353.     {
  354.         $produit $this->typeProduiteService;
  355.         $liste $produit->produitlistType();
  356.         $produit $id;
  357.         //dd($liste);
  358.         return $this->render('Accueil/album.html.twig', [
  359.             'produit' => $liste,
  360.             'showArt' => $produit,
  361.         ]);
  362.     }
  363.     /**
  364.      * @Route("/Parent/Accueil5sur5/album/{id}", name="albumParent")
  365.      */
  366.     public function produitlistParent($id)
  367.     {
  368.         $produit $this->typeProduiteService;
  369.         $liste $produit->produitlistType();
  370.         // dd($liste);
  371.         $produit $id;
  372.         return $this->render('Accueil/album.html.twig', [
  373.             'produit' => $liste,
  374.             'showArt' => $produit,
  375.         ]);
  376.     }
  377. /**
  378.      * @Route("/Accueil5sur5/Boutique_Souvenirs", name="boutique5sur5_Souvenir")
  379.      */
  380.     public function boutique5sur5()
  381.     {
  382.        $produit $this->typeProduiteService;
  383.         $liste $produit->produitlistTypeConditionnement();
  384.       
  385.      
  386.         return $this->render('Accueil/boutique_5sur5.html.twig', [
  387.          
  388.         
  389.             'produit' => $liste,
  390.             
  391.         ]);
  392.     }
  393.     /**
  394.      * @Route("/Accueil5sur5/AlaUne", name="AlaUne")
  395.      */
  396.     public function AlaUne()
  397.     {
  398.         $blogsbolt $this->blogService;
  399.         $list $blogsbolt->allblog();
  400.         //dd($list);
  401.         return $this->render('Accueil/AlaUne.html.twig', ['list' => $list]);
  402.     }
  403.     /**
  404.      * @Route("/Parent/Accueil5sur5/AlaUne", name="AlaUneParent")
  405.      */
  406.     public function AlaUneParent()
  407.     {
  408.         $blogsbolt $this->blogService;
  409.         $list $blogsbolt->allblog();
  410.         //dd($list);
  411.         return $this->render('Accueil/AlaUneParent.html.twig', ['list' => $list]);
  412.     }
  413.     /**
  414.      * @Route("/Accueil5sur5/DetailsAlaUne/{id}", name="DetailsAlaUne")
  415.      */
  416.     public function DetailsAlaUne($id)
  417.     {
  418.         $blo $this->blogService;
  419.         $blog $blo->myblog($id);
  420.         return $this->render('Accueil/DetailsAlaUne.html.twig', ['blog' => $blog]);
  421.     }
  422.     /**
  423.      * @Route("/ServiceClient", name="ServiceClient")
  424.      * */
  425.     public function ServiceClient()
  426.     {
  427.         $produit $this->typeProduiteService;
  428.         $liste $produit->produitlistType();
  429.         // dd($liste);
  430.         return $this->render('Accueil/ServiceClient.html.twig', [
  431.             'produit' => $liste,
  432.         ]);
  433.     }
  434.     /**
  435.      * @Route("/Besoindaide", name="Besoindaide")
  436.      */
  437.     public function Besoindaide(): Response
  438.     {
  439.         $produit $this->typeProduiteService;
  440.         $liste $produit->produitlistType();
  441.         // dd($liste);
  442.         return $this->render('Accueil/Besoindaide.html.twig', [
  443.             'produit' => $liste,
  444.         ]);
  445.     }
  446.     /**
  447.      * @Route("/Mentionlegale", name="Mentionlegale")
  448.      */
  449.     public function Mentionlegale()
  450.     {
  451.         return $this->render('Accueil/mentionlegal.html.twig', []);
  452.     }
  453.      /**
  454.      * @Route("/Mentions_legales", name="Mentions_legales")
  455.      */
  456.     public function Mentions_legales()
  457.     {
  458.         return $this->render('Accueil/mentionlegal.html.twig', []);
  459.     }
  460.        /**
  461.      * @Route("/Conditons_generales", name="Conditons_generales")
  462.      */
  463.     public function Conditons_generales()
  464.     {
  465.         return $this->render('Accueil/Condition.html.twig', []);
  466.     }
  467.     /**
  468.      * @Route("/Conditongeneral", name="Conditongeneral")
  469.      */
  470.     public function Conditongeneral()
  471.     {
  472.         return $this->render('Accueil/Condition.html.twig', []);
  473.     }
  474.     /**
  475.      * @Route("/Politique", name="Politique")
  476.      */
  477.     public function Politique()
  478.     {
  479.         return $this->render('Accueil/politique.html.twig', []);
  480.     }
  481.     /**
  482.      * @Route("/unsubscribe-user", name="unsubscribe_user")
  483.      */
  484.     public function unsubscribeUser(Request $requestEntityManagerInterface $em): Response
  485.     {
  486.         $email $request->query->get('email');
  487.         
  488.         if (!$email) {
  489.             return $this->render('unsubscribe/error.html.twig', [
  490.                 'message' => 'Email manquant'
  491.             ]);
  492.         }
  493.         $user $em->getRepository(User::class)->findOneBy(['email' => $email]);
  494.         if (!$user) {
  495.             return $this->render('unsubscribe/error.html.twig', [
  496.                 'message' => 'Utilisateur non trouvé'
  497.             ]);
  498.         }
  499.         $user->setShowpubprod('unsuscribe');
  500.         $em->flush();
  501.         return $this->render('unsubscribe/success.html.twig', [
  502.             'email' => $email
  503.         ]);
  504.     }
  505.     /**
  506.      * @Route("/contact", name="app_contact", methods={"POST"})
  507.      */
  508.     public function processContactForm(Request $request): Response
  509.     {
  510.         try {
  511.             // Récupérer les données du formulaire (support des anciens et nouveaux noms)
  512.             $name $request->request->get('name') ?: $request->request->get('fullname');
  513.             $organization $request->request->get('organization') ?: $request->request->get('org');
  514.             $email $request->request->get('email');
  515.             $telephone $request->request->get('telephone') ?: $request->request->get('phone');
  516.             $sejoursCount $request->request->get('sejours_count') ?: $request->request->get('sejours');
  517.             $message $request->request->get('message''');
  518.             $topic $request->request->get('topic''contact');
  519.             $objet $request->request->get('objet''contact');
  520.             $pack $request->request->get('pack''');
  521.             $consent $request->request->get('consent');
  522.             
  523.             // Support ancien format avec 'subject'
  524.             $subject $request->request->get('subject');
  525.             // Validation des données
  526.             if (empty($name) || empty($email) || empty($organization) || empty($consent)) {
  527.                 return new JsonResponse([
  528.                     'success' => false,
  529.                     'message' => 'Tous les champs obligatoires doivent être remplis (nom, email, établissement, consentement).'
  530.                 ], 400);
  531.             }
  532.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  533.                 return new JsonResponse([
  534.                     'success' => false,
  535.                     'message' => 'L\'adresse email n\'est pas valide.'
  536.                 ], 400);
  537.             }
  538.             // Préparer le sujet selon le type de demande
  539.             if (empty($subject)) {
  540.                 $currentDate = new \DateTime();
  541.                 if ($objet === 'expert') {
  542.                     $subject 'Demande expert_' $currentDate->format('d/m/Y');
  543.                 } elseif ($objet === 'demo' || $topic === 'demo') {
  544.                     $subject 'Demande demo_' $currentDate->format('d/m/Y');
  545.                 } else {
  546.                 $subject 'Nouveau message de contact - 5sur5séjour';
  547.                 }
  548.             }
  549.             // Créer l'email
  550.             $emailContent = (new TemplatedEmail())
  551.                 ->from(new Address('info@5sur5sejour.com''5sur5 Séjour'))
  552.                 ->to(new Address('ramzi.benlarbi@gmail.com''Ramzi Benlarbi'))
  553.                 ->addCc(new Address('yousra.tlich@gmail.com''Yousra Tlich'))
  554.                 ->addCc(new Address('partenariat@5sur5sejour.com''Partenariat 5sur5séjour'))
  555.                 ->subject($subject)
  556.                 ->htmlTemplate('emails/contact_form.html.twig')
  557.                 ->context([
  558.                     'name' => $name,
  559.                     'organization' => $organization,
  560.                     'email' => $email,
  561.                     'telephone' => $telephone,
  562.                     'sejours_count' => $sejoursCount,
  563.                     'subject' => $subject,
  564.                     'message' => $message,
  565.                     'topic' => $topic,
  566.                     'objet' => $objet,
  567.                     'pack' => $pack,
  568.                     'date' => new \DateTime()
  569.                 ]);
  570.             // Envoyer l'email
  571.             $this->mailer->send($emailContent);
  572.             // Logger le succès
  573.             $this->logger->info('Email de contact envoyé avec succès', [
  574.                 'from' => $email,
  575.                 'name' => $name,
  576.                 'subject' => $subject
  577.             ]);
  578.             return new JsonResponse([
  579.                 'success' => true,
  580.                 'message' => 'Votre message a été envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.'
  581.             ]);
  582.         } catch (\Exception $e) {
  583.             // Logger l'erreur
  584.             $this->logger->error('Erreur lors de l\'envoi de l\'email de contact', [
  585.                 'error' => $e->getMessage(),
  586.                 'trace' => $e->getTraceAsString()
  587.             ]);
  588.             return new JsonResponse([
  589.                 'success' => false,
  590.                 'message' => 'Une erreur est survenue lors de l\'envoi du message. Veuillez réessayer plus tard.'
  591.             ], 500);
  592.         }
  593.     }
  594.     /**
  595.      * @Route("/contact/demo", name="app_contact_demo", methods={"POST"})
  596.      */
  597.     public function processDemoForm(Request $request): Response
  598.     {
  599.         try {
  600.             // Récupérer les données du formulaire de démo
  601.             $fullname $request->request->get('fullname');
  602.             $org $request->request->get('org');
  603.             $email $request->request->get('email');
  604.             $phone $request->request->get('phone');
  605.             $message $request->request->get('message');
  606.             $topic $request->request->get('topic');
  607.             $pack $request->request->get('pack');
  608.             $consent $request->request->get('consent');
  609.             // Validation des données
  610.             if (empty($fullname) || empty($org) || empty($email) || empty($consent)) {
  611.                 return new JsonResponse([
  612.                     'success' => false,
  613.                     'message' => 'Tous les champs obligatoires doivent être remplis et le consentement accepté.'
  614.                 ], 400);
  615.             }
  616.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  617.                 return new JsonResponse([
  618.                     'success' => false,
  619.                     'message' => 'L\'adresse email n\'est pas valide.'
  620.                 ], 400);
  621.             }
  622.             // Préparer le sujet avec la date
  623.             $currentDate = new \DateTime();
  624.             $subject 'Demande demo_' $currentDate->format('d/m/Y');
  625.             // Créer l'email pour la demande de démo
  626.             $emailContent = (new TemplatedEmail())
  627.                 ->from(new Address('info@5sur5sejour.com''5sur5 Séjour'))
  628.                 ->to(new Address('ramzi.benlarbi@gmail.com''Ramzi Benlarbi'))
  629.                 ->addCc(new Address('yousra.tlich@gmail.com''Yousra Tlich'))
  630.                 ->addCc(new Address('partenariat@5sur5sejour.com''Partenariat 5sur5séjour'))
  631.                 ->subject($subject)
  632.                 ->htmlTemplate('emails/demo_request.html.twig')
  633.                 ->context([
  634.                     'fullname' => $fullname,
  635.                     'org' => $org,
  636.                     'email' => $email,
  637.                     'phone' => $phone,
  638.                     'message' => $message,
  639.                     'topic' => $topic,
  640.                     'pack' => $pack,
  641.                     'date' => $currentDate
  642.                 ]);
  643.             // Envoyer l'email
  644.             $this->mailer->send($emailContent);
  645.             // Logger le succès
  646.             $this->logger->info('Email de demande de démo envoyé avec succès', [
  647.                 'from' => $email,
  648.                 'fullname' => $fullname,
  649.                 'org' => $org,
  650.                 'topic' => $topic
  651.             ]);
  652.             return new JsonResponse([
  653.                 'success' => true,
  654.                 'message' => 'Votre demande de démo a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
  655.             ]);
  656.         } catch (\Exception $e) {
  657.             // Logger l'erreur
  658.             $this->logger->error('Erreur lors de l\'envoi de l\'email de demande de démo', [
  659.                 'error' => $e->getMessage(),
  660.                 'trace' => $e->getTraceAsString()
  661.             ]);
  662.             return new JsonResponse([
  663.                 'success' => false,
  664.                 'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
  665.             ], 500);
  666.         }
  667.     }
  668.     /**
  669.      * @Route("/Accueil5sur5/Pack_Annuel_Partenaires", name="pack_annuel_partenaires")
  670.      */
  671.     public function packAnnuelPartenaires()
  672.     {
  673.         return $this->render('Accueil/pack_annuel_partenaires.html.twig');
  674.     }
  675.     /**
  676.      * @Route("/Accueil5sur5/Pack_Access", name="pack_access")
  677.      * @Route("/Accueil5sur5/Pack_Decouverte", name="pack_decouverte")
  678.      */
  679.     public function packAccess()
  680.     {
  681.         return $this->render('Accueil/pack_access.html.twig');
  682.     }
  683.     /**
  684.      * @Route("/Accueil5sur5/Pack_Serenite", name="pack_serenite")
  685.      */
  686.     public function packSerenite()
  687.     {
  688.         return $this->render('Accueil/pack_serenite.html.twig');
  689.     }
  690.     /**
  691.      * @Route("/checkout/pack/{pack}", name="checkout_pack", defaults={"pack"="serenite"})
  692.      */
  693.     public function checkoutPack(string $pack)
  694.     {
  695.         // Configuration des packs
  696.         $packsConfig = [
  697.             'decouverte' => [
  698.                 'id' => 'decouverte',
  699.                 'name' => 'Pack Découverte',
  700.                 'subtitle' => 'Abonnement annuel',
  701.                 'price' => 290,
  702.                 'price_ht' => '290 € HT',
  703.                 'onboarding' => 'Inclus',
  704.                 'vocal_price' => '+5 € / séjour',
  705.                 'features' => [
  706.                     'Séjours illimités toute l\'année',
  707.                     'Multi-sites pour une équipe',
  708.                     'Reporting mensuel & facturation',
  709.                     'Support prioritaire individuel'
  710.                 ],
  711.                 'info' => 'Plusieurs séjours par an ? Tarif dégressif automatique !'
  712.             ],
  713.             'serenite' => [
  714.                 'id' => 'serenite',
  715.                 'name' => 'Pack Sérénité',
  716.                 'subtitle' => 'Abonnement annuel',
  717.                 'price' => 490,
  718.                 'price_ht' => '490 € HT',
  719.                 'onboarding' => 'Inclus',
  720.                 'vocal_price' => '+5 € / séjour',
  721.                 'features' => [
  722.                     'Séjours illimités toute l\'année',
  723.                     'Multi-sites pour une équipe',
  724.                     'Reporting mensuel & facturation',
  725.                     'Support prioritaire individuel'
  726.                 ],
  727.                 'info' => 'Plusieurs séjours par an ? Tarif dégressif automatique !'
  728.             ],
  729.             'pro_illimite' => [
  730.                 'id' => 'pro_illimite',
  731.                 'name' => 'Pack Pro Illimité',
  732.                 'subtitle' => 'Abonnement annuel',
  733.                 'price' => 790,
  734.                 'price_ht' => '790 € HT',
  735.                 'onboarding' => 'Inclus + Formation avancée',
  736.                 'vocal_price' => 'Inclus',
  737.                 'features' => [
  738.                     'Séjours illimités toute l\'année',
  739.                     'Multi-sites pour une équipe',
  740.                     'Reporting mensuel & facturation',
  741.                     'Support prioritaire individuel',
  742.                     'Voix téléphonique illimitée',
  743.                     'Formation avancée de l\'équipe'
  744.                 ],
  745.                 'info' => 'Le meilleur rapport qualité/prix pour les structures avec plusieurs séjours !'
  746.             ]
  747.         ];
  748.         
  749.         // Vérifier que le pack existe
  750.         if (!isset($packsConfig[$pack])) {
  751.             throw $this->createNotFoundException('Pack non trouvé');
  752.         }
  753.         return $this->render('Accueil/checkout_pack.html.twig', [
  754.             'pack' => $pack,
  755.             'packConfig' => $packsConfig[$pack]
  756.         ]);
  757.     }
  758.     /**
  759.      * @Route("/checkout/process", name="checkout_process_pack", methods={"POST"})
  760.      */
  761.     public function checkoutProcessPack(Request $requestMailerInterface $mailer)
  762.     {
  763.         try {
  764.             error_log('🔍 CHECKOUT START - Processing form submission');
  765.             
  766.             // Récupération des données du formulaire
  767.             $data = [
  768.                 'pack_id' => $request->request->get('pack_id'),
  769.                 'payment_method' => $request->request->get('payment_method'),
  770.                 'company_name' => $request->request->get('company_name'),
  771.                 'company_type' => $request->request->get('company_type'),
  772.                 'siren' => $request->request->get('siren'),
  773.                 'phone' => $request->request->get('phone'),
  774.                 'address' => $request->request->get('address'),
  775.                 'postal_code' => $request->request->get('postal_code'),
  776.                 'city' => $request->request->get('city'),
  777.                 'first_name' => $request->request->get('first_name'),
  778.                 'last_name' => $request->request->get('last_name'),
  779.                 'email' => $request->request->get('email'),
  780.                 'role' => $request->request->get('role'),
  781.                 'need_onboarding' => $request->request->get('need_onboarding') ? true false,
  782.             ];
  783.             error_log('📋 Data received: ' json_encode($data));
  784.             // Validation
  785.             $requiredFields = ['pack_id''payment_method''company_name''company_type''phone'
  786.                               'address''postal_code''city''first_name''last_name''email''role'];
  787.             
  788.             foreach ($requiredFields as $field) {
  789.                 if (empty($data[$field])) {
  790.                     error_log('❌ Missing required field: ' $field);
  791.                     $this->addFlash('error''Tous les champs obligatoires doivent être remplis.');
  792.                     return $this->redirectToRoute('checkout_pack', ['pack' => $data['pack_id'] ?? 'serenite']);
  793.                 }
  794.             }
  795.             error_log('✅ Validation passed');
  796.             // Stocker en session AVANT d'envoyer les emails
  797.             $request->getSession()->set('checkout_data'$data);
  798.             error_log('💾 Data stored in session');
  799.             // Envoyer les emails de manière asynchrone (ne pas bloquer la requête)
  800.             try {
  801.                 error_log('📧 Attempting to send email to team...');
  802.                 
  803.                 // Envoyer email à l'équipe 5sur5
  804.                 $emailToTeam = (new TemplatedEmail())
  805.                     ->from(new Address('info@5sur5sejour.com''5sur5 Séjour'))
  806.                     ->to('contact@5sur5sejour.com')
  807.                     ->cc('yousra.tlich@gmail.com''ramzi.benlarbi@gmail.com')
  808.                     ->subject('Nouvelle souscription Pack ' strtoupper($data['pack_id']) . ' - ' $data['company_name'])
  809.                     ->htmlTemplate('emails/checkout_notification_team.html.twig')
  810.                     ->context([
  811.                         'data' => $data,
  812.                         'date' => new \DateTime()
  813.                     ]);
  814.                 $mailer->send($emailToTeam);
  815.                 error_log('✅ Email to team sent');
  816.                 // Envoyer email de confirmation au client
  817.                 $emailToClient = (new TemplatedEmail())
  818.                     ->from(new Address('info@5sur5sejour.com''5sur5 Séjour'))
  819.                     ->to($data['email'])
  820.                     ->subject('Confirmation de votre souscription - 5sur5 Séjour')
  821.                     ->htmlTemplate('emails/checkout_confirmation_client.html.twig')
  822.                     ->context([
  823.                         'data' => $data,
  824.                         'date' => new \DateTime()
  825.                     ]);
  826.                 $mailer->send($emailToClient);
  827.                 error_log('✅ Email to client sent');
  828.                 
  829.             } catch (\Exception $emailError) {
  830.                 // Log l'erreur mais ne bloque pas le processus
  831.                 error_log('⚠️ Email error (non-blocking): ' $emailError->getMessage());
  832.             }
  833.             // Redirection selon le mode de paiement
  834.             error_log('🔄 Redirecting to success page, method: ' $data['payment_method']);
  835.             
  836.             switch ($data['payment_method']) {
  837.                 case 'online':
  838.                     return $this->redirectToRoute('checkout_success', ['method' => 'online']);
  839.                     
  840.                 case 'transfer':
  841.                     return $this->redirectToRoute('checkout_success', ['method' => 'transfer']);
  842.                     
  843.                 case 'quote':
  844.                     return $this->redirectToRoute('checkout_success', ['method' => 'quote']);
  845.                     
  846.                 default:
  847.                     error_log('❌ Invalid payment method: ' $data['payment_method']);
  848.                     throw new \Exception('Mode de paiement invalide');
  849.             }
  850.         } catch (\Exception $e) {
  851.             error_log('❌ CHECKOUT ERROR: ' $e->getMessage());
  852.             error_log('Stack trace: ' $e->getTraceAsString());
  853.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer. Détail: ' $e->getMessage());
  854.             return $this->redirectToRoute('checkout_pack', ['pack' => $request->request->get('pack_id''serenite')]);
  855.         }
  856.     }
  857.     /**
  858.      * @Route("/checkout/success/{method}", name="checkout_success")
  859.      */
  860.     public function checkoutSuccess(Request $requeststring $method)
  861.     {
  862.         $data $request->getSession()->get('checkout_data');
  863.         
  864.         if (!$data) {
  865.             return $this->redirectToRoute('page_Accueil');
  866.         }
  867.         return $this->render('Accueil/checkout_success.html.twig', [
  868.             'data' => $data,
  869.             'method' => $method
  870.         ]);
  871.     }
  872.     /**
  873.      * @Route("/Accueil5sur5/Pack_Pro_Illimite", name="pack_pro_illimite")
  874.      */
  875.     public function packProIllimite()
  876.     {
  877.         return $this->render('Accueil/pack_pro_illimite.html.twig');
  878.     }
  879.     /**
  880.      * @Route("/bank-transfer-request", name="bank_transfer_request", methods={"POST"})
  881.      */
  882.     public function bankTransferRequest(Request $request): JsonResponse
  883.     {
  884.         try {
  885.             $fullname $request->request->get('rib_fullname');
  886.             $email $request->request->get('rib_email');
  887.             $phone $request->request->get('rib_phone');
  888.             $org $request->request->get('rib_org');
  889.             $message $request->request->get('rib_message');
  890.             // Validation basique
  891.             if (empty($fullname) || empty($email)) {
  892.                 return new JsonResponse([
  893.                     'success' => false,
  894.                     'message' => 'Le nom et l\'email sont obligatoires.'
  895.                 ], 400);
  896.             }
  897.             // Envoyer email à l'équipe
  898.             $email = (new TemplatedEmail())
  899.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  900.                 ->to('contact@5sur5sejour.fr')
  901.                 ->subject('Demande de RIB - ' $fullname)
  902.                 ->htmlTemplate('emails/bank_transfer_request_team.html.twig')
  903.                 ->context([
  904.                     'fullname' => $fullname,
  905.                     'email' => $email,
  906.                     'phone' => $phone,
  907.                     'org' => $org,
  908.                     'message' => $message
  909.                 ]);
  910.             $this->mailer->send($email);
  911.             // Email de confirmation au client
  912.             $clientEmail = (new TemplatedEmail())
  913.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  914.                 ->to($email)
  915.                 ->subject('Demande de RIB reçue - 5sur5 Séjour')
  916.                 ->htmlTemplate('emails/bank_transfer_request_client.html.twig')
  917.                 ->context([
  918.                     'fullname' => $fullname
  919.                 ]);
  920.             $this->mailer->send($clientEmail);
  921.             return new JsonResponse([
  922.                 'success' => true,
  923.                 'message' => 'Votre demande de RIB a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
  924.             ]);
  925.         } catch (\Exception $e) {
  926.             $this->logger->error('Erreur lors de l\'envoi de la demande de RIB', [
  927.                 'error' => $e->getMessage(),
  928.                 'trace' => $e->getTraceAsString()
  929.             ]);
  930.             return new JsonResponse([
  931.                 'success' => false,
  932.                 'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
  933.             ], 500);
  934.         }
  935.     }
  936.     /**
  937.      * @Route("/pack-request-submit", name="pack_request_submit", methods={"POST"})
  938.      */
  939.     public function packRequestSubmit(Request $request): JsonResponse
  940.     {
  941.         try {
  942.             $fullname $request->request->get('pack_fullname');
  943.             $email $request->request->get('pack_email');
  944.             $phone $request->request->get('pack_phone');
  945.             $org $request->request->get('pack_org');
  946.             $packType $request->request->get('pack_type');
  947.             $message $request->request->get('pack_message');
  948.             // Validation basique
  949.             if (empty($fullname) || empty($email) || empty($packType)) {
  950.                 return new JsonResponse([
  951.                     'success' => false,
  952.                     'message' => 'Le nom, l\'email et le type de pack sont obligatoires.'
  953.                 ], 400);
  954.             }
  955.             // Envoyer email à l'équipe
  956.             $email = (new TemplatedEmail())
  957.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  958.                 ->to('contact@5sur5sejour.fr')
  959.                 ->subject('Demande de Pack Partenaire - ' $fullname)
  960.                 ->htmlTemplate('emails/pack_request_team.html.twig')
  961.                 ->context([
  962.                     'fullname' => $fullname,
  963.                     'email' => $email,
  964.                     'phone' => $phone,
  965.                     'org' => $org,
  966.                     'packType' => $packType,
  967.                     'message' => $message
  968.                 ]);
  969.             $this->mailer->send($email);
  970.             // Email de confirmation au client
  971.             $clientEmail = (new TemplatedEmail())
  972.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  973.                 ->to($email)
  974.                 ->subject('Demande de Pack Partenaire reçue - 5sur5 Séjour')
  975.                 ->htmlTemplate('emails/pack_request_partner.html.twig')
  976.                 ->context([
  977.                     'fullname' => $fullname,
  978.                     'packType' => $packType
  979.                 ]);
  980.             $this->mailer->send($clientEmail);
  981.             return new JsonResponse([
  982.                 'success' => true,
  983.                 'message' => 'Votre demande de pack partenaire a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
  984.             ]);
  985.         } catch (\Exception $e) {
  986.             $this->logger->error('Erreur lors de l\'envoi de la demande de pack', [
  987.                 'error' => $e->getMessage(),
  988.                 'trace' => $e->getTraceAsString()
  989.             ]);
  990.             return new JsonResponse([
  991.                 'success' => false,
  992.                 'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
  993.             ], 500);
  994.         }
  995.     }
  996.     /**
  997.      * @Route("/checkout-create-session", name="checkout_create_session", methods={"POST"})
  998.      */
  999.     public function checkoutCreateSession(Request $request): JsonResponse
  1000.     {
  1001.         try {
  1002.             $company $request->request->get('company');
  1003.             $contactName $request->request->get('contact_name');
  1004.             $email $request->request->get('email');
  1005.             $phone $request->request->get('phone');
  1006.             $packType $request->request->get('pack_type');
  1007.             $address $request->request->get('address');
  1008.             $city $request->request->get('city');
  1009.             $postalCode $request->request->get('postal_code');
  1010.             $siret $request->request->get('siret');
  1011.             // Validation basique
  1012.             if (empty($company) || empty($contactName) || empty($email) || empty($packType)) {
  1013.                 return new JsonResponse([
  1014.                     'success' => false,
  1015.                     'message' => 'Les champs obligatoires doivent être remplis.'
  1016.                 ], 400);
  1017.             }
  1018.             // Envoyer email à l'équipe
  1019.             $email = (new TemplatedEmail())
  1020.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  1021.                 ->to('contact@5sur5sejour.fr')
  1022.                 ->subject('Nouvelle souscription en ligne - ' $company)
  1023.                 ->htmlTemplate('emails/checkout_request_team.html.twig')
  1024.                 ->context([
  1025.                     'company' => $company,
  1026.                     'contactName' => $contactName,
  1027.                     'email' => $email,
  1028.                     'phone' => $phone,
  1029.                     'packType' => $packType,
  1030.                     'address' => $address,
  1031.                     'city' => $city,
  1032.                     'postalCode' => $postalCode,
  1033.                     'siret' => $siret
  1034.                 ]);
  1035.             $this->mailer->send($email);
  1036.             // Email de confirmation au client
  1037.             $clientEmail = (new TemplatedEmail())
  1038.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  1039.                 ->to($email)
  1040.                 ->subject('Souscription reçue - 5sur5 Séjour')
  1041.                 ->htmlTemplate('emails/checkout_request_client.html.twig')
  1042.                 ->context([
  1043.                     'company' => $company,
  1044.                     'contactName' => $contactName,
  1045.                     'packType' => $packType
  1046.                 ]);
  1047.             $this->mailer->send($clientEmail);
  1048.             return new JsonResponse([
  1049.                 'success' => true,
  1050.                 'message' => 'Votre souscription a été enregistrée avec succès ! Nous vous recontacterons dans les 24 heures pour finaliser l\'activation.'
  1051.             ]);
  1052.         } catch (\Exception $e) {
  1053.             $this->logger->error('Erreur lors de l\'enregistrement de la souscription', [
  1054.                 'error' => $e->getMessage(),
  1055.                 'trace' => $e->getTraceAsString()
  1056.             ]);
  1057.             return new JsonResponse([
  1058.                 'success' => false,
  1059.                 'message' => 'Une erreur est survenue lors de l\'enregistrement. Veuillez réessayer plus tard.'
  1060.             ], 500);
  1061.         }
  1062.     }
  1063.     /**
  1064.      * @Route("/quote-request", name="quote_request", methods={"POST"})
  1065.      */
  1066.     public function quoteRequest(Request $request): JsonResponse
  1067.     {
  1068.         try {
  1069.             $orgType $request->request->get('org_type');
  1070.             $orgName $request->request->get('org_name');
  1071.             $contactName $request->request->get('contact_name');
  1072.             $email $request->request->get('email');
  1073.             $phone $request->request->get('phone');
  1074.             $packType $request->request->get('pack_type');
  1075.             $address $request->request->get('address');
  1076.             $city $request->request->get('city');
  1077.             $postalCode $request->request->get('postal_code');
  1078.             $message $request->request->get('message');
  1079.             // Validation basique
  1080.             if (empty($orgType) || empty($orgName) || empty($contactName) || empty($email) || empty($packType)) {
  1081.                 return new JsonResponse([
  1082.                     'success' => false,
  1083.                     'message' => 'Les champs obligatoires doivent être remplis.'
  1084.                 ], 400);
  1085.             }
  1086.             // Envoyer email à l'équipe
  1087.             $email = (new TemplatedEmail())
  1088.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  1089.                 ->to('contact@5sur5sejour.fr')
  1090.                 ->subject('Demande de devis - ' $orgName)
  1091.                 ->htmlTemplate('emails/quote_request_team.html.twig')
  1092.                 ->context([
  1093.                     'orgType' => $orgType,
  1094.                     'orgName' => $orgName,
  1095.                     'contactName' => $contactName,
  1096.                     'email' => $email,
  1097.                     'phone' => $phone,
  1098.                     'packType' => $packType,
  1099.                     'address' => $address,
  1100.                     'city' => $city,
  1101.                     'postalCode' => $postalCode,
  1102.                     'message' => $message
  1103.                 ]);
  1104.             $this->mailer->send($email);
  1105.             // Email de confirmation au client
  1106.             $clientEmail = (new TemplatedEmail())
  1107.                 ->from(new Address('noreply@5sur5sejour.fr''5sur5 Séjour'))
  1108.                 ->to($email)
  1109.                 ->subject('Demande de devis reçue - 5sur5 Séjour')
  1110.                 ->htmlTemplate('emails/quote_request_client.html.twig')
  1111.                 ->context([
  1112.                     'orgName' => $orgName,
  1113.                     'contactName' => $contactName,
  1114.                     'packType' => $packType
  1115.                 ]);
  1116.             $this->mailer->send($clientEmail);
  1117.             return new JsonResponse([
  1118.                 'success' => true,
  1119.                 'message' => 'Votre demande de devis a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
  1120.             ]);
  1121.         } catch (\Exception $e) {
  1122.             $this->logger->error('Erreur lors de l\'envoi de la demande de devis', [
  1123.                 'error' => $e->getMessage(),
  1124.                 'trace' => $e->getTraceAsString()
  1125.             ]);
  1126.             return new JsonResponse([
  1127.                 'success' => false,
  1128.                 'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
  1129.             ], 500);
  1130.         }
  1131.     }
  1132. }