diff --git a/src/Controller/SortieController.php b/src/Controller/SortieController.php index 45f8ccb..368d097 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; @@ -202,4 +203,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 f1135c2..da9b13f 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 findAllSites() { return $this->getEntityManager() diff --git a/templates/main/index.html.twig b/templates/main/index.html.twig index 3f7c400..c48a764 100644 --- a/templates/main/index.html.twig +++ b/templates/main/index.html.twig @@ -5,16 +5,46 @@