src\Controller\CommandeController.php line 142

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