src/Controller/CroisiereController.php line 344

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Client;
  4. use App\Entity\Paiement;
  5. use App\Entity\Agence;
  6. use App\Entity\Croisiere;
  7. use App\Entity\Detailreservationcroisiere;
  8. use App\Entity\Navire;
  9. use App\Entity\Reservationcroisiere;
  10. use App\Entity\Souscroisiere;
  11. use App\Entity\SousCroisierePrice;
  12. use App\Form\SearchByNavireType;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Knp\Component\Pager\PaginatorInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mime\Email;
  22. use Symfony\Component\Mime\Address// Import Address class
  23. use Symfony\Component\Routing\Annotation\Route;
  24. class CroisiereController extends AbstractController
  25. {
  26.     /**
  27.      * @Route("/croisiere", name="app_croisiere")
  28.      */
  29.     public function index(PaginatorInterface $paginatorRequest $request): Response
  30.     {
  31.         $em $this->getDoctrine()->getManager();
  32.         $data =   $em->createQueryBuilder()
  33.             ->select('c')
  34.             ->from('App\Entity\Croisiere','c')
  35.             ->where('c.etat = 1')
  36.             ->getQuery()
  37.             ->getResult()
  38.         ;
  39.         $croisiere $paginator->paginate(
  40.             $data,
  41.             $request->query->getInt('page'1),
  42.             6
  43.         );
  44.         return $this->render('croisiere/index.html.twig', [
  45.             'croisiere' => $croisiere
  46.         ]);
  47.     }
  48. //     /**
  49. //  * @Route("/details/{croisiereId}", name="details")
  50. //  */
  51. // public function details(Request $request, $croisiereId)
  52. // {
  53. //     // Récupération de la croisière spécifique
  54. //     $croisiere = $this->getDoctrine()->getRepository(Croisiere::class)->find($croisiereId);
  55. //     // Récupérez la liste des navires disponibles
  56. //     $navires = $this->getDoctrine()->getRepository(Navire::class)->findAll();
  57. //     // Récupérez la liste des navires disponibles
  58. //     $croisieres = $this->getDoctrine()->getRepository(Croisiere::class)->findAll();
  59. //     // Récupérez le titre du navire depuis la requête POST
  60. //     $navireTitre = $request->request->get('navire_titre');
  61. //     // Récupération du nom de la sous-croisière depuis la requête POST
  62. //     $name = $request->request->get('name');
  63. //     // Récupération de durée de la sous-croisière depuis la requête POST
  64. //     $duree = $request->request->get('duree');
  65. //     // Récupération de durée de la sous-croisière depuis la requête POST
  66. //     $destination = $request->request->get('destination');
  67. //     // Récupération du nom de la croisière depuis la requête POST
  68. //     $croisiereNom = $request->request->get('croisiere_nom');
  69. //     $dated = $request->request->get('dated'); // Date de départ
  70. //     // Obtenez le Query Builder pour SousCroisiere
  71. //     $queryBuilder = $this->getDoctrine()->getRepository(SousCroisiere::class)->createQueryBuilder('sc')
  72. //         ->join('sc.navire', 'n')
  73. //         ->join('sc.croisiere', 'c')
  74. //         ->leftJoin('sc.souscroisiereprices', 'sp'); // Associez à l'entité SousCroisierePrice
  75. //     // Filtrer par croisière spécifique si pas de nom de croisière dans la requête
  76. //     if ($croisiereNom) {
  77. //         $queryBuilder->where('c.name = :croisiereNom')
  78. //             ->setParameter('croisiereNom', $croisiereNom);
  79. //     } else {
  80. //         $queryBuilder->where('sc.croisiere = :croisiere')
  81. //             ->setParameter('croisiere', $croisiere);
  82. //     }
  83. //     // Ajoutez la condition de recherche par titre de navire si fourni
  84. //     if ($navireTitre) {
  85. //         $queryBuilder->andWhere('n.titre = :navireTitre')
  86. //             ->setParameter('navireTitre', $navireTitre);
  87. //     }
  88. //     // Ajout de la condition de filtrage par nom de sous-croisière si fourni
  89. //     if ($name) {
  90. //         $queryBuilder->andWhere('sc.name = :name')
  91. //             ->setParameter('name', $name);
  92. //     }
  93. //     if ($destination) {
  94. //         $queryBuilder->andWhere('sc.destination = :destination')
  95. //             ->setParameter('destination', $destination);
  96. //     }
  97. //     // Ajout de la condition de filtrage par intervalle de durée
  98. //     if ($duree) {
  99. //         if ($duree == '1-5') {
  100. //             $queryBuilder->andWhere('sc.duree BETWEEN 1 AND 5');
  101. //         } elseif ($duree == '6-9') {
  102. //             $queryBuilder->andWhere('sc.duree BETWEEN 6 AND 9');
  103. //         } elseif ($duree == '9+') {
  104. //             $queryBuilder->andWhere('sc.duree > 9');
  105. //         }
  106. //     }
  107. //     // Ajout de la condition de filtrage par date de départ si fourni
  108. //     if ($dated) {
  109. //         $queryBuilder->andWhere('sp.dated = :dated')
  110. //             ->setParameter('dated', $dated);
  111. //     }
  112. //     // Exécutez la requête et obtenez les résultats
  113. //     $sousCroisieres = $queryBuilder->getQuery()->getResult();
  114. //     // Dans votre contrôleur Symfony
  115. //     $groupedDurations = [
  116. //         '1-5' => [], // Rempli avec des données si nécessaire
  117. //         '6-9' => [],
  118. //         '9+' => []
  119. //     ];
  120. //     // Regrouper les durées de sous-croisières
  121. //     foreach ($sousCroisieres as $sousCroisiere) {
  122. //         if ($sousCroisiere->getDuree() <= 5) {
  123. //             $groupedDurations['1-5'][] = $sousCroisiere;
  124. //         } elseif ($sousCroisiere->getDuree() <= 9) {
  125. //             $groupedDurations['6-9'][] = $sousCroisiere;
  126. //         } else {
  127. //             $groupedDurations['9+'][] = $sousCroisiere;
  128. //         }
  129. //     }
  130.     
  131. //     // Récupération des dates de départ disponibles pour les sous-croisières filtrées
  132. //     $dates = $this->getDoctrine()->getRepository(Souscroisiereprice::class)
  133. //     ->createQueryBuilder('sp')
  134. //     ->select('DISTINCT sp.dated')
  135. //     ->join('sp.souscroisiere', 'sc')
  136. //     ->where('sc IN (:sousCroisieres)')
  137. //     ->setParameter('sousCroisieres', $sousCroisieres)
  138. //     ->orderBy('sp.dated', 'ASC')
  139. //     ->getQuery()
  140. //     ->getResult();
  141. //     //Regroupement des dates par mois et année
  142.     
  143. //     return $this->render('croisiere/details.html.twig', [
  144. //         'croisiere' => $croisiere,
  145. //         'sousCroisieres' => $sousCroisieres,
  146. //         'navires' => $navires, // Passez la liste des navires à la vue
  147. //         'croisieres' => $croisieres, // Passez la liste des navires à la vue
  148. //         'navireTitre' => $navireTitre, // Passez le titre du navire à la vue
  149. //         'name' => $name, // Passez le nom de la sous-croisière à la vue
  150. //         'croisiereNom' => $croisiereNom, // Passez le nom de la croisière à la vue
  151. //         'duree' => $duree, // Passez le nom de la sous-croisière à la vue
  152. //         'groupedDurations' => $groupedDurations, // Passez les intervalles regroupés à la vue
  153. //         'destination' => $destination, // Passez le nom de la sous-croisière à la vue
  154. //         'dated' => $dated, // Passez la date de départ à la vue
  155. //         'dates' => $dates // Passez les dates de départ disponibles à la vue
  156. //     ]);
  157. // }
  158.     /**
  159.      * @Route("/details/{croisiereId}", name="details")
  160.      */
  161.     public function details(Request $request$croisiereId)
  162.     {
  163.         // Récupération de la croisière spécifique
  164.         $croisiere $this->getDoctrine()->getRepository(Croisiere::class)->find($croisiereId);
  165.         // Récupérez la liste des navires disponibles
  166.         $navires $this->getDoctrine()->getRepository(Navire::class)->findAll();
  167.         // Récupérez la liste des croisières disponibles
  168.         $croisieres $this->getDoctrine()->getRepository(Croisiere::class)->findAll();
  169.         // Récupérez le titre du navire depuis la requête POST
  170.         $navireTitre $request->request->get('navire_titre');
  171.         // Récupération du nom de la sous-croisière depuis la requête POST
  172.         $name $request->request->get('name');
  173.         // Récupération de durée de la sous-croisière depuis la requête POST
  174.         $duree $request->request->get('duree');
  175.         // Récupération de durée de la sous-croisière depuis la requête POST
  176.         $destination $request->request->get('destination');
  177.         // Récupération du nom de la croisière depuis la requête POST
  178.         $croisiereNom $request->request->get('croisiere_nom');
  179.         $dated $request->request->get('dated'); // Date de départ
  180.         // Récupération de la sélection mois-année depuis la requête POST
  181.         $monthYear $request->request->get('monthYear');
  182.         $month null;
  183.         $year null;
  184.         if ($monthYear) {
  185.             list($month$year) = explode('-'$monthYear);
  186.             $month intval($month);
  187.             $year intval($year);
  188.         }
  189.         // Obtenez le Query Builder pour SousCroisiere
  190.         $queryBuilder $this->getDoctrine()->getRepository(SousCroisiere::class)->createQueryBuilder('sc')
  191.             ->join('sc.navire''n')
  192.             ->join('sc.croisiere''c')
  193.             ->leftJoin('sc.souscroisiereprices''sp'); // Associez à l'entité SousCroisierePrice
  194.         // Filtrer par croisière spécifique si pas de nom de croisière dans la requête
  195.         if ($croisiereNom) {
  196.             $queryBuilder->where('c.name = :croisiereNom')
  197.                 ->setParameter('croisiereNom'$croisiereNom);
  198.         } else {
  199.             $queryBuilder->where('sc.croisiere = :croisiere')
  200.                 ->setParameter('croisiere'$croisiere);
  201.         }
  202.         // Ajoutez la condition de recherche par titre de navire si fourni
  203.         if ($navireTitre) {
  204.             $queryBuilder->andWhere('n.titre = :navireTitre')
  205.                 ->setParameter('navireTitre'$navireTitre);
  206.         }
  207.         // Ajout de la condition de filtrage par nom de sous-croisière si fourni
  208.         if ($name) {
  209.             $queryBuilder->andWhere('sc.name = :name')
  210.                 ->setParameter('name'$name);
  211.         }
  212.         if ($destination) {
  213.             $queryBuilder->andWhere('sc.destination = :destination')
  214.                 ->setParameter('destination'$destination);
  215.         }
  216.         // Ajout de la condition de filtrage par intervalle de durée
  217.         if ($duree) {
  218.             if ($duree == '1-5') {
  219.                 $queryBuilder->andWhere('sc.duree BETWEEN 1 AND 5');
  220.             } elseif ($duree == '6-9') {
  221.                 $queryBuilder->andWhere('sc.duree BETWEEN 6 AND 9');
  222.             } elseif ($duree == '9+') {
  223.                 $queryBuilder->andWhere('sc.duree > 9');
  224.             }
  225.         }
  226.         // Ajout de la condition de filtrage par date de départ si fourni
  227.         if ($month && $year) {
  228.             $startDate = (new \DateTime())->setDate($year$month1)->format('Y-m-d');
  229.             $endDate = (new \DateTime())->setDate($year$month1)->modify('last day of this month')->format('Y-m-d');
  230.             $queryBuilder->andWhere('sp.dated BETWEEN :startDate AND :endDate')
  231.                 ->setParameter('startDate'$startDate)
  232.                 ->setParameter('endDate'$endDate);
  233.         }
  234.         // Exécutez la requête et obtenez les résultats
  235.         $sousCroisieres $queryBuilder->getQuery()->getResult();
  236.         // Regrouper les durées de sous-croisières
  237.         $groupedDurations = [
  238.             '1-5' => [],
  239.             '6-9' => [],
  240.             '9+' => []
  241.         ];
  242.         foreach ($sousCroisieres as $sousCroisiere) {
  243.             if ($sousCroisiere->getDuree() <= 5) {
  244.                 $groupedDurations['1-5'][] = $sousCroisiere;
  245.             } elseif ($sousCroisiere->getDuree() <= 9) {
  246.                 $groupedDurations['6-9'][] = $sousCroisiere;
  247.             } else {
  248.                 $groupedDurations['9+'][] = $sousCroisiere;
  249.             }
  250.         }
  251.         // Récupération des dates de départ disponibles pour les sous-croisières filtrées
  252.         $dates $this->getDoctrine()->getRepository(Souscroisiereprice::class)
  253.             ->createQueryBuilder('sp')
  254.             ->select('sp.dated')
  255.             ->join('sp.souscroisiere''sc')
  256.             ->where('sc IN (:sousCroisieres)')
  257.             ->setParameter('sousCroisieres'$sousCroisieres)
  258.             ->orderBy('sp.dated''ASC')
  259.             ->getQuery()
  260.             ->getResult();
  261.         return $this->render('croisiere/details.html.twig', [
  262.             'croisiere' => $croisiere,
  263.             'sousCroisieres' => $sousCroisieres,
  264.             'navires' => $navires,
  265.             'croisieres' => $croisieres,
  266.             'navireTitre' => $navireTitre,
  267.             'name' => $name,
  268.             'croisiereNom' => $croisiereNom,
  269.             'duree' => $duree,
  270.             'groupedDurations' => $groupedDurations,
  271.             'destination' => $destination,
  272.             'dated' => $dated,
  273.             'dates' => $dates,
  274.             'monthYear' => $monthYear
  275.         ]);
  276.     }
  277.  
  278.     /**
  279.      * @Route("/sous_croisiere/details/{sousCroisiereId}", name="sous_croisiere_details")
  280.      */
  281.     public function sousCroisiereDetails($sousCroisiereId)
  282.     {
  283.         // Récupération de l'objet SousCroisiere à partir de la base de données en utilisant l'identifiant
  284.         $sousCroisiere $this->getDoctrine()->getRepository(Souscroisiere::class)->find($sousCroisiereId);
  285.     
  286.         $dataByPack = [];
  287.         foreach ($sousCroisiere->getSouscroisiereprices() as $souscroisiereprice) {
  288.             $pack $souscroisiereprice->getPack();
  289.             $dated $souscroisiereprice->getDated()->format('Y-m-d');
  290.             $datef $souscroisiereprice->getDatef()->format('Y-m-d');
  291.             if (!isset($dataByPack[$pack])) {
  292.                 $dataByPack[$pack] = [
  293.                     'dateRanges' => [],
  294.                 ];
  295.             }
  296.             if (!empty($dated) && !empty($datef)) {
  297.                 $dateRange = [
  298.                     'dated' => $dated,
  299.                     'datef' => $datef,
  300.                     'roomData' => [],
  301.                 ];
  302.                 if ($souscroisiereprice->getSouscroisierepricerooms()->count() > 0) {
  303.                     foreach ($souscroisiereprice->getSouscroisierepricerooms() as $souscroisierepricecabine) {
  304.                         $cabine$souscroisierepricecabine->getSouscroisiereroom()->getChambre();
  305.                         $cabineName $cabine->getName();
  306.                         $dateRange['roomData'][$cabineName] = [
  307.                             'cabineroom' => $souscroisierepricecabine->getSouscroisiereroom()->getChambre(),
  308.                             'price' => $souscroisierepricecabine->getPrice(),
  309.                         ];
  310.                     }
  311.                 }
  312.                 $dataByPack[$pack]['dateRanges'][] = $dateRange;
  313.             }
  314.         }
  315.         return $this->render('croisiere/list.html.twig', [
  316.             'sousCroisiere' => $sousCroisiere,
  317.             'dataByPack' => $dataByPack,
  318.         ]);
  319.     }
  320.     /**
  321.      * @Route("/page_suivante/{souscroisiereId}", name="page_suivante")
  322.      */
  323.     public function pageSuivante(Request $request$souscroisiereIdMailerInterface $mailer): Response
  324.     {
  325.         $em $this->getDoctrine()->getManager();
  326.         $souscroisiere $em->createQueryBuilder('s')
  327.             ->select('s')
  328.             ->from('App\Entity\Souscroisiere','s')
  329.             ->where('s.id = :id')
  330.             ->setParameter('id'$souscroisiereId)
  331.             ->getQuery()
  332.             ->getOneOrNullResult()
  333.         ;
  334.         // Récupérez les données depuis le formulaire
  335.         $roomData json_decode($request->request->get('roomData'), true);
  336.         $selectedPack $request->request->get('selectedPack');
  337.         $selectedDate $request->request->get('selectedDate');
  338.         $coordonnees = new Client();
  339.         $form $this->createForm('App\Form\ClientType'$coordonnees);
  340.         $form->handleRequest($request);
  341.         if ($form->isSubmitted() && $form->isValid()) {
  342.             // Si le formulaire est soumis et valide, faites quelque chose avec les données du formulaire
  343.             // Par exemple, persistez les données dans la base de données
  344.             $nomClient $coordonnees->getNom();
  345.             $prenomClient $coordonnees->getPrenom();
  346.             $emailClient $coordonnees->getEmail();
  347.             $mobileClient $coordonnees->getMobile();
  348.             $messageClient $coordonnees->getMessage();
  349.             $especeClient $coordonnees->isEspece();
  350.             $chequeClient $coordonnees->isCheque();
  351.             $agencebkClient $coordonnees->isAgencebk();
  352.             $agencetnClient $coordonnees->isAgencetn();
  353.             $entityManager $this->getDoctrine()->getManager();
  354.             $entityManager->persist($coordonnees);
  355.             $entityManager->flush();
  356.         }
  357.         return $this->render('croisiere/resultat.html.twig', [
  358.             'roomData' => $roomData,
  359.             'selectedPack' => $selectedPack,
  360.             'selectedDate' => $selectedDate,
  361.             'souscroisiereId' => $souscroisiereId,
  362.             'souscroisiere' => $souscroisiere,
  363.             'form' => $form->createView(),
  364.             //'paieform' => $paieform->createView(),
  365.         ]);
  366.     }
  367.     /**
  368.  * @Route("/envoyer-croisiere", name="envoyer_croisiere", methods={"POST"})
  369.  */
  370. public function envoyerEmails(Request $requestMailerInterface $mailerEntityManagerInterface $entityManager): Response
  371. {
  372.     // Récupérez les données JSON envoyées depuis le frontend
  373.     $data json_decode($request->getContent(), true);
  374.     // Récupérez l'adresse e-mail du client à partir des données du formulaire
  375.     $emailClient $data['emailClient'];
  376.     // Construisez le contenu de l'email
  377.     $message = (new Email())
  378.         ->from(new Address('reservation@rusticavoyages.com''Rustica Voyages'))
  379.         ->to('reservation@rusticavoyages.com')
  380.         ->subject('Récapitulatif des chambres sélectionnées')
  381.         ->html($this->renderView('croisiere/email_template.html.twig', [
  382.             'emailData' => $data,
  383.             'selectedPack' => $data['selectedPack'],
  384.             'selectedDate' => $data['selectedDate'],
  385.             'nomClient' => $data['nomClient'], // Ajoutez le nom du client
  386.             'prenomClient' => $data['prenomClient'], // Ajoutez le prénom du client
  387.             'emailClient' => $data['emailClient'], // Ajoutez l'email du client
  388.             'mobileClient' => $data['mobileClient'], // Ajoutez le mobile du client
  389.             'messageClient' => $data['messageClient'], // Ajoutez le message du client
  390.             'especeClient' => $data['especeClient'],
  391.             'chequeClient' => $data['chequeClient'],
  392.             'agencebkClient' => $data['agencebkClient'],
  393.             'agencetnClient' => $data['agencetnClient'],
  394.             'typeChambresSelectionnes' => $data['typeChambresSelectionnes'], // Ajoutez les types de chambre sélectionnés avec le nombre d'adultes et d'enfants
  395.         ]));
  396.     
  397.     // Envoyez l'email
  398.     $mailer->send($message);
  399.     // Construisez le contenu de l'email
  400.     $message = (new Email())
  401.     ->from(new Address('reservation@rusticavoyages.com''Rustica Voyages'))
  402.         ->to($emailClient)
  403.         ->subject('Récapitulatif des chambres sélectionnées')
  404.         ->html($this->renderView('croisiere/email_template_agence.html.twig', [
  405.             'emailData' => $data,
  406.             'nomClient' => $data['nomClient'], // Ajoutez le nom du client
  407.             'prenomClient' => $data['prenomClient'], // Ajoutez le prénom du client
  408.         ]));
  409.     
  410.     // Envoyez l'email
  411.     $mailer->send($message);
  412.     // Persistez les données dans l'entité Reservation
  413.     $reservation = new Reservationcroisiere();
  414.     $reservation->setNomClient($data['nomClient']);
  415.     $reservation->setPrenomClient($data['prenomClient']);
  416.     $reservation->setEmailClient($data['emailClient']);
  417.     $reservation->setMobileClient($data['mobileClient']);
  418.     $reservation->setMessageClient($data['messageClient']);
  419.     $reservation->setSelectedPack($data['selectedPack']);
  420.     $reservation->setPeriode($data['selectedDate']);
  421.     // Ajoutez les détails des chambres à la réservation
  422.     foreach ($data['typeChambresSelectionnes'] as $chambre) {
  423.         $detailChambre = new Detailreservationcroisiere();
  424.         $detailChambre->setNomTypeChambre($chambre['nom']);
  425.         $detailChambre->setNombreAdultes($chambre['nombreAdultes']);
  426.         $detailChambre->setNombreEnfants($chambre['nombreEnfants']);
  427.         $reservation->addDetailreservationcroisiere($detailChambre);
  428.     }
  429.     $client = new Client();
  430.         $client->setNom($data['nomClient']);
  431.         $client->setPrenom($data['prenomClient']);
  432.         $client->setEmail($data['emailClient']);
  433.         $client->setMobile($data['mobileClient']);
  434.         $client->setMessage($data['messageClient']);
  435.         $client->setCheque($data['chequeClient']);
  436.         $client->setEspece($data['especeClient']);
  437.         $client->setAgencebk($data['agencebkClient']);
  438.         $client->setAgencetn($data['agencetnClient']);
  439.         $client->setAgencetn($data['agencetnClient']);
  440.     // Persistez les entités
  441.     $entityManager->persist($reservation);
  442.     $entityManager->persist($detailChambre);
  443.     $entityManager->persist($client);
  444.     $entityManager->flush();
  445.     // Répondez avec une confirmation (modifiable en fonction de vos besoins)
  446.     return $this->redirectToRoute('app_list'); // Remplacez 'accueil' par le nom de votre route d'accueil
  447. }
  448. }