<?php
namespace App\Controller;
use App\Env;
use App\DTO\AppDTO;
use App\Entity\Cart;
use App\Entity\User;
use App\Entity\Order;
use App\Entity\Esystem;
use App\Entity\Delivery;
use App\Entity\Discount;
use App\Service\Auth\Auth;
use App\Entity\Subdelivery;
use App\Model\Order as ModelOrder;
use App\Repository\CartRepository;
use App\Repository\UserRepository;
use App\Repository\OrderRepository;
use App\Repository\EsystemRepository;
use App\Repository\DeliveryRepository;
use App\Repository\DiscountRepository;
use App\Service\Cart\Cart as CartCart;
use App\Service\Discount\UserDiscount;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\SubdeliveryRepository;
use Symfony\Contracts\Cache\CacheInterface;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use App\Service\Paginator as ServicePaginator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestStack;
class UserController extends AbstractASController
{
protected EntityManagerInterface $em;
protected CacheInterface $Cache;
protected AppDTO $app;
protected Auth $Auth;
protected UserDiscount $UserDiscount;
protected ModelOrder $ModelOrder;
//Repositories
protected OrderRepository $Orders;
protected CartRepository $Carts;
protected UserRepository $Users;
protected DeliveryRepository $Deliveries;
protected EsystemRepository $Esystems;
protected SubdeliveryRepository $Subdeliveries;
protected DiscountRepository $Discounts;
private $order_total;
public function __construct(EntityManagerInterface $em, CacheInterface $Cache, AppDTO $app, Auth $Auth, UserDiscount $UserDiscount, ModelOrder $ModelOrder, Security $security, RequestStack $requestStack)
{
$this->requestStack = $requestStack;
$this->Cache = $Cache;
$this->em = $em;
$this->app = $app;
$this->Auth = $Auth;
$this->Auth->setUser($security->getUser());
$this->UserDiscount = $UserDiscount;
$this->ModelOrder = $ModelOrder;
$this->Orders = $em->getRepository(Order::class);
$this->Carts = $em->getRepository(Cart::class);
$this->Users = $em->getRepository(User::class);
$this->Deliveries = $em->getRepository(Delivery::class);
$this->Esystems = $em->getRepository(Esystem::class);
$this->Subdeliveries = $em->getRepository(Subdelivery::class);
$this->Discounts = $em->getRepository(Discount::class);
}
// Главная
#[Route(path: '/user', name: 'user_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user', name: 'user', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function index(Request $request): Response
{
$ocount = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
// $Order = new Model_Order();
// $orders = $Order->getall(array("where" => "user = '".Db::nq(Auth::getUserId())."'", "order" => "tstamp desc"));
// foreach ($orders as $order) {
// $ocount[$order->status]++;
return $this->render('user/index.html.twig', [
'ocount' => $ocount,
'order_total' => 0,
'discount' => 0,
'nextdiscount' => ['name' => '', 'value' => ''],
'tonextdiscount' => 0,
'controller_name' => 'UserController',
'ocount' => $this->_ocount(),
'order_total' => $this->_order_total(),
'discounts' => $this->_discounts(),
'discount' => $this->_discount(),
'nextdiscount' => $this->_nextdiscount(),
'tonextdiscount' => $this->_tonextdiscount(),
'is_opt' => Env::is_opt(),
]);
}
// История заказов. Фильтр по статусу
#[Route(path: '/user/order-history', name: 'user_orders_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/user/order-history/status/{status}', name: 'user_orders_status_no_locale', defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user/order-history', name: 'user_orders', priority: 100, requirements: ['_locale' => '%app.langs%'])]
#[Route(path: '/{_locale}/user/order-history/status/{status}', name: 'user_orders_status', requirements: ['_locale' => '%app.langs%', 'status' => '1|2|3|4|5|6|7|8|9'])]
public function orderList(Request $request, int $status = 0): Response
{
/** @var \App\Entity\User $user */
$user = $this->getUser();
$userid = $user ? $user->getId() : 0;
$results = 50;
$start = (int) $request->query->get('start');
if ($status) {
$dql = "SELECT o FROM App\Entity\Order o WHERE o.user = " . $userid . " and o.status = " . $status . " ORDER BY o.tstamp DESC";
} else {
$dql = "SELECT o FROM App\Entity\Order o WHERE o.user = " . $userid . " ORDER BY o.tstamp DESC";
}
$query = $this->em->createQuery($dql)
->setFirstResult($start)
->setMaxResults($results);
$paginator = new Paginator($query);
$cnt = count($paginator);
$bc["/"] = $this->app->labels->get('user-title-3');
return $this->render('user/orders.html.twig', [
'bc' => $bc,
'orders' => $paginator, // @todo: добавить order->amount для каждого
'paginator' => new ServicePaginator($request->attributes->get('_route'), $cnt, $results, $start),
'ocount' => $this->_ocount(),
'order_total' => $this->_order_total(),
'discounts' => $this->_discounts(),
'discount' => $this->_discount(),
'nextdiscount' => $this->_nextdiscount(),
'tonextdiscount' => $this->_tonextdiscount(),
]);
}
// История заказов. 1 Заказ
#[Route(path: '/user/order-history/order/last', name: 'user_order_last_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/user/order-history/order/{order_id}', name: 'user_order_cont_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user/order-history/order/last', name: 'user_order_last', priority: 100, requirements: ['_locale' => '%app.langs%'])]
#[Route(path: '/{_locale}/user/order-history/order/{order_id}', name: 'user_order_cont', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function orderCont(CartCart $Cart, Security $security, int $order_id = 0): Response
{
if ($order_id) {
$order = $this->Orders->find($order_id);
} else {
$order = $this->Orders->getLastOrder($security->getUser()->getId());
}
if (!$order) {
return $this->redirectToRoute('user_orders');
}
$delivery = $this->Deliveries->find((int) $order->getDelivery());
$subdelivery = $this->Subdeliveries->find((int) $order->getSubdelivery());
$esystem = $this->Esystems->find((int) $order->getEsystem());
$cart = $Cart->getFromOrder($order->getId());
$bc["/"] = $this->app->labels->get('user-title-3');
$bc["/asdf/"] = $this->app->labels->get('user-title-4') . $order->getId();
return $this->render('user/order.html.twig', [
'bc' => $bc,
'order' => $order,
'delivery' => $delivery,
'subdelivery' => $subdelivery,
'esystem' => $esystem,
// шаблон не доделал, там огромное кол-во разных переменных, их нужно сначала сформировать
//'cart' => $Cart,
'prods' => $cart,
'ocount' => $this->_ocount(),
'order_total' => $this->_order_total(),
'discounts' => $this->_discounts(),
'discount' => $this->_discount(),
'nextdiscount' => $this->_nextdiscount(),
'tonextdiscount' => $this->_tonextdiscount(),
]);
}
// Изменить профиль пользователя
#[Route(path: '/user/profile', name: 'user_profile_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user/profile', name: 'user_profile', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function userProfile(Request $request): Response
{
/** @var \App\Entity\User $user */
$user = $this->getUser();
if ($request->get("submit")) {
$country = (string) $request->get('country');
$city = (string) $request->get('city');
$address = (string) $request->get('address');
$name = (string) $request->get('name');
$surname = (string) $request->get('surname');
$phone = (string) $request->get('phone');
$User = $this->Users->find((int) $user->getId());
$User->setCountry($country);
$User->setCity($city);
$User->setAddress($address);
$User->setName($name);
$User->setSurname($surname);
$User->setPhone($phone);
if ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX)) {
$company_nip = (string) $request->get('company_nip');
$company_name = (string) $request->get('company_name');
$company_index = (string) $request->get('company_index');
$company_city = (string) $request->get('company_city');
$company_street = (string) $request->get('company_street');
$company_house = (string) $request->get('company_house');
$company_flat = (string) $request->get('company_flat');
$User->setCompanyNip($company_nip);
$User->setCompanyName($company_name);
$User->setCompanyIndex($company_index);
$User->setCompanyCity($company_city);
$User->setCompanyStreet($company_street);
$User->setCompanyHouse($company_house);
$User->setCompanyFlat($company_flat);
}
$this->em->flush();
return $this->redirectToRoute('user_profile', ['changed' => 1]);
} else {
$bc["/"] = $this->app->labels->get('user-title-6');
return $this->render('user/profile.html.twig', [
'user' => $user,
'bc' => $bc,
'ocount' => $this->_ocount(),
'order_total' => $this->_order_total(),
'discounts' => $this->_discounts(),
'discount' => $this->_discount(),
'nextdiscount' => $this->_nextdiscount(),
'tonextdiscount' => $this->_tonextdiscount(),
]);
}
}
// Сменить пароль
#[Route(path: '/user/change-pass', name: 'user_change_pass_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user/change-pass', name: 'user_change_pass', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function changePassword(Request $request): Response
{
/** @var \App\Entity\User $user */
$user = $this->getUser();
if ($request->get("submit")) {
$User = $this->Users->find((int) $user->getId());
$User->setPassword($request->get('pass'));
$this->em->flush();
return $this->redirectToRoute('user');
} else {
$bc["/"] = $this->app->labels->get('user-title-7');
return $this->render('user/change-password.html.twig', [
'user' => $user,
'bc' => $bc,
'ocount' => $this->_ocount(),
'order_total' => $this->_order_total(),
'discounts' => $this->_discounts(),
'discount' => $this->_discount(),
'nextdiscount' => $this->_nextdiscount(),
'tonextdiscount' => $this->_tonextdiscount(),
]);
}
}
// Сменить пароль
#[Route(path: '/user/logoff', name: 'user_logoff_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/user/logoff', name: 'user_logoff', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function logoff(Request $request): Response
{
return $this->redirectToRoute('home');
}
#[Route(path: '/user/unlink/facebook', name: 'user_facebook_unlink', priority: 100)]
public function unlinkFacebook(Request $request): Response
{
$user = $this->Users->find($this->Auth->getUserId());
$user->setFacebookId('');
$this->em->flush();
return $this->redirectToRoute('user');
}
#[Route(path: '/user/unlink/google', name: 'user_google_unlink', priority: 100)]
public function unlinkGoogle(Request $request): Response
{
$user = $this->Users->find($this->Auth->getUserId());
$user->setGoogleId('');
$this->em->flush();
return $this->redirectToRoute('user');
}
private function _ocount(): array
{
/** @var \App\Entity\Order[] $orders */
$orders = $this->Orders->findBy(['user' => $this->Auth->getUserId()]);
//Order->getall(array("where" => "user = '".Db::nq(Auth::getUserId())."'", "order" => "tstamp desc"));
$ocount = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
foreach ($orders as $order) {
$ocount[$order->getStatus()]++;
}
return $ocount;
}
private function _order_total(): float
{
$this->order_total = $this->ModelOrder->total($this->Auth->getUserId());
return $this->order_total;
}
private function _discounts()
{
return $this->Discounts->findAll();
}
private function _discount()
{
return $this->UserDiscount->getnakop($this->order_total);
}
private function _nextdiscount()
{
return $this->UserDiscount->nextdiscount($this->order_total);
}
private function _tonextdiscount()
{
return $this->UserDiscount->tonextdiscount($this->order_total);
}
}