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

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