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. }
  135. else
  136. {
  137. $commande->setUtilisateurId($user);
  138. }
  139. $commande->setNumeroCommande(uniqid('CMD-'));
  140. $commande->setDateCommande(new \DateTime());
  141. $commande->setStatut('En cours');
  142. $commande->setPretmateriel(false);
  143. $commande->setRestitutionmateriel(false);
  144. $form = $this->createForm(CommandeType::class, $commande, [
  145. 'user' => $this->getUser()
  146. ]);
  147. $form->handleRequest($request);
  148. if($form->isSubmitted() && $form->isValid()) {
  149. if ($menu){
  150. if (!$this->verifierHeurePrestation($em, $commande)) {
  151. $this->addFlash('danger', 'La date de prestation doit être comprise dans les horaires d\'ouverture du service de livraison');
  152. $parameters = array(
  153. 'form' => $form->createView(),
  154. 'commande' => $commande,
  155. 'mode' => $mode
  156. );
  157. return $this->render('commande/edit.html.twig', $parameters);
  158. }
  159. if ($commande->getDateCommande() > $commande->getDatePrestation()) {
  160. $this->addFlash('danger', 'La date de livraison doit être supérieure à la date de commande');
  161. $parameters = array(
  162. 'form' => $form->createView(),
  163. 'commande' => $commande,
  164. 'mode' => $mode
  165. );
  166. return $this->render('commande/edit.html.twig', $parameters);
  167. }
  168. if ($menu->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  169. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$menu->getNombrePersonneMinimum());
  170. $parameters = array(
  171. 'form' => $form->createView(),
  172. 'commande' => $commande,
  173. 'mode' => $mode
  174. );
  175. return $this->render('commande/edit.html.twig', $parameters); }
  176. if ($menu->getQuantiteRestante() < $commande->getNombrepersonne()) {
  177. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$menu->getQuantiteRestante());
  178. $parameters = array(
  179. 'form' => $form->createView(),
  180. 'commande' => $commande,
  181. 'mode' => $mode
  182. );
  183. return $this->render('commande/edit.html.twig', $parameters);
  184. }
  185. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  186. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  187. $commande->setPrixlivraison(5);
  188. }
  189. else {
  190. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  191. $commande->setPrixlivraison(5);
  192. }
  193. $menu = $commande->getMenuId();
  194. $menu->setQuantiteRestante($menu->getQuantiteRestante() - $commande->getNombrepersonne());
  195. $em->persist($menu);
  196. }
  197. $this->savecommande($commande, $mode, $em);
  198. $email='contact@viteetgourmand.fr';
  199. $utilisateur = $commande->getUtilisateurId();
  200. $message = (new TemplatedEmail())
  201. ->from($email)
  202. ->to($utilisateur->getEmail())
  203. ->subject('Votre commande sur notre site Vite & Gourmand')
  204. ->htmlTemplate('emails/commande.html.twig')
  205. ->context([
  206. 'prenom' => $utilisateur->getPrenom(),
  207. 'nom' => $utilisateur->getNom(),
  208. 'commande' => $commande
  209. ]);
  210. try {
  211. $mailer->send($message);
  212. } catch (TransportExceptionInterface $e) {
  213. // some error prevented the email sending; display an
  214. // error message or try to resend the message
  215. $this->addFlash('danger', 'Une erreur est survenue lors de l\'envoi de votre message. Veuillez réessayer plus tard.');
  216. }
  217. return $this->redirectToRoute('app_commande_index', ['id' => $commande->getNumeroCommande()]);
  218. }
  219. $parameters = array(
  220. 'form' => $form->createView(),
  221. 'commande' => $commande,
  222. 'mode' => $mode
  223. );
  224. return $this->render('commande/edit.html.twig', $parameters);
  225. }
  226. #[Route('/commande/edit/{id}', name: 'app_commande_edit')]
  227. public function edit(EntityManagerInterface $em, Request $request, MailerInterface $mailer, string $id): Response
  228. {
  229. $mode = 'update';
  230. // On récupère l'commande qui correspond à l'id passé dans l'url
  231. $commande = $em->getRepository(Commande::class)->findOneBy(['numero_commande' => $id]);
  232. if (!$commande) {
  233. $this->addFlash('danger', 'Le commande n\'existe pas');
  234. return $this->redirectToRoute('app_commande_liste');
  235. }
  236. $user = $this->getUser();
  237. if ($user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_USE', $user->getRoles())))
  238. {
  239. }
  240. else
  241. {
  242. if ($commande->getUtilisateurId() && $commande->getUtilisateurId()->getUtilisateurId() !== $this->getUser()->getUtilisateurId()) {
  243. $this->addFlash('danger', 'Vous n\'êtes pas autorisé à modifier cette commande');
  244. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  245. }
  246. if ($commande->getStatut() <> 'En cours') {
  247. $this->addFlash('danger', 'Le commande ne peut pas être modifié car il déjà en cours de livraison ou livré');
  248. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  249. }
  250. }
  251. $form = $this->createForm(CommandeType::class, $commande, [
  252. 'user' => $this->getUser()
  253. ]);
  254. $form->handleRequest($request);
  255. if($form->isSubmitted() && $form->isValid()) {
  256. if (!$this->verifierHeurePrestation($em, $commande)) {
  257. $this->addFlash('danger', 'La date de prestation doit être comprise dans les horaires d\'ouverture du service de livraison');
  258. $parameters = array(
  259. 'form' => $form->createView(),
  260. 'commande' => $commande,
  261. 'mode' => $mode
  262. );
  263. return $this->render('commande/edit.html.twig', $parameters);
  264. }
  265. if ($commande->getDateCommande() > $commande->getDatePrestation()) {
  266. $this->addFlash('danger', 'La date de livraison doit être supérieure à la date de commande');
  267. $parameters = array(
  268. 'form' => $form->createView(),
  269. 'commande' => $commande,
  270. 'mode' => $mode
  271. );
  272. return $this->render('commande/edit.html.twig', $parameters);
  273. }
  274. if ($commande->getMenuId()->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  275. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$commande->getMenuId()->getNombrePersonneMinimum());
  276. $parameters = array(
  277. 'form' => $form->createView(),
  278. 'commande' => $commande,
  279. 'mode' => $mode
  280. );
  281. return $this->render('commande/edit.html.twig', $parameters);
  282. }
  283. if ($commande->getMenuId()->getQuantiteRestante() < $commande->getNombrepersonne()) {
  284. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$commande->getMenuId()->getQuantiteRestante());
  285. $parameters = array(
  286. 'form' => $form->createView(),
  287. 'commande' => $commande,
  288. 'mode' => $mode
  289. );
  290. return $this->render('commande/edit.html.twig', $parameters);
  291. }
  292. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  293. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  294. $commande->setPrixlivraison(5);
  295. }
  296. else {
  297. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  298. $commande->setPrixlivraison(5);
  299. }
  300. $this->savecommande($commande, $mode, $em);
  301. if ($commande->getStatut() == 'Terminé') {
  302. $email='contact@viteetgourmand.fr';
  303. $utilisateur = $commande->getUtilisateurId();
  304. $message = (new TemplatedEmail())
  305. ->from($email)
  306. ->to($utilisateur->getEmail())
  307. ->subject('Votre commande sur notre site Vite & Gourmand')
  308. ->htmlTemplate('emails/commandeterminer.html.twig')
  309. ->context([
  310. 'prenom' => $utilisateur->getPrenom(),
  311. 'nom' => $utilisateur->getNom(),
  312. 'commande' => $commande
  313. ]);
  314. try {
  315. $mailer->send($message);
  316. } catch (TransportExceptionInterface $e) {
  317. // some error prevented the email sending; display an
  318. // error message or try to resend the message
  319. $this->addFlash('danger', 'Une erreur est survenue lors de l\'envoi de votre message. Veuillez réessayer plus tard.');
  320. }
  321. }
  322. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  323. }
  324. $parameters = array(
  325. 'form' => $form->createView(),
  326. 'commande' => $commande,
  327. 'mode' => $mode
  328. );
  329. return $this->render('commande/edit.html.twig', $parameters);
  330. }
  331. #[Route('/commande/remove/{id}', name: 'app_commande_remove')]
  332. public function remove(EntityManagerInterface $em, Request $request, string $id): Response
  333. {
  334. // On récupère l'commande qui correspond à l'id passé dans l'URL
  335. $commande = $em->getRepository(Commande::class)->findOneBy(['numero_commande' => $id]);
  336. if (!$commande) {
  337. $this->addFlash('danger', 'Le commande n\'existe pas');
  338. return $this->redirectToRoute('app_commande_liste');
  339. }
  340. if ($commande->getStatut() <> 'En cours') {
  341. $this->addFlash('danger', 'Le commande ne peut pas être supprimé car il déjà en cours de livraison ou livré');
  342. return $this->redirectToRoute('app_commande_index', ['id' => $id]);
  343. }
  344. if ($commande->getMenuId()) {
  345. $menu = $commande->getMenuId();
  346. $menu->setQuantiteRestante($menu->getQuantiteRestante() + $commande->getNombrepersonne());
  347. $em->persist($menu);
  348. }
  349. if ($this->isCsrfTokenValid('delete' . $commande->getNumeroCommande(), $request->request->get('_token'))) {
  350. // L'ID du token CSRF est valide, on peut supprimer l'article
  351. // L'commande est supprimé
  352. $em->remove($commande);
  353. $em->flush();
  354. $this->addFlash('success', 'Le commande a été supprimé avec succès');
  355. } else {
  356. // L'ID du token CSRF n'est pas valide, on ne supprime pas l'article
  357. $this->addFlash('danger', 'Le token CSRF est invalide. La commande n\'a pas été supprimée.');
  358. }
  359. return $this->redirectToRoute('app_commande_liste');
  360. }
  361. #[Route('/commande/menuadd/{idcommande}/{idmenu}', name: 'app_commande_menuadd')]
  362. public function menuadd(EntityManagerInterface $em, string $idcommande, int $idmenu): Response
  363. {
  364. // On récupère l'commande qui correspond à l'id passé dans l'url
  365. $commande = $em->getRepository(commande::class)->findOneBy(['numero_commande' => $idcommande]);
  366. $menu= $em->getRepository(Menu::class)->findOneBy(['menu_id' => $idmenu]);
  367. if (!$commande) {
  368. $this->addFlash('danger', 'Le commande n\'existe pas');
  369. return $this->redirectToRoute('app_commande_liste');
  370. }
  371. if (!$menu) {
  372. $this->addFlash('danger', 'Le menu n\'existe pas');
  373. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  374. }
  375. if ($commande->getMenuId()) {
  376. $menu_old = $commande->getMenuId();
  377. $menu_old->setQuantiteRestante($menu_old->getQuantiteRestante() + $commande->getNombrepersonne());
  378. $em->persist($menu_old);
  379. }
  380. if ($menu->getNombrePersonneMinimum() > $commande->getNombrepersonne()) {
  381. $this->addFlash('danger', 'Le nombre de personne doit être supérieur ou égal à '.$menu->getNombrePersonneMinimum());
  382. return $this->redirectToRoute('app_commande_edit', ['id' => $idcommande]);
  383. }
  384. if ($menu->getQuantiteRestante() < $commande->getNombrepersonne()) {
  385. $this->addFlash('danger', 'Le nombre de personne doit être inférieur ou égal à '.$menu->getQuantiteRestante());
  386. return $this->redirectToRoute('app_commande_edit', ['id' => $idcommande]);
  387. }
  388. if ($commande->getMenuId()->getNombrePersonneMinimum() + 5 <= $commande->getNombrepersonne()) {
  389. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne()*0.9);
  390. $commande->setPrixlivraison(5);
  391. }
  392. else {
  393. $commande->setPrixMenu($commande->getMenuId()->getPrixParPersonne()*$commande->getNombrePersonne());
  394. $commande->setPrixlivraison(5);
  395. }
  396. $menu->setQuantiteRestante($menu->getQuantiteRestante() - $commande->getNombrepersonne());
  397. $commande->setMenuId($menu);
  398. $em->persist($commande);
  399. $em->persist($menu);
  400. $em->flush();
  401. $this->addFlash('success', 'Le menu a été ajouté avec succès');
  402. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  403. }
  404. #[Route('/commande/utilisateuradd/{idcommande}/{idutilisateur}', name: 'app_commande_utilisateuradd')]
  405. public function utilisateuradd(EntityManagerInterface $em, string $idcommande, int $idutilisateur): Response
  406. {
  407. // On récupère l'commande qui correspond à l'id passé dans l'url
  408. $commande = $em->getRepository(commande::class)->findOneBy(['numero_commande' => $idcommande]);
  409. $user= $em->getRepository(Utilisateur::class)->findOneBy(['utilisateur_id' => $idutilisateur]);
  410. if (!$commande) {
  411. $this->addFlash('danger', 'Le commande n\'existe pas');
  412. return $this->redirectToRoute('app_commande_liste');
  413. }
  414. if (!$user) {
  415. $this->addFlash('danger', "L'Utilisateur n'existe pas");
  416. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  417. }
  418. $commande->setUtilisateurId($user);
  419. $em->persist($commande);
  420. $em->flush();
  421. $this->addFlash('success', 'L\'Utilisateur a été ajouté avec succès');
  422. return $this->redirectToRoute('app_commande_index', ['id' => $idcommande]);
  423. }
  424. /**
  425. * Enregistrer un commande en base de données
  426. *
  427. * @param commande $commande
  428. * @param string $mode
  429. */
  430. private function savecommande(commande $commande, string $mode, EntityManagerInterface $em): void{
  431. $em->persist($commande);
  432. $em->flush();
  433. if($mode == 'new') {
  434. $this->addFlash('success', 'La commande créé avec succès');
  435. } else {
  436. $this->addFlash('success', 'La commande mis à jour avec succès');
  437. }
  438. }
  439. }