src/Controller/ECommerce/App/IndividualOrderController.php line 330

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\ECommerce\App;
  4. use App\Entity\ECommerce\Client;
  5. use App\Entity\ECommerce\Currency;
  6. use App\Entity\ECommerce\DepotProduct;
  7. use App\Entity\ECommerce\IndividualOrder;
  8. use App\Form\ECommerce\App\IndividualOrderType;
  9. use App\Form\ECommerce\Partials\CartItem\IndividualOrderItemQuantity;
  10. use App\Controller\ControllerTrait;
  11. use App\Entity\App\User;
  12. use App\Form\App\Type\RegistrationFormType;
  13. use App\Security\App\AuthSecurityService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  17. use Symfony\Component\Form\Form;
  18. use Symfony\Component\Form\FormInterface;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. #[Route('/{_locale}/individual_order', requirements: ['_locale' => '\w{2}'])]
  25. class IndividualOrderController extends AbstractController
  26. {
  27. const INDEX_ROUTE = 'mdl_public_individual_order_index';
  28. use ControllerTrait;
  29. #[Route('/index', name: 'mdl_public_individual_order_index', methods: ['GET', 'POST'])]
  30. public function indexAction(Request $request): Response
  31. {
  32. /** @var IndividualOrder $order */
  33. $order = $this->get('session')->get('individual_order', new IndividualOrder());
  34. $form = $this->createForm(IndividualOrderType::class, $order)->handleRequest($request);
  35. $products = $this->getDoctrine()
  36. ->getRepository(DepotProduct::class)
  37. ->findById(array_keys($order->getItems()));
  38. if (!$form->isSubmitted() || !$form->isValid()) {
  39. return $this->render('ECommerce/App/IndividualOrder/index.html.twig', [
  40. 'products' => $products,
  41. 'individual_order' => $order,
  42. 'form' => $form->createView(),
  43. ]);
  44. }
  45. return $this->redirectToRoute('mdl_public_individual_order_checkout');
  46. }
  47. /**
  48. * @Route("/checkout", name="mdl_public_individual_order_checkout", methods={"GET", "POST"})
  49. *
  50. * @param AuthSecurityService $securityService
  51. *
  52. * @throws \Doctrine\ORM\NonUniqueResultException
  53. */
  54. public function checkOut(
  55. Request $request,
  56. TranslatorInterface $translator,
  57. EntityManagerInterface $entityManager
  58. ): Response {
  59. /** @var IndividualOrder $order */
  60. $order = $this->get('session')->get('individual_order');
  61. if (!$order) {
  62. $this->addFlash(
  63. 'danger',
  64. $translator->trans('notifications.individual_order.empty', [], 'ECommerceBundle')
  65. );
  66. return $this->redirectToIndex();
  67. }
  68. $currency = $entityManager->getRepository(Currency::class)->findFirst();
  69. $user = $this->getUser();
  70. if($user instanceof User) {
  71. $entityManager->persist($order->setUser($user));
  72. $entityManager->flush();
  73. $this->get('session')->remove('individual_order');
  74. $this->addFlash(
  75. 'success',
  76. $translator->trans('notifications.individual_order.success', [], 'ECommerceBundle')
  77. );
  78. return $this->redirectToPublicIndex();
  79. }
  80. $user = (new User())->setPassword(microtime())
  81. ->setGuest(true)
  82. ->setClient((new Client())->setPhones([''])
  83. ->setCurrency($currency));
  84. $form = $this->createForm(RegistrationFormType::class, $user, [
  85. 'short' => true,
  86. 'validation_groups' => ['Registration'],
  87. 'translation_domain' => 'validators',
  88. ])->handleRequest($request);
  89. $existingUser = $entityManager->getRepository(User::class)->findOneBy(['email' => $user->getEmail()]);
  90. if ($form->isSubmitted() && !$form->isValid() && $existingUser) {
  91. return $this->redirectToRoute('mdl_public_individual_order_check_out', [
  92. 'email' => $user->getEmail()
  93. ]);
  94. }
  95. if ($existingUser && in_array('ROLE_GUEST', $existingUser->getRoles())) {
  96. $user = $existingUser;
  97. $user->setClient(
  98. (new Client())->setPhones([''])->setCurrency($currency)
  99. );
  100. }
  101. $products = $entityManager->getRepository(DepotProduct::class)->findById(array_keys($order->getItems()));
  102. if (!$form->isSubmitted() || !$form->isValid()) {
  103. return $this->render('ECommerce/App/IndividualOrder/checkout.html.twig', [
  104. 'individual_order' => $order,
  105. 'products' => $products,
  106. 'form' => $form->createView(),
  107. 'user' => $user,
  108. ]);
  109. }
  110. $entityManager->persist($user->getClient());
  111. $entityManager->persist($user);
  112. $entityManager->persist($order->setUser($user));
  113. $entityManager->flush();
  114. $this->get('session')->remove('individual_order');
  115. $this->addFlash(
  116. 'success',
  117. $translator->trans('notifications.individual_order.success', [], 'ECommerceBundle')
  118. );
  119. return $this->redirectToPublicIndex();
  120. }
  121. /**
  122. * @Route("/check_out", name="mdl_public_individual_order_check_out", methods={"GET", "POST"})
  123. *
  124. *
  125. */
  126. public function checkOutByUser(
  127. Request $request,
  128. TranslatorInterface $translator
  129. ): Response {
  130. /** @var IndividualOrder $order */
  131. $order = $this->get('session')->get('individual_order');
  132. $user = $this->getDoctrine()->getRepository(User::class)->findOneBy([
  133. 'email' => $request->query->get('email'),
  134. ]);
  135. if (!$user) {
  136. return $this->redirectToIndex();
  137. }
  138. if (!$order) {
  139. $this->addFlash(
  140. 'danger',
  141. $translator->trans('notifications.individual_order.empty', [], 'ECommerceBundle')
  142. );
  143. return $this->redirectToIndex();
  144. }
  145. $em = $this->getDoctrine()->getManager();
  146. $em->persist($order->setUser($user));
  147. $em->flush();
  148. $this->get('session')->remove('individual_order');
  149. $this->addFlash(
  150. 'success',
  151. $translator->trans('notifications.individual_order.success', [], 'ECommerceBundle')
  152. );
  153. return $this->redirectToPublicIndex();
  154. }
  155. /**
  156. * @Route("/{id}/add", name="mdl_public_individual_order_add_product", methods={"POST"})
  157. *
  158. *
  159. */
  160. public function addAction(Request $request, DepotProduct $depotProduct, TranslatorInterface $translator): RedirectResponse
  161. {
  162. $individual_order = $this->get('session')->get('individual_order');
  163. $individual_order ??= new IndividualOrder();
  164. $form = $this->createForm(IndividualOrderItemQuantity::class, [])->handleRequest($request);
  165. if ($form->isSubmitted() && $form->isValid()) {
  166. $individual_order->addItem($depotProduct, $form->getNormData()['quantity']);
  167. $this->get('session')->set('individual_order', $individual_order);
  168. $this->addFlash(
  169. 'success',
  170. $translator->trans('notifications.individual_order.added', [], 'ECommerceBundle')
  171. );
  172. }
  173. return $this->redirect($request->server->get('HTTP_REFERER'));
  174. }
  175. /**
  176. * Update cart item quantity
  177. *
  178. * @Route("/{id}/quantity", name="mdl_public_individual_order_item_quantity", methods={"GET", "PATCH"})
  179. *
  180. * @Cache(maxage="+2 days", public=true)
  181. *
  182. * @param DepotProduct $depotProduct $depotProduct
  183. *
  184. */
  185. public function quantityAction(Request $request, DepotProduct $depotProduct, TranslatorInterface $translator): Response
  186. {
  187. /** @var IndividualOrder $order */
  188. $order = $this->get('session')->get('individual_order');
  189. /** @var Form $form */
  190. $form = $this->createForm(IndividualOrderItemQuantity::class, $depotProduct->setQuantity($order->getQuantity($depotProduct)), [
  191. 'method' => 'PATCH',
  192. 'action' => $this->generateUrl('mdl_public_individual_order_item_quantity', ['id' => $depotProduct->getId()])
  193. ])->handleRequest($request);
  194. $isFragment = $this->isFragment($request);
  195. $responseData = [
  196. 'form' => $form->createView(),
  197. ];
  198. if (!$form->isSubmitted() || !$form->isValid()) {
  199. return $isFragment
  200. ? $this->render('ECommerce/App/IndividualOrder/quantity.ajax.twig', $responseData)
  201. : $this->render('ECommerce/App/IndividualOrder/quantity.html.twig', $responseData);
  202. }
  203. $quantity = $depotProduct->getQuantity();
  204. if ($form->get('plus')->isSubmitted()) {
  205. $quantity+=1;
  206. } elseif ($form->get('minus')->isSubmitted()) {
  207. $quantity-=1;
  208. }
  209. if ($quantity < 1) {
  210. $order->removeItem($depotProduct);
  211. } else {
  212. $order->setQuantity($depotProduct->setQuantity($quantity));
  213. }
  214. $this->get('session')->set('individual_order', $order);
  215. $this->addFlash(
  216. 'success',
  217. $translator->trans('notifications.cart.quantity', [], 'ECommerceBundle')
  218. );
  219. return $isFragment || $request->isXmlHttpRequest()
  220. ? $this->render('ECommerce/App/IndividualOrder/quantity.ajax.twig', $responseData)
  221. : $this->redirectToIndex();
  222. }
  223. /**
  224. * Update cart item quantity
  225. *
  226. * @Route("/{id}/quantity", name="mdl_public_individual_order_item_remove", methods={"DELETE"})
  227. *
  228. * @Cache(maxage="+2 days", public=true)
  229. *
  230. * @param DepotProduct $depotProduct $depotProduct
  231. *
  232. */
  233. public function removeAction(Request $request, DepotProduct $depotProduct, TranslatorInterface $translator): Response
  234. {
  235. /** @var IndividualOrder $order */
  236. $order = $this->get('session')->get('individual_order');
  237. $form = $this->getRemoveForm($depotProduct)->handleRequest($request);
  238. if ($this->isFragment($request)) {
  239. return $this->render('ECommerce/App/IndividualOrder/remove.ajax.twig', [
  240. 'form' => $form->createView(),
  241. ]);
  242. }
  243. if (!$form->isSubmitted() || !$form->isValid()) {
  244. return $this->render('ECommerce/App/IndividualOrder/remove.ajax.twig', [
  245. 'form' => $form->createView(),
  246. ]);
  247. }
  248. $order->removeItem($depotProduct);
  249. $this->get('session')->set('individual_order', $order);
  250. $this->addFlash(
  251. 'success',
  252. $translator->trans('notifications.cart.removed', [], 'ECommerceBundle')
  253. );
  254. return $this->redirectToIndex();
  255. }
  256. private function getRemoveForm(DepotProduct $depotProduct): FormInterface
  257. {
  258. return $this->createFormBuilder()
  259. ->setAction($this->generateUrl('mdl_public_individual_order_item_remove', ['id' => $depotProduct->getId()]))
  260. ->setMethod('DELETE')
  261. ->getForm();
  262. }
  263. /**
  264. * @Route("/individual_order", name="mdl_public_individual_order_small_widget")
  265. */
  266. public function smallWidgetAction(): Response
  267. {
  268. return $this->render('ECommerce/App/IndividualOrder/small_widget.html.twig', [
  269. 'individual_order' => $this->get('session')->get('individual_order'),
  270. ]);
  271. }
  272. }