src/Controller/SiteConfigurateurController.php line 43

Open in your IDE?
  1. <?php 
  2. declare(strict_types=1);
  3. namespace App\Controller;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Sylius\Bundle\CustomerBundle\Form\Type\CustomerType;
  11. use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
  12. use App\Entity\SiteShop;
  13. use App\Entity\Customer\Customer;
  14. use Sylius\Component\Core\Repository\ProductVariantRepositoryInterface;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. use Sylius\Component\Taxation\Calculator\CalculatorInterface;
  17. use Sylius\Component\Order\Context\CartContextInterface;
  18. use Sylius\Component\Channel\Context\ChannelContextInterface;
  19. use App\Entity\SiteSacZipAccessories;
  20. use App\Entity\Product\ProductVariant;
  21. use App\Entity\SiteSacZipSelection;
  22. class SiteConfigurateurController extends AbstractController
  23. {
  24.     // protected $container;
  25.     // public function __construct(
  26.        
  27.     //     ContainerInterface $container,
  28.     // ){
  29.     //     // parent::__construct();
  30.     //     $this->container = $container;
  31.     // }
  32.     public function indexAction(
  33.         Breadcrumbs $breadcrumbs,
  34.         ProductVariantRepositoryInterface $productVariantRepository
  35.     ): Response
  36.     {
  37.         $em $this->get('doctrine')->getManager();
  38.         
  39.         $breadcrumbs->addRouteItem("sylius.ui.home""sylius_shop_homepage");
  40.         $breadcrumbs->addItem("Configurateur Sac & Zip");
  41.         // Selectionne les produits de base (en dur)
  42.         // Grande besace : BASE.BES.CAR.G
  43.         // Petite besace : BASE.BES.P
  44.         // Sac compagnon : BASE.SAC.COM
  45.         // --
  46.         // Rabat grande besace : RABA.BES.CAR.G.MILL.POI
  47.         // Rabat petite besace : RABA.BES.P
  48.         // Rabat besace petit nuage : RABA.BES.PET.
  49.         // Rabat sac compagnon : RABA.SAC.COM
  50.         // --
  51.         // Petite Lanière : LANI.P
  52.         // Grande lanière : LANI.G
  53.         // FIXME leftJoin translation variant 
  54.         $variants $productVariantRepository->createQueryBuilder('v')
  55.         ->addSelect('product')
  56.         ->leftJoin('v.product''product')
  57.         ->andWhere('v.enabled = 1')
  58.         ->andWhere('v.onHand >= 5')
  59.         ->getQuery()
  60.         ->getResult();
  61.         // Besaces
  62.         $grandeBesaces array_values(array_filter($variants, function ($row) {
  63.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['base']['grand_besace'/*&& $row->getBadge() == 'newest'*/;
  64.         }));
  65.         usort($grandeBesaces, function($a$b) {
  66.             if($a->getBadge() == 'newest'){
  67.                 return -1;
  68.             }else{
  69.                 return $a->getOnHand() < $b->getOnHand();
  70.             }
  71.            
  72.         });        
  73.         foreach($grandeBesaces as $key => $grandeBesace){         
  74.             foreach ($grandeBesace->getOptionValues() as $optionValue) {
  75.                 $grandeBesace->collection $optionValue->getTranslation()->getValue();
  76.             }
  77.         }
  78.         
  79.         $petiteBesaces array_values(array_filter($variants, function ($row) {
  80.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['base']['petite_besace'];
  81.         }));
  82.         usort($petiteBesaces, function($a$b) {
  83.             if($a->getBadge() == 'newest'){
  84.                 return -1;
  85.             }else{
  86.                 return $a->getOnHand() < $b->getOnHand();
  87.             }
  88.            
  89.         });
  90.         foreach($petiteBesaces as $key => $petiteBesace){         
  91.             foreach ($petiteBesace->getOptionValues() as $optionValue) {
  92.                 $petiteBesace->collection $optionValue->getTranslation()->getValue();
  93.             }
  94.         }
  95.         $sacCompagnons array_values(array_filter($variants, function ($row) {
  96.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['base']['sac_compagnon'];
  97.         }));
  98.         usort($sacCompagnons, function($a$b) {
  99.             if($a->getBadge() == 'newest'){
  100.                 return -1;
  101.             }else{
  102.                 return $a->getOnHand() < $b->getOnHand();
  103.             }
  104.            
  105.         });
  106.         foreach($sacCompagnons as $key => $sacCompagnon){         
  107.             foreach ($sacCompagnon->getOptionValues() as $optionValue) {
  108.                 $sacCompagnon->collection $optionValue->getTranslation()->getValue();
  109.             }
  110.         }
  111.         // Rabats
  112.         $rabatGrandeBesaces array_values(array_filter($variants, function ($row) {
  113.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['rabat']['rabat_grande_besace'];
  114.         }));
  115.         usort($rabatGrandeBesaces, function($a$b) {
  116.             if($a->getBadge() == 'newest'){
  117.                 return -1;
  118.             }else{
  119.                 return $a->getOnHand() < $b->getOnHand();
  120.             }
  121.            
  122.         });
  123.         foreach($rabatGrandeBesaces as $key => $rabatGrandeBesace){         
  124.             foreach ($rabatGrandeBesace->getOptionValues() as $optionValue) {
  125.                 $rabatGrandeBesace->collection $optionValue->getTranslation()->getValue();
  126.             }
  127.         }
  128.         $rabatPetiteBesaces array_values(array_filter($variants, function ($row) {
  129.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['rabat']['rabat_petite_besace'];
  130.         }));
  131.         usort($rabatPetiteBesaces, function($a$b) {
  132.             if($a->getBadge() == 'newest'){
  133.                 return -1;
  134.             }else{
  135.                 return $a->getOnHand() < $b->getOnHand();
  136.             }
  137.            
  138.         });
  139.         foreach($rabatPetiteBesaces as $key => $rabatPetiteBesace){         
  140.             foreach ($rabatPetiteBesace->getOptionValues() as $optionValue) {
  141.                 $rabatPetiteBesace->collection $optionValue->getTranslation()->getValue();
  142.             }
  143.         }
  144.         $rabatBesacePetitNuages array_values(array_filter($variants, function ($row) {
  145.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['rabat']['rabat_besace_petite_nuage'];
  146.         }));
  147.         usort($rabatBesacePetitNuages, function($a$b) {
  148.             if($a->getBadge() == 'newest'){
  149.                 return -1;
  150.             }else{
  151.                 return $a->getOnHand() < $b->getOnHand();
  152.             }
  153.            
  154.         });
  155.         foreach($rabatBesacePetitNuages as $key => $rabatBesacePetitNuage){         
  156.             foreach ($rabatBesacePetitNuage->getOptionValues() as $optionValue) {
  157.                 $rabatBesacePetitNuage->collection $optionValue->getTranslation()->getValue();
  158.             }
  159.         }
  160.         $rabatSacCompagnons array_values(array_filter($variants, function ($row) {
  161.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['rabat']['rabat_sac_compagnon'];
  162.         }));
  163.         usort($rabatSacCompagnons, function($a$b) {
  164.             if($a->getBadge() == 'newest'){
  165.                 return -1;
  166.             }else{
  167.                 return $a->getOnHand() < $b->getOnHand();
  168.             }
  169.            
  170.         });
  171.         foreach($rabatSacCompagnons as $key => $rabatSacCompagnon){         
  172.             foreach ($rabatSacCompagnon->getOptionValues() as $optionValue) {
  173.                 $rabatSacCompagnon->collection $optionValue->getTranslation()->getValue();
  174.             }
  175.         }
  176.         // Lanières
  177.         $petiteLanieres array_values(array_filter($variants, function ($row) {
  178.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['laniere']['petite_laniere'];
  179.         }));
  180.         usort($petiteLanieres, function($a$b) {
  181.             if($a->getBadge() == 'newest'){
  182.                 return -1;
  183.             }else{
  184.                 return $a->getOnHand() < $b->getOnHand();
  185.             }
  186.            
  187.         });
  188.         foreach($petiteLanieres as $key => $petiteLaniere){         
  189.             foreach ($petiteLaniere->getOptionValues() as $optionValue) {
  190.                 $petiteLaniere->collection $optionValue->getTranslation()->getValue();
  191.             }
  192.         }
  193.         $grandeLanieres array_values(array_filter($variants, function ($row) {
  194.             return $row->getProduct()->getCode() == ProductVariant::SACZIP_FORMES['laniere']['grande_laniere'];
  195.         }));
  196.         usort($grandeLanieres, function($a$b) {
  197.             if($a->getBadge() == 'newest'){
  198.                 return -1;
  199.             }else{
  200.                 return $a->getOnHand() < $b->getOnHand();
  201.             }
  202.            
  203.         });
  204.         foreach($grandeLanieres as $key => $grandeLaniere){         
  205.             foreach ($grandeLaniere->getOptionValues() as $optionValue) {
  206.                 $grandeLaniere->collection $optionValue->getTranslation()->getValue();
  207.             }
  208.         }
  209.         // Accessoires (administrable)
  210.         $accessoriesRepository $em->getRepository(SiteSacZipAccessories::class);
  211.         $accessoriesShapes $accessoriesRepository->findBy(array(), ['position' => 'ASC']);
  212.         $accessories $productVariantRepository->createQueryBuilder('v')
  213.         ->addSelect('product')
  214.         ->leftJoin('v.product''product')
  215.         ->andWhere('v.enabled = 1')
  216.         ->andWhere('v.onHand >= 5')
  217.         ->andWhere('product.id IN (:ids)')        
  218.         ->setParameter('ids'array_map(function ($row) {
  219.             return $row->getProduct()->getId();
  220.         }, $accessoriesShapes))
  221.         ->getQuery()
  222.         ->getResult();
  223.         usort($accessories, function($a$b) {
  224.             if($a->getBadge() == 'newest'){
  225.                 return -1;
  226.             }else{
  227.                 return $a->getOnHand() < $b->getOnHand();
  228.             }
  229.            
  230.         });
  231.         foreach($accessories as $key => $accessorie){         
  232.             foreach ($accessorie->getOptionValues() as $optionValue) {
  233.                 $accessorie->collection $optionValue->getTranslation()->getValue();
  234.             }
  235.         }
  236.         return $this->render('site_configurateur_index.html.twig', [
  237.             'grandeBesaces' => $grandeBesaces,
  238.             'petiteBesaces' => $petiteBesaces,
  239.             'sacCompagnons' => $sacCompagnons,
  240.             'rabatGrandeBesaces' => $rabatGrandeBesaces,
  241.             'rabatPetiteBesaces' => $rabatPetiteBesaces,
  242.             'rabatBesacePetitNuages' => $rabatBesacePetitNuages,
  243.             'rabatSacCompagnons' => $rabatSacCompagnons,
  244.             'petiteLanieres' => $petiteLanieres,
  245.             'grandeLanieres' => $grandeLanieres,
  246.             'accessoriesFormes' => $accessoriesShapes,
  247.             'accessories' => $accessories
  248.         ]);
  249.     }
  250.     public function refreshAction(
  251.         Request $request,
  252.         ChannelContextInterface $channelContext,
  253.         ProductVariantRepositoryInterface $productVariantRepository
  254.     ): JsonResponse
  255.     {
  256.         $productsIds = (array) @json_decode($request->request->get('data'), true);
  257.         $channel $channelContext->getChannel();
  258.         $variants = [];
  259.         
  260.         if (count($productsIds) > 0) {
  261.             $variants $productVariantRepository->findBy([
  262.                 'id' => $productsIds
  263.             ]);
  264.         }
  265.         $total 0;
  266.         foreach ($variants as $variant) {
  267.             $total += $variant->getChannelPricingForChannel($channel)->getPrice();
  268.         }
  269.         
  270.         return new JsonResponse([
  271.             'products' => $this->render('site_configurateur_produits.html.twig', [
  272.                 'products' => $variants,
  273.             ])->getContent(),
  274.             'total' => $this->render('site_configurateur_addtocart.html.twig', [
  275.                 'total' => $total,                
  276.             ])->getContent(),
  277.         ]);   
  278.     }
  279.     public function addToCartAction(
  280.         Request $request,
  281.         CartContextInterface $cartContext,
  282.         ProductVariantRepositoryInterface $productVariantRepository,
  283.         ContainerInterface $container,
  284.     ): JsonResponse
  285.     {
  286.         $cart $cartContext->getCart();
  287.         $productsIds = (array) @json_decode($request->request->get('data'), true);
  288.         if (count($productsIds) > 0) {
  289.             $variants $productVariantRepository->findBy([
  290.                 'id' => $productsIds
  291.             ]);
  292.             foreach ($variants as $variant) {
  293.                 // Ajout au panier
  294.                 $orderItem $container->get('sylius.factory.order_item')->createNew();
  295.                 $orderItem->setVariant($variant);
  296.                 $container->get('sylius.order_item_quantity_modifier')->modify($orderItem1);
  297.                 $cart->addItem($orderItem);
  298.             }
  299.         }
  300.         // Recalcul des promotions
  301.         $container->get('sylius.order_processing.order_processor')->process($cart);
  302.         $cartManager $container->get('sylius.manager.order');
  303.         $cartManager->persist($cart);
  304.         $cartManager->flush();
  305.         $amount 0;
  306.         $total 0;
  307.         $diff 0;
  308.         $progress 0;
  309.         $cdts $container->get('sylius.repository.promotion')->findOneByCode('FREE_DELIVERY')->getRules();
  310.         foreach($cdts as $cdt){
  311.            
  312.             if( $cdt->getType() == 'item_total'){
  313.                 $amount $cdt->getConfiguration()['ppmc']['amount'];
  314.                 $total $cart->getTotal();   
  315.                 $diff $amount-$total;   
  316.                 $progress $total $amount 100;        
  317.             }
  318.         }  
  319.         
  320.         
  321.         return new JsonResponse([
  322.             'produits' => $this->render('@SyliusShop/Webapic/panier/panier-produits.html.twig', [
  323.                 'cart' => $cart,
  324.             ]),
  325.             'total' => $this->render('@SyliusShop/Webapic/panier/panier-total.html.twig', [
  326.                 'cart' => $cart,
  327.             ]),
  328.             'top' => $this->render('@SyliusShop/Webapic/panier/panier-top.html.twig', [
  329.                 'cart' => $cart,
  330.             ]),
  331.         ]);  
  332.     } 
  333.     public function randomAction(Request $requestEntityManagerInterface $em): JsonResponse
  334.     {
  335.         // Selectionne une combinaison aléatoirement 
  336.         // avec prise en compte des stocks
  337.         $combinaison $em->getRepository(SiteSacZipSelection::class)
  338.         ->createQueryBuilder('s')
  339.         ->leftJoin('s.productVariantBase''productVariantBase')
  340.         ->leftJoin('s.productVariantFlap''productVariantFlap')
  341.         ->leftJoin('s.productVariantAccessory''productVariantAccessory')
  342.         ->andWhere('productVariantBase.onHand >= 5')
  343.         ->andWhere('productVariantFlap.onHand >= 5')
  344.         ->andWhere('productVariantAccessory.onHand >= 5')
  345.         ->andWhere('productVariantBase.enabled = 1')
  346.         ->andWhere('productVariantFlap.enabled = 1')
  347.         ->andWhere('productVariantAccessory.enabled = 1')
  348.         ->andWhere('s.enabled = 1')
  349.         ->orderBy('RAND()')
  350.         ->setMaxResults(1)
  351.         ->getQuery()
  352.         ->getOneOrNullResult();
  353.         // Pour éviter d'avoir 0 résultat, on prend même ceux qui ne sont pas en stock
  354.         if (empty($combinaison)) {
  355.             $combinaison $em->getRepository(SiteSacZipSelection::class)
  356.             ->createQueryBuilder('s')
  357.             ->andWhere('s.enabled = 1')
  358.             ->orderBy('RAND()')
  359.             ->setMaxResults(1)
  360.             ->getQuery()
  361.             ->getOneOrNullResult();
  362.         }
  363.         // Renvoyer la bonne combinaison en fonction de la forme de base selectionnée
  364.         // forme 1 = Base grande besace = BASE.BES.CAR.G
  365.         // forme 2 = Base petite besace = BASE.BES.P
  366.         // forme 3 = Base compagnon = BASE.SAC.COM
  367.         $data = [];
  368.   
  369.         if ($combinaison->getProductVariantBase()->getProduct()->getCode() == 'BASE.BES.CAR.G') {
  370.             $data = [
  371.                 'forme' => 1,
  372.                 'colori-base1' => $combinaison->getProductVariantBase()->getId(),
  373.                 'rabat1' => $combinaison->getProductVariantFlap()->getId(),
  374.                 'accessoire' => $combinaison->getProductVariantAccessory()->getId()
  375.             ];
  376.         } else if ($combinaison->getProductVariantBase()->getProduct()->getCode() == 'BASE.BES.P') {
  377.             $data = [
  378.                 'forme' => 2,
  379.                 'colori-base2' => $combinaison->getProductVariantBase()->getId(),
  380.                 'rabat2' => $combinaison->getProductVariantFlap()->getId(),
  381.                 'accessoire' => $combinaison->getProductVariantAccessory()->getId()
  382.             ];
  383.         } else {
  384.             $laniereId 0;
  385.             if (empty($combinaison->getProductVariantStrap()) == false) {
  386.                 $laniereId $combinaison->getProductVariantStrap()->getId();
  387.             }
  388.             $data = [
  389.                 'forme' => 3,
  390.                 'colori-base3' => $combinaison->getProductVariantBase()->getId(),
  391.                 'rabat3' => $combinaison->getProductVariantFlap()->getId(),
  392.                 'laniere3' => $laniereId,
  393.                 'accessoire' => $combinaison->getProductVariantAccessory()->getId()
  394.             ];
  395.         }
  396.         return new JsonResponse([
  397.             'random' => $data
  398.         ]);   
  399.     }
  400. }