<?php
namespace App\Controller\Api;
use App\DTO\AppDTO;
use App\Entity\Prod;
use App\Entity\Order;
use App\Service\Auth\Auth;
use App\Service\Cart\Cart;
use App\Entity\Cart as EntityCart;
use App\Repository\CartRepository;
use App\Repository\ProdRepository;
use App\Repository\OrderRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class CartController extends AbstractController
{
protected EntityManagerInterface $em;
protected CacheInterface $Cache;
protected AppDTO $app;
protected Cart $Cart;
protected Auth $Auth;
// Repository
protected ProdRepository $Prods;
protected OrderRepository $Orders;
protected CartRepository $CartItems;
public function __construct(EntityManagerInterface $em, CacheInterface $Cache, AppDTO $app, Cart $Cart, Auth $Auth, Security $security)
{
$this->Cache = $Cache;
$this->em = $em;
$this->app = $app;
$this->Cart = $Cart;
$this->Auth = $Auth;
$this->Auth->setUser($security->getUser());
$this->Prods = $this->em->getRepository(Prod::class);
$this->Orders = $this->em->getRepository(Order::class);
$this->CartItems = $this->em->getRepository(EntityCart::class);
}
// Проверка есть ли достаточное кол-во товара на складе
#[Route('/api/cart/test', name: 'cart_test')]
public function test(Request $request): Response
{
print_r($this->Cart->getCart());
die();
}
// Проверка есть ли достаточное кол-во товара на складе
#[Route('/api/cart/check', name: 'cart_check')]
public function check(Request $request): Response
{
$id = (int) $request->get('id');
$var = (int) $request->get('var');
$prod_num = $request->get('num') ? (int) $request->get('num') : 1;
$prod = $this->Prods->find($id);
if ($var == 2) {
$num_na_sklade = $prod->getNum2();
} elseif ($var == 3) {
$num_na_sklade = $prod->getNum3();
} else {
$num_na_sklade = $prod->getNum();
}
$cart_id = $this->Cart->getCartId($id, $var);
$num_in_cart = $this->Cart->getCart()[$cart_id]['num'] ?? 0;
$num = $num_in_cart + $prod_num;
if ($num_na_sklade < $num) {
$res = array('status' => 'false', 'num' => $num_na_sklade - $num_in_cart);
} else {
$res = array('status' => 'true', 'num' => $num_na_sklade - $num_in_cart);
}
return $this->json($res);
}
// Добавить товар в корзину
#[Route('/api/cart/buy', name: 'cart_buy')]
public function buy(Request $request): Response
{
$id = (int) $request->get('id');
$var = (int) $request->get('var');
$num = $request->get('num') ? (int) $request->get('num') : 1;
$chars = $request->get('chars');
// На всякий случай принудительно считаю скидку еще раз
// ASweb\Discount\UserDiscount::setValue(ASweb\Discount\UserDiscount::calculateUserDiscount(new Model_Discount, new Model_Order, new Model_User('client'), Auth::getUserId()));
$prod = $this->Prods->find($id);
if ($var == 1 || $var == 0) {
$price = $prod->getPrice();
$skidka = $prod->getSkidka();
$weight = $prod->getWeight();
$numdiscount = $prod->getNumdiscount();
} elseif ($var == 2) {
$price = $prod->getPrice2();
$skidka = $prod->getSkidka2();
$weight = $prod->getWeight2();
$numdiscount = $prod->getNumdiscount2();
} elseif ($var == 3) {
$price = $prod->getPrice3();
$skidka = $prod->getSkidka3();
$weight = $prod->getWeight3();
$numdiscount = $prod->getNumdiscount3();
}
$this->Cart->addItem($id, $var, $num, $price, $skidka, $numdiscount, $weight, $chars);
$result = [
"id" => $id,
"prods" => $this->Cart->getProdNum(),
"packs" => $this->Cart->getPackNum(),
"amount" => $this->Cart->getAmount(),
"reload" => $request->get('reload'),
'cart' => $this->Cart->getCart(),
];
return $this->json($result);
}
#[Route('/api/cart/update', name: 'cart_update')]
public function update(Request $request): Response
{
$id = (string) $request->get('id');
$num = $request->get('num') ? (int) $request->get('num') : 1;
$prod = $this->Prods->find((int)$this->Cart->getCart()[$id]['id']);
$var = $this->Cart->getCart()[$id]['var'];
if ($var == 1) {
$price = $prod->getPrice();
$skidka = $prod->getSkidka();
$weight = $prod->getWeight();
$numdiscount = $prod->getNumdiscount();
} elseif ($var == 2) {
$price = $prod->getPrice2();
$skidka = $prod->getSkidka2();
$weight = $prod->getWeight2();
$numdiscount = $prod->getNumdiscount2();
} elseif ($var == 3) {
$price = $prod->getPrice3();
$skidka = $prod->getSkidka3();
$weight = $prod->getWeight3();
$numdiscount = $prod->getNumdiscount3();
}
$this->Cart->updateItem($id, $num, $numdiscount);
$to_pay = $this->Cart->getAmountWithDelivery();
if (($this->Cart->getAmount() >= $this->app->sett->get('free_delivery_amount')) && !$this->Auth->isOpt()) {
$to_pay = $this->Cart->getAmount();
}
$result = [
"cart_id" => $id,
"id" => $this->Cart->getCart()[$id]['id'],
"price" => round($this->Cart->getCart()[$id]['price']),
"baseprice" => $this->Cart->getCart()[$id]['baseprice'],
"skidka" => $this->Cart->getCart()[$id]['skidka'],
"discount" => $this->Cart->getCart()[$id]['userdiscount'] + $this->Cart->getCart()[$id]['numdiscount'],
"num" => $this->Cart->getCart()[$id]['num'],
"prods" => intval($this->Cart->getProdNum()),
"packs" => intval($this->Cart->getPackNum()),
"weight" => $this->Cart->getWeight(),
"amount" => $this->Cart->getAmount(),
"sum" => $this->Cart->getAmountWithoutDiscount(),
"to_pay" => $to_pay,
"discount" => ($this->Cart->getAmountWithoutDiscount() - $this->Cart->getAmount()),
"cart" => $this->Cart->getCart(),
];
return $this->json($result);
}
// Список товаров для блока корзины
#[Route('/api/cart/list', name: 'cart_list')]
public function cartList(): Response
{
// if ($prods_limited = $Cart->prods_limited()) $view->prods_limited = $Cart->prods_limited;
// foreach($Cart->cart as $k => $v){
// if($v["num"] == 0) unset($Cart->cart[$k]);
// }
// echo $view->render('cart/list.php');
// die();
$response = [];
return $this->json($response);
}
#[Route('/api/cart/delete', name: 'cart_delete')]
public function deleteProd(Request $request): Response
{
$item = $request->get('item');
$this->Cart->deleteItem($item);
$result = [
"prods" => $this->Cart->getProdNum(),
"amount" => $this->Cart->getAmount(),
"cart" => $this->Cart->getCart(),
];
return $this->json($result);
}
#[Route('/api/cart/removegroup', name: 'cart_removegroup')]
public function removegroup(Request $request): Response
{
$items = $request->get('items');
foreach ($items as $item) {
$this->Cart->deleteItem($item);
}
$response = ["cart" => $this->Cart->getCart(), "amount" => $this->Cart->getAmount()];
return $this->json($response);
}
#[Route('/api/cart/clear', name: 'cart_clear')]
public function clearCart(): Response
{
$this->Cart->deleteAll();
$result = [
"prods" => $this->Cart->getProdNum(),
"amount" => $this->Cart->getAmount()
];
return $this->json($result);
}
#[Route('/api/cart/get', name: 'cart_get')]
public function getCart(Request $request): Response
{
$result = [
"prods" => $this->Cart->getProdNum(),
"packs" => $this->Cart->getPackNum(),
"amount" => $this->Cart->getAmount(),
"cart" => $this->Cart->getCart(),
"reload" => $request->get('reload'),
];
return $this->json($result);
}
#[Route(path: '/api/cart/repeat-order/{order_id}', name: 'cart_order_repeat_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/api/cart/repeat-order/{order_id}', name: 'cart_order_repeat', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function repeatOrder(int $order_id = 0): Response
{
$cartitems = $this->CartItems->findBy(['order_id' => $order_id]);
foreach ($cartitems as $k => $v) {
$prod = $v->getProd();
$var = $v->getVar();
$num = $v->getNum();
if ($var == 1 || $var == 0) {
$price = $prod->getPrice();
$skidka = $prod->getSkidka();
$weight = $prod->getWeight();
$numdiscount = $prod->getNumdiscount();
} elseif ($var == 2) {
$price = $prod->getPrice2();
$skidka = $prod->getSkidka2();
$weight = $prod->getWeight2();
$numdiscount = $prod->getNumdiscount2();
} elseif ($var == 3) {
$price = $prod->getPrice3();
$skidka = $prod->getSkidka3();
$weight = $prod->getWeight3();
$numdiscount = $prod->getNumdiscount3();
}
$this->Cart->addItem($prod->getId(), $var, $num, $price, $skidka, $numdiscount, $weight);
}
return $this->redirectToRoute('cart');
die();
}
}