<?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\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');
// Stocker en session AVANT d'envoyer les emails
$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']);
switch ($data['payment_method']) {
case 'online':
return $this->redirectToRoute('checkout_success', ['method' => 'online']);
case 'transfer':
return $this->redirectToRoute('checkout_success', ['method' => 'transfer']);
case 'quote':
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): JsonResponse
{
try {
$fullname = $request->request->get('rib_fullname');
$email = $request->request->get('rib_email');
$phone = $request->request->get('rib_phone');
$org = $request->request->get('rib_org');
$message = $request->request->get('rib_message');
// Validation basique
if (empty($fullname) || empty($email)) {
return new JsonResponse([
'success' => false,
'message' => 'Le nom et l\'email 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 RIB - ' . $fullname)
->htmlTemplate('emails/bank_transfer_request_team.html.twig')
->context([
'fullname' => $fullname,
'email' => $email,
'phone' => $phone,
'org' => $org,
'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 RIB reçue - 5sur5 Séjour')
->htmlTemplate('emails/bank_transfer_request_client.html.twig')
->context([
'fullname' => $fullname
]);
$this->mailer->send($clientEmail);
return new JsonResponse([
'success' => true,
'message' => 'Votre demande de RIB 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 RIB', [
'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("/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);
}
}
}