<?php
namespace App\Controller\FrontController;
use App\Acme\Bundle\FrontUtility\ProductUtility;
use App\Entity\Product;
use App\Entity\UserPlatform;
use App\Entity\Location;
use App\Entity\Order;
use App\Entity\DetailsOrders;
use App\Form\SubscriptionForm\UserMultilType;
use App\Form\ProductType;
use App\Form\CommandeValideType;
use App\Form\RentProductType;
use App\Repository\ProductRepository;
use App\Repository\LocationRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use App\Repository\UserPlatformRepository;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Doctrine\ORM\EntityManagerInterface;
use App\Acme\Bundle\Utility\UtilitySearchSystem;
use App\Repository\StockRepository;
use App\Entity\MotRechercher;
use App\Entity\PriceProduct;
use App\Repository\MotRechercherRepository;
use Exception;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
/**
* @Route("/produit")
*/
class ProductController extends AbstractController
{
/**
* @Route("/", name="app_product_index", methods={"GET"})
*/
public function index(ProductRepository $productRepository): Response
{
return $this->render('/frontView/product/index.html.twig', [
'topOrderedProducts' => $productRepository->findTopOrderedProductsRandom(4),
'recentProducts' => $productRepository->findRecentProducts(4),
'temoin' => 0,
'message' => ''
]);
}
/**
* @Route("/search-product", name="app_product_search", methods={"GET"})
*/
public function searchProduct(
Request $request,
ProductRepository $productRepository,
MotRechercherRepository $motRechercherRepository
): Response {
$resultat = array();
if ("GET" == $request->getMethod()) {
$motrechercher = $request->query->get('searchname');
if (empty($motrechercher)) {
$resultat = array();
} else {
$mot = $motrechercher;
$res_objet = UtilitySearchSystem::initStepSearch($motrechercher);
//si parmit les recherche du client se trouve dans la liste de mots cles de base
if (count($res_objet) > 0) {
$resultat = $productRepository->searchProduct($res_objet);
if (0 === count($resultat)) {
$motRechercherRepository->createOrUpdateMotRecherche($mot,\DateTime::createFromFormat('Y-m-d H:i:s',Date('Y-m-d H:i:s')));
}
} else {
$resultat = array();
}
}
}
return $this->render('/frontView/product/index.html.twig', [
'products' => $resultat,
'temoin' => 0,
'message' => ''
]);
}
/**
* @Route("/ajax-search", name="ajax_search", methods={"GET"})
*/
public function ajaxSearch(
Request $request,
ProductRepository $productRepository
): JsonResponse {
$keyword = $request->query->get('q');
// $keyword = 'protec';
if (!$keyword || strlen($keyword) < 2) {
return $this->json([]);
}
$products = $productRepository->findSuggestions($keyword);
$data = [];
foreach ($products as $product) {
$data[] = [
'id' => $product->getId(),
'title' => $product->getTitle(),
'image' => $product->getPicture()/*,
'price' => $product->getPrice(),*/
];
}
// dd($data);
return $this->json($data);
}
/**
* @Route("/list-categorie/{idcategorie}/{type}", name="app_product_category", methods={"GET"})
*/
public function lisCategorie(ProductRepository $productRepository, int $idcategorie, string $type): Response
{
$criteria = array();
if ("categorie" == $type) {
$criteria = array('fkcategorie'=>$idcategorie, 'enabled'=>true);
} else {
$criteria = array('fksousCategorie'=>$idcategorie, 'enabled'=>true);
}
$listProducts = $productRepository->findBy($criteria);
return $this->render('/frontView/product/index.html.twig', [
'products' => $listProducts,
]);
}
public function createUser(
$form,
$user,
$arrayresult,
Request $request,
UserPasswordEncoderInterface $passwordEncoder,
UserPlatformRepository $userPlatformRepository
) {
$error = 1;
if ($user->getPassword() != $form->get('confirmpass')->getData()) {
$arrayresult['error'] = true;
$arrayresult['msg'] = "Mot de passe non confirmé.";
} elseif (strpos($user->getEmail(), " ")) {
$arrayresult['error'] = true;
$arrayresult['msg'] = "l'identifiant \"".$user->getEmail()."\" ne doit pas contenir un espace.";
} elseif (strlen($user->getEmail()) < 5) {
$arrayresult['error'] = true;
$arrayresult['msg'] = "l'identifiant \"".$user->getEmail()."\" doit contenir plus de 5 caracteres.";
} else {
$user->setRoles(["ROLE_CUSTOMER"]);
$user->setPassword(
$passwordEncoder->encodePassword($user, $user->getPassword())
);
$userPlatformRepository->add($user, true);
//Authentification
$token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles());
$this->get("security.token_storage")->setToken($token);
$event = new InteractiveLoginEvent($request, $token);
//$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
$error = 0;
}
return $error;
}
public function createCommande(
Request $request,
Order $commande,
$listPanierSession,
StockRepository $stockRepository,
EntityManagerInterface $entityManager,
AuthorizationCheckerInterface $authorizationChecker
) {
$commande->setDateOrder(\DateTime::createFromFormat('Y-m-d H:i:s', Date('Y-m-d H:i:s')));
$commande->setCustomer($this->getUser());
$entityManager->getRepository(Order::class)->add($commande, true);
$commande->setReforder("RP-CMD-" . $commande->getId());
$entityManager->getRepository(Order::class)->add($commande, true);
// ── COUPON ───────────────────────────────────────────────────────────
$couponData = $request->getSession()->get('coupon');
// ── Calculer le prix unitaire correct selon rôle + quantité ──────────
$getPrixUnitaire = function (
$priceProduct,
int $quantity,
AuthorizationCheckerInterface $authorizationChecker
): float {
if ($authorizationChecker->isGranted('ROLE_COM')) {
return $priceProduct->getPriceCustomer();
}
if ($authorizationChecker->isGranted('ROLE_CUSTOMER')) {
return $priceProduct->getPriceCustomer();
}
return $priceProduct->getPriceCustomer();
};
// ── Total brut (nécessaire pour répartir la remise coupon) ────────────
$totalBrut = 0.0;
if ($couponData) {
foreach ($listPanierSession as $item) {
$pp = $entityManager->getRepository(PriceProduct::class)->getPriceProduct(
$entityManager->getRepository(Product::class)->find($item['produit']->getId())
);
$qty = 1;
// Priorité : override_price (quantité modifiée côté JS/AJAX)
$pu = isset($item['override_price'])
? (float) $item['override_price']
: $getPrixUnitaire($pp, $qty, $authorizationChecker);
$totalBrut += $pu * $qty;
}
}
// ── Traitement des lignes de commande ─────────────────────────────────
$listPanierValider = [];
$listPanierNonValider = [];
for ($incr = 0; $incr < count($listPanierSession); $incr++) {
$item = $listPanierSession[$incr];
$product = $entityManager->getRepository(Product::class)->find($item['produit']->getId());
$pp = $entityManager->getRepository(PriceProduct::class)->getPriceProduct($product);
$qty = 1;
$item['number'] = 1;
// ── Prix unitaire : override JS/AJAX en priorité, sinon calcul rôle ──
$prixUnitaire = isset($item['override_price'])
? (float) $item['override_price']
: $getPrixUnitaire($pp, $qty, $authorizationChecker);
// ── Remise coupon répartie proportionnellement ────────────────────
if ($couponData && $totalBrut > 0) {
$ligneBrut = $prixUnitaire * $qty;
$ratio = $ligneBrut / $totalBrut;
$remiseUnitaire = round(($couponData['discount'] * $ratio) / $qty, 4);
$prixUnitaire = round($prixUnitaire - $remiseUnitaire, 4);
}
// ── Création de la ligne DetailsOrders ───────────────────────────
$newDetailsOrders = new DetailsOrders();
$newDetailsOrders->setIdorder($commande);
$newDetailsOrders->setIdproduct($product);
$newDetailsOrders->setQuantity($qty);
$newDetailsOrders->setPrixUnitaire($prixUnitaire);
$newDetailsOrders->setState(0);
$newDetailsOrders->setMotif("");
$entityManager->getRepository(DetailsOrders::class)->add($newDetailsOrders, true);
// ── Mise à jour du stock ──────────────────────────────────────────
$listPanierValider[] = $item;
}
// ── COUPON : persister sur la commande + incrémenter usage ───────────
if ($couponData && !empty($listPanierValider)) {
$commande->setCouponRef($couponData['ref']);
$commande->setDiscountAmount((float) $couponData['discount']);
$commande->setTotalAfterDiscount(round($totalBrut - $couponData['discount'], 2));
$entityManager->getRepository(Order::class)->add($commande, true);
$coupon = $entityManager->getRepository(\App\Entity\Coupon::class)->find($couponData['id']);
if ($coupon) {
$coupon->incrementUsageCount();
$entityManager->flush();
}
$request->getSession()->remove('coupon');
}
// ── Résultats en session pour affichage ──────────────────────────────
$request->getSession()->set("panier_valider", $listPanierValider);
$request->getSession()->set("panier_non_valider", $listPanierNonValider);
}
public function validerCommande(
$arrayresult,
$form,
$user,
$session,
&$listPanierSession,
Request $request,
StockRepository $stockRepository,
UserPasswordEncoderInterface $passwordEncoder,
EntityManagerInterface $entityManager,
UserPlatformRepository $userPlatformRepository,
AuthorizationCheckerInterface $authorizationChecker
) {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$commande = new Order();
$commande->setState(0);
if (null == $this->getUser()) {
$createUser = $this->createUser($form, $user, $arrayresult, $request, $passwordEncoder, $userPlatformRepository);
if (0 === $createUser) {
$this->createCommande($request, $commande, $listPanierSession, $stockRepository, $entityManager, $authorizationChecker);
}
} else {
$this->createCommande($request, $commande, $listPanierSession, $stockRepository, $entityManager, $authorizationChecker);
}
$session->set('listPanier', []);
$listPanierSession = [];
} catch (Exception $exc) {
return $this->render('frontView/error.html.twig', [
'msg' => $exc->getMessage(),
]);
}
}
}
/**
* @Route("/panier/{product}", name="app_product_panier", methods={"GET", "POST"})
*/
public function addPanier(
Request $request,
ProductRepository $productRepository,
StockRepository $stockRepository,
Product $product,
EntityManagerInterface $entityManager
): Response {
//controle si l'utilisateur est membre
$isMember = false;
$listPanier = [];
$arrayresult = array("error"=>false,"msg"=>"");
$user = new UserPlatform();
$availableStock = $stockRepository->getAvailableStock($product);
// If RENT → ask dates
if ($product->getStatetype() === 2) {
if ($availableStock <= 0) {
// $reponse = $stockRepository->addProductIntoOrder($product, 1);
$reponse = "Stock disponible 0";
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse
]);
}
return $this->redirectToRoute('app_product_rent', [
'product' => $product->getId()
]);
}
if (null == $this->getUser()) {
//recupérer le session list panier si existe
$price_product = $entityManager->getRepository(PriceProduct::class)->getPriceProduct($product);
$formatPanier = array('produit'=>$product,'number'=>1, 'price_product'=>$price_product);
$session = $request->getSession();
$listPanierSession = $session->get('listPanier');
if (null == $listPanierSession) {
$isMember = "la session panier n'est pas creer";
$listPanier = array();
$reponse = $stockRepository->addProductIntoOrder($product, 1);
if ('' === $reponse) {
array_push($listPanier, $formatPanier);
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse
]);
}
$session->set('listPanier', $listPanier);
$listPanierSession = $listPanier;
} else {
$verificationBasket = new ProductUtility();
$controlProd = $verificationBasket->isProductInBasket($listPanierSession, $product);
if ($controlProd['inBasket']) {
$c = 1;
$reponse = $stockRepository->addProductIntoOrder($product, $c);
if ('' === $reponse) {
$listPanierSession[$controlProd['indice']]['number'] = 1;
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse.". Vous avez déjà ".$listPanierSession[$controlProd['indice']]['number']." dans votre panier"
]);
}
} else {
$reponse = $stockRepository->addProductIntoOrder($product, 1);
if ('' === $reponse) {
array_push($listPanierSession, $formatPanier);
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse
]);
}
}
$session->set('listPanier', $listPanierSession);
}
$form = $this->createForm(UserMultilType::class, $user);
} else {
//traitement pour voir les commandes du client
$price_product = $entityManager->getRepository(PriceProduct::class)->getPriceProduct($product);
$formatPanier = array('produit'=>$product,'number'=>1, 'price_product'=>$price_product);
$session = $request->getSession();
$listPanierSession = $session->get('listPanier');
if (null == $listPanierSession) {
$isMember = "la session panier n'est pas creer";
$listPanier = array();
$reponse = $stockRepository->addProductIntoOrder($product, 1);
if ('' === $reponse) {
array_push($listPanier, $formatPanier);
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse
]);
}
$session->set('listPanier', $listPanier);
$listPanierSession = $listPanier;
} else {
$verificationBasket = new ProductUtility();
$controlProd = $verificationBasket->isProductInBasket($listPanierSession, $product);
if ($controlProd['inBasket']) {
$c = 1;
$reponse = $stockRepository->addProductIntoOrder($product, $c);
if ('' === $reponse) {
$listPanierSession[$controlProd['indice']]['number'] = 1;
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse.". Vous avez déjà ".$listPanierSession[$controlProd['indice']]['number']." dans votre panier"
]);
}
} else {
$reponse = $stockRepository->addProductIntoOrder($product, 1);//Stock disponible 0
if ('' === $reponse) {
array_push($listPanierSession, $formatPanier);
} else {
return $this->render('/frontView/product/index.html.twig', [
'products' => $productRepository->findAll(),
'temoin' => $product->getId(),
'message' => $reponse
]);
}
}
//array_push($listPanierSession,$formatPanier);
$session->set('listPanier', $listPanierSession);
}
$form = $this->createForm(CommandeValideType::class, null);
}
return $this->redirectToRoute('app_product_list_panier');
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// try{
// $commande = new Order();
// $commande->setState(0);
// if($this->getUser() == null){
// if($user->getPassword() != $form->get('confirmpass')->getData()){
// $arrayresult['error'] = true;
// $arrayresult['msg'] = "Mot de passe non confirmé.";
// } else if(strpos($user->getEmail()," ")){
// $arrayresult['error'] = true;
// $arrayresult['msg'] = "l'identifiant \"".$user->getEmail()."\" ne doit pas contenir un espace.";
// }
// else if(strlen($user->getEmail()) < 5){
// $arrayresult['error'] = true;
// $arrayresult['msg'] = "l'identifiant \"".$user->getEmail()."\" doit contenir plus de 5 caracteres.";
// }
// else {
// $user->setRoles(["ROLE_CUSTOMER"]);
// $user->setPassword(
// $passwordEncoder->encodePassword($user, $user->getPassword()));
// $userPlatformRepository->add($user, true);
// //Authentification
// $token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles());
// $this->get("security.token_storage")->setToken($token);
// $event = new InteractiveLoginEvent($request, $token);
// //$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
// //creation commande
// $commande->setDateOrder(\DateTime::createFromFormat('Y-m-d H:i:s',Date('Y-m-d H:i:s')));
// $commande->setCustomer($user);
// $save = $entityManager->getRepository(Order::class)->add($commande,true);
// $session = $request->getSession();
// $listPanierSession = $session->get('listPanier');
// for($incr = 0 ; $incr < count($listPanierSession) ; $incr++){
// $newDetailsOrders = new DetailsOrders();
// $newDetailsOrders->setIdorder($commande);
// $product = $entityManager->getRepository(Product::class)->find($listPanierSession[$incr]['produit']->getId());
// $newDetailsOrders->setIdproduct($product);
// $newDetailsOrders->setQuantity($listPanierSession[$incr]['number']);
// $entityManager->getRepository(DetailsOrders::class)->add($newDetailsOrders,true);
// }
// //return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
// }
// }
// else {
// //$commande = new Order();
// $commande->setDateOrder(\DateTime::createFromFormat('Y-m-d H:i:s',Date('Y-m-d H:i:s')));
// $commande->setCustomer($this->getUser());
// $save = $entityManager->getRepository(Order::class)->add($commande,true);
// $session = $request->getSession();
// $listPanierSession = $session->get('listPanier');
// for($incr = 0 ; $incr < count($listPanierSession) ; $incr++){
// $newDetailsOrders = new DetailsOrders();
// $newDetailsOrders->setIdorder($commande);
// $product = $entityManager->getRepository(Product::class)->find($listPanierSession[$incr]['produit']->getId());
// $newDetailsOrders->setIdproduct($product);
// $newDetailsOrders->setQuantity($listPanierSession[$incr]['number']);
// $entityManager->getRepository(DetailsOrders::class)->add($newDetailsOrders,true);
// }
// //$arrayresult = array("error"=>true,"msg"=>"test");
// }
// $session->set('listPanier',[]);
// $listPanierSession = [];
// }
// catch(Exception $exc){
// return $this->render('frontView/error.html.twig', [
// 'msg' => $exc->getMessage(),
// ]);
// }
// }
// return $this->renderForm('frontView/product/addpanier.html.twig', [
// 'listPanier' => $listPanierSession,
// 'arrayresult' => $arrayresult,
// 'form' => $form,
// ]);
}
/**
* @Route("/panier/rent/{product}", name="app_product_rent")
*/
public function rentProduct(
Request $request,
Product $product,
EntityManagerInterface $entityManager,
StockRepository $stockRepository
): Response {
// Safety check
if ($product->getStatetype() !== 2) {
return $this->redirectToRoute('app_product_panier', [
'product' => $product->getId()
]);
}
$form = $this->createForm(RentProductType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
// Date validation
if ($data['endDate'] <= $data['startDate']) {
$this->addFlash('error', 'La date de fin doit être postérieure à la date de début.');
return $this->redirectToRoute('app_product_rent', [
'product' => $product->getId()
]);
}
$session = $request->getSession();
$listPanier = $session->get('listPanier', []);
// Prevent duplicate rental of same product
foreach ($listPanier as $item) {
if (
$item['produit']->getId() === $product->getId()
&& isset($item['rent'])
) {
$productName = $item['produit']->getTitle();
$this->addFlash('error', "Le produit \"$productName\" est déjà loué dans votre panier");
// return $this->redirectToRoute('app_product_list_panier');
return $this->redirectToRoute('app_product_rent', [
'product' => $product->getId()
]);
}
}
$price_product = $entityManager
->getRepository(PriceProduct::class)
->getPriceProduct($product);
$listPanier[] = [
'produit' => $product,
'number' => 1,
'price_product' => $price_product,
'rent' => [
'startDate' => $data['startDate'],
'endDate' => $data['endDate'],
],
];
$session->set('listPanier', $listPanier);
/*Add to db*/
// Prevent overlapping rentals
$existing = $entityManager->getRepository(Location::class)
->findOneBy([
'product' => $product,
'status' => 'active'
]);
if ($existing) {
$this->addFlash('error', 'Ce produit est déjà loué.');
// return $this->redirectToRoute('app_product_list');
return $this->redirectToRoute('app_product_rent', [
'product' => $product->getId()
]);
}
$location = new Location();
$location->setProduct($product);
$location->setUser($this->getUser());
$location->setStartDate($data['startDate']);
$location->setEndDate($data['endDate']);
$location->setCreatedAt(\DateTime::createFromFormat('Y-m-d H:i:s', Date('Y-m-d H:i:s')));
$location->setStatus('active');
// Optional price calculation
$days = $data['startDate']->diff($data['endDate'])->days;
$location->setPrice($days * $product->getPriceProducts()[0]->getPriceCustomer());
$entityManager->persist($location);
$entityManager->flush();
$this->addFlash('success', 'Location enregistrée avec succès');
return $this->redirectToRoute('app_product_list_panier');
}
return $this->render('frontView/product/rent.html.twig', [
'product' => $product,
'form' => $form->createView(),
]);
}
/**
* @Route("/panier-remove", name="app_product_panier_remove", methods={"GET", "POST"})
*/
public function removePanier(
Request $request
): Response {
$session = $request->getSession();
$session->set('listPanier', []);
return $this->redirectToRoute('app_product_list_panier', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/panier-product-remove/{productID}", name="app_product_panier_product_remove", methods={"GET"})
*/
public function removeProductInPanier(
Request $request,
int $productID,
ProductRepository $productRepository
): Response {
$session = $request->getSession();
$paniers = $session->get('listPanier');
if ($paniers) {
for ($i = 0; $i< count($paniers); $i++) {
$panier = $paniers[$i];
if ($panier['produit']->getId() === $productID) {
$product = $productRepository->find($productID);
$verificationBasket = new ProductUtility();
$controlProd = $verificationBasket->isProductInBasket($paniers, $product);
if ($controlProd['inBasket']) {
unset($paniers[$i]);
$paniers = array_values($paniers);
}
}
}
}
$session->set('listPanier', $paniers);
return $this->redirectToRoute('app_product_list_panier', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/list-panier", name="app_product_list_panier", methods={"GET", "POST"})
*/
public function listPanier(
Request $request,
UserPasswordEncoderInterface $passwordEncoder,
EntityManagerInterface $entityManager,
StockRepository $stockRepository,
UserPlatformRepository $userPlatformRepository,
LocationRepository $locationRepository,
AuthorizationCheckerInterface $authorizationChecker
): Response {
$arrayresult = array("error"=>false,"msg"=>"");
$session = $request->getSession();
$listPanierSession = $session->get('listPanier');
if (is_array($listPanierSession)) {
foreach ($listPanierSession as &$panierItem) {
$panierItem['number'] = 1;
}
unset($panierItem);
$session->set('listPanier', $listPanierSession);
}
$listPanierValider = null;
$listPanierNonValider = null;
$user = new UserPlatform();
if (null == $this->getUser()) {
$form = $this->createForm(UserMultilType::class, $user);
} else {
$form = $this->createForm(CommandeValideType::class, null);
}
$this->validerCommande($arrayresult, $form, $user, $session, $listPanierSession, $request, $stockRepository, $passwordEncoder, $entityManager, $userPlatformRepository, $authorizationChecker);
// dd($listPanierSession);
if ($session->get('panier_valider')) {
$listPanierValider = $session->get('panier_valider');
$listPanierNonValider = $session->get('panier_non_valider');
$session->remove('panier_valider');
$session->remove('panier_non_valider');
}
// Remove rent product if not active
$listPanierSession = $session->get('listPanier', []);
if ($this->getUser()) {
$activeLocations = $locationRepository->findBy([
'user' => $this->getUser(),
'status' => 'active'
]);
$activeProductIds = array_map(
fn($loc) => $loc->getProduct()->getId(),
$activeLocations
);
foreach ($listPanierSession as $key => $item) {
if (
isset($item['rent']) &&
!in_array($item['produit']->getId(), $activeProductIds)
) {
unset($listPanierSession[$key]);
}
}
// Reindex & update session
$listPanierSession = array_values($listPanierSession);
$session->set('listPanier', $listPanierSession);
}
return $this->renderForm('frontView/product/addpanier.html.twig', [
'listPanier' => $listPanierSession,
'listPanierValider' => $listPanierValider,
'listPanierNonValider' => $listPanierNonValider,
'arrayresult' => $arrayresult,
'form' => $form,
]);
/* return $this->renderForm('frontView/product/listcommande.html.twig', [
]); */
}
/**
* @Route("/points/{id}", name="app_product_modif", methods={"GET"})
*/
public function modifPoint(int $id, ProductRepository $productRepository): Response
{
$prod = $productRepository->getPoint($id);
$sommestockinit = 0;
$sommestockfinal = 0;
$sommestockinit = $prod['points'];
$sommestockfinal = $sommestockinit + 1;
$productRepository->updatePoint($sommestockfinal, $id);
return $this->redirectToRoute('app_product_show', [
'id'=>$id,
'modif'=>'validation'
], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/ajax-random-products", name="ajax_random_products", methods={"GET"})
*/
public function ajaxRandomProducts(ProductRepository $productRepository): JsonResponse
{
$categories = $productRepository->findRandomGroupedByCategory();
// dd($categories);
return $this->json($categories);
}
/**
* @Route("/{id}/{modif}", name="app_product_show", methods={"GET"})
*/
public function show(Request $request, Product $product, ProductRepository $productRepository, EntityManagerInterface $em, string $modif = null): Response
{
$sommestockinit = 0;
$sommestockfinal = 0;
$prod = array();
// if($this->getUser() != null ){
// if($modif != "validation"){
// if($this->isGranted('ROLE_CUSTOMER')){
// return $this->redirectToRoute('app_product_modif', [
// 'id'=>$product->getId(),
// ], Response::HTTP_SEE_OTHER);
// }
// }
/*if($this->isGranted('ROLE_CUSTOMER')){
$prod = $productRepository->getPoint($id);
$sommestockinit = 0;
$sommestockfinal = 0;
$sommestockinit = $prod['points'];
$sommestockfinal = $sommestockinit + 1;
$productRepository->updatePoint($sommestockfinal,$id);
}*/
/*if($this->isGranted('ROLE_CUSTOMER')){
$prod = $entityManager->getRepository(Product::class)->getPoint($id);
$sommestockinit = 0;
$sommestockfinal = 0;
$sommestockinit = $prod['points'];
$sommestockfinal = $sommestockinit + 1;
$productRepository->updatePoint($sommestockfinal,$id);
$entityManager->getRepository(Product::class)->updatePoint($sommestockfinal,$id);
}*/
// }
//$product = $productRepository->find($id);
// if ($request->getMethod() === 'GET') {
// $product->setPoints($product->getPoints() + 1);
// $em->flush();
// }
// If coming from suggestion
if ($request->query->get('fromSearch')) {
$product->setSearchCount($product->getSearchCount() + 1);
}
$em->flush();
return $this->render('frontView/product/show.html.twig', [
'product' => $product,
'sommestockinit' => $sommestockinit,
'sommestockfinal' => $sommestockfinal,
'type'=> $product->getStatetype(),//getStatetype() !== 1
'prod' => $prod,
]);
}
/**
* @Route("/{id}/click", name="app_product_click", methods={"POST"})
*/
public function click(
Request $request,
Product $product,
EntityManagerInterface $em
): JsonResponse {
$product->setPoints($product->getPoints() + 1);
// Increment search count only if coming from search
/*if ($request->query->get('fromSearch')) {
$product->setSearchCount($product->getSearchCount() + 1);
}*/
$em->flush();
return new JsonResponse(['ok' => true]);
}
/**
* @Route("/{id}/click-search", name="app_product_click_search", methods={"POST"})
*/
public function clickSearch(
Request $request,
Product $product,
EntityManagerInterface $em
): JsonResponse {
// Increment search count only if coming from search
if ($request->query->get('fromSearch')) {
$product->setSearchCount($product->getSearchCount() + 1);
}
$em->flush();
return new JsonResponse(['ok' => true]);
}
}