src/Controller/Admin/AdminProductsController.php line 155

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller\Admin;
  3. use Acme\SudcmsBundle\Controller\AdminEcommerce\Exception;
  4. use Acme\SudcmsBundle\Entity\EcoAttributes;
  5. use Acme\SudcmsBundle\Entity\EcoAttributesModels;
  6. use Acme\SudcmsBundle\Entity\EcoAttributesReferences;
  7. use Acme\SudcmsBundle\Entity\EcoCategories;
  8. use Acme\SudcmsBundle\Entity\EcoLabels;
  9. use Acme\SudcmsBundle\Entity\EcoMarks;
  10. use Acme\SudcmsBundle\Entity\EcoProducts;
  11. use Acme\SudcmsBundle\Entity\EcoProductsBlocks;
  12. use Acme\SudcmsBundle\Entity\EcoProductsBlocksMedias;
  13. use Acme\SudcmsBundle\Entity\EcoProductsBundle;
  14. use Acme\SudcmsBundle\Entity\EcoProductsCategories;
  15. use Acme\SudcmsBundle\Entity\EcoProductsCombination;
  16. use Acme\SudcmsBundle\Entity\EcoProductsLabels;
  17. use Acme\SudcmsBundle\Entity\EcoProductsMedias;
  18. use Acme\SudcmsBundle\Entity\EcoProductsReferences;
  19. use Acme\SudcmsBundle\Entity\EcoProviders;
  20. use Acme\SudcmsBundle\Entity\Site;
  21. use Acme\SudcmsBundle\Form\Ecommerce\ProductReferenceType;
  22. use Acme\SudcmsBundle\Form\Ecommerce\ProductType;
  23. use Acme\SudcmsBundle\Repository\EcoAttributesModelsRepository;
  24. use Acme\SudcmsBundle\Repository\EcoAttributesReferencesRepository;
  25. use Acme\SudcmsBundle\Repository\EcoAttributesRepository;
  26. use Acme\SudcmsBundle\Repository\EcoCategoriesRepository;
  27. use Acme\SudcmsBundle\Repository\EcoCustomersFavoritesProdRepository;
  28. use Acme\SudcmsBundle\Repository\EcoLabelsRepository;
  29. use Acme\SudcmsBundle\Repository\EcoMarksRepository;
  30. use Acme\SudcmsBundle\Repository\EcoOrdersRepository;
  31. use Acme\SudcmsBundle\Repository\EcoProductsBlocksMediasRepository;
  32. use Acme\SudcmsBundle\Repository\EcoProductsBlocksRepository;
  33. use Acme\SudcmsBundle\Repository\EcoProductsBundleRepository;
  34. use Acme\SudcmsBundle\Repository\EcoProductsCategoriesRepository;
  35. use Acme\SudcmsBundle\Repository\EcoProductsCombinationRepository;
  36. use Acme\SudcmsBundle\Repository\EcoProductsLabelsRepository;
  37. use Acme\SudcmsBundle\Repository\EcoProductsReferencesRepository;
  38. use Acme\SudcmsBundle\Repository\EcoProductsRepository;
  39. use Acme\SudcmsBundle\Repository\EcoProvidersRepository;
  40. use Acme\SudcmsBundle\Repository\EcoSettingsRepository;
  41. use Acme\SudcmsBundle\Repository\OptionsRepository;
  42. use Acme\SudcmsBundle\Service\ApiService;
  43. use Acme\SudcmsBundle\Service\FileService;
  44. use Acme\SudcmsBundle\Service\FlashNotificationAjax;
  45. use Acme\SudcmsBundle\Service\OtideaUtils;
  46. use Doctrine\ORM\EntityManagerInterface;
  47. use Knp\Component\Pager\PaginatorInterface;
  48. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  49. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  50. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  51. use Symfony\Component\Filesystem\Filesystem;
  52. use Symfony\Component\HttpFoundation\JsonResponse;
  53. use Symfony\Component\HttpFoundation\Request;
  54. use Symfony\Component\HttpFoundation\Response;
  55. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  56. use Symfony\Component\HttpFoundation\Session\Session;
  57. use Symfony\Component\HttpKernel\KernelInterface;
  58. use Symfony\Component\Routing\Annotation\Route;
  59. use Twig\Environment;
  60. class AdminProductsController extends AbstractController
  61. {
  62.     private $session;
  63.     private $entityManager;
  64.     private $filesystem;
  65.     private $postMaxSize;
  66.     private $autorizedImages = ['jpg''jpeg''png'];
  67.     private $autorizedFiles = ['jpg''jpeg''png''pdf''doc''docx''xls''xlsx''ppt''pptx'];
  68.     private $pathFiles 'public/medias_front/products'// chemin vers les fichiers uploadés
  69.     private $monthList = [
  70.         => 'Janvier',
  71.         => 'Février',
  72.         => 'Mars',
  73.         => 'Avril',
  74.         => 'Mai',
  75.         => 'Juin',
  76.         => 'Juillet',
  77.         => 'Août',
  78.         => 'Septembre',
  79.         10 => 'Octobre',
  80.         11 => 'Novembre',
  81.         12 => 'Décembre'
  82.     ];
  83.     private $maxFileSize// taille fichier max - 30 * 1024 * 1024
  84.     private $twig null;
  85.     private $fileService;
  86.     public function __construct(
  87.         private ApiService     $apiService,
  88.         EntityManagerInterface $entityManager,
  89.         KernelInterface        $appKernel,
  90.         OptionsRepository      $repoOpt,
  91.         Environment            $twig,
  92.         FileService            $fileService,
  93.         Filesystem             $filesystem
  94.     )
  95.     {
  96.         if (!IS_ECOMMERCE) {
  97.             header('Location: ' WEBSITEROOT '/admin');
  98.             exit;
  99.         }
  100.         $this->session = new Session();
  101.         $this->entityManager $entityManager;
  102.         $site $this->entityManager->getRepository(Site::class)->find($this->session->get('admin_site_uid'));
  103.         $this->pathFiles $this->session->get('admin_site_uid') > '../' $site->getProjectDirectory() . '/public/medias_front/products' 'public/medias_front/products';
  104.         $this->maxFileSize substr(ini_get('post_max_size'), 0, -1) * 1024 1024;
  105.         $this->fileService $fileService;
  106.         $this->filesystem $filesystem;
  107.         $this->twig $twig;
  108.         $this->postMaxSize substr(ini_get('post_max_size'), 0, -1);
  109.         $this->moduleName "admin_products";
  110.         $optionsModule $repoOpt->findBy(['option_name' => $this->moduleName], ['option_order' => 'ASC']);
  111.         $this->twig->addGlobal("optionsModule"$optionsModule);
  112.         //Création des dossiers dossier pour l'upload des médias du module
  113.         $directory[] = $appKernel->getProjectDir() . '/' $this->pathFiles '/';
  114.         $directory[] = $appKernel->getProjectDir() . '/' $this->pathFiles '/tmpFiles';
  115.         foreach ($directory as $dir) {
  116.             if (!file_exists($dir)) {
  117.                 mkdir($dir755);
  118.             }
  119.         }
  120.     }
  121.     #[Route(path'/admin/products/list'name'admin_products')]
  122.     public function index(
  123.         Request                         $request,
  124.         EcoProductsRepository           $repoProduct,
  125.         EcoCategoriesRepository         $repoCategs,
  126.         EcoProductsReferencesRepository $repoRef,
  127.         PaginatorInterface              $paginator,
  128.         EcoSettingsRepository           $ecoSettingsRepository
  129.     )
  130.     {
  131.         $ecoSettings $ecoSettingsRepository->findOneBy(['siteId' => CURRENT_SITE_ID]);
  132.         $products $repoProduct->findBy(
  133.             ['siteId' => $this->session->get('admin_site_uid')],
  134.             ['id' => 'DESC']
  135.         );
  136.         return $this->render('admin/admin_products/index.html.twig', [
  137.             'productsList' => $products,
  138.             'stockManagement' => $ecoSettings->getStockManagement(),
  139.             'referencesList' => $repoRef->findAll(),
  140.             'categsList' => $repoCategs->findByEcoCategories($this->session->get('admin_site_uid')),
  141.         ]);
  142.     }
  143.     #[Route(path'/admin/product_editing/{prod_id}'name'admin_product_edit'defaults: ['prod_id' => 0])]
  144.     public function product_editing(
  145.         Request                         $request,
  146.         EcoProductsRepository           $repoProduct,
  147.         EcoCategoriesRepository         $repoCateg,
  148.         EcoMarksRepository              $repoMarks,
  149.         EcoProvidersRepository          $repoProviders,
  150.         EcoLabelsRepository             $repoLabels,
  151.         EcoProductsLabelsRepository     $repoProdLabels,
  152.         EcoProductsReferencesRepository $referencesRepository,
  153.                                         $prod_id
  154.     )
  155.     {
  156.         $categList $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')]);
  157.         $markList $repoMarks->findBy(['siteId' => $this->session->get('admin_site_uid')]);
  158.         $labels $repoLabels->findAll();
  159.         $productLabels null;
  160.         $references $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
  161.             ['product_id' => $prod_id],
  162.             ['ref_sequence' => 'ASC']
  163.         );
  164.         if ($categList == null || $markList == null) {
  165.             $this->addFlash('danger'"Il doit exister au moins une catégorie et une marque pour ajouter un produit.");
  166.             return $this->redirectToRoute('admin_products');
  167.         }
  168.         $product = new EcoProducts;
  169.         $picture null;
  170.         if ($prod_id 0) {
  171.             $product $repoProduct->find($prod_id);
  172.             $picture $product->getProdPicture();
  173.             $productLabels $repoProdLabels->findBy(['product_id' => $prod_id]);
  174.         }
  175.         //Récupération du nombre de références du produit pour savoir si c'est un produit multiple ou single
  176.         $refProd $referencesRepository->findBy(['product_id' => $product->getId()]);
  177.         $form $this->createForm(ProductType::class, $product, [
  178.             'categoriesList' => $categList,
  179.             'marksList' => $markList,
  180.             'labels' => $labels,
  181.             'productLabels' => $productLabels,
  182.             'providersList' => $repoProviders->findBy(['siteId' => $this->session->get('admin_site_uid')]),
  183.         ]);
  184.         $form->handleRequest($request);
  185.         if ($form->isSubmitted() && $form->isValid()) {
  186.             if ($prod_id == 0) {
  187.                 $product->setProdCreationDate(new \DateTime());
  188.             }
  189.             $product->setSiteId($this->session->get('admin_site_uid'));
  190.             //Récupération des anciens labels du produit
  191.             $oldLabels $repoProdLabels->findBy(['product_id' => $prod_id]);
  192.             //On supprime tous les anciens labels avant d'enregistrer les nouveaux
  193.             foreach ($oldLabels as $label) {
  194.                 $this->entityManager->remove($label);
  195.             }
  196.             //On enregistre les nouveaux labels si il y en a
  197.             if (isset($request->get('product')['label_id'])) {
  198.                 foreach ($request->get('product')['label_id'] as $labelGet) {
  199.                     $label = new EcoProductsLabels;
  200.                     $label->setLabelId($labelGet);
  201.                     $label->setProductId($prod_id);
  202.                     $this->entityManager->persist($label);
  203.                 }
  204.             }
  205.             if ($references) {
  206.                 if ($references[0]->getTypeOdyssee() == 'soin' && $product->getIsDeliverable() == 'sur-place') {
  207.                     $this->addFlash('danger''Un type de soin ne peut pas inclure le retrait sur place.');
  208.                     return $this->redirectToRoute('admin_product_edit', array('prod_id' => $product->getId()));
  209.                 }
  210.             }
  211.             foreach ($request->files->get('product')['prod_picture'] as $key => $file) {
  212.                 // upload du fichier
  213.                 if ($file !== null && $key 4) {
  214.                     $upload $this->fileService->startUpload(
  215.                         [
  216.                             "fileData" => $file,
  217.                             "oldFileName" => $picture,
  218.                             "fileDestination" => $this->getParameter(
  219.                                 "upload_products_" $this->session->get('admin_site_uid')
  220.                             ),
  221.                             "autorizedExtensions" => $this->autorizedImages,
  222.                             "createWebp" => true
  223.                         ]
  224.                     );
  225.                     // upload OK
  226.                     if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
  227.                             $upload['filename']
  228.                         )) {
  229.                         if ($key == 0) {
  230.                             $product->setProdPicture($upload['filename']);
  231.                         }
  232.                         $media = new EcoProductsMedias();
  233.                         $media->setMediaName($upload['filename']);
  234.                         $product->addMedia($media);
  235.                         $this->entityManager->persist($media);
  236.                         //$this->entityManager->flush();
  237.                     // upload KO avec message perso
  238.                     elseif (isset($upload['error_msg'])) {
  239.                         $product->setProdPicture($picture);
  240.                         $errorMsg $upload['error_msg'];
  241.                     } // upload KO avec message générique
  242.                     else {
  243.                         $product->setProdPicture($picture);
  244.                         $errorMsg "Une erreur s'est produite lors de l'enregistrement du fichier";
  245.                     }
  246.                 }
  247.             }
  248.             //On récupère le radio PROD-TYPE qui a été rendu manuellement dans le template
  249.             //            $product->setProdType($request->request->get('prod_type'));
  250.             $product->setProdType('single');
  251.             $product->setProdPriceType('vente');
  252.             $product->setprovider($repoProviders->find($request->get('product')['provider_id']));
  253.             try {
  254.                 $this->entityManager->persist($product);
  255.                 $this->entityManager->flush();
  256.             } catch (Exception $e) {
  257.                 $errorMsg "Une erreur s'est produite lors de l'enregistrement";
  258.             }
  259.             // il y a eu une erreur
  260.             if (isset($errorMsg)) {
  261.                 $this->addFlash('danger'$errorMsg);
  262.             } // pas d'erreur
  263.             else {
  264.                 $this->addFlash('success'"enregistré avec succès");
  265.             }
  266.             return $this->redirectToRoute('admin_product_edit', array('prod_id' => $product->getId()));
  267.         }
  268.         $this->checkOdysseePrice($product->getId());
  269.         return $this->render('admin/admin_products/product_editing.html.twig', [
  270.             'form' => $form->createView(),
  271.             'product' => $repoProduct->find($prod_id),
  272.             'product_id' => $prod_id,
  273.             'autorizedImages' => $this->autorizedImages,
  274.             'nbRefProd' => sizeof($refProd),
  275.             'typeProdut' => $product->getProdType(),
  276.             'referencesList' => $references
  277.         ]);
  278.     }
  279.     private function checkOdysseePrice($prodId): void
  280.     {
  281.         if ($prodId 0) {
  282.             if ($this->apiService->testConnexion()) {
  283.                 $reference $this->entityManager->getRepository(EcoProductsReferences::class)->findOneBy(
  284.                     ['product_id' => $prodId]
  285.                 );
  286.                 if ($reference) {
  287.                     $priceUpdated false;
  288.                     if ($reference) {
  289.                         $priceUpdated false;
  290.                         if ($reference->getTypeOdyssee() == 'soin') {
  291.                             $odysseeProduct $this->apiService->rechSoinResaSpaParCodeProduit(
  292.                                 $reference->getRefReference()
  293.                             );
  294.                             if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit_Soin'}) {
  295.                                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
  296.                                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
  297.                                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit_Soin'});
  298.                                 $priceUpdated true;
  299.                             }
  300.                         } elseif ($reference->getTypeOdyssee() == 'produit') {
  301.                             $odysseeProduct ODYSSEE_TYPE == 'CURE' $this->apiService->rechProduitResaCureParCode(
  302.                                 $reference->getRefReference()
  303.                             ) : $this->apiService->rechProduitResaSpaParCode($reference->getRefReference());
  304.                             if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit'}) {
  305.                                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
  306.                                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
  307.                                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
  308.                                 $priceUpdated true;
  309.                             }
  310.                         } elseif ($reference->getTypeOdyssee() == 'bkdo') {
  311.                             $odysseeProduct $this->apiService->rechProduitBkdoParCode($reference->getRefReference());
  312.                             if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit'}) {
  313.                                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
  314.                                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
  315.                                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
  316.                                 $priceUpdated true;
  317.                             }
  318.                         }
  319.                         if ($priceUpdated) {
  320.                             try {
  321.                                 $prod $this->entityManager->getRepository(EcoProducts::class)->find($prodId);
  322.                                 $prod->setProdSellingPrice($reference->getRefSellingPrice());
  323.                                 $prod->setProdReferencePrice($reference->getRefReferencePrice());
  324.                                 $reference->setRefLastupdateDate(new \DateTime());
  325.                                 $this->entityManager->persist($reference);
  326.                                 $this->entityManager->persist($prod);
  327.                                 $this->entityManager->flush();
  328.                                 $this->addFlash('success'"Le prix a été mis à jour avec Odyssée");
  329.                             } catch (Exception $e) {
  330.                                 $this->addFlash(
  331.                                     'danger',
  332.                                     "Une erreur s'est produite lors de la récupération du prix sur Odyssée"
  333.                                 );
  334.                             }
  335.                         }
  336.                     }
  337.                 } else {
  338.                     $this->addFlash('danger''Une erreur est survenue avec l\'API<br>Mise à jour avec Odyssée impossible');
  339.                 }
  340.             }
  341.         }
  342.     }
  343.     #[Route(path'/admin/products/remove-picture/{id}'name'admin_product_remove_picture'defaults: ['id' => ''])]
  344.     public function removePicture($id)
  345.     {
  346.         if ($id 0) {
  347.             try {
  348.                 $product $this->entityManager->getRepository(EcoProducts::class)->find($id);
  349.                 $filename $product->getProdPicture();
  350.                 $product->setProdPicture(null);
  351.                 $medias $this->entityManager->getRepository(EcoProductsMedias::class)->findBy(['product' => $id]);
  352.                 foreach ($medias as $media) {
  353.                     $mediaName $media->getMediaName();
  354.                     if ($mediaName != null && $mediaName != "" && is_string($mediaName) && $this->filesystem->exists(
  355.                             $file $this->getParameter(
  356.                                     'upload_products_' $this->session->get('admin_site_uid')
  357.                                 ) . "/" $mediaName
  358.                         )) {
  359.                         $this->fileService->removeFile([
  360.                             "filePath" => $this->getParameter(
  361.                                 'upload_products_' $this->session->get('admin_site_uid')
  362.                             ),
  363.                             "filename" => $mediaName,
  364.                         ]);
  365.                     }
  366.                     $product->removeMedia($media);
  367.                     $this->entityManager->persist($product);
  368.                 }
  369.                 $this->entityManager->persist($product);
  370.                 $this->entityManager->flush();
  371.                 if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
  372.                         $file $this->getParameter(
  373.                                 'upload_products_' $this->session->get('admin_site_uid')
  374.                             ) . "/" $filename
  375.                     )) {
  376.                     $this->fileService->removeFile([
  377.                         "filePath" => $this->getParameter('upload_products_' $this->session->get('admin_site_uid')),
  378.                         "filename" => $filename,
  379.                     ]);
  380.                 }
  381.                 $this->addFlash('success'"Les illustrations ont été supprimées avec succès");
  382.             } catch (Exception $e) {
  383.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression de l'illustration");
  384.             }
  385.         }
  386.         return $this->redirectToRoute('admin_product_edit', ['prod_id' => $id]);
  387.     }
  388.     #[Route(path'/admin/products/axDisplayCategories'options: ['expose' => true])]
  389.     public function axDisplayCategories(
  390.         Request                         $request,
  391.         EcoCategoriesRepository         $repoCateg,
  392.         EcoProductsCategoriesRepository $repoLinkCateg,
  393.         EcoProductsRepository           $repoProduct
  394.     )
  395.     {
  396.         if ($request->isXmlHttpRequest()) {
  397.             $renderModale $this->renderView('admin/admin_products/tpl_categories.html.twig', [
  398.                 'modalTitle' => "Sélection des catégories secondaires",
  399.                 'categList' => $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')],
  400.                     ['categ_parent_id' => 'ASC''categ_sequence' => 'ASC']),
  401.                 'linkCategList' => $repoLinkCateg->findBy(['product_id' => $request->get('prod_id')]),
  402.                 'product' => $repoProduct->find($request->get('prod_id')),
  403.                 'prod_id' => $request->get('prod_id')
  404.             ]);
  405.             return new JsonResponse([
  406.                 'status' => true,
  407.                 'modal' => html_entity_decode($renderModale),
  408.             ]);
  409.         }
  410.         return new JsonResponse([
  411.             'status' => false,
  412.         ]);
  413.     }
  414.     #[Route(path'/admin/products/axCheckCategory'options: ['expose' => true])]
  415.     public function axCheckCategory(Request $requestEcoProductsCategoriesRepository $repoLinkCateg)
  416.     {
  417.         if ($request->isXmlHttpRequest()) {
  418.             if ($request->get('prod_id') && $request->get('categ_id')) {
  419.                 $categ $repoLinkCateg->findBy([
  420.                     'category_id' => $request->get('categ_id'),
  421.                     'product_id' => $request->get('prod_id')
  422.                 ]);
  423.                 if (isset($categ[0]) && $categ[0]->getId() !== null) {
  424.                     $this->entityManager->remove($categ[0]);
  425.                 } else {
  426.                     $categ = new EcoProductsCategories;
  427.                     $categ->setCategoryId($request->get('categ_id'));
  428.                     $categ->setProductId($request->get('prod_id'));
  429.                     $this->entityManager->persist($categ);
  430.                 }
  431.                 try {
  432.                     $this->entityManager->flush();
  433.                     return new JsonResponse([
  434.                         'status' => true,
  435.                     ]);
  436.                 } catch (Exception $e) {
  437.                     return new JsonResponse([
  438.                         'status' => false,
  439.                     ]);
  440.                 }
  441.             }
  442.         }
  443.         return new JsonResponse([
  444.             'status' => false,
  445.         ]);
  446.     }
  447.     #[Route(path'/admin/product_references/{prod_id}'name'admin_product_references'defaults: ['prod_id' => 0])]
  448.     public function product_references(
  449.         Request                           $request,
  450.         EcoProductsRepository             $repoProduct,
  451.         EcoProductsReferencesRepository   $repoRef,
  452.         EcoAttributesRepository           $repoAttributes,
  453.         EcoAttributesModelsRepository     $repoModels,
  454.         EcoAttributesReferencesRepository $repoLink,
  455.                                           $prod_id
  456.     )
  457.     {
  458.         //Gestion des attributs
  459.         if ($request->get('attributs')) {
  460.             //Liste des combinaisons
  461.             $combinations $this->getAttributesCombination($request->get('attributs'));
  462.             //Générer les références
  463.             $this->generateReferences(
  464.                 $prod_id,
  465.                 $combinations,
  466.                 $repoAttributes->findAll(),
  467.                 $repoLink->findByLinkAttributesByProduct($prod_id)
  468.             );
  469.         }
  470.         $this->checkOdysseePrice($prod_id);
  471.         return $this->render('admin/admin_products/product_references.html.twig', [
  472.             'product_id' => $prod_id,
  473.             'product' => $repoProduct->find($prod_id),
  474.             'referencesList' => $repoRef->findBy(['product_id' => $prod_id], ['ref_sequence' => 'ASC']),
  475.             'attributesList' => $repoAttributes->findAll(),
  476.             'attributesModelsList' => $repoModels->findAll(),
  477.         ]);
  478.     }
  479.     private function generateReferences($product_id$combinationArray$attributesList$linkAttributesRef)
  480.     {
  481.         if (is_array($combinationArray) && sizeof($combinationArray) > 0) {
  482.             foreach ($combinationArray as $combinations) {
  483.                 //Sans combinaison
  484.                 if (!is_array($combinations)) {
  485.                     $this->setSimpleCombination($product_id$combinations$linkAttributesRef$attributesList);
  486.                     //Combinaison d'attribut
  487.                 } else {
  488.                     $this->setMultipleCombination($product_id$combinations$linkAttributesRef$attributesList);
  489.                 }
  490.             }
  491.         }
  492.     }
  493.     private function setMultipleCombination($product_id$combinations$linkAttributesRef$attributesList)
  494.     {
  495.         foreach ($combinations as $combination) {
  496.             //Si la combinaison existe déjà on passe à la suivante
  497.             $validateDuplication $this->validateDuplicateCombination($combination$linkAttributesRef);
  498.             if (!$validateDuplication) {
  499.                 continue;
  500.             }
  501.             //Générer l'intitulé de la référence
  502.             $attributs explode('-'$combination);
  503.             $entitled $refReference '';
  504.             foreach ($attributs as $attr_id) {
  505.                 foreach ($attributesList as $elmt) {
  506.                     if ($elmt->getId() == $attr_id) {
  507.                         $entitled .= $elmt->getAttribute() . ' ';
  508.                         $refReference .= $elmt->getAttribute() . '-';
  509.                     }
  510.                 }
  511.             }
  512.             //Création de la référence
  513.             $reference = new EcoProductsReferences;
  514.             $reference->setProductId($product_id);
  515.             $reference->setRefEntitled($entitled);
  516.             $reference->setRefReference(substr(uniqid() . '-' $refReference0, -1));
  517.             $reference->setRefReferencePrice(0);
  518.             $reference->setRefBuyingPrice(0);
  519.             $reference->setRefSellingPrice(0);
  520.             $reference->setRefTva(1.20);
  521.             $reference->setIsReservable(false);
  522.             $reference->setRefOutOfOrder(false);
  523.             $reference->setRefLastupdateDate(new \DateTime());
  524.             $this->entityManager->persist($reference);
  525.             $this->entityManager->flush();
  526.             $prod $this->entityManager->getRepository(EcoProducts::class)->find($reference->getProductId());
  527.             $nbRef $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
  528.                 ['product_id' => $prod->getId()]
  529.             );
  530.             if (count($nbRef) <= 1) {
  531.                 $prod->setProdType('single');
  532.                 $this->entityManager->flush($prod);
  533.             } else {
  534.                 $prod->setProdType('multiple');
  535.                 $this->entityManager->flush($prod);
  536.             }
  537.             //liaisons des combinaisons d'attributs
  538.             $attributs explode('-'$combination);
  539.             foreach ($attributs as $attr_id) {
  540.                 $link = new EcoAttributesReferences;
  541.                 $link->setAttributeId($attr_id);
  542.                 $link->setReferenceId($reference->getId());
  543.                 $this->entityManager->persist($link);
  544.             }
  545.             $this->entityManager->flush();
  546.         }
  547.     }
  548.     private function setSimpleCombination($product_id$attr_id$linkAttributesRef$attributesList)
  549.     {
  550.         $validateDuplication $this->validateDuplicateCombination($attr_id$linkAttributesRef);
  551.         if ($validateDuplication) {
  552.             //Générer l'intitulé de la référence
  553.             $entitled '';
  554.             foreach ($attributesList as $elmt) {
  555.                 if ($elmt->getId() == $attr_id) {
  556.                     $entitled $elmt->getAttribute() . ' ';
  557.                 }
  558.             }
  559.             //Création de la référence
  560.             $reference = new EcoProductsReferences;
  561.             $reference->setProductId($product_id);
  562.             $reference->setRefEntitled($entitled);
  563.             $reference->setRefReference(substr(uniqid() . '-' $entitled0, -1));
  564.             $reference->setRefReferencePrice(0);
  565.             $reference->setRefBuyingPrice(0);
  566.             $reference->setRefSellingPrice(0);
  567.             $reference->setRefTva(1.20);
  568.             $reference->setIsReservable(false);
  569.             $reference->setRefOutOfOrder(false);
  570.             $reference->setRefLastupdateDate(new \DateTime());
  571.             $this->entityManager->persist($reference);
  572.             $this->entityManager->flush();
  573.             $prod $this->entityManager->getRepository(EcoProducts::class)->find($reference->getProductId());
  574.             $nbRef $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
  575.                 ['product_id' => $prod->getId()]
  576.             );
  577.             if (count($nbRef) <= 1) {
  578.                 $prod->setProdType('single');
  579.                 $this->entityManager->flush($prod);
  580.             } else {
  581.                 $prod->setProdType('multiple');
  582.                 $this->entityManager->flush($prod);
  583.             }
  584.             //liaisons des combinaisons d'attributs
  585.             $link = new EcoAttributesReferences;
  586.             $link->setAttributeId($attr_id);
  587.             $link->setReferenceId($reference->getId());
  588.             $this->entityManager->persist($link);
  589.             $this->entityManager->flush();
  590.         }
  591.     }
  592.     /**
  593.      * Retourne vrai si la combinaison n'existe pas
  594.      * @param string $combination
  595.      * @param array $bdd
  596.      */
  597.     private function validateDuplicateCombination($combination$bdd)
  598.     {
  599.         $attributes explode('-'$combination);
  600.         $attributesCount sizeof($attributes);
  601.         foreach ($bdd as $combinationBdd) {
  602.             $count 0;
  603.             foreach ($combinationBdd as $attr_id) {
  604.                 if (in_array($attr_id$attributes)) {
  605.                     $count++;
  606.                 }
  607.             }
  608.             if ($count == $attributesCount) {
  609.                 return false;
  610.             }
  611.         }
  612.         return true;
  613.     }
  614.     /**
  615.      * Retourne la liste des combinaisons à générer
  616.      * @param array $attributes
  617.      */
  618.     private function getAttributesCombination($attributes)
  619.     {
  620.         //Liste des modèles
  621.         $models = array();
  622.         foreach ($attributes as $attribut) {
  623.             list($model_id$attribute_id) = explode('-'$attribut);
  624.             $models[] = $model_id;
  625.         }
  626.         //Liste des modèles uniques
  627.         $models_unique array_unique($models);
  628.         $attributesModelsList = array();
  629.         $resultCombination '';
  630.         $results = array();
  631.         //Tableau des attributs segmenté par modèle
  632.         foreach ($models_unique as $model_id) {
  633.             $attributesModelsList[] = $this->getAttributesSelectedByModel($model_id$attributes);
  634.         }
  635.         $attrSize sizeof($attributesModelsList);
  636.         foreach ($attributesModelsList[0] as $key => $attr_id) { //liste array
  637.             $resultCombination .= $attr_id;
  638.             for ($i 1$i $attrSize$i++) {
  639.                 $resultCombination $this->recursiveAttributes($attributesModelsList[$i], $resultCombination);
  640.             }
  641.             $results[] = $resultCombination;
  642.             $resultCombination '';
  643.         }
  644.         //        dd($attributes, $models_unique, $attributesModelsList, $results);
  645.         return $results;
  646.     }
  647.     /**
  648.      * Retourne les combinaisons d'attributs de façon récursice
  649.      * @param array $attributesList
  650.      * @param array $resultCombination
  651.      * @return array
  652.      */
  653.     private function recursiveAttributes($attributesList$resultCombination)
  654.     {
  655.         $result = array();
  656.         if (is_array($resultCombination)) {
  657.             foreach ($resultCombination as $combinaison) {
  658.                 foreach ($attributesList as $attr2_id) {
  659.                     $result[] = $combinaison '-' $attr2_id;
  660.                 }
  661.             }
  662.         } else {
  663.             foreach ($attributesList as $attr2_id) {
  664.                 $result[] = $resultCombination '-' $attr2_id;
  665.             }
  666.         }
  667.         return $result;
  668.     }
  669.     /**
  670.      * Retourne la liste des attributs par modèle
  671.      * @param int $modelId
  672.      * @param array $attributs
  673.      * @return array
  674.      */
  675.     private function getAttributesSelectedByModel($modelId$attributs)
  676.     {
  677.         $result = array();
  678.         foreach ($attributs as $attribut) {
  679.             list($model_id$attribute_id) = explode('-'$attribut);
  680.             if ($model_id == $modelId) {
  681.                 $result[] = $attribute_id;
  682.             }
  683.         }
  684.         return $result;
  685.     }
  686.     #[Route(path'/admin/product/reference_remove/{id}'name'admin_reference_remove'defaults: ['id' => 0])]
  687.     public function remove_reference(
  688.         Request                           $request,
  689.         EcoProductsReferencesRepository   $repoReference,
  690.         EcoAttributesReferencesRepository $ecoAttributesReferencesRepository,
  691.         EcoProductsRepository             $repoProduct,
  692.                                           $id
  693.     )
  694.     {
  695.         $reference = new EcoProductsReferences;
  696.         if ($id 0) {
  697.             $reference $repoReference->find($id);
  698.             try {
  699.                 $attrRef $ecoAttributesReferencesRepository->findBy(['reference_id' => $reference->getId()]);
  700.                 foreach ($attrRef as $ref) {
  701.                     $this->entityManager->remove($ref);
  702.                 }
  703.                 $this->entityManager->remove($reference);
  704.                 $this->entityManager->flush();
  705.                 $prod $repoProduct->find($reference->getProductId());
  706.                 $nbRef $repoReference->findBy(['product_id' => $prod->getId()]);
  707.                 if (count($nbRef) <= 1) {
  708.                     $prod->setProdType('single');
  709.                     $this->entityManager->flush($prod);
  710.                 } else {
  711.                     $prod->setProdType('multiple');
  712.                     $this->entityManager->flush($prod);
  713.                 }
  714.                 $this->addFlash('success'"Suppression avec succès");
  715.             } catch (Exception $e) {
  716.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  717.             }
  718.         }
  719.         return $this->redirectToRoute('admin_product_references', array('prod_id' => $reference->getProductId()));
  720.     }
  721.     #[Route(path'/admin/product_reference_type_odyssee/axRefOdyssee'name'admin_ax_ref_odyssee')]
  722.     public function axRefOdyssee(Request $requestApiService $apiService): JsonResponse
  723.     {
  724.         if ($request->isXmlHttpRequest() && in_array($request->get('type'), ['produit''soin''bkdo''bkdovalue'])) {
  725.             $type $request->get('type');
  726.             $result = [];
  727.             if (ODYSSEE_TYPE == 'CURE' || $type == 'produit') {
  728.                 if (ODYSSEE_TYPE == 'CURE') {
  729.                     $datas $apiService->listerProduitResaCure();
  730.                 } else {
  731.                     $vente $apiService->listerProduitVenteSpa();
  732.                     $resa $apiService->listerProduitResaSpa();
  733.                     $datas array_unique(array_merge($vente$resa), SORT_REGULAR); // Elimine les doublons
  734.                 }
  735.                 foreach ($datas as $data) {
  736.                     $result[] = [
  737.                         'id' => $data->{'Code_Produit'},
  738.                         'name' => $data->{'Libelle_Produit'}
  739.                     ];
  740.                 }
  741.             } elseif ($type == 'soin') {
  742.                 $vente $apiService->listerSoinVenteSpa();
  743.                 $resa $apiService->listerSoinResaSpa();
  744.                 $datas array_unique(array_merge($vente$resa), SORT_REGULAR); // Elimine les doublons
  745.                 foreach ($datas as $data) {
  746.                     $result[] = [
  747.                         'id' => $data->{'Code_Produit_Soin'},
  748.                         'name' => $data->{'Libelle_Produit_Soin'}
  749.                     ];
  750.                 }
  751.             } elseif ($type == 'bkdo') {
  752.                 $datas $apiService->listerProduitBkdo();
  753.                 foreach ($datas as $data) {
  754.                     $result[] = [
  755.                         'id' => $data->{'Code_Produit'},
  756.                         'name' => $data->{'Libelle_Produit'}
  757.                     ];
  758.                 }
  759.             } elseif ($type == 'bkdovalue') {
  760.                 $result $type;
  761.             }
  762.             return new JsonResponse(
  763.                 [
  764.                     'status' => true,
  765.                     'result' => $result
  766.                 ]
  767.             );
  768.         }
  769.         return new JsonResponse(
  770.             [
  771.                 'status' => false
  772.             ]
  773.         );
  774.     }
  775.     #[Route(path'/admin/product_reference_edit/{prod_id}/{ref_id}'name'admin_product_reference_edit'defaults: [
  776.         'prod_id' => 0,
  777.         'ref_id' => 0
  778.     ])]
  779.     public function product_reference_edit(
  780.         Request                         $request,
  781.         EcoProductsReferencesRepository $repoReference,
  782.         EcoProductsRepository           $repoProduct,
  783.         EcoSettingsRepository           $ecoSettingsRepository,
  784.                                         $prod_id 0,
  785.                                         $ref_id 0
  786.     )
  787.     {
  788.         $reference = new EcoProductsReferences;
  789.         if ($ref_id 0) {
  790.             $reference $repoReference->find($ref_id);
  791.         }
  792.         $ecoSettings $ecoSettingsRepository->findOneBy(['siteId' => CURRENT_SITE_ID]);
  793.         $stockManagement $ecoSettings->getStockManagement();
  794.         $prod $repoProduct->find($prod_id);
  795.         $form $this->createForm(ProductReferenceType::class, $reference, [
  796.             'stockManagement' => $stockManagement
  797.         ]);
  798.         $form->handleRequest($request);
  799.         if ($form->isSubmitted() && $form->isValid()) {
  800.             if ($ref_id == 0) {
  801.                 $reference->setProductId($prod_id);
  802.             }
  803.             // Récupère les informations de l'API Odyssée pour le prix et la TVA en fonction du type
  804.             if ($reference->getTypeOdyssee() == 'produit') {
  805.                 $odysseeProduct ODYSSEE_TYPE == 'CURE' $this->apiService->rechProduitResaCureParCode(
  806.                     $request->request->get('reference')
  807.                 ) : $this->apiService->rechProduitResaSpaParCode($request->request->get('reference'));
  808.                 if (!$odysseeProduct) {
  809.                     $this->addFlash(
  810.                         'danger',
  811.                         "Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
  812.                     );
  813.                     return $this->redirectToRoute(
  814.                         'admin_product_reference_edit',
  815.                         array('prod_id' => $prod_id'ref_id' => $reference->getId())
  816.                     );
  817.                 }
  818.                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
  819.                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
  820.                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
  821.                 $reference->setRefEntitled(
  822.                     $odysseeProduct[0]->{'Libelle_Produit'}
  823.                 ); // L'intitulé du produit de base est automatiquement repris
  824.                 $reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
  825.             } elseif ($reference->getTypeOdyssee() == 'soin') {
  826.                 $odysseeProduct $this->apiService->rechSoinResaSpaParCodeProduit($request->request->get('reference'));
  827.                 if (!$odysseeProduct) {
  828.                     $this->addFlash(
  829.                         'danger',
  830.                         "Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
  831.                     );
  832.                     return $this->redirectToRoute(
  833.                         'admin_product_reference_edit',
  834.                         array('prod_id' => $prod_id'ref_id' => $reference->getId())
  835.                     );
  836.                 }
  837.                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
  838.                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
  839.                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit_Soin'});
  840.                 $reference->setRefEntitled(
  841.                     $odysseeProduct[0]->{'Libelle_Produit_Soin'}
  842.                 ); // L'intitulé du produit de base est automatiquement repris
  843.                 $reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
  844. //                $reference->setMaxByOrder(1);
  845.             } elseif ($reference->getTypeOdyssee() == 'bkdo') {
  846.                 $odysseeProduct $this->apiService->rechProduitBkdoParCode($request->request->get('reference'));
  847.                 if (!$odysseeProduct) {
  848.                     $this->addFlash(
  849.                         'danger',
  850.                         "Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
  851.                     );
  852.                     return $this->redirectToRoute(
  853.                         'admin_product_reference_edit',
  854.                         array('prod_id' => $prod_id'ref_id' => $reference->getId())
  855.                     );
  856.                 }
  857.                 $reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
  858.                 $reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
  859.                 $reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
  860.                 $reference->setRefEntitled(
  861.                     $odysseeProduct[0]->{'Libelle_Produit'}
  862.                 ); // L'intitulé du produit de base est automatiquement repris
  863.                 $reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
  864.             } elseif ($reference->getTypeOdyssee() == 'bkdovalue') {
  865.                 $reference->setRefReferencePrice(0);
  866.                 $reference->setRefSellingPrice(0);
  867.                 $reference->setRefTva(20);
  868.                 $reference->setRefEntitled('BON CADEAU VALEUR');
  869.                 $reference->setRefReference('bkdovalue'); // Récupère la référence Odyssée
  870. //                $reference->setMaxByOrder(1);
  871.                 $reference->setRefQuantity(null);
  872.             }
  873.             //            $referenceType = $this->getReferencePrice($reference->getRefSellingPrice(), $reference->getRefPromoPrice(),
  874.             //                                                      $reference->getRefSoldePrice());
  875.             //            $reference->setRefReferencePrice($referenceType['reference_price']);
  876.             //            $reference->setRefPriceType($referenceType['price_type']);
  877.             $reference->setRefPriceType('vente');
  878.             $reference->setRefLastupdateDate(new \DateTime());
  879.             $reference->setRefOutOfOrder(false);
  880.             if ($ecoSettings->getUnavailableProductNoStock() && ($form->get('ref_quantity')->getData() == || $form->get('ref_quantity')->getData() == null)) {
  881.                 $reference->setRefOutOfOrder(true);
  882.             } else {
  883.                 if ($ecoSettings->getUnavailableProductNoStock() && $form->get('ref_quantity')->getData() > 0) {
  884.                     $reference->setRefOutOfOrder(false);
  885.                 }
  886.             }
  887.             $prod->setProdSellingPrice($reference->getRefReferencePrice());
  888.             $prod->setProdReferencePrice($reference->getRefReferencePrice());
  889.             $ref $reference->getTypeOdyssee() == 'bkdovalue' $reference->getTypeOdyssee() : $request->request->get(
  890.                 'reference'
  891.             );
  892.             //Vérification sur la duplication de la référence
  893.             $resultReferences $repoReference->findBy(['ref_reference' => $ref]);
  894.             // Si la référence précédemment enregistrée est contenue dans le tableau des références, on l'enlève
  895.             if (is_array($resultReferences) && sizeof($resultReferences) >= && in_array(
  896.                     $reference,
  897.                     $resultReferences
  898.                 )) {
  899.                 $key array_search($reference$resultReferences);
  900.                 unset($resultReferences[$key]);
  901.             }
  902.             // Si la référence existe déjà sur un autre article, on affiche un message d'erreur
  903.             if (is_array($resultReferences) && sizeof($resultReferences) >= && $reference->getRefReference()) {
  904.                 $product $this->entityManager->getRepository(EcoProducts::class)->find(
  905.                     $resultReferences[0]->getProductId()
  906.                 );
  907.                 if ($product && $product->getSiteId() == $this->session->get('admin_site_uid')) {
  908.                     $this->addFlash('danger'"Cette référence existe déjà sur un autre article");
  909.                     return $this->redirectToRoute(
  910.                         'admin_product_reference_edit',
  911.                         array('prod_id' => $prod_id'ref_id' => $reference->getId())
  912.                     );
  913.                 }
  914.             }
  915.             try {
  916.                 $reference->setIsReservable(
  917.                     $request->request->get('product_reference')['isReservable'] == '0' false true
  918.                 );
  919.                 $this->entityManager->persist($reference);
  920.                 $this->entityManager->persist($prod);
  921.                 $this->entityManager->flush();
  922.                 $nbRef $repoReference->findBy(['product_id' => $prod_id]);
  923.                 if (count($nbRef) <= 1) {
  924.                     $prod->setProdType('single');
  925.                 } else {
  926.                     $prod->setProdType('multiple');
  927.                 }
  928.                 $this->entityManager->flush($prod);
  929.                 //Enregistrement du tarif sur le produit
  930.                 //                $this->setProductReferencesPrices($repoProduct, $prod_id,
  931.                 //                                                  $repoReference->findByProductWithReferencesPrices($prod_id));
  932.                 $this->addFlash('success'"enregistré avec succès");
  933.             } catch (Exception $ex) {
  934.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement");
  935.             }
  936.             return $this->redirectToRoute(
  937.                 'admin_product_reference_edit',
  938.                 array('prod_id' => $prod_id'ref_id' => $reference->getId())
  939.             );
  940.         }
  941.         $this->checkOdysseePrice($prod_id);
  942.         return $this->render('admin/admin_products/product_reference_edit.html.twig', [
  943.             'stockManagement' => $stockManagement,
  944.             'product_id' => $prod_id,
  945.             'reference' => $repoReference->find($ref_id),
  946.             'form' => $form->createView(),
  947.             'product' => $prod,
  948.             'referencesList' => [$reference]
  949.         ]);
  950.     }
  951.     /**
  952.      * Retourne le prix de vente réel
  953.      * @param double $selling_price
  954.      * @param double $promo_price
  955.      * @param double $solde_price
  956.      * @return array
  957.      */
  958.     private function getReferencePrice($selling_price$promo_price$solde_price)
  959.     {
  960.         if ($solde_price 0) {
  961.             return [
  962.                 'reference_price' => $solde_price,
  963.                 'price_type' => 'solde',
  964.             ];
  965.         } elseif ($promo_price 0) {
  966.             return [
  967.                 'reference_price' => $promo_price,
  968.                 'price_type' => 'promo',
  969.             ];
  970.         }
  971.         return [
  972.             'reference_price' => $selling_price,
  973.             'price_type' => 'vente',
  974.         ];
  975.     }
  976.     /**
  977.      * Enregistre le prix d'un produit en fonction de ses références
  978.      * @param array $references
  979.      * @return array
  980.      */
  981.     private function setProductReferencesPrices($repoProduct$prod_id$references)
  982.     {
  983.         $product $repoProduct->find($prod_id);
  984.         $product->setProdPriceType($references['ref_price_type']);
  985.         $product->setProdReferencePrice($references['ref_reference_price']);
  986.         $product->setProdSellingPrice($references['ref_selling_price']);
  987.         $this->entityManager->persist($product);
  988.         $this->entityManager->flush();
  989.     }
  990.     #[Route(path'/admin/products/categories/{parent_id}'name'admin_products_categories'defaults: ['parent_id' => 0])]
  991.     public function categories(Request $requestEcoCategoriesRepository $repoCateg$parent_id)
  992.     {
  993.         if ($request->get('categ_entitled')) {
  994.             if ($request->get('categ_id') > 0) {
  995.                 $categ $repoCateg->find($request->get('categ_id'));
  996.                 $oldBandeau $categ->getCategHeadband();
  997.             } else {
  998.                 $oldBandeau null;
  999.                 $categ = new EcoCategories();
  1000.             }
  1001.             $categ->setCategEntitled($request->get('categ_entitled'));
  1002.             //            $categ->setCategParentId($request->get('categ_parent_id'));
  1003.             $categ->setCategParentId(0);
  1004.             $categ->setCategDescription($request->get('categ_description'));
  1005.             $categ->setCategSequence(0);
  1006.             //            $categ->setCategIsonline($request->get('categ_isonline'));
  1007.             $categ->setCategIsonline(true);
  1008.             $categ->setSiteId($this->session->get('admin_site_uid'));
  1009.             // upload du fichier
  1010.             if ($request->files->get("categ_headband") !== null) {
  1011.                 $upload $this->fileService->startUpload(
  1012.                     [
  1013.                         "fileData" => $request->files->get("categ_headband"),
  1014.                         "oldFileName" => $oldBandeau,
  1015.                         "fileDestination" => $this->getParameter(
  1016.                             "upload_products_" $this->session->get('admin_site_uid')
  1017.                         ),
  1018.                         "autorizedExtensions" => $this->autorizedImages,
  1019.                         "createWebp" => true
  1020.                     ]
  1021.                 );
  1022.                 // upload OK
  1023.                 if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
  1024.                         $upload['filename']
  1025.                     )) {
  1026.                     $categ->setCategHeadband($upload['filename']);
  1027.                 } // upload KO avec message perso
  1028.                 elseif (isset($upload['error_msg'])) {
  1029.                     $categ->setCategHeadband($oldBandeau);
  1030.                     $errorMsg $upload['error_msg'];
  1031.                 } // upload KO avec message générique
  1032.                 else {
  1033.                     $categ->setCategHeadband($oldBandeau);
  1034.                     $errorMsg "Une erreur s'est produite lors de l'enregistrement du fichier";
  1035.                 }
  1036.             }
  1037.             try {
  1038.                 $this->entityManager->persist($categ);
  1039.                 $this->entityManager->flush();
  1040.             } catch (Exception $e) {
  1041.                 $errorMsg "Une erreur s'est produite lors de l'enregistrement de la catégorie";
  1042.             }
  1043.             // il y a eu une erreur
  1044.             if (isset($errorMsg)) {
  1045.                 $this->addFlash('danger'$errorMsg);
  1046.             } // pas d'erreur
  1047.             else {
  1048.                 $this->addFlash('success'"La catégorie a bien été enregistrée");
  1049.             }
  1050.         }
  1051.         return $this->render('admin/admin_products/products_categories.html.twig', [
  1052.             'parent_id' => $parent_id,
  1053.             'mainCateg' => $repoCateg->find($parent_id),
  1054.             'categList' => $repoCateg->findBy([
  1055.                 'siteId' => $this->session->get('admin_site_uid'),
  1056.                 'categ_parent_id' => $parent_id
  1057.             ], ['categ_sequence' => 'ASC']),
  1058.             'allCategList' => $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')])
  1059.         ]);
  1060.     }
  1061.     /**
  1062.      * @param Request $request
  1063.      */
  1064.     #[Route(path'/admin/products/axDisplayFormCategory'options: ['expose' => true])]
  1065.     public function axDisplayFormCategory(Request $requestEcoCategoriesRepository $repoCateg)
  1066.     {
  1067.         if ($request->isXmlHttpRequest()) {
  1068.             $category = new EcoCategories;
  1069.             if ($request->get('categ_id') > 0) {
  1070.                 $category $repoCateg->find($request->get('categ_id'));
  1071.             }
  1072.             $renderModale $this->renderView('admin/admin_products/tpl_form_category.html.twig', [
  1073.                 'modalTitle' => 'Catégorie',
  1074.                 'categ_id' => $request->get('categ_id'),
  1075.                 'categ' => $category,
  1076.                 'categList' => $repoCateg->findBy([
  1077.                     'siteId' => $this->session->get('admin_site_uid'),
  1078.                     'categ_parent_id' => 0
  1079.                 ], ['categ_sequence' => 'ASC']),
  1080.                 'autorizedMedias' => $this->autorizedImages,
  1081.             ]);
  1082.             return new JsonResponse([
  1083.                 'status' => true,
  1084.                 'modal' => html_entity_decode($renderModale),
  1085.             ]);
  1086.         }
  1087.         return new JsonResponse([
  1088.             'status' => false,
  1089.         ]);
  1090.     }
  1091.     #[Route(path'/admin/products/category/remove/{id}'name'admin_products_category_remove'defaults: ['id' => 0])]
  1092.     public function remove_category(
  1093.         Request                 $request,
  1094.         EcoCategoriesRepository $repoCateg,
  1095.         EcoProductsRepository   $ecoProductsRepository,
  1096.                                 $id
  1097.     )
  1098.     {
  1099.         $category = new EcoCategories;
  1100.         if ($id 0) {
  1101.             $category $repoCateg->find($id);
  1102.             $productInCateg $ecoProductsRepository->findBy(['category_id' => $category->getId()]);
  1103.             if ($productInCateg != null) {
  1104.                 $this->addFlash('danger'"Impossible de supprimer une catégorie possédant des produits");
  1105.                 return $this->redirectToRoute('admin_products_categories');
  1106.             }
  1107.             try {
  1108.                 $this->entityManager->remove($category);
  1109.                 $this->entityManager->flush();
  1110.                 $this->addFlash('success'"Suppression avec succès");
  1111.             } catch (Exception $e) {
  1112.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  1113.             }
  1114.         }
  1115.         return $this->redirectToRoute('admin_products_categories');
  1116.     }
  1117.     #[Route(path'/admin/products/axDisplayOrderCateg'options: ['expose' => true])]
  1118.     public function axDisplayOrderCateg(Request $requestEcoCategoriesRepository $repoCateg)
  1119.     {
  1120.         if ($request->isXmlHttpRequest()) {
  1121.             $renderModale $this->renderView('admin/admin_products/tpl_reordonner_categories.html.twig', [
  1122.                 'modalTitle' => 'Ordonner les catégories',
  1123.                 'categ_parent' => $request->get('categ_parent'),
  1124.                 'categList' => $repoCateg->findBy([
  1125.                     'siteId' => $this->session->get('admin_site_uid'),
  1126.                     'categ_parent_id' => $request->get('categ_parent')
  1127.                 ],
  1128.                     ['categ_sequence' => 'ASC'])
  1129.             ]);
  1130.             $script '';
  1131.             $script .= " initSortableCategories(); ";
  1132.             return new JsonResponse([
  1133.                 'status' => true,
  1134.                 'modal' => html_entity_decode($renderModale),
  1135.                 'script' => $script,
  1136.             ]);
  1137.         }
  1138.         return new JsonResponse([
  1139.             'status' => false,
  1140.         ]);
  1141.     }
  1142.     /**
  1143.      * @param Request $request
  1144.      */
  1145.     #[Route(path'/admin/products/axUpdateOrderCategorie'options: ['expose' => true])]
  1146.     public function axUpdateOrderCategorie(Request $request)
  1147.     {
  1148.         if ($request->isXmlHttpRequest() && $request->get('sorted')) {
  1149.             $liste explode('&'$request->get('sorted'));
  1150.             $i 1;
  1151.             foreach ($liste as $ligne) {
  1152.                 $id str_replace('sort='''$ligne);
  1153.                 $categ $this->entityManager->getRepository(EcoCategories::class)->find($id);
  1154.                 $categ->setCategSequence($i);
  1155.                 $this->entityManager->flush();
  1156.                 $i++;
  1157.             }
  1158.             return new JsonResponse([
  1159.                 'status' => true,
  1160.             ]);
  1161.         }
  1162.         return new JsonResponse([
  1163.             'status' => false,
  1164.         ]);
  1165.     }
  1166.     /**
  1167.      * @param Request $request
  1168.      */
  1169.     #[Route(path'/admin/products/axRemoveCategBandeau'options: ['expose' => true])]
  1170.     public function axRemoveCategBandeau(
  1171.         Request                 $request,
  1172.         EcoCategoriesRepository $repo,
  1173.         FlashNotificationAjax   $flash
  1174.     )
  1175.     {
  1176.         $script "";
  1177.         if ($request->isXmlHttpRequest()) {
  1178.             $categ = new EcoCategories;
  1179.             if ($request->request->get("categ_id") > 0) {
  1180.                 $categ $repo->find($request->request->get("categ_id"));
  1181.             }
  1182.             if ($categ->getId() > 0) {
  1183.                 $filename $categ->getCategHeadband();
  1184.                 if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
  1185.                         $file $this->getParameter(
  1186.                                 'upload_products_' $this->session->get('admin_site_uid')
  1187.                             ) . "/" $filename
  1188.                     )) {
  1189.                     $this->fileService->removeFile([
  1190.                         "filePath" => $this->getParameter('upload_products_' $this->session->get('admin_site_uid')),
  1191.                         "filename" => $filename,
  1192.                     ]);
  1193.                     $categ->setCategHeadband(null);
  1194.                     try {
  1195.                         $this->entityManager->persist($categ);
  1196.                         $this->entityManager->flush();
  1197.                         $msg "Le bandeau de la catégorie <b>" $categ->getCategEntitled() . "</b> a été supprimé";
  1198.                         $type "success";
  1199.                     } catch (Exception $e) {
  1200.                         $msg "Le bandeau de la catégorie <b>" $categ->getCategEntitled() . "</b> n'a pas été supprimé";
  1201.                         $type "danger";
  1202.                     }
  1203.                     return new JsonResponse([
  1204.                         'status' => true,
  1205.                         'script' => $script,
  1206.                         'flashMessage' => $flash->notification($type$msg),
  1207.                     ]);
  1208.                 }
  1209.             }
  1210.         }
  1211.         return new JsonResponse([
  1212.             'status' => false,
  1213.         ]);
  1214.     }
  1215.     #[Route(path'/admin/products/attributes_models'name'admin_products_attributes_models')]
  1216.     public function attributes_models(Request $requestEcoAttributesModelsRepository $repoModel)
  1217.     {
  1218.         if ($request->get('model')) {
  1219.             if ($request->get('model_id') > 0) {
  1220.                 $model $repoModel->find($request->get('model_id'));
  1221.             } else {
  1222.                 $model = new EcoAttributesModels();
  1223.             }
  1224.             $model->setModel($request->get('model'));
  1225.             $model->setModelType($request->get('model_type'));
  1226.             try {
  1227.                 $this->entityManager->persist($model);
  1228.                 $this->entityManager->flush();
  1229.                 $this->addFlash('success'"Le modèle d'attribut a bien été enregistrée");
  1230.             } catch (Exception $e) {
  1231.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement du modèle.");
  1232.             }
  1233.         }
  1234.         return $this->render('admin/admin_products/products_attributes_models.html.twig', [
  1235.             'modelsList' => $repoModel->findBy([], ['model' => 'ASC']),
  1236.         ]);
  1237.     }
  1238.     /**
  1239.      * @param Request $request
  1240.      */
  1241.     #[Route(path'/admin/products/axDisplayFormAttributeModel'options: ['expose' => true])]
  1242.     public function axDisplayFormAttributeModel(Request $requestEcoAttributesModelsRepository $repoModel)
  1243.     {
  1244.         if ($request->isXmlHttpRequest()) {
  1245.             $model = new EcoAttributesModels;
  1246.             if ($request->get('model_id') > 0) {
  1247.                 $model $repoModel->find($request->get('model_id'));
  1248.             }
  1249.             $renderModale $this->renderView('admin/admin_products/tpl_form_attribute_model.html.twig', [
  1250.                 'modalTitle' => "Modèle d'attribut",
  1251.                 'model_id' => $request->get('model_id'),
  1252.                 'model' => $model,
  1253.             ]);
  1254.             return new JsonResponse([
  1255.                 'status' => true,
  1256.                 'modal' => html_entity_decode($renderModale),
  1257.             ]);
  1258.         }
  1259.         return new JsonResponse([
  1260.             'status' => false,
  1261.         ]);
  1262.     }
  1263.     /**
  1264.      * @param Request $request
  1265.      */
  1266.     #[Route(path'/admin/products/axDisplayFormAttribute'options: ['expose' => true])]
  1267.     public function axDisplayFormAttribute(Request $requestEcoAttributesRepository $repoAttr)
  1268.     {
  1269.         if ($request->isXmlHttpRequest()) {
  1270.             $attribut = new EcoAttributesModels;
  1271.             if ($request->get('attr_id') > 0) {
  1272.                 $attribut $repoAttr->find($request->get('attr_id'));
  1273.             }
  1274.             $renderModale $this->renderView('admin/admin_products/tpl_form_attribute.html.twig', [
  1275.                 'modalTitle' => 'Attributs',
  1276.                 'attribut' => $attribut,
  1277.             ]);
  1278.             return new JsonResponse([
  1279.                 'status' => true,
  1280.                 'modal' => html_entity_decode($renderModale),
  1281.             ]);
  1282.         }
  1283.         return new JsonResponse([
  1284.             'status' => false,
  1285.         ]);
  1286.     }
  1287.     #[Route(path'/admin/products/attribute_model/remove/{id}'name'admin_products_attribute_model_remove'defaults: ['id' => 0])]
  1288.     public function remove_model(
  1289.         Request                         $request,
  1290.         EcoAttributesModelsRepository   $repoModel,
  1291.         EcoProductsReferencesRepository $ecoProductsReferencesRepository,
  1292.         EcoAttributesRepository         $ecoAttributesRepository,
  1293.                                         $id
  1294.     )
  1295.     {
  1296.         $model = new EcoCategories;
  1297.         if ($id 0) {
  1298.             $model $repoModel->find($id);
  1299.             $productInModel $ecoProductsReferencesRepository->findByProductsContainRef($model->getId());
  1300.             if ($productInModel != null) {
  1301.                 $this->addFlash('danger'"Impossible de supprimer un modèle possédant des produits");
  1302.                 return $this->redirectToRoute('admin_products_attributes_models');
  1303.             }
  1304.             try {
  1305.                 $attrOfModel $ecoAttributesRepository->findBy(['model_id' => $model->getId()]);
  1306.                 foreach ($attrOfModel as $attribute) {
  1307.                     $this->entityManager->remove($attribute);
  1308.                 }
  1309.                 $this->entityManager->remove($model);
  1310.                 $this->entityManager->flush();
  1311.                 $this->addFlash('success'"Suppression avec succès");
  1312.             } catch (Exception $e) {
  1313.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  1314.             }
  1315.         }
  1316.         return $this->redirectToRoute('admin_products_attributes_models');
  1317.     }
  1318.     #[Route(path'/admin/products/attributs/{model_id}'name'admin_products_attributes'defaults: ['model_id' => ''])]
  1319.     public function attributes(
  1320.         $model_id,
  1321.         Request $request,
  1322.         EcoAttributesModelsRepository $repoModel,
  1323.         EcoAttributesRepository $repoAttr
  1324.     )
  1325.     {
  1326.         if ($request->get('attributes')) {
  1327.             $attributs explode(','$request->get('attributes'));
  1328.             if (is_array($attributs) && sizeof($attributs) > 0) {
  1329.                 foreach ($attributs as $attribut) {
  1330.                     $attr = new EcoAttributes;
  1331.                     $attr->setModelId($model_id);
  1332.                     $attr->setAttribute($attribut);
  1333.                     $this->entityManager->persist($attr);
  1334.                 }
  1335.             }
  1336.             try {
  1337.                 $this->entityManager->flush();
  1338.                 $this->addFlash('success'"enregistré avec succès");
  1339.             } catch (Exception $e) {
  1340.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement");
  1341.             }
  1342.         }
  1343.         return $this->render('admin/admin_products/products_attributes.html.twig', [
  1344.             'model' => $repoModel->find($model_id),
  1345.             'attributesList' => $repoAttr->findBy(['model_id' => $model_id], ['attribute' => 'ASC']),
  1346.         ]);
  1347.     }
  1348.     #[Route(path'/admin/products/attributes_remove/{id}'name'admin_products_attribute_remove'defaults: ['id' => 0])]
  1349.     public function remove_attributes(
  1350.         Request                         $request,
  1351.         EcoAttributesRepository         $repoAttr,
  1352.         EcoProductsReferencesRepository $ecoProductsReferencesRepository,
  1353.                                         $id
  1354.     )
  1355.     {
  1356.         $attr = new EcoAttributes;
  1357.         if ($id 0) {
  1358.             $attr $repoAttr->find($id);
  1359.             $productInModel $ecoProductsReferencesRepository->findByProductsContainAttr($attr->getId());
  1360.             if ($productInModel != null) {
  1361.                 $this->addFlash('danger'"Impossible de supprimer un attribut associé à des produits");
  1362.                 return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
  1363.             }
  1364.             try {
  1365.                 $this->entityManager->remove($attr);
  1366.                 $this->entityManager->flush();
  1367.                 $this->addFlash('success'"Suppression avec succès");
  1368.             } catch (Exception $e) {
  1369.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  1370.             }
  1371.         }
  1372.         return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
  1373.     }
  1374.     #[Route(path'/admin/products/save_attribute'name'admin_products_save_attribute')]
  1375.     public function save_attribute(Request $requestEcoAttributesRepository $repoAttr)
  1376.     {
  1377.         $attr = new EcoAttributes;
  1378.         if ($request->get('attr_id') > 0) {
  1379.             $attr $repoAttr->find($request->get('attr_id'));
  1380.             $attr->setAttribute($request->get('attribute'));
  1381.             try {
  1382.                 $this->entityManager->persist($attr);
  1383.                 $this->entityManager->flush();
  1384.                 $this->addFlash('success'"enregistré avec succès");
  1385.             } catch (Exception $e) {
  1386.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement");
  1387.             }
  1388.         }
  1389.         return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
  1390.     }
  1391.     #[Route(path'/admin/product_presentation/{prod_id}'name'admin_product_presentation'defaults: ['prdo_id' => 0])]
  1392.     public function product_presentation(
  1393.         Request                 $request,
  1394.         EcoProductsRepository   $repoProduct,
  1395.         EcoCategoriesRepository $repoCateg,
  1396.         EcoMarksRepository      $repoMarks,
  1397.                                 $prod_id
  1398.     )
  1399.     {
  1400.         return $this->render('admin/admin_products/product_presentation.html.twig', [
  1401.             'product_id' => $prod_id,
  1402.             'product' => $repoProduct->find($prod_id),
  1403.             'referencesList' => $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
  1404.                 ['product_id' => $prod_id],
  1405.                 ['ref_sequence' => 'ASC']
  1406.             ),
  1407.         ]);
  1408.     }
  1409.     /**
  1410.      * @param Request $request
  1411.      */
  1412.     #[Route(path'/admin/products/axAddBlock'options: ['expose' => true])]
  1413.     public function axAddBlock(Request $request)
  1414.     {
  1415.         if ($request->isXmlHttpRequest()) {
  1416.             //Insérer un bloc
  1417.             $bloc = new EcoProductsBlocks;
  1418.             $bloc->setProductId($request->get('prod_id'));
  1419.             $bloc->setProdBlockType($request->get('bloc_type'));
  1420.             $this->entityManager->persist($bloc);
  1421.             $this->entityManager->flush();
  1422.             if ($bloc->getId() > 0) {
  1423.                 $html $this->renderView('admin/admin_products/bloc_' $request->get('bloc_type') . '.html.twig', [
  1424.                     'bloc' => $bloc,
  1425.                 ]);
  1426.                 $script '';
  1427.                 //Init éditeur de texte
  1428.                 if (in_array($bloc->getProdBlockType(), array('text''text_picture''text_slider'))) {
  1429.                     $script .= " startEditor('#editeur_texte" $bloc->getId() . "'); ";
  1430.                 }
  1431.                 $script .= "addObserver(" $bloc->getId() . ");";
  1432.                 $script .= " $('html, body').animate({ scrollTop:$('#env" $bloc->getId() . "').offset().top }, 'slow'); ";
  1433.             }
  1434.             return new JsonResponse([
  1435.                 'status' => true,
  1436.                 'html' => html_entity_decode($html),
  1437.                 'script' => $script
  1438.             ]);
  1439.         }
  1440.         return new JsonResponse([
  1441.             'status' => false,
  1442.         ]);
  1443.     }
  1444.     /**
  1445.      * @param Request $request
  1446.      */
  1447.     #[Route(path'/admin/products/axUpdateBlock'options: ['expose' => true])]
  1448.     public function axUpdateBlock(Request $requestFlashNotificationAjax $flash)
  1449.     {
  1450.         if ($request->isXmlHttpRequest() && $request->get('bloc_id')) {
  1451.             $entityManager $this->getDoctrine()->getManager();
  1452.             $bloc $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
  1453.             if (!$bloc) {
  1454.                 throw $this->createNotFoundException(
  1455.                     'Aucun bloc trouvé pour identifiant : ' $request->get('bloc_id')
  1456.                 );
  1457.             }
  1458.             parse_str($request->get('data'), $datas);
  1459.             $bloc->setProdBlockTextPicture(
  1460.                 isset($datas['prod_block_text_picture']) ? $datas['prod_block_text_picture'] : null
  1461.             );
  1462.             $bloc->setProdBlockTitle(isset($datas['prod_block_title']) ? $datas['prod_block_title'] : null);
  1463.             $bloc->setProdBlockSubtitle(isset($datas['prod_block_subtitle']) ? $datas['prod_block_subtitle'] : null);
  1464.             $bloc->setProdBlockText(isset($datas['prod_block_text']) ? $datas['prod_block_text'] : null);
  1465.             $bloc->setProdBlockEmbed(isset($datas['prod_block_embed']) ? $datas['prod_block_embed'] : null);
  1466.             $bloc->setProdBlockMulticolumn(
  1467.                 isset($datas['prod_block_multicolumn']) ? $datas['prod_block_multicolumn'] : null
  1468.             );
  1469.             $bloc->setProdBlockAlignment(isset($datas['prod_block_alignment']) ? $datas['prod_block_alignment'] : null);
  1470.             $bloc->setProdBlockMarginTop(
  1471.                 isset($datas['prod_block_margin_top']) && $datas['prod_block_margin_top'] != "" $datas['prod_block_margin_top'] : null
  1472.             );
  1473.             $bloc->setProdBlockMarginBottom(
  1474.                 isset($datas['prod_block_margin_bottom']) && $datas['prod_block_margin_bottom'] != "" $datas['prod_block_margin_bottom'] : null
  1475.             );
  1476.             //Enregistrement du titre des médias
  1477.             if (isset($datas['media_ids']) && is_array($datas['media_ids'])) {
  1478.                 foreach ($datas['media_ids'] as $media_id) {
  1479.                     $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($media_id);
  1480.                     $media->setProdMediaAlt($datas['prod_media_alt' $media_id]);
  1481.                 }
  1482.             }
  1483.             $entityManager->flush();
  1484.             return new JsonResponse([
  1485.                 'status' => true,
  1486.                 'flashMessage' => $flash->notification('success''enregistré avec succès'),
  1487.             ]);
  1488.         } else {
  1489.             return new JsonResponse([
  1490.                 'status' => false,
  1491.             ]);
  1492.         }
  1493.     }
  1494.     /**
  1495.      * @param Request $request
  1496.      */
  1497.     #[Route(path'/admin/products/axDisplayBlocs'options: ['expose' => true])]
  1498.     public function axDisplayBlocs(Request $request)
  1499.     {
  1500.         if ($request->isXmlHttpRequest() && $request->get('prod_id') > 0) {
  1501.             $result $this->displayBlocs($request->get('prod_id'));
  1502.             return new JsonResponse([
  1503.                 'status' => true,
  1504.                 'script' => $result['script'],
  1505.                 'renderBloc' => $result['html'],
  1506.             ]);
  1507.         }
  1508.         return new JsonResponse([
  1509.             'status' => false,
  1510.         ]);
  1511.     }
  1512.     private function displayBlocs($prod_id)
  1513.     {
  1514.         $repository $this->getDoctrine()->getRepository(EcoProductsBlocks::class);
  1515.         $blocs $repository->findBy(array('product_id' => $prod_id), array('prod_block_sequence' => 'ASC'));
  1516.         if (is_array($blocs) && sizeof($blocs) > 0) {
  1517.             $html $script "";
  1518.             $i 0;
  1519.             foreach ($blocs as $bloc) {
  1520.                 $resultMedias $this->displayMedias($bloc->getId(), $bloc->getProdBlockType());
  1521.                 $html .= $this->renderView('admin/admin_products/bloc_' $bloc->getProdBlockType() . '.html.twig', [
  1522.                     'bloc' => $bloc,
  1523.                     'srcImage' => $resultMedias['srcImage'],
  1524.                     'listeImages' => $resultMedias['listeImages'],
  1525.                     'listeDocuments' => $resultMedias['listeDocuments'],
  1526.                     'imageRub' => $resultMedias['imageRub'],
  1527.                     'idImage' => $resultMedias['idImage']
  1528.                 ]);
  1529.                 $script .= " addObserver(" $bloc->getId() . "); ";
  1530.                 if (in_array($bloc->getProdBlockType(), array('gallery'))) {
  1531.                     $script .= " initSortableImages('" $bloc->getId() . "'); ";
  1532.                 }
  1533.                 //Init éditeur de texte
  1534.                 if (in_array($bloc->getProdBlockType(), array('text''text_picture''text_slider'))) {
  1535.                     $script .= " startEditor('#editeur_texte" $bloc->getId() . "'); ";
  1536.                 }
  1537.                 $i++;
  1538.             }
  1539.             return [
  1540.                 'html' => $html,
  1541.                 'script' => $script,
  1542.             ];
  1543.         }
  1544.         return [
  1545.             'html' => null,
  1546.             'script' => null,
  1547.         ];
  1548.     }
  1549.     private function displayMedias($bloc_id$bloc_type)
  1550.     {
  1551.         $srcImage $listeImages $listeDocuments $imageRub $idImage null;
  1552.         $repository $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
  1553.         if ($bloc_type == 'document') {
  1554.             $listeDocuments $repository->findByMediasByBloc($bloc_id'file');
  1555.         } elseif (in_array($bloc_type, array('text_picture''picture'))) {
  1556.             $images $repository->findByMediasByBloc($bloc_id'picture');
  1557.             if (isset($images[0]['prod_media_file'])) {
  1558.                 $imageRub $images[0];
  1559.                 $srcImage $images[0]['prod_media_file'];
  1560.                 $idImage $images[0]['id'];
  1561.             }
  1562.         } elseif (in_array($bloc_type, array('gallery'))) {
  1563.             $images $repository->findByMediasByBlocGalerie($bloc_id);
  1564.             if (is_array($images) && sizeof($images) > 0) {
  1565.                 $listeImages $images;
  1566.             }
  1567.         } else {
  1568.             $images $repository->findByMediasByBloc($bloc_id'picture');
  1569.             if (is_array($images) && sizeof($images) > 0) {
  1570.                 $listeImages $images;
  1571.             }
  1572.         }
  1573.         return array(
  1574.             'srcImage' => $srcImage,
  1575.             'listeImages' => $listeImages,
  1576.             'listeDocuments' => $listeDocuments,
  1577.             'imageRub' => $imageRub,
  1578.             'idImage' => $idImage,
  1579.         );
  1580.     }
  1581.     #[Route(path'/admin/products/upload-media'options: ['expose' => true])]
  1582.     public function uploadStreamMedias(Request $requestOtideaUtils $utils)
  1583.     {
  1584.         $output 'ok';
  1585.         $bloc_id $request->query->get('bloc_id');
  1586.         $fileName $request->query->get('filename');
  1587.         $fileSize $request->query->get('filesize');
  1588.         $infosFile pathinfo($fileName);
  1589.         $typeMedias $utils->getTypeMedia($infosFile["extension"], $isEnglishVersion true);
  1590.         if ($typeMedias == null) {
  1591.             $output 'extension';
  1592.         } elseif ($fileSize $this->maxFileSize) {
  1593.             $output 'size';
  1594.         } else {
  1595.             $this->currentFileName date('his') . $utils->nettoyer_nom(urldecode($fileName));
  1596.             $this->idAuteur $bloc_id $bloc_id null;
  1597.             $tmpFilePath $this->getParameter(
  1598.                     'kernel.project_dir'
  1599.                 ) . '/' $this->pathFiles '/tmpFiles/' $fileName;
  1600.             $inputHandler fopen('php://input'"r");
  1601.             // create a temp file where to save data from the input stream
  1602.             $fileHandler fopen($tmpFilePath"w+");
  1603.             // save data from the input stream
  1604.             while (true) {
  1605.                 $buffer fgets($inputHandler4096);
  1606.                 if (strlen($buffer) == 0) {
  1607.                     fclose($inputHandler);
  1608.                     fclose($fileHandler);
  1609.                     break;
  1610.                 }
  1611.                 fwrite($fileHandler$buffer);
  1612.             }
  1613.             rename(
  1614.                 $tmpFilePath,
  1615.                 $this->getParameter('kernel.project_dir') . '/' $this->pathFiles '/' $this->currentFileName
  1616.             );
  1617.             //WEBP
  1618.             $this->fileService->saveWebP([
  1619.                 "fileDestination" => $this->getParameter('kernel.project_dir') . '/' $this->pathFiles,
  1620.                 "filename" => $this->currentFileName
  1621.             ]);
  1622.             //SAUVEGARDE DU MEDIA
  1623.             $entityManager $this->getDoctrine()->getManager();
  1624.             $bloc $entityManager->getRepository(EcoProductsBlocks::class)->find($request->query->get('bloc_id'));
  1625.             //Dans le cas d'un bloc image on supprime l'ancienne image avant de mettre la nouvelle
  1626.             if (in_array($bloc->getProdBlockType(), array('picture''text_picture'))) {
  1627.                 $entityManager $this->getDoctrine()->getManager();
  1628.                 $mediasDB $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
  1629.                 $medias $mediasDB->findBy(array('block_id' => $bloc_id));
  1630.                 if (is_array($medias) && sizeof($medias) > 0) {
  1631.                     foreach ($medias as $media) {
  1632.                         $this->fileService->removeFile([
  1633.                             "filePath" => $this->getParameter('kernel.project_dir') . '/' $this->pathFiles,
  1634.                             "filename" => $media->getProdMediaFile(),
  1635.                         ]);
  1636.                         $entityManager->remove($media);
  1637.                     }
  1638.                 }
  1639.                 $entityManager->flush();
  1640.             }
  1641.             //Sauvegarder le media
  1642.             $this->saveMedia($bloc_id$this->currentFileName$typeMedias);
  1643.         }
  1644.         return new Response(
  1645.             $outputResponse::HTTP_OK, ['content-type' => 'text/plain']
  1646.         );
  1647.     }
  1648.     private function saveMedia($bloc_id$fileName$typeMedias)
  1649.     {
  1650.         $entityManager $this->getDoctrine()->getManager();
  1651.         $media = new EcoProductsBlocksMedias();
  1652.         $media->setBlockId($bloc_id);
  1653.         $media->setProdMediaAlt(null);
  1654.         $media->setProdMediaFile($fileName);
  1655.         $media->setProdMediaType($typeMedias);
  1656.         $media->setProdMediaSequence(
  1657.             $entityManager->getRepository(EcoProductsBlocksMedias::class)->findOneByMaxMediaOrdre(
  1658.                 $bloc_id
  1659.             )['mediaCount']
  1660.         );
  1661.         //        $media->setProdMediaLink('');
  1662.         //        $media->setProdMediaIsblank(0);
  1663.         $entityManager->persist($media);
  1664.         $entityManager->flush();
  1665.     }
  1666.     /**
  1667.      * @param Request $request
  1668.      */
  1669.     #[Route(path'/admin/products/axDeleteBlock'options: ['expose' => true])]
  1670.     public function axDeleteBlock(Request $request)
  1671.     {
  1672.         if ($request->isXmlHttpRequest() && $request->get('bloc_id')) {
  1673.             $entityManager $this->getDoctrine()->getManager();
  1674.             $bloc $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
  1675.             $entityManager->remove($bloc);
  1676.             $entityManager->flush();
  1677.             //Suppression des médias
  1678.             $mediasDB $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
  1679.             $medias $mediasDB->findBy(array('block_id' => $request->get('bloc_id')));
  1680.             if (is_array($medias)) {
  1681.                 foreach ($medias as $media) {
  1682.                     $this->fileService->removeFile([
  1683.                         "filePath" => $this->getParameter('upload_products_' $this->session->get('admin_site_uid')),
  1684.                         "filename" => $media->getProdMediaFile(),
  1685.                     ]);
  1686.                     $entityManager->remove($media);
  1687.                 }
  1688.             }
  1689.             $entityManager->flush();
  1690.             $script '';
  1691.             $script .= " $('#env" $request->get('bloc_id') . "').slideUp('slow', function(){ $('#env" $request->get(
  1692.                     'bloc_id'
  1693.                 ) . "').remove(); }); ";
  1694.             return new JsonResponse([
  1695.                 'status' => true,
  1696.                 'bloc_id' => $request->get('bloc_id'),
  1697.                 'script' => $script
  1698.             ]);
  1699.         } else {
  1700.             return new JsonResponse([
  1701.                 'status' => false,
  1702.             ]);
  1703.         }
  1704.     }
  1705.     /**
  1706.      * @param Request $request
  1707.      */
  1708.     #[Route(path'/admin/products/axDeletePhoto'options: ['expose' => true])]
  1709.     public function axDeletePhoto(Request $request)
  1710.     {
  1711.         if ($request->isXmlHttpRequest() && $request->get('media_id') > 0) {
  1712.             $fileName '';
  1713.             $bloc_id 0;
  1714.             try {
  1715.                 $entityManager $this->getDoctrine()->getManager();
  1716.                 $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
  1717.                 $fileName $media->getProdMediaFile();
  1718.                 $bloc_id $media->getBlockId();
  1719.                 $entityManager->remove($media);
  1720.                 $entityManager->flush();
  1721.             } catch (Exception $ex) {
  1722.                 echo "Exception Found - " $ex->getMessage() . "<br/>";
  1723.             }
  1724.             $pathFile $this->getParameter('kernel.project_dir') . '/' $this->pathFiles '/' $fileName;
  1725.             if (file_exists($pathFile)) {
  1726.                 $this->fileService->removeFile([
  1727.                     "filePath" => $this->getParameter('kernel.project_dir') . '/' $this->pathFiles,
  1728.                     "filename" => $fileName,
  1729.                 ]);
  1730.             }
  1731.             $script '';
  1732.             if (in_array($request->get('bloc_type'), array('document'))) {
  1733.                 $script .= " $('#file_" $request->get('media_id') . "').remove(); ";
  1734.             } elseif (in_array($request->get('bloc_type'), array('picture''text_picture'))) {
  1735.                 $script .= " $('#img" $bloc_id "').attr('src','" $request->getSchemeAndHttpHost() . "/medias_admin/upload-image.png'); ";
  1736.                 $script .= " $('#del" $bloc_id "').hide(); ";
  1737.                 $script .= " $('#lienGalerie" $bloc_id "').hide(); ";
  1738.             } else {
  1739.                 $script .= " $('#galerie-img-" $request->get('media_id') . "').remove(); ";
  1740.             }
  1741.             return new JsonResponse([
  1742.                 'status' => true,
  1743.                 'script' => $script,
  1744.             ]);
  1745.         }
  1746.         return new JsonResponse([
  1747.             'status' => false,
  1748.         ]);
  1749.     }
  1750.     /**
  1751.      * @param Request $request
  1752.      */
  1753.     #[Route(path'/admin/products/axDisplayMedias'options: ['expose' => true])]
  1754.     public function axDisplayMedias(Request $request)
  1755.     {
  1756.         if ($request->isXmlHttpRequest() && $request->get('bloc_id') > 0) {
  1757.             $script '';
  1758.             $renderGalerie $renderDocument null;
  1759.             $entityManager $this->getDoctrine()->getManager();
  1760.             $bloc $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
  1761.             if ($bloc->getProdBlockType() == 'document') {
  1762.                 $documents $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBloc(
  1763.                     $request->get('bloc_id'),
  1764.                     'file'
  1765.                 );
  1766.                 $blocArray['id'] = $request->get('bloc_id');
  1767.                 $blocArray['prodBlockType'] = $bloc->getProdBlockType();
  1768.                 $renderDocument $this->renderView('admin/admin_products/tpl_document_liste.html.twig', [
  1769.                     'bloc' => $blocArray,
  1770.                     'listeDocuments' => $documents,
  1771.                 ]);
  1772.                 //Une seule image à afficher
  1773.             } elseif (in_array($bloc->getProdBlockType(), array('text_picture''picture'))) {
  1774.                 //                $images = $entityManager->getRepository(Pages::class)->findByImagesByBloc($request->get('bloc_id'));
  1775.                 $images $entityManager->getRepository(EcoProductsBlocksMedias::class)->findBy(
  1776.                     [
  1777.                         'block_id' => $request->get('bloc_id'),
  1778.                         'prod_media_type' => 'picture'
  1779.                     ],
  1780.                     ['prod_media_sequence' => 'ASC']
  1781.                 );
  1782.                 $src $request->getSchemeAndHttpHost() . '/medias_front/products/' $images[0]->getProdMediaFile();
  1783.                 $script .= ' $("#img' $bloc->getId() . '").attr("src","' $src '"); ';
  1784.                 $script .= " $('#del" $bloc->getId() . "').attr('onclick','deletePhoto(" $images[0]->getId() . ", \'" $bloc->getProdBlockType() . "\');'); ";
  1785.                 $script .= " $('#del" $bloc->getId() . "').show(); ";
  1786.                 $script .= " $('#lienGalerie" $bloc->getId() . "').attr('onclick','displayModalMedia(" $images[0]->getId() . ", \'" $bloc->getProdBlockType() . "\');'); ";
  1787.                 $script .= " $('#lienGalerie" $bloc->getId() . "').show(); ";
  1788.                 $script .= " $('.progress').width('0%'); ";
  1789.                 //Plusieurs images à afficher
  1790.             } elseif (in_array($bloc->getProdBlockType(), array('gallery'))) {
  1791.                 $images $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBlocGalerie(
  1792.                     $request->get('bloc_id')
  1793.                 );
  1794.                 $blocArray['id'] = $request->get('bloc_id');
  1795.                 $renderGalerie $this->renderView('admin/admin_products/tpl_galerie_images.html.twig', [
  1796.                     'bloc' => $blocArray,
  1797.                     'listeImages' => $images,
  1798.                 ]);
  1799.                 $script .= " initSortableImages('" $request->get('bloc_id') . "'); ";
  1800.             } else {
  1801.                 $images $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBloc(
  1802.                     $request->get('bloc_id'),
  1803.                     'picture'
  1804.                 );
  1805.                 $blocArray['id'] = $request->get('bloc_id');
  1806.                 $renderGalerie $this->renderView('admin/admin_products/tpl_galerie_images.html.twig', [
  1807.                     'bloc' => $blocArray,
  1808.                     'listeImages' => $images,
  1809.                 ]);
  1810.                 $script .= " initSortableImages('" $request->get('bloc_id') . "'); ";
  1811.             }
  1812.             $script .= ' $("#img' $bloc->getId() . '").css("zIndex",2); ';
  1813.             return new JsonResponse([
  1814.                 'status' => true,
  1815.                 'script' => $script,
  1816.                 'renderGalerie' => $renderGalerie,
  1817.                 'renderDocument' => $renderDocument,
  1818.             ]);
  1819.         }
  1820.         return new JsonResponse([
  1821.             'status' => false,
  1822.         ]);
  1823.     }
  1824.     /**
  1825.      * @param Request $request
  1826.      */
  1827.     #[Route(path'/admin/products/axEmbedGalerie'options: ['expose' => true])]
  1828.     public function axEmbedGalerie(Request $request)
  1829.     {
  1830.         if ($request->isXmlHttpRequest()) {
  1831.             $entityManager $this->getDoctrine()->getManager();
  1832.             $ActualiteBlocsDB $entityManager->getRepository(EcoProductsBlocks::class);
  1833.             //insert neoMedia type embed
  1834.             $entityManager $this->getDoctrine()->getManager();
  1835.             $bloc_id $request->get('id_bloc');
  1836.             $media = new EcoProductsBlocksMedias();
  1837.             $media->setBlockId($bloc_id);
  1838.             $media->setProdMediaAlt('');
  1839.             $media->setProdMediaFile('');
  1840.             $media->setProdMediaType('embed');
  1841.             $media->setProdMediaSequence(
  1842.                 $entityManager->getRepository(EcoProductsBlocksMedias::class)->findOneByMaxMediaOrdre(
  1843.                     $bloc_id
  1844.                 )['mediaCount']
  1845.             );
  1846.             $media->setProdMediaLink('');
  1847.             $media->setProdMediaIsblank(0);
  1848.             $entityManager->persist($media);
  1849.             $entityManager->flush();
  1850.             if ($media->getBlockId() > 0) {
  1851.                 $script '';
  1852.                 $script .= "displayMedias(" $bloc_id ");";
  1853.                 return new JsonResponse([
  1854.                     'status' => true,
  1855.                     'script' => $script
  1856.                 ]);
  1857.             }
  1858.         } else {
  1859.             return new JsonResponse([
  1860.                 'status' => false,
  1861.             ]);
  1862.         }
  1863.     }
  1864.     /**
  1865.      * @param Request $request
  1866.      */
  1867.     #[Route(path'/admin/products/axDisplayModalEmbed'options: ['expose' => true])]
  1868.     public function axDisplayModalEmbed(Request $request)
  1869.     {
  1870.         if ($request->isXmlHttpRequest()) {
  1871.             $entityManager $this->getDoctrine()->getManager();
  1872.             $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
  1873.             $renderModale $this->renderView('admin/admin_products/tpl_modal_media_embed.html.twig', [
  1874.                 'modalTitle' => 'Gestion embed',
  1875.                 'media_id' => $request->get('media_id'),
  1876.                 'media' => $media,
  1877.             ]);
  1878.         }
  1879.         return new JsonResponse([
  1880.             'status' => true,
  1881.             'modal' => html_entity_decode($renderModale),
  1882.         ]);
  1883.     }
  1884.     /**
  1885.      * @param Request $request
  1886.      */
  1887.     #[Route(path'/admin/products/axSaveMediaAlt'options: ['expose' => true])]
  1888.     public function axSaveMediaAlt(Request $requestFlashNotificationAjax $flash)
  1889.     {
  1890.         if ($request->isXmlHttpRequest()) {
  1891.             $params = array();
  1892.             parse_str($request->get('form'), $params);
  1893.             try {
  1894.                 $entityManager $this->getDoctrine()->getManager();
  1895.                 $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($params['media_id']);
  1896.                 $media->setProdMediaAlt($params['prod_media_alt']);
  1897.                 if ($params['prod_media_type'] == 'embed') {
  1898.                     $media->setProdMediaFile($params['prod_media_file']);
  1899.                 }
  1900.                 $media->setProdMediaDisplayAlt($params['prod_media_display_alt']);
  1901.                 $media->setProdMediaLink($params['prod_media_link']);
  1902.                 $media->setProdMediaIsblank($params['prod_media_isblank']);
  1903.                 $entityManager->flush();
  1904.                 $script '';
  1905.                 $script .= "displayMedias(" $params['block_id'] . ");";
  1906.                 return new JsonResponse([
  1907.                     'status' => true,
  1908.                     'script' => $script,
  1909.                     'flashMessage' => $flash->notification(
  1910.                         'success',
  1911.                         'enregistré avec succès'
  1912.                     ),
  1913.                 ]);
  1914.             } catch (Exception $e) {
  1915.                 return new JsonResponse([
  1916.                     'status' => false,
  1917.                     'flashMessage' => $flash->notification(
  1918.                         'danger',
  1919.                         "Une erreur s'est produite lors de l'enregistrement"
  1920.                     ),
  1921.                 ]);
  1922.             }
  1923.         }
  1924.         return new JsonResponse([
  1925.             'status' => false,
  1926.         ]);
  1927.     }
  1928.     /**
  1929.      * @param Request $request
  1930.      */
  1931.     #[Route(path'/admin/products/axUpdateOrderMedias'options: ['expose' => true])]
  1932.     public function axUpdateOrderMedias(Request $request)
  1933.     {
  1934.         if ($request->isXmlHttpRequest() && $request->get('sorted')) {
  1935.             $liste explode('&'$request->get('sorted'));
  1936.             $i 1;
  1937.             $entityManager $this->getDoctrine()->getManager();
  1938.             foreach ($liste as $ligne) {
  1939.                 $id str_replace('sort='''$ligne);
  1940.                 $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($id);
  1941.                 $media->setProdMediaSequence($i);
  1942.                 $entityManager->flush();
  1943.                 $i++;
  1944.             }
  1945.             return new JsonResponse([
  1946.                 'status' => true,
  1947.             ]);
  1948.         }
  1949.         return new JsonResponse([
  1950.             'status' => false,
  1951.         ]);
  1952.     }
  1953.     /**
  1954.      * @param Request $request
  1955.      */
  1956.     #[Route(path'/admin/products/axDisplayModalMedia'options: ['expose' => true])]
  1957.     public function axDisplayModalMedia(Request $request)
  1958.     {
  1959.         if ($request->isXmlHttpRequest()) {
  1960.             $entityManager $this->getDoctrine()->getManager();
  1961.             $media $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
  1962.             $renderModale $this->renderView('admin/admin_products/tpl_modal_media.html.twig', [
  1963.                 'modalTitle' => 'Texte alternatif',
  1964.                 'media_id' => $request->get('media_id'),
  1965.                 'media' => $media,
  1966.             ]);
  1967.         }
  1968.         return new JsonResponse([
  1969.             'status' => true,
  1970.             'modal' => html_entity_decode($renderModale),
  1971.         ]);
  1972.     }
  1973.     /**
  1974.      * @param Request $request
  1975.      */
  1976.     #[Route(path'/admin/products/axDisplayReorderBlocs'options: ['expose' => true])]
  1977.     public function axDisplayReorderBlocs(Request $request)
  1978.     {
  1979.         if ($request->isXmlHttpRequest() && $request->get('prod_id')) {
  1980.             $entityManager $this->getDoctrine()->getManager();
  1981.             $blocs $entityManager->getRepository(EcoProductsBlocks::class)->findBy(
  1982.                 ['product_id' => $request->get('prod_id')],
  1983.                 ['prod_block_sequence' => 'ASC']
  1984.             );
  1985.             $renderModale $this->renderView('admin/admin_products/tpl_reordonner_blocs.html.twig', [
  1986.                 'modalTitle' => 'Ordonner les blocs',
  1987.                 'prod_id' => $request->get('prod_id'),
  1988.                 'blocs' => $blocs
  1989.             ]);
  1990.             $script '';
  1991.             $script .= " initSortableBlocs(); ";
  1992.             return new JsonResponse([
  1993.                 'status' => true,
  1994.                 'modal' => html_entity_decode($renderModale),
  1995.                 'script' => $script,
  1996.             ]);
  1997.         }
  1998.         return new JsonResponse([
  1999.             'status' => false,
  2000.         ]);
  2001.     }
  2002.     /**
  2003.      * @param Request $request
  2004.      */
  2005.     #[Route(path'/admin/products/axUpdateOrderBlocs'options: ['expose' => true])]
  2006.     public function axUpdateOrderBlocs(Request $request)
  2007.     {
  2008.         if ($request->isXmlHttpRequest() && $request->get('sorted')) {
  2009.             $liste explode('&'$request->get('sorted'));
  2010.             $i 1;
  2011.             $entityManager $this->getDoctrine()->getManager();
  2012.             foreach ($liste as $ligne) {
  2013.                 $uid str_replace('sort='''$ligne);
  2014.                 $bloc $entityManager->getRepository(EcoProductsBlocks::class)->find($uid);
  2015.                 $bloc->setProdBlockSequence($i);
  2016.                 $entityManager->flush();
  2017.                 $i++;
  2018.             }
  2019.             return new JsonResponse([
  2020.                 'status' => true,
  2021.             ]);
  2022.         }
  2023.         return new JsonResponse([
  2024.             'status' => false,
  2025.         ]);
  2026.     }
  2027.     /**
  2028.      * @param Request $request
  2029.      */
  2030.     #[Route(path'/admin/products/axCloseReorderBlocs'options: ['expose' => true])]
  2031.     public function axCloseReorderBlocs(Request $request)
  2032.     {
  2033.         if ($request->isXmlHttpRequest()) {
  2034.             $script '';
  2035.             $script .= " window.location = window.location; ";
  2036.             return new JsonResponse([
  2037.                 'status' => true,
  2038.                 'script' => $script,
  2039.             ]);
  2040.         }
  2041.     }
  2042.     /**
  2043.      * @param Request $request
  2044.      */
  2045.     #[Route(path'/admin/products/axUpdateOrderReferences'options: ['expose' => true])]
  2046.     public function axUpdateOrderReferences(Request $request)
  2047.     {
  2048.         if ($request->isXmlHttpRequest() && $request->get('sorted')) {
  2049.             $liste explode('&'$request->get('sorted'));
  2050.             $i 1;
  2051.             $entityManager $this->getDoctrine()->getManager();
  2052.             foreach ($liste as $ligne) {
  2053.                 $uid str_replace('sort='''$ligne);
  2054.                 $bloc $entityManager->getRepository(EcoProductsReferences::class)->find($uid);
  2055.                 $bloc->setRefSequence($i);
  2056.                 $entityManager->flush();
  2057.                 $i++;
  2058.             }
  2059.             return new JsonResponse([
  2060.                 'status' => true,
  2061.             ]);
  2062.         }
  2063.         return new JsonResponse([
  2064.             'status' => false,
  2065.         ]);
  2066.     }
  2067.     /**
  2068.      * @param Request $request
  2069.      */
  2070.     #[Route(path'/admin/products/axRemoveProduct'options: ['expose' => true])]
  2071.     public function axRemoveProduct(
  2072.         Request                             $request,
  2073.         EcoProductsRepository               $repoProduct,
  2074.         EcoCustomersFavoritesProdRepository $repoFavProd,
  2075.         EcoProductsBlocksRepository         $repoProdBlock,
  2076.         EcoProductsBlocksMediasRepository   $repoProdBlockMedias,
  2077.         EcoProductsReferencesRepository     $repoReferences,
  2078.         EcoAttributesReferencesRepository   $repoAttr
  2079.     )
  2080.     {
  2081.         if ($request->isXmlHttpRequest()) {
  2082.             //SUPPRESSION BLOCS & MEDIAS
  2083.             $blocs $repoProdBlock->findBy(['product_id' => $request->get('product_id')]);
  2084.             if (is_array($blocs) && sizeof($blocs) > 0) {
  2085.                 foreach ($blocs as $bloc) {
  2086.                     $medias $repoProdBlockMedias->findBy(['block_id' => $bloc->getId()]);
  2087.                     $this->removeMedias($medias);
  2088.                 }
  2089.                 $this->entityManager->remove($bloc);
  2090.             }
  2091.             //SUPPRESSION REFERENCES
  2092.             $references $repoReferences->findBy(['product_id' => $request->get('product_id')]);
  2093.             if (is_array($references) && sizeof($references) > 0) {
  2094.                 foreach ($references as $reference) {
  2095.                     //SUPPRESSION ATTRIBUTS
  2096.                     $attributesLinks $repoAttr->findBy(['reference_id' => $reference->getId()]);
  2097.                     if (is_array($attributesLinks) && sizeof($attributesLinks) > 0) {
  2098.                         foreach ($attributesLinks as $link) {
  2099.                             $this->entityManager->remove($link);
  2100.                         }
  2101.                     }
  2102.                     $this->entityManager->remove($reference);
  2103.                 }
  2104.             }
  2105.             //SUPPRESION DES FAVORIS CLIENTS
  2106.             $favsProds $repoFavProd->findBy(['productId' => $request->get('product_id')]);
  2107.             foreach ($favsProds as $favProd) {
  2108.                 $this->entityManager->remove($favProd);
  2109.             }
  2110.             //SUPPRESSION PRODUIT
  2111.             $product $repoProduct->find($request->get('product_id'));
  2112.             $this->fileService->removeFile([
  2113.                 "filePath" => $this->getParameter('upload_products_' $this->session->get('admin_site_uid')),
  2114.                 "filename" => $product->getProdPicture(),
  2115.             ]);
  2116.             $this->entityManager->remove($product);
  2117.             $this->entityManager->flush();
  2118.             $script " $('#row" $request->get('product_id') . "').remove(); ";
  2119.             return new JsonResponse([
  2120.                 'status' => true,
  2121.                 'script' => $script,
  2122.             ]);
  2123.         }
  2124.         return new JsonResponse([
  2125.             'status' => false,
  2126.         ]);
  2127.     }
  2128.     /**
  2129.      * Suppression des médias d'un bloc présentation
  2130.      * @param array $medias
  2131.      */
  2132.     private function removeMedias($medias)
  2133.     {
  2134.         if (is_array($medias)) {
  2135.             foreach ($medias as $media) {
  2136.                 $this->fileService->removeFile([
  2137.                     "filePath" => $this->getParameter('upload_products_' $this->session->get('admin_site_uid')),
  2138.                     "filename" => $media->getProdMediaFile(),
  2139.                 ]);
  2140.                 $this->entityManager->remove($media);
  2141.             }
  2142.         }
  2143.         $this->entityManager->flush();
  2144.     }
  2145.     /**
  2146.      * @param Request $request
  2147.      * TUTORIEL : https://ourcodeworld.com/articles/read/798/how-to-create-an-excel-file-with-php-in-symfony-4
  2148.      */
  2149.     #[Route(path'/admin/export-articles'name'admin_excel_export_products')]
  2150.     public function excelExportProducts(Request $requestEcoProductsRepository $repoProducts)
  2151.     {
  2152.         $products $repoProducts->findByProducts();
  2153.         $spreadsheet = new Spreadsheet();
  2154.         $sheet $spreadsheet->getActiveSheet();
  2155.         $headCols = [
  2156.             'Date de création',
  2157.             'Modèle',
  2158.             'Désignation',
  2159.             'Référence',
  2160.             'Référence perso',
  2161.             'Code barre',
  2162.             'Prix achat',
  2163.             'Prix de vente',
  2164.             'Prix promo',
  2165.             'Prix solde',
  2166.             'TVA',
  2167.             'Quantité'
  2168.         ];
  2169.         //1er ligne - Intitulé des colonnes
  2170.         $column 'A';
  2171.         $row 1;
  2172.         foreach ($headCols as $col) {
  2173.             $sheet->setCellValue($column $row$col);
  2174.             $column++;
  2175.         }
  2176.         //Données
  2177.         $row++;
  2178.         foreach ($products as $prod) {
  2179.             $column 'A';
  2180.             $sheet->setCellValue($column $rowdate('d/m/Y'strtotime($prod['prod_creation_date'])));
  2181.             $column++;
  2182.             $sheet->setCellValue($column $row$prod['prod_model']);
  2183.             $column++;
  2184.             $sheet->setCellValue($column $row$prod['ref_entitled']);
  2185.             $column++;
  2186.             $sheet->setCellValue($column $row$prod['ref_reference']);
  2187.             $column++;
  2188.             $sheet->setCellValue($column $row$prod['ref_reference_perso']);
  2189.             $column++;
  2190.             $sheet->setCellValue($column $row$prod['ref_barcode']);
  2191.             $column++;
  2192.             $sheet->setCellValue($column $row$prod['ref_buying_price']);
  2193.             $column++;
  2194.             $sheet->setCellValue($column $row$prod['ref_selling_price']);
  2195.             $column++;
  2196.             $sheet->setCellValue($column $row$prod['ref_promo_price']);
  2197.             $column++;
  2198.             $sheet->setCellValue($column $row$prod['ref_solde_price']);
  2199.             $column++;
  2200.             $sheet->setCellValue($column $row, (($prod['ref_tva'] * 100) - 100) . '%');
  2201.             $column++;
  2202.             $sheet->setCellValue($column $row$prod['ref_quantity'] > $prod['ref_quantity'] : 0);
  2203.             $column++;
  2204.             $row++;
  2205.         }
  2206.         $sheet->setTitle("Export produits du " date('d-m-Y'));
  2207.         $writer = new Xlsx($spreadsheet);
  2208.         $fileName 'export-produits-' date('dmY') . '.xlsx';
  2209.         $temp_file tempnam(sys_get_temp_dir(), $fileName);
  2210.         // Create the file
  2211.         $writer->save($temp_file);
  2212.         return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  2213.     }
  2214.     #[Route(path'/admin/product-statistics/{prod_id}'name'admin_product_statistics'defaults: ['prod_id' => 0])]
  2215.     public function product_statistics(
  2216.         Request                         $request,
  2217.         EcoOrdersRepository             $repoOrders,
  2218.         EcoProductsReferencesRepository $repoProdRef,
  2219.         EcoProductsRepository           $repoProduct,
  2220.                                         $prod_id 0
  2221.     )
  2222.     {
  2223.         $year $request->get('year') ? $request->get('year') : date('Y');
  2224.         //Année de début
  2225.         $firstYear $repoOrders->findByFirstYearProduct($prod_id);
  2226.         $firstYear $firstYear $firstYear date('Y');
  2227.         //Liste des années disponibles en fonction des commandes du site
  2228.         $yearOrderList $this->getYearOrderList($firstYear);
  2229.         //Données de ventes
  2230.         $datas = [];
  2231.         $references $repoProdRef->findBy(['product_id' => $prod_id]);
  2232.         foreach ($references as $key => $ref) {
  2233.             $stats $repoOrders->findByReferenceOrderByMonth($year$ref->getId());
  2234.             foreach ($this->monthList as $keyMonth => $month) {
  2235.                 $datas[$ref->getId()][$keyMonth] = 0;
  2236.                 foreach ($stats as $stat) {
  2237.                     if ($keyMonth == $stat['month']) {
  2238.                         $datas[$ref->getId()][$keyMonth] = $stat['nbSales'];
  2239.                     }
  2240.                 }
  2241.             }
  2242.             $references[$key]->rgb $this->getRandomColors();
  2243.         }
  2244.         //        dd($references[0]->rgb);
  2245.         return $this->render('admin/admin_products/product_statistics.html.twig', [
  2246.             'product_id' => $prod_id,
  2247.             'product' => $repoProduct->find($prod_id),
  2248.             'yearOrderList' => $yearOrderList,
  2249.             'monthsList' => $this->monthList,
  2250.             'selectedYear' => $year,
  2251.             'references' => $references,
  2252.             'datasSales' => $datas,
  2253.         ]);
  2254.     }
  2255.     private function getRandomColors()
  2256.     {
  2257.         foreach (array('r''g''b') as $color) {
  2258.             $rgbColor[$color] = mt_rand(0255);
  2259.         }
  2260.         return $rgbColor;
  2261.     }
  2262.     private function getYearOrderList($firstYear)
  2263.     {
  2264.         $result = [];
  2265.         if (date('Y') - $firstYear 0) {
  2266.             $diff date('Y') - $firstYear;
  2267.             for ($i 0$i <= $diff$i++) {
  2268.                 $result[] = $firstYear $i;
  2269.             }
  2270.         } else {
  2271.             $result[] = $firstYear;
  2272.         }
  2273.         return $result;
  2274.     }
  2275.     #[Route(path'/admin/products/marks'name'admin_products_marks')]
  2276.     public function marks(Request $requestEcoMarksRepository $repoMarks)
  2277.     {
  2278.         if ($request->get('mark')) {
  2279.             $mark = new EcoMarks;
  2280.             if ($request->get('mark_id') && $request->get('mark_id') > 0) {
  2281.                 $mark $repoMarks->find($request->get('mark_id'));
  2282.             }
  2283.             $mark->setMark($request->get('mark'));
  2284.             $mark->setSiteId($this->session->get('admin_site_uid'));
  2285.             $this->entityManager->persist($mark);
  2286.             $this->entityManager->flush();
  2287.         }
  2288.         return $this->render('admin/admin_products/products_marks.html.twig', [
  2289.             'marks' => $repoMarks->findBy(['siteId' => $this->session->get('admin_site_uid')], ['mark' => 'ASC']),
  2290.         ]);
  2291.     }
  2292.     /**
  2293.      * @param Request $request
  2294.      */
  2295.     #[Route(path'/admin/products/axDisplayFormMark'options: ['expose' => true])]
  2296.     public function axDisplayFormMark(Request $requestEcoMarksRepository $repoMark)
  2297.     {
  2298.         if ($request->isXmlHttpRequest()) {
  2299.             $mark = new EcoMarks;
  2300.             if ($request->get('mark_id') > 0) {
  2301.                 $mark $repoMark->find($request->get('mark_id'));
  2302.             }
  2303.             $renderModale $this->renderView('admin/admin_products/tpl_form_mark.html.twig', [
  2304.                 'modalTitle' => 'Marque',
  2305.                 'mark_id' => $request->get('mark_id'),
  2306.                 'mark' => $mark,
  2307.             ]);
  2308.             return new JsonResponse([
  2309.                 'status' => true,
  2310.                 'modal' => html_entity_decode($renderModale),
  2311.             ]);
  2312.         }
  2313.         return new JsonResponse([
  2314.             'status' => false,
  2315.         ]);
  2316.     }
  2317.     #[Route(path'/admin/products/mark/remove/{id}'name'admin_products_mark_remove'defaults: ['id' => 0])]
  2318.     public function remove_mark(
  2319.         Request               $request,
  2320.         EcoMarksRepository    $repoMarks,
  2321.         EcoProductsRepository $ecoProductsRepository,
  2322.                               $id
  2323.     )
  2324.     {
  2325.         $mark = new EcoMarks;
  2326.         if ($id 0) {
  2327.             $mark $repoMarks->find($id);
  2328.             $productInMark $ecoProductsRepository->findBy(['mark_id' => $mark->getId()]);
  2329.             if ($productInMark != null) {
  2330.                 $this->addFlash('danger'"Impossible de supprimer une marque possédant des produits");
  2331.                 return $this->redirectToRoute('admin_products_marks');
  2332.             }
  2333.             try {
  2334.                 $this->entityManager->remove($mark);
  2335.                 $this->entityManager->flush();
  2336.                 $this->addFlash('success'"Suppression avec succès");
  2337.             } catch (Exception $e) {
  2338.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  2339.             }
  2340.         }
  2341.         return $this->redirectToRoute('admin_products_marks');
  2342.     }
  2343.     #[Route(path'/admin/products/providers'name'admin_products_providers')]
  2344.     public function providers(Request $requestEcoProvidersRepository $repoProviders)
  2345.     {
  2346.         if ($request->get('provider')) {
  2347.             $provider = new EcoProviders;
  2348.             if ($request->get('provider_id') && $request->get('provider_id') > 0) {
  2349.                 $provider $repoProviders->find($request->get('provider_id'));
  2350.             }
  2351.             $provider->setProvider($request->get('provider'));
  2352.             $provider->setDescription($request->get('description'));
  2353.             $provider->setCity($request->get('city'));
  2354.             $provider->setPostalCode($request->get('postalCode'));
  2355.             $provider->setSiteId($this->session->get('admin_site_uid'));
  2356.             $this->entityManager->persist($provider);
  2357.             $this->entityManager->flush();
  2358.         }
  2359.         return $this->render('admin/admin_products/products_providers.html.twig', [
  2360.             'providers' => $repoProviders->findBy(['siteId' => $this->session->get('admin_site_uid')],
  2361.                 ['provider' => 'ASC']),
  2362.         ]);
  2363.     }
  2364.     /**
  2365.      * @param Request $request
  2366.      */
  2367.     #[Route(path'/admin/products/axDisplayFormProvider'options: ['expose' => true])]
  2368.     public function axDisplayFormProvider(Request $requestEcoProvidersRepository $repoProvider)
  2369.     {
  2370.         if ($request->isXmlHttpRequest()) {
  2371.             $provider = new EcoProviders;
  2372.             if ($request->get('provider_id') > 0) {
  2373.                 $provider $repoProvider->find($request->get('provider_id'));
  2374.             }
  2375.             $renderModale $this->renderView('admin/admin_products/tpl_form_provider.html.twig', [
  2376.                 'modalTitle' => 'Fournisseur',
  2377.                 'mark_id' => $request->get('provider_id'),
  2378.                 'provider' => $provider,
  2379.             ]);
  2380.             return new JsonResponse([
  2381.                 'status' => true,
  2382.                 'modal' => html_entity_decode($renderModale),
  2383.             ]);
  2384.         }
  2385.         return new JsonResponse([
  2386.             'status' => false,
  2387.         ]);
  2388.     }
  2389.     #[Route(path'/admin/products/provider/remove/{id}'name'admin_products_provider_remove'defaults: ['id' => 0])]
  2390.     public function remove_provider(
  2391.         Request                $request,
  2392.         EcoProvidersRepository $repoProviders,
  2393.         EcoProductsRepository  $ecoProductsRepository,
  2394.                                $id
  2395.     )
  2396.     {
  2397.         $provider = new EcoProviders;
  2398.         if ($id 0) {
  2399.             $provider $repoProviders->find($id);
  2400.             $productInProvider $ecoProductsRepository->findBy(['provider_id' => $provider->getId()]);
  2401.             if ($productInProvider != null) {
  2402.                 $this->addFlash('danger'"Impossible de supprimer un fournisseur associé à des produits");
  2403.                 return $this->redirectToRoute('admin_products_providers');
  2404.             }
  2405.             try {
  2406.                 $this->entityManager->remove($provider);
  2407.                 $this->entityManager->flush();
  2408.                 $this->addFlash('success'"Suppression avec succès");
  2409.             } catch (Exception $e) {
  2410.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  2411.             }
  2412.         }
  2413.         return $this->redirectToRoute('admin_products_providers');
  2414.     }
  2415.     #[Route(path'/admin/products/labels'name'admin_products_labels')]
  2416.     public function labels(Request $requestEcoLabelsRepository $labelsRepository)
  2417.     {
  2418.         if ($request->get('name')) {
  2419.             $label = new EcoLabels;
  2420.             $picture null;
  2421.             if ($request->get('label_id') && $request->get('label_id') > 0) {
  2422.                 $label $labelsRepository->find($request->get('label_id'));
  2423.                 $picture $label->getLogo();
  2424.             }
  2425.             $label->setName($request->get('name'));
  2426.             //$label->setLogo($request->get('logo'));
  2427.             dump($request);
  2428.             // upload du fichier
  2429.             if ($request->files->get("logo") !== null) {
  2430.                 $upload $this->fileService->startUpload(
  2431.                     [
  2432.                         "fileData" => $request->files->get("logo"),
  2433.                         "oldFileName" => $picture,
  2434.                         "fileDestination" => $this->getParameter(
  2435.                             "upload_labels_" $this->session->get('admin_site_uid')
  2436.                         ),
  2437.                         "autorizedExtensions" => $this->autorizedImages,
  2438.                         "createWebp" => true
  2439.                     ]
  2440.                 );
  2441.                 // upload OK
  2442.                 if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
  2443.                         $upload['filename']
  2444.                     )) {
  2445.                     $label->setLogo($upload['filename']);
  2446.                 } // upload KO avec message perso
  2447.                 elseif (isset($upload['error_msg'])) {
  2448.                     $label->setLogo($picture);
  2449.                     $errorMsg $upload['error_msg'];
  2450.                 } // upload KO avec message générique
  2451.                 else {
  2452.                     $label->setLogo($picture);
  2453.                     $errorMsg "Une erreur s'est produite lors de l'enregistrement du fichier";
  2454.                 }
  2455.             }
  2456.             try {
  2457.                 $this->entityManager->persist($label);
  2458.                 $this->entityManager->flush();
  2459.             } catch (Exception $e) {
  2460.                 $errorMsg "Une erreur s'est produite lors de l'enregistrement";
  2461.             }
  2462.             // il y a eu une erreur
  2463.             if (isset($errorMsg)) {
  2464.                 $this->addFlash('danger'$errorMsg);
  2465.             } // pas d'erreur
  2466.             else {
  2467.                 $this->addFlash('success'"enregistré avec succès");
  2468.             }
  2469.         }
  2470.         return $this->render('admin/admin_products/products_labels.html.twig', [
  2471.             'labels' => $labelsRepository->findBy([], ['name' => 'ASC']),
  2472.         ]);
  2473.     }
  2474.     /**
  2475.      * @param Request $request
  2476.      */
  2477.     #[Route(path'/admin/products/axDisplayFormLabel'options: ['expose' => true])]
  2478.     public function axDisplayFormlabel(Request $requestEcoLabelsRepository $labelsRepository)
  2479.     {
  2480.         if ($request->isXmlHttpRequest()) {
  2481.             $label = new EcoLabels;
  2482.             if ($request->get('label_id') > 0) {
  2483.                 $label $labelsRepository->find($request->get('label_id'));
  2484.             }
  2485.             $renderModale $this->renderView('admin/admin_products/tpl_form_label.html.twig', [
  2486.                 'modalTitle' => 'Label',
  2487.                 'label_id' => $request->get('label_id'),
  2488.                 'label' => $label,
  2489.                 'autorizedImages' => $this->autorizedImages,
  2490.             ]);
  2491.             return new JsonResponse([
  2492.                 'status' => true,
  2493.                 'modal' => html_entity_decode($renderModale),
  2494.             ]);
  2495.         }
  2496.         return new JsonResponse([
  2497.             'status' => false,
  2498.         ]);
  2499.     }
  2500.     #[Route(path'/admin/products/label/remove/{id}'name'admin_products_label_remove'defaults: ['id' => 0])]
  2501.     public function remove_label(
  2502.         Request                     $request,
  2503.         EcoLabelsRepository         $labelsRepository,
  2504.         EcoProductsLabelsRepository $ecoProductsLabelsRepository,
  2505.                                     $id
  2506.     )
  2507.     {
  2508.         $label = new EcoProductsLabels();
  2509.         if ($id 0) {
  2510.             $label $labelsRepository->find($id);
  2511.             $productInLabel $ecoProductsLabelsRepository->findBy(['label_id' => $label->getId()]);
  2512.             if ($productInLabel != null) {
  2513.                 $this->addFlash('danger'"Impossible de supprimer un label associé à des produits");
  2514.                 return $this->redirectToRoute('admin_products_labels');
  2515.             }
  2516.             try {
  2517.                 $this->entityManager->remove($label);
  2518.                 $this->entityManager->flush();
  2519.                 $this->addFlash('success'"Suppression avec succès");
  2520.             } catch (Exception $e) {
  2521.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression");
  2522.             }
  2523.         }
  2524.         return $this->redirectToRoute('admin_products_labels');
  2525.     }
  2526.     #[Route(path'/admin/products/remove-picture-label/{id}'name'admin_product_remove_picture_label'defaults: ['id' => ''])]
  2527.     public function removePictureLabel($id)
  2528.     {
  2529.         if ($id 0) {
  2530.             try {
  2531.                 $media $this->entityManager->getRepository(EcoLabels::class)->find($id);
  2532.                 $filename $media->getLogo();
  2533.                 $media->setLogo(null);
  2534.                 $this->entityManager->persist($media);
  2535.                 $this->entityManager->flush();
  2536.                 if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
  2537.                         $file $this->getParameter(
  2538.                                 'upload_labels_' $this->session->get('admin_site_uid')
  2539.                             ) . "/" $filename
  2540.                     )) {
  2541.                     $this->fileService->removeFile([
  2542.                         "filePath" => $this->getParameter('upload_labels_' $this->session->get('admin_site_uid')),
  2543.                         "filename" => $filename,
  2544.                     ]);
  2545.                 }
  2546.                 $this->addFlash('success'"L'illustration a été supprimée avec succès");
  2547.             } catch (Exception $e) {
  2548.                 $this->addFlash('danger'"Une erreur s'est produite lors de la suppression de l'illustration");
  2549.             }
  2550.         }
  2551.         return $this->redirectToRoute('admin_products_labels');
  2552.     }
  2553.     #[Route(path'/admin/product-combination/{prod_id}'name'admin_product_combination'defaults: ['prod_id' => 0])]
  2554.     public function product_combination(Request $requestEcoProductsRepository $repoProduct$prod_id 0)
  2555.     {
  2556.         return $this->render('admin/admin_products/product_combination.html.twig', [
  2557.             'product_id' => $prod_id,
  2558.             'product' => $repoProduct->find($prod_id),
  2559.             'combinations' => $repoProduct->findByProductsCombination($prod_id),
  2560.         ]);
  2561.     }
  2562.     #[Route(path'/admin/product-combination-remove/{prod_id}/{com_prod_id}'name'admin_combination_remove'defaults: [
  2563.         'prod_id' => 0,
  2564.         'com_prod_id' => ''
  2565.     ])]
  2566.     public function product_combination_remove(
  2567.         EcoProductsCombinationRepository $repoProductCombination,
  2568.                                          $com_prod_id,
  2569.                                          $prod_id 0
  2570.     )
  2571.     {
  2572.         $combination $repoProductCombination->findBy(['product_id' => $prod_id'com_product_id' => $com_prod_id]);
  2573.         foreach ($combination as $comb) {
  2574.             $this->entityManager->remove($comb);
  2575.         }
  2576.         $this->entityManager->flush();
  2577.         $this->addFlash('success'"Suppression avec succès");
  2578.         return $this->redirectToRoute('admin_product_combination', ['prod_id' => $prod_id]);
  2579.     }
  2580.     #[Route(path'/admin/products/product-search'options: ['expose' => true])]
  2581.     public function searchProduct(Request $requestEcoProductsRepository $repoCustomers)
  2582.     {
  2583.         $customers $repoCustomers->findBySearchProductsByFilter($request->get('search'));
  2584.         $datas = [];
  2585.         foreach ($customers as $key => $result) {
  2586.             $data = [
  2587.                 'label' => $result['prod_model'],
  2588.                 'value' => $result['prod_model'],
  2589.                 'id' => $result['prod_id'],
  2590.             ];
  2591.             $datas[] = $data;
  2592.         }
  2593.         return new JsonResponse([
  2594.             'datas' => json_encode($datas),
  2595.         ]);
  2596.     }
  2597.     #[Route(path'/admin/insert-combination/{prod_id}'name'admin_insert_combination'defaults: ['prod_id' => 0])]
  2598.     public function insert_combination(
  2599.         Request                          $request,
  2600.         EcoProductsCombinationRepository $repoProductCombination,
  2601.                                          $prod_id 0
  2602.     )
  2603.     {
  2604.         $result $repoProductCombination->findBy([
  2605.             'product_id' => $prod_id,
  2606.             'com_product_id' => $request->get('product_id')
  2607.         ]);
  2608.         //Si pas de résultat on peut insérer la combinaison
  2609.         if ($result == null) {
  2610.             $combination = new EcoProductsCombination();
  2611.             $combination->setProductId($prod_id);
  2612.             $combination->setComProductId($request->get('product_id'));
  2613.             $this->entityManager->persist($combination);
  2614.             $this->entityManager->flush();
  2615.             $this->addFlash('success'"Ajout avec succès");
  2616.         } else {
  2617.             $this->addFlash('danger'"Cet article est déjà attribué.");
  2618.         }
  2619.         return $this->redirectToRoute('admin_product_combination', ['prod_id' => $prod_id]);
  2620.     }
  2621.     #[Route(path'/admin/products/bundle/{prod_id}'name'admin_product_bundle'defaults: ['prod_id' => ''])]
  2622.     public function bundle(Request $requestEcoProductsRepository $repoProduct$prod_id)
  2623.     {
  2624.         return $this->render('admin/admin_products/products_bundle.html.twig', [
  2625.             'product' => $repoProduct->find($prod_id),
  2626.             'product_id' => $prod_id,
  2627.             'bundles' => $repoProduct->findByProductsBundle($prod_id),
  2628.         ]);
  2629.     }
  2630.     #[Route(path'/admin/products/reference-search'options: ['expose' => true])]
  2631.     public function searchReferenceProduct(Request $requestEcoProductsRepository $repoCustomers)
  2632.     {
  2633.         $customers $repoCustomers->findBySearchReferencesByFilter($request->get('search'));
  2634.         $datas = [];
  2635.         foreach ($customers as $key => $result) {
  2636.             $data = [
  2637.                 'label' => $result['prod_model'] . ' - ' $result['ref_entitled'] . ' (' $result['ref_reference'] . ')',
  2638.                 'value' => $result['prod_model'] . ' ' $result['ref_entitled'],
  2639.                 'id' => $result['ref_id'],
  2640.             ];
  2641.             $datas[] = $data;
  2642.         }
  2643.         return new JsonResponse([
  2644.             'datas' => json_encode($datas),
  2645.         ]);
  2646.     }
  2647.     #[Route(path'/admin/insert-reference-bundle/{prod_id}'name'admin_insert_reference_bundle'defaults: ['prod_id' => 0])]
  2648.     public function insert_reference_bundle(
  2649.         Request                     $request,
  2650.         EcoProductsBundleRepository $repoProductBundle,
  2651.                                     $prod_id 0
  2652.     )
  2653.     {
  2654.         $result $repoProductBundle->findBy([
  2655.             'product_id' => $prod_id,
  2656.             'reference_id' => $request->get('reference_id')
  2657.         ]);
  2658.         //Si pas de résultat on peut insérer la combinaison
  2659.         if ($result == null) {
  2660.             $bundle = new EcoProductsBundle();
  2661.             $bundle->setProductId($prod_id);
  2662.             $bundle->setReferenceId($request->get('reference_id'));
  2663.             $bundle->setBundleQte(1);
  2664.             $this->entityManager->persist($bundle);
  2665.             $this->entityManager->flush();
  2666.             $this->addFlash('success'"Ajout avec succès");
  2667.         } else {
  2668.             $this->addFlash('danger'"Cet article est déjà attribué.");
  2669.         }
  2670.         return $this->redirectToRoute('admin_product_bundle', ['prod_id' => $prod_id]);
  2671.     }
  2672.     #[Route(path'/admin/product-bundle-remove/{prod_id}/{reference_id}'name'admin_bundle_remove'defaults: [
  2673.         'prod_id' => 0,
  2674.         'reference_id' => ''
  2675.     ])]
  2676.     public function product_bundle_remove(EcoProductsBundleRepository $repoProductBundle$reference_id$prod_id 0)
  2677.     {
  2678.         $bundles $repoProductBundle->findBy(['product_id' => $prod_id'reference_id' => $reference_id]);
  2679.         foreach ($bundles as $bundle) {
  2680.             $this->entityManager->remove($bundle);
  2681.         }
  2682.         $this->entityManager->flush();
  2683.         $this->addFlash('success'"Suppression avec succès");
  2684.         return $this->redirectToRoute('admin_product_bundle', ['prod_id' => $prod_id]);
  2685.     }
  2686.     #[Route(path'/admin/products/axUpdateProductQtePack')]
  2687.     public function axUpdateProductQtePack(
  2688.         Request                     $request,
  2689.         EcoProductsBundleRepository $repoBundle,
  2690.         FlashNotificationAjax       $flash
  2691.     )
  2692.     {
  2693.         if ($request->get('product_id') && $request->get('reference_id') && $request->get('qte') && $request->get(
  2694.                 'qte'
  2695.             ) > 0) {
  2696.             $prodPack $repoBundle->findOneBy([
  2697.                 'product_id' => $request->get('product_id'),
  2698.                 'reference_id' => $request->get('reference_id')
  2699.             ]);
  2700.             if ($prodPack != null) {
  2701.                 $prodPack->setBundleQte($request->get('qte'));
  2702.                 $this->entityManager->persist($prodPack);
  2703.                 $this->entityManager->flush();
  2704.                 return new JsonResponse([
  2705.                     'status' => true,
  2706.                     'flashMessage' => $flash->notification(
  2707.                         'success',
  2708.                         'enregistré avec succès'
  2709.                     ),
  2710.                 ]);
  2711.             }
  2712.         }
  2713.         return new JsonResponse([
  2714.             'status' => false,
  2715.             'flashMessage' => $flash->notification(
  2716.                 'danger',
  2717.                 "Une erreur s'est produite lors de l'enregistrement"
  2718.             ),
  2719.         ]);
  2720.     }
  2721. }