<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ArticlesRepository;
use App\Repository\CategoriesEvenementsRepository;
use App\Repository\EvenementsRepository;
use App\Repository\ReservationsRepository;
use App\Repository\PartenairesRepository;
use App\Repository\UserRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use App\Entity\Reservations;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Datetime;
use App\Entity\Evenements;
use App\Form\EvenementsType;
use Mailjet\Api\Client;
use Mailjet\Resources;
use Stripe\Stripe;
use Stripe\Exception\CardException;
use Stripe\Exception\ApiErrorException; // Importer l'exception ApiErrorException
use Doctrine\ORM\EntityManagerInterface;
class DefaultController extends AbstractController
{
/**
* @Route("/", name="app_default")
*/
public function index(Request $request, ArticlesRepository $articlesRepository,EvenementsRepository $evenements): Response
{
$press = $articlesRepository->findBy(array('Pages'=>5),array('Date'=>'desc'),3);
$event = $evenements->findByExampleField();
return $this->render('default/index.html.twig', [
'articles' => $articlesRepository->findBy(['Pages'=>1]),
'press'=>$press,
'events'=>$event
]);
}
/**
* @Route("/a-propos", name="aPropos")
*/
public function aPropos(Request $request, ArticlesRepository $articlesRepository): Response
{
return $this->render('default/apropos.html.twig', [
'articles' => $articlesRepository->findBy(['Pages'=>2]),
'team' => $articlesRepository->findBy(['Pages'=>4]),
]);
}
/**
* @Route("/activites", name="activites")
*/
public function activites(PaginatorInterface $paginator, Request $request, ArticlesRepository $articlesRepository): Response
{
$yActive ='';
if(isset($_GET['years']))
{
$articles = $articlesRepository->findOneBySomeField($_GET['years'],6);
//Filter par année
$yActive =$_GET['years'];
}
else
{
$articles = $articlesRepository->findBy(array('Pages'=>6),array('Date'=>'desc'));
}
$articles2 = $articlesRepository->findBy(array('Pages'=>6),array('Date'=>'desc'));
$years = array();
foreach($articles2 as $res)
{
$y = $res->getDate()->format('Y');
array_push($years,$y);
}
$years = array_unique($years);
// J'importe le module paginator dans la variable pagination
$pagination = $paginator->paginate(
$articles, /* Je charge la liste de mes données */ $request->query->getInt('page', 1), /* je lui informe qu'il doit
commencer à la page 1*/
12 /* nombre de résultat par page */
);
return $this->render('default/activites.html.twig', [
'articles'=>$pagination,
'articles2'=>$articles,
'years'=>$years,
'yActive'=>$yActive
]);
}
/**
* @Route("/activiteDetail/{id}", name="activiteDetail")
*
*/
public function activiteDetail(PaginatorInterface $paginator, ArticlesRepository $articlesRepository, Request $request, CategoriesEvenementsRepository $categoriesRepository,EvenementsRepository $evenements, $id): Response
{
$article = $articlesRepository->findOneById($id);
return $this->render('default/activiteDetail.html.twig', [
'article'=>$article,
]);
}
/**
* @Route("/commissions", name="commissions")
*/
public function commissions(Request $request, ArticlesRepository $articlesRepository): Response
{
return $this->render('default/commissions.html.twig', [
'articles' => $articlesRepository->findBy(['Pages'=>3],['id'=>'desc']),
]);
}
/**
* @Route("/calendrier", name="calendrier")
*/
public function calendrier(PaginatorInterface $paginator, Request $request, CategoriesEvenementsRepository $categoriesRepository,EvenementsRepository $evenements): Response
{
$cActive ='';
if(isset($_GET['categorie']))
{
$cActive =$_GET['categorie'];
$articles = $evenements->findBy(array('CategoriesEvenements'=>$_GET['categorie'],'Archive'=>0),array('Date'=>'asc'));
}
else
{
$articles = $evenements->findBy(array('Archive'=>0),array('Date'=>'asc'));
}
// J'importe le module paginator dans la variable pagination
$pagination = $paginator->paginate(
$articles, /* Je charge la liste de mes données */ $request->query->getInt('page', 1), /* je lui informe qu'il doit
commencer à la page 1*/
10 /* nombre de résultat par page */
);
return $this->render('default/calendrier.html.twig', [
'categories'=>$categoriesRepository->findBy(array(),array('Ordre'=>'asc')),
'evenements'=>$pagination,
'cActive'=>$cActive,
'articles'=>$articles
]);
}
/**
* @Route("/calendrier/{id}", name="calendrierDetail")
*
*/
public function calendrierDetail(PaginatorInterface $paginator, ReservationsRepository $reservations, Request $request, CategoriesEvenementsRepository $categoriesRepository,EvenementsRepository $evenements, $id): Response
{
$pDispo = 0;
$abo = 0;
$event = $evenements->findOneById($id);
if($event->getBilleterie() == 1)
{
// CALCUL DES PLACES A LUNITE
$resa = $reservations->findBy(array('Evenements'=>$event));
$pRes = 0;
foreach($resa as $res)
{
$pRes = $pRes + $res->getNbPlaces();
}
// CALCUL DES PLACES POUR L'ABO
$resa = $reservations->findBy(array('Evenements'=>$event->getEvenements()));
foreach($resa as $res)
{
$pRes = $pRes + $res->getNbPlaces();
}
$pDispo = $event->getNbPlaces() - $pRes;
if(!empty($event->getEvenements()))
{
if($event->getCategoriesEvenements()->getId() == 8)
{
$eventFest = $evenements->findBy(array('Evenements'=>$event));
$nbPlaceFest = array();
foreach($eventFest as $fest)
{
array_push($nbPlaceFest,$fest->getNbPlaces());
}
if(!empty($nbPlaceFest))
{
$pDispo = min($nbPlaceFest);
}
}
}
}
return $this->render('default/calendrierDetail.html.twig', [
'evenement'=>$event,
'dispo'=>$pDispo,
]);
}
/**
* @Route("/reservation", name="reservation")
*/
public function reservation(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations): Response
{
$session = new Session();
$user = $this->getUser();
$time = time();
$session->set('userTemp', $time);
$events = $evenements->findOneById($_POST['event']);
$userTemp = $session->get('userTemp');
$resa = new Reservations();
if(empty($user))
{
$resa->setUserTemp($userTemp);
}
else
{
$resa->setUser($user);
}
if($_POST['submit'] == 'billet')
{
$resa->setEvenements($events);
}
if($events->getCategoriesEvenements()->getId() == 9)
{
$ty = 'abonnement';
}
else
{
$ty = 'billet';
}
$total = $_POST['places'] * $events->getPrix();
$resa->setCategoriesEvenements($events->getCategoriesEvenements());
$resa->setType($ty);
$resa->setNbPlaces($_POST['places']);
$resa->setCreated(new Datetime());
$resa->setTotal($total);
$resa->setPayer(0);
$reservations->add($resa, true);
// return $this->redirectToRoute('valierReservation', ['id'=>$resa->getId()], Response::HTTP_SEE_OTHER);
return new Response('ok');
}
/**
* @Route("/validerReservation/{id}", name="valierReservation")
* @Security("is_granted('ROLE_CLIENT')")
*/
public function valierReservation(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations,$id): Response
{
$session = new Session();
$user = $this->getUser();
$ignore = $user->isIgnorePaiement();
$userTemp = $session->get('userTemp');
$resa = $reservations->findOneById($id);
if(empty($user))
{
$resa->setUserTemp($userTemp);
}
else
{
$resa->setUser($user);
}
$date = date('Y-m-d');
$date2 = date('Y').'-12-31';
$festival = $evenements->findByExampleField2($date,$date2);
if($resa->getType() == 'billet')
{
$prix = $resa->getEvenements()->getPrix();
}
else
{
$prix = $resa->getCategoriesEvenements()->getPrixAbo();
}
$total = $resa->getNbPlaces() * $prix;
$resa->setTotal($total);
$reservations->add($resa, true);
return $this->render('default/paiement.html.twig', [
'resa'=>$resa,
'total'=>$total,
'ignore'=>$ignore,
'id'=>$id,
'festival'=>$festival,
'prix'=>$prix
]);
}
/**
* @Route("/panier", name="panier")
* @Security("is_granted('ROLE_CLIENT')")
*/
public function panier(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations): Response
{
$user = $this->getUser();
$resa = $reservations->findBy(array('User'=>$user,'Payer'=>0));
if($user->isIgnorePaiement())
{
$ignore = 1;
}
else
{
$ignore = 0;
}
foreach($resa as $res)
{
$ev = $evenements->findOneById($res->getEvenements());
if($ev->getNbPlaces() < $res->getNbPlaces())
{
$reservations->remove($res, true);
}
}
$resa = $reservations->findBy(array('User'=>$user,'Payer'=>0));
return $this->render('default/panier.html.twig', [
'resa'=>$resa,
'ignore' => $ignore
]);
}
/**
* @Route("/deletePanier/{id}", name="deletePanier")
* @Security("is_granted('ROLE_CLIENT')")
*/
public function deletePanier(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations,$id): Response
{
$resa = $reservations->findOneById($id);
$reservations->remove($resa, true);
return $this->redirectToRoute('panier');
}
/**
* @Route("/validation-de-la-commande/{id}", name="validationCmd")
* @Security("is_granted('ROLE_CLIENT')")
*/
public function validationCmd(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations,$id,EntityManagerInterface $entityManager): Response
{
$user = $this->getUser();
$resa = $reservations->findBy(array('User'=>$id, 'Payer'=>0));
$total = 0;
foreach($resa as $res)
{
$evi = $res->getEvenements();
$solde = $evi->getNbPlaces() - $res->getNbPlaces();
$evi->setNbPlaces($solde);
$entityManager->persist($evi); // facultatif si déjà managé
$entityManager->flush();
$res->setPayer(1);
$reservations->add($res, true);
$total = $total + $res->getTotal();
$event = $res->getEvenements();
if($event->getCategoriesEvenements()->getId() == 8)
{
$eventFest = $evenements->findBy(array('Evenements'=>$event));
foreach($eventFest as $fest)
{
$solde = $fest->getNbPlaces() - $res->getNbPlaces();
$fest->setNbPlaces($solde);
$evenements->add($fest, true);
}
}
else
{
$solde = $res->getEvenements()->getNbPlaces() - $res->getNbPlaces();
$event->setNbPlaces($solde);
$evenements->add($event, true);
}
$msg = $this->renderView(
// templates/emails/registration.txt.twig
'default/confirmationEmail.html.twig',
[
'nom'=>$res->getUser()->getNom(),
'prenom'=>$res->getUser()->getPrenom(),
'nbPlaces'=>$res->getNbPlaces(),
'type'=>'billet',
'resa'=>$res
]
);
// if (!empty($_POST['g-recaptcha-response'])){
$mj = new \Mailjet\Client('9c42ddfa4db6f8f973a32c7087ea2d51','eace5eb7252f4ff3a1b483251360e04c',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "noreply@lions-laclaireau.be",
'Name' => "LIONS LACLAIREAU"
],
'To' => [
[
'Email' => $res->getUser()->getEmail()
]
],
'Subject' => "Confirmation de réservation",
'HTMLPart' => $msg
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$info = $response->getData();
}
return $this->render('default/paiementValidation.html.twig', [
'resa'=>$resa,
'total'=>$total,
'type'=>'billet',
]);
}
/**
* @Route("/monCompte", name="monCompte")
* @Security("is_granted('ROLE_CLIENT')")
*/
public function monCompte(Request $request, EvenementsRepository $evenements, ReservationsRepository $reservations): Response
{
}
/**
* @Route("/press", name="press")
*/
public function press(PaginatorInterface $paginator, Request $request, ArticlesRepository $articlesRepository): Response
{
$yActive ='';
if(isset($_GET['years']))
{
$articles = $articlesRepository->findOneBySomeField($_GET['years'],5);
//Filter par année
$yActive =$_GET['years'];
}
else
{
$articles = $articlesRepository->findBy(array('Pages'=>5),array('Date'=>'desc'));
}
$articles2 = $articlesRepository->findBy(array('Pages'=>5),array('Date'=>'desc'));
$years = array();
foreach($articles2 as $res)
{
$y = $res->getDate()->format('Y');
array_push($years,$y);
}
$years = array_unique($years);
// J'importe le module paginator dans la variable pagination
$pagination = $paginator->paginate(
$articles, /* Je charge la liste de mes données */ $request->query->getInt('page', 1), /* je lui informe qu'il doit
commencer à la page 1*/
12 /* nombre de résultat par page */
);
return $this->render('default/press.html.twig', [
'articles'=>$pagination,
'articles2'=>$articles,
'years'=>$years,
'yActive'=>$yActive
]);
}
/**
* @Route("/sponsors", name="sponsors")
*/
public function sponsors(PaginatorInterface $paginator, Request $request, PartenairesRepository $partenaires): Response
{
return $this->render('default/sponsors.html.twig', [
'partenaires'=>$partenaires->findAll()
]);
}
/**
* @Route("/contact", name="contact")
*/
public function contact(Request $request, ArticlesRepository $articlesRepository,EvenementsRepository $evenements): Response
{
$press = $articlesRepository->findBy(array('Pages'=>5),array('Date'=>'desc'),3);
$event = $evenements->findByExampleField();
return $this->render('default/contact.html.twig', [
'press'=>$press,
'events'=>$event
]);
return $this->render('default/contact.html.twig', [
]);
}
/**
* @Route("/gestion-cookies", name="cookies")
*/
public function cookies(): Response
{
return $this->render('default/cookies.html.twig', [
'controller_name' => 'DefaultController',
]);
}
/**
* @Route("/politique-de-confidentialite", name="politique")
*/
public function politique(): Response
{
return $this->render('default/politique.html.twig', [
'controller_name' => 'DefaultController',
]);
}
/**
* @Route("/reservations/{id}", name="listereservations", methods={"GET", "POST"})
*/
public function listereservations(Request $request, Evenements $evenement, EvenementsRepository $evenementsRepository, ReservationsRepository $resaRepo, $id): Response
{
$event = $evenementsRepository->findOneById($id);
$resa = $resaRepo->findBy(array('Evenements'=>$event,'Payer'=>1));
$date1 = date('Y').'-01-01 00:00:00';
$date2 = $event->getDate()->format('Y-m-d');
$resa2 = $resaRepo->findByExampleField2($date1,$date2);
return $this->renderForm('evenements/reservations.html.twig', [
'resa'=>$resa,
'resa2'=>$resa2,
'event'=>$event
]);
}
/**
* @Route("/erreurAccess", name="erreurAccess")
*/
public function erreurAccess(Request $request): Response
{
return $this->renderForm('default/erreurAccess.html.twig', [
]);
}
/**
* @Route("/exportPdf", name="exportPdf")
*/
public function exportPdf(Request $request, ReservationsRepository $resaRepo): Response
{
$resaPayer = $resaRepo->findBy(array('Payer'=>0),array('id'=>'desc'));
$resaPayer2 = $resaRepo->findBy(array('Payer'=>1),array('id'=>'desc'));
return $this->renderForm('default/exportPdf.html.twig', [
'resaPayer' =>$resaPayer,
'resaPayer2' =>$resaPayer2
]);
}
/**
* @Route("/contactReq", name="contactReq")
*
*/
public function contactReq(Request $request): Response
{
$msg = $this->renderView(
// templates/emails/registration.txt.twig
'default/contactSend.html.twig',
[
'nom'=>$_POST['nom'],
'email'=>$_POST['email'],
'objet'=>$_POST['objet'],
'message'=>$_POST['message'],
]
);
if ($_POST['calcul'] == 9){
$mj = new \Mailjet\Client('9c42ddfa4db6f8f973a32c7087ea2d51','eace5eb7252f4ff3a1b483251360e04c',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "noreply@lions-laclaireau.be",
'Name' => "LIONS LACLAIREAU"
],
'To' => [
[
'Email' => 'laurentcha65@gmail.com',
//'Email' => 'matthieu@aready.io',
]
],
'Subject' => "Confirmation de réservation",
'HTMLPart' => $msg
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$info = $response->getData();
}
return $this->redirectToRoute('contact', ['send'=>'ok'], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/stripeForm", name="stripeForm")
*/
public function stripeForm(Request $request, ArticlesRepository $articlesRepository,EvenementsRepository $evenements): Response
{
$user = $this->getUser();
$this->get('session')->set('loginUserId', $user->getId());
return $this->renderForm('default/stripe.html.twig', [
]);
}
/**
* @Route("/stripe", name="stripe")
*/
public function stripe(Request $request, ArticlesRepository $articlesRepository,EvenementsRepository $evenements): Response
{
$em=$this->getDoctrine()->getManager();
$reservations = $em->getRepository(Reservations::class);
$user = $this->getUser();
$this->get('session')->set('loginUserId', $user->getId());
$resa = $reservations->findBy(array('User'=>$user,'Payer'=>0));
$total = 0;
$description = '';
foreach($resa as $res)
{
$total = $total + $res->getTotal();
$description .= $res->getEvenements()->getTitre().' + '.$user->getId();
}
$totals = $total * 100;
// Récupérer le token envoyé depuis le frontend
$token = json_decode($request->getContent(), true)['token'];
$description = substr($description,0,-1);
// clé secrète TEST
//Stripe::setApiKey('sk_test_51OfL2IJLeEy2AaEYs5nWm3y5gogVSL4w6LWj2e5eyNQ6SCtK6SPvlSmXtFgolMw6RDSbTASsGgATKIq64zH468fA00oKsME0LJ');
// clé secrète PRODUCTION
Stripe::setApiKey('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');
try {
// Effectuer la charge avec le token
// Par exemple :
$charge = \Stripe\Charge::create([
'amount' => $totals, // Montant en centimes
'currency' => 'eur',
'source' => $token, // Token de carte de crédit
'description' => $description,
]);
// Ici, vous pouvez gérer la réponse de Stripe, puis renvoyer une réponse appropriée au frontend
return $this->json(['message' => 'Paiement effectué avec succès']);
} catch (CardException $e) {
// Si une exception liée à la carte se produit (par exemple, la carte est déclinée), capturez l'erreur
// et renvoyez le message d'erreur au frontend
return $this->json(['error' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
} catch (ApiErrorException $e) {
// Si une autre exception Stripe se produit, capturez l'erreur
// et renvoyez un message d'erreur générique au frontend
return $this->json(['error' => 'Une erreur est survenue lors du traitement du paiement. Veuillez réessayer.'], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @Route("/retourStripe/{etat}", name="retourStripe")
*/
public function retourStripe(Request $request, EntityManagerInterface $entityManager, ArticlesRepository $articlesRepository,EvenementsRepository $evenementsRepository,ReservationsRepository $reservations,$etat, UserRepository $userRepository): Response
{
if($etat == 'success')
{
$user = $userRepository->findOneBy(array('Token'=>$_GET['token']));
$resa = $reservations->findBy(array('User'=>$user,'Payer'=>0));
foreach($resa as $res)
{
$res->setPayer(1);
$reservations->add($res, true);
$event = $res->getEvenements();
$nb = $event->getNbPlaces() - $res->getNbPlaces();
$event->setNbPlaces($nb);
$entityManager->persist($event); // optionnel si déjà managé
$entityManager->flush();
if(empty($event->getEvenements()))
{
$eventsFest = $evenementsRepository->findBy(array('Evenements'=>$res->getEvenements()->getId()));
foreach($eventsFest as $eFest)
{
$nbF = $eFest->getNbPlaces() - $res->getNbPlaces();
$eFest->setNbPlaces($nbF);
$entityManager->persist($eFest); // optionnel si déjà managé
$entityManager->flush();
}
}
$msg = $this->renderView(
// templates/emails/registration.txt.twig
'default/confirmationEmail.html.twig',
[
'nom'=>$res->getUser()->getNom(),
'prenom'=>$res->getUser()->getPrenom(),
'nbPlaces'=>$res->getNbPlaces(),
'type'=>$res->getType(),
'resa'=>$res
]
);
// if (!empty($_POST['g-recaptcha-response'])){
$mj = new \Mailjet\Client('9c42ddfa4db6f8f973a32c7087ea2d51','eace5eb7252f4ff3a1b483251360e04c',true,['version' => 'v3.1']);
$body = [
'Messages' => [
[
'From' => [
'Email' => "noreply@lions-laclaireau.be",
'Name' => "LIONS LACLAIREAU"
],
'To' => [
[
'Email' => $res->getUser()->getEmail()
]
],
'Subject' => "Confirmation de commande",
'HTMLPart' => $msg
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$info = $response->getData();
$body = [
'Messages' => [
[
'From' => [
'Email' => "noreply@lions-laclaireau.be",
'Name' => "LIONS LACLAIREAU"
],
'To' => [
[
'Email' => 'laurentcha65@gmail.com'
]
],
'Subject' => "Confirmation de commande",
'HTMLPart' => $msg
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success();
$info = $response->getData();
}
}
return $this->renderForm('default/retourStripe.html.twig', [
'etat'=>$etat
]);
}
/**
* @Route("/supprimerPanierAuto", name="supprimerPanierAuto")
*/
public function supprimerPanierAuto(Request $request, ArticlesRepository $articlesRepository,ReservationsRepository $reservations): Response
{
$resa = $reservations->findBy(array('Payer'=>0));
foreach($resa as $res)
{
$reservations->remove($res, true);
}
return new Response('ok');
}
}