src/Controller/EcommerceController.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Address;
  4. use App\Entity\Cart;
  5. use App\Entity\CartProduct;
  6. use App\Entity\Category;
  7. use App\Entity\EcommerceOrder;
  8. use App\Entity\PaymentMode;
  9. use App\Entity\Product;
  10. use App\Entity\PromoCode;
  11. use App\Entity\Shipping;
  12. use App\Entity\ShippingPrice;
  13. use App\Repository\CartRepository;
  14. use App\Service\Order;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Stripe\StripeClient;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\VarDumper\VarDumper;
  24. use App\Entity\User;
  25. /**
  26.  * Default controller.
  27.  *
  28.  * @Route("/shop", requirements={"_locale" = "en|fr"})
  29.  */
  30. class EcommerceController extends AbstractController
  31. {
  32.     /**
  33.      * @Route("/", name="shop",  options={"sitemap": true, "priority": 1, "changefreq": "yearly"})
  34.      */
  35.     public function shopAction(Request $requestEntityManagerInterface $em)
  36.     {
  37.         $pack $em->getRepository(Product::class)->find(1);
  38.         $lore $em->getRepository(Product::class)->find(10);
  39.         $tome $em->getRepository(Product::class)->find(11);
  40.         $categories $em->getRepository(Category::class)->findBy(['deletedAt' => null], ['sort' => 'ASC']);
  41.         return $this->render('app/ecommerce/list.html.twig', ['categories' => $categories'pack' => $pack'lore' => $lore'tome' => $tome]);
  42.     }
  43.     /**
  44.      * @Route("/product/{id}/{slug}", name="shop_product",  options={"sitemap": false, "priority": 1, "changefreq": "yearly"})
  45.      */
  46.     public function shopItemAction(Request $requestEntityManagerInterface $emProduct $product)
  47.     {
  48.         if (!$product || $product->isDeleted() || !$product->isDisplayOnShop()) {
  49.             return $this->redirectToRoute('shop');
  50.         }
  51.         return $this->render('app/ecommerce/show.html.twig', [
  52.             'product' => $product,
  53.         ]);
  54.     }
  55.     /**
  56.      * @Route("/cart/add/{id}", methods={"GET"}, name="add_to_cart", options={"sitemap": false})
  57.      *
  58.      */
  59.     public function addToCartAction(Request $requestProduct $productOrder $orderServiceEntityManagerInterface $em)
  60.     {
  61.         $repoCart $em->getRepository('App:Cart');
  62.         /** @var User $user * */
  63.         $user $this->getUser();
  64.         $cart $repoCart->findOneBy(array("session" => User::getSessionId($request), "ordered" => false));
  65.         if (!$cart instanceof Cart) {
  66.             $cart = new Cart();
  67.             $cart->setUser($user);
  68.             $cart->setOrdered(false);
  69.             $cart->setSession(User::getSessionId($request));
  70.             $cartProduct = new CartProduct();
  71.             $orderService->addToCart($cartProduct$cart$product);
  72.             $em->persist($cart);
  73.         } else {
  74.             $cartProducts $cart->getCartProducts();
  75.             $find false;
  76.             /** @var CartProduct $cartProduct */
  77.             foreach ($cartProducts as $cartProduct) {
  78.                 if (($cartProduct->getProduct()->getId() === $product->getId())) {
  79.                     $find true;
  80.                 }
  81.             }
  82.             if (false === $find) {
  83.                 // this logic is specific to the current state of Amsel Suite, it makes no sense to have a cart with multiple products
  84.                 if ($cart->getCartProducts()->count() > 0) {
  85.                     foreach ($cartProducts as $cartProduct) {
  86.                         $cart->removeCartProduct($cartProduct);
  87.                         $em->remove($cartProduct);
  88.                     }
  89.                 }
  90.                 $cartProduct = new CartProduct();
  91.                 $orderService->addToCart($cartProduct$cart$product);
  92.                 $em->persist($cart);
  93.             }
  94.         }
  95.         $em->flush();
  96.         $orderService->updateCart($request);
  97.         return $this->redirectToRoute("shop_cart");
  98.     }
  99.     /**
  100.      * @Route("/cart/remove/{id}", methods={"GET"}, name="remove_to_cart", options={"sitemap": false})
  101.      *
  102.      */
  103.     public function removeToCartAction(Request $requestCartProduct $cartProductOrder $orderServiceEntityManagerInterface $em)
  104.     {
  105.         $em->remove($cartProduct);
  106.         $em->flush();
  107.         $orderService->updateCart($request);
  108.         return $this->redirectToRoute("homepage");
  109.     }
  110.     /**
  111.      * @Route("/cart", name="shop_cart",  options={"sitemap": false})
  112.      */
  113.     public function cartAction(Request $requestOrder $orderServiceEntityManagerInterface $em)
  114.     {
  115.         $repoCart $em->getRepository('App:Cart');
  116.         $orderService->updateCart($request);
  117.         /** @var Cart $cart */
  118.         $cart $repoCart->findOneBy(array(
  119.             "session" => User::getSessionId($request),
  120.             "ordered" => false
  121.         ));
  122.         if ($cart instanceof Cart) {
  123.             $cartProducts $cart->getCartProducts();
  124.         } else {
  125.             $cartProducts null;
  126.         }
  127.         if ($request->getMethod() == "POST") {
  128.             if ($cart instanceof Cart) {
  129.                 $recipient $request->get('_recipient');
  130.                 $cart->setRecipient($recipient);
  131.                 $em->persist($cart);
  132.                 $em->flush();
  133.                 return $this->redirectToRoute('shop_cart_products');
  134.             } else {
  135.                 return $this->redirectToRoute('homepage');
  136.             }
  137.         }
  138.         return $this->render("app/ecommerce/cart.html.twig", ['cartProducts' => $cartProducts]);
  139.     }
  140.     /**
  141.      * @Route("/cart/products", name="shop_cart_products",  options={"sitemap": false})
  142.      */
  143.     public function cartProductsAction(Request $requestOrder $orderServiceEntityManagerInterface $em)
  144.     {
  145.         $repoCart $em->getRepository('App:Cart');
  146.         $orderService->updateCart($request);
  147.         /** @var Cart $cart */
  148.         $cart $repoCart->findOneBy(array(
  149.             "session" => User::getSessionId($request),
  150.             "ordered" => false
  151.         ));
  152.         if ($cart instanceof Cart) {
  153.             $cartProducts $cart->getCartProducts();
  154.         } else {
  155.             $cartProducts null;
  156.         }
  157.         if ($cartProducts) {
  158.             $alreadyExist false;
  159.             foreach ($cartProducts as $cartProduct) {
  160.                 if ($this->getUser()->existProduct($cartProduct->getProduct())) {
  161.                     $alreadyExist true;
  162.                 }
  163.             }
  164.             if ($alreadyExist == false || $cart->getRecipient() != null) {
  165.                 return $this->render("app/ecommerce/cart_products.html.twig", array(
  166.                     'cartProducts' => $cartProducts,
  167.                     'cart' => $cart
  168.                 ));
  169.             }
  170.             return $this->redirectToRoute('shop_cart');
  171.         }
  172.         return $this->redirectToRoute('homepage');
  173.     }
  174.     /**
  175.      * @Route("/checkout", name="checkout",  options={"sitemap": false})
  176.      */
  177.     public function checkoutAction(Request $requestOrder $orderServiceEntityManagerInterface $em)
  178.     {
  179.         if($request->get('cgv'0) !=|| $request->get('delay'0) != 1){
  180.             $params = [];
  181.             if($request->get('cgv'0) !=1){
  182.                 $params['cgv'] = "no";
  183.             }
  184.             if($request->get('delay'0) !=1){
  185.                 $params['delay'] = "no";
  186.             }
  187.             return $this->redirectToRoute('shop_cart_products'$params);
  188.         }
  189.         $stripe_public_key $this->getParameter('stripe_public_key');
  190.         $repoCart $em->getRepository('App:Cart');
  191.         $orderService->updateCart($request);
  192.         /** @var Cart $cart */
  193.         $cart $repoCart->findOneBy(array(
  194.             "session" => User::getSessionId($request),
  195.             "ordered" => false
  196.         ));
  197.         if ($cart instanceof Cart) {
  198.             $alreadyExist false;
  199.             $price 0;
  200.             /** @var CartProduct $cartProduct */
  201.             foreach ($cart->getCartProducts() as $cartProduct) {
  202.                 $price += $cartProduct->getActualPrice() * 100 $cartProduct->getQuantity();
  203.                 if ($this->getUser()->existProduct($cartProduct->getProduct())) {
  204.                     $alreadyExist true;
  205.                 }
  206.             }
  207.             $user $this->getUser();
  208.             $cart->setUser($user);
  209.             $em->persist($cart);
  210.             $em->flush();
  211.             if ($alreadyExist == false || $cart->getRecipient() != null) {
  212.                 return $this->render('app/ecommerce/checkout.html.twig', ['cart' => $cart'stripe_public_key' => $stripe_public_key'amount' => $price]);
  213.             } else {
  214.                 return $this->redirectToRoute('shop_cart');
  215.             }
  216.         }
  217.         return $this->redirectToRoute('homepage');
  218.     }
  219.     /**
  220.      * @Route("/checkout/create-session/{id}", name="checkout_create_session",  options={"sitemap": false})
  221.      */
  222.     public function checkoutLoadAction(Request $requestCart $cart)
  223.     {
  224.         $stripe_secret_key $this->getParameter('stripe_secret_key');
  225.         $items = [];
  226.         /** @var CartProduct $cartProduct */
  227.         foreach ($cart->getCartProducts() as $cartProduct) {
  228.             $item = [
  229.                 'price_data' => [
  230.                     'currency' => 'eur',
  231.                     'product_data' => [
  232.                         'name' => $cartProduct->getProduct()->translate()->getTitle(),
  233.                         'images' => [$request->getUriForPath($cartProduct->getProduct()->getFirstPicture()->getPath())],
  234.                     ],
  235.                     'unit_amount' => $cartProduct->getActualPrice() * 100,
  236.                 ],
  237.                 'quantity' => $cartProduct->getQuantity(),
  238.             ];
  239.             $items[] = $item;
  240.         }
  241.         $stripe = new StripeClient([
  242.             "api_key" => $stripe_secret_key
  243.         ]);
  244.         $checkout_session $stripe->checkout->sessions->create([
  245.             'line_items' => $items,
  246.             'locale' => $request->getLocale(),
  247.             'invoice_creation' => ['enabled' => true],
  248.             'automatic_tax' => ['enabled' => true],
  249.             'mode' => 'payment',
  250.             'ui_mode' => 'embedded',
  251.             'return_url' => $this->generateUrl('checkout_return', ['id' => $cart->getId()], UrlGeneratorInterface::ABSOLUTE_URL) . '?session_id={CHECKOUT_SESSION_ID}',
  252.         ]);
  253.         return new JsonResponse([
  254.             'clientSecret' => $checkout_session->client_secret
  255.         ]);
  256.     }
  257.     /**
  258.      * @Route("/checkout/{id}/return", name="checkout_return",  options={"sitemap": false})
  259.      */
  260.     public function checkoutReturnAction(Request $requestCart $cartOrder $order)
  261.     {
  262.         $stripe_secret_key $this->getParameter('stripe_secret_key');
  263.         $stripe = new StripeClient([
  264.             "api_key" => $stripe_secret_key
  265.         ]);
  266.         try {
  267.             $session $stripe->checkout->sessions->retrieve($request->get('session_id'));
  268.             if ($session->status == "complete") {
  269.                 $listProducts = [];
  270.                 /** @var CartProduct $cartProduct */
  271.                 foreach ($cart->getCartProducts() as $cartProduct) {
  272.                     $listProducts[] = [
  273.                         'product_id' => $cartProduct->getProduct()->getId(),
  274.                         'product_name' => $cartProduct->getProduct()->translate()->getTitle(),
  275.                         'price' => $cartProduct->getActualPrice(),
  276.                         'quantity' => $cartProduct->getQuantity()
  277.                     ];
  278.                 }
  279.                 $orderEntity $order->saveOrder($cart$session);
  280.                 return $this->render('app/ecommerce/checkout_ok.html.twig', ['order' => $orderEntity'order_products' => $listProducts]);
  281.             } else {
  282.                 return $this->redirectToRoute('checkout');
  283.             }
  284.         } catch (Error $e) {
  285.             return $this->render('app/ecommerce/checkout_error.html.twig', ['error' => $e->getMessage()]);
  286.         }
  287.     }
  288. }