src/Controller/shop/ProductController.php line 704

  1. <?php
  2. namespace App\Controller\shop;
  3. use App\Classes\AppConfig;
  4. use App\Classes\Data\OrderPaymentData;
  5. use App\Classes\Data\OrderStatusData;
  6. use App\Classes\Data\StatusData;
  7. use App\Entity\Category;
  8. use App\Entity\Code;
  9. use App\Entity\Comment;
  10. use App\Entity\Order;
  11. use App\Entity\OrderProduct;
  12. use App\Entity\Product;
  13. use App\Entity\User;
  14. use App\Entity\Visit;
  15. use App\Form\OrderFormCustomerType;
  16. use DateTimeImmutable;
  17. use App\Service\MailService;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Doctrine\Persistence\ManagerRegistry;
  20. use Knp\Snappy\Pdf;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\Asset\Packages;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\RedirectResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  30. use Symfony\Component\Routing\RouterInterface;
  31. #[Route('products')]
  32. class ProductController extends AbstractController {
  33.   private $knpSnappyPdf;
  34.   public function __construct(private readonly ManagerRegistry $em, private readonly UrlGeneratorInterface $routerPdf $knpSnappyPdf) {
  35.     $this->knpSnappyPdf $knpSnappyPdf;
  36.   }
  37.   #[Route('/cart'name'app_cart')]
  38.   public function cartList(SessionInterface $session): Response {
  39.     if ($this->isGranted('ROLE_USER')) {
  40.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  41.         return $this->redirect($this->generateUrl('app_home'));
  42.       }
  43.     }
  44.     $args = [];
  45.     if ($session->has('basket')) {
  46.       $productsBasket $session->get('basket');
  47.       $productDatas = [];
  48.       $korisnik $this->getUser();
  49.       $ukupanPdv 0;
  50.       $totalPdv 0;
  51.       $ukupnoProizvoda 0;
  52.       //test
  53.       $dostava 0;
  54.       foreach ($productsBasket as $product) {
  55.         $productData $this->em->getRepository(Product::class)->find(intval($product['pid']));
  56.         $porez $productData->getVat();
  57.         $popust $productData->isDiscount();
  58.         $pdv = ($productData->getPricePDV() * ($porez 100)) * $product['qty'];
  59.         $ukupnaCenaDinKrajnja $productData->getPricePDV() * $product['qty'];
  60.         $ukupanPdv $ukupanPdv $pdv;
  61.         $totalPdv $totalPdv $ukupnaCenaDinKrajnja;
  62.         $ukupnoProizvoda $ukupnoProizvoda $product['qty'];
  63.         $productDatas[] = [
  64.           'pid' => $product['pid'],
  65.           'qty' => $product['qty'],
  66.           'product' => $productData,
  67.           'cenaKomad' => $productData->getPricePDV(),
  68. //          'ukupnaCenaDin' => $ukupnaCenaDin,
  69. //          'ukupnaCenaDinOsnovna' => $ukupnaCenaDinOsnovna,
  70. //          'ukupnaCenaDinPopust' => $ukupnaCenaDinPopust,
  71.           'ukupnaCenaDinKrajnja' => $ukupnaCenaDinKrajnja,
  72.           'porez' => $porez,
  73.           'popust' => $popust,
  74.         ];
  75.       }
  76.       $args['basket'] = $productDatas;
  77.       $args['ukupanPorez'] = $ukupanPdv;
  78.       $args['ukupnoPdv'] = $totalPdv;
  79.       $args['ukupnoProizvoda'] = $ukupnoProizvoda;
  80.       $args['dostava'] = $dostava;
  81.       if ($session->has('basketCheckout')) {
  82.         $session->remove('basketCheckout');
  83.       }
  84.       $session->set('basketCheckout'$productDatas);
  85.       if ($session->has('basketUkupnoPorez')) {
  86.         $session->remove('basketUkupnoPorez');
  87.       }
  88.       $session->set('basketUkupnoPorez'$ukupanPdv);
  89.       if ($session->has('basketUkupnoPdv')) {
  90.         $session->remove('basketUkupnoPdv');
  91.       }
  92.       $session->set('basketUkupnoPdv'$totalPdv);
  93.       if ($session->has('ukupnoProizvoda')) {
  94.         $session->remove('ukupnoProizvoda');
  95.       }
  96.       $session->set('ukupnoProizvoda'$ukupnoProizvoda);
  97.       if ($session->has('dostava')) {
  98.         $session->remove('dostava');
  99.       }
  100.       $session->set('dostava'$dostava);
  101.       return $this->render('front/product/korpa.html.twig'$args);
  102.     }
  103.     return $this->render('front/product/korpa.html.twig'$args);
  104.   }
  105.   #[Route('/cart-code'name'app_cart_code')]
  106.   public function basketCode(Request $request): JsonResponse {
  107.     $code $request->query->get('code');
  108.     $promoCode $this->em->getRepository(Code::class)->findOneBy(['title' => $code'isSuspended' => false]);
  109.     if ($promoCode) {
  110.       return new JsonResponse(['success' => true'discount' => $promoCode->getValue(), 'name' => $promoCode->getTitle()]);
  111.     } else {
  112.       return new JsonResponse(['success' => false'message' => 'Kod je neispravan ili je istekao.']);
  113.     }
  114.   }
  115.   #[Route('/cart-add'name'app_cart_add')]
  116.   public function basketAdd(Request $requestSessionInterface $session): RedirectResponse|JsonResponse {
  117.     if ($this->isGranted('ROLE_USER')) {
  118.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  119.         return $this->redirect($this->generateUrl('app_home'));
  120.       }
  121.     }
  122.     $proizvod $session->get('basket', []);
  123.     $pid $request->get('pid');
  124.     $qty = (int)$request->get('quantity'1);
  125.     foreach ($proizvod as $product) {
  126.       if ($product['pid'] == $pid) {
  127.         return new JsonResponse(['status' => 'error''message' => 'Proizvod već postoji u korpi!']);
  128.       }
  129.     }
  130.     $proizvod[] = ['pid' => $pid'qty' => $qty];
  131.     $session->set('basket'$proizvod);
  132.     // Calculate total items in the basket
  133.     $totalItems array_reduce($proizvod, function ($carry$item) {
  134.       return $carry $item['qty'];
  135.     }, 0);
  136.     return new JsonResponse(['status' => 'success''message' => 'Proizvod je uspešno dodat!''totalItems' => $totalItems]);
  137.   }
  138.   #[Route('/cart-count'name'app_cart_count')]
  139.   public function showCart(SessionInterface $session): JsonResponse {
  140.     $proizvod $session->get('basket', []);
  141.     $totalItems array_sum(array_column($proizvod'qty'));
  142.     return new JsonResponse(['totalItems' => $totalItems]);
  143.   }
  144.   #[Route('/cart-delete/{id}'name'app_cart_delete')]
  145.   public function basketDelete(int $idSessionInterface $session): Response {
  146.     if ($this->isGranted('ROLE_USER')) {
  147.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  148.         return $this->redirect($this->generateUrl('app_home'));
  149.       }
  150.     }
  151.     if ($session->has('basket')) {
  152.       $proizvod $session->get('basket');
  153.       foreach ($proizvod as $i => $product) {
  154.         if ($product['pid'] == $id) {
  155.           array_splice($proizvod$i1);
  156.           $session->set('basket'$proizvod);
  157.           return $this->redirectToRoute('app_cart');
  158.         }
  159.       }
  160.     }
  161.     return $this->redirectToRoute('app_cart');
  162.   }
  163.   #[Route('/cart-recalculate'name'app_cart_recalculate')]
  164.   public function basketPreracunRequest $requestSessionInterface $session): RedirectResponse|bool {
  165.     if ($this->isGranted('ROLE_USER')) {
  166.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  167.         return $this->redirect($this->generateUrl('app_home'));
  168.       }
  169.     }
  170.     if ($session->has('basket')) {
  171.       $data $request->request->all();
  172.       $session->remove('basket');
  173.       $proizvod = [];
  174.       foreach ($data as $pid => $qty) {
  175.         if (substr($pid05) == 'pQty_') {
  176.           $pid substr($pid5);
  177.           if ($qty != 0) {
  178.             $proizvod[] = ['pid' => $pid'qty' => $qty];
  179.           }
  180.         } else {
  181.           break;
  182.         }
  183.       }
  184.       $session->set('basket'$proizvod);
  185.       return $this->redirectToRoute('app_cart');
  186.     }
  187.     return false;
  188.   }
  189.   #[Route('/kasa'name'app_cart_kasa')]
  190.   public function checkout(Request $requestSessionInterface $sessionMailService $mailService): Response {
  191.     if ($this->isGranted('ROLE_USER')) {
  192.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  193.         return $this->redirect($this->generateUrl('app_home'));
  194.       }
  195.     }
  196.     if (!$session->has('ukupnoProizvoda')) {
  197.       return $this->redirect($this->generateUrl('app_shop_home'));
  198.     }
  199. //    $okUrl = $this->generateUrl('app_shop_home', [], UrlGeneratorInterface::ABSOLUTE_URL);
  200. //
  201. //    // Generisanje URL-a za neuspešan odgovor sa dodatnim parametrima
  202. //    $failUrl = $this->generateUrl('app_kontakt', ['OrderId' => 489], UrlGeneratorInterface::ABSOLUTE_URL);
  203. //
  204.     $args = [];
  205.     $order = new Order();
  206.     $korisnik $this->getUser();
  207.     if (!is_null($korisnik)) {
  208.       $order->setCreatedBy($korisnik);
  209.       $order->setMember($korisnik);
  210.       $order->setIme($korisnik->getIme());
  211.       $order->setPrezime($korisnik->getPrezime());
  212.       $order->setAdresa($korisnik->getAdresa());
  213.       $order->setGrad($korisnik->getGrad());
  214.       $order->setTelefon1($korisnik->getTelefon1());
  215.       $order->setEmail($korisnik->getEmail());
  216.     }
  217.     //test
  218.     $args['dostava'] = 0;
  219. //    $args['procenatPoreza'] = 20;
  220.     //
  221. //    $args['basket'] = $session->get('basketCheckout');
  222. //    $args['ukupnaCena'] = $session->get('basketUkupno');
  223. //    $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv') + $args['dostava'];
  224. //    $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
  225.     $args['basket'] = $session->get('basketCheckout');
  226.     $args['ukupnoPorez'] = $session->get('basketUkupnoPorez');
  227.     $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');
  228.     $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
  229.     $order->setPriceTotalPDV($args['ukupnaCenaPdv'] + $args['dostava']);
  230.     $order->setPriceTotal($args['ukupnaCenaPdv']);
  231.     $form $this->createForm(OrderFormCustomerType::class, $order, ['action' => $this->generateUrl('app_cart_kasa'), 'method' => 'post']);
  232.     if ($request->isMethod('POST')) {
  233.       $form->handleRequest($request);
  234.       if ($form->isSubmitted() && $form->isValid()) {
  235.         foreach ($session->get('basketCheckout') as $product) {
  236.           $orderProduct = new OrderProduct();
  237.           $dbProduct $this->em->getRepository(Product::class)->find($product['pid']);
  238.           $orderProduct->setProduct($dbProduct);
  239.           $orderProduct->setTitle($dbProduct->getTitle());
  240.           $orderProduct->setKolicina($product['qty']);
  241.           $orderProduct->setPricePDV($product['cenaKomad']);
  242.           $orderProduct->setPriceTotalPDV($product['ukupnaCenaDinKrajnja']);
  243.           $orderProduct->setSku($dbProduct->getSku());
  244.           $order->addProduct($orderProduct);
  245.         }
  246.         $order->setPriceTotalWithoutDelivery($order->getPriceTotalPDV() - $order->getPriceDelivery());
  247.         $order->setStatus(OrderStatusData::PENDING);
  248.         if (!is_null($request->request->get('diler'))) {
  249.           $order->setIsDiler(true);
  250.           $order->setStatus(OrderStatusData::PROFAKTURA);
  251.         }
  252.         $this->em->getRepository(Order::class)->generateOrderKey($order);
  253.         $order $this->em->getRepository(Order::class)->save($order$this->getUser());
  254.         if ($session->has('basketCheckout')) {
  255.           $session->remove('basketCheckout');
  256.         }
  257.         if ($session->has('basketUkupnoPorez')) {
  258.           $session->remove('basketUkupnoPorez');
  259.         }
  260.         if ($session->has('basketUkupnoPdv')) {
  261.           $session->remove('basketUkupnoPdv');
  262.         }
  263.         if ($session->has('basket')) {
  264.           $session->remove('basket');
  265.         }
  266.         if ($session->has('dostava')) {
  267.           $session->remove('dostava');
  268.         }
  269.         if ($session->has('ukupnoProizvoda')) {
  270.           $session->remove('ukupnoProizvoda');
  271.         }
  272.         if ($order->getPlacanje() == OrderPaymentData::ONLINE) {
  273.           $orgOid $order->getOrderKey();
  274.           $orgAmount number_format($order->getPriceTotalPDV() , 2'.''');
  275.           $orgOkUrl "https://pcboomboom.rs/products/order-success";
  276.           $orgFailUrl "https://pcboomboom.rs/products/order-fail";
  277.           $orgShopUrl "https://pcboomboom.rs";
  278.           $orgRnd microtime();
  279.           $clientId str_replace("|""\\|"str_replace("\\""\\\\"AppConfig::CLIENT_ID));
  280.           $oid str_replace("|""\\|"str_replace("\\""\\\\"$orgOid));
  281.           $amount str_replace("|""\\|"str_replace("\\""\\\\"$orgAmount));
  282.           $shopUrl str_replace("|""\\|"str_replace("\\""\\\\"$orgShopUrl));
  283.           $okUrl str_replace("|""\\|"str_replace("\\""\\\\"$orgOkUrl));
  284.           $failUrl str_replace("|""\\|"str_replace("\\""\\\\"$orgFailUrl));
  285.           $transactionType str_replace("|""\\|"str_replace("\\""\\\\"AppConfig::AUTH_TYPE));
  286.           $installment str_replace("|""\\|"str_replace("\\""\\\\"AppConfig::INSTALLMENT_NO));
  287.           $rnd str_replace(["|""\\""."" "], ["\\|""\\\\"""""], $orgRnd);
  288.           $currency str_replace("|""\\|"str_replace("\\""\\\\"AppConfig::STORE_CURRENCY));
  289.           $storeKey str_replace("|""\\|"str_replace("\\""\\\\"AppConfig::STORE_KEY));
  290.           $plainText $clientId "|" $oid "|" $amount "|" $okUrl "|" $failUrl "|" $transactionType "|" $installment "|" $rnd "||||" $currency "|" $storeKey;
  291.           $hashValue hash('sha512'$plainText);
  292.           $hash base64_encode (pack('H*',$hashValue));
  293.           $args['clientId'] = $clientId// Vaš Merchant ID
  294.           $args['oid'] = $oid// Jedinstveni ID porudžbine
  295.           $args['amount'] = $amount// Iznos plaćanja
  296.           $args['okUrl'] = $okUrl;
  297.           $args['failUrl'] = $failUrl;
  298.           $args['tranType'] = $transactionType;
  299.           $args['instalment'] = $installment;
  300.           $args['rnd'] = $rnd// Generišite nasumičan string
  301.           $args['currency'] = $currency// Valuta
  302.           $args['storeKey'] = $storeKey;
  303.           $args['hash'] = $hash;
  304.           $args['storetype'] = AppConfig::STORE_TYPE;
  305.           $args['hashAlgorithm'] = AppConfig::ALGORITHM;
  306.           $args['lang'] = AppConfig::LANGUAGE;
  307.           $args['shopUrl'] = $orgShopUrl;
  308.           return $this->render('front/product/payment.html.twig'$args);
  309.         }
  310.         $mailService->order($order);
  311.         $args['order'] = $order;
  312.         if ($order->isDiler()) {
  313.           return $this->render('front/product/success_offer.html.twig'$args);
  314.         }
  315.         return $this->render('front/product/success.html.twig'$args);
  316.       }
  317.     }
  318.     $args['form'] = $form->createView();
  319.     return $this->render('front/product/kasa.html.twig'$args);
  320.   }
  321.   #[Route('/add-comment/{id}'name'app_comment_add')]
  322. //  #[Entity('comment', expr: 'repository.findForForm(id)')]
  323. //  #[Security("is_granted('USER_EDIT', usr)", message: 'Nemas pristup', statusCode: 403)]
  324.   public function formComment(Request $requestProduct $product): Response {
  325.     if ($this->isGranted('ROLE_USER')) {
  326.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  327.         return $this->redirect($this->generateUrl('app_home'));
  328.       }
  329.     }
  330.     if ($request->isMethod('POST')) {
  331.       $lastComment $this->em->getRepository(Comment::class)->getOneByUser($request->request->get('member'));
  332.       if (!is_null($lastComment)) {
  333.         $now = new DateTimeImmutable();
  334.         $commentTime $lastComment['created'];
  335.         $interval $now->diff($commentTime);
  336.         if ($interval->== && $interval->30) {
  337.           return new JsonResponse(['status' => 'error''message' => 'Poslednji komentar je ostavljen pre manje od pola sata. Molimo sačekajte pola sata pre nego što ostavite novi komentar.']);
  338.         }
  339.       }
  340.       $komentar = new Comment();
  341.       $komentar->setProduct($product);
  342.       $komentar->setCreatedBy($this->em->getRepository(User::class)->find($request->request->get('member')));
  343.       $komentar->setComment($request->request->get('comment'));
  344.       $komentar->setOcena($request->request->get('rating'));
  345.       $komentar->setStatus(0);
  346.       $this->em->getRepository(Comment::class)->save($komentar);
  347.       return new JsonResponse(['status' => 'success''message' => 'Komentar je uspešno dodat. Biće objavljen nakon verifikacije administratora.']);
  348.     }
  349.     return new JsonResponse(['status' => 'error''message' => 'Došlo je do greške.']);
  350.   }
  351.   #[Route('/favorite-add'name'app_favorite_add')]
  352.   public function favoriteAdd(Request $request): RedirectResponse|JsonResponse {
  353.     if ($this->isGranted('ROLE_USER')) {
  354.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  355.         return $this->redirect($this->generateUrl('app_home'));
  356.       }
  357.     }
  358.     $pid $request->get('product_id');
  359.     $product $this->em->getRepository(Product::class)->find((int)$pid);
  360.     $user $this->getUser();
  361.     $favoriti $user->getFavorite();
  362.     if ($favoriti->contains($product)) {
  363.       // Proizvod je u kolekciji omiljenih
  364.       return new JsonResponse(['status' => 'error''message' => 'Proizvod već postoji u Vašoj listi želja.']);
  365.     } else {
  366.       $user->addFavorite($product);
  367.       $user $this->em->getRepository(User::class)->save($user);
  368.       $count $user->getFavorite()->count();
  369.       return new JsonResponse(['status' => 'success''totalFavorites' => $count'message' => 'Proizvod je uspešno dodat u Vašu listu favorita.']);
  370.     }
  371.   }
  372.   #[Route('/favorite-remove/{id}'name'app_favorite_remove')]
  373.   public function favoriteRemove(Product $productRequest $request): Response {
  374.     if ($this->isGranted('ROLE_USER')) {
  375.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  376.         return $this->redirect($this->generateUrl('app_home'));
  377.       }
  378.     }
  379.     $user $this->getUser();
  380.     $user->removeFavorite($product);
  381.     $user $this->em->getRepository(User::class)->save($user);
  382.     return $this->redirectToRoute('app_profile_view');
  383.   }
  384.   #[Route('/favorite-count'name'app_favorite_count')]
  385.   public function showFavorite(): JsonResponse {
  386.     $count $this->getUser()->getFavorite()->count();
  387.     return new JsonResponse(['totalFavorites' => $count]);
  388.   }
  389.   #[Route('/order-success'name'app_order_success')]
  390.   public function success(Request $requestMailService $mailService): Response {
  391.     if ($this->isGranted('ROLE_USER')) {
  392.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  393.         return $this->redirect($this->generateUrl('app_home'));
  394.       }
  395.     }
  396.     $args = [];
  397.     $oid $request->request->get('oid');
  398.     $order $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);
  399. //    $order = $this->em->getRepository(Order::class)->find(37);
  400.     if (!is_null($request->request->get('TransId'))) {
  401.       $transId $request->request->get('TransId');
  402.       $order->setTransId($transId);
  403.     }
  404.     if (!is_null($request->request->get('AuthCode'))) {
  405.       $authCode $request->request->get('AuthCode');
  406.       $order->setAuthCode($authCode);
  407.     }
  408.     if (!is_null($request->request->get('ProcReturnCode'))) {
  409.       $prCode $request->request->get('ProcReturnCode');
  410.       $order->setPrCode($prCode);
  411.     }
  412.     if (!is_null($request->request->get('clientIp'))) {
  413.       $clientIp $request->request->get('clientIp');
  414.       $order->setClientIp($clientIp);
  415.     }
  416.     if (!is_null($request->request->get('instalment'))) {
  417.       $installment $request->request->get('instalment');
  418.       $order->setInstallment($installment);
  419.     }
  420.     if (!is_null($request->request->get('Response'))) {
  421.       $responseTrans $request->request->get('Response');
  422.       $order->setResponse($responseTrans);
  423.     }
  424.     if (!is_null($request->request->get('EXTRA_TRXDATE'))) {
  425.       $transDate $request->request->get('EXTRA_TRXDATE');
  426.       $order->setTransDate($transDate);
  427.     }
  428.     if (!is_null($request->request->get('mdStatus'))) {
  429.       $mdStatus $request->request->get('mdStatus');
  430.       $order->setMdStatus($mdStatus);
  431.     }
  432.     $order $this->em->getRepository(Order::class)->savePayment($order);
  433.     $mailService->order($order);
  434.     $args['order'] = $order;
  435.     return $this->render('front/product/success.html.twig'$args);
  436.   }
  437.   #[Route('/order-fail'name'app_order_fail')]
  438.   public function fail(Request $requestMailService $mailService): Response {
  439.     if ($this->isGranted('ROLE_USER')) {
  440.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  441.         return $this->redirect($this->generateUrl('app_home'));
  442.       }
  443.     }
  444.     $args = [];
  445.     $oid $request->request->get('oid');
  446.     $order $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);
  447.     if (!is_null($request->request->get('TransId'))) {
  448.       $transId $request->request->get('TransId');
  449.       $order->setTransId($transId);
  450.     }
  451.     if (!is_null($request->request->get('AuthCode'))) {
  452.       $authCode $request->request->get('AuthCode');
  453.       $order->setAuthCode($authCode);
  454.     }
  455.     if (!is_null($request->request->get('ProcReturnCode'))) {
  456.       $prCode $request->request->get('ProcReturnCode');
  457.       $order->setPrCode($prCode);
  458.     }
  459.     if (!is_null($request->request->get('clientIp'))) {
  460.       $clientIp $request->request->get('clientIp');
  461.       $order->setClientIp($clientIp);
  462.     }
  463.     if (!is_null($request->request->get('instalment'))) {
  464.       $installment $request->request->get('instalment');
  465.       $order->setInstallment($installment);
  466.     }
  467.     if (!is_null($request->request->get('Response'))) {
  468.       $responseTrans $request->request->get('Response');
  469.       $order->setResponse($responseTrans);
  470.     }
  471.     if (!is_null($request->request->get('EXTRA_TRXDATE'))) {
  472.       $transDate $request->request->get('EXTRA_TRXDATE');
  473.       $order->setTransDate($transDate);
  474.     }
  475.     if (!is_null($request->request->get('mdStatus'))) {
  476.       $mdStatus $request->request->get('mdStatus');
  477.       $order->setMdStatus($mdStatus);
  478.     }
  479.     $order $this->em->getRepository(Order::class)->savePayment($order);
  480.     $mailService->orderFail($order);
  481.     $args['order'] = $order;
  482.     return $this->render('front/product/fail.html.twig'$args);
  483.   }
  484.   #[Route('/export-pdf-product/{id}'name'app_product_pdf')]
  485. //  #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
  486.   public function pdfProduct(Product $productRequest $request,)    : Response {
  487.     $args['product'] = $product;
  488.     $args['category'] = $product->getCategory();
  489.     $html $this->renderView('front/product/pdf.html.twig'$args);
  490.     $pdfContent $this->knpSnappyPdf->getOutputFromHtml($html);
  491.     return new Response($pdfContent200, [
  492.       'Content-Type' => 'application/pdf',
  493.       'Content-Disposition' => 'inline; filename="order_' $product->getSku() . '.pdf"',
  494.     ]);
  495.   }
  496.   #[Route('/export-pdf/{id}'name'app_offer_pdf')]
  497. //  #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
  498.   public function pdf(Order $orderRequest $request)    : Response {
  499.     if ($this->isGranted('ROLE_USER')) {
  500.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  501.         return $this->redirect($this->generateUrl('app_home'));
  502.       }
  503.     }
  504.     $args['order'] = $order;
  505.     $products $order->getProduct();
  506.     $kolicina 0;
  507.     foreach ($products as $prod) {
  508.       $kolicina $kolicina $prod->getKolicina();
  509.     }
  510.     $args['noProducts'] = $kolicina;
  511.     $args['statusi'] = OrderStatusData::STATUS;
  512.     $html $this->renderView('order/pdf.html.twig'$args);
  513.     $pdfContent $this->knpSnappyPdf->getOutputFromHtml($html);
  514.     return new Response($pdfContent200, [
  515.       'Content-Type' => 'application/pdf',
  516.       'Content-Disposition' => 'inline; filename="order_' $order->getOrderKey() . '.pdf"',
  517.     ]);
  518.   }
  519.   #[Route('/export-pdf-korpa/'name'app_offer_pdf_korpa')]
  520. //  #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
  521.   public function pdfKorpa(SessionInterface $sessionRequest $request): Response {
  522.     $args['type'] = $request->query->get('type');
  523.     $args['basket'] = $session->get('basketCheckout');
  524.     $args['ukupnoPorez'] = $session->get('basketUkupnoPorez');
  525.     $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');
  526.     $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
  527.     $html $this->renderView('order/korpa_pdf.html.twig'$args);
  528.     $pdfContent $this->knpSnappyPdf->getOutputFromHtml($html);
  529.     return new Response($pdfContent200, [
  530.       'Content-Type' => 'application/pdf',
  531.       'Content-Disposition' => 'attachment; filename="offer_' date('Y-m-d_H-i-s') . '.pdf"',
  532.     ]);
  533.   }
  534.   #[Route('/get-users-ajax-search-products'name'app_ajax_search')]
  535.   public function getProducts(Request $requestEntityManagerInterface $emPackages $assetsManager,RouterInterface $router): JsonResponse {
  536.     $term $request->query->get('q''');
  537.     $products $em->getRepository(Product::class)->searchByTerm($term);
  538.     $results = [];
  539.     foreach ($products as $product) {
  540.       $results[] = [
  541.         'id' => $product['id'],
  542.         'text' => $product['title'],
  543.         'pricePDV' => $product['pricePDV'],
  544.         'link' => $router->generate('app_shop_product_view', ['id' => $product['id']]),
  545.         'slika' => $assetsManager->getUrl($product['thumbnail100'])
  546.       ];
  547.     }
  548.     return new JsonResponse(['results' => $results]);
  549.   }
  550.   #[Route('/products-category-random/{id}'name'app_products_category_random')]
  551.   public function productsCategory(Category $category): Response {
  552.     $args = [];
  553.     $args['randomProducts'] = $this->em->getRepository(Product::class)->searchByCategory($category);
  554.     return $this->render('front/include/products_category.html.twig'$args);
  555.   }
  556.   #[Route('/view/{id}'name'app_shop_product_view')]
  557. //  #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
  558.   public function view(Product $productSessionInterface $session): Response {
  559.     if ($this->isGranted('ROLE_USER')) {
  560.       if (!$this->isGranted('ROLE_EMPLOYEE')) {
  561.         return $this->redirect($this->generateUrl('app_home'));
  562.       }
  563.     }
  564.     if ($product->getPricePDV() == || $product->isSuspended()) {
  565.       return $this->redirect($this->generateUrl('app_shop_home'));
  566.     }
  567.     $args['product'] = $product;
  568.     $args['category'] = $product->getCategory();
  569.     $args['productComments'] = $this->em->getRepository(Comment::class)->findBy(['product' => $product'status' => StatusData::PRIHVACEN]);
  570.     $args['noActiveComments'] = $this->em->getRepository(Comment::class)->count(['product' => $product'status' => StatusData::PRIHVACEN]);
  571.     $args['stars'] = $this->em->getRepository(Comment::class)->getStars($product->getId());
  572.     $visit $product->getVisits()->first();
  573.     $visit->setVisit($visit->getVisit() + 1);
  574.     $visit $this->em->getRepository(Visit::class)->save($visit);
  575.     $args['visits'] = $visit->getVisit();
  576.     return $this->render('front/product/view.html.twig'$args);
  577.   }
  578. }