<?php namespace Lc\ShopBundle\Controller\Frontend ; use App\Entity\ReductionCredit; use App\Form\Frontend\OrderProductsType; use Doctrine\ORM\EntityManagerInterface; use Lc\ShopBundle\Context\MerchantUtilsInterface; use Lc\ShopBundle\Context\OrderProductInterface; use Lc\ShopBundle\Context\OrderReductionCartInterface; use Lc\ShopBundle\Context\OrderReductionCreditInterface; use Lc\ShopBundle\Context\OrderUtilsInterface; use Lc\ShopBundle\Context\ProductFamilyInterface; use Lc\ShopBundle\Context\ReductionCartInterface; use Lc\ShopBundle\Model\OrderReductionCart; use Lc\ShopBundle\Model\ProductFamily; use Lc\ShopBundle\Services\UserUtils; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Security; class CartController extends BaseController { protected $orderUtils ; protected $userUtils ; protected $router ; protected $productFamilyRepository ; protected $orderProductRepository ; protected $productFamily ; protected $orderProducts = [] ; public function __construct(EntityManagerInterface $em, Security $security, MerchantUtilsInterface $merchantUtils, OrderUtilsInterface $orderUtils, UserUtils $userUtils, UrlGeneratorInterface $router) { parent::__construct($em, $security, $merchantUtils); $this->orderUtils = $orderUtils ; $this->userUtils = $userUtils ; $this->router = $router ; $this->productFamilyRepository = $this->em->getRepository($this->em->getClassMetaData(ProductFamilyInterface::class)->getName()) ; $this->orderProductRepository = $this->em->getRepository($this->em->getClassMetaData(OrderProductInterface::class)->getName()) ; } public function addProductFamily(Request $request) { $user = $this->security->getUser() ; $visitor = $this->userUtils->getVisitorCurrent() ; $return = [] ; $data = $request->request->all() ; if(isset($data['order_products']['id_product_family'])) { $idProductFamily = $data['order_products']['id_product_family'] ; $this->productFamily = $this->productFamilyRepository->find($idProductFamily) ; // alerte si cookies non acceptés if (!$user && !$visitor) { $this->addFlash('error', 'Vous devez <a href="'.$this->router->generate('frontend_page', ['devAlias' => 'politique-de-confidentialite']).'">accepter les cookies</a> ou vous <a href="'.$this->router->generate('fos_user_security_login').'">connecter</a> pour ajouter un produit.'); return false ; } if($this->productFamily) { $form = $this->createForm(OrderProductsType::class, ['id_product_family' => $this->productFamily->getId()]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $orderShop = $this->orderUtils->getCartCurrent() ; $data = $form->getData() ; foreach($data as $orderProduct) { if($orderProduct instanceof OrderProductInterface) { $addOrderProduct = $this->orderUtils->addOrderProduct($orderShop, $orderProduct) ; if($addOrderProduct && $orderProduct->getQuantityOrder() > 0) { $this->orderProducts[] = $orderProduct ; } } } } } } return new JsonResponse($return) ; } public function redirectToReferer($request) { $referer = $request->headers->get('referer'); if($referer) { return $this->redirect($referer); } else { return $this->redirectToRoute('frontend_order_cart'); } } public function deleteReductionCart(Request $request) { $id = $request->get('id') ; $orderReductionCartRepository = $this->em->getRepository($this->em->getClassMetadata(OrderReductionCartInterface::class)->getName()) ; $orderReductionCart = $orderReductionCartRepository->findOneById((int) $id) ; $orderShop = $this->orderUtils->getCartCurrent() ; if($orderReductionCart && $orderShop->getOrderReductionCarts() && $orderShop->getOrderReductionCarts()->contains($orderReductionCart)) { $this->em->remove($orderReductionCart) ; $this->em->flush() ; $this->addFlash('success', 'La réduction a bien été supprimée de votre panier.') ; } else { $this->addFlash('error', 'Une erreur est survenue lors de la suppression de la réduction. ') ; } return $this->redirectToReferer($request) ; } public function addReductionCredit(Request $request) { $id = $request->get('id') ; $orderShop = $this->orderUtils->getCartCurrent() ; $user = $this->security->getUser() ; $reductionCreditRepository = $this->em->getRepository(ReductionCredit::class) ; $reductionCredit = $reductionCreditRepository->find($id) ; if($orderShop && $user && $reductionCredit && $this->orderUtils->isReductionCreditAllowAddToOrder($orderShop, $reductionCredit) && !$this->orderUtils->isReductionCreditAddedToOrder($orderShop, $reductionCredit)) { $this->orderUtils->createOrderReductionCredit($orderShop, $reductionCredit) ; $this->addFlash('success', 'Votre avoir a bien été ajouté à votre panier.') ; } else { $this->addFlash('error', "Impossible d'effectuer cette action"); } return $this->redirectToReferer($request) ; } public function deleteReductionCredit(Request $request) { $id = $request->get('id') ; $orderReductionCreditRepository = $this->em->getRepository($this->em->getClassMetadata(OrderReductionCreditInterface::class)->getName()) ; $orderReductionCredit = $orderReductionCreditRepository->findOneById((int) $id) ; $orderShop = $this->orderUtils->getCartCurrent() ; if($orderReductionCredit && $orderShop->getOrderReductionCredits() && $orderShop->getOrderReductionCredits()->contains($orderReductionCredit)) { $this->em->remove($orderReductionCredit) ; $this->em->flush() ; $this->addFlash('success', 'Votre avoir a bien été supprimé de votre panier.') ; } else { $this->addFlash('error', 'Une erreur est survenue lors de la suppression de votre avoir. ') ; } $referer = $request->headers->get('referer'); if($referer) { return $this->redirect($referer); } else { return $this->redirectToRoute('frontend_order_cart'); } } }