<?php
namespace App\Controller;
use App\Entity\Circuit;
use App\Entity\CircuitSearch;
use App\Entity\Croisieres;
use App\Entity\Hotel;
use App\Entity\Hotelprice;
use App\Entity\Sejour;
use App\Entity\Sejoursearch;
use App\Form\CircuitSearchType;
use App\Form\CircuitType;
use App\Form\CroisieresType;
use App\Form\HotelfilterType;
use App\Form\HotelNameFilterType;
use App\Form\HotelsearchType;
use App\Form\SearchCroisiereType;
use App\Form\SearchHotelType;
use App\Form\SearchSejourType;
use App\Form\SearchType;
use App\Entity\Client;
use App\Form\SejoursearchType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormInterface;
use App\Form\SejourType;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address; // Import Address class
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class HomeController extends AbstractController
{
/**
* @Route("/home", name="app_home")
*/
public function index(Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$banniere = $em->createQueryBuilder()
->select('b')
->from('App\Entity\Banniere','b')
->where('b.etat = 1')
->getQuery()
->getResult()
;
$sejour = $em->createQueryBuilder()
->select('s')
->from('App\Entity\Sejour','s')
->where('s.etat = 1')
->Andwhere('s.latest = 1')
->getQuery()
->getResult()
;
$circuit = $em->createQueryBuilder()
->select('c')
->from('App\Entity\Circuit','c')
->where('c.etat = 1')
->getQuery()
->getResult()
;
$croisiere = $em->createQueryBuilder()
->select('c')
->from('App\Entity\Croisiere','c')
->where('c.etat = 1')
->getQuery()
->getResult()
;
$hotel = $em->createQueryBuilder()
->select('h')
->from('App\Entity\Hotel','h')
->where('h.etat = 1')
->getQuery()
->getResult()
;
$results = [];
$hotelform = $this->createForm(SearchType::class, null, ['data_class' => null])->handleRequest($request);
if ($hotelform->isSubmitted() && $hotelform->isValid()) {
$data = $hotelform->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')
->leftJoin('h.ville','v')
// Ajustez ici la jointure avec la propriété correcte de l'entité Hotel
->where('h.etat = 1')
->where('v.name = :ville')
->andWhere('hp.dated <= :dateDepart')
->andWhere('hp.datef >= :dateArrive')
// Ajoutez d'autres conditions selon vos besoins
->setParameter('dateDepart', $data['dateDepart'])
->setParameter('dateArrive', $data['dateArrive'])
->setParameter('ville', $data['ville'])
// Ajoutez d'autres paramètres selon vos besoins
->getQuery()
->getResult();
foreach ($availableHotels as $hotels) {
// Logique pour chaque hôtel trouvé
$results[] = [
'hotel' => $hotels,
// Autres informations que vous souhaitez afficher
];
}
return $this->render('home/resultat_page.html.twig', [
'hotels' => $hotels,
'form' => $hotelform->createView(),
'results' => $results,
]);
}
return $this->render('home/index.html.twig', [
'sejour' => $sejour,
'banniere' => $banniere,
'hotel' => $hotel,
'circuit' => $circuit,
'croisiere' => $croisiere,
'form' => $hotelform->createView(),
]);
}
private $httpClient;
public function __construct(HttpClientInterface $httpClient)
{
$this->httpClient = $httpClient;
}
/**
* @Route("/", name="app_list")
*/
public function home(Request $request): Response
{
$today = new \DateTime();
// Date de check-in (par défaut aujourd'hui)
$checkIn = $request->query->get('checkIn', $today->format('Y-m-d'));
// Date de check-out (par défaut aujourd'hui + 1 jour)
$checkOut = $request->query->get('checkOut', $today->modify('+1 day')->format('Y-m-d'));
$city = $request->get('city', '');
$tag = $request->get('tag', '');
$rooms = $request->query->get('rooms', []);
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2,
]
];
}
$apiUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"City" => $city
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $apiUrl);
$search = $response->getContent();
// Liste des id des villes disponibles
$cities = [
10 =>"Hammamet",
11 =>"Nabeul",
12 =>"Kelibia",
13 =>"Korba",
14 =>"Korbous",
17 =>"Kairouan",
18 =>"Djerba",
19 =>"Zarzis",
20 =>"Douz",
22 =>"Kebili",
23 =>"Ksar Ghilane",
30 =>"Tunis",
31 =>"Ain Drahem",
33 =>"Tabarka",
34 =>"Sousse",
35 =>"Mahdia",
37 =>"Monastir",
39 =>"Sfax",
44 =>"Djerba-Midoun",
47 =>"Tozeur",
48 =>"Bizerte",
49 =>"Le Kef",
54 =>"Gafsa",
55 =>"Gabes",
59 =>"Zaghouan",
70 =>"Tataouine",
71 =>"Téboursouk",
72 =>"Sbeitla",
73 =>"Matmata",
74 =>"Sidi Bouzid",
75 =>"Nefta",
76 =>"Mednenine",
77 =>"Beja",
78 =>"El Jem",
79 =>"Gammarth"
];
// Liste des id des themes
$tags = [
1 =>"Last minute",
2 =>"All inclusive",
3 =>"Famille",
5 =>"Centre de Thalasso",
6 =>"Petit Prix",
7 =>"Mini Club",
9 =>"Romance",
10 =>"Luxe",
14 =>"Affaires",
15 =>"Sport & Loisir",
16 =>"Club",
17 =>"Nature et Aventure",
19 =>"Bord de Mer"
];
$em = $this->getDoctrine()->getManager();
$banniere = $em->createQueryBuilder()
->select('b')
->from('App\Entity\Banniere','b')
->where('b.etat = 1')
->getQuery()
->getResult()
;
$sejour = $em->createQueryBuilder()
->select('s')
->from('App\Entity\Sejour','s')
->where('s.etat = 1')
->Andwhere('s.latest = 1')
->getQuery()
->getResult()
;
$circuit = $em->createQueryBuilder()
->select('c')
->from('App\Entity\Circuit','c')
->where('c.etat = 1')
->getQuery()
->getResult()
;
$croisiere = $em->createQueryBuilder()
->select('c')
->from('App\Entity\Croisiere','c')
->where('c.etat = 1')
->getQuery()
->getResult()
;
//listhotel debut
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2
]
];
}
$apiUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"Hotel" => [311,52,599,488]
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $apiUrl);
$test = $response->getContent();
try {
// Effectuer la requête GET à l'API
$response = $this->httpClient->request('GET', $apiUrl);
// Vérifier le code de réponse
if ($response->getStatusCode() === 200) {
// Récupérer le contenu de la réponse
$content = $response->getContent();
// Passe le contenu directement à la vue Twig
return $this->render('home/home.html.twig', [
'content' => $content,
'test' => $test,
'search' => $search,
'checkIn' => $checkIn,
'checkOut' => $checkOut,
'city' => $city,
'rooms' => $rooms,
'cities' => $cities,
'croisiere' => $croisiere,
'sejour' => $sejour,
'banniere' => $banniere,
]);
} else {
throw new \Exception('Erreur lors de la requête à l\'API. Code de statut : ' . $response->getStatusCode());
}
} catch (\Exception $e) {
// Gérer les erreurs de requête ou de traitement
return $this->render('error.html.twig', [
'message' => 'Une erreur est survenue : ' . $e->getMessage(),
]);
}
}
/**
* @Route("/list-search/{city}", name="list_search")
*/
public function listSearch($city,Request $request): Response
{
$today = new \DateTime();
// Date de check-in (par défaut aujourd'hui)
$checkIn = $request->query->get('checkIn', $today->format('Y-m-d'));
// Date de check-out (par défaut aujourd'hui + 1 jour)
$checkOut = $request->query->get('checkOut', $today->modify('+1 day')->format('Y-m-d'));
$city = $request->get('city', '');
$tag = $request->get('tag', '');
$rooms = $request->query->get('rooms', []);
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2,
]
];
}
$apiUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"City" => $city
],
"Filters" => [
"Keywords" => "",
"Category" => [],
"OnlyAvailable" => false,
"Tags" => $tag
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $apiUrl);
$content = $response->getContent();
// Liste des id des villes disponibles
$cities = [
10 =>"Hammamet",
11 =>"Nabeul",
12 =>"Kelibia",
13 =>"Korba",
14 =>"Korbous",
17 =>"Kairouan",
18 =>"Djerba",
19 =>"Zarzis",
20 =>"Douz",
22 =>"Kebili",
23 =>"Ksar Ghilane",
30 =>"Tunis",
31 =>"Ain Drahem",
33 =>"Tabarka",
34 =>"Sousse",
35 =>"Mahdia",
37 =>"Monastir",
39 =>"Sfax",
44 =>"Djerba-Midoun",
47 =>"Tozeur",
48 =>"Bizerte",
49 =>"Le Kef",
54 =>"Gafsa",
55 =>"Gabes",
59 =>"Zaghouan",
70 =>"Tataouine",
71 =>"Téboursouk",
72 =>"Sbeitla",
73 =>"Matmata",
74 =>"Sidi Bouzid",
75 =>"Nefta",
76 =>"Mednenine",
77 =>"Beja",
78 =>"El Jem",
79 =>"Gammarth"
];
// Liste des id des themes
$tags = [
1 =>"Last minute",
2 =>"All inclusive",
3 =>"Famille",
5 =>"Centre de Thalasso",
6 =>"Petit Prix",
7 =>"Mini Club",
9 =>"Romance",
10 =>"Luxe",
14 =>"Affaires",
15 =>"Sport & Loisir",
16 =>"Club",
17 =>"Nature et Aventure",
19 =>"Bord de Mer"
];
// Passe le contenu directement à la vue Twig
return $this->render('home/list_search.html.twig', [
'content' => $content,
'checkIn' => $checkIn,
'checkOut' => $checkOut,
'rooms' => $rooms,
'city' => $city,
'cities' => $cities,
'tag' => $tag,
'tags' => $tags,
]);
}
/**
* @Route("/detail-search/{city}/{id}", name="detail_search")
*/
public function detailSearch($city,$id,Request $request): Response
{
$today = new \DateTime();
// Date de check-in (par défaut aujourd'hui)
$checkIn = $request->query->get('checkIn', $today->format('Y-m-d'));
// Date de check-out (par défaut aujourd'hui + 1 jour)
$checkOut = $request->query->get('checkOut', $today->modify('+1 day')->format('Y-m-d'));
$city = $request->get('city', '');
$rooms = $request->query->get('rooms', []);
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2
]
];
}
$apiUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"City" => $city,
"Hotel" => $id
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $apiUrl);
$content = $response->getContent();
//test controlleur
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2,
"Child" => [" "]
]
];
}
$testUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"City" => $city
],
"Filters" => [
"Keywords" => "",
"Category" => [],
"OnlyAvailable" => false,
"Tags" => ["Nature et Aventure"]
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $testUrl);
$test = $response->getContent();
// Liste des id des villes disponibles
$cities = [
10 =>"Hammamet",
11 =>"Nabeul",
12 =>"Kelibia",
13 =>"Korba",
14 =>"Korbous",
17 =>"Kairouan",
18 =>"Djerba",
19 =>"Zarzis",
20 =>"Douz",
22 =>"Kebili",
23 =>"Ksar Ghilane",
30 =>"Tunis",
31 =>"Ain Drahem",
33 =>"Tabarka",
34 =>"Sousse",
35 =>"Mahdia",
37 =>"Monastir",
39 =>"Sfax",
44 =>"Djerba-Midoun",
47 =>"Tozeur",
48 =>"Bizerte",
49 =>"Le Kef",
54 =>"Gafsa",
55 =>"Gabes",
59 =>"Zaghouan",
70 =>"Tataouine",
71 =>"Téboursouk",
72 =>"Sbeitla",
73 =>"Matmata",
74 =>"Sidi Bouzid",
75 =>"Nefta",
76 =>"Mednenine",
77 =>"Beja",
78 =>"El Jem",
79 =>"Gammarth"
];
//test fin
//Hotel Détail
// URL de l'API pour obtenir les détails de l'hôtel avec l'identifiant $id
$detailUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelDetail&request={%0A%20%20%22Credential%22%3A%20{%0A%20%20%20%20%22Login%22%3A%20%22XMLRUSTICA%22%2C%0A%20%20%20%20%22Password%22%3A%20%22Q-VCaJaqrEDnTYjTbncD%22%0A%20%20}%2C%0A%20%20%22Hotel%22%3A'.$id.'%0A}';
// Récupérer les détails de l'hôtel depuis l'API
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $detailUrl);
$detail = $response->getContent();
// Passe le contenu directement à la vue Twig
return $this->render('home/detail_search.html.twig', [
'content' => $content,
'detail' => $detail,
'test' => $test,
'checkIn' => $checkIn,
'checkOut' => $checkOut,
'rooms' => $rooms,
'hotelId' => $id,
'cityId' => $city,
'cities' => $cities,
]);
}
/**
* @Route("/validation/{id}", name="validation")
*/
public function validation($id,Request $request): Response
{
// Récupérer les paramètres depuis la requête
$hotelName = $request->query->get('hotelName');
$hotelCity = $request->query->get('hotelCity');
$hotelImage = $request->query->get('hotelImage');
$checkinDate = $request->query->get('checkin');
$checkoutDate = $request->query->get('checkout');
$total = $request->query->get('total');
$boarding = $request->query->get('boarding');
$roomDetails = json_decode($request->query->get('rooms'), true);
$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();
$especeClient = $coordonnees->isEspece();
$chequeClient = $coordonnees->isCheque();
$agencebkClient = $coordonnees->isAgencebk();
$agencetnClient = $coordonnees->isAgencetn();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($coordonnees);
$entityManager->flush();
}
//$roomNames = $request->query->get('rooms');
return $this->render('home/reservation.html.twig', [
'hotel_id' => $id,
'checkin_date' => $checkinDate,
'checkout_date' => $checkoutDate,
'total' => $total,
'boarding' => $boarding,
'room_details' => $roomDetails,
'hotelName' => $hotelName,
'hotelCity' => $hotelCity,
'hotelImage' => $hotelImage,
'form' => $form->createView(),
'coordonnees' => $coordonnees,
//'room_names' => explode(',', $roomNames) // Convertir en tableau
]);
}
/**
* @Route("/envoyer-hotels", name="envoyer_hotels", methods={"POST"})
*/
public function envoyerEmails(Request $request, MailerInterface $mailer, EntityManagerInterface $entityManager)
{
// Récupérez les données JSON envoyées depuis le frontend
$data = json_decode($request->getContent(), true);
// Récupérez l'adresse e-mail du client à partir des données du formulaire
$emailClient = $data['emailClient'];
$message = (new Email())
->from(new Address('reservation@rusticavoyages.com', 'Rustica Voyages'))
->to($emailClient)
->subject('Récapitulatif des chambres sélectionnées')
->html($this->renderView('home/reservation_details.html.twig', [
'emailData' => $data,
'nomClient' => $data['nomClient'], // Ajoutez le nom du client
'prenomClient' => $data['prenomClient'], // Ajoutez le prénom du client
]));
// Envoyez l'email
$mailer->send($message);
// Construisez le contenu de l'email
$message = (new Email())
->from(new Address('reservation@rusticavoyages.com', 'Rustica Voyages'))
->to('reservation@rusticavoyages.com')
->subject('Récapitulatif des chambres sélectionnées')
->html($this->renderView('home/reservation_agence.html.twig', [
'emailData' => $data,
'boarding' => $data['boarding'],
'roomDetails' => $data['roomDetails'], // Ajoutez les détails des chambres
'total' => $data['total'],
'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 mobile du client
'messageClient' => $data['messageClient'], // Ajoutez le message du client
'especeClient' => $data['especeClient'],
'chequeClient' => $data['chequeClient'],
'agencebkClient' => $data['agencebkClient'],
'agencetnClient' => $data['agencetnClient'],
]));
// Envoyez l'email
$mailer->send($message);
// Construisez le contenu de l'email
// // Envoyez l'email
// $mailer->send($message);
// Répondez avec une confirmation (modifiable en fonction de vos besoins)
return $this->redirectToRoute('app_list'); // Remplacez 'accueil' par le nom de votre route d'accueil
}
/**
* @Route("/hotel-results/{city}", name="hotel_results")
*/
public function showResults($city, Request $request): Response
{
$today = new \DateTime();
// Date de check-in (par défaut aujourd'hui)
$checkIn = $request->query->get('checkIn', $today->format('Y-m-d'));
// Date de check-out (par défaut aujourd'hui + 1 jour)
$checkOut = $request->query->get('checkOut', $today->modify('+1 day')->format('Y-m-d'));
$city = $request->get('city', '');
$tag = $request->get('tag', '');
$rooms = $request->query->get('rooms', []);
if (empty($rooms)) {
$rooms = [
[
"Adult" => 2,
]
];
}
$apiUrl = 'https://admin.tunisiabeds.tn/Postman/postman.php?url=HotelSearch&request=' . urlencode(json_encode([
"Credential" => [
"Login" => "XMLRUSTICA",
"Password" => "Q-VCaJaqrEDnTYjTbncD"
],
"SearchDetails" => [
"BookingDetails" => [
"CheckIn" => $checkIn,
"CheckOut" => $checkOut,
"City" => $city
],
"Filters" => [
"Keywords" => "",
"Category" => [],
"OnlyAvailable" => false,
"Tags" => $tag
],
"Rooms" => $rooms
]
]));
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', $apiUrl);
$content = $response->getContent();
// Liste des id des villes disponibles
$cities = [
10 =>"Hammamet",
11 =>"Nabeul",
12 =>"Kelibia",
13 =>"Korba",
14 =>"Korbous",
17 =>"Kairouan",
18 =>"Djerba",
19 =>"Zarzis",
20 =>"Douz",
22 =>"Kebili",
23 =>"Ksar Ghilane",
30 =>"Tunis",
31 =>"Ain Drahem",
33 =>"Tabarka",
34 =>"Sousse",
35 =>"Mahdia",
37 =>"Monastir",
39 =>"Sfax",
44 =>"Djerba-Midoun",
47 =>"Tozeur",
48 =>"Bizerte",
49 =>"Le Kef",
54 =>"Gafsa",
55 =>"Gabes",
59 =>"Zaghouan",
70 =>"Tataouine",
71 =>"Téboursouk",
72 =>"Sbeitla",
73 =>"Matmata",
74 =>"Sidi Bouzid",
75 =>"Nefta",
76 =>"Mednenine",
77 =>"Beja",
78 =>"El Jem",
79 =>"Gammarth"
];
// Liste des id des themes
$tags = [
1 =>"Last minute",
2 =>"All inclusive",
3 =>"Famille",
5 =>"Centre de Thalasso",
6 =>"Petit Prix",
7 =>"Mini Club",
9 =>"Romance",
10 =>"Luxe",
14 =>"Affaires",
15 =>"Sport & Loisir",
16 =>"Club",
17 =>"Nature et Aventure",
19 =>"Bord de Mer"
];
// Passe le contenu directement à la vue Twig
return $this->render('home/hotel_results.html.twig', [
'content' => $content,
'checkIn' => $checkIn,
'checkOut' => $checkOut,
'rooms' => $rooms,
'city' => $city,
'cities' => $cities,
'tag' => $tag,
'tags' => $tags,
]);
}
}