diff --git a/src/Controller/SortieController.php b/src/Controller/SortieController.php index 974854a..cac9415 100644 --- a/src/Controller/SortieController.php +++ b/src/Controller/SortieController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Entity\Etat; use App\Entity\Sortie; use App\Form\SortieType; use App\Repository\EtatRepository; @@ -235,4 +236,35 @@ class SortieController extends AbstractController 'profile' => $userConnect, ]); } + + #[Route('/cancel/{id}', name: 'cancel', methods: ['POST'])] + public function cancel( + string $id, + Request $request, + EntityManagerInterface $entityManager, + TokenStorageInterface $tokenStorage + ): Response { + $user = $tokenStorage->getToken()?->getUser(); + + $sortie = $entityManager->getRepository(Sortie::class)->find($id); + + if (!$sortie || $sortie->getOrganisateur()->getIdParticipant() !== $user->getIdParticipant()) { + $this->addFlash('error', 'Vous n\'avez pas l\'autorisation d\'annuler cette sortie.'); + return $this->redirectToRoute('home'); + } + + $motif = $request->request->get('motif'); + if (!$motif) { + $this->addFlash('error', 'Le motif d\'annulation est obligatoire.'); + return $this->redirectToRoute('sortie_view', ['id' => $id]); + } + + $sortie->setMotifAnnul($motif); + $sortie->setEtat($entityManager->getRepository(Etat::class)->findOneBy(['libelle' => 'Annulée'])); + + $entityManager->flush(); + + $this->addFlash('success', 'La sortie a été annulée avec succès.'); + return $this->redirectToRoute('home'); + } } diff --git a/src/Entity/Sortie.php b/src/Entity/Sortie.php index 0a0d7ee..af83f62 100644 --- a/src/Entity/Sortie.php +++ b/src/Entity/Sortie.php @@ -29,7 +29,6 @@ class Sortie private ?int $duree = null; #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] - #[Assert\GreaterThan("today")] private ?\DateTimeInterface $dateLimiteInscription = null; #[ORM\Column(nullable: true)] diff --git a/src/Repository/SortieRepository.php b/src/Repository/SortieRepository.php index 4996f0f..dc90348 100644 --- a/src/Repository/SortieRepository.php +++ b/src/Repository/SortieRepository.php @@ -17,45 +17,59 @@ class SortieRepository extends ServiceEntityRepository parent::__construct($registry, Sortie::class); } - public function findWithFilters($search, $siteId, $startDate, $endDate, $organisateur, $inscrit, $nonInscrit, $passees, $user) + public function findWithFilters($search, $siteId, $startDate, $endDate, $organisateur, $inscrit, $nonInscrit, $passees, $userConnect) { - $qb = $this->createQueryBuilder('s'); + $qb = $this->createQueryBuilder('s') + ->leftJoin('s.etat', 'e') + ->addSelect('e') + ->leftJoin('s.participants', 'p') + ->addSelect('p') + ->where('e.libelle != :annulee') + ->setParameter('annulee', 'Annulée'); - if ($search) { + // Filtre par nom + if (!empty($search)) { $qb->andWhere('s.nom LIKE :search') ->setParameter('search', '%' . $search . '%'); } - if ($siteId) { + // Filtre par site + if (!empty($siteId)) { $qb->andWhere('s.site = :siteId') ->setParameter('siteId', $siteId); } - if ($startDate) { + // Filtre par date de début + if (!empty($startDate)) { $qb->andWhere('s.dateHeureDebut >= :startDate') - ->setParameter('startDate', new \DateTime($startDate)); + ->setParameter('startDate', $startDate); } - if ($endDate) { + // Filtre par date de fin + if (!empty($endDate)) { $qb->andWhere('s.dateHeureDebut <= :endDate') - ->setParameter('endDate', new \DateTime($endDate)); + ->setParameter('endDate', $endDate); } - if ($organisateur) { - $qb->andWhere('s.organisateur = :user') - ->setParameter('user', $user); + // Filtre par organisateur + if ($organisateur && $userConnect) { + $qb->andWhere('s.organisateur = :organisateur') + ->setParameter('organisateur', $userConnect); } - if ($inscrit) { - $qb->andWhere(':user MEMBER OF s.participants') - ->setParameter('user', $user); + // Filtre par inscription + if ($inscrit && $userConnect) { + $qb->andWhere(':userConnect MEMBER OF s.participants') + ->setParameter('userConnect', $userConnect); } - if ($nonInscrit) { - $qb->andWhere(':user NOT MEMBER OF s.participants') - ->setParameter('user', $user); + // Filtre par non-inscription + if ($nonInscrit && $userConnect) { + $qb->andWhere(':userConnect NOT MEMBER OF s.participants') + ->setParameter('userConnect', $userConnect); } + // Filtre par sorties passées if ($passees) { $qb->andWhere('s.dateHeureDebut < :now') ->setParameter('now', new \DateTime()); @@ -67,6 +81,7 @@ class SortieRepository extends ServiceEntityRepository return $qb->getQuery()->getResult(); } + public function findForDashboard() { return $this->createQueryBuilder('s') diff --git a/templates/sortie/list.html.twig b/templates/sortie/list.html.twig index 1ea49aa..e1dcb47 100644 --- a/templates/sortie/list.html.twig +++ b/templates/sortie/list.html.twig @@ -5,16 +5,46 @@ Liste des sorties {% block stylesheets %} {{ encore_entry_link_tags('app') }} + {% endblock %} {% endblock %} {% block content %} -
-

🎉 Liste des sorties

+
+

🎉 Liste des sorties

-
+
-
+
-
- +
+ {% for sortie in sorties %} - - + + {% block javascripts %} + {{ encore_entry_script_tags('app') }} + + {% endblock %} {% endblock %} diff --git a/templates/sortie/view.html.twig b/templates/sortie/view.html.twig index fdfad41..b659e61 100644 --- a/templates/sortie/view.html.twig +++ b/templates/sortie/view.html.twig @@ -7,6 +7,11 @@ {% block stylesheets %} {{ encore_entry_link_tags('app') }} + {% endblock %} {% endblock %} @@ -88,8 +93,14 @@
{% endif %} - {% if app.user and app.user.idParticipant == sortie.organisateur.idParticipant %} -
+ {% if app.user and app.user.idParticipant == sortie.organisateur.idParticipant and sortie.etat.libelle == 'Créée' %} +
+ + +