src/Controller/Articles/StockController.php line 300

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Articles;
  3. use App\Entity\Articles\Article;
  4. use App\Entity\Articles\Categorie;
  5. use App\Entity\Articles\Marque;
  6. use App\Entity\FO\Societe;
  7. use App\Entity\Inventaires\ArticleInventaire;
  8. use App\Entity\Inventaires\Inventaire;
  9. use App\Library\Datatable\Util\Datatable;
  10. use App\Service\Articles\ArticleService;
  11. use App\Service\Articles\MouvementStockService;
  12. use App\Service\Utilisateur\ColonneTableauService;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Validator\Validator\ValidatorInterface;
  20. use Symfony\Contracts\Translation\TranslatorInterface;
  21. use Knp\Snappy\Pdf;
  22. class StockController extends AbstractController
  23. {
  24.     /**
  25.      * @Route("/stock/regulation", name="dtc_stock_regulation")
  26.      */
  27.     public function regulationAction(Request            $requestMouvementStockService $mouvementStockServiceTranslatorInterface $translator,
  28.                                      ValidatorInterface $validator
  29.     ) {
  30.         if ($request->isMethod('POST')) {
  31.             $parametres $request->request->all();
  32.             $mouvementStockService->regulation($parametres);
  33.             $this->addFlash('notice'$translator->trans('Régulation de stock ajouté avec succès !'));
  34.         }
  35.         return $this->render('Articles/Stock/regulation.html.twig', []);
  36.     }
  37.     /**
  38.      * @Route("/stock/valorisation", name="dtc_stock_valorisation")
  39.      */
  40.     public function valorisationAction(Request $requestTranslatorInterface $translator)
  41.     {
  42.         $titre_modal $translator->trans("Valorisation du stock");
  43.         $inventaire  $request->query->get('inventaire');
  44.         if ($request->isMethod('POST')) {
  45.             $type                "valorisation";
  46.             $suffixe             "aaaa";
  47.             $param               $request->request->all();
  48.             $param['inventaire'] = $inventaire;
  49.             //$this->pdfValorisationAction($suffixe,$param,false);
  50.             if ($request->request->get('typeSortie') == 'csv') {
  51.                 $url $this->generateUrl('dtc_stock_valorisation_export_csv', ['id' => $suffixe'param' => $param]);
  52.             } else {
  53.                 $url $this->generateUrl('dtc_stock_valorisation_pdf', ['id' => $suffixe'param' => $param't' => time()]);
  54.             }
  55.         } else {
  56.             $type "";
  57.             $url  "";
  58.         }
  59.         $rendu $this->renderView('Articles/Stock/valorisation.html.twig', [
  60.             'inventaire' => $inventaire,
  61.         ]);
  62.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => $url'titre' => $titre_modal"type" => $type]
  63.         );
  64.     }
  65.     /**
  66.      * @Route("/stock/valorisation/csv", name="dtc_stock_valorisation_csv")
  67.      */
  68.     public function valorisationCsvAction(Request $requestTranslatorInterface $translator)
  69.     {
  70.         $titre_modal $translator->trans("Valorisation du stock");
  71.         $inventaire  $request->query->get('inventaire');
  72.         if ($request->isMethod('POST')) {
  73.             $type                "valorisation";
  74.             $suffixe             "aaaa";
  75.             $param               $request->request->all();
  76.             $param['inventaire'] = $inventaire;
  77.             //var_dump($param);die;
  78.             //$this->pdfValorisationAction($suffixe,$param,false);
  79.             $url $this->generateUrl('dtc_stock_valorisation_export_csv', ['id' => $suffixe'param' => $param]);
  80.         } else {
  81.             $type "";
  82.             $url  "";
  83.         }
  84.         $rendu $this->renderView('Articles/Stock/valorisation.html.twig', [
  85.             'inventaire' => $inventaire,
  86.         ]);
  87.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => $url'titre' => $titre_modal"type" => $type]
  88.         );
  89.     }
  90.     /**
  91.      * @Route("/stock/valorisation/export-csv/{id}", name="dtc_stock_valorisation_export_csv")
  92.      */
  93.     public function valorisationExportCsvAction(Request $request$idEntityManagerInterface $emArticleService $article_serviceMouvementStockService $mouvement_service)
  94.     {
  95.         //ini_set('memory_limit', '512');
  96.         set_time_limit(300);
  97.         $param $request->query->All();
  98.         //dump($param);
  99.         $param $param['param'];
  100.         //dump($param);
  101.         $date = new \Datetime();
  102.         $dir  'Export/valorisation/'.date("Y").'/'.date("m").'/'.date("d").'/';
  103.         if ( ! is_dir($dir)) {
  104.             mkdir($dir755true);
  105.         }
  106.         $file $dir.'export_valorisation_'.date_format($date'Ymd_hms').'.csv';
  107.         if (is_file($file)) {
  108.             unlink($file);
  109.         }
  110.         $handle    fopen($file'w+');
  111.         $delimiter ';';
  112.         if (array_key_exists('date'$param)) {
  113.             fputcsv($handle, ["Stock a la date du : ".$param['date']], $delimiter);
  114.         } else {
  115.             $param['date'] = $date->format('d/m/Y');
  116.         }
  117.         if (array_key_exists('marque'$param)) {
  118.             fputcsv($handle, ["Marque : ".$param['marque']], $delimiter);
  119.         }
  120.         if (array_key_exists('article'$param)) {
  121.             fputcsv($handle, ["Article : ".$param['article']], $delimiter);
  122.         }
  123.         if (array_key_exists('inventaire'$param)) {
  124.             fputcsv($handle, ["Inventaire N°".$param['inventaire']], $delimiter);
  125.         }
  126.         if (array_key_exists('code'$param)) {
  127.             fputcsv($handle, ["Code de prix : ".$param['code']], $delimiter);
  128.         }
  129.         if (array_key_exists('stock'$param) && $param['stock'] == 1) {
  130.             fputcsv($handle, ["Stock = 0 : oui"], $delimiter);
  131.         } else {
  132.             fputcsv($handle, ["Stock = 0 : non"], $delimiter);
  133.         }
  134.         $quantiteTotale    0;
  135.         $valeurStockTotale 0;
  136.         if (array_key_exists('inventaire'$param)) {
  137.             $result = ['Reference''Libelle''Qte Stock'];
  138.         } else {
  139.             $result = ['Reference''Libelle''Qte Stock'];
  140.         }
  141.         if (array_key_exists('code'$param) && $param['code'] == "pump") {
  142.             $result[] = "PUMP";
  143.         } elseif (array_key_exists('code'$param) && $param['code'] == "dernier") {
  144.             $result[] = "Dernier P. Achat";
  145.         } else {
  146.             $result[] = "P. Achat net";
  147.         }
  148.         $result[] = 'Valeur Stock';
  149.         fputcsv($handle$result$delimiter);
  150.         $articles = [];
  151.         if (array_key_exists('inventaire'$param)) {
  152.             //inventaire
  153.             //dump($param['tri']);
  154.             $articlesInventaire $em->getRepository(ArticleInventaire::class)->findByTri($param['inventaire'], $param['tri']);
  155.             //dump($articlesInventaire);
  156.             $inventaireObjet $em->getRepository(Inventaire::class)->find($param['inventaire']);
  157.             foreach ($articlesInventaire as $articleInventaire) {
  158.                 $result            = [];
  159.                 $result[]          = $articleInventaire['reference'];
  160.                 $result[]          = $articleInventaire['libelle'];
  161.                 $stockValorisation floatval($articleInventaire['stockReleve']);
  162.                 if (array_key_exists('code'$param) && $param['code'] == "pump") {
  163.                     $prixUnitaire $article_service->getCump($articleInventaire['article_id'], $inventaireObjet->getDate()->format('Y-m-d H:i:s'));
  164.                 } elseif (array_key_exists('code'$param) && $param['code'] == "pump") {
  165.                     $prixUnitaire $mouvement_service->getDernierPrixAchat($articleInventaire['article_id'], $inventaireObjet->getDate());
  166.                 } else {
  167.                     $prixUnitaire $article_service->getPrixAchat($articleInventaire['article_id'], $inventaireObjet->getDate()->format('d/m/Y'));
  168.                 }
  169.                 $result[]    = $stockValorisation;
  170.                 $result[]    = round($prixUnitaire2);
  171.                 $valeurStock $stockValorisation $prixUnitaire;
  172.                 $result[]    = round($valeurStock2);
  173.                 fputcsv($handle$result$delimiter);
  174.                 $quantiteTotale    += $stockValorisation;
  175.                 $valeurStockTotale += $valeurStock;
  176.             }
  177.             fputcsv($handle, [''''$quantiteTotale''$valeurStockTotale], $delimiter);
  178.         } else {
  179.             $articles $em->getRepository(Article::class)->valorisation($param);
  180.             if (count($articles) > 0) {
  181.                 foreach ($articles as $article) {
  182.                     //$result[] = $article['stock_date'];
  183.                     if (array_key_exists('code'$param) && $param['code'] == "pump") {
  184.                         //$prixUnitaire = $article['pump'];
  185.                         $dernierMouvementDate $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
  186.                         $prixUnitaire         $dernierMouvementDate["pumpHorsFrais"];
  187.                         if ($prixUnitaire == "" or $prixUnitaire == 0) {
  188.                             $prixUnitaire $article['pump_hors_frais'];
  189.                         }
  190.                         $stockValorisation $dernierMouvementDate["stock"];
  191.                     } elseif (array_key_exists('code'$param) && $param['code'] == "dernier") {
  192.                         $prixUnitaire $article_service->getDernierPrixAchat($article['article_id'], $param['date']);
  193.                         $dernierMouvementDate $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
  194.                         $stockValorisation    $dernierMouvementDate["stock"];
  195.                     } else {
  196.                         $prixUnitaire $article_service->getPrixAchat($article['article_id'], $param['date']);
  197.                         $dernierMouvementDate $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
  198.                         $stockValorisation    $dernierMouvementDate["stock"];
  199.                     }
  200.                     $afficher false;
  201.                     if ($stockValorisation or $param['stock'] == "1") {
  202.                         $afficher true;
  203.                     }
  204.                     if(!is_numeric($stockValorisation)) {
  205.                         $stockValorisation 0;
  206.                     }
  207.                     if ($afficher) {
  208.                         $result      = [];
  209.                         $result[]    = $article['reference'];
  210.                         $result[]    = $article['libelle'];
  211.                         $result[]    = $stockValorisation;
  212.                         $result[]    = $prixUnitaire;
  213.                         $valeurStock $stockValorisation $prixUnitaire;
  214.                         $result[]    = $valeurStock;
  215.                         fputcsv($handle$result$delimiter);
  216.                         $quantiteTotale    += $stockValorisation;
  217.                         $valeurStockTotale += $valeurStock;
  218.                     }
  219.                     /*
  220.                     $result[] = $prixUnitaire;
  221.                     $valeurStock = $article['stock_date'] * $prixUnitaire;
  222.                     $result[] = $valeurStock;
  223.                     fputcsv($handle, $result, $delimiter);
  224.                     $quantiteTotale += $article['stock_date'];
  225.                     $valeurStockTotale += $valeurStock;
  226.                     */
  227.                 }
  228.             }
  229.             fputcsv($handle, [''$quantiteTotale''$valeurStockTotale], $delimiter);
  230.         }
  231.         //var_dump($articles);die;
  232.         //die;
  233.         rewind($handle);
  234.         $content stream_get_contents($handle);
  235.         fclose($handle);
  236.         $filename 'valorisation_'.date_format($date'Ymd_hms').'.csv';
  237.         return new Response($content200, [
  238.             'Content-Type'        => 'application/force-download; charset=ISO-8859-1',
  239.             'Content-Disposition' => 'attachment; filename="'.$filename.'"',
  240.         ]);
  241.     }
  242.     /**
  243.      * @Route("/stock/valorisation/pdf/{id}", name="dtc_stock_valorisation_pdf")
  244.      */
  245.     public function pdfValorisationAction(Request $request$id$param ""$retour trueEntityManagerInterface $emPdf $snappy)
  246.     {
  247.         $param $request->query->all();
  248.         //print_r($param['param']);
  249.         $societe $em->getRepository(Societe::class)->find(1);
  250.         //return $this->render('GestionComerciale/BonLivraison/template_pdf.html.twig',array('commande'  => $bonPreparation,'societe'  => $societe));
  251.         $footer $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', ['societe' => $societe]);
  252.         //$header = $this->renderView('FO/PDF/header_bl_pdf.html.twig', array('societe'  => $societe,'commande'  => $bonPreparation));
  253.         $header "";
  254.         //$snappy = $this->get('knp_snappy.pdf');
  255.         //$snappy->setOption('page-size', 'A4');
  256.         $snappy->setOption('header-html'$header);
  257.         $snappy->setOption('footer-html'$footer);
  258.         //$snappy->setOption('header-html',$footer);
  259.         $snappy->setOption('margin-bottom'"10");
  260.         //$snappy->setOption('margin-top',"10");
  261.         //$snappy->setOption('zoom', 1 );
  262.         //$snappy->setOption('dpi', 300 );
  263.         //echo "<br/><br/><br/>";
  264.         //print_r($articles);
  265.         $marque "";
  266.         $donnees = [
  267.             'societe'    => $societe,
  268.             'parametres' => $param['param'],
  269.         ];
  270.         if (array_key_exists('marque'$param['param']) && $param['param']['marque'] != "") {
  271.             $marque $em->getRepository(Marque::class)->find($param['param']['marque']);
  272.         }
  273.         if (array_key_exists('inventaire'$param['param']) && $param['param']['inventaire'] != '') {
  274.             //$articlesInventaire = $em->getRepository('DTCInventairesBundle:ArticleInventaire')->findBy(array('inventaire'=>$param['param']['inventaire']));
  275.             $articlesInventaire            $em->getRepository(ArticleInventaire::class)->findByTri($param['param']['inventaire'], $param['param']['tri']);
  276.             $inventaire                    $em->getRepository(Inventaire::class)->find($param['param']['inventaire']);
  277.             $donnees['inventaire']         = $inventaire;
  278.             $donnees['articlesInventaire'] = $articlesInventaire;
  279.             $chemin_pdf                    'PDF/STOCK/VALORISATION-INVENTAIRE'.$param['param']['inventaire'].'.pdf';
  280.         } else {
  281.             $articles   $em->getRepository(Article::class)->valorisation($param['param']);
  282.             $chemin_pdf 'PDF/STOCK/VALORISATION-'.$id.'.pdf';
  283.         }
  284.         if (file_exists($chemin_pdf)) {
  285.             unlink($chemin_pdf);
  286.         }
  287.         if (array_key_exists('inventaire'$param['param']) && $param['param']['inventaire'] != '') {
  288.             $snappy->generateFromHtml(
  289.                 $this->renderView(
  290.                     'Articles/Stock/valorisation_inventaire_template_pdf.html.twig',
  291.                     $donnees
  292.                 ),
  293.                 $chemin_pdf
  294.             );
  295.         } else {
  296.             $snappy->generateFromHtml(
  297.                 $this->renderView(
  298.                     'Articles/Stock/valorisation_template_pdf.html.twig',
  299.                     [
  300.                         'societe'    => $societe,
  301.                         'articles'   => $articles,
  302.                         'parametres' => $param['param'],
  303.                         'marque'     => $marque,
  304.                     ]
  305.                 ),
  306.                 $chemin_pdf
  307.             );
  308.         }
  309.         if ($retour == true) {
  310.             return $this->render('FO/PDF/conteneur_pdf.html.twig', ['chemin_pdf' => '/'.$chemin_pdf]);
  311.             //return new RedirectResponse("/".$chemin_pdf);
  312.         }
  313.         //if($retour == true) return new RedirectResponse("/".$chemin_pdf);
  314.     }
  315.     /**
  316.      * @Route("/stock", name="dtc_stock_liste")
  317.      */
  318.     public function listerAction(Request $requestDatatable $datatableEntityManagerInterface $emTranslatorInterface $translatorColonneTableauService $serviceColonneTableau)
  319.     {
  320.         //\Doctrine\Common\Util\Debug::dump($filters);
  321.         $tableau_class_cellule[] = ["searchable" => false"className" => "colonne_id""targets" => [0], "visible" => true"orderable" => false];
  322.         $tableau_class_cellule[] = [
  323.             "searchable" => false,
  324.             "className"  => "colonne_id",
  325.             "targets"    => [1],
  326.             "visible"    => $serviceColonneTableau->getColonneUtilisateur(Article::class, "id"),
  327.         ];
  328.         $tableau_class_cellule[] = [
  329.             "searchable" => false,
  330.             "className"  => "colonne_libelle",
  331.             "targets"    => [2],
  332.             "visible"    => $serviceColonneTableau->getColonneUtilisateur(Article::class, "reference"),
  333.         ];
  334.         $tableau_class_cellule[] = [
  335.             "searchable" => false,
  336.             "className"  => "colonne_libelle",
  337.             "targets"    => [3],
  338.             "visible"    => $serviceColonneTableau->getColonneUtilisateur(Article::class, "libelle"),
  339.         ];
  340.         $tableau_class_cellule[] = [
  341.             "searchable" => false,
  342.             "className"  => "colonne_libelle",
  343.             "targets"    => [4],
  344.             "visible"    => $serviceColonneTableau->getColonneUtilisateur(Article::class, "marque"),
  345.         ];
  346.         $tableau_class_cellule[] = [
  347.             "searchable" => false,
  348.             "className"  => "colonne_prixBase",
  349.             "targets"    => [5],
  350.             "visible"    => $serviceColonneTableau->getColonneUtilisateur(Article::class, "stock"),
  351.         ];
  352.         $categorie_enfants        = [];
  353.         $repo_categorie_article   $em->getRepository(Categorie::class);
  354.         $categorie_article_racine $repo_categorie_article->findBy(["categorieParent" => 1]);
  355.         $param $request->query->all();
  356.         if (array_key_exists('categorie_article'$param) and $param["categorie_article"] > 0) {
  357.             $parent $repo_categorie_article->find($param["categorie_article"]);
  358.             if (is_object($parent)) {
  359.                 $categorie_enfants $repo_categorie_article->findBy(["categorieParent" => $parent]);
  360.             }
  361.         }
  362.         $this->datatable($request$datatable$em$translator);
  363.         return $this->render('Articles/Stock/lister.html.twig', [
  364.             'name'                   => 'article',
  365.             'tableauClassColonne'    => $tableau_class_cellule,
  366.             'parametres'             => $param,
  367.             "categorie_article"      => $categorie_article_racine,
  368.             "sous_categorie_article" => $categorie_enfants,
  369.         ]);
  370.     }
  371.     private function datatable(Request $requestDatatable $datatableEntityManagerInterface $emTranslatorInterface $translator)
  372.     {
  373.         $param      $request->query->all();
  374.         $parametres = [];
  375.         $where      "";
  376.         //print_r($param);
  377.         if ( ! array_key_exists('parametres'$param)) {
  378.             $param["parametres"] = $param;
  379.         }
  380.         $conn $em->getConnection();
  381.         $conn->getConfiguration()->setSQLLogger(null);
  382.         $qb $em->createQueryBuilder();
  383.         $qb->select(
  384.             "
  385.                     x.id as x_id,
  386.                     x.libelle as x_libelle,
  387.                     x.reference as x_reference,
  388.                     x.descriptionCourte as x_descriptionCourte,
  389.                     x.prixVente as x_prixVente,
  390.                     x.tauxMarge as x_tauxMarge,
  391.                     x.cpump as x_cpump,
  392.                     x.stock as x_stock,
  393.                     x.statut as x_statut,
  394.                     m.libelle as m_libelle,
  395.                     r.id as r_id,
  396.                     r.tauxDefaut as r_tauxDefaut
  397.                     "
  398.         )
  399.            ->from(Article::class, "x")
  400.            ->join('x.marque''m'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  401.            ->join('x.regleTaxe''r'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  402.         if (array_key_exists('categorie_article'$param['parametres']) and $param['parametres']['categorie_article'] != "") {
  403.             $qb->join('x.articleCategorie''ac'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  404.             $qb->join('ac.categorie''cat'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  405.             $where                   .= " AND cat.id = :categorie";
  406.             $parametres['categorie'] = $param['parametres']['categorie_article'];
  407.             if (array_key_exists('sous_categorie_article'$param['parametres']) and $param['parametres']['sous_categorie_article'] != "") {
  408.                 $qb->join('x.articleCategorie''ac2'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  409.                 $qb->join('ac2.categorie''cat2'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  410.                 $where                    .= " AND cat2.id = :categorie2";
  411.                 $parametres['categorie2'] = $param['parametres']['sous_categorie_article'];
  412.             }
  413.         }
  414.         $qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
  415.         if (count($parametres) > 0) {
  416.             $qb->setParameters($parametres);
  417.         }
  418.         $qb->orderBy("x.id""desc");
  419.         $datatable
  420.                           ->setFields(
  421.                               [
  422.                                   $translator->trans("ID") => 'x.id',
  423.                                   $translator->trans("Réf")     => 'x.reference',
  424.                                   $translator->trans("Libellé") => 'x.libelle',
  425.                                   $translator->trans("Marque")  => 'm.libelle',
  426.                                   $translator->trans("Stock") => 'x.stock',
  427.                                   $translator->trans("Actions") => 'x.id',
  428.                                   "_identifier_"                => 'x.id'
  429.                                   /*
  430.                                  $translator->trans("AA") =>  'x.id',
  431.                                  $translator->trans("BB") =>  'x.libelle',
  432.                                   "cc" => 'x.libelle',
  433.                                   "dd" => 'x.libelle',
  434.                                   "ee" => 'x.libelle',
  435.                                   "ff" => 'x.libelle',
  436.                                   "gg" => 'x.libelle',
  437.                                   "hh" => 'x.libelle',
  438.                                   "ii" => 'x.libelle',
  439.                                   "jj" => 'x.libelle',
  440.                                   "kk" => 'x.libelle',
  441.                                   "ll" => 'x.libelle',
  442.                                   "_identifier_" => 'x.id'
  443.                                   */
  444.                               ]
  445.                           )
  446.                           ->setRenderers(
  447.                               [
  448.                                   => [
  449.                                       'view'   => 'FO/DataTable/article_id.html.twig',
  450.                                       'params' => [
  451.                                           'edit_route' => 'dtc_article_modifier',
  452.                                       ],
  453.                                   ],
  454.                                   => [
  455.                                       'view'   => 'FO/DataTable/article_id.html.twig',
  456.                                       'params' => [
  457.                                           'edit_route' => 'dtc_article_modifier',
  458.                                       ],
  459.                                   ],
  460.                                   => [
  461.                                       'view'   => 'FO/DataTable/article_actions.html.twig',
  462.                                       'params' => [
  463.                                           'edit_route' => 'dtc_article_modifier',
  464.                                           //'dupliquer_route'    => 'dtc_article_dupliquer_formulaire',
  465.                                           'objet'      => Article::class,
  466.                                       ],
  467.                                   ],
  468.                               ]
  469.                           )
  470.                           ->setSearch(true)
  471.                           ->setGlobalSearch(1)
  472.                           ->setSearchFields([23])
  473.                           ->setFilteringType([=> 'e'=> 'e'])
  474.                           ->setSearchFields([23])
  475.                           ->setMultiple(
  476.                               [
  477.                                   'delete' => [
  478.                                       'title' => 'Non disponible',
  479.                                       'route' => 'dtc_client_liste_supprimer',
  480.                                   ],
  481.                               ]
  482.                           );
  483.         $datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
  484.         return $datatable;
  485.     }
  486.     /**
  487.      * @Route("/stock/grid", name="dtc_stock_liste_grid")
  488.      */
  489.     public function gridAction(Request $requestDatatable $datatableEntityManagerInterface $emTranslatorInterface $translator)
  490.     {
  491.         return $this->datatable($request$datatable$em$translator)->execute();
  492.     }
  493. }