src/Controller/SpaceController.php line 34

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Booking;
  4. use App\Repository\BookingRepository;
  5. use App\Entity\LocalEvent;
  6. use App\Repository\LocalEventRepository;
  7. use App\Entity\Space;
  8. use App\Repository\SpaceRepository;
  9. use DateTimeImmutable;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  13. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class SpaceController extends AbstractController
  19. {
  20.     #[Route('/espace-coworking-perpignan'name'space'methods: ['GET'])]
  21.     public function space(SpaceRepository $spaceRepository): Response
  22.     {
  23.         return $this->render('front/space.html.twig', [
  24.             'spaces' => $spaceRepository->findAll(),
  25.             'page_title' => 'espaces coworking à perpignan',
  26.             'page_description' => 'description des espaces de coworking perpignan',
  27.         ]);
  28.     }
  29.     #[Route('/espace-coworking-perpignan/{slug}'name'space_show'methods: ['GET''POST'])]
  30.     public function space_show(Space $spaceRequest $requestBookingRepository $bookingRepositorySpaceRepository $spaceRepositoryLocalEventRepository $localEventRepository): Response
  31.     {
  32.         // Création du formulaire de réservation
  33.         $form $this->createFormBuilder()
  34.             ->add('startAt'DateTimeType::class, [
  35.                 'label' => 'Date de début',
  36.                 'widget' => 'single_text',
  37.                 'input' => 'datetime_immutable',
  38.                 'html5' => true,
  39.                 'attr' => ['min' => (new DateTimeImmutable())->format('Y-m-d\TH:i')],
  40.             ])
  41.             ->add('endAt'DateTimeType::class, [
  42.                 'label' => 'Date de fin',
  43.                 'widget' => 'single_text',
  44.                 'input' => 'datetime_immutable',
  45.                 'html5' => true,
  46.                 'attr' => ['min' => (new DateTimeImmutable())->format('Y-m-d\TH:i')],
  47.             ])
  48.             ->add('submit'SubmitType::class, [
  49.                 'label' => 'Vérifier la disponibilité',
  50.                 'attr' => ['class' => 'btn btn-primary'],
  51.             ])
  52.             ->getForm();
  53.         // Traitement du formulaire
  54.         $form->handleRequest($request);
  55.         $message '';
  56.         $spaceName $space->getName();
  57.         // Vérification de la soumission du formulaire et de la validité des données
  58.         if ($form->isSubmitted() && $form->isValid()) {
  59.             // Récupération des dates de début et de fin
  60.             $data $form->getData();
  61.             $startAt $data['startAt'];
  62.             $endAt $data['endAt'];
  63.             // Recherche des réservations pour l'espace et la période sélectionnée
  64.             $bookings $bookingRepository->findBookingsBySpaceAndDateRange($space$startAt$endAt);
  65.             // Vérifie si des réservations existent pour l'espace et la période sélectionnée
  66.             if (count($bookings) > 0) {
  67.                 $bookingStatus $bookings[0]->getStatus();
  68.                 // Si une réservation est confirmée, l'espace n'est pas disponible (status='confirmed')
  69.                 if ($bookingStatus === 'confirmed') {
  70.                     $message sprintf('Désolé, %s n\'est pas disponible aux dates choisies.'$space->getName());
  71.                 } elseif ($bookingStatus === 'cancelled') {
  72.                     // Si la réservation a été annulée, l'espace est disponible (status='cancelled')
  73.                     $message sprintf('%s est disponible aux dates choisies. Appelez le +33 0 00 00 00 00 pour mettre une option ou réserver cet espace.'$space->getName());
  74.                 } else {
  75.                     // Si une option a été posée pour la même date (status='pending')
  76.                     $message sprintf('Quelqu\'un a déjà posé une option sur %s pour cette date, mais vous pouvez poser la vôtre en appelant le +33 0 00 00 00 00.'$space->getName());
  77.                 }
  78.             } else {
  79.                 // Si aucune réservation n'existe, l'espace est disponible
  80.                 $message sprintf('%s est disponible aux dates choisies. Appelez le +33 0 00 00 00 00 pour mettre une option ou réserver cet espace.'$space->getName());
  81.             }
  82.         }
  83.         // Récupération des 3 derniers événements passés de l'espace
  84.         $lastEvents $localEventRepository->findLastEventsBySpace($space);
  85.         // Affichage de la page
  86.         return $this->render('front/space_show.html.twig', [
  87.             'space' => $space,
  88.             'page_title' => 'espace coworking',
  89.             'page_description' => 'description coworking perpignan',
  90.             'form' => $form->createView(),
  91.             'message' => $message,
  92.             'startAt' => $startAt ?? null,
  93.             'endAt' => $endAt ?? null,
  94.             'spaceName' => $spaceName,
  95.             'last_events' => $lastEvents,
  96.         ]);
  97.     }
  98. }