src/Controller/Api/CartController.php line 237

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\DTO\AppDTO;
  4. use App\Entity\Prod;
  5. use App\Entity\Order;
  6. use App\Service\Auth\Auth;
  7. use App\Service\Cart\Cart;
  8. use App\Entity\Cart as EntityCart;
  9. use App\Event\CartItemAdded;
  10. use App\Repository\CartRepository;
  11. use App\Repository\ProdRepository;
  12. use App\Repository\OrderRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use App\Service\Statistics\ProdAddToCart;
  15. use Symfony\Contracts\Cache\CacheInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\Security\Core\Security;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. class CartController extends AbstractController
  23. {
  24.     public function __construct(
  25.         private ProdRepository $Prods,
  26.         private OrderRepository $Orders,
  27.         private CartRepository $CartItems,
  28.         private CacheInterface $Cache,
  29.         private AppDTO $app,
  30.         private Cart $Cart,
  31.         private Auth $Auth,
  32.         private Security $security,
  33.         private ProdAddToCart $prodAddToCart,
  34.         private EventDispatcherInterface $dispatcher,
  35.     )
  36.     {
  37.         $this->Auth->setUser($security->getUser());
  38.     }
  39.     // Проверка есть ли достаточное кол-во товара на складе
  40.     #[Route('/api/cart/test'name'cart_test')]
  41.     public function test(Request $request): Response
  42.     {
  43.         print_r($this->Cart->getCart());
  44.         die();
  45.     }
  46.     // Проверка есть ли достаточное кол-во товара на складе
  47.     #[Route('/api/cart/check'name'cart_check')]
  48.     public function check(Request $request): Response
  49.     {
  50.         $id = (int) $request->get('id');
  51.         $var = (int) $request->get('prodvar');
  52.         $prod_num $request->get('num') ? (int) $request->get('num') : 1;
  53.         $prod $this->Prods->find($id);
  54.         if ($var == 2) {
  55.             $num_na_sklade $prod->getNum2();
  56.         } elseif ($var == 3) {
  57.             $num_na_sklade $prod->getNum3();
  58.         } else {
  59.             $num_na_sklade $prod->getNum();
  60.         }
  61.         
  62.         $cart_id $this->Cart->getCartId($id$var);
  63.         $num_in_cart $this->Cart->getCart()[$cart_id]['num'] ?? 0;
  64.         $num $num_in_cart $prod_num;
  65.     
  66.         if ($num_na_sklade $num) {
  67.             $res = array('status' => 'false''num' => $num_na_sklade $num_in_cart);
  68.         } else {
  69.             $res = array('status' => 'true''num' => $num_na_sklade $num_in_cart);
  70.         }
  71.         
  72.         return $this->json($res);
  73.     }
  74.     // Добавить товар в корзину
  75.     #[Route('/api/cart/buy'name'cart_buy')]
  76.     public function buy(Request $request): Response
  77.     {
  78.         $id = (int) $request->get('id');
  79.         $var = (int) $request->get('var');
  80.         $num $request->get('num') ? (int) $request->get('num') : 1;
  81.         $chars $request->get('chars');
  82.         // На всякий случай принудительно считаю скидку еще раз     
  83.         // ASweb\Discount\UserDiscount::setValue(ASweb\Discount\UserDiscount::calculateUserDiscount(new Model_Discount, new Model_Order, new Model_User('client'), Auth::getUserId()));
  84.     
  85.         $prod $this->Prods->find($id);
  86.         if ($var == || $var == 0) {
  87.             $price $prod->getPrice();
  88.             $skidka $prod->getSkidka();
  89.             $weight $prod->getWeight();
  90.             $numdiscount $prod->getNumdiscount();
  91.         } elseif ($var == 2) {
  92.             $price $prod->getPrice2();
  93.             $skidka $prod->getSkidka2();
  94.             $weight $prod->getWeight2();
  95.             $numdiscount $prod->getNumdiscount2();
  96.         } elseif ($var == 3) {
  97.             $price $prod->getPrice3();
  98.             $skidka $prod->getSkidka3();
  99.             $weight $prod->getWeight3();
  100.             $numdiscount $prod->getNumdiscount3();
  101.         }
  102.         //Для статистики
  103.         $this->prodAddToCart->addProd($id);
  104.         
  105.         $this->Cart->addItem($id$var$num$price$skidka$numdiscount$weight$chars);
  106.         $event = new CartItemAdded($prod$num$this->Cart);
  107.         $this->dispatcher->dispatch($eventCartItemAdded::NAME);
  108.         $result = [
  109.             "id" => $id,
  110.             "prods" => $this->Cart->getProdNum(),
  111.             "packs" => $this->Cart->getPackNum(),
  112.             "amount" => $this->Cart->getAmount(),
  113.             "reload" => $request->get('reload'),
  114.             'cart' => $this->Cart->getCart(),
  115.         ];
  116.     
  117.         return $this->json($result);
  118.     }
  119.     #[Route('/api/cart/update'name'cart_update')]
  120.     public function update(Request $request): Response
  121.     {
  122.         $id = (string) $request->get('id');
  123.         $num $request->get('num') ? (int) $request->get('num') : 1;
  124.         $prod $this->Prods->find((int)$this->Cart->getCart()[$id]['id']);
  125.         $var $this->Cart->getCart()[$id]['var'];
  126.         
  127.         if ($var == 1) {
  128.             $price $prod->getPrice();
  129.             $skidka $prod->getSkidka();
  130.             $weight $prod->getWeight();
  131.             $numdiscount $prod->getNumdiscount();
  132.         } elseif ($var == 2) {
  133.             $price $prod->getPrice2();
  134.             $skidka $prod->getSkidka2();
  135.             $weight $prod->getWeight2();
  136.             $numdiscount $prod->getNumdiscount2();
  137.         } elseif ($var == 3) {
  138.             $price $prod->getPrice3();
  139.             $skidka $prod->getSkidka3();
  140.             $weight $prod->getWeight3();
  141.             $numdiscount $prod->getNumdiscount3();
  142.         }
  143.         $this->Cart->updateItem($id$num$numdiscount);
  144.         $to_pay $this->Cart->getAmountWithDelivery();
  145.         if (($this->Cart->getAmount() >= $this->app->sett->get('free_delivery_amount')) && !$this->Auth->isOpt()) {
  146.             $to_pay $this->Cart->getAmount();
  147.         }
  148.         $result = [
  149.             "cart_id" => $id
  150.             "id" => $this->Cart->getCart()[$id]['id'],
  151.             "price" => round($this->Cart->getCart()[$id]['price']),
  152.             "baseprice" => $this->Cart->getCart()[$id]['baseprice'],
  153.             "skidka" => $this->Cart->getCart()[$id]['skidka'],
  154.             "discount" => $this->Cart->getCart()[$id]['userdiscount'] + $this->Cart->getCart()[$id]['numdiscount'],
  155.             "num" => $this->Cart->getCart()[$id]['num'],
  156.             "prods" => intval($this->Cart->getProdNum()),
  157.             "packs" => intval($this->Cart->getPackNum()),
  158.             "weight" => $this->Cart->getWeight(),
  159.             "amount" => $this->Cart->getAmount(),
  160.             "sum" => $this->Cart->getAmountWithoutDiscount(),
  161.             "to_pay" => $to_pay,
  162.             "discount" => ($this->Cart->getAmountWithoutDiscount() - $this->Cart->getAmount()),
  163.             "cart" => $this->Cart->getCart(),
  164.             'delivery_indicator_data' => $this->Cart->getDeliveryIndicatorData((float) $this->app->sett->get('free_delivery_amount')),
  165.         ];
  166.         return $this->json($result);
  167.     }
  168.     // Список товаров для блока корзины
  169.     #[Route('/api/cart/list'name'cart_list')]
  170.     public function cartList(): Response
  171.     {        
  172.         // if ($prods_limited = $Cart->prods_limited()) $view->prods_limited = $Cart->prods_limited;
  173.         // foreach($Cart->cart as $k => $v){
  174.         //     if($v["num"] == 0) unset($Cart->cart[$k]);
  175.         // }
  176.         // echo $view->render('cart/list.php');
  177.         // die();
  178.         $response = [];
  179.         return $this->json($response);
  180.     }
  181.     
  182.     #[Route('/api/cart/delete'name'cart_delete')]
  183.     public function deleteProd(Request $request): Response
  184.     {
  185.         $item $request->get('item');
  186.         $this->Cart->deleteItem($item);
  187.         $result = [
  188.             "prods" => $this->Cart->getProdNum(),
  189.             "amount" => $this->Cart->getAmount(),
  190.             "cart" => $this->Cart->getCart(),
  191.         ];
  192.         return $this->json($result);
  193.     }
  194.     #[Route('/api/cart/removegroup'name'cart_removegroup')]
  195.     public function removegroup(Request $request): Response
  196.     {
  197.         $items $request->get('items');
  198.         foreach ($items as $item) {
  199.             $this->Cart->deleteItem($item);
  200.         }
  201.         $response = ["cart" => $this->Cart->getCart(), "amount" => $this->Cart->getAmount()];
  202.         return $this->json($response);
  203.     }
  204.     #[Route('/api/cart/clear'name'cart_clear')]
  205.     public function clearCart(): Response
  206.     {
  207.         $this->Cart->deleteAll();
  208.         $result = [
  209.             "prods" => $this->Cart->getProdNum(), 
  210.             "amount" => $this->Cart->getAmount()
  211.         ];
  212.         return $this->json($result);
  213.     }
  214.     #[Route('/api/cart/get'name'cart_get')]
  215.     public function getCart(Request $request): Response
  216.     {
  217.         $result = [
  218.             "prods" => $this->Cart->getProdNum(),
  219.             "packs" => $this->Cart->getPackNum(),
  220.             "amount" => $this->Cart->getAmount(),
  221.             "cart" => $this->Cart->getCart(),
  222.             "reload" => $request->get('reload'),
  223.         ];
  224.         return $this->json($result);
  225.     }
  226.     
  227.     #[Route(path'/api/cart/repeat-order/{order_id}'name'cart_order_repeat_no_locale'priority100defaults: ['_locale' => '%app.default_lang%'])]
  228.     #[Route(path'/{_locale}/api/cart/repeat-order/{order_id}'name'cart_order_repeat'priority100requirements: ['_locale' => '%app.langs%'])] 
  229.     public function repeatOrder(int $order_id 0): Response
  230.     {
  231.         $cartitems $this->CartItems->findBy(['order_id' => $order_id]);
  232.         foreach ($cartitems as $k => $v) {    
  233.             $prod $v->getProd();
  234.             $var $v->getVar();
  235.             $num $v->getNum();
  236.             if ($var == || $var == 0) {
  237.                 if ($prod->getNum() == 0) {
  238.                     continue;
  239.                 }    
  240.                 $price $prod->getPrice();
  241.                 $skidka $prod->getSkidka();
  242.                 $weight $prod->getWeight();
  243.                 $numdiscount $prod->getNumdiscount();
  244.             } elseif ($var == 2) {
  245.                 if ($prod->getNum2() == 0) {
  246.                     continue;
  247.                 }    
  248.                 $price $prod->getPrice2();
  249.                 $skidka $prod->getSkidka2();
  250.                 $weight $prod->getWeight2();
  251.                 $numdiscount $prod->getNumdiscount2();
  252.             } elseif ($var == 3) {
  253.                 if ($prod->getNum3() == 0) {
  254.                     continue;
  255.                 }    
  256.                 $price $prod->getPrice3();
  257.                 $skidka $prod->getSkidka3();
  258.                 $weight $prod->getWeight3();
  259.                 $numdiscount $prod->getNumdiscount3();
  260.             }
  261.             
  262.             $this->Cart->addItem($prod->getId(), $var$num$price$skidka$numdiscount$weight);
  263.         }
  264.     
  265.         return $this->redirectToRoute('cart');
  266.         die();
  267.     }
  268. }