<?php
namespace App\Controller;
use App\Entity\Client;
use App\Entity\DetailReservation;
use App\Entity\Hotel;
use App\Entity\Hotelprice;
use App\Entity\Reservation;
use App\Entity\Reservationhotel;
use App\Entity\TemporaryReservation;
use App\Form\ClientType;
use App\Form\HotelfilterType;
use App\Form\SearchHotelType;
use App\Form\SearchType;
use App\Form\SearchsType;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
class HotelController extends AbstractController
{
/**
* @Route("/hotels", name="app_hotel")
*/
public function index(Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$results = [];
$form = $this->createForm(SearchType::class, null, ['data_class' => null])->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
// Logique de recherche pour récupérer les hôtels disponibles
$availableHotels = $em->createQueryBuilder('h')
->select('h')
->from('App\Entity\Hotel', 'h')
->leftJoin('h.hotelprices', 'hp')
->leftJoin('hp.pricerooms', 'pr')
->leftJoin('h.hotelrooms', 'ac') // Ajustez ici la jointure avec la propriété correcte de l'entité Hotel
->where('h.etat = 1')
->andWhere('hp.dated <= :dateDepart')
->andWhere('hp.datef >= :dateArrive')
// Ajoutez d'autres conditions selon vos besoins
->setParameter('dateDepart', $data['dateDepart'])
->setParameter('dateArrive', $data['dateArrive'])
// Ajoutez d'autres paramètres selon vos besoins
->getQuery()
->getResult();
foreach ($availableHotels as $hotel) {
// Logique pour chaque hôtel trouvé
$results[] = [
'hotel' => $hotel,
// Autres informations que vous souhaitez afficher
];
}
} else {
// Si la recherche est vide, récupérez la liste des hôtels avec etat = 1
$hotels = $em->getRepository(Hotel::class)->findBy(['etat' => 1]);
// Passez la liste des hôtels à la vue
return $this->render('hotel/index.html.twig', [
'form' => $form->createView(),
'results' => $results,
'hotels' => $hotels,
]);
}
return $this->render('hotel/index.html.twig', [
'results' => $results,
'form' => $form->createView(),
]);
}
/**
* @Route("/detail/{id}", name="detailhotel")
*/
public function details(Hotel $id,Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$hotels = $em->createQueryBuilder('h')
->select('h')
->from('App\Entity\Hotel','h')
->where('h.id = :id')
->andWhere('h.etat = 1')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult()
;
$data = $em->createQueryBuilder()
->select('h')
->from('App\Entity\Hotel','h')
->where('h.etat = 1')
->getQuery()
->getResult()
;
$form = $this->createForm(SearchsType::class, null, ['data_class' => null])->handleRequest($request);
$results = [];
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$dateDepart = $data['dateDepart'];
$dateArrive = $data['dateArrive'];
$rooms = $data['rooms'];
foreach ($rooms as $key => $room) {
// Créer un sous-formulaire pour chaque chambre
$form->get('rooms')->get($key)->handleRequest($request);
$nbadultes = $room['nbadultes'];
$nbfnfants = $room['nbfnfants'];
$age = $room['age'];
// Calculer le nombre de nuits directement ici
$difference = $dateArrive->diff($dateDepart);
$nombreNuits = $difference->days;
$chambre = $em->getRepository(Hotelprice::class)->createQueryBuilder('hp')
->join('hp.hotel', 'h')
->join('h.hotelrooms', 'ac')
->join('hp.pricerooms', 'pr')
->where('hp.hotel = :hotels')
->andWhere('hp.dated <= :dateDepart')
->andWhere('hp.datef >= :dateArrive')
->andWhere('ac.adulte = :nbadultes OR ac.enfant = :nbfnfants OR ac.age = :age')
->setParameter('hotels', $id)
->setParameter('dateDepart', $dateDepart)
->setParameter('dateArrive', $dateArrive)
->setParameter('nbadultes', $nbadultes)
->setParameter('nbfnfants', $nbfnfants)
->setParameter('age', $age)
->getQuery()
->getOneOrNullResult();
$results[] = [
'chambre' => $chambre,
'nbadultes' => $nbadultes,
'nbfnfants' => $nbfnfants,
'age' => $nbfnfants,
'nombreNuits' => $nombreNuits,
];
}
}
return $this->render('hotel/details.html.twig', [
'hotel' => $hotels,
'hotels' => $id,
'hot' => $data,
'form' => $form->createView(),
'results' => $results,
]);
}
/**
* @Route("/search/{id}", name="search")
*/
public function search(Request $request, Hotel $id): Response
{
$em = $this->getDoctrine()->getManager();
$hotels = $em->createQueryBuilder('h')
->select('h')
->from('App\Entity\Hotel','h')
->where('h.id = :id')
->andWhere('h.etat = 1')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
$form = $this->createForm(SearchType::class)->handleRequest($request);
$dateDepart = null;
$nbad = null;
$nbenf = null;
$dateArrive = null;
$chambre = null;
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$dateDepart = $data['dateDepart'];
$dateArrive = $data['dateArrive'];
$nbad = $data['nbad'];
$nbenf = $data['nbenf'];
$chambre = $em->getRepository(Hotelprice::class)->createQueryBuilder('hp')
->join('hp.hotel', 'h')
->join('h.hotelrooms', 'ac')
->join('hp.pricerooms', 'pr')
->where('hp.hotel = :hotels')
->andWhere('hp.dated <= :dateDepart')
->andWhere('hp.datef >= :dateArrive')
->andWhere('ac.adulte = :nbad OR ac.enfant = :nbenf')
->setParameter('hotels', $hotels)
->setParameter('dateDepart', $dateDepart)
->setParameter('dateArrive', $dateArrive)
->setParameter('nbad', $nbad)
->setParameter('nbenf', $nbenf)
->getQuery()
->getOneOrNullResult();
}
return $this->render('hotel/list.html.twig', [
'hotels' => $hotels,
'hotel' => $id,
'form' => $form->createView(),
'chambre' => $chambre,
'dated' => $dateDepart,
'datef' => $dateArrive,
'nbad' => $nbad,
'nbenf' => $nbenf,
//'nbrooms' => $nbrooms
]);
}
/**
* @Route("/reservation/{id}", name="reservation")
*/
public function newPage(Request $request, Hotel $id, MailerInterface $mailer): Response
{
$em = $this->getDoctrine()->getManager();
$hotels = $em->createQueryBuilder('h')
->select('h')
->from('App\Entity\Hotel', 'h')
->where('h.id = :id')
->andWhere('h.etat = 1')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
$nbadArray = $request->request->get('nbadultes', []);
$nbenfArray = $request->request->get('nbfnfants', []);
$selectedRoomArray = $request->request->get('selectedRoom', []);
$selectedArrangementArray = $request->request->get('selectedArrangement', []);
$prixTotalArray = $request->request->get('totalPrice', []);
$dateDepart = $request->request->get('dateDepart');
$dateArrive = $request->request->get('dateArrive');
$nombreNuits = $request->request->get('nombreNuits');
$coordonnees = new Client();
$form = $this->createForm('App\Form\ClientType', $coordonnees);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Si le formulaire est soumis et valide, faites quelque chose avec les données du formulaire
// Par exemple, persistez les données dans la base de données
$nomClient = $coordonnees->getNom();
$prenomClient = $coordonnees->getPrenom();
$mobileClient = $coordonnees->getMobile();
$messageClient = $coordonnees->getMessage();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($coordonnees);
$entityManager->flush();
}
return $this->render('test/search_results.html.twig', [
'nbadArray' => $nbadArray,
'nbenfArray' => $nbenfArray,
'roomNameArray' => $selectedRoomArray,
'arrangementArray' => $selectedArrangementArray,
'prixTotalArray' => $prixTotalArray,
'dateDepart' => $dateDepart,
'dateArrive' => $dateArrive,
'nombreNuits' => $nombreNuits,
'form' => $form->createView(),
'hotels' => $hotels,
'hotel' => $id,
'coordonnees' => $coordonnees,
]);
}
/**
* @Route("/envoyer-email", name="envoyer_email", methods={"POST"})
*/
public function envoyerEmail(Request $request, MailerInterface $mailer, EntityManagerInterface $entityManager): JsonResponse
{
// Récupérer les données JSON envoyées depuis le client
$data = json_decode($request->getContent(), true);
// Récupérez l'adresse e-mail du client à partir des données du formulaire
$emailClient = $data['emailClient'];
// Envoi de l'e-mail
$email = (new Email())
->from('amiraarfaoui1989@rusticavoyages.com') // Remplacez par l'adresse e-mail de l'expéditeur
->to($emailClient)
->subject('Détails de la réservation')
->html($this->renderView('hotel/reservation_agence.html.twig', [
'detailsReservation' => $data,
'dateDepart' => $data['dateDepart'],
'dateArrive' => $data['dateArrive'],
//'nombreNuits' => $data['nombreNuits'],
'hotelNom' => $data['hotelNom'], // Ajoutez le nom de l'hôtel
'nomClient' => $data['nomClient'], // Ajoutez le nom du client
'prenomClient' => $data['prenomClient'], // Ajoutez le nom du client
'emailClient' => $data['emailClient'], // Ajoutez le nom du client
'mobileClient' => $data['mobileClient'], // Ajoutez le nom du client
'messageClient' => $data['messageClient'], // Ajoutez le nom du client
]));
// Envoi de l'e-mail
$mailer->send($email);
$email = (new Email())
->from('amiraarfaoui1989@rusticavoyages.com') // Remplacez par l'adresse e-mail de l'expéditeur
->to('arfaouiamira716@gmail.com')
->subject('Détails de la réservation')
->html($this->renderView('hotel/reservation_details.html.twig', [
'detailsReservation' => $data,
// 'dateDepart' => $data['dateDepart'],
// 'dateArrive' => $data['dateArrive'],
// 'nombreNuits' => $data['nombreNuits'],
'hotelNom' => $data['hotelNom'], // Ajoutez le nom de l'hôtel
'nomClient' => $data['nomClient'], // Ajoutez le nom du client
'prenomClient' => $data['prenomClient'], // Ajoutez le nom du client
// 'emailClient' => $data['emailClient'], // Ajoutez le nom du client
// 'mobileClient' => $data['mobileClient'], // Ajoutez le nom du client
// 'messageClient' => $data['messageClient'], // Ajoutez le nom du client
]));
// Envoi de l'e-mail
$mailer->send($email);
// Enregistrement des données dans l'entité Reservation
$reservation = new Reservation();
$reservation->setDateDepart(new \DateTime($data['dateDepart']));
$reservation->setDateArrive(new \DateTime($data['dateArrive']));
$reservation->setHotelNom($data['hotelNom']);
$reservation->setNomClient($data['nomClient']);
$reservation->setPrenomClient($data['prenomClient']);
$reservation->setEmailClient($data['emailClient']);
$reservation->setMobileClient($data['mobileClient']);
$reservation->setMessageClient($data['messageClient']);
//$reservation->setNombreNuits($data['dateArrive']);
// Configurez d'autres propriétés de l'entité en fonction des données reçues
// Persistez l'entité
$entityManager->persist($reservation);
$entityManager->flush();
// Enregistrement des détails de la réservation dans l'entité DetailReservation
foreach ($data['nbadArray'] as $index => $nbad) {
$detailReservation = new DetailReservation();
$detailReservation->setNbad($nbad);
$detailReservation->setNbenf($data['nbenfArray'][$index]);
$detailReservation->setRoomName($data['roomNameArray'][$index]);
$detailReservation->setArrangement($data['arrangementArray'][$index]);
$detailReservation->setPrixTotal($data['prixTotalArray'][$index]);
// Ajoutez le détail de la réservation à l'entité Reservation
$reservation->addDetailReservation($detailReservation);
// Persistez l'entité DetailReservation
$entityManager->persist($detailReservation);
}
// Flush pour sauvegarder les changements dans la base de données
$entityManager->flush();
// Réponse JSON indiquant que l'e-mail a été envoyé
return new JsonResponse(['message' => 'E-mail envoyé avec succès'], JsonResponse::HTTP_OK);
}
}