ManageController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Requirement\Requirement;
  7. use Symfony\Component\Routing\Attribute\Route;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  10. use Symfony\Component\Mime\Address;
  11. use Symfony\Component\Mailer\MailerInterface;
  12. use Symfony\Component\Mime\Email;
  13. use App\Entity\partyRequest;
  14. use App\Entity\Party;
  15. use App\Entity\Participation;
  16. use App\Repository\EventRepository;
  17. use App\Repository\SlotRepository;
  18. use App\Entity\Event;
  19. use App\Entity\Gamemaster;
  20. final class ManageController extends AbstractController
  21. {
  22. #[Route('/manage', name: 'app_manage')]
  23. public function manage(EventRepository $repository): Response
  24. {
  25. // Récupérer la liste des événements visibles
  26. $events = $repository->findEventsToCome(false);
  27. if (!$events) {
  28. $this->addFlash('info', 'Aucun d\'événement n\'est plannifié pour le moment.');
  29. return $this->redirectToRoute('app_main');
  30. }
  31. $event = $events[0];
  32. return $this->render('manage/manage.html.twig', [
  33. 'event' => $event,
  34. 'events' => $events
  35. ]);
  36. }
  37. #[Route('/manage/{id}', name: 'app_manage_planning', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  38. public function managePlanning(?Event $event, EventRepository $repository): Response
  39. {
  40. // Contrôler qu'un événement est bien ok
  41. if (!$event) {
  42. $this->addFlash('danger', 'Événement inconnu !');
  43. return $this->redirectToRoute('app_manage');
  44. }
  45. // Récupérer la liste des événements visibles
  46. $events = $repository->findEventsToCome(false);
  47. return $this->render('manage/manage.html.twig', [
  48. 'event' => $event,
  49. 'events' => $events
  50. ]);
  51. }
  52. #[Route('/manage/{id}/list', name: 'app_manage_party_list', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  53. public function managePartyList(?Event $event, EventRepository $repository): Response
  54. {
  55. // Contrôler qu'un événement est bien ok
  56. if (!$event) {
  57. $this->addFlash('danger', 'Événement inconnu !');
  58. return $this->redirectToRoute('app_manage');
  59. }
  60. // Récupérer la liste des événements visibles
  61. $events = $repository->findEventsToCome(false);
  62. return $this->render('manage/list.html.twig', [
  63. 'event' => $event,
  64. 'events' => $events
  65. ]);
  66. }
  67. #[Route('/manage/{id}/booking', name: 'app_manage_booking', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  68. public function manageBooking(?Event $event, EventRepository $repository): Response
  69. {
  70. // Contrôler qu'un événement est bien ok
  71. if (!$event) {
  72. $this->addFlash('danger', 'Événement inconnu !');
  73. return $this->redirectToRoute('app_manage');
  74. }
  75. // Récupérer la liste des événements visibles
  76. $events = $repository->findEventsToCome(false);
  77. return $this->render('manage/booking.html.twig', [
  78. 'event' => $event,
  79. 'events' => $events
  80. ]);
  81. }
  82. #[Route('/manage/{id}/request', name: 'app_manage_request', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  83. public function manageRequest(?Event $event, EventRepository $repository): Response
  84. {
  85. // Contrôler qu'un événement est bien ok
  86. if (!$event) {
  87. $this->addFlash('danger', 'Événement inconnu !');
  88. return $this->redirectToRoute('app_manage');
  89. }
  90. // Contrôler que l'événement accepte bien les requêtes
  91. if (!$event->isEveryoneCanAskForGame()) {
  92. $this->addFlash('danger', 'Cet événement ne prend pas en charge les demandes de parties.');
  93. return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
  94. }
  95. // Récupérer la liste des événements visibles
  96. $events = $repository->findEventsToCome(false);
  97. return $this->render('manage/request.html.twig', [
  98. 'event' => $event,
  99. 'events' => $events
  100. ]);
  101. }
  102. #[Route('/manage/request/{id}/delete', name: 'app_manage_request_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  103. public function requestDelete(?partyRequest $partyRequest, EntityManagerInterface $manager): Response
  104. {
  105. // la requête existe-t-elle bien ?
  106. if (!$partyRequest) {
  107. $this->addFlash('danger', 'Demande inconnue !');
  108. return $this->redirectToRoute('app_manage');
  109. }
  110. $event = $partyRequest->getEvent();
  111. $state = $partyRequest->getState();
  112. // La requête a-t-elle obtenue une réponse ?
  113. if ($state['code'] == "WAIT") {
  114. $this->addFlash('danger', 'Vous devez apporter une réponse avant de supprimer !');
  115. return $this->redirectToRoute('app_manage_request', ['id' => $event->getId()]);
  116. }
  117. $manager->remove($partyRequest);
  118. $manager->flush();
  119. $this->addFlash('success', 'Demande supprimée !');
  120. return $this->redirectToRoute('app_manage_request', ['id' => $event->getId()]);
  121. }
  122. #[Route('/manage/request/{id}/accept', name: 'app_manage_request_accept', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  123. public function requestAccept(?partyRequest $partyRequest, Request $request, EntityManagerInterface $manager, MailerInterface $mailer, EventRepository $repository, SlotRepository $slotRepository): Response
  124. {
  125. // Fonction inspirée de 'app_party_add' du controlleur "App\Controller\PartyController"
  126. // TODO: créer une seule fonction
  127. // PRIO: low
  128. $user = $this->getUser();
  129. // la requête existe-t-elle bien ?
  130. if (!$partyRequest) {
  131. $this->addFlash('danger', 'Demande inconnue !');
  132. return $this->redirectToRoute('app_manage');
  133. }
  134. $event = $partyRequest->getEvent();
  135. $state = $partyRequest->getState();
  136. // La requête est-elle en attente d'une réponse ?
  137. if (!$state['code'] == "WAIT") {
  138. $this->addFlash('danger', 'Une réponse a déjà été apportée : '.$state['name'].'.');
  139. return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
  140. }
  141. // Traiter, on complète déjà ce qu'on connaît
  142. $party = new Party();
  143. $party->setGamemaster($partyRequest->getGamemasterChoosen());
  144. $party->setGame($partyRequest->getGameChoosen());
  145. $party->setEvent($partyRequest->getEvent());
  146. $party->setMinParticipants($_ENV['APP_DEFAULT_MIN_PARTICIPANTS']);
  147. $party->setMaxParticipants($_ENV['APP_DEFAULT_MAX_PARTICIPANTS']);
  148. $party->setSubmitter($user);
  149. $party->setSubmittedDate(new \Datetime('now'));
  150. $party->setValidated(true);
  151. // Création d'un formulaire vierge
  152. $form = $this->createFormBuilder(FormType::class)->getForm();
  153. $form->handleRequest($request);
  154. if ($form->isSubmitted() && $form->isValid()) {
  155. // On reçoit du formulaire un array de Slot pour poser la partie
  156. $slotsString = $request->request->get('party_slots');
  157. $new_slots = explode("|", $slotsString);
  158. // On ajoute les slots à la partie
  159. foreach($new_slots as $add_this_slot) {
  160. $add_this_slot_obj = $slotRepository->findById($add_this_slot);
  161. $party->addSlot($add_this_slot_obj);
  162. }
  163. // On ajoute les horaires à la partie
  164. $party->setStartOn(clone $party->getSlots()[0]->getStartOn());
  165. $party->setEndOn(clone $party->getSlots()->last()->getEndOn());
  166. // On enregistre la partie
  167. $manager->persist($party);
  168. // On met à jour la demande
  169. $partyRequest->setModerator($user);
  170. $partyRequest->setModOnDate(new \Datetime('now'));
  171. $partyRequest->setAccepted(true);
  172. $manager->persist($partyRequest);
  173. // On crée une participation pour le demandeur
  174. $participation = new Participation();
  175. $participation->setParty($party);
  176. $participation->setParticipantName($partyRequest->getRequester()->getFullName());
  177. $participation->setParticipantEmail($partyRequest->getRequester()->getEmail());
  178. $participation->setParticipantPhone($partyRequest->getRequester()->getPhone());
  179. $manager->persist($participation);
  180. // Et on sync dans la BDD
  181. $manager->flush();
  182. // On préviens par mail
  183. $email = (new TemplatedEmail())
  184. ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
  185. ->to((string) $partyRequest->getRequester()->getEmail())
  186. ->subject('En réponse à votre demande pour '.$party->getEvent()->getName())
  187. ->htmlTemplate('manage/request/accepted.email.html.twig')
  188. ->textTemplate('manage/request/accepted.email.txt.twig')
  189. ->context([
  190. 'participation' => $participation,
  191. 'partyRequest' => $partyRequest,
  192. 'party' => $party
  193. ]);
  194. $mailer->send($email);
  195. // On a terminé !
  196. $this->addFlash('success', 'Demande transformée en partie et réponse envoyée.');
  197. return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
  198. }
  199. // génération du formulaire
  200. // Récupérer la liste des événements visibles
  201. $events = $repository->findEventsToCome(false);
  202. if (!$events) {
  203. $this->addFlash('info', 'Aucun d\'événement n\'est plannifié pour le moment.');
  204. return $this->redirectToRoute('app_main');
  205. }
  206. return $this->render('manage/request/process.html.twig', [
  207. 'partyRequest' => $partyRequest,
  208. 'party' => $party,
  209. 'event' => $partyRequest->getEvent(),
  210. 'events' => $events,
  211. 'form' => $form
  212. ]);
  213. }
  214. #[Route('/manage/request/{id}/refuse', name: 'app_manage_request_refuse', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  215. public function requestRefuse(?partyRequest $partyRequest, EntityManagerInterface $manager, MailerInterface $mailer): Response
  216. {
  217. $user = $this->getUser();
  218. // la requête existe-t-elle bien ?
  219. if (!$partyRequest) {
  220. $this->addFlash('danger', 'Demande inconnue !');
  221. return $this->redirectToRoute('app_manage');
  222. }
  223. $event = $partyRequest->getEvent();
  224. $state = $partyRequest->getState();
  225. // La requête est-elle en attente d'une réponse ?
  226. if (!$state['code'] == "WAIT") {
  227. $this->addFlash('danger', 'Une réponse a déjà été apportée : '.$state['name'].'.');
  228. return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
  229. }
  230. // On met à jour la demande
  231. $partyRequest->setModerator($user);
  232. $partyRequest->setModOnDate(new \Datetime('now'));
  233. $partyRequest->setAccepted(false);
  234. $manager->persist($partyRequest);
  235. // Et on sync dans la BDD
  236. $manager->flush();
  237. // On préviens par mail
  238. $email = (new TemplatedEmail())
  239. ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
  240. ->to((string) $partyRequest->getRequester()->getEmail())
  241. ->subject('En réponse à votre demande pour '.$partyRequest->getEvent()->getName())
  242. ->htmlTemplate('manage/request/refused.email.html.twig')
  243. ->textTemplate('manage/request/refused.email.txt.twig')
  244. ->context([
  245. 'partyRequest' => $partyRequest,
  246. ]);
  247. $mailer->send($email);
  248. $this->addFlash('success', 'Demande refusée et réponse envoyée.');
  249. return $this->redirectToRoute('app_manage_planning', ['id' => $event->getId()]);
  250. }
  251. }