src\Controller\CommandeController.php line 143

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Knp\Component\Pager\PaginatorInterface;
  9. use Symfony\Component\Mailer\MailerInterface;
  10. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use App\Entity\Commande;
  13. use App\Entity\Menu;
  14. use App\Entity\Horaire;
  15. use App\Entity\Utilisateur;
  16. use App\Form\CommandeType;
  17. use Symfony\Component\Security\Csrf\CsrfToken;
  18. class CommandeController extends AbstractController
  19. {
  20. public function verifierHeurePrestation(EntityManagerInterface $em,Commande $commande): bool
  21. {
  22. $jours= array("Dimanche", "Lundi", "Mardi",
  23. "Mercredi", "Jeudi", "Vendredi",
  24. "Samedi");
  25. $JourPrestation = $jours[Date('w', $commande->getDatePrestation()->getTimestamp())];
  26. $heureLivraison = $commande->getHeureLivraison();
  27. $queryBuilder = $em->createQueryBuilder()
  28. ->select('horaire')
  29. ->from(Horaire::class, 'horaire')
  30. ->where('horaire.jour = :jour')
  31. ->andWhere('horaire.heure_ouverture <= :heureLivraison')
  32. ->andWhere('horaire.heure_fermeture >= :heureLivraison')
  33. ->setParameter('jour', $JourPrestation)
  34. ->setParameter('heureLivraison', $heureLivraison);
  35. $horaire = $queryBuilder->getQuery()->getOneOrNullResult();
  36. if (!$horaire) {
  37. return false;
  38. }
  39. return true;
  40. }
  41. #[Route('/commande/liste', name: 'app_commande_liste')]
  42. public function liste(EntityManagerInterface $em, PaginatorInterface $paginator,Request $request): Response
  43. {
  44. if ($request->query->get('filterField') && $request->query->get('filterValue') && !is_numeric($request->query->get('filterValue'))) {
  45. $request->query->set('filterValue', "*".$request->query->get('filterValue')."*");
  46. }
  47. // On récupère tous les articles disponibles en base de données
  48. $user = $this->getUser();
  49. if ($user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_USE', $user->getRoles())))
  50. {
  51. // On récupère tous les articles disponibles en base de données
  52. $queryBuilder = $em->createQueryBuilder()
  53. ->select('commande')
  54. ->from(Commande::class, 'commande');
  55. }
  56. else
  57. {
  58. // On récupère tous les articles disponibles en base de données
  59. $queryBuilder = $em->createQueryBuilder()
  60. ->select('commande')
  61. ->from(Commande::class, 'commande')
  62. ->where('commande.utilisateur_id IN (:user)')
  63. ->setParameter('user', $user);
  64. }
  65. $query = $queryBuilder->getQuery();
  66. $pagination = $paginator->paginate(
  67. $query, /* query NOT result */
  68. $request->query->getInt('page', 1), /* page number */
  69. 10 /* limit per page */
  70. );
  71. return $this->render('commande/liste.html.twig', [
  72. 'pagination' => $pagination
  73. ]);
  74. }
  75. #[Route('/commande/index/{id}', name: 'app_commande_index')]
  76. public function index(EntityManagerInterface $em, Request $request, string $id, PaginatorInterface $paginator): Response
  77. {
  78. if ($request->query->get('filterField') && $request->query->get('filterValue') && !is_numeric($request->query->get('filterValue'))) {
  79. $request->query->set('filterValue', "*".$request->query->get('filterValue')."*");
  80. }
  81. // On récupère l'commande qui correspond à l'id passé dans l'url
  82. $commande = $em->getRepository(Commande::class)->findOneBy(['numero_commande' => $id]);
  83. if (!$commande) {
  84. $this->addFlash('danger', 'Le commande n\'existe pas');
  85. return $this->redirectToRoute('app_commande_liste');
  86. }
  87. $menu = $commande->getMenuId();
  88. if ($menu){
  89. // On récupère tous les articles disponibles en base de données
  90. $queryBuilder = $em->createQueryBuilder()
  91. ->select('menu')
  92. ->from(Menu::class, 'menu')
  93. ->where('menu.menu_id NOT IN (:menu)')
  94. ->setParameter('menu', $menu);
  95. }
  96. else
  97. {
  98. // On récupère tous les articles disponibles en base de données
  99. $queryBuilder = $em->createQueryBuilder()
  100. ->select('menu')
  101. ->from(Menu::class, 'menu');
  102. }
  103. if ($request->query->get('filterField') && $request->query->get('filterValue') && !is_numeric($request->query->get('filterValue'))) {
  104. $request->query->set('filterValue', "*".$request->query->get('filterValue')."*");
  105. }
  106. $query = $queryBuilder->getQuery();
  107. $pagination = $paginator->paginate(
  108. $query, /* query NOT result */
  109. $request->query->getInt('page', 1), /* page number */
  110. 10 /* limit per page */
  111. );
  112. return $this->render('commande/index.html.twig', [
  113. 'commande' => $commande,
  114. 'pagination' => $pagination,
  115. ]);
  116. }
  117. #[Route('/commande/add/{idmenu}', name: 'app_commande_add')]
  118. public function add(EntityManagerInterface $em, Request $request, MailerInterface $mailer, int $idmenu): Response
  119. {
  120. $mode = 'new';
  121. $commande = new Commande();
  122. $menu = $em->getRepository(Menu::class)->findOneBy(['menu_id' => $idmenu]);
  123. if ($menu){
  124. $commande->setMenuId($menu);
  125. }
  126. else
  127. {
  128. $this->addFlash('danger', 'Le menu n\'existe pas');
  129. return $this->redirectToRoute('app_commande_liste');
  130. }
  131. $user = $this->getUser();
  132. if ($user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_USE', $user->getRoles())))
  133. {
  134. return $this->redirectToRoute('app_commande_liste');
  135. }
  136. else
  137. {
  138. $commande->setUtilisateurId($user);
  139. }
  140. $commande->setNumeroCommande(uniqid('CMD-'));
  141. $commande->setDateCommande(new \DateTime());
  142. $commande->setStatut('En cours');
  143. $commande->setPretmateriel(false);
  144. $commande->setRestitutionmateriel(false);
  145. $form = $this->createForm(CommandeType::class, $commande, [
  146. 'user' => $this->getUser()
  147. ]);
  148. $form->handleRequest($request);
  149. if($form->isSubmitted() && $form->isValid()) {
  150. if ($menu){
  151. if (!$this->verifierHeurePrestation($em, $commande)) {
  152. $this->addFlash('danger', 'La date de prestation doit être comprise dans les horaires d\'ouverture du service de livraison');
  153. $parameters = array(
  154. 'form' => $form->createView(),
  155. 'commande' => $commande,
  156. 'mode' => $mode
  157. );
  158. return $this->render('commande/edit.html.twig', $parameters);
  159. }
  160. if ($commande->getDateCommande() > $commande->getDatePrestation()) {
  161. $this->addFlash('danger', 'La date de livraison doit être supérieure à la date de commande');
  162. $parameters = array(
  163. 'form' => $form->createView(),
  164. 'commande' => $commande,
  165. 'mode' => $mode
  166. );
  167. return $this->render('commande/edit.html.twig', $parameters);
  168. }
  169. if ($menu->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  170. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$menu->getNombrePersonneMinimum());
  171. $parameters = array(
  172. 'form' => $form->createView(),
  173. 'commande' => $commande,
  174. 'mode' => $mode
  175. );
  176. return $this->render('commande/edit.html.twig', $parameters); }
  177. if ($menu->getQuantiteRestante() < $commande->getNombrepersonne()) {
  178. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$menu->getQuantiteRestante());
  179. $parameters = array(
  180. 'form' => $form->createView(),
  181. 'commande' => $commande,
  182. 'mode' => $mode
  183. );
  184. return $this->render('commande/edit.html.twig', $parameters);
  185. }
  186. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  187. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  188. $commande->setPrixlivraison(5);
  189. }
  190. else {
  191. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  192. $commande->setPrixlivraison(5);
  193. }
  194. $menu = $commande->getMenuId();
  195. $menu->setQuantiteRestante($menu->getQuantiteRestante() - $commande->getNombrepersonne());
  196. $em->persist($menu);
  197. }
  198. $this->savecommande($commande, $mode, $em);
  199. $email='contact@viteetgourmand.fr';
  200. $utilisateur = $commande->getUtilisateurId();
  201. $message = (new TemplatedEmail())
  202. ->from($email)
  203. ->to($utilisateur->getEmail())
  204. ->subject('Votre commande sur notre site Vite & Gourmand')
  205. ->htmlTemplate('emails/commande.html.twig')
  206. ->context([
  207. 'prenom' => $utilisateur->getPrenom(),
  208. 'nom' => $utilisateur->getNom(),
  209. 'commande' => $commande
  210. ]);
  211. try {
  212. $mailer->send($message);
  213. } catch (TransportExceptionInterface $e) {
  214. // some error prevented the email sending; display an
  215. // error message or try to resend the message
  216. $this->addFlash('danger', 'Une erreur est survenue lors de l\'envoi de votre message. Veuillez réessayer plus tard.');
  217. }
  218. return $this->redirectToRoute('app_commande_index', ['id' => $commande->getNumeroCommande()]);
  219. }
  220. $parameters = array(
  221. 'form' => $form->createView(),
  222. 'commande' => $commande,
  223. 'mode' => $mode
  224. );
  225. return $this->render('commande/edit.html.twig', $parameters);
  226. }
  227. #[Route('/commande/edit/{id}', name: 'app_commande_edit')]
  228. public function edit(EntityManagerInterface $em, Request $request, MailerInterface $mailer, string $id): Response
  229. {
  230. $mode = 'update';
  231. // On récupère l'commande qui correspond à l'id passé dans l'url
  232. $commande = $em->getRepository(Commande::class)->findOneBy(['numero_commande' => $id]);
  233. if (!$commande) {
  234. $this->addFlash('danger', 'Le commande n\'existe pas');
  235. return $this->redirectToRoute('app_commande_liste');
  236. }
  237. $user = $this->getUser();
  238. if ($user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_USE', $user->getRoles())))
  239. {
  240. }
  241. else
  242. {
  243. if ($commande->getUtilisateurId() && $commande->getUtilisateurId()->getUtilisateurId() !== $this->getUser()->getUtilisateurId()) {
  244. $this->addFlash('danger', 'Vous n\'êtes pas autorisé à modifier cette commande');
  245. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  246. }
  247. if ($commande->getStatut() <> 'En cours') {
  248. $this->addFlash('danger', 'Le commande ne peut pas être modifié car il déjà en cours de livraison ou livré');
  249. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  250. }
  251. }
  252. $form = $this->createForm(CommandeType::class, $commande, [
  253. 'user' => $this->getUser()
  254. ]);
  255. $form->handleRequest($request);
  256. if($form->isSubmitted() && $form->isValid()) {
  257. if (!$this->verifierHeurePrestation($em, $commande)) {
  258. $this->addFlash('danger', 'La date de prestation doit être comprise dans les horaires d\'ouverture du service de livraison');
  259. $parameters = array(
  260. 'form' => $form->createView(),
  261. 'commande' => $commande,
  262. 'mode' => $mode
  263. );
  264. return $this->render('commande/edit.html.twig', $parameters);
  265. }
  266. if ($commande->getDateCommande() > $commande->getDatePrestation()) {
  267. $this->addFlash('danger', 'La date de livraison doit être supérieure à la date de commande');
  268. $parameters = array(
  269. 'form' => $form->createView(),
  270. 'commande' => $commande,
  271. 'mode' => $mode
  272. );
  273. return $this->render('commande/edit.html.twig', $parameters);
  274. }
  275. if ($commande->getMenuId()->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  276. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$commande->getMenuId()->getNombrePersonneMinimum());
  277. $parameters = array(
  278. 'form' => $form->createView(),
  279. 'commande' => $commande,
  280. 'mode' => $mode
  281. );
  282. return $this->render('commande/edit.html.twig', $parameters);
  283. }
  284. if ($commande->getMenuId()->getQuantiteRestante() < $commande->getNombrepersonne()) {
  285. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$commande->getMenuId()->getQuantiteRestante());
  286. $parameters = array(
  287. 'form' => $form->createView(),
  288. 'commande' => $commande,
  289. 'mode' => $mode
  290. );
  291. return $this->render('commande/edit.html.twig', $parameters);
  292. }
  293. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  294. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  295. $commande->setPrixlivraison(5);
  296. }
  297. else {
  298. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  299. $commande->setPrixlivraison(5);
  300. }
  301. $this->savecommande($commande, $mode, $em);
  302. if ($commande->getStatut() == 'Terminé') {
  303. $email='contact@viteetgourmand.fr';
  304. $utilisateur = $commande->getUtilisateurId();
  305. $message = (new TemplatedEmail())
  306. ->from($email)
  307. ->to($utilisateur->getEmail())
  308. ->subject('Votre commande sur notre site Vite & Gourmand')
  309. ->htmlTemplate('emails/commandeterminer.html.twig')
  310. ->context([
  311. 'prenom' => $utilisateur->getPrenom(),
  312. 'nom' => $utilisateur->getNom(),
  313. 'commande' => $commande
  314. ]);
  315. try {
  316. $mailer->send($message);
  317. } catch (TransportExceptionInterface $e) {
  318. // some error prevented the email sending; display an
  319. // error message or try to resend the message
  320. $this->addFlash('danger', 'Une erreur est survenue lors de l\'envoi de votre message. Veuillez réessayer plus tard.');
  321. }
  322. }
  323. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  324. }
  325. $parameters = array(
  326. 'form' => $form->createView(),
  327. 'commande' => $commande,
  328. 'mode' => $mode
  329. );
  330. return $this->render('commande/edit.html.twig', $parameters);
  331. }
  332. #[Route('/commande/remove/{id}', name: 'app_commande_remove')]
  333. public function remove(EntityManagerInterface $em, Request $request, string $id): Response
  334. {
  335. // On récupère l'commande qui correspond à l'id passé dans l'URL
  336. $commande = $em->getRepository(Commande::class)->findOneBy(['numero_commande' => $id]);
  337. if (!$commande) {
  338. $this->addFlash('danger', 'Le commande n\'existe pas');
  339. return $this->redirectToRoute('app_commande_liste');
  340. }
  341. if ($commande->getStatut() <> 'En cours') {
  342. $this->addFlash('danger', 'Le commande ne peut pas être supprimé car il déjà en cours de livraison ou livré');
  343. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  344. }
  345. if ($commande->getMenuId()) {
  346. $menu = $commande->getMenuId();
  347. $menu->setQuantiteRestante($menu->getQuantiteRestante() + $commande->getNombrepersonne());
  348. $em->persist($menu);
  349. }
  350. if ($this->isCsrfTokenValid('delete' . $commande->getNumeroCommande(), $request->request->get('_token'))) {
  351. // L'ID du token CSRF est valide, on peut supprimer l'article
  352. // L'commande est supprimé
  353. $em->remove($commande);
  354. $em->flush();
  355. $this->addFlash('success', 'Le commande a été supprimé avec succès');
  356. } else {
  357. // L'ID du token CSRF n'est pas valide, on ne supprime pas l'article
  358. $this->addFlash('danger', 'Le token CSRF est invalide. La commande n\'a pas été supprimée.');
  359. }
  360. return $this->redirectToRoute('app_commande_liste');
  361. }
  362. #[Route('/commande/menuadd/{idcommande}/{idmenu}', name: 'app_commande_menuadd')]
  363. public function menuadd(EntityManagerInterface $em, string $idcommande, int $idmenu): Response
  364. {
  365. // On récupère l'commande qui correspond à l'id passé dans l'url
  366. $commande = $em->getRepository(commande::class)->findOneBy(['numero_commande' => $idcommande]);
  367. $menu= $em->getRepository(Menu::class)->findOneBy(['menu_id' => $idmenu]);
  368. if (!$commande) {
  369. $this->addFlash('danger', 'Le commande n\'existe pas');
  370. return $this->redirectToRoute('app_commande_liste');
  371. }
  372. if (!$menu) {
  373. $this->addFlash('danger', 'Le menu n\'existe pas');
  374. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  375. }
  376. if ($commande->getMenuId()) {
  377. $menu_old = $commande->getMenuId();
  378. $menu_old->setQuantiteRestante($menu_old->getQuantiteRestante() + $commande->getNombrepersonne());
  379. $em->persist($menu_old);
  380. }
  381. if ($menu->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  382. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$menu->getNombrePersonneMinimum());
  383. return $this->redirectToRoute('app_commande_edit', ['id' => $idcommande]);
  384. }
  385. if ($menu->getQuantiteRestante() < $commande->getNombrepersonne()) {
  386. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$menu->getQuantiteRestante());
  387. return $this->redirectToRoute('app_commande_edit', ['id' => $idcommande]);
  388. }
  389. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  390. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  391. $commande->setPrixlivraison(5);
  392. }
  393. else {
  394. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  395. $commande->setPrixlivraison(5);
  396. }
  397. $menu->setQuantiteRestante($menu->getQuantiteRestante() - $commande->getNombrepersonne());
  398. $commande->setMenuId($menu);
  399. $em->persist($commande);
  400. $em->persist($menu);
  401. $em->flush();
  402. $this->addFlash('success', 'Le menu a été ajouté avec succès');
  403. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  404. }
  405. #[Route('/commande/utilisateuradd/{idcommande}/{idutilisateur}', name: 'app_commande_utilisateuradd')]
  406. public function utilisateuradd(EntityManagerInterface $em, string $idcommande, int $idutilisateur): Response
  407. {
  408. // On récupère l'commande qui correspond à l'id passé dans l'url
  409. $commande = $em->getRepository(commande::class)->findOneBy(['numero_commande' => $idcommande]);
  410. $user= $em->getRepository(Utilisateur::class)->findOneBy(['utilisateur_id' => $idutilisateur]);
  411. if (!$commande) {
  412. $this->addFlash('danger', 'Le commande n\'existe pas');
  413. return $this->redirectToRoute('app_commande_liste');
  414. }
  415. if (!$user) {
  416. $this->addFlash('danger', "L'Utilisateur n'existe pas");
  417. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  418. }
  419. $commande->setUtilisateurId($user);
  420. $em->persist($commande);
  421. $em->flush();
  422. $this->addFlash('success', 'L\'Utilisateur a été ajouté avec succès');
  423. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  424. }
  425. /**
  426. * Enregistrer un commande en base de données
  427. *
  428. * @param commande $commande
  429. * @param string $mode
  430. */
  431. private function savecommande(commande $commande, string $mode, EntityManagerInterface $em): void{
  432. $em->persist($commande);
  433. $em->flush();
  434. if($mode == 'new') {
  435. $this->addFlash('success', 'La commande créé avec succès');
  436. } else {
  437. $this->addFlash('success', 'La commande mis à jour avec succès');
  438. }
  439. }
  440. }