src/Controller/HotelController.php line 94

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Client;
  4. use App\Entity\DetailReservation;
  5. use App\Entity\Hotel;
  6. use App\Entity\Hotelprice;
  7. use App\Entity\Reservation;
  8. use App\Entity\Reservationhotel;
  9. use App\Entity\TemporaryReservation;
  10. use App\Form\ClientType;
  11. use App\Form\HotelfilterType;
  12. use App\Form\SearchHotelType;
  13. use App\Form\SearchType;
  14. use App\Form\SearchsType;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Knp\Component\Pager\PaginatorInterface;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Mailer\MailerInterface;
  23. use Symfony\Component\Mime\Address;
  24. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  25. use Symfony\Component\Mime\Email;
  26. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  27. class HotelController extends AbstractController
  28. {
  29.     /**
  30.      * @Route("/hotels", name="app_hotel")
  31.      */
  32.     public function index(Request $request): Response
  33.     {
  34.         $em $this->getDoctrine()->getManager();
  35.         $results = [];
  36.         $form $this->createForm(SearchType::class, null, ['data_class' => null])->handleRequest($request);
  37.         if ($form->isSubmitted() && $form->isValid()) {
  38.             $data $form->getData();
  39.             // Logique de recherche pour récupérer les hôtels disponibles
  40.             $availableHotels $em->createQueryBuilder('h')
  41.                 ->select('h')
  42.                 ->from('App\Entity\Hotel''h')
  43.                 ->leftJoin('h.hotelprices''hp')
  44.                 ->leftJoin('hp.pricerooms''pr')
  45.                 ->leftJoin('h.hotelrooms''ac'// Ajustez ici la jointure avec la propriété correcte de l'entité Hotel
  46.                 ->where('h.etat = 1')
  47.                 ->andWhere('hp.dated <= :dateDepart')
  48.                 ->andWhere('hp.datef >= :dateArrive')
  49.                 // Ajoutez d'autres conditions selon vos besoins
  50.                 ->setParameter('dateDepart'$data['dateDepart'])
  51.                 ->setParameter('dateArrive'$data['dateArrive'])
  52.                 // Ajoutez d'autres paramètres selon vos besoins
  53.                 ->getQuery()
  54.                 ->getResult();
  55.             foreach ($availableHotels as $hotel) {
  56.                 // Logique pour chaque hôtel trouvé
  57.                 $results[] = [
  58.                     'hotel' => $hotel,
  59.                     // Autres informations que vous souhaitez afficher
  60.                 ];
  61.             }
  62.         } else {
  63.             // Si la recherche est vide, récupérez la liste des hôtels avec etat = 1
  64.             $hotels $em->getRepository(Hotel::class)->findBy(['etat' => 1]);
  65.             // Passez la liste des hôtels à la vue
  66.             return $this->render('hotel/index.html.twig', [
  67.                 'form' => $form->createView(),
  68.                 'results' => $results,
  69.                 'hotels' => $hotels,
  70.             ]);
  71.         }
  72.         return $this->render('hotel/index.html.twig', [
  73.             'results' => $results,
  74.             'form' => $form->createView(),
  75.         ]);
  76.     }
  77.     /**
  78.      * @Route("/detail/{id}", name="detailhotel")
  79.      */
  80.     public function details(Hotel $id,Request $request): Response
  81.     {
  82.         $em $this->getDoctrine()->getManager();
  83.         $hotels $em->createQueryBuilder('h')
  84.             ->select('h')
  85.             ->from('App\Entity\Hotel','h')
  86.             ->where('h.id = :id')
  87.             ->andWhere('h.etat = 1')
  88.             ->setParameter('id'$id)
  89.             ->getQuery()
  90.             ->getOneOrNullResult()
  91.         ;
  92.         $data $em->createQueryBuilder()
  93.             ->select('h')
  94.             ->from('App\Entity\Hotel','h')
  95.             ->where('h.etat = 1')
  96.             ->getQuery()
  97.             ->getResult()
  98.         ;
  99.         $form $this->createForm(SearchsType::class, null, ['data_class' => null])->handleRequest($request);
  100.         $results = [];
  101.         if ($form->isSubmitted() && $form->isValid()) {
  102.             $data $form->getData();
  103.             $dateDepart $data['dateDepart'];
  104.             $dateArrive $data['dateArrive'];
  105.             $rooms $data['rooms'];
  106.             
  107.             foreach ($rooms as $key => $room) {
  108.                 // Créer un sous-formulaire pour chaque chambre
  109.                 $form->get('rooms')->get($key)->handleRequest($request);
  110.                 $nbadultes $room['nbadultes'];
  111.                 $nbfnfants $room['nbfnfants'];
  112.                 $age $room['age'];
  113.                 // Calculer le nombre de nuits directement ici
  114.                 $difference $dateArrive->diff($dateDepart);
  115.                 $nombreNuits $difference->days;
  116.                 $chambre $em->getRepository(Hotelprice::class)->createQueryBuilder('hp')
  117.                     ->join('hp.hotel''h')
  118.                     ->join('h.hotelrooms''ac')
  119.                     ->join('hp.pricerooms''pr')
  120.                     ->where('hp.hotel = :hotels')
  121.                     ->andWhere('hp.dated <= :dateDepart')
  122.                     ->andWhere('hp.datef >= :dateArrive')
  123.                     ->andWhere('ac.adulte = :nbadultes OR ac.enfant = :nbfnfants OR ac.age = :age')
  124.                     ->setParameter('hotels'$id)
  125.                     ->setParameter('dateDepart'$dateDepart)
  126.                     ->setParameter('dateArrive'$dateArrive)
  127.                     ->setParameter('nbadultes'$nbadultes)
  128.                     ->setParameter('nbfnfants'$nbfnfants)
  129.                     ->setParameter('age'$age)
  130.                     ->getQuery()
  131.                     ->getOneOrNullResult();
  132.                 $results[] = [
  133.                     'chambre' => $chambre,
  134.                     'nbadultes' => $nbadultes,
  135.                     'nbfnfants' => $nbfnfants,
  136.                     'age' => $nbfnfants,
  137.                     'nombreNuits' => $nombreNuits,
  138.                 ];
  139.             }
  140.         }
  141.         return $this->render('hotel/details.html.twig', [
  142.             'hotel' => $hotels,
  143.             'hotels' => $id,
  144.             'hot' => $data,
  145.             'form' => $form->createView(),
  146.             'results' => $results,
  147.         ]);
  148.     }
  149.     /**
  150.      * @Route("/search/{id}", name="search")
  151.      */
  152.     public function search(Request $requestHotel $id): Response
  153.     {
  154.         $em $this->getDoctrine()->getManager();
  155.         $hotels $em->createQueryBuilder('h')
  156.             ->select('h')
  157.             ->from('App\Entity\Hotel','h')
  158.             ->where('h.id = :id')
  159.             ->andWhere('h.etat = 1')
  160.             ->setParameter('id'$id)
  161.             ->getQuery()
  162.             ->getOneOrNullResult();
  163.         $form $this->createForm(SearchType::class)->handleRequest($request);
  164.         $dateDepart null;
  165.         $nbad null;
  166.         $nbenf null;
  167.         $dateArrive null;
  168.         $chambre null;
  169.         if ($form->isSubmitted() && $form->isValid()) {
  170.             $data $form->getData();
  171.             $dateDepart $data['dateDepart'];
  172.             $dateArrive $data['dateArrive'];
  173.             $nbad $data['nbad'];
  174.             $nbenf $data['nbenf'];
  175.             $chambre $em->getRepository(Hotelprice::class)->createQueryBuilder('hp')
  176.                 ->join('hp.hotel''h')
  177.                 ->join('h.hotelrooms''ac')
  178.                 ->join('hp.pricerooms''pr')
  179.                 ->where('hp.hotel = :hotels')
  180.                 ->andWhere('hp.dated <= :dateDepart')
  181.                 ->andWhere('hp.datef >= :dateArrive')
  182.                 ->andWhere('ac.adulte = :nbad OR ac.enfant = :nbenf')
  183.                 ->setParameter('hotels'$hotels)
  184.                 ->setParameter('dateDepart'$dateDepart)
  185.                 ->setParameter('dateArrive'$dateArrive)
  186.                 ->setParameter('nbad'$nbad)
  187.                 ->setParameter('nbenf'$nbenf)
  188.                 ->getQuery()
  189.                 ->getOneOrNullResult();
  190.         }
  191.         return $this->render('hotel/list.html.twig', [
  192.             'hotels' => $hotels,
  193.             'hotel' => $id,
  194.             'form' => $form->createView(),
  195.             'chambre' => $chambre,
  196.             'dated' => $dateDepart,
  197.             'datef' => $dateArrive,
  198.             'nbad' => $nbad,
  199.             'nbenf' => $nbenf,
  200.             //'nbrooms' => $nbrooms
  201.         ]);
  202.     }
  203.     /**
  204.      * @Route("/reservation/{id}", name="reservation")
  205.      */
  206.     public function newPage(Request $requestHotel $idMailerInterface $mailer): Response
  207.     {
  208.         $em $this->getDoctrine()->getManager();
  209.         $hotels $em->createQueryBuilder('h')
  210.             ->select('h')
  211.             ->from('App\Entity\Hotel''h')
  212.             ->where('h.id = :id')
  213.             ->andWhere('h.etat = 1')
  214.             ->setParameter('id'$id)
  215.             ->getQuery()
  216.             ->getOneOrNullResult();
  217.         $nbadArray $request->request->get('nbadultes', []);
  218.         $nbenfArray $request->request->get('nbfnfants', []);
  219.         $selectedRoomArray $request->request->get('selectedRoom', []);
  220.         $selectedArrangementArray $request->request->get('selectedArrangement', []);
  221.         $prixTotalArray $request->request->get('totalPrice', []);
  222.         $dateDepart $request->request->get('dateDepart');
  223.         $dateArrive $request->request->get('dateArrive');
  224.         $nombreNuits $request->request->get('nombreNuits');
  225.         $coordonnees = new Client();
  226.         $form $this->createForm('App\Form\ClientType'$coordonnees);
  227.         $form->handleRequest($request);
  228.         if ($form->isSubmitted() && $form->isValid()) {
  229.             // Si le formulaire est soumis et valide, faites quelque chose avec les données du formulaire
  230.             // Par exemple, persistez les données dans la base de données
  231.             $nomClient $coordonnees->getNom();
  232.             $prenomClient $coordonnees->getPrenom();
  233.             $mobileClient $coordonnees->getMobile();
  234.             $messageClient $coordonnees->getMessage();
  235.             $entityManager $this->getDoctrine()->getManager();
  236.             $entityManager->persist($coordonnees);
  237.             $entityManager->flush();
  238.         }
  239.         return $this->render('test/search_results.html.twig', [
  240.             'nbadArray' => $nbadArray,
  241.             'nbenfArray' => $nbenfArray,
  242.             'roomNameArray' => $selectedRoomArray,
  243.             'arrangementArray' => $selectedArrangementArray,
  244.             'prixTotalArray' => $prixTotalArray,
  245.             'dateDepart' => $dateDepart,
  246.             'dateArrive' => $dateArrive,
  247.             'nombreNuits' => $nombreNuits,
  248.             'form' => $form->createView(),
  249.             'hotels' => $hotels,
  250.             'hotel' => $id,
  251.             'coordonnees' => $coordonnees,
  252.         ]);
  253.     }
  254.     /**
  255.      * @Route("/envoyer-email", name="envoyer_email", methods={"POST"})
  256.      */
  257.     public function envoyerEmail(Request $requestMailerInterface $mailerEntityManagerInterface $entityManager): JsonResponse
  258.     {
  259.         // Récupérer les données JSON envoyées depuis le client
  260.         $data json_decode($request->getContent(), true);
  261.         // Récupérez l'adresse e-mail du client à partir des données du formulaire
  262.         $emailClient $data['emailClient'];
  263.             // Envoi de l'e-mail
  264.         $email = (new Email())
  265.         ->from('amiraarfaoui1989@rusticavoyages.com'// Remplacez par l'adresse e-mail de l'expéditeur
  266.         ->to($emailClient)
  267.         ->subject('Détails de la réservation')
  268.         ->html($this->renderView('hotel/reservation_agence.html.twig', [
  269.             'detailsReservation' => $data,
  270.             'dateDepart' => $data['dateDepart'],
  271.             'dateArrive' => $data['dateArrive'],
  272.             //'nombreNuits' => $data['nombreNuits'],
  273.             'hotelNom' => $data['hotelNom'], // Ajoutez le nom de l'hôtel
  274.             'nomClient' => $data['nomClient'], // Ajoutez le nom du client
  275.             'prenomClient' => $data['prenomClient'], // Ajoutez le nom du client
  276.             'emailClient' => $data['emailClient'], // Ajoutez le nom du client
  277.             'mobileClient' => $data['mobileClient'], // Ajoutez le nom du client
  278.             'messageClient' => $data['messageClient'], // Ajoutez le nom du client
  279.         ]));
  280.         // Envoi de l'e-mail
  281.         $mailer->send($email);
  282.         $email = (new Email())
  283.             ->from('amiraarfaoui1989@rusticavoyages.com'// Remplacez par l'adresse e-mail de l'expéditeur
  284.             ->to('arfaouiamira716@gmail.com')
  285.             ->subject('Détails de la réservation')
  286.             ->html($this->renderView('hotel/reservation_details.html.twig', [
  287.                'detailsReservation' => $data,
  288.             //    'dateDepart' => $data['dateDepart'],
  289.             //    'dateArrive' => $data['dateArrive'],
  290.             //    'nombreNuits' => $data['nombreNuits'],
  291.                 'hotelNom' => $data['hotelNom'], // Ajoutez le nom de l'hôtel
  292.                 'nomClient' => $data['nomClient'], // Ajoutez le nom du client
  293.                 'prenomClient' => $data['prenomClient'], // Ajoutez le nom du client
  294.             //    'emailClient' => $data['emailClient'], // Ajoutez le nom du client
  295.             //    'mobileClient' => $data['mobileClient'], // Ajoutez le nom du client
  296.             //    'messageClient' => $data['messageClient'], // Ajoutez le nom du client
  297.             ]));
  298.         // Envoi de l'e-mail
  299.         $mailer->send($email);
  300.         
  301.         // Enregistrement des données dans l'entité Reservation
  302.         $reservation = new Reservation();
  303.         $reservation->setDateDepart(new \DateTime($data['dateDepart']));
  304.         $reservation->setDateArrive(new \DateTime($data['dateArrive']));
  305.         $reservation->setHotelNom($data['hotelNom']);
  306.         $reservation->setNomClient($data['nomClient']);
  307.         $reservation->setPrenomClient($data['prenomClient']);
  308.         $reservation->setEmailClient($data['emailClient']);
  309.         $reservation->setMobileClient($data['mobileClient']);
  310.         $reservation->setMessageClient($data['messageClient']);
  311.         //$reservation->setNombreNuits($data['dateArrive']);
  312.         // Configurez d'autres propriétés de l'entité en fonction des données reçues
  313.         // Persistez l'entité
  314.         $entityManager->persist($reservation);
  315.         $entityManager->flush();
  316.         // Enregistrement des détails de la réservation dans l'entité DetailReservation
  317.         foreach ($data['nbadArray'] as $index => $nbad) {
  318.             $detailReservation = new DetailReservation();
  319.             $detailReservation->setNbad($nbad);
  320.             $detailReservation->setNbenf($data['nbenfArray'][$index]);
  321.             $detailReservation->setRoomName($data['roomNameArray'][$index]);
  322.             $detailReservation->setArrangement($data['arrangementArray'][$index]);
  323.             $detailReservation->setPrixTotal($data['prixTotalArray'][$index]);
  324.             // Ajoutez le détail de la réservation à l'entité Reservation
  325.             $reservation->addDetailReservation($detailReservation);
  326.             // Persistez l'entité DetailReservation
  327.             $entityManager->persist($detailReservation);
  328.         }
  329.         // Flush pour sauvegarder les changements dans la base de données
  330.         $entityManager->flush();
  331.         // Réponse JSON indiquant que l'e-mail a été envoyé
  332.         return new JsonResponse(['message' => 'E-mail envoyé avec succès'], JsonResponse::HTTP_OK);
  333.     }
  334. }