<?php
namespace App\Controller;
use App\Entity\Client;
use App\Entity\Paiement;
use App\Entity\Agence;
use App\Entity\Croisiere;
use App\Entity\Detailreservationcroisiere;
use App\Entity\Navire;
use App\Entity\Reservationcroisiere;
use App\Entity\Souscroisiere;
use App\Entity\SousCroisierePrice;
use App\Form\SearchByNavireType;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address; // Import Address class
use Symfony\Component\Routing\Annotation\Route;
class CroisiereController extends AbstractController
{
/**
* @Route("/croisiere", name="app_croisiere")
*/
public function index(PaginatorInterface $paginator, Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$data = $em->createQueryBuilder()
->select('c')
->from('App\Entity\Croisiere','c')
->where('c.etat = 1')
->getQuery()
->getResult()
;
$croisiere = $paginator->paginate(
$data,
$request->query->getInt('page', 1),
6
);
return $this->render('croisiere/index.html.twig', [
'croisiere' => $croisiere
]);
}
// /**
// * @Route("/details/{croisiereId}", name="details")
// */
// public function details(Request $request, $croisiereId)
// {
// // Récupération de la croisière spécifique
// $croisiere = $this->getDoctrine()->getRepository(Croisiere::class)->find($croisiereId);
// // Récupérez la liste des navires disponibles
// $navires = $this->getDoctrine()->getRepository(Navire::class)->findAll();
// // Récupérez la liste des navires disponibles
// $croisieres = $this->getDoctrine()->getRepository(Croisiere::class)->findAll();
// // Récupérez le titre du navire depuis la requête POST
// $navireTitre = $request->request->get('navire_titre');
// // Récupération du nom de la sous-croisière depuis la requête POST
// $name = $request->request->get('name');
// // Récupération de durée de la sous-croisière depuis la requête POST
// $duree = $request->request->get('duree');
// // Récupération de durée de la sous-croisière depuis la requête POST
// $destination = $request->request->get('destination');
// // Récupération du nom de la croisière depuis la requête POST
// $croisiereNom = $request->request->get('croisiere_nom');
// $dated = $request->request->get('dated'); // Date de départ
// // Obtenez le Query Builder pour SousCroisiere
// $queryBuilder = $this->getDoctrine()->getRepository(SousCroisiere::class)->createQueryBuilder('sc')
// ->join('sc.navire', 'n')
// ->join('sc.croisiere', 'c')
// ->leftJoin('sc.souscroisiereprices', 'sp'); // Associez à l'entité SousCroisierePrice
// // Filtrer par croisière spécifique si pas de nom de croisière dans la requête
// if ($croisiereNom) {
// $queryBuilder->where('c.name = :croisiereNom')
// ->setParameter('croisiereNom', $croisiereNom);
// } else {
// $queryBuilder->where('sc.croisiere = :croisiere')
// ->setParameter('croisiere', $croisiere);
// }
// // Ajoutez la condition de recherche par titre de navire si fourni
// if ($navireTitre) {
// $queryBuilder->andWhere('n.titre = :navireTitre')
// ->setParameter('navireTitre', $navireTitre);
// }
// // Ajout de la condition de filtrage par nom de sous-croisière si fourni
// if ($name) {
// $queryBuilder->andWhere('sc.name = :name')
// ->setParameter('name', $name);
// }
// if ($destination) {
// $queryBuilder->andWhere('sc.destination = :destination')
// ->setParameter('destination', $destination);
// }
// // Ajout de la condition de filtrage par intervalle de durée
// if ($duree) {
// if ($duree == '1-5') {
// $queryBuilder->andWhere('sc.duree BETWEEN 1 AND 5');
// } elseif ($duree == '6-9') {
// $queryBuilder->andWhere('sc.duree BETWEEN 6 AND 9');
// } elseif ($duree == '9+') {
// $queryBuilder->andWhere('sc.duree > 9');
// }
// }
// // Ajout de la condition de filtrage par date de départ si fourni
// if ($dated) {
// $queryBuilder->andWhere('sp.dated = :dated')
// ->setParameter('dated', $dated);
// }
// // Exécutez la requête et obtenez les résultats
// $sousCroisieres = $queryBuilder->getQuery()->getResult();
// // Dans votre contrôleur Symfony
// $groupedDurations = [
// '1-5' => [], // Rempli avec des données si nécessaire
// '6-9' => [],
// '9+' => []
// ];
// // Regrouper les durées de sous-croisières
// foreach ($sousCroisieres as $sousCroisiere) {
// if ($sousCroisiere->getDuree() <= 5) {
// $groupedDurations['1-5'][] = $sousCroisiere;
// } elseif ($sousCroisiere->getDuree() <= 9) {
// $groupedDurations['6-9'][] = $sousCroisiere;
// } else {
// $groupedDurations['9+'][] = $sousCroisiere;
// }
// }
// // Récupération des dates de départ disponibles pour les sous-croisières filtrées
// $dates = $this->getDoctrine()->getRepository(Souscroisiereprice::class)
// ->createQueryBuilder('sp')
// ->select('DISTINCT sp.dated')
// ->join('sp.souscroisiere', 'sc')
// ->where('sc IN (:sousCroisieres)')
// ->setParameter('sousCroisieres', $sousCroisieres)
// ->orderBy('sp.dated', 'ASC')
// ->getQuery()
// ->getResult();
// //Regroupement des dates par mois et année
// return $this->render('croisiere/details.html.twig', [
// 'croisiere' => $croisiere,
// 'sousCroisieres' => $sousCroisieres,
// 'navires' => $navires, // Passez la liste des navires à la vue
// 'croisieres' => $croisieres, // Passez la liste des navires à la vue
// 'navireTitre' => $navireTitre, // Passez le titre du navire à la vue
// 'name' => $name, // Passez le nom de la sous-croisière à la vue
// 'croisiereNom' => $croisiereNom, // Passez le nom de la croisière à la vue
// 'duree' => $duree, // Passez le nom de la sous-croisière à la vue
// 'groupedDurations' => $groupedDurations, // Passez les intervalles regroupés à la vue
// 'destination' => $destination, // Passez le nom de la sous-croisière à la vue
// 'dated' => $dated, // Passez la date de départ à la vue
// 'dates' => $dates // Passez les dates de départ disponibles à la vue
// ]);
// }
/**
* @Route("/details/{croisiereId}", name="details")
*/
public function details(Request $request, $croisiereId)
{
// Récupération de la croisière spécifique
$croisiere = $this->getDoctrine()->getRepository(Croisiere::class)->find($croisiereId);
// Récupérez la liste des navires disponibles
$navires = $this->getDoctrine()->getRepository(Navire::class)->findAll();
// Récupérez la liste des croisières disponibles
$croisieres = $this->getDoctrine()->getRepository(Croisiere::class)->findAll();
// Récupérez le titre du navire depuis la requête POST
$navireTitre = $request->request->get('navire_titre');
// Récupération du nom de la sous-croisière depuis la requête POST
$name = $request->request->get('name');
// Récupération de durée de la sous-croisière depuis la requête POST
$duree = $request->request->get('duree');
// Récupération de durée de la sous-croisière depuis la requête POST
$destination = $request->request->get('destination');
// Récupération du nom de la croisière depuis la requête POST
$croisiereNom = $request->request->get('croisiere_nom');
$dated = $request->request->get('dated'); // Date de départ
// Récupération de la sélection mois-année depuis la requête POST
$monthYear = $request->request->get('monthYear');
$month = null;
$year = null;
if ($monthYear) {
list($month, $year) = explode('-', $monthYear);
$month = intval($month);
$year = intval($year);
}
// Obtenez le Query Builder pour SousCroisiere
$queryBuilder = $this->getDoctrine()->getRepository(SousCroisiere::class)->createQueryBuilder('sc')
->join('sc.navire', 'n')
->join('sc.croisiere', 'c')
->leftJoin('sc.souscroisiereprices', 'sp'); // Associez à l'entité SousCroisierePrice
// Filtrer par croisière spécifique si pas de nom de croisière dans la requête
if ($croisiereNom) {
$queryBuilder->where('c.name = :croisiereNom')
->setParameter('croisiereNom', $croisiereNom);
} else {
$queryBuilder->where('sc.croisiere = :croisiere')
->setParameter('croisiere', $croisiere);
}
// Ajoutez la condition de recherche par titre de navire si fourni
if ($navireTitre) {
$queryBuilder->andWhere('n.titre = :navireTitre')
->setParameter('navireTitre', $navireTitre);
}
// Ajout de la condition de filtrage par nom de sous-croisière si fourni
if ($name) {
$queryBuilder->andWhere('sc.name = :name')
->setParameter('name', $name);
}
if ($destination) {
$queryBuilder->andWhere('sc.destination = :destination')
->setParameter('destination', $destination);
}
// Ajout de la condition de filtrage par intervalle de durée
if ($duree) {
if ($duree == '1-5') {
$queryBuilder->andWhere('sc.duree BETWEEN 1 AND 5');
} elseif ($duree == '6-9') {
$queryBuilder->andWhere('sc.duree BETWEEN 6 AND 9');
} elseif ($duree == '9+') {
$queryBuilder->andWhere('sc.duree > 9');
}
}
// Ajout de la condition de filtrage par date de départ si fourni
if ($month && $year) {
$startDate = (new \DateTime())->setDate($year, $month, 1)->format('Y-m-d');
$endDate = (new \DateTime())->setDate($year, $month, 1)->modify('last day of this month')->format('Y-m-d');
$queryBuilder->andWhere('sp.dated BETWEEN :startDate AND :endDate')
->setParameter('startDate', $startDate)
->setParameter('endDate', $endDate);
}
// Exécutez la requête et obtenez les résultats
$sousCroisieres = $queryBuilder->getQuery()->getResult();
// Regrouper les durées de sous-croisières
$groupedDurations = [
'1-5' => [],
'6-9' => [],
'9+' => []
];
foreach ($sousCroisieres as $sousCroisiere) {
if ($sousCroisiere->getDuree() <= 5) {
$groupedDurations['1-5'][] = $sousCroisiere;
} elseif ($sousCroisiere->getDuree() <= 9) {
$groupedDurations['6-9'][] = $sousCroisiere;
} else {
$groupedDurations['9+'][] = $sousCroisiere;
}
}
// Récupération des dates de départ disponibles pour les sous-croisières filtrées
$dates = $this->getDoctrine()->getRepository(Souscroisiereprice::class)
->createQueryBuilder('sp')
->select('sp.dated')
->join('sp.souscroisiere', 'sc')
->where('sc IN (:sousCroisieres)')
->setParameter('sousCroisieres', $sousCroisieres)
->orderBy('sp.dated', 'ASC')
->getQuery()
->getResult();
return $this->render('croisiere/details.html.twig', [
'croisiere' => $croisiere,
'sousCroisieres' => $sousCroisieres,
'navires' => $navires,
'croisieres' => $croisieres,
'navireTitre' => $navireTitre,
'name' => $name,
'croisiereNom' => $croisiereNom,
'duree' => $duree,
'groupedDurations' => $groupedDurations,
'destination' => $destination,
'dated' => $dated,
'dates' => $dates,
'monthYear' => $monthYear
]);
}
/**
* @Route("/sous_croisiere/details/{sousCroisiereId}", name="sous_croisiere_details")
*/
public function sousCroisiereDetails($sousCroisiereId)
{
// Récupération de l'objet SousCroisiere à partir de la base de données en utilisant l'identifiant
$sousCroisiere = $this->getDoctrine()->getRepository(Souscroisiere::class)->find($sousCroisiereId);
$dataByPack = [];
foreach ($sousCroisiere->getSouscroisiereprices() as $souscroisiereprice) {
$pack = $souscroisiereprice->getPack();
$dated = $souscroisiereprice->getDated()->format('Y-m-d');
$datef = $souscroisiereprice->getDatef()->format('Y-m-d');
if (!isset($dataByPack[$pack])) {
$dataByPack[$pack] = [
'dateRanges' => [],
];
}
if (!empty($dated) && !empty($datef)) {
$dateRange = [
'dated' => $dated,
'datef' => $datef,
'roomData' => [],
];
if ($souscroisiereprice->getSouscroisierepricerooms()->count() > 0) {
foreach ($souscroisiereprice->getSouscroisierepricerooms() as $souscroisierepricecabine) {
$cabine= $souscroisierepricecabine->getSouscroisiereroom()->getChambre();
$cabineName = $cabine->getName();
$dateRange['roomData'][$cabineName] = [
'cabineroom' => $souscroisierepricecabine->getSouscroisiereroom()->getChambre(),
'price' => $souscroisierepricecabine->getPrice(),
];
}
}
$dataByPack[$pack]['dateRanges'][] = $dateRange;
}
}
return $this->render('croisiere/list.html.twig', [
'sousCroisiere' => $sousCroisiere,
'dataByPack' => $dataByPack,
]);
}
/**
* @Route("/page_suivante/{souscroisiereId}", name="page_suivante")
*/
public function pageSuivante(Request $request, $souscroisiereId, MailerInterface $mailer): Response
{
$em = $this->getDoctrine()->getManager();
$souscroisiere = $em->createQueryBuilder('s')
->select('s')
->from('App\Entity\Souscroisiere','s')
->where('s.id = :id')
->setParameter('id', $souscroisiereId)
->getQuery()
->getOneOrNullResult()
;
// Récupérez les données depuis le formulaire
$roomData = json_decode($request->request->get('roomData'), true);
$selectedPack = $request->request->get('selectedPack');
$selectedDate = $request->request->get('selectedDate');
$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();
$emailClient = $coordonnees->getEmail();
$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();
}
return $this->render('croisiere/resultat.html.twig', [
'roomData' => $roomData,
'selectedPack' => $selectedPack,
'selectedDate' => $selectedDate,
'souscroisiereId' => $souscroisiereId,
'souscroisiere' => $souscroisiere,
'form' => $form->createView(),
//'paieform' => $paieform->createView(),
]);
}
/**
* @Route("/envoyer-croisiere", name="envoyer_croisiere", methods={"POST"})
*/
public function envoyerEmails(Request $request, MailerInterface $mailer, EntityManagerInterface $entityManager): Response
{
// 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'];
// 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('croisiere/email_template.html.twig', [
'emailData' => $data,
'selectedPack' => $data['selectedPack'],
'selectedDate' => $data['selectedDate'],
'nomClient' => $data['nomClient'], // Ajoutez le nom du client
'prenomClient' => $data['prenomClient'], // Ajoutez le prénom du client
'emailClient' => $data['emailClient'], // Ajoutez l'email 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'],
'typeChambresSelectionnes' => $data['typeChambresSelectionnes'], // Ajoutez les types de chambre sélectionnés avec le nombre d'adultes et d'enfants
]));
// Envoyez l'email
$mailer->send($message);
// Construisez le contenu de l'email
$message = (new Email())
->from(new Address('reservation@rusticavoyages.com', 'Rustica Voyages'))
->to($emailClient)
->subject('Récapitulatif des chambres sélectionnées')
->html($this->renderView('croisiere/email_template_agence.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);
// Persistez les données dans l'entité Reservation
$reservation = new Reservationcroisiere();
$reservation->setNomClient($data['nomClient']);
$reservation->setPrenomClient($data['prenomClient']);
$reservation->setEmailClient($data['emailClient']);
$reservation->setMobileClient($data['mobileClient']);
$reservation->setMessageClient($data['messageClient']);
$reservation->setSelectedPack($data['selectedPack']);
$reservation->setPeriode($data['selectedDate']);
// Ajoutez les détails des chambres à la réservation
foreach ($data['typeChambresSelectionnes'] as $chambre) {
$detailChambre = new Detailreservationcroisiere();
$detailChambre->setNomTypeChambre($chambre['nom']);
$detailChambre->setNombreAdultes($chambre['nombreAdultes']);
$detailChambre->setNombreEnfants($chambre['nombreEnfants']);
$reservation->addDetailreservationcroisiere($detailChambre);
}
$client = new Client();
$client->setNom($data['nomClient']);
$client->setPrenom($data['prenomClient']);
$client->setEmail($data['emailClient']);
$client->setMobile($data['mobileClient']);
$client->setMessage($data['messageClient']);
$client->setCheque($data['chequeClient']);
$client->setEspece($data['especeClient']);
$client->setAgencebk($data['agencebkClient']);
$client->setAgencetn($data['agencetnClient']);
$client->setAgencetn($data['agencetnClient']);
// Persistez les entités
$entityManager->persist($reservation);
$entityManager->persist($detailChambre);
$entityManager->persist($client);
$entityManager->flush();
// 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
}
}