<?php
// src/Controller/AccueilController
/*
*
* Date de modification:16/05/2025
* Description:Controller LayoutAccueil 5sur5 Séjour
*
*/
namespace App\Controller;
use App\Entity\Fonctions;
use App\Entity\User;
use App\Entity\Ref;
use App\Entity\Commande;
use App\Entity\Typeproduit;
use App\Service\AttachementService;
use App\Service\BlogService;
use App\Service\EmailsCmdService;
use App\Service\SejourService;
use App\Service\SiteService;
use App\Service\TypeProduiteService;
use App\Service\UserService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Address;
use Psr\Log\LoggerInterface;
class AccueilController extends AbstractController
{
private $typeProduiteService;
private $siteService;
private $blogService;
private $UserService;
private $sejourService;
private $attachementService;
private $mailer;
private $logger;
private $emailsCmdService;
public function __construct(TypeProduiteService $typeProduiteService, SiteService $siteService, BlogService $blogService, UserService $UserService, SejourService $sejourService, AttachementService $attachementService, MailerInterface $mailer, LoggerInterface $logger, EmailsCmdService $emailsCmdService)
{
$this->typeProduiteService = $typeProduiteService;
$this->siteService = $siteService;
$this->blogService = $blogService;
$this->UserService = $UserService;
$this->sejourService = $sejourService;
$this->attachementService = $attachementService;
$this->mailer = $mailer;
$this->logger = $logger;
$this->emailsCmdService = $emailsCmdService;
}
/**
* @Route("/Accueil5sur5", name="layoutAccueil")
* */
public function layoutAccueil()
{
return $this->render('Accueil/layoutAccueil.html.twig');
}
/**
* @Route("/Accueil5sur5/header_layoutAccueil", name="header_layoutAccueil")
*/
public function header(Request $request): Response
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
$session = $request->getSession();
$Products = $session->get("Panier");
if ($Products == Null) {
$Products = [];
}
return $this->render('Accueil/header.html.twig', [
'produit' => $liste,
'Products' => $Products,
]);
}
/**
* @Route("/Accueil5sur5/header_Parent", name="header_Parent")
*/
public function header_Parent(Request $request): Response
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
$session = $request->getSession();
$Products = $session->get("Panier");
if ($Products == Null) {
$Products = [];
}
return $this->render('Accueil/headerParents.html.twig', [
'produit' => $liste,
'Products' => $Products,
]);
}
/**
* @Route("/Accueil5sur5/headerLogin", name="headerLogin")
*/
public function headerLogin(Request $request): Response
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
$session = $request->getSession();
$Products = $session->get("Panier");
if ($Products == Null) {
$Products = [];
}
return $this->render('Accueil/headerLogin.html.twig', [
'produit' => $liste,
'Products' => $Products,
]);
}
/**
* @Route("/", name="page_Accueil")
*/
public function PageAccueil()
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
$siteservice = $this->siteService;
$site = $siteservice->getActiveSite();
$list = $this->blogService->allblog();
//dd($list);
return $this->render('Accueil/PageAccueil.html.twig', ["site" => $site, 'list' => $list, 'produit' => $liste]);
}
/**
* @Route("/Parent/", name="Parent")
*/
public function Acceuil(Request $request)
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
$siteservice = $this->siteService;
$site = $siteservice->getActiveSite();
$list = $this->blogService->allblog();
$session = $request->getSession();
$Products = $session->get("Panier");
if ($Products == Null) {
$Products = [];
}
return $this->render('Accueil/PageAccueil.html.twig', ["site" => $site, 'list' => $list, 'produit' => $liste, 'Products' => $Products]);
}
/**
* @Route("/Accueil5sur5/footer_layoutAccueil", name="footer_layoutAccueil")
*/
public function footer()
{
return $this->render('Accueil/footer.html.twig');
}
/**
* @Route("/Accompagnateur/register", name="accomp_register",methods={"POST","GET"})
*/
public function register(Request $request)
{
// Forcer type_user=EF si la requête vient de la page écoles publiques
$referer = $request->headers->get('referer');
if ($referer && strpos($referer, '/ecoles-publiques/creer') !== false) {
$request->request->set('type_user', 'EF');
error_log("🏫 Création depuis page écoles publiques → Force type_user=EF");
}
ini_set("max_execution_time", -1);
ini_set('memory_limit', '-1');
$em = $this->getDoctrine()->getManager();
$UserService = $this->UserService;
$SejourService = $this->sejourService;
$AttachementService = $this->attachementService;
$nom = $request->get("nom_acc");
$prenom = $request->get('prenom_acc');
$etablisment = $request->get("etablisment");
$fonction = $request->get("fonction");
$EntityFonction = $em->getRepository(Fonctions::class)->find($fonction);
if ($EntityFonction) {
$nameFonction = $EntityFonction->getName();
} else {
$nameFonction = "";
}
$adressetablisment = $request->get("adressetablisment");
// prix et reverse
$prixcnxparent = 2.90;
$prixcnxpartenaire = 0;
$reversecnxpart = 0;
$reverseventepart = 0;
$phoneacc = $request->get("phone_acc");
$mail = $request->get("email");
$password = $request->get("password");
$role = "ROLE_ACC";
$themSejour = $request->get('theme_sejour');
$adressSejour = $request->get("adress_sejour");
$codePostal = $request->get("codePostal");
$dateDebut = $request->get("date_debut_sejour");
$FinSejour = $request->get("date_fin_sejour");
$AgeDugroupe = $request->get("age_dugroupe_sejour");
$NbEnfant = $request->get("NbEnfant");
$pays = $request->get("pays");
$ville = $request->get("ville");
$CODEpOSTALetablisment = $request->get("CODEpOSTALetablisment");
$villeetablisment = $request->get("villeetablisment");
// Récupérer le type de séjour depuis le formulaire (EP, EF, PF)
$type_user = $request->get("type_user");
if (!$type_user) {
$type_user = "EP"; // Par défaut: École Publique (parents paient)
}
// Mapper le type_user vers le type de séjour et connpay
// Logique du code séjour : [Type][Pay][Timestamp]
// Type: E=École, P=Partenaire, C=CSE
// Pay: P=Payant (parents), F=Free (gratuit/structure)
switch ($type_user) {
case 'EF':
// École Française (page dédiée) = École + Gratuit
$type = "ECOLES/AUTRES";
$connpay = 0; // Gratuit (0 = Free)
break;
case 'PF':
// Partenaire Financé (structure prend en charge) = Partenaire + Structure finance
$type = "PARTENAIRES/VOYAGISTES";
$connpay = 0; // Structure finance (0 = Free)
break;
case 'EP':
default:
// École Publique (parents paient par défaut) = École + Parents paient
$type = "ECOLES/AUTRES";
$connpay = 1; // Parents paient (1 = Payant)
break;
}
error_log("🔍 Type reçu du formulaire: type_user=$type_user → Type séjour=$type, connpay=$connpay");
$bytes = random_bytes(5);
$passAcommpa = bin2hex($bytes);
if ($NbEnfant) {
$NbEnfant = $NbEnfant;
} else {
$NbEnfant = 0;
}
$dateSJoue = new \Datetime();
$Milliseconde = $dateSJoue->format('u');
$annes = $dateSJoue->format('y');
$joours = $dateSJoue->format('d');
$joours = $dateSJoue->format('t');
$emailaccf = "Acompa" . $annes . $joours . $Milliseconde . "@fictif.com";
//CREATION ACCOMPAGNATEUR
$accomp = $UserService->creationNewAcommpa($nom, $prenom, $etablisment, $nameFonction, $adressetablisment, $phoneacc, $emailaccf, $role, $passAcommpa, $mail);
$accomp->setIdFonction($EntityFonction);
$em->persist($accomp);
$em->flush();
//CREATION PARTENAIRE
$part = $em->getRepository(User::class)->VerifierAddresseEmailPartenaire($mail, 'ROLE_PARTENAIRE');
if (is_null($part)) {
$part = $UserService->creationNewUser($nom, $prenom, $etablisment, $nameFonction, $adressetablisment, $phoneacc, $mail, $passAcommpa, "ROLE_PARTENAIRE");
$part->setIdFonction($EntityFonction);
$em->persist($part);
$em->flush();
}
//CREATION ETABLISSEMENT + PARTENAIRE
$Etablisment = $UserService->creationNewEtablisment($part, $nom, $prenom, $etablisment, $fonction, $adressetablisment, $phoneacc, $mail, "ROLE_PARTENAIRE", $password, $prixcnxparent, $prixcnxpartenaire, $reversecnxpart, $reverseventepart);
if ($CODEpOSTALetablisment == "") {
$CODEpOSTALetablisment = null;
}
$Etablisment->setCodepostaleatb($CODEpOSTALetablisment);
$Etablisment->setVille($villeetablisment);
$em->persist($Etablisment);
$em->flush();
//CREATION SEJOUR ACCOM + PARTENAIRE + ETABILSSEMENT
// Ne pas surcharger $connpay via la fonction (ex: VIP)
// Le code séjour doit refléter exclusivement le choix utilisateur (type_user)
$sejour = $SejourService->CreationNouveauSejourParAccompagnateur($themSejour, $adressSejour, $dateDebut, $FinSejour, $AgeDugroupe, $type, $NbEnfant, $connpay, $pays, $ville, $prixcnxparent, $prixcnxpartenaire, $reversecnxpart, $reverseventepart);
$sejour->setCodePostal(intval($codePostal));
$SejourService->affecterAccompaniateur($sejour, $accomp);
$SejourService->affecterPartenaire($sejour, $part);
$SejourService->affecteretablisment($sejour, $Etablisment);
$em->persist($sejour);
$em->flush();
//AFFECTAION LOGO TO USER PARTENAIRE ADN ACCOMPAGNATEUR
if ($request->request->has('path')) {
$ty = "logo séjour";
$AttachementService->creationLogoSejour($accomp, $request->get('path'), $ty);
$AttachementService->creationLogoSejour($part, $request->get('path'), $ty);
}
$TypeSejour = 8;
// DEBUG: Log avant envoi email
error_log("🔔 AVANT ENVOI EMAIL - Sejour ID: " . $sejour->getId() . ", Email: " . $accomp->getReponseemail());
$UserService->EnvoyerEmailAcommpatActivationNewMail($sejour, $accomp);
error_log("🔔 APRÈS ENVOI EMAIL");
$session = $request->getSession();
$session->set('Sejour', $sejour->getId());
//$this->redirectToRoute('app_back_Acommpa');
return new JsonResponse(["idSejour" => $sejour->getId()]);
}
//inscription du parent
/**
* @Route("/Parent/register", name="parent_register",methods={"POST","GET"})
*/
public function registerparent(Request $request)
{
$UserService = $this->UserService;
//
$nom = $request->get("nomparent");
$prenom = $request->get('prenomparent');
$mailparent = $request->get("mailprent");
$numtel = $request->get("numtel");
$passwordparent = $request->get("passwordparent");
$confirmpassword = $request->get("confirmpassword");
$notifsms = $request->get("sms");
$notifmail = $request->get('mailnotif');
if ($confirmpassword != $passwordparent) {
return new JsonResponse('erorpasswordconfirm');
}
$role = "ROLE_PARENT";
$verification = $UserService->verifmailold($mailparent);
//var_dump($verification);
if ($verification == NULL) {
$accomp = $UserService->creationNewParent($nom, $prenom, $mailparent, $numtel, $role, $passwordparent, $notifsms, $notifmail);
return new JsonResponse('done');
} else {
return new JsonResponse('eror');
}
}
/**
* @Route("/Accueil5sur5/5sur5", name="sur5")
*/
public function sur5()
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
//dd($liste);
return $this->render('Accueil/5sur5.html.twig', [
'produit' => $liste,
]);
}
/**
* @Route("/Parent/Accueil5sur5/5sur5", name="5sur5Parent")
*/
public function sur5Parent()
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
//dd($liste);
return $this->render('Accueil/5sur5.html.twig', [
'produit' => $liste,
]);
}
/**
* @Route("/Accueil5sur5/album/{id}", name="album")
*/
public function produitlist($id)
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
$produit = $id;
//dd($liste);
return $this->render('Accueil/album.html.twig', [
'produit' => $liste,
'showArt' => $produit,
]);
}
/**
* @Route("/Parent/Accueil5sur5/album/{id}", name="albumParent")
*/
public function produitlistParent($id)
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
$produit = $id;
return $this->render('Accueil/album.html.twig', [
'produit' => $liste,
'showArt' => $produit,
]);
}
/**
* @Route("/Accueil5sur5/Boutique_Souvenirs", name="boutique5sur5_Souvenir")
*/
public function boutique5sur5()
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistTypeConditionnement();
return $this->render('Accueil/boutique_5sur5.html.twig', [
'produit' => $liste,
]);
}
/**
* @Route("/Accueil5sur5/AlaUne", name="AlaUne")
*/
public function AlaUne()
{
$blogsbolt = $this->blogService;
$list = $blogsbolt->allblog();
//dd($list);
return $this->render('Accueil/AlaUne.html.twig', ['list' => $list]);
}
/**
* @Route("/Parent/Accueil5sur5/AlaUne", name="AlaUneParent")
*/
public function AlaUneParent()
{
$blogsbolt = $this->blogService;
$list = $blogsbolt->allblog();
//dd($list);
return $this->render('Accueil/AlaUneParent.html.twig', ['list' => $list]);
}
/**
* @Route("/Accueil5sur5/DetailsAlaUne/{id}", name="DetailsAlaUne")
*/
public function DetailsAlaUne($id)
{
$blo = $this->blogService;
$blog = $blo->myblog($id);
return $this->render('Accueil/DetailsAlaUne.html.twig', ['blog' => $blog]);
}
/**
* @Route("/ServiceClient", name="ServiceClient")
* */
public function ServiceClient()
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
return $this->render('Accueil/ServiceClient.html.twig', [
'produit' => $liste,
]);
}
/**
* @Route("/Besoindaide", name="Besoindaide")
*/
public function Besoindaide(): Response
{
$produit = $this->typeProduiteService;
$liste = $produit->produitlistType();
// dd($liste);
return $this->render('Accueil/Besoindaide.html.twig', [
'produit' => $liste,
]);
}
/**
* @Route("/Mentionlegale", name="Mentionlegale")
*/
public function Mentionlegale()
{
return $this->render('Accueil/mentionlegal.html.twig', []);
}
/**
* @Route("/Mentions_legales", name="Mentions_legales")
*/
public function Mentions_legales()
{
return $this->render('Accueil/mentionlegal.html.twig', []);
}
/**
* @Route("/Conditons_generales", name="Conditons_generales")
*/
public function Conditons_generales()
{
return $this->render('Accueil/Condition.html.twig', []);
}
/**
* @Route("/Conditongeneral", name="Conditongeneral")
*/
public function Conditongeneral()
{
return $this->render('Accueil/Condition.html.twig', []);
}
/**
* @Route("/Politique", name="Politique")
*/
public function Politique()
{
return $this->render('Accueil/politique.html.twig', []);
}
/**
* @Route("/unsubscribe-user", name="unsubscribe_user")
*/
public function unsubscribeUser(Request $request, EntityManagerInterface $em): Response
{
$email = $request->query->get('email');
if (!$email) {
return $this->render('unsubscribe/error.html.twig', [
'message' => 'Email manquant'
]);
}
$user = $em->getRepository(User::class)->findOneBy(['email' => $email]);
if (!$user) {
return $this->render('unsubscribe/error.html.twig', [
'message' => 'Utilisateur non trouvé'
]);
}
$user->setShowpubprod('unsuscribe');
$em->flush();
return $this->render('unsubscribe/success.html.twig', [
'email' => $email
]);
}
/**
* @Route("/contact", name="app_contact", methods={"POST"})
*/
public function processContactForm(Request $request): Response
{
try {
// Récupérer les données du formulaire (support des anciens et nouveaux noms)
$name = $request->request->get('name') ?: $request->request->get('fullname');
$organization = $request->request->get('organization') ?: $request->request->get('org');
$email = $request->request->get('email');
$telephone = $request->request->get('telephone') ?: $request->request->get('phone');
$sejoursCount = $request->request->get('sejours_count') ?: $request->request->get('sejours');
$message = $request->request->get('message', '');
$topic = $request->request->get('topic', 'contact');
$objet = $request->request->get('objet', 'contact');
$pack = $request->request->get('pack', '');
$consent = $request->request->get('consent');
// Support ancien format avec 'subject'
$subject = $request->request->get('subject');
// Validation des données
if (empty($name) || empty($email) || empty($organization) || empty($consent)) {
return new JsonResponse([
'success' => false,
'message' => 'Tous les champs obligatoires doivent être remplis (nom, email, établissement, consentement).'
], 400);
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return new JsonResponse([
'success' => false,
'message' => 'L\'adresse email n\'est pas valide.'
], 400);
}
// Préparer le sujet selon le type de demande
if (empty($subject)) {
$currentDate = new \DateTime();
if ($objet === 'expert') {
$subject = 'Demande expert_' . $currentDate->format('d/m/Y');
} elseif ($objet === 'demo' || $topic === 'demo') {
$subject = 'Demande demo_' . $currentDate->format('d/m/Y');
} else {
$subject = 'Nouveau message de contact - 5sur5séjour';
}
}
// Créer l'email
$emailContent = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to(new Address('ramzi.benlarbi@gmail.com', 'Ramzi Benlarbi'))
->addCc(new Address('yousra.tlich@gmail.com', 'Yousra Tlich'))
->addCc(new Address('partenariat@5sur5sejour.com', 'Partenariat 5sur5séjour'))
->subject($subject)
->htmlTemplate('emails/contact_form.html.twig')
->context([
'name' => $name,
'organization' => $organization,
'email' => $email,
'telephone' => $telephone,
'sejours_count' => $sejoursCount,
'subject' => $subject,
'message' => $message,
'topic' => $topic,
'objet' => $objet,
'pack' => $pack,
'date' => new \DateTime()
]);
// Envoyer l'email
$this->mailer->send($emailContent);
// Logger le succès
$this->logger->info('Email de contact envoyé avec succès', [
'from' => $email,
'name' => $name,
'subject' => $subject
]);
return new JsonResponse([
'success' => true,
'message' => 'Votre message a été envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.'
]);
} catch (\Exception $e) {
// Logger l'erreur
$this->logger->error('Erreur lors de l\'envoi de l\'email de contact', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Une erreur est survenue lors de l\'envoi du message. Veuillez réessayer plus tard.'
], 500);
}
}
/**
* @Route("/contact/demo", name="app_contact_demo", methods={"POST"})
*/
public function processDemoForm(Request $request): Response
{
try {
// Récupérer les données du formulaire de démo
$fullname = $request->request->get('fullname');
$org = $request->request->get('org');
$email = $request->request->get('email');
$phone = $request->request->get('phone');
$message = $request->request->get('message');
$topic = $request->request->get('topic');
$pack = $request->request->get('pack');
$consent = $request->request->get('consent');
// Validation des données
if (empty($fullname) || empty($org) || empty($email) || empty($consent)) {
return new JsonResponse([
'success' => false,
'message' => 'Tous les champs obligatoires doivent être remplis et le consentement accepté.'
], 400);
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return new JsonResponse([
'success' => false,
'message' => 'L\'adresse email n\'est pas valide.'
], 400);
}
// Préparer le sujet avec la date
$currentDate = new \DateTime();
$subject = 'Demande demo_' . $currentDate->format('d/m/Y');
// Créer l'email pour la demande de démo
$emailContent = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to(new Address('ramzi.benlarbi@gmail.com', 'Ramzi Benlarbi'))
->addCc(new Address('yousra.tlich@gmail.com', 'Yousra Tlich'))
->addCc(new Address('partenariat@5sur5sejour.com', 'Partenariat 5sur5séjour'))
->subject($subject)
->htmlTemplate('emails/demo_request.html.twig')
->context([
'fullname' => $fullname,
'org' => $org,
'email' => $email,
'phone' => $phone,
'message' => $message,
'topic' => $topic,
'pack' => $pack,
'date' => $currentDate
]);
// Envoyer l'email
$this->mailer->send($emailContent);
// Logger le succès
$this->logger->info('Email de demande de démo envoyé avec succès', [
'from' => $email,
'fullname' => $fullname,
'org' => $org,
'topic' => $topic
]);
return new JsonResponse([
'success' => true,
'message' => 'Votre demande de démo a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
]);
} catch (\Exception $e) {
// Logger l'erreur
$this->logger->error('Erreur lors de l\'envoi de l\'email de demande de démo', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
], 500);
}
}
/**
* @Route("/Accueil5sur5/Pack_Annuel_Partenaires", name="pack_annuel_partenaires")
*/
public function packAnnuelPartenaires()
{
return $this->render('Accueil/pack_annuel_partenaires.html.twig');
}
/**
* @Route("/Accueil5sur5/Pack_Access", name="pack_access")
* @Route("/Accueil5sur5/Pack_Decouverte", name="pack_decouverte")
*/
public function packAccess()
{
return $this->render('Accueil/pack_access.html.twig');
}
/**
* @Route("/Accueil5sur5/Pack_Serenite", name="pack_serenite")
*/
public function packSerenite()
{
return $this->render('Accueil/pack_serenite.html.twig');
}
/**
* @Route("/checkout/pack/{pack}", name="checkout_pack", defaults={"pack"="serenite"})
*/
public function checkoutPack(string $pack)
{
// Configuration des packs
$packsConfig = [
'decouverte' => [
'id' => 'decouverte',
'name' => 'Pack Découverte',
'subtitle' => 'Abonnement annuel',
'price' => 290,
'price_ht' => '290 € HT',
'onboarding' => 'Inclus',
'vocal_price' => '+5 € / séjour',
'features' => [
'Séjours illimités toute l\'année',
'Multi-sites pour une équipe',
'Reporting mensuel & facturation',
'Support prioritaire individuel'
],
'info' => 'Plusieurs séjours par an ? Tarif dégressif automatique !'
],
'serenite' => [
'id' => 'serenite',
'name' => 'Pack Sérénité',
'subtitle' => 'Abonnement annuel',
'price' => 490,
'price_ht' => '490 € HT',
'onboarding' => 'Inclus',
'vocal_price' => '+5 € / séjour',
'features' => [
'Séjours illimités toute l\'année',
'Multi-sites pour une équipe',
'Reporting mensuel & facturation',
'Support prioritaire individuel'
],
'info' => 'Plusieurs séjours par an ? Tarif dégressif automatique !'
],
'pro_illimite' => [
'id' => 'pro_illimite',
'name' => 'Pack Pro Illimité',
'subtitle' => 'Abonnement annuel',
'price' => 790,
'price_ht' => '790 € HT',
'onboarding' => 'Inclus + Formation avancée',
'vocal_price' => 'Inclus',
'features' => [
'Séjours illimités toute l\'année',
'Multi-sites pour une équipe',
'Reporting mensuel & facturation',
'Support prioritaire individuel',
'Voix téléphonique illimitée',
'Formation avancée de l\'équipe'
],
'info' => 'Le meilleur rapport qualité/prix pour les structures avec plusieurs séjours !'
]
];
// Vérifier que le pack existe
if (!isset($packsConfig[$pack])) {
throw $this->createNotFoundException('Pack non trouvé');
}
return $this->render('Accueil/checkout_pack.html.twig', [
'pack' => $pack,
'packConfig' => $packsConfig[$pack]
]);
}
/**
* @Route("/checkout/process", name="checkout_process_pack", methods={"POST"})
*/
public function checkoutProcessPack(Request $request, MailerInterface $mailer)
{
try {
error_log('🔍 CHECKOUT START - Processing form submission');
// Récupération des données du formulaire
$data = [
'pack_id' => $request->request->get('pack_id'),
'payment_method' => $request->request->get('payment_method'),
'company_name' => $request->request->get('company_name'),
'company_type' => $request->request->get('company_type'),
'siren' => $request->request->get('siren'),
'phone' => $request->request->get('phone'),
'address' => $request->request->get('address'),
'postal_code' => $request->request->get('postal_code'),
'city' => $request->request->get('city'),
'first_name' => $request->request->get('first_name'),
'last_name' => $request->request->get('last_name'),
'email' => $request->request->get('email'),
'role' => $request->request->get('role'),
'need_onboarding' => $request->request->get('need_onboarding') ? true : false,
];
error_log('📋 Data received: ' . json_encode($data));
// Validation
$requiredFields = ['pack_id', 'payment_method', 'company_name', 'company_type', 'phone',
'address', 'postal_code', 'city', 'first_name', 'last_name', 'email', 'role'];
foreach ($requiredFields as $field) {
if (empty($data[$field])) {
error_log('❌ Missing required field: ' . $field);
$this->addFlash('error', 'Tous les champs obligatoires doivent être remplis.');
return $this->redirectToRoute('checkout_pack', ['pack' => $data['pack_id'] ?? 'serenite']);
}
}
error_log('✅ Validation passed');
// ==================== CRÉER LA COMMANDE EN BASE DE DONNÉES ====================
$em = $this->getDoctrine()->getManager();
$commande = null;
// Si c'est un paiement RIB ou Devis, créer la commande maintenant
if (in_array($data['payment_method'], ['transfer', 'rib', 'bank_transfer', 'quote', 'devis'])) {
try {
error_log('📦 Création commande pack pour: ' . $data['pack_id']);
// Créer ou récupérer l'utilisateur
$userRepository = $em->getRepository(User::class);
$user = $userRepository->findOneBy(['email' => $data['email']]);
if (!$user) {
$user = new User();
$user->setEmail($data['email']);
$user->setNom($data['last_name']);
$user->setPrenom($data['first_name']);
$user->setTelephone($data['phone'] ?? '');
$user->setNometablisment($data['company_name'] ?? '');
$mdpTemp = substr(md5(uniqid()), 0, 8);
$user->setPassword(password_hash($mdpTemp, PASSWORD_BCRYPT));
$user->setRoles(['ROLE_PARTENAIRE']);
$user->setStatut(1);
$em->persist($user);
$em->flush();
error_log('✅ Utilisateur créé: ' . $user->getEmail());
}
// Déterminer les montants
$packPrices = [
'serenite' => ['ht' => 490, 'ttc' => 588],
'decouverte' => ['ht' => 290, 'ttc' => 348],
];
$prices = $packPrices[$data['pack_id']] ?? $packPrices['serenite'];
// Récupérer le statut "en attente"
$statutEnAttente = $em->getRepository(Ref::class)->find(1);
if (!$statutEnAttente) {
$statutEnAttente = new Ref();
$statutEnAttente->setLibiller('En attente');
$em->persist($statutEnAttente);
$em->flush();
}
// Créer la commande
$commande = new Commande();
$commande->setIdUser($user);
$commande->setStatut($statutEnAttente);
$commande->setMontantht($prices['ht']);
$commande->setMontantrth($prices['ttc']);
$commande->setMontanenv($prices['ttc']);
$commande->setTva(20);
$commande->setDateCreateCommande(new \DateTime());
$commande->setDateExpidition((new \DateTime())->modify('+12 months'));
$commande->setPeriode('annuel');
$commande->setPaymentType('rib');
$commande->setNumComande(time());
$em->persist($commande);
$em->flush();
error_log('✅ Commande créée: ID=' . $commande->getId() . ' N°' . $commande->getNumComande());
} catch (\Exception $e) {
error_log('❌ Erreur création commande: ' . $e->getMessage());
// Continuer quand même pour envoyer les emails
}
}
// Stocker en session AVANT d'envoyer les emails
$data['commande_id'] = $commande ? $commande->getId() : null;
$data['commande_numero'] = $commande ? $commande->getNumComande() : null;
$request->getSession()->set('checkout_data', $data);
error_log('💾 Data stored in session');
// Envoyer les emails de manière asynchrone (ne pas bloquer la requête)
try {
error_log('📧 Attempting to send email to team...');
// Envoyer email à l'équipe 5sur5
$emailToTeam = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to('contact@5sur5sejour.com')
->cc('yousra.tlich@gmail.com', 'ramzi.benlarbi@gmail.com')
->subject('Nouvelle souscription Pack ' . strtoupper($data['pack_id']) . ' - ' . $data['company_name'])
->htmlTemplate('emails/checkout_notification_team.html.twig')
->context([
'data' => $data,
'date' => new \DateTime()
]);
$mailer->send($emailToTeam);
error_log('✅ Email to team sent');
// Envoyer email de confirmation au client
$emailToClient = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to($data['email'])
->subject('Confirmation de votre souscription - 5sur5 Séjour')
->htmlTemplate('emails/checkout_confirmation_client.html.twig')
->context([
'data' => $data,
'date' => new \DateTime()
]);
$mailer->send($emailToClient);
error_log('✅ Email to client sent');
} catch (\Exception $emailError) {
// Log l'erreur mais ne bloque pas le processus
error_log('⚠️ Email error (non-blocking): ' . $emailError->getMessage());
}
// Redirection selon le mode de paiement
error_log('🔄 Redirecting to success page, method: ' . $data['payment_method']);
// 🧪 MODE TEST : Le paiement en ligne est automatiquement en succès
error_log('🧪 [MODE TEST] Paiement en ligne simulé comme réussi');
switch ($data['payment_method']) {
case 'online':
// Simulation de paiement en ligne réussi (mode test)
error_log('✅ [TEST] Paiement en ligne simulé - SUCCÈS automatique');
$this->addFlash('success', '✅ Paiement réussi ! (Mode Test - Paiement simulé)');
return $this->redirectToRoute('checkout_success', ['method' => 'online']);
case 'transfer':
$this->addFlash('info', 'Demande de virement enregistrée. Vous recevrez les coordonnées bancaires par email.');
return $this->redirectToRoute('checkout_success', ['method' => 'transfer']);
case 'quote':
$this->addFlash('info', 'Demande de devis enregistrée. Vous recevrez le devis par email.');
return $this->redirectToRoute('checkout_success', ['method' => 'quote']);
default:
error_log('❌ Invalid payment method: ' . $data['payment_method']);
throw new \Exception('Mode de paiement invalide');
}
} catch (\Exception $e) {
error_log('❌ CHECKOUT ERROR: ' . $e->getMessage());
error_log('Stack trace: ' . $e->getTraceAsString());
$this->addFlash('error', 'Une erreur est survenue. Veuillez réessayer. Détail: ' . $e->getMessage());
return $this->redirectToRoute('checkout_pack', ['pack' => $request->request->get('pack_id', 'serenite')]);
}
}
/**
* @Route("/checkout/success/{method}", name="checkout_success")
*/
public function checkoutSuccess(Request $request, string $method)
{
$data = $request->getSession()->get('checkout_data');
if (!$data) {
return $this->redirectToRoute('page_Accueil');
}
return $this->render('Accueil/checkout_success.html.twig', [
'data' => $data,
'method' => $method
]);
}
/**
* @Route("/Accueil5sur5/Pack_Pro_Illimite", name="pack_pro_illimite")
*/
public function packProIllimite()
{
return $this->render('Accueil/pack_pro_illimite.html.twig');
}
/**
* @Route("/bank-transfer-request", name="bank_transfer_request", methods={"POST"})
*/
public function bankTransferRequest(Request $request, EntityManagerInterface $em): JsonResponse
{
try {
$this->logger->info('🔍 Début de la demande de RIB');
// Accepter les deux formats de paramètres
$fullname = $request->request->get('full_name') ?: $request->request->get('rib_fullname');
$emailUser = $request->request->get('billing_email') ?: $request->request->get('rib_email');
$phone = $request->request->get('phone') ?: $request->request->get('rib_phone');
$org = $request->request->get('company') ?: $request->request->get('rib_org');
$message = $request->request->get('message') ?: $request->request->get('rib_message');
// Paramètres spécifiques au pack
$packId = $request->request->get('pack_id');
$participants = $request->request->get('participants');
$totalAmount = $request->request->get('total_amount');
$startDate = $request->request->get('start_date');
$endDate = $request->request->get('end_date');
$theme = $request->request->get('theme');
$accompagnateur = $request->request->get('accompagnateur');
$this->logger->info('📝 Données reçues', [
'fullname' => $fullname,
'email' => $emailUser,
'pack_id' => $packId,
'participants' => $participants,
'total_amount' => $totalAmount,
'theme' => $theme,
'start_date' => $startDate,
'end_date' => $endDate
]);
// Validation basique
if (empty($fullname) || empty($emailUser)) {
return new JsonResponse([
'success' => false,
'message' => 'Le nom et l\'email sont obligatoires.'
], 400);
}
// Générer un numéro de demande unique
$requestNumber = 'RIB-' . date('Ymd') . '-' . strtoupper(substr(md5(uniqid()), 0, 6));
$this->logger->info('🔢 Numéro de demande généré: ' . $requestNumber);
// Créer ou récupérer l'utilisateur accompagnateur
try {
$this->logger->info('👤 Recherche utilisateur: ' . $emailUser);
$userRepository = $em->getRepository(User::class);
$user = $userRepository->findOneBy(['email' => $emailUser]);
if (!$user) {
$this->logger->info('➕ Création nouvel utilisateur');
$user = new User();
$user->setEmail($emailUser);
$user->setNom($fullname);
$user->setPrenom('');
$user->setTelephone($phone ?? '');
$user->setNometablisment($org ?? '');
// Générer un mot de passe temporaire
$mdpTemp = substr(md5(uniqid()), 0, 8);
$user->setPassword(password_hash($mdpTemp, PASSWORD_BCRYPT));
$user->setRoles(['ROLE_ACCOMPAGNATEUR']);
$user->setStatut(1);
$em->persist($user);
$em->flush();
$this->logger->info('✅ Utilisateur créé: ID=' . $user->getId());
} else {
$this->logger->info('✅ Utilisateur existant trouvé: ID=' . $user->getId());
}
} catch (\Exception $userError) {
$this->logger->error('❌ Erreur création utilisateur', [
'error' => $userError->getMessage(),
'trace' => $userError->getTraceAsString()
]);
throw $userError;
}
// Déterminer si c'est un pack annuel (serenite/decouverte) ou un séjour simple
$isPack = in_array($packId, ['serenite', 'decouverte', 'Pack Sérénité', 'Pack Découverte']);
$this->logger->info('🔍 Détection type de demande', [
'pack_id' => $packId,
'isPack' => $isPack ? 'OUI' : 'NON',
'test_array' => ['serenite', 'decouverte', 'Pack Sérénité', 'Pack Découverte']
]);
$sejour = null;
$commande = null;
if ($isPack) {
// ==================== CRÉATION COMMANDE PACK ====================
try {
$this->logger->info('📦 Création commande pack: ' . $packId);
// Mapping pack → labeletype
$packNames = [
'decouverte' => 'Pack Découverte',
'serenite' => 'Pack Sérénité',
'Pack Découverte' => 'Pack Découverte',
'Pack Sérénité' => 'Pack Sérénité'
];
$packLabel = $packNames[$packId] ?? 'Pack Sérénité';
// Récupérer le produit en BDD
$typeProduit = $em->getRepository(Typeproduit::class)->findOneBy([
'labeletype' => $packLabel
]);
// Récupérer le statut "en attente"
$statutEnAttente = $em->getRepository(Ref::class)->find(1);
if (!$statutEnAttente) {
$statutEnAttente = new Ref();
$statutEnAttente->setLibiller('En attente');
$em->persist($statutEnAttente);
$em->flush();
}
// Déterminer les montants du pack
$defaultsByPack = [
'Pack Sérénité' => ['ht' => 490, 'ttc' => 588],
'Pack Découverte' => ['ht' => 290, 'ttc' => 348],
];
$montantHt = $typeProduit ? $typeProduit->getMontantHt() : null;
$montantTtc = $typeProduit ? $typeProduit->getMontantTTC() : null;
if (empty($montantHt) || empty($montantTtc)) {
$fallback = $defaultsByPack[$packLabel] ?? $defaultsByPack['Pack Sérénité'];
$montantHt = $montantHt ?: $fallback['ht'];
$montantTtc = $montantTtc ?: $fallback['ttc'];
}
// Créer la commande avec statut "en attente"
$commande = new Commande();
$commande->setIdUser($user);
$commande->setStatut($statutEnAttente);
$commande->setMontantht($montantHt);
$commande->setMontantrth($montantTtc);
$commande->setMontanenv($montantTtc);
$commande->setTva(20);
// Dates d'abonnement: début maintenant, fin dans 12 mois
$startDateTime = new \DateTime();
$endDateTime = (clone $startDateTime)->modify('+12 months');
$commande->setDateCreateCommande($startDateTime);
$commande->setDateExpidition($endDateTime);
$commande->setPeriode('annuel');
$commande->setPaymentType('rib');
$commande->setNumComande(time());
$this->logger->info('💾 Avant persist/flush commande');
$em->persist($commande);
$this->logger->info('💾 Après persist, avant flush');
$em->flush();
$this->logger->info('💾 Après flush');
$commandeId = $commande->getId();
$this->logger->info('✅ Commande pack créée: ID=' . $commandeId . ' Montant=' . $montantTtc . '€');
// Vérifier que la commande existe vraiment en BDD
$commandeVerif = $em->getRepository(Commande::class)->find($commandeId);
if ($commandeVerif) {
$this->logger->info('✅ VÉRIFICATION: Commande #' . $commandeId . ' existe bien en BDD');
} else {
$this->logger->error('❌ VÉRIFICATION: Commande #' . $commandeId . ' N\'EXISTE PAS en BDD !');
}
} catch (\Exception $commandeError) {
$this->logger->error('❌ Erreur création commande pack', [
'error' => $commandeError->getMessage(),
'trace' => $commandeError->getTraceAsString()
]);
// NE PAS continuer si la création échoue
return new JsonResponse([
'success' => false,
'message' => 'Erreur lors de la création de la commande: ' . $commandeError->getMessage()
], 500);
}
} else {
// ==================== CRÉATION SÉJOUR SIMPLE PF ====================
try {
$this->logger->info('🏕️ Création du séjour simple PF');
$dateDebut = $startDate ?: date('Y-m-d');
$dateFin = $endDate ?: date('Y-m-d', strtotime($dateDebut . ' +7 days'));
$themeTexte = $theme ?: 'Séjour';
$nbParticipants = $participants ?: 10;
$sejour = $this->sejourService->CreationNouveauSejour(
$themeTexte, // themSejour
'', // adressSejour
'', // codePostal
$dateDebut, // dateDebut
$dateFin, // FinSejour
'6-10 ans', // AgeDugroupe
'PF', // type (Partenaire Financé)
$user->getId(), // userid
$nbParticipants, // NbEnfant
0, // connpay (0 = non payé)
'France', // pays
'', // ville
null, // prixcnxparent
null, // prixcnxpartenaire
null, // reversecnxpart
null // reverseventepart
);
// Récupérer ou créer le statut "attente_paiement"
$statutAttentePaiement = $em->getRepository(Ref::class)->findOneBy(['libiller' => 'attente_paiement']);
if (!$statutAttentePaiement) {
$this->logger->warning('⚠️ Statut "attente_paiement" non trouvé');
} else {
$sejour->setStatut($statutAttentePaiement);
$em->flush();
$this->logger->info('✅ Statut défini: ' . $statutAttentePaiement->getLibiller());
}
$this->logger->info('✅ Séjour créé: Code=' . $sejour->getCodeSejour() . ' ID=' . $sejour->getId());
} catch (\Exception $sejourError) {
$this->logger->error('❌ Erreur création séjour', [
'error' => $sejourError->getMessage(),
'trace' => $sejourError->getTraceAsString()
]);
throw $sejourError;
}
}
// Envoyer email à l'équipe avec les informations complètes
$emailContext = [
'fullname' => $fullname,
'user_email' => $emailUser,
'phone' => $phone,
'org' => $org,
'message' => $message,
'pack_id' => $packId,
'participants' => $participants,
'total_amount' => $totalAmount,
'start_date' => $startDate,
'end_date' => $endDate,
'theme' => $theme,
'accompagnateur' => $accompagnateur,
'request_number' => $requestNumber,
];
// Ajouter les infos spécifiques selon le type
if ($isPack && $commande) {
$emailContext['commande_id'] = $commande->getId();
$emailContext['commande_numero'] = $commande->getNumComande();
$emailContext['montant_ht'] = $commande->getMontantht();
$emailContext['montant_ttc'] = $commande->getMontantrth();
$emailContext['is_pack'] = true;
} else if ($sejour) {
$emailContext['code_sejour'] = $sejour->getCodeSejour();
$emailContext['sejour_id'] = $sejour->getId();
$emailContext['is_pack'] = false;
}
$subjectPrefix = $isPack ? '📦 Demande RIB Pack Annuel' : '🏦 Demande RIB Paiement Séjour Simple';
// Ajouter le numéro de commande au sujet si c'est un pack
$subjectSuffix = $requestNumber;
if ($isPack && $commande) {
$subjectSuffix .= ' - Commande #' . $commande->getNumComande();
}
$teamEmail = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to('partenariat@5sur5sejour.com')
->cc('ramzi.benlarbi@gmail.com', 'yousra.tlich@gmail.com')
->subject($subjectPrefix . ' - ' . $org . ' - ' . $subjectSuffix)
->htmlTemplate('emails/bank_transfer_request_team.html.twig')
->context($emailContext);
$this->mailer->send($teamEmail);
// Email de confirmation au client avec RIB
$ribDetails = [
'iban' => 'FR76 1010 7001 5300 0123 4567 890',
'bic' => 'BREDFRPPXXX',
'beneficiaire' => '5SUR5 SEJOUR',
'reference' => $requestNumber
];
// Préparer le contexte email client
$clientEmailContext = [
'fullname' => $fullname,
'request_number' => $requestNumber,
'rib' => $ribDetails,
'pack_id' => $packId,
'participants' => $participants,
'total_amount' => $totalAmount,
'start_date' => $startDate,
'end_date' => $endDate,
'theme' => $theme,
'accompagnateur' => $accompagnateur,
'org' => $org,
];
// Ajouter les infos spécifiques
if ($isPack && $commande) {
$clientEmailContext['commande_id'] = $commande->getId();
$clientEmailContext['commande_numero'] = $commande->getNumComande();
$clientEmailContext['montant_ht'] = $commande->getMontantht();
$clientEmailContext['montant_ttc'] = $commande->getMontantrth();
$clientEmailContext['is_pack'] = true;
} else if ($sejour) {
$clientEmailContext['code_sejour'] = $sejour->getCodeSejour();
$clientEmailContext['sejour_id'] = $sejour->getId();
$clientEmailContext['is_pack'] = false;
}
$clientEmail = (new TemplatedEmail())
->from(new Address('info@5sur5sejour.com', '5sur5 Séjour'))
->to($emailUser)
->subject('RIB et Facture Proforma - ' . $requestNumber . ' - 5sur5 Séjour')
->htmlTemplate('emails/bank_transfer_request_client.html.twig')
->context($clientEmailContext);
$this->mailer->send($clientEmail);
return new JsonResponse([
'success' => true,
'message' => 'Votre demande a été envoyée avec succès ! Vous allez recevoir le RIB et la facture proforma par email.',
'requestNumber' => $requestNumber
]);
} catch (\Exception $e) {
$this->logger->error('Erreur lors de l\'envoi de la demande de RIB', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Erreur: ' . $e->getMessage(),
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
], 500);
}
}
/**
* @Route("/pack-request-submit", name="pack_request_submit", methods={"POST"})
*/
public function packRequestSubmit(Request $request): JsonResponse
{
try {
$fullname = $request->request->get('pack_fullname');
$email = $request->request->get('pack_email');
$phone = $request->request->get('pack_phone');
$org = $request->request->get('pack_org');
$packType = $request->request->get('pack_type');
$message = $request->request->get('pack_message');
// Validation basique
if (empty($fullname) || empty($email) || empty($packType)) {
return new JsonResponse([
'success' => false,
'message' => 'Le nom, l\'email et le type de pack sont obligatoires.'
], 400);
}
// Envoyer email à l'équipe
$email = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to('contact@5sur5sejour.fr')
->subject('Demande de Pack Partenaire - ' . $fullname)
->htmlTemplate('emails/pack_request_team.html.twig')
->context([
'fullname' => $fullname,
'email' => $email,
'phone' => $phone,
'org' => $org,
'packType' => $packType,
'message' => $message
]);
$this->mailer->send($email);
// Email de confirmation au client
$clientEmail = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to($email)
->subject('Demande de Pack Partenaire reçue - 5sur5 Séjour')
->htmlTemplate('emails/pack_request_partner.html.twig')
->context([
'fullname' => $fullname,
'packType' => $packType
]);
$this->mailer->send($clientEmail);
return new JsonResponse([
'success' => true,
'message' => 'Votre demande de pack partenaire a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
]);
} catch (\Exception $e) {
$this->logger->error('Erreur lors de l\'envoi de la demande de pack', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
], 500);
}
}
/**
* @Route("/checkout-create-session", name="checkout_create_session", methods={"POST"})
*/
public function checkoutCreateSession(Request $request): JsonResponse
{
try {
$company = $request->request->get('company');
$contactName = $request->request->get('contact_name');
$email = $request->request->get('email');
$phone = $request->request->get('phone');
$packType = $request->request->get('pack_type');
$address = $request->request->get('address');
$city = $request->request->get('city');
$postalCode = $request->request->get('postal_code');
$siret = $request->request->get('siret');
// Validation basique
if (empty($company) || empty($contactName) || empty($email) || empty($packType)) {
return new JsonResponse([
'success' => false,
'message' => 'Les champs obligatoires doivent être remplis.'
], 400);
}
// Envoyer email à l'équipe
$email = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to('contact@5sur5sejour.fr')
->subject('Nouvelle souscription en ligne - ' . $company)
->htmlTemplate('emails/checkout_request_team.html.twig')
->context([
'company' => $company,
'contactName' => $contactName,
'email' => $email,
'phone' => $phone,
'packType' => $packType,
'address' => $address,
'city' => $city,
'postalCode' => $postalCode,
'siret' => $siret
]);
$this->mailer->send($email);
// Email de confirmation au client
$clientEmail = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to($email)
->subject('Souscription reçue - 5sur5 Séjour')
->htmlTemplate('emails/checkout_request_client.html.twig')
->context([
'company' => $company,
'contactName' => $contactName,
'packType' => $packType
]);
$this->mailer->send($clientEmail);
return new JsonResponse([
'success' => true,
'message' => 'Votre souscription a été enregistrée avec succès ! Nous vous recontacterons dans les 24 heures pour finaliser l\'activation.'
]);
} catch (\Exception $e) {
$this->logger->error('Erreur lors de l\'enregistrement de la souscription', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Une erreur est survenue lors de l\'enregistrement. Veuillez réessayer plus tard.'
], 500);
}
}
/**
* @Route("/quote-request", name="quote_request", methods={"POST"})
*/
public function quoteRequest(Request $request): JsonResponse
{
try {
$orgType = $request->request->get('org_type');
$orgName = $request->request->get('org_name');
$contactName = $request->request->get('contact_name');
$email = $request->request->get('email');
$phone = $request->request->get('phone');
$packType = $request->request->get('pack_type');
$address = $request->request->get('address');
$city = $request->request->get('city');
$postalCode = $request->request->get('postal_code');
$message = $request->request->get('message');
// Validation basique
if (empty($orgType) || empty($orgName) || empty($contactName) || empty($email) || empty($packType)) {
return new JsonResponse([
'success' => false,
'message' => 'Les champs obligatoires doivent être remplis.'
], 400);
}
// Envoyer email à l'équipe
$email = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to('contact@5sur5sejour.fr')
->subject('Demande de devis - ' . $orgName)
->htmlTemplate('emails/quote_request_team.html.twig')
->context([
'orgType' => $orgType,
'orgName' => $orgName,
'contactName' => $contactName,
'email' => $email,
'phone' => $phone,
'packType' => $packType,
'address' => $address,
'city' => $city,
'postalCode' => $postalCode,
'message' => $message
]);
$this->mailer->send($email);
// Email de confirmation au client
$clientEmail = (new TemplatedEmail())
->from(new Address('noreply@5sur5sejour.fr', '5sur5 Séjour'))
->to($email)
->subject('Demande de devis reçue - 5sur5 Séjour')
->htmlTemplate('emails/quote_request_client.html.twig')
->context([
'orgName' => $orgName,
'contactName' => $contactName,
'packType' => $packType
]);
$this->mailer->send($clientEmail);
return new JsonResponse([
'success' => true,
'message' => 'Votre demande de devis a été envoyée avec succès ! Nous vous recontacterons dans les 24 heures.'
]);
} catch (\Exception $e) {
$this->logger->error('Erreur lors de l\'envoi de la demande de devis', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return new JsonResponse([
'success' => false,
'message' => 'Une erreur est survenue lors de l\'envoi de la demande. Veuillez réessayer plus tard.'
], 500);
}
}
}