src/Controller/SpaceController.php line 34
<?php
namespace App\Controller;
use App\Entity\Booking;
use App\Repository\BookingRepository;
use App\Entity\LocalEvent;
use App\Repository\LocalEventRepository;
use App\Entity\Space;
use App\Repository\SpaceRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class SpaceController extends AbstractController
{
#[Route('/espace-coworking-perpignan', name: 'space', methods: ['GET'])]
public function space(SpaceRepository $spaceRepository): Response
{
return $this->render('front/space.html.twig', [
'spaces' => $spaceRepository->findAll(),
'page_title' => 'espaces coworking à perpignan',
'page_description' => 'description des espaces de coworking perpignan',
]);
}
#[Route('/espace-coworking-perpignan/{slug}', name: 'space_show', methods: ['GET', 'POST'])]
public function space_show(Space $space, Request $request, BookingRepository $bookingRepository, SpaceRepository $spaceRepository, LocalEventRepository $localEventRepository): Response
{
// Création du formulaire de réservation
$form = $this->createFormBuilder()
->add('startAt', DateTimeType::class, [
'label' => 'Date de début',
'widget' => 'single_text',
'input' => 'datetime_immutable',
'html5' => true,
'attr' => ['min' => (new DateTimeImmutable())->format('Y-m-d\TH:i')],
])
->add('endAt', DateTimeType::class, [
'label' => 'Date de fin',
'widget' => 'single_text',
'input' => 'datetime_immutable',
'html5' => true,
'attr' => ['min' => (new DateTimeImmutable())->format('Y-m-d\TH:i')],
])
->add('submit', SubmitType::class, [
'label' => 'Vérifier la disponibilité',
'attr' => ['class' => 'btn btn-primary'],
])
->getForm();
// Traitement du formulaire
$form->handleRequest($request);
$message = '';
$spaceName = $space->getName();
// Vérification de la soumission du formulaire et de la validité des données
if ($form->isSubmitted() && $form->isValid()) {
// Récupération des dates de début et de fin
$data = $form->getData();
$startAt = $data['startAt'];
$endAt = $data['endAt'];
// Recherche des réservations pour l'espace et la période sélectionnée
$bookings = $bookingRepository->findBookingsBySpaceAndDateRange($space, $startAt, $endAt);
// Vérifie si des réservations existent pour l'espace et la période sélectionnée
if (count($bookings) > 0) {
$bookingStatus = $bookings[0]->getStatus();
// Si une réservation est confirmée, l'espace n'est pas disponible (status='confirmed')
if ($bookingStatus === 'confirmed') {
$message = sprintf('Désolé, %s n\'est pas disponible aux dates choisies.', $space->getName());
} elseif ($bookingStatus === 'cancelled') {
// Si la réservation a été annulée, l'espace est disponible (status='cancelled')
$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());
} else {
// Si une option a été posée pour la même date (status='pending')
$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());
}
} else {
// Si aucune réservation n'existe, l'espace est disponible
$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());
}
}
// Récupération des 3 derniers événements passés de l'espace
$lastEvents = $localEventRepository->findLastEventsBySpace($space);
// Affichage de la page
return $this->render('front/space_show.html.twig', [
'space' => $space,
'page_title' => 'espace coworking',
'page_description' => 'description coworking perpignan',
'form' => $form->createView(),
'message' => $message,
'startAt' => $startAt ?? null,
'endAt' => $endAt ?? null,
'spaceName' => $spaceName,
'last_events' => $lastEvents,
]);
}
}