src/Controller/PanierController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateInterval;
  4. use App\Entity\Service;
  5. use App\Entity\Commande;
  6. use App\Form\RetraitType;
  7. use App\Entity\Retrait;
  8. use App\Service\EmailService;
  9. use App\Service\PanierServices;
  10. use App\Service\CommandeService;
  11. use App\Repository\MenuRepository;
  12. use App\Repository\ServiceRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use App\Repository\PreparationRepository;
  15. use Dom\Entity;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Serializer\SerializerInterface;
  21. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  24. #[Route('/panier', name:'panier_')]
  25. class PanierController extends AbstractController
  26. {
  27. public function __construct(
  28. private SessionInterface $session,
  29. private PreparationRepository $preparationRepository,
  30. private MenuRepository $menuRepository,
  31. private EntityManagerInterface $entityManager
  32. ) {}
  33. #[Route('/', name: 'index')]
  34. public function index(SessionInterface $session, PreparationRepository $preparationRepository, ServiceRepository $serviceRepository, MenuRepository $menuRepository): Response
  35. {
  36. $paniers = $session->get("panier", []);
  37. $dataPanier = [];
  38. $total = [];
  39. foreach ($paniers as $service_id => $panier) {
  40. $service = $serviceRepository->find($service_id);
  41. $total[$service_id] = 0;
  42. foreach ($panier as $id => $quantite) {
  43. $preparation = $preparationRepository->find($id);
  44. $preparationDuJour = $menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
  45. $dataPanier[$service_id][] = [
  46. "service" => $service,
  47. "preparation" => $preparation,
  48. "quantite" => $quantite,
  49. "prix" => $preparationDuJour->getPrix(),
  50. "quantite_restante" => $preparationDuJour->getQuantite()
  51. ];
  52. $total[$service_id] += $quantite * $preparationDuJour->getPrix();
  53. }
  54. }
  55. return $this->render('panier/index.html.twig', [
  56. 'dataPanier' => $dataPanier,
  57. 'total' => $total,
  58. ]);
  59. }
  60. #[Route('/add/{serviceId}/{prepaId}', name: 'add')]
  61. public function add(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
  62. {
  63. $service = $serviceRepository->find($serviceId);
  64. $preparation = $preparationRepository->find($prepaId);
  65. $panierServices->panier_add($preparation,$service);
  66. return $this->redirectToRoute('panier_index');
  67. }
  68. #[Route('/remove/{serviceId}/{prepaId}', name: 'remove')]
  69. public function remove(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
  70. {
  71. $service = $serviceRepository->find($serviceId);
  72. $preparation = $preparationRepository->find($prepaId);
  73. $panierServices->panier_remove($preparation,$service);
  74. return $this->redirectToRoute('panier_index');
  75. }
  76. #[Route('/delete/{serviceId}/{prepaId}', name: 'delete')]
  77. public function delete(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
  78. {
  79. $service = $serviceRepository->find($serviceId);
  80. $preparation = $preparationRepository->find($prepaId);
  81. $panierServices->panier_delete($preparation,$service);
  82. return $this->redirectToRoute('panier_index');
  83. }
  84. #[Route('/delete/{id}', name: 'delete_service')]
  85. public function deleteService(Service $service, PanierServices $panierServices)
  86. {
  87. $panierServices->panier_delete_service($service);
  88. return $this->redirectToRoute('panier_index');
  89. }
  90. #[Route('/_api/preparation/add', name: 'api_post_preparation_add', methods: ['GET'])]
  91. public function apiPostPreparationAdd(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
  92. {
  93. if($request->isXmlHttpRequest()){
  94. $data = 0;
  95. $nb_preparation = 0;
  96. $quantite = [
  97. 'quantite' => 0,
  98. 'quantite_restante' => 0
  99. ];
  100. // if(is_int($request->query->get("serviceId"))){
  101. $serviceId = $request->query->get("serviceId");
  102. // } else {
  103. // $this->addFlash('error', 'Type de variable de service incorrecte !');
  104. // return new RedirectResponse($this->urlGenerator->generate('home'));
  105. // }
  106. // if(is_int($request->query->get("preparationId"))){
  107. $preparationId = $request->query->get("preparationId");
  108. // } else {
  109. // $this->addFlash('error', 'Type de variable de preparation incorrecte !');
  110. // return new RedirectResponse($this->urlGenerator->generate('client_service_show',['id' => $serviceId]));
  111. // }
  112. $service = $serviceRepository->find($serviceId);
  113. $preparation = $preparationRepository->find($preparationId);
  114. $preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
  115. $quantite['quantite_restante'] = $preparationDuJour->getQuantite();
  116. $nb_preparation = $panierServices->panier_add($preparation,$service);
  117. $quantite['quantite'] = $nb_preparation;
  118. if($nb_preparation > $preparationDuJour->getQuantite()){
  119. $nb_preparation = -1;
  120. $quantite['quantite'] = -1;
  121. }
  122. $data = $serializerInterface->serialize($quantite,"json");
  123. return $this->json($data);
  124. } else {
  125. $this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
  126. // return new RedirectResponse($this->urlGenerator->generate('home'));
  127. return $this->redirectToRoute('home',[]);
  128. }
  129. }
  130. /**
  131. * Function d'appel de l'api de suppression d'une quantité de 1 de la préparation choisie
  132. *
  133. * @param Request $request
  134. * @param ServiceRepository $serviceRepository
  135. * @param PreparationRepository $preparationRepository
  136. * @param PanierServices $panierServices
  137. * @param SerializerInterface $serializerInterface
  138. */
  139. #[Route('/_api/preparation/remove', name: 'api_post_preparation_remove', methods: ['GET'])]
  140. public function apiPostPreparationRemove(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
  141. {
  142. if($request->isXmlHttpRequest()){
  143. $serviceId = $request->query->get("serviceId");
  144. $preparationId = $request->query->get("preparationId");
  145. $data = 0;
  146. $nb_preparation = 0;
  147. $quantite = [
  148. 'quantite' => 0,
  149. 'quantite_restante' => 0
  150. ];
  151. $service = $serviceRepository->find($serviceId);
  152. $preparation = $preparationRepository->find($preparationId);
  153. $preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
  154. $quantite['quantite_restante'] = $preparationDuJour->getQuantite();
  155. $nb_preparation = $panierServices->panier_remove($preparation,$service);
  156. $quantite['quantite'] = $nb_preparation;
  157. if($nb_preparation > $preparationDuJour->getQuantite()){
  158. $nb_preparation = -1;
  159. $quantite['quantite'] = -1;
  160. }
  161. $data = $serializerInterface->serialize($quantite,"json");
  162. return $this->json($data);
  163. } else {
  164. $this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
  165. return $this->redirectToRoute('home',[]);
  166. }
  167. }
  168. #[Route('/_api/preparation/epuise', name: 'api_post_preparation_epuise', methods: ['GET'])]
  169. public function apiPostPreparationEpuise(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
  170. {
  171. if($request->isXmlHttpRequest()){
  172. $serviceId = $request->query->get("serviceId");
  173. $preparationId = $request->query->get("preparationId");
  174. $data = 0;
  175. $nb_preparation = 0;
  176. $quantite = [
  177. 'quantite' => 0,
  178. 'quantite_restante' => 0
  179. ];
  180. $service = $serviceRepository->find($serviceId);
  181. $preparation = $preparationRepository->find($preparationId);
  182. $preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
  183. if($preparationDuJour->getQuantite() > 0){
  184. $preparationDuJour->setQuantite(0);
  185. }
  186. $this->entityManager->flush();
  187. // $nb_preparation = $panierServices->panier_epuise($preparation,$service);
  188. $data = $serializerInterface->serialize($quantite,"json");
  189. return $this->json($data);
  190. } else {
  191. $this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
  192. return $this->redirectToRoute('home',[]);
  193. }
  194. }
  195. #[Route('/majquantitesservice/{id}', name: 'maj_quantite_service', methods:['GET'])]
  196. public function majQuantitesService(Commande $commande, CommandeService $commandeService)
  197. {
  198. $commandeService->majQuantitesService($commande);
  199. return $this->redirectToRoute('commande_show',['id' => $commande->getId()]);
  200. }
  201. #[Route('/confirm/{id}', name: 'confirm_commande', methods:['GET','POST'])]
  202. public function confirmCommande(Service $service, EntityManagerInterface $entityManager, PanierServices $panierServices, Request $request, CommandeService $commandeService, EmailService $emailService, MailerInterface $mailer)
  203. {
  204. $now = new \DateTime('now', new \DateTimeZone('Europe/Paris'));
  205. $debut = $now->add(new DateInterval('PT10M'));
  206. // dump($now->format('Y-m-d H:i:s'));
  207. // dump($service->getFinService()->format('Y-m-d H:i:s'));
  208. if($debut->format('Y-m-d H:i:s') > $service->getFinService()->format('Y-m-d H:i:s')){
  209. // dd('OK');
  210. $this->addFlash('error', 'Désolé mais nous ne prenons plus de commande pour ce service. Nous serons ravis de prendre une nouvelle commande sur un prochain service.');
  211. $panierServices->panier_delete_service($service);
  212. return $this->redirectToRoute('panier_index');
  213. }
  214. $commande = $commandeService->new($service,$this->getUser());
  215. $commandeService->ajoutLignesCommande($commande);
  216. $form = $this->createForm(RetraitType::class,$commande,['service' => $service,'debut' => $debut]);
  217. $form->handleRequest($request);
  218. if ($form->isSubmitted() && $form->isValid()) {
  219. //Validation de la commande
  220. $entityManager->flush();
  221. //Initialisation du workflow
  222. $commandeService->workflowCommande($commande,'demander');
  223. //Suppression du panier
  224. $panierServices->panier_delete_service($service);
  225. //Envoi d'un courriel de confirmation de la commande au client
  226. $email = $emailService->EmailConfirmationCommande($commande);
  227. try {
  228. $mailer->send($email);
  229. $this->addFlash('email_ok', 'Un accusé de réception a été envoyé sur votre messagerie');
  230. $commandeService->messageSent($commande,'EmailConfirmationCommande');
  231. } catch (TransportExceptionInterface $e) {
  232. // $this->addFlash('verify_email_error', $e->getMessage());
  233. $commandeService->messageError($commande,'EmailConfirmationCommande',$e);
  234. //Envoi d'un courriel à l'admin pour informer qu'il y a un problème avec l'envoi de courriel vers le client
  235. }
  236. $this->addFlash('success', 'Merci pour votre commande');
  237. return $this->redirectToRoute('panier_maj_quantite_service',['id' => $commande->getId()]);
  238. }
  239. return $this->render('commande/retrait.html.twig', [
  240. 'form' => $form->createView(),
  241. ]);
  242. }
  243. #[Route('/delete', name: 'delete_all')]
  244. public function deleteAll(PanierServices $panierServices)
  245. {
  246. $panierServices->panier_delete_all();
  247. return $this->redirectToRoute('panier_index');
  248. }
  249. /**
  250. * Fonction d'impression d'un panier
  251. */
  252. #[Route('/{id}/print/{retrait}/{note?}', name: 'print', methods: ['GET'])]
  253. public function print(Service $service, Retrait $retrait, ?string $note): Response
  254. {
  255. $paniers = $this->session->get("panier", []);
  256. $lignesCommande = [];
  257. $commande = [
  258. 'id' => null,
  259. 'lignesCommande' => $lignesCommande,
  260. 'retrait' => $retrait,
  261. 'note' => $note,
  262. 'user' => $this->getUser(),
  263. ];
  264. foreach ($paniers[$service->getId()] as $id => $quantite) {
  265. $preparation = $this->preparationRepository->find($id);
  266. $preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
  267. $ligneCommande['preparation'] = $preparation;
  268. $ligneCommande['quantite'] = $quantite;
  269. $ligneCommande['prix'] = $preparationDuJour->getPrix();
  270. $lignesCommande[] = $ligneCommande;
  271. };
  272. $commande['lignesCommande'] = $lignesCommande;
  273. return $this->render('commande/print.html.twig',[
  274. 'commande' => $commande,
  275. ]);
  276. }
  277. }