src/Controller/shop/ProductController.php line 794
<?phpnamespace App\Controller\shop;use App\Classes\AppConfig;use App\Classes\Data\OrderPaymentData;use App\Classes\Data\OrderStatusData;use App\Classes\Data\StatusData;use App\Entity\Category;use App\Entity\City;use App\Entity\Code;use App\Entity\Comment;use App\Entity\Image;use App\Entity\Order;use App\Entity\OrderProduct;use App\Entity\Ponuda;use App\Entity\Product;use App\Entity\User;use App\Entity\Visit;use App\Form\OrderFormCustomerType;use App\Service\UploadService;use DateTimeImmutable;use App\Service\MailService;use Doctrine\ORM\EntityManagerInterface;use Doctrine\Persistence\ManagerRegistry;use Knp\Snappy\Pdf;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\Asset\Packages;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\HttpFoundation\Session\SessionInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Routing\RouterInterface;#[Route('products')]class ProductController extends AbstractController {private $knpSnappyPdf;public function __construct(private readonly ManagerRegistry $em, private readonly UrlGeneratorInterface $router, Pdf $knpSnappyPdf) {$this->knpSnappyPdf = $knpSnappyPdf;}#[Route('/cart', name: 'app_cart')]public function cartList(SessionInterface $session): Response {// if ($session->has('basketCheckout')) {// $session->remove('basketCheckout');// }// if ($session->has('basketUkupnoPorez')) {// $session->remove('basketUkupnoPorez');// }// if ($session->has('basketUkupnoPdv')) {// $session->remove('basketUkupnoPdv');// }// if ($session->has('basket')) {// $session->remove('basket');// }// if ($session->has('dostava')) {// $session->remove('dostava');// }// if ($session->has('ukupnoProizvoda')) {// $session->remove('ukupnoProizvoda');// }if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$args = [];if ($session->has('basket')) {$productsBasket = $session->get('basket');$productDatas = [];$korisnik = $this->getUser();$ukupanPdv = 0;$totalPdv = 0;$ukupnoProizvoda = 0;//test$dostava = 0;foreach ($productsBasket as $product) {$productData = $this->em->getRepository(Product::class)->find(intval($product['pid']));$porez = $productData->getVat();$popust = $productData->isDiscount();$pdv = ($productData->getPricePDV() * ($porez / 100)) * $product['qty'];$ukupnaCenaDinKrajnja = $productData->getPricePDV() * $product['qty'];$ukupanPdv = $ukupanPdv + $pdv;$totalPdv = $totalPdv + $ukupnaCenaDinKrajnja;$ukupnoProizvoda = $ukupnoProizvoda + $product['qty'];$productDatas[] = ['pid' => $product['pid'],'qty' => $product['qty'],'product' => $productData,'cenaKomad' => $productData->getPricePDV(),// 'ukupnaCenaDin' => $ukupnaCenaDin,// 'ukupnaCenaDinOsnovna' => $ukupnaCenaDinOsnovna,// 'ukupnaCenaDinPopust' => $ukupnaCenaDinPopust,'ukupnaCenaDinKrajnja' => $ukupnaCenaDinKrajnja,'porez' => $porez,'popust' => $popust,'slika' => $productData->getMainImage()->getThumbnail100(),];}$args['basket'] = $productDatas;$args['ukupanPorez'] = $ukupanPdv;$args['ukupnoPdv'] = $totalPdv;$args['ukupnoProizvoda'] = $ukupnoProizvoda;$args['dostava'] = $dostava;if ($session->has('basketCheckout')) {$session->remove('basketCheckout');}$session->set('basketCheckout', $productDatas);if ($session->has('basketUkupnoPorez')) {$session->remove('basketUkupnoPorez');}$session->set('basketUkupnoPorez', $ukupanPdv);if ($session->has('basketUkupnoPdv')) {$session->remove('basketUkupnoPdv');}$session->set('basketUkupnoPdv', $totalPdv);if ($session->has('ukupnoProizvoda')) {$session->remove('ukupnoProizvoda');}$session->set('ukupnoProizvoda', $ukupnoProizvoda);if ($session->has('dostava')) {$session->remove('dostava');}$session->set('dostava', $dostava);return $this->render('front/product/korpa.html.twig', $args);}return $this->render('front/product/korpa.html.twig', $args);}#[Route('/cart-code', name: 'app_cart_code')]public function basketCode(Request $request): JsonResponse {$code = $request->query->get('code');$promoCode = $this->em->getRepository(Code::class)->findOneBy(['title' => $code, 'isSuspended' => false]);if ($promoCode) {return new JsonResponse(['success' => true, 'discount' => $promoCode->getValue(), 'name' => $promoCode->getTitle()]);} else {return new JsonResponse(['success' => false, 'message' => 'Kod je neispravan ili je istekao.']);}}#[Route('/cart-add', name: 'app_cart_add')]public function basketAdd(Request $request, SessionInterface $session): RedirectResponse|JsonResponse {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$proizvod = $session->get('basket', []);$pid = $request->get('pid');$qty = (int)$request->get('quantity', 1);$found = false;// Prolazak kroz postojeće proizvode da se proveri da li pid već postojiforeach ($proizvod as &$product) { // Koristimo referencu '&' za modifikaciju postojećeg nizaif ($product['pid'] == $pid) {$product['qty'] += $qty; // Uvećaj količinu$found = true;break;}}// Ako proizvod nije pronađen, dodaj ga u korpuif (!$found) {$proizvod[] = ['pid' => $pid, 'qty' => $qty];}// Sačuvaj ažuriranu korpu$session->set('basket', $proizvod);// Izračunaj ukupnu količinu proizvoda u korpi$totalItems = array_reduce($proizvod, function ($carry, $item) {return $carry + $item['qty'];}, 0);return new JsonResponse(['status' => 'success','message' => 'Proizvod je uspešno dodat!','totalItems' => $totalItems]);// $proizvod = $session->get('basket', []);// $pid = $request->get('pid');// $qty = (int)$request->get('quantity', 1);//// foreach ($proizvod as $product) {// if ($product['pid'] == $pid) {// return new JsonResponse(['status' => 'error', 'message' => 'Proizvod već postoji u korpi!']);// }// }//// $proizvod[] = ['pid' => $pid, 'qty' => $qty];// $session->set('basket', $proizvod);//// // Calculate total items in the basket// $totalItems = array_reduce($proizvod, function ($carry, $item) {// return $carry + $item['qty'];// }, 0);//// return new JsonResponse(['status' => 'success', 'message' => 'Proizvod je uspešno dodat!', 'totalItems' => $totalItems]);}#[Route('/cart-count', name: 'app_cart_count')]public function showCart(SessionInterface $session): JsonResponse {$proizvod = $session->get('basket', []);$totalItems = array_sum(array_column($proizvod, 'qty'));return new JsonResponse(['totalItems' => $totalItems]);}#[Route('/cart-delete/{id}', name: 'app_cart_delete')]public function basketDelete(int $id, SessionInterface $session): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}if ($session->has('basket')) {$proizvod = $session->get('basket');foreach ($proizvod as $i => $product) {if ($product['pid'] == $id) {array_splice($proizvod, $i, 1);$session->set('basket', $proizvod);return $this->redirectToRoute('app_cart');}}}return $this->redirectToRoute('app_cart');}#[Route('/cart-recalculate', name: 'app_cart_recalculate')]public function basketPreracun( Request $request, SessionInterface $session): RedirectResponse|bool {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}if ($session->has('basket')) {$data = $request->request->all();if (array_key_exists('pdf', $data)) {unset($data['pdf']);}$session->remove('basket');$proizvod = [];foreach ($data as $pid => $qty) {if (substr($pid, 0, 5) == 'pQty_') {$pid = substr($pid, 5);if ($qty != 0) {$proizvod[] = ['pid' => $pid, 'qty' => $qty];}} else {break;}}$session->set('basket', $proizvod);return $this->redirectToRoute('app_cart');}return false;}#[Route('/kasa', name: 'app_cart_kasa')]public function checkout(Request $request, SessionInterface $session, MailService $mailService): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}if (!$session->has('ukupnoProizvoda')) {return $this->redirect($this->generateUrl('app_shop_home'));}// $okUrl = $this->generateUrl('app_shop_home', [], UrlGeneratorInterface::ABSOLUTE_URL);//// // Generisanje URL-a za neuspešan odgovor sa dodatnim parametrima// $failUrl = $this->generateUrl('app_kontakt', ['OrderId' => 489], UrlGeneratorInterface::ABSOLUTE_URL);//$args = [];$order = new Order();$korisnik = $this->getUser();if (!is_null($korisnik)) {$order->setCreatedBy($korisnik);$order->setMember($korisnik);$order->setIme($korisnik->getIme());$order->setPrezime($korisnik->getPrezime());$order->setAdresa($korisnik->getAdresa());$order->setGrad($korisnik->getGrad());$order->setTelefon1($korisnik->getTelefon1());$order->setEmail($korisnik->getEmail());}//test$args['dostava'] = 0;// $args['procenatPoreza'] = 20;//// $args['basket'] = $session->get('basketCheckout');// $args['ukupnaCena'] = $session->get('basketUkupno');// $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv') + $args['dostava'];// $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');$args['basket'] = $session->get('basketCheckout');$args['ukupnoPorez'] = $session->get('basketUkupnoPorez');$args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');$args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');$order->setPriceTotalPDV($args['ukupnaCenaPdv'] + $args['dostava']);$order->setPriceTotal($args['ukupnaCenaPdv']);$form = $this->createForm(OrderFormCustomerType::class, $order, ['action' => $this->generateUrl('app_cart_kasa'), 'method' => 'post']);if ($request->isMethod('POST')) {$form->handleRequest($request);if ($request->request->get('fake_field') == '' && $request->request->get('dynamic_token') !== null) {if ($form->isSubmitted() && $form->isValid()) {foreach ($session->get('basketCheckout') as $product) {$orderProduct = new OrderProduct();$dbProduct = $this->em->getRepository(Product::class)->find($product['pid']);$orderProduct->setProduct($dbProduct);$orderProduct->setTitle($dbProduct->getTitle());$orderProduct->setKolicina($product['qty']);$orderProduct->setPricePDV($product['cenaKomad']);$orderProduct->setPriceTotalPDV($product['ukupnaCenaDinKrajnja']);$orderProduct->setSku($dbProduct->getSku());$order->addProduct($orderProduct);}$order->setPriceTotalWithoutDelivery($order->getPriceTotalPDV() - $order->getPriceDelivery());$order->setStatus(OrderStatusData::PENDING);$order->setPlacanje($request->request->get('placanje'));$order->setDostava($request->request->get('dostava'));if (!is_null($request->request->get('diler'))) {$order->setIsDiler(true);$order->setStatus(OrderStatusData::PROFAKTURA);}$this->em->getRepository(Order::class)->generateOrderKey($order);$order = $this->em->getRepository(Order::class)->save($order, $this->getUser());if ($session->has('basketCheckout')) {$session->remove('basketCheckout');}if ($session->has('basketUkupnoPorez')) {$session->remove('basketUkupnoPorez');}if ($session->has('basketUkupnoPdv')) {$session->remove('basketUkupnoPdv');}if ($session->has('basket')) {$session->remove('basket');}if ($session->has('dostava')) {$session->remove('dostava');}if ($session->has('ukupnoProizvoda')) {$session->remove('ukupnoProizvoda');}if ($order->getPlacanje() == OrderPaymentData::ONLINE) {$orgOid = $order->getOrderKey();$orgAmount = number_format($order->getPriceTotalPDV() , 2, '.', '');$orgOkUrl = "https://pcboomboom.rs/products/order-success";$orgFailUrl = "https://pcboomboom.rs/products/order-fail";$orgShopUrl = "https://pcboomboom.rs";$orgRnd = microtime();$clientId = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::CLIENT_ID));$oid = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgOid));$amount = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgAmount));$shopUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgShopUrl));$okUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgOkUrl));$failUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgFailUrl));$transactionType = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::AUTH_TYPE));$installment = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::INSTALLMENT_NO));$rnd = str_replace(["|", "\\", ".", " "], ["\\|", "\\\\", "", ""], $orgRnd);$currency = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::STORE_CURRENCY));$storeKey = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::STORE_KEY));$plainText = $clientId . "|" . $oid . "|" . $amount . "|" . $okUrl . "|" . $failUrl . "|" . $transactionType . "|" . $installment . "|" . $rnd . "||||" . $currency . "|" . $storeKey;$hashValue = hash('sha512', $plainText);$hash = base64_encode (pack('H*',$hashValue));$args['clientId'] = $clientId; // Vaš Merchant ID$args['oid'] = $oid; // Jedinstveni ID porudžbine$args['amount'] = $amount; // Iznos plaćanja$args['okUrl'] = $okUrl;$args['failUrl'] = $failUrl;$args['tranType'] = $transactionType;$args['instalment'] = $installment;$args['rnd'] = $rnd; // Generišite nasumičan string$args['currency'] = $currency; // Valuta$args['storeKey'] = $storeKey;$args['hash'] = $hash;$args['storetype'] = AppConfig::STORE_TYPE;$args['hashAlgorithm'] = AppConfig::ALGORITHM;$args['lang'] = AppConfig::LANGUAGE;$args['shopUrl'] = $orgShopUrl;return $this->render('front/product/payment.html.twig', $args);}$mailService->order($order);$args['order'] = $order;if ($order->isDiler()) {return $this->render('front/product/success_offer.html.twig', $args);}return $this->render('front/product/success.html.twig', $args);}} else {$this->addFlash('error', 'Nismo uspeli da verifikujemo porudžbinu. Molimo vas da probate ponovo.');return $this->redirectToRoute('app_cart_kasa');}}$args['form'] = $form->createView();return $this->render('front/product/kasa.html.twig', $args);}#[Route('/add-comment/{id}', name: 'app_comment_add')]// #[Entity('comment', expr: 'repository.findForForm(id)')]// #[Security("is_granted('USER_EDIT', usr)", message: 'Nemas pristup', statusCode: 403)]public function formComment(Request $request, Product $product): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}if ($request->isMethod('POST')) {$lastComment = $this->em->getRepository(Comment::class)->getOneByUser($request->request->get('member'));if (!is_null($lastComment)) {$now = new DateTimeImmutable();$commentTime = $lastComment['created'];$interval = $now->diff($commentTime);if ($interval->h == 0 && $interval->i < 30) {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.']);}}$komentar = new Comment();$komentar->setProduct($product);$komentar->setCreatedBy($this->em->getRepository(User::class)->find($request->request->get('member')));$komentar->setComment($request->request->get('comment'));$komentar->setOcena($request->request->get('rating'));$komentar->setStatus(0);$this->em->getRepository(Comment::class)->save($komentar);return new JsonResponse(['status' => 'success', 'message' => 'Komentar je uspešno dodat. Biće objavljen nakon verifikacije administratora.']);}return new JsonResponse(['status' => 'error', 'message' => 'Došlo je do greške.']);}#[Route('/favorite-add', name: 'app_favorite_add')]public function favoriteAdd(Request $request): RedirectResponse|JsonResponse {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$pid = $request->get('product_id');$product = $this->em->getRepository(Product::class)->find((int)$pid);$user = $this->getUser();$favoriti = $user->getFavorite();if ($favoriti->contains($product)) {// Proizvod je u kolekciji omiljenihreturn new JsonResponse(['status' => 'error', 'message' => 'Proizvod već postoji u Vašoj listi želja.']);} else {$user->addFavorite($product);$user = $this->em->getRepository(User::class)->save($user);$count = $user->getFavorite()->count();return new JsonResponse(['status' => 'success', 'totalFavorites' => $count, 'message' => 'Proizvod je uspešno dodat u Vašu listu favorita.']);}}#[Route('/favorite-remove/{id}', name: 'app_favorite_remove')]public function favoriteRemove(Product $product, Request $request): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$user = $this->getUser();$user->removeFavorite($product);$user = $this->em->getRepository(User::class)->save($user);return $this->redirectToRoute('app_profile_view');}#[Route('/favorite-count', name: 'app_favorite_count')]public function showFavorite(): JsonResponse {$count = $this->getUser()->getFavorite()->count();return new JsonResponse(['totalFavorites' => $count]);}#[Route('/order-success', name: 'app_order_success')]public function success(Request $request, MailService $mailService): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$args = [];$oid = $request->request->get('oid');$order = $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);// $order = $this->em->getRepository(Order::class)->find(37);if (!is_null($request->request->get('TransId'))) {$transId = $request->request->get('TransId');$order->setTransId($transId);}if (!is_null($request->request->get('AuthCode'))) {$authCode = $request->request->get('AuthCode');$order->setAuthCode($authCode);}if (!is_null($request->request->get('ProcReturnCode'))) {$prCode = $request->request->get('ProcReturnCode');$order->setPrCode($prCode);}if (!is_null($request->request->get('clientIp'))) {$clientIp = $request->request->get('clientIp');$order->setClientIp($clientIp);}if (!is_null($request->request->get('instalment'))) {$installment = $request->request->get('instalment');$order->setInstallment($installment);}if (!is_null($request->request->get('Response'))) {$responseTrans = $request->request->get('Response');$order->setResponse($responseTrans);}if (!is_null($request->request->get('EXTRA_TRXDATE'))) {$transDate = $request->request->get('EXTRA_TRXDATE');$order->setTransDate($transDate);}if (!is_null($request->request->get('mdStatus'))) {$mdStatus = $request->request->get('mdStatus');$order->setMdStatus($mdStatus);}$order = $this->em->getRepository(Order::class)->savePayment($order);$mailService->order($order);$args['order'] = $order;return $this->render('front/product/success.html.twig', $args);}#[Route('/order-fail', name: 'app_order_fail')]public function fail(Request $request, MailService $mailService): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$args = [];$oid = $request->request->get('oid');$order = $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);if (!is_null($request->request->get('TransId'))) {$transId = $request->request->get('TransId');$order->setTransId($transId);}if (!is_null($request->request->get('AuthCode'))) {$authCode = $request->request->get('AuthCode');$order->setAuthCode($authCode);}if (!is_null($request->request->get('ProcReturnCode'))) {$prCode = $request->request->get('ProcReturnCode');$order->setPrCode($prCode);}if (!is_null($request->request->get('clientIp'))) {$clientIp = $request->request->get('clientIp');$order->setClientIp($clientIp);}if (!is_null($request->request->get('instalment'))) {$installment = $request->request->get('instalment');$order->setInstallment($installment);}if (!is_null($request->request->get('Response'))) {$responseTrans = $request->request->get('Response');$order->setResponse($responseTrans);}if (!is_null($request->request->get('EXTRA_TRXDATE'))) {$transDate = $request->request->get('EXTRA_TRXDATE');$order->setTransDate($transDate);}if (!is_null($request->request->get('mdStatus'))) {$mdStatus = $request->request->get('mdStatus');$order->setMdStatus($mdStatus);}$order = $this->em->getRepository(Order::class)->savePayment($order);$mailService->orderFail($order);$args['order'] = $order;return $this->render('front/product/fail.html.twig', $args);}#[Route('/export-pdf-product/{id}', name: 'app_product_pdf')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfProduct(Product $product, Request $request,) : Response {$args['product'] = $product;$args['category'] = $product->getCategory();$html = $this->renderView('front/product/pdf.html.twig', $args);$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);return new Response($pdfContent, 200, ['Content-Type' => 'application/pdf','Content-Disposition' => 'inline; filename="order_' . $product->getSku() . '.pdf"',]);}#[Route('/export-pdf/{id}', name: 'app_offer_pdf')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdf(Order $order, Request $request) : Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}$args['order'] = $order;$products = $order->getProduct();$kolicina = 0;foreach ($products as $prod) {$kolicina = $kolicina + $prod->getKolicina();}$args['noProducts'] = $kolicina;$args['statusi'] = OrderStatusData::STATUS;$args['memorandum'] = $this->getUser()->hasNullProperties();$html = $this->renderView('order/pdf.html.twig', $args);$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);return new Response($pdfContent, 200, ['Content-Type' => 'application/pdf','Content-Disposition' => 'inline; filename="order_' . $order->getOrderKey() . '.pdf"',]);}#[Route('/export-pdf-korpa/', name: 'app_offer_pdf_korpa')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfKorpa(SessionInterface $session, Request $request): Response {$args['type'] = $request->query->get('type');$args['basket'] = $session->get('basketCheckout');$args['ukupnoPorez'] = $session->get('basketUkupnoPorez');$args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');$args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');$args['memorandum'] = $this->getUser()->hasNullProperties();$html = $this->renderView('order/korpa_pdf.html.twig', $args);$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);return new Response($pdfContent, 200, ['Content-Type' => 'application/pdf','Content-Disposition' => 'attachment; filename="offer_' . date('Y-m-d_H-i-s') . '.pdf"',]);}#[Route('/get-users-ajax-search-products', name: 'app_ajax_search')]public function getProducts(Request $request, EntityManagerInterface $em, Packages $assetsManager,RouterInterface $router): JsonResponse {$term = $request->query->get('q', '');$products = $em->getRepository(Product::class)->searchByTermAjax($term);$results = [];foreach ($products as $product) {$results[] = ['id' => $product['id'],'text' => $product['title'],'pricePDV' => $product['pricePDV'],'link' => $router->generate('app_shop_product_view', ['id' => $product['id']]),'slika' => $assetsManager->getUrl($product['thumbnail100'])];}return new JsonResponse(['results' => $results]);}#[Route('/products-category-random/{id}', name: 'app_products_category_random')]public function productsCategory(Category $category): Response {$args = [];$args['randomProducts'] = $this->em->getRepository(Product::class)->searchByCategory($category);return $this->render('front/include/products_category.html.twig', $args);}#[Route('/view/{id}', name: 'app_shop_product_view')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function view(Product $product, SessionInterface $session): Response {if ($this->isGranted('ROLE_USER')) {if (!$this->isGranted('ROLE_EMPLOYEE')) {return $this->redirect($this->generateUrl('app_home'));}}if ($product->getPricePDV() == 0 || $product->isSuspended()) {return $this->redirect($this->generateUrl('app_shop_home'));}$args['product'] = $product;$args['category'] = $product->getCategory();$args['productComments'] = $this->em->getRepository(Comment::class)->findBy(['product' => $product, 'status' => StatusData::PRIHVACEN]);$args['noActiveComments'] = $this->em->getRepository(Comment::class)->count(['product' => $product, 'status' => StatusData::PRIHVACEN]);$args['stars'] = $this->em->getRepository(Comment::class)->getStars($product->getId());$visit = $product->getVisits()->first();$visit->setVisit($visit->getVisit() + 1);$visit = $this->em->getRepository(Visit::class)->save($visit);$args['visits'] = $visit->getVisit();return $this->render('front/product/view.html.twig', $args);}#[Route('/edit-pdf-korpa/', name: 'app_offer_edit_pdf_korpa')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfEditKorpa(SessionInterface $session, Request $request): Response {$args['type'] = $request->query->get('type');$args['basket'] = $session->get('basketCheckout');$args['ukupnoPorez'] = $session->get('basketUkupnoPorez');$args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');$args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');$args['gradovi'] = $this->em->getRepository(City::class)->findAll();return $this->render('front/product/edit.html.twig', $args);}#[Route('/edit-export-pdf-korpa/', name: 'app_edit_basket_pdf')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfEditKorpaExport(SessionInterface $session, MailService $mailService, Request $request, UploadService $uploadService): Response {$test = new OrderProduct();$korisnik = $this->getUser();$args['type'] = $request->request->get('type');$args['ime'] = $request->request->get('ime');$args['prezime'] = $request->request->get('prezime');$args['telefon'] = $request->request->get('telefon');$args['email'] = $request->request->get('email') ?: null;$args['grad'] = $request->request->get('grad') ?: null;if (!is_null($args['grad'])) {$args['grad'] = $this->em->getRepository(City::class)->find(($request->request->get('grad')));}$args['adresa'] = $request->request->get('adresa') ?: null;$args['napomena'] = $request->request->get('napomena');$args['rNaziv'] = $request->request->all('rad')['title'];$args['rCena'] = $request->request->all('rad')['price'];$args['total'] = $request->request->get('totalPdvPrikaz');$args['proizvodi'] = [];$args['proizvodiNew'] = [];$slike = $request->files->all();foreach ($request->request->all() as $key => $value ) {if ($key != 'totalPdvPrikaz' && $key != 'type' && $key != 'rad' && $key != 'ime' && $key != 'prezime' && $key != 'telefon' && $key != 'adresa' && $key != 'grad' && $key != 'napomena' && $key != 'email' && $key != 'manual' && $key != 'procenat' && !str_starts_with($key, 'new_')) {$prozivod = $this->em->getRepository(Product::class)->find($key);$args['proizvodi'][] = ['product' => $prozivod,'price' => $value['price'],'qty' => $value['qty'],'totalno' => $value['totalno'],'desc' => $value['desc'],];}if (str_starts_with($key, 'new_')) {if (isset($slike[$key])) {if (!is_null($slike[$key]['image'])) {$image = $slike[$key]['image'];$slika = $uploadService->upload($image, $test->getImageUploadPath());$slika = $this->em->getRepository(Image::class)->addImageProduct($slika, $test->getThumbUploadPath(), $this->getParameter('kernel.project_dir'));$slika = $slika->getThumbnail100();} else {$slika = '/assets/images/no_image_product.png';}} else {$slika = '/assets/images/no_image_product.png';}$args['proizvodiNew'][] = ['product' => $value['title'],'price' => $value['price'],'qty' => $value['qty'],'totalno' => $value['totalno'],'desc' => $value['desc'],'slika' => $slika,];}}if ($args['type'] == 1) {$order = new Order();$order->setCreatedBy($korisnik);$order->setMember($korisnik);$order->setIme($args['ime']);$order->setPrezime($args['prezime']);$order->setAdresa($args['adresa']);$order->setGrad($args['grad']);$order->setTelefon1($args['telefon']);$order->setEmail($args['email']);$args['dostava'] = 0;$order->setPriceTotalPDV($args['total'] + $args['dostava']);$order->setPriceTotal($args['total']);$order->setPriceTotalWithoutDelivery($args['total']);$order->setStatus(OrderStatusData::PENDING);$order->setIsDiler(true);$order->setStatus(OrderStatusData::PROFAKTURA);$this->em->getRepository(Order::class)->generateOrderKey($order);//dodaje proizvode iz bazeforeach ($args['proizvodi'] as $product) {$orderProduct = new OrderProduct();$dbProduct = $product['product'];$orderProduct->setProduct($dbProduct);$orderProduct->setTitle($dbProduct->getTitle());$orderProduct->setKolicina($product['qty']);$orderProduct->setPricePDV($product['price']);$orderProduct->setPriceTotalPDV($product['totalno']);$orderProduct->setDescription($product['desc']);$orderProduct->setSku($dbProduct->getSku());$order->addProduct($orderProduct);}//dodaje radif (!empty($args['rNaziv']) && !empty($args['rCena'])) {$orderProduct = new OrderProduct();$orderProduct->setTitle(mb_strtoupper(trim($args['rNaziv'])));$orderProduct->setProduct($this->em->getRepository(Product::class)->find(999999));$orderProduct->setKolicina(1);$orderProduct->setPricePDV($args['rCena']);$orderProduct->setPriceTotalPDV($args['rCena']);$order->addProduct($orderProduct);}//dodaje custom proizvode$broj = 0;foreach ($args['proizvodiNew'] as $productNew) {$formB = sprintf('%02d', $broj);$orderProduct = new OrderProduct();$orderProduct->setProduct($this->em->getRepository(Product::class)->find('9999' . $formB));$orderProduct->setTitle($productNew['product']);$orderProduct->setKolicina($productNew['qty']);$orderProduct->setPricePDV($productNew['price']);$orderProduct->setPriceTotalPDV($productNew['totalno']);$orderProduct->setSku(0);$orderProduct->setImage($productNew['slika']);$orderProduct->setDescription($productNew['desc']);$order->addProduct($orderProduct);$broj++;}if (!empty($args['proizvodiNew'])) {$order->setIsCustom(true);}if ($session->has('basketCheckout')) {$session->remove('basketCheckout');}if ($session->has('basketUkupnoPorez')) {$session->remove('basketUkupnoPorez');}if ($session->has('basketUkupnoPdv')) {$session->remove('basketUkupnoPdv');}if ($session->has('basket')) {$session->remove('basket');}if ($session->has('dostava')) {$session->remove('dostava');}if ($session->has('ukupnoProizvoda')) {$session->remove('ukupnoProizvoda');}$args['order'] = $this->em->getRepository(Order::class)->save($order, $this->getUser());$mailService->order($args['order']);}if ($args['type'] == 0) {$order = new Ponuda();$order->setIme($args['ime']);$order->setPrezime($args['prezime']);$order->setAdresa($args['adresa']);$order->setGrad($args['grad']);$order->setTelefon1($args['telefon']);$order->setEmail($args['email']);$order->setDiler($korisnik);$products = [];//dodaje proizvode iz bazeforeach ($args['proizvodi'] as $product) {$products[] = ['id' => $product['product']->getId(),'title' => $product['product']->getTitle(),'price' => $product['price'],'desc' => $product['desc'],'product' => $product['product'],'slika' => $product['product']->getMainImage()->getThumbnail100(),'opis' => $product['product']->getDescription(),];}//dodaje radif (!empty($args['rNaziv']) && !empty($args['rCena'])) {$products[] = ['id' => '','title' => trim($args['rNaziv']),'price' => $args['rCena'],'desc' => '','product' => '','slika' => '','opis' => '',];}//dodaje custom proizvodeforeach ($args['proizvodiNew'] as $productNew) {$products[] = ['id' => '','title' => $productNew['product'],'price' => $productNew['price'],'desc' => $productNew['desc'],'product' => '','slika' => $productNew['slika'],'opis' => '',];}$order->setProducts($products);//dodato da brise iz korpeif ($session->has('basketCheckout')) {$session->remove('basketCheckout');}if ($session->has('basketUkupnoPorez')) {$session->remove('basketUkupnoPorez');}if ($session->has('basketUkupnoPdv')) {$session->remove('basketUkupnoPdv');}if ($session->has('basket')) {$session->remove('basket');}if ($session->has('dostava')) {$session->remove('dostava');}if ($session->has('ukupnoProizvoda')) {$session->remove('ukupnoProizvoda');}$args['order'] = $this->em->getRepository(Ponuda::class)->save($order);// $mailService->offerp($args['order']);}$args['memorandum'] = $this->getUser()->hasNullProperties();// return $this->render('order/edit_korpa_pdf.html.twig', $args);$html = $this->renderView('order/edit_korpa_pdf.html.twig', $args);$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);return new Response($pdfContent, 200, ['Content-Type' => 'application/pdf','Content-Disposition' => 'attachment; filename="offer_' . date('Y-m-d_H-i-s') . '.pdf"',]);}#[Route('/edit-pdf-profile/{id}', name: 'app_offer_edit_pdf_profile')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfEditProfile(Order $order, SessionInterface $session, Request $request): Response {$args['ime'] = $order->getIme();$args['prezime'] = $order->getPrezime();$args['telefon'] = $order->getTelefon1();$args['adresa'] = $order->getAdresa();$args['grad'] = $order->getGrad();$args['email'] = $order->getEmail();$args['basket'] = [];foreach ($order->getProduct()->toArray() as $prod) {if ($prod->getProduct()->getId() > 999899 && $prod->getProduct()->getId() < 999999) {$custom = true;} else {$custom = false;}$args['basket'][] = ["pid" => $prod->getProduct()->getId(),"qty" => $prod->getKolicina(),"product" => $prod->getProduct(),"cenaKomad" => $prod->getPricePDV(),"ukupnaCenaDinKrajnja" => $prod->getPriceTotalPDV(),"porez" => 20,"popust" => false,"slika" => $prod->getImage(),"custom" => $custom,"title" => $prod->getTitle(),"desc" => $prod->getDescription(),];}$args['type'] = 1;$args['ukupnoPorez'] = null;$args['ukupnaCenaPdv'] = $order->getPriceTotalPDV();$args['ukupnoProizvoda'] = $order->getProduct()->count();$args['gradovi'] = $this->em->getRepository(City::class)->findAll();return $this->render('front/product/edit_profile.html.twig', $args);}#[Route('/edit-export-pdf-profile/', name: 'app_edit_profile_pdf')]// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]public function pdfEditProfileExport(SessionInterface $session, MailService $mailService, Request $request, UploadService $uploadService): Response {//dd($request);$test = new OrderProduct();$args['type'] = 1;$args['ime'] = $request->request->get('ime');$args['prezime'] = $request->request->get('prezime');$args['telefon'] = $request->request->get('telefon');$args['email'] = $request->request->get('email') ?: null;$args['grad'] = $request->request->get('grad') ?: null;if (!is_null($args['grad'])) {$args['grad'] = $this->em->getRepository(City::class)->find(($request->request->get('grad')));}$args['adresa'] = $request->request->get('adresa') ?: null;$args['napomena'] = $request->request->get('napomena');$args['rNaziv'] = $request->request->all('rad')['title'];$args['rCena'] = $request->request->all('rad')['price'];$args['total'] = $request->request->get('totalPdvPrikaz');$args['proizvodi'] = [];$args['proizvodiNew'] = [];$slike = $request->files->all();foreach ($request->request->all() as $key => $value ) {if ($key != 'totalPdvPrikaz' && $key != 'type' && $key != 'rad' && $key != 'ime' && $key != 'prezime' && $key != 'telefon' && $key != 'adresa' && $key != 'grad' && $key != 'napomena' && $key != 'email' && $key != 'manual' && $key != 'procenat' && $key != 'slikaOld' && !str_starts_with($key, 'new_')) {$prozivod = $this->em->getRepository(Product::class)->find($key);if ($prozivod->getId() < 999900 || $prozivod->getId() > 999998) {$args['proizvodi'][] = ['product' => $prozivod,'price' => $value['price'],'qty' => $value['qty'],'totalno' => $value['totalno'],'desc' => $value['desc'],];} else {$args['proizvodiNew'][] = ['product' => $value['titleOld'],'price' => $value['price'],'qty' => $value['qty'],'totalno' => $value['totalno'],'desc' => $value['desc'],'slika' => $value['slikaOld'],];}}if (str_starts_with($key, 'new_')) {if (isset($slike[$key])) {if (!is_null($slike[$key]['image'])) {$image = $slike[$key]['image'];$slika = $uploadService->upload($image, $test->getImageUploadPath());$slika = $this->em->getRepository(Image::class)->addImageProduct($slika, $test->getThumbUploadPath(), $this->getParameter('kernel.project_dir'));$slika = $slika->getThumbnail100();} else {$slika = '/assets/images/no_image_product.png';}} else {$slika = '/assets/images/no_image_product.png';}$args['proizvodiNew'][] = ['product' => $value['title'],'price' => $value['price'],'qty' => $value['qty'],'totalno' => $value['totalno'],'desc' => $value['desc'],'slika' => $slika,];}}$broj = 0;if ($args['type'] == 1) {$order = new Order();$korisnik = $this->getUser();$order->setCreatedBy($korisnik);$order->setMember($korisnik);$order->setIme($args['ime']);$order->setPrezime($args['prezime']);$order->setAdresa($args['adresa']);$order->setGrad($args['grad']);$order->setTelefon1($args['telefon']);$order->setEmail($args['email']);$args['dostava'] = 0;$order->setPriceTotalPDV($args['total'] + $args['dostava']);$order->setPriceTotal($args['total']);$order->setPriceTotalWithoutDelivery($args['total']);$order->setStatus(OrderStatusData::PENDING);$order->setIsDiler(true);$order->setStatus(OrderStatusData::PROFAKTURA);$this->em->getRepository(Order::class)->generateOrderKey($order);//dodaje proizvode iz bazeforeach ($args['proizvodi'] as $product) {$orderProduct = new OrderProduct();$dbProduct = $product['product'];$orderProduct->setProduct($dbProduct);$orderProduct->setTitle($dbProduct->getTitle());$orderProduct->setKolicina($product['qty']);$orderProduct->setPricePDV($product['price']);$orderProduct->setPriceTotalPDV($product['totalno']);$orderProduct->setDescription($product['desc']);$orderProduct->setSku($dbProduct->getSku());$order->addProduct($orderProduct);if ($dbProduct->getId() > 999899 && $dbProduct->getId() < 999999) {$broj++;}}//dodaje radif (!empty($args['rNaziv']) && !empty($args['rCena'])) {$orderProduct = new OrderProduct();$orderProduct->setTitle(mb_strtoupper(trim($args['rNaziv'])));$orderProduct->setProduct($this->em->getRepository(Product::class)->find(999999));$orderProduct->setKolicina(1);$orderProduct->setPricePDV($args['rCena']);$orderProduct->setPriceTotalPDV($args['rCena']);$order->addProduct($orderProduct);}//dodaje custom proizvode$broj++;foreach ($args['proizvodiNew'] as $productNew) {$formB = sprintf('%02d', $broj);$orderProduct = new OrderProduct();$orderProduct->setProduct($this->em->getRepository(Product::class)->find('9999' . $formB));$orderProduct->setTitle($productNew['product']);$orderProduct->setKolicina($productNew['qty']);$orderProduct->setPricePDV($productNew['price']);$orderProduct->setPriceTotalPDV($productNew['totalno']);$orderProduct->setSku(0);$orderProduct->setImage($productNew['slika']);$orderProduct->setDescription($productNew['desc']);$order->addProduct($orderProduct);$broj++;}if (!empty($args['proizvodiNew'])) {$order->setIsCustom(true);}$args['order'] = $this->em->getRepository(Order::class)->save($order, $this->getUser());$mailService->order($args['order']);}$args['memorandum'] = $this->getUser()->hasNullProperties();// return $this->render('order/edit_korpa_pdf.html.twig', $args);$html = $this->renderView('order/edit_korpa_pdf.html.twig', $args);$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);return new Response($pdfContent, 200, ['Content-Type' => 'application/pdf','Content-Disposition' => 'attachment; filename="offer_' . date('Y-m-d_H-i-s') . '.pdf"',]);}////// #[Route('/edit-pdf-profile/{id}', name: 'app_offer_edit_pdf_profile')]//// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]// public function pdfEditProfile(Order $order, Request $request): Response {//// $args['type'] = 1;// $args['gradovi'] = $this->em->getRepository(City::class)->findAll();// $args['order'] = $order;//// $order->setCreatedBy($korisnik);// $order->setMember($korisnik);// $order->setIme($args['ime']);// $order->setPrezime($args['prezime']);// $order->setAdresa($args['adresa']);// $order->setGrad($args['grad']);// $order->setTelefon1($args['telefon']);// $order->setEmail($args['email']);// $args['basket'] = $session->get('basketCheckout');//// $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');// $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');//// $args['dostava'] = 0;//// $order->setPriceTotalPDV($args['total'] + $args['dostava']);// $order->setPriceTotal($args['total']);// $order->setPriceTotalWithoutDelivery($args['total']);// $order->setStatus(OrderStatusData::PENDING);// $order->setIsDiler(true);// $order->setStatus(OrderStatusData::PROFAKTURA);// $this->em->getRepository(Order::class)->generateOrderKey($order);//// foreach ($args['proizvodi'] as $product) {//// $orderProduct = new OrderProduct();// $dbProduct = $product['product'];// $orderProduct->setProduct($dbProduct);// $orderProduct->setTitle($dbProduct->getTitle());// $orderProduct->setKolicina($product['qty']);// $orderProduct->setPricePDV($product['price']);// $orderProduct->setPriceTotalPDV($product['totalno']);// $orderProduct->setSku($dbProduct->getSku());// $order->addProduct($orderProduct);// }// if (!empty($args['rNaziv']) && !empty($args['rCena'])) {// $orderProduct = new OrderProduct();// $orderProduct->setTitle(mb_strtoupper(trim($args['rNaziv'])));// $orderProduct->setProduct($this->em->getRepository(Product::class)->find(999999));// $orderProduct->setKolicina(1);// $orderProduct->setPricePDV($args['rCena']);// $orderProduct->setPriceTotalPDV($args['rCena']);// $order->addProduct($orderProduct);// }//// $args['basket'] = $session->get('basketCheckout');// $args['ukupnoPorez'] = $session->get('basketUkupnoPorez');// $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');// $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');//// $args['gradovi'] = $this->em->getRepository(City::class)->findAll();//// return $this->render('front/product/edit.html.twig', $args);//// }}