|
@@ -3,11 +3,21 @@
|
|
|
namespace App\Controller;
|
|
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
|
+use Symfony\Component\HttpFoundation\Request;
|
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
use Symfony\Component\Routing\Requirement\Requirement;
|
|
|
use Symfony\Component\Routing\Attribute\Route;
|
|
|
+use Doctrine\ORM\EntityManagerInterface;
|
|
|
+use Symfony\Bridge\Twig\Mime\TemplatedEmail;
|
|
|
+use Symfony\Component\Mime\Address;
|
|
|
+use Symfony\Component\Mailer\MailerInterface;
|
|
|
+use Symfony\Component\Mime\Email;
|
|
|
|
|
|
+use App\Entity\partyRequest;
|
|
|
+use App\Entity\Party;
|
|
|
+use App\Entity\Participation;
|
|
|
use App\Repository\EventRepository;
|
|
|
+use App\Repository\SlotRepository;
|
|
|
use App\Entity\Event;
|
|
|
use App\Entity\Gamemaster;
|
|
|
|
|
@@ -37,7 +47,7 @@ final class ManageController extends AbstractController
|
|
|
// Contrôler qu'un événement est bien ok
|
|
|
if (!$event) {
|
|
|
$this->addFlash('danger', 'Événement inconnu !');
|
|
|
- $this->redirectToRoute('app_manage');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
}
|
|
|
|
|
|
// Récupérer la liste des événements visibles
|
|
@@ -55,7 +65,7 @@ final class ManageController extends AbstractController
|
|
|
// Contrôler qu'un événement est bien ok
|
|
|
if (!$event) {
|
|
|
$this->addFlash('danger', 'Événement inconnu !');
|
|
|
- $this->redirectToRoute('app_manage');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
}
|
|
|
|
|
|
// Récupérer la liste des événements visibles
|
|
@@ -73,7 +83,7 @@ final class ManageController extends AbstractController
|
|
|
// Contrôler qu'un événement est bien ok
|
|
|
if (!$event) {
|
|
|
$this->addFlash('danger', 'Événement inconnu !');
|
|
|
- $this->redirectToRoute('app_manage');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
}
|
|
|
|
|
|
// Récupérer la liste des événements visibles
|
|
@@ -84,4 +94,205 @@ final class ManageController extends AbstractController
|
|
|
'events' => $events
|
|
|
]);
|
|
|
}
|
|
|
+
|
|
|
+ #[Route('/manage/{id}/request', name: 'app_manage_request', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
|
|
|
+ public function manageRequest(?Event $event, EventRepository $repository): Response
|
|
|
+ {
|
|
|
+ // Contrôler qu'un événement est bien ok
|
|
|
+ if (!$event) {
|
|
|
+ $this->addFlash('danger', 'Événement inconnu !');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
+ }
|
|
|
+
|
|
|
+ // Contrôler que l'événement accepte bien les requêtes
|
|
|
+ if (!$event->isEveryoneCanAskForGame()) {
|
|
|
+ $this->addFlash('danger', 'Cet événement ne prend pas en charge les demandes de parties.');
|
|
|
+ return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Récupérer la liste des événements visibles
|
|
|
+ $events = $repository->findEventsToCome(false);
|
|
|
+
|
|
|
+ return $this->render('manage/request.html.twig', [
|
|
|
+ 'event' => $event,
|
|
|
+ 'events' => $events
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[Route('/manage/request/{id}/delete', name: 'app_manage_request_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
|
+ public function requestDelete(?partyRequest $partyRequest, EntityManagerInterface $manager): Response
|
|
|
+ {
|
|
|
+ // la requête existe-t-elle bien ?
|
|
|
+ if (!$partyRequest) {
|
|
|
+ $this->addFlash('danger', 'Demande inconnue !');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $event = $partyRequest->getEvent();
|
|
|
+ $state = $partyRequest->getState();
|
|
|
+ // La requête a-t-elle obtenue une réponse ?
|
|
|
+ if ($state['code'] == "WAIT") {
|
|
|
+ $this->addFlash('danger', 'Vous devez apporter une réponse avant de supprimer !');
|
|
|
+ return $this->redirectToRoute('app_manage_request', ['id' => $event->getId()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $manager->remove($partyRequest);
|
|
|
+ $manager->flush();
|
|
|
+
|
|
|
+ $this->addFlash('success', 'Demande supprimée !');
|
|
|
+ return $this->redirectToRoute('app_manage_request', ['id' => $event->getId()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[Route('/manage/request/{id}/accept', name: 'app_manage_request_accept', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
|
|
|
+ public function requestAccept(?partyRequest $partyRequest, Request $request, EntityManagerInterface $manager, MailerInterface $mailer, EventRepository $repository, SlotRepository $slotRepository): Response
|
|
|
+ {
|
|
|
+ // Fonction inspirée de 'app_party_add' du controlleur "App\Controller\PartyController"
|
|
|
+ // TODO: créer une seule fonction
|
|
|
+ // PRIO: low
|
|
|
+
|
|
|
+ $user = $this->getUser();
|
|
|
+
|
|
|
+ // la requête existe-t-elle bien ?
|
|
|
+ if (!$partyRequest) {
|
|
|
+ $this->addFlash('danger', 'Demande inconnue !');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $event = $partyRequest->getEvent();
|
|
|
+ $state = $partyRequest->getState();
|
|
|
+ // La requête est-elle en attente d'une réponse ?
|
|
|
+ if (!$state['code'] == "WAIT") {
|
|
|
+ $this->addFlash('danger', 'Une réponse a déjà été apportée : '.$state['name'].'.');
|
|
|
+ return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Traiter, on complète déjà ce qu'on connaît
|
|
|
+ $party = new Party();
|
|
|
+ $party->setGamemaster($partyRequest->getGamemasterChoosen());
|
|
|
+ $party->setGame($partyRequest->getGameChoosen());
|
|
|
+ $party->setEvent($partyRequest->getEvent());
|
|
|
+ $party->setMinParticipants($_ENV['APP_DEFAULT_MIN_PARTICIPANTS']);
|
|
|
+ $party->setMaxParticipants($_ENV['APP_DEFAULT_MAX_PARTICIPANTS']);
|
|
|
+ $party->setSubmitter($user);
|
|
|
+ $party->setSubmittedDate(new \Datetime('now'));
|
|
|
+ $party->setValidated(true);
|
|
|
+
|
|
|
+ // Création d'un formulaire vierge
|
|
|
+ $form = $this->createFormBuilder(FormType::class)->getForm();
|
|
|
+ $form->handleRequest($request);
|
|
|
+ if ($form->isSubmitted() && $form->isValid()) {
|
|
|
+ // On reçoit du formulaire un array de Slot pour poser la partie
|
|
|
+ $slotsString = $request->request->get('party_slots');
|
|
|
+ $new_slots = explode("|", $slotsString);
|
|
|
+ // On ajoute les slots à la partie
|
|
|
+ foreach($new_slots as $add_this_slot) {
|
|
|
+ $add_this_slot_obj = $slotRepository->findById($add_this_slot);
|
|
|
+ $party->addSlot($add_this_slot_obj);
|
|
|
+ }
|
|
|
+ // On ajoute les horaires à la partie
|
|
|
+ $party->setStartOn(clone $party->getSlots()[0]->getStartOn());
|
|
|
+ $party->setEndOn(clone $party->getSlots()->last()->getEndOn());
|
|
|
+
|
|
|
+ // On enregistre la partie
|
|
|
+ $manager->persist($party);
|
|
|
+
|
|
|
+ // On met à jour la demande
|
|
|
+ $partyRequest->setModerator($user);
|
|
|
+ $partyRequest->setModOnDate(new \Datetime('now'));
|
|
|
+ $partyRequest->setAccepted(true);
|
|
|
+ $manager->persist($partyRequest);
|
|
|
+
|
|
|
+ // On crée une participation pour le demandeur
|
|
|
+ $participation = new Participation();
|
|
|
+ $participation->setParty($party);
|
|
|
+ $participation->setParticipantName($partyRequest->getRequester()->getFullName());
|
|
|
+ $participation->setParticipantEmail($partyRequest->getRequester()->getEmail());
|
|
|
+ $participation->setParticipantPhone($partyRequest->getRequester()->getPhone());
|
|
|
+ $manager->persist($participation);
|
|
|
+
|
|
|
+ // Et on sync dans la BDD
|
|
|
+ $manager->flush();
|
|
|
+
|
|
|
+ // On préviens par mail
|
|
|
+ $email = (new TemplatedEmail())
|
|
|
+ ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
|
|
|
+ ->to((string) $partyRequest->getRequester()->getEmail())
|
|
|
+ ->subject('En réponse à votre demande pour '.$party->getEvent()->getName())
|
|
|
+ ->htmlTemplate('manage/request/accepted.email.html.twig')
|
|
|
+ ->textTemplate('manage/request/accepted.email.txt.twig')
|
|
|
+ ->context([
|
|
|
+ 'participation' => $participation,
|
|
|
+ 'partyRequest' => $partyRequest,
|
|
|
+ 'party' => $party
|
|
|
+ ]);
|
|
|
+ $mailer->send($email);
|
|
|
+
|
|
|
+ // On a terminé !
|
|
|
+ $this->addFlash('success', 'Demande transformée en partie et réponse envoyée.');
|
|
|
+ return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // génération du formulaire
|
|
|
+
|
|
|
+ // Récupérer la liste des événements visibles
|
|
|
+ $events = $repository->findEventsToCome(false);
|
|
|
+ if (!$events) {
|
|
|
+ $this->addFlash('info', 'Aucun d\'événement n\'est plannifié pour le moment.');
|
|
|
+ return $this->redirectToRoute('app_main');
|
|
|
+ }
|
|
|
+
|
|
|
+ return $this->render('manage/request/process.html.twig', [
|
|
|
+ 'partyRequest' => $partyRequest,
|
|
|
+ 'party' => $party,
|
|
|
+ 'event' => $partyRequest->getEvent(),
|
|
|
+ 'events' => $events,
|
|
|
+ 'form' => $form
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[Route('/manage/request/{id}/refuse', name: 'app_manage_request_refuse', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
|
+ public function requestRefuse(?partyRequest $partyRequest, EntityManagerInterface $manager, MailerInterface $mailer): Response
|
|
|
+ {
|
|
|
+ $user = $this->getUser();
|
|
|
+ // la requête existe-t-elle bien ?
|
|
|
+ if (!$partyRequest) {
|
|
|
+ $this->addFlash('danger', 'Demande inconnue !');
|
|
|
+ return $this->redirectToRoute('app_manage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $event = $partyRequest->getEvent();
|
|
|
+ $state = $partyRequest->getState();
|
|
|
+ // La requête est-elle en attente d'une réponse ?
|
|
|
+ if (!$state['code'] == "WAIT") {
|
|
|
+ $this->addFlash('danger', 'Une réponse a déjà été apportée : '.$state['name'].'.');
|
|
|
+ return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // On met à jour la demande
|
|
|
+ $partyRequest->setModerator($user);
|
|
|
+ $partyRequest->setModOnDate(new \Datetime('now'));
|
|
|
+ $partyRequest->setAccepted(false);
|
|
|
+ $manager->persist($partyRequest);
|
|
|
+
|
|
|
+ // Et on sync dans la BDD
|
|
|
+ $manager->flush();
|
|
|
+
|
|
|
+ // On préviens par mail
|
|
|
+ $email = (new TemplatedEmail())
|
|
|
+ ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
|
|
|
+ ->to((string) $partyRequest->getRequester()->getEmail())
|
|
|
+ ->subject('En réponse à votre demande pour '.$partyRequest->getEvent()->getName())
|
|
|
+ ->htmlTemplate('manage/request/refused.email.html.twig')
|
|
|
+ ->textTemplate('manage/request/refused.email.txt.twig')
|
|
|
+ ->context([
|
|
|
+ 'partyRequest' => $partyRequest,
|
|
|
+ ]);
|
|
|
+ $mailer->send($email);
|
|
|
+
|
|
|
+ $this->addFlash('success', 'Demande refusée et réponse envoyée.');
|
|
|
+ return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
}
|