<?php
namespace App\Controller\Front;
use App\Entity\Commande;
use App\Entity\DetailCommande;
use App\Entity\User;
use App\Repository\BasketRepository;
use App\Repository\CommandeRepository;
use App\Repository\DetailCommandeRepository;
use App\Repository\ProduitRepository;
use App\Services\BasketService;
use App\Services\CurrentPathService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/panier")
*/
class PanierController extends AbstractController
{
public function dateArray(TranslatorInterface $translator)
{
$dateTime = new \DateTime();
$dateArray = [
$translator->trans($dateTime->format('l')),
$dateTime->format('d'),
$translator->trans($dateTime->format('F')),
$dateTime->format('H:i')
];
return $dateArray;
}
// #[Route('/', name: 'app_front_panier')]
// public function index(): Response
// {
// return $this->render('front/panier/index.html.twig', [
// 'controller_name' => 'PanierController',
// ]);
// }
/**
* @Route("/", name="app_front_panier", methods={"GET"})
*/
public function index(Security $security, ProduitRepository $produitRepository, CurrentPathService $currentPathService, TranslatorInterface $translator, BasketRepository $basketRepository): Response
{
$user = $security->getUser();
if($user instanceof User){
$basketService = new BasketService($basketRepository, $produitRepository);
$produitsGot = $basketService->getAllBaskets($user, true);
$produits = [];
$total = 0;
foreach ($produitsGot as $key => $value) {
$total += $value->getProduit()->getPrixDeVente();
$logo = $value->getProduit()->getLogo();
$produits[] = [
'id' => $value->getProduit()->getId(),
'logo' => (!is_null($logo) && !empty($logo)) ? "/uploads/images/".$logo : null,
'nom' => $value->getProduit()->getNom(),
'rom' => $value->getProduit()->getRom(),
'ram' => $value->getProduit()->getRam(),
'prix' => $value->getProduit()->getPrixDeVente(),
];
}
$groupedArray = [];
foreach ($produits as $item) {
$id = $item['id'];
if (!isset($groupedArray[$id])) {
$groupedArray[$id] = $item;
$groupedArray[$id]['quantity'] = 1;
} else {
$groupedArray[$id]['quantity']++;
}
}
// Convert associative array to indexed array
$produits = array_values($groupedArray);
// return $this->render('back/produit/catalogue/cart.html.twig', [
return $this->render('front/panier/index.html.twig', [
'isCart' => true,
'produits' => $produits,
'basket' => [
'nbPanier' => count($basketService->getAllBaskets($user)),
'total' => number_format($total, 0, ',', ' ')
],
'dateArray' => $this->dateArray($translator),
'classes' => $currentPathService->classes(),
]);
}
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/valider", name="app_front_panier_validate", methods={"POST"})
*/
public function validate(Security $security, BasketRepository $basketRepository, CommandeRepository $commandeRepository, DetailCommandeRepository $detailCommandeRepository, ProduitRepository $produitRepository): Response
{
$user = $security->getUser();
if($user instanceof User){
$userBaskets = $basketRepository->findBy(['user' => $user]);
$commande = new Commande();
$commande->setDate(new \DateTime());
$commande->setUser($user);
$commandeRepository->add($commande, true);
$basketQteParProduit = [];
foreach ($userBaskets as $basket) {
$produitId = $basket->getProduit()->getId();
if (isset($basketQteParProduit[$produitId])) {
$basketQteParProduit[
$produitId]['quantity'] += 1;
} else {
$basketQteParProduit[$produitId] = [
'produit' => $produitId,
'quantity' => 1,
];
}
$basketRepository->remove($basket, true);
}
foreach($basketQteParProduit as $produitData) {
$detailCommande = new DetailCommande();
$produit = $produitRepository->find($produitData['produit']);
$detailCommande->setProduit($produit);
$detailCommande->setQuantite($produitData['quantity']);
$detailCommande->setCommande($commande);
$detailCommandeRepository->add($detailCommande, true);
}
return $this->json(['success' => "Panier validé avec succès!"]);
}
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
}