src/Controller/GestionComerciale/OrdreRepController.php line 780

Open in your IDE?
  1. <?php
  2. namespace App\Controller\GestionComerciale;
  3. use App\Entity\Clients\Client;
  4. use App\Entity\FO\Societe;
  5. use App\Entity\GestionComerciale\ArticleCommande;
  6. use App\Entity\GestionComerciale\Commande;
  7. use App\Entity\GestionComerciale\OrdreRep;
  8. use App\Entity\GestionComerciale\StatutCommande;
  9. use App\Model\GestionCommerciale\TypeDocumentCommercial;
  10. use App\Entity\Projets\Intervention;
  11. use App\Entity\Utilisateur\Utilisateur;
  12. use App\Form\GestionComerciale\OrdreReparationType;
  13. use App\Form\GestionComerciale\OrdreRepType;
  14. use App\Library\Datatable\Util\Datatable;
  15. use App\Security\Voter\EntityVoter;
  16. use App\Service\GestionComerciale\AcompteService;
  17. use App\Service\GestionComerciale\OrdreRepService;
  18. use App\Service\Utilisateur\ColonneTableauService;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use Knp\Snappy\Pdf;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Validator\Validator\ValidatorInterface;
  27. use Symfony\Contracts\Translation\TranslatorInterface;
  28. class OrdreRepController extends AbstractController
  29. {
  30.     /**
  31.      * @Route("/vente/or/nouveau", name="dtc_ordre_reparation_ajouter")
  32.      * @Route("/ordre-reparation/nouveau", name="dtc_ordre_reparation_ajouter")
  33.      */
  34.     public function ajouterAction(Request $requestEntityManagerInterface $emOrdreRepService $ordreRepServiceTranslatorInterface $translatorValidatorInterface $validator)
  35.     {
  36.         set_time_limit(300);
  37.         $commande = new Commande();
  38.         $commande->setDateBon(null);
  39.         $user $this->getUser();
  40.         $commande->setUtilisateur($user);
  41.         $bpa       0;
  42.         $clie      "";
  43.         $operation $request->request->get('operation');
  44.         $client    $request->get('client');
  45.         if ($client != "") {
  46.             $repoClient $em->getRepository(Client::class);
  47.             $clie       $repoClient->find($client);
  48.             if (is_object($clie)) {
  49.                 $commande->setClient($clie);
  50.             }
  51.         }
  52.         $form   $this->createForm(OrdreReparationType::class, $commande);
  53.         $errors "";
  54.         $form->handleRequest($request);
  55.         if ($form->isSubmitted()) {
  56.             if ($form->isValid()) {
  57.                 $em->persist($commande);
  58.                 $em->flush();
  59.                 //echo "BBBB ".$request->request->get('operation');              
  60.                 //$articles = array('ids'=>$request->request->get('ids'),'commentaire'=>$request->request->get('commentaire'),'libelles'=>$request->request->get('libelles'),'tva'=>$request->request->get('tva'),'remiseSuppl'=>$request->request->get('remiseSuppl'),'prix'=>$request->request->get('prix'),'qte'=>$request->request->get('qte'));
  61.                 $articles = [
  62.                     'ids'                      => $request->request->get('ids'),
  63.                     'idArticleCommande'        => $request->request->get('idArticleCommande'),
  64.                     'idArticleCommandeOrigine' => $request->request->get('idArticleCommandeOrigine'),
  65.                     'remise'                   => $request->request->get('remise'),
  66.                     'remiseCalcule'            => $request->request->get('remiseCalcule'),
  67.                     'montantRemise'            => $request->request->get('montantRemise'),
  68.                     'commentaire'              => $request->request->get('commentaire'),
  69.                     'libellesSecondaires'      => $request->request->get('libellesSecondaires'),
  70.                     'libelles'                 => $request->request->get('libelles'),
  71.                     'tva'                      => $request->request->get('tva'),
  72.                     'remiseSuppl'              => $request->request->get('remiseSuppl'),
  73.                     'prix'                     => $request->request->get('prix'),
  74.                     'qte'                      => $request->request->get('qte'),
  75.                     'qtePrepa'                 => $request->request->get('qtePrepa'),
  76.                     'qteDispo'                 => $request->request->get('qteDispo'),
  77.                     'force'                    => $request->request->get('force'),
  78.                     'dateCT'                   => $request->request->get('dateCT'),
  79.                     'kilometrage'              => $request->request->get('kilometrage'),
  80.                     'commentaireSuppl'         => $request->request->get('commentaireSuppl'),
  81.                     'emplacement'              => $request->request->get('emplacement'),
  82.                     'nbEmplacement'            => $request->request->get('nbEmplacement'),
  83.                     'articlesCommandeRepris'   => $request->request->get('articlesCommandeRepris'),
  84.                 ];
  85.                 if ($operation == 'facture') {
  86.                     $operation 'factureDirecte';
  87.                 }
  88.                 $valeurs = ["articles" => $articles'typeDocument' => 'commande''operation' => $operation'toggle-devis-devis-or' => ''];
  89.                 $retour  $ordreRepService->sauvegarderOrdre($commande$valeurs);
  90.                 if ($retour['bpa'] == 1) {
  91.                     $bpa 1;
  92.                 }
  93.                 if ($operation == 'factureDirecte') {
  94.                     $this->addFlash(
  95.                         'notice',
  96.                         $translator->trans('Facture et Ordre de réparation ajoutés avec succès !')
  97.                     );
  98.                     return $this->redirectToRoute('dtc_facture_afficher', ["id" => $commande->getFacture()->getId(), 'operation' => $operation]);
  99.                 }
  100.                 $this->addFlash(
  101.                     'notice',
  102.                     $translator->trans('Ordre de réparation ajouté avec succès !')
  103.                 );
  104.                 return $this->redirectToRoute('dtc_ordre_reparation_modifier', ["id" => $commande->getId(), 'operation' => $operation"bpa" => $bpa'forceQteDispo' => true]);
  105.             } else {
  106.                 $errors $validator->validate($commande);
  107.                 //echo "PAS VALIDE";
  108.             }
  109.         }
  110.         return $this->render(
  111.             'GestionComerciale/OrdreRep/ajouter.html.twig',
  112.             ['form' => $form->createView(), 'errors' => $errors'operation' => $operation'client' => $clie'forceQteDispo' => true]
  113.         );
  114.     }
  115.     /**
  116.      * @Route("/ordre-reparation/modifier/{id}", name="dtc_ordre_reparation_modifier")
  117.      */
  118.     public function modifierAction(Request            $requestCommande $commandeEntityManagerInterface $emOrdreRepService $ordreRepService,
  119.                                    AcompteService     $serviceAcompteTranslatorInterface $translator,
  120.                                    ValidatorInterface $validator
  121.     ) {
  122.         set_time_limit(300);
  123.         $user $this->getUser();
  124.         $commande->setUtilisateur($user);
  125.         $annuler       $request->request->get('annuler');
  126.         $forceQteDispo $request->query->get('forceQteDispo');
  127.         if ($annuler == "annuler" || $annuler == "annuler_devis" || $annuler == "annuler_cmde") {
  128.             if (is_int($commande->getTypeDocumentCommercial()) and $commande->getTypeDocumentCommercial() == TypeDocumentCommercial::DEVIS0) {
  129.                 //$commande->setVisible(false);
  130.                 $this->addFlash(
  131.                     'notice',
  132.                     $translator->trans('Devis OR supprimé avec succès!')
  133.                 );
  134.                 $em->persist($commande);
  135.                 $em->flush();
  136.                 return $this->redirectToRoute('dtc_devis_or_liste');
  137.             } else {
  138.                 $ordreRepService->annuler($commande$annuler);
  139.                 $remboursement $serviceAcompte->proposerRemboursement($commande->getClient());
  140.                 $this->addFlash(
  141.                     'notice',
  142.                     $translator->trans('Ordre de réparation annulé avec succès !')
  143.                 );
  144.                 return $this->redirectToRoute('dtc_ordre_reparation_liste', ["r" => $remboursement"c" => $commande->getClient()->getId()]);
  145.             }
  146.         }
  147.         $form $this->createForm(OrdreReparationType::class, $commande);
  148.         $operation $request->request->get('operation');
  149.         $bpa       $request->query->get('bpa');
  150.         if ($operation == "") {
  151.             $operation $request->query->get('operation');
  152.         }
  153.         //$articles = array('ids'=>$request->request->get('ids'),'qte'=>$request->request->get('qte'),'remise'=>$request->request->get('remise'));
  154.         $articles = [
  155.             'ids'                      => $request->request->get('ids'),
  156.             'idArticleCommande'        => $request->request->get('idArticleCommande'),
  157.             'idArticleCommandeOrigine' => $request->request->get('idArticleCommandeOrigine'),
  158.             'remise'                   => $request->request->get('remise'),
  159.             'remiseCalcule'            => $request->request->get('remiseCalcule'),
  160.             'montantRemise'            => $request->request->get('montantRemise'),
  161.             'commentaire'              => $request->request->get('commentaire'),
  162.             'libellesSecondaires'      => $request->request->get('libellesSecondaires'),
  163.             'libelles'                 => $request->request->get('libelles'),
  164.             'tva'                      => $request->request->get('tva'),
  165.             'remiseSuppl'              => $request->request->get('remiseSuppl'),
  166.             'prix'                     => $request->request->get('prix'),
  167.             'qte'                      => $request->request->get('qte'),
  168.             'qtePrepa'                 => $request->request->get('qtePrepa'),
  169.             'force'                    => $request->request->get('force'),
  170.             'dateCT'                   => $request->request->get('dateCT'),
  171.             'kilometrage'              => $request->request->get('kilometrage'),
  172.             'commentaireSuppl'         => $request->request->get('commentaireSuppl'),
  173.             'emplacement'              => $request->request->get('emplacement'),
  174.             'nbEmplacement'            => $request->request->get('nbEmplacement'),
  175.             'articlesCommandeRepris'   => $request->request->get('articlesCommandeRepris'),
  176.             'qteDispo'                 => $request->request->get('qteDispo'),
  177.         ];
  178.         $valeurs  = ["articles" => $articles'operation' => $operation'toggle-devis-devis-or' => ''];
  179.         $errors "";
  180.         $form->handleRequest($request);
  181.         if ($form->isSubmitted()) {
  182.             if ($ordreRepService->estEditable($commande)) {
  183.                 $droit $this->isGranted(EntityVoter::UPDATEOrdreRep::class);
  184.                 if ( ! $droit) {
  185.                     return $this->redirectToRoute('dtc_ordre_reparation_modifier', ["id" => $commande->getId()]);
  186.                 }
  187.                 if ($form->isValid()) {
  188.                     if ($request->request->get('annuler') != '') {
  189.                         $ordreRepService->annulerOrdre($commande);
  190.                         $this->addFlash(
  191.                             'notice',
  192.                             $translator->trans('Ordre de réparation annulé avec succès !')
  193.                         );
  194.                         return $this->redirectToRoute('dtc_ordre_reparation_liste', ['operation' => $operation]);
  195.                     }
  196.                     if ($request->request->get('toggle-devis-devis-or') != '') {
  197.                         $valeurs['toggle-devis-devis-or'] = 'toggle-devis-devis-or';
  198.                     }
  199.                     $em->persist($commande);
  200.                     $em->flush();
  201.                     $retour $ordreRepService->sauvegarderOrdre($commande$valeurs);
  202.                     if ($retour['bpa'] == 1) {
  203.                         $bpa 1;
  204.                     } else {
  205.                         $bpa 0;
  206.                     }
  207.                     if ($operation == "facture") {
  208.                         $this->addFlash(
  209.                             'notice',
  210.                             $translator->trans('Facture sauvegardée avec succès !')
  211.                         );
  212.                         $repo_statut_document $em->getRepository(StatutCommande::class);
  213.                         $liste_statut         $repo_statut_document->findOneBy(["documentCommercial" => 6"ordre" => [1]]);
  214.                         $typeFac  TypeDocumentCommercial::FACTURE;
  215.                         $repo_fac $em->getRepository(Commande::class);
  216.                         $facture  $repo_fac->findOneBy(["commande" => $commande"typeDocumentCommercial" => $typeFac"visible" => 1"statutCommande" => $liste_statut]);
  217.                         return $this->redirectToRoute('dtc_facture_afficher', ["id" => $facture->getId()]);
  218.                     } else {
  219.                         $this->addFlash(
  220.                             'notice',
  221.                             $translator->trans('Ordre de réparation sauvegardé avec succès !')
  222.                         );
  223.                         //return $this->redirectToRoute('dtc_ordre_reparation_modifier',array("id"=>$commande->getId(),'operation'=>$operation));
  224.                         if ($request->request->get('toggle-devis-devis-or') != '') {
  225.                             return $this->redirectToRoute('dtc_devis_modifier', ["id" => $commande->getId(), 'forceQteDispo' => true]);
  226.                         } else {
  227.                             return $this->redirectToRoute(
  228.                                 'dtc_ordre_reparation_modifier',
  229.                                 ["id" => $commande->getId(), 'operation' => $operation"bpa" => $bpa'forceQteDispo' => true]
  230.                             );
  231.                         }
  232.                     }
  233.                 } else {
  234.                     //echo "ERREUR";
  235.                     $errors $validator->validate($commande);
  236.                     //\Doctrine\Common\Util\Debug::dump($errors);
  237.                 }
  238.             } else {
  239.                 $this->addFlash(
  240.                     'warning',
  241.                     "L'ordre de réparation n'est plus éditable !"
  242.                 );
  243.                 //return $this->redirectToRoute('dtc_ordre_reparation_modifier',array("id"=>$commande->getId(),'operation'=>$operation));
  244.                 //echo "<div>PAS EDIT OK</div>";
  245.             }
  246.         }
  247.         if ($bpa == 1) {
  248.             $repo_bp    $em->getRepository(Commande::class);
  249.             $dernierBpa $repo_bp->getDernierBonPrepaAtelier($commande);
  250.             if (count($dernierBpa) > 0) {
  251.                 $bpa $dernierBpa["id"];
  252.             }
  253.         }
  254.         return $this->render(
  255.             'GestionComerciale/OrdreRep/ajouter.html.twig',
  256.             ['form' => $form->createView(), 'errors' => $errors'commande' => $commande'operation' => $operation"bpa" => $bpa'forceQteDispo' => $forceQteDispo]
  257.         );
  258.     }
  259.     /**
  260.      * @Route("/vente/or/nouveau/modal/{id}/{type}", name="dtc_ordre_reparation_ajouter_modal")
  261.      */
  262.     public function ajouterModalAction(Request            $request$id$type ""EntityManagerInterface $emOrdreRepService $ordreReprationServiceTranslatorInterface $translator,
  263.                                        ValidatorInterface $validator
  264.     ) {
  265.         $titre_modal $translator->trans("Nouveau OR");
  266.         $repo_objet  $em->getRepository(Commande::class);
  267.         $objet       $repo_objet->find($id);
  268.         $ordreRep = clone $objet;
  269.         $ordreRep->setDateBon(new \DateTime());
  270.         $user $this->getUser();
  271.         $ordreRep->setUtilisateur($user);
  272.         $form   $this->createForm(OrdreRepType::class, $ordreRep);
  273.         $errors "";
  274.         $form->handleRequest($request);
  275.         $idsArticleCommande $request->query->get('choixArticles');
  276.         $repo_objet         $em->getRepository(Commande::class);
  277.         $objet              $repo_objet->find($id);
  278.         $ordreRep->setCommande($objet);
  279.         $link            $this->generateUrl('dtc_ordre_reparation_ajouter', ['id' => $objet->getId(), 'type' => 'commande']);
  280.         $articleCommande $em->getRepository(ArticleCommande::class)->listeArticleCommandeSelectionne($idsArticleCommande);
  281.         if ($form->isSubmitted()) {
  282.             if ($form->isValid()) {
  283.                 $url $this->generateUrl('dtc_commande_modifier', ['id' => $objet->getId(), 'tab' => 'or']);
  284.                 $articles = [
  285.                     'idArticleCommande' => $request->request->get('idArticleCommande'),
  286.                     'quantiteInit'      => $request->request->get('quantiteInit'),
  287.                     'quantite'          => $request->request->get('quantite'),
  288.                 ];
  289.                 $valeurs  = ["articles" => $articles];
  290.                 $ordreReprationService->sauvegarder($ordreRep$valeurs);
  291.                 $this->addFlash(
  292.                     'notice',
  293.                     $translator->trans('Ordre de réparation ajouté avec succès !')
  294.                 );
  295.                 return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  296.             } else {
  297.                 $errors $validator->validate($ordreRep);
  298.                 $rendu  $this->renderView(
  299.                     'GestionComerciale/OrdreRep/ajouter_modal.html.twig',
  300.                     ['form' => $form->createView(), 'errors' => $errors'id' => $id'type' => $type'articleCommande' => $articleCommande]
  301.                 );
  302.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  303.             }
  304.         }
  305.         $rendu $this->renderView(
  306.             'GestionComerciale/OrdreRep/ajouter_modal.html.twig',
  307.             ['form' => $form->createView(), 'errors' => $errors'id' => $id'type' => $type'articleCommande' => $articleCommande]
  308.         );
  309.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''link' => $link'titre' => $titre_modal]);
  310.     }
  311.     /**
  312.      * @Route("/vente/or", name="dtc_ordre_reparation_liste")
  313.      * @Route("/ordre-reparation", name="dtc_ordre_reparation_liste")
  314.      */
  315.     public function listerAction(Request             $request$id "0"$type "a"EntityManagerInterface $emColonneTableauService $serviceColonneTableauDatatable $datatable,
  316.                                  TranslatorInterface $translator
  317.     ) {
  318.         $repo_objet $em->getRepository(Commande::class);
  319.         $objet      $repo_objet->find($id);
  320.         $param $request->query->all();
  321.         if (is_object($objet)) {
  322.             $this->datatableCommande($datatable$translator,$objet$type);
  323.             return $this->render('GestionComerciale/OrdreRep/lister_commande.html.twig', ["id" => $id"type" => $type'parametres' => $param]);
  324.         } else {
  325.             $statutCommande          $request->query->get('statutCommande');
  326.             $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [0], "visible" => true"orderable" => false];
  327.             $tableau_class_cellule[] = [
  328.                 "className" => "visible_export colonne_id",
  329.                 "targets"   => [1],
  330.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "id"),
  331.             ];
  332.             $tableau_class_cellule[] = [
  333.                 "className" => "visible_export colonne_id",
  334.                 "targets"   => [2],
  335.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "reference"),
  336.             ];
  337.             $tableau_class_cellule[] = [
  338.                 "className" => "visible_export colonne_id",
  339.                 "targets"   => [3],
  340.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "date"),
  341.             ];
  342.             $tableau_class_cellule[] = [
  343.                 "className" => "visible_export colonne_id",
  344.                 "targets"   => [4],
  345.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "statutCommande"),
  346.             ];
  347.             $tableau_class_cellule[] = [
  348.                 "className" => "visible_export colonne_id",
  349.                 "targets"   => [5],
  350.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "refclient"),
  351.             ];
  352.             $tableau_class_cellule[] = [
  353.                 "className" => "visible_export colonne_id",
  354.                 "targets"   => [6],
  355.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "client"),
  356.             ];
  357.             $tableau_class_cellule[] = [
  358.                 "className" => "visible_export colonne_id",
  359.                 "targets"   => [7],
  360.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "rdv"),
  361.             ];
  362.             $tableau_class_cellule[] = [
  363.                 "className" => "visible_export colonne_id",
  364.                 "targets"   => [8],
  365.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "equipier"),
  366.             ];
  367.             $tableau_class_cellule[] = [
  368.                 "className" => "visible_export colonne_id",
  369.                 "targets"   => [9],
  370.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "immat"),
  371.             ];
  372.             $tableau_class_cellule[] = [
  373.                 "className" => "visible_export colonne_id",
  374.                 "targets"   => [10],
  375.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "marque"),
  376.             ];
  377.             $tableau_class_cellule[] = [
  378.                 "className" => "visible_export colonne_id",
  379.                 "targets"   => [11],
  380.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "modele"),
  381.             ];
  382.             $tableau_class_cellule[] = [
  383.                 "className" => "visible_export colonne_id",
  384.                 "targets"   => [12],
  385.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "km"),
  386.             ];
  387.             $tableau_class_cellule[] = [
  388.                 "className" => "visible_export colonne_id",
  389.                 "targets"   => [13],
  390.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "serie"),
  391.             ];
  392.             $tableau_class_cellule[] = [
  393.                 "className" => "visible_export colonne_id",
  394.                 "targets"   => [14],
  395.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "commentaire"),
  396.             ];
  397.             $tableau_class_cellule[] = [
  398.                 "className" => "visible_export colonne_id",
  399.                 "targets"   => [15],
  400.                 "visible"   => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "refCli"),
  401.             ];
  402.             $tableau_class_cellule[] = ["orderable" => false"className" => "colonne_id""targets" => [16], "visible" => true];
  403.             $this->datatable($request$datatable$translator);
  404.             return $this->render(
  405.                 'GestionComerciale/OrdreRep/lister.html.twig',
  406.                 ["id" => $id"type" => $type'tableauClassColonne' => $tableau_class_cellule'statutCommande' => $statutCommande'parametres' => $param]
  407.             );
  408.         }
  409.     }
  410.     /**
  411.      * set datatable configs
  412.      *
  413.      * @return \App\Library\Datatable\Util\Datatable
  414.      */
  415.     private function datatable(Request $requestDatatable $datatableTranslatorInterface $translator)
  416.     {
  417.         $param $request->query->all();
  418.         $datatable->setEntity(Commande::class, "x")
  419.                   ->setFields(
  420.                       [
  421.                           $translator->trans("ID")           => 'x.id',
  422.                           $translator->trans("Réf")          => 'x.reference',
  423.                           $translator->trans("Date")         => 'x.date',
  424.                           $translator->trans("Statut")       => 'sc.id',
  425.                           $translator->trans("Réf client")   => 'c.reference',
  426.                           $translator->trans("Client")       => 'c.nom',
  427.                           $translator->trans("RDV ")         => 'x.dateBon',
  428.                           $translator->trans("Équipier")     => 'u.reference',
  429.                           $translator->trans("Immat")        => 'v.immatriculation',
  430.                           $translator->trans("Marque")       => 'm.libelle',
  431.                           $translator->trans("Modèle")       => 'mo.libelle',
  432.                           $translator->trans("Km")           => 'v.kilometrage',
  433.                           $translator->trans("Num serie")    => 'v.numSerie',
  434.                           $translator->trans("Comm")         => 'x.commentaire',
  435.                           $translator->trans("Réf cmde cli") => 'x.referenceClient',
  436.                           $translator->trans("Actions")      => 'x.id',
  437.                           "_identifier_"                     => 'x.id',
  438.                       ]
  439.                   )
  440.                   ->addJoin('x.vehiculesClient''v'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  441.                   ->addJoin('v.marque''m'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  442.                   ->addJoin('x.statutCommande''sc'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  443.                   ->addJoin('v.modele''mo'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  444.                   ->addJoin('x.etatCommande''ec'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  445.                   ->addJoin('x.client''c'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  446.                   ->addJoin('x.utilisateur''u'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  447.                   ->addJoin('x.facture''f'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  448.                   ->setRenderers(
  449.                       [
  450.                           => [
  451.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  452.                               'params' => [
  453.                                   'edit_route' => 'dtc_ordre_reparation_modifier',
  454.                               ],
  455.                           ],
  456.                           => [
  457.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  458.                               'params' => [
  459.                                   'edit_route' => 'dtc_ordre_reparation_modifier',
  460.                               ],
  461.                           ],
  462.                           => [
  463.                               'view' => 'FO/DataTable/heure.html.twig',
  464.                           ],
  465.                           => [
  466.                               'view' => 'FO/DataTable/statut-commande-fournisseur.html.twig',
  467.                           ],
  468.                           => [
  469.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  470.                               'params' => [
  471.                                   'edit_route'   => 'dtc_client_modifier',
  472.                                   'typeDocument' => 'client',
  473.                               ],
  474.                           ],
  475.                           5  => [
  476.                               'view'   => 'FO/DataTable/client.html.twig',
  477.                               'params' => [],
  478.                           ],
  479.                           6  => [
  480.                               'view' => 'FO/DataTable/heure.html.twig',
  481.                           ],
  482.                           7  => [
  483.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  484.                               'params' => [
  485.                                   'edit_route'   => 'dtc_utilisateur_modifier',
  486.                                   'typeDocument' => 'equipier',
  487.                               ],
  488.                           ],
  489.                           9  => [
  490.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  491.                               'params' => [
  492.                                   'edit_route'   => 'dtc_vehicule_marque_modifier',
  493.                                   'typeDocument' => 'marqueVehiculeOr',
  494.                               ],
  495.                           ],
  496.                           10 => [
  497.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  498.                               'params' => [
  499.                                   'edit_route'   => 'dtc_vehicule_modele_modifier',
  500.                                   'typeDocument' => 'modeleVehiculeOr',
  501.                               ],
  502.                           ],
  503.                           13 => [
  504.                               'view' => 'FO/DataTable/commentaire.html.twig',
  505.                           ],
  506.                           15 => [
  507.                               'view'   => 'FO/DataTable/actions.html.twig',
  508.                               'params' => [
  509.                                   'edit_route' => 'dtc_ordre_reparation_modifier',
  510.                                   //'supprimer_route'    => 'dtc_commande_supprimer', 
  511.                                   'objet'      => Commande::class,
  512.                                   'deplier'    => true,
  513.                               ],
  514.                           ],
  515.                       ]
  516.                   )
  517.                   ->setMultiple(
  518.                       [
  519.                           'delete' => [
  520.                               'title' => 'Non disponible',
  521.                               'route' => 'dtc_commande_liste_supprimer',
  522.                           ],
  523.                       ]
  524.                   )
  525.                   ->setOrder("x.date""desc")
  526.             //->setOrder("ec.ordre", "desc")
  527.                   ->setSearch(true)
  528.                   ->setSearchFields([1345891012]);
  529.         $where      '';
  530.         $parameters = [];
  531.         if (is_object($request)) {
  532.             $statutCommande $request->query->get('statutCommande');
  533.             if ($statutCommande == '' || $statutCommande == '19') {
  534.                 if ($where != '') {
  535.                     $where .= ' AND ';
  536.                 }
  537.                 $where                                .= 'sc.id IN (:statutCommande) AND x.typeDocumentCommercial = :typeDocumentCommercial';//AND f.id IS NULL
  538.                 $parameters['statutCommande']         = [1415];
  539.                 $parameters['typeDocumentCommercial'] = 3;
  540.             } else {
  541.                 if ($where != '') {
  542.                     $where .= ' AND ';
  543.                 }
  544.                 $where                                .= 'sc.id = :statutCommande AND x.typeDocumentCommercial = :typeDocumentCommercial';
  545.                 $parameters['statutCommande']         = $statutCommande;
  546.                 $parameters['typeDocumentCommercial'] = 3;
  547.             }
  548.         } else {
  549.             $where                                .= 'sc.id IN (:statutCommande) AND x.typeDocumentCommercial = :typeDocumentCommercial AND f.id IS NULL';
  550.             $parameters['statutCommande']         = [1415];
  551.             $parameters['typeDocumentCommercial'] = 3;
  552.         }
  553.         if (array_key_exists('parametres'$param)) {
  554.             if (array_key_exists('client'$param["parametres"]) and $param["parametres"]["client"] > 0) {
  555.                 //$datatable->addJoin('x.client', 'client', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
  556.                 $parameters["client"] = $param["parametres"]["client"];
  557.                 if ($where != "") {
  558.                     $where .= " AND ";
  559.                 }
  560.                 $where .= "c.id = :client";
  561.             }
  562.             if (array_key_exists('client'$param["parametres"]) and $param["parametres"]["date_debut"] != "") {
  563.                 $param["parametres"]["date_debut"] = \DateTime::createFromFormat('d/m/Y'$param["parametres"]["date_debut"]);
  564.                 $param["parametres"]["date_debut"]->setTime(000000);
  565.                 $parameters["date_debut"] = $param["parametres"]["date_debut"];
  566.                 if ($where != "") {
  567.                     $where .= " AND ";
  568.                 }
  569.                 $where .= "x.date >= :date_debut";
  570.             }
  571.             if (array_key_exists('client'$param["parametres"]) and $param["parametres"]["date_fin"] != "") {
  572.                 $param["parametres"]["date_fin"] = \DateTime::createFromFormat('d/m/Y'$param["parametres"]["date_fin"]);
  573.                 $param["parametres"]["date_fin"]->setTime(235959);
  574.                 $parameters["date_fin"] = $param["parametres"]["date_fin"];
  575.                 if ($where != "") {
  576.                     $where .= " AND ";
  577.                 }
  578.                 $where .= "x.date <= :date_fin";
  579.             }
  580.         }
  581.         //echo $where;           
  582.         if ($where != '') {
  583.             //echo $where;
  584.             $datatable->setWhere($where$parameters);
  585.         }
  586.         //$datatable->setSearchFields(array(0,2));
  587.         return $datatable;
  588.     }
  589.     /**
  590.      * set datatable configs
  591.      *
  592.      * @return \App\Library\Datatable\Util\Datatable
  593.      */
  594.     private function datatableCommande(Datatable $datatableTranslatorInterface $translator$objet$type "")
  595.     {
  596.         $type_jointure 'x.'.$type;
  597.         $datatable->setDatatableId('dta-or')
  598.                   ->setEntity(Commande::class, "x")
  599.                   ->setFields(
  600.                       [
  601.                           $translator->trans("ID")       => 'x.id',
  602.                           $translator->trans("Réf")      => 'x.reference',
  603.                           $translator->trans("Véhicule") => 'vc.id',
  604.                           $translator->trans("Date")     => 'x.dateBon',
  605.                           $translator->trans("Actions")  => 'x.id',
  606.                           "_identifier_"                 => 'x.id',
  607.                       ]
  608.                   )
  609.             //->addJoin('x.client', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)      
  610.                   ->addJoin('x.vehiculesClient''vc'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  611.             //->addJoin('vc.marque', 'ma', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)      
  612.             //->addJoin('vc.modele', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)      
  613.             /*->setWhere(                                                     
  614.                     $type_jointure.' = :objet',
  615.                     array('objet' => $objet)
  616.                )
  617.               */
  618.                   ->setWhere(
  619.                 'x.commande = :objet AND x.typeDocumentCommercial = :typeDocumentCommercial',
  620.                 ['objet' => $objet'typeDocumentCommercial' => TypeDocumentCommercial::ORDREREPARATION]
  621.             )
  622.                   ->setRenderers(
  623.                       [
  624.                           => [
  625.                               'view'   => 'FO/DataTable/vehicule_client.html.twig',
  626.                               'params' => [
  627.                                   'objet' => $objet,
  628.                               ],
  629.                           ],
  630.                           => [
  631.                               'view'   => 'FO/DataTable/date.html.twig',
  632.                               'params' => [],
  633.                           ],
  634.                           => [
  635.                               'view'   => 'FO/DataTable/actions_modal.html.twig',
  636.                               'params' => [
  637.                                   //'edit_route'  => 'dtc_ordre_reparation_modifier', 
  638.                                   //'supprimer_route'  => 'dtc_ordre_reparation_supprimer', 
  639.                                   'pdf_route' => 'dtc_ordre_reparation_pdf',
  640.                                   'id'        => $objet->getId(),
  641.                                   'type'      => $type,
  642.                                   'entite'    => 'ordreRep',
  643.                                   'objet'     => Commande::class,
  644.                               ],
  645.                           ],
  646.                       ]
  647.                   )
  648.                   ->setOrder("x.id""desc")
  649.                   ->setSearch(true)//->setSearchFields(array(1,2))
  650.         ;
  651.         return $datatable;
  652.     }
  653.     /**
  654.      * Grid action
  655.      * @return Response
  656.      */
  657.     /**
  658.      * @Route("/vente/or/grid/{id}/{type}", name="dtc_ordre_reparation_liste_grid")
  659.      * @Route("/ordre-reparation/grid", name="dtc_ordre_reparation_liste_grid")
  660.      */
  661.     public function gridAction(Request $request$id ""$type ""EntityManagerInterface $emDatatable $datatableTranslatorInterface $translator)
  662.     {
  663.         $repo_objet $em->getRepository(Commande::class);
  664.         $objet      $repo_objet->find($id);
  665.         if (is_object($objet)) {
  666.             return $this->datatableCommande($datatable$translator,$objet$type)->execute();
  667.         } else {
  668.             return $this->datatable($request$datatable$translator)->execute();
  669.         }
  670.     }
  671.     /**
  672.      * Grid action
  673.      * @return Response
  674.      */
  675.     /**
  676.      * @Route("/or/pdf/{id}", name="dtc_ordre_reparation_pdf")
  677.      */
  678.     public function pdfOrdreReparationAction(Request $requestCommande $ordreReprationEntityManagerInterface $emPdf $snappy)
  679.     {
  680.         $prix       $request->query->get('prix');
  681.         $societe    $em->getRepository(Societe::class)->find(1);
  682.         $date_Y     date("Y");
  683.         $date_M     date("m");
  684.         $date_D     date("d");
  685.         $date       $date_Y.'/'.$date_M.'/'.$date_D;
  686.         $chemin_pdf 'PDF/OR/'.$date.'/OR-'.$ordreRepration->getReference().'.pdf';
  687.         if (file_exists($chemin_pdf)) {
  688.             unlink($chemin_pdf);
  689.         }
  690.         //return $this->render('GestionComerciale/OrdreRep/template_pdf.html.twig',array('commande'  => $ordreRepration,'societe'  => $societe));
  691.         $footer $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', ['societe' => $societe]);
  692.         $header $this->renderView('FO/PDF/header_or_pdf.html.twig', ['societe' => $societe'commande' => $ordreRepration]);
  693.         //return $header;
  694.         //$snappy->setOption('page-size', 'A4');
  695.         $snappy->setOption('header-html'$header);
  696.         $snappy->setOption('footer-html'$footer);
  697.         //$snappy->setOption('header-html',$footer);
  698.         $snappy->setOption('margin-bottom'"10");
  699.         //$snappy->setOption('margin-top',"2");
  700.         //$snappy->setOption('zoom', 1 );
  701.         //$snappy->setOption('dpi', 300 );
  702.         $reference $request->query->get('reference');
  703.         $snappy->generateFromHtml(
  704.             $this->renderView(
  705.                 'GestionComerciale/OrdreRep/template_pdf.html.twig',
  706.                 [
  707.                     'commande'  => $ordreRepration,
  708.                     'societe'   => $societe,
  709.                     'prix'      => $prix,
  710.                     'reference' => $reference,
  711.                 ]
  712.             ),
  713.             $chemin_pdf
  714.         );
  715.         return $this->render('FO/PDF/conteneur_pdf.html.twig', ['objet' => $ordreRepration'chemin_pdf' => '/'.$chemin_pdf]);
  716.         //return new RedirectResponse("/".$chemin_pdf);
  717.     }
  718.     /**
  719.      * @Route("/vente/or/imprimer/multiple", name="dtc_ordre_reparation_pdf_multiple")
  720.      */
  721.     public function imprimerMultipleAction(Request $requestEntityManagerInterface $em,  Pdf $snappy)
  722.     {
  723.         $data       $request->get('dataTables');
  724.         $ids        $data['actions'];
  725.         $tableauPdf = [];
  726.         $pdfRelier  'PDF/OR/OR-'.date('d-m-Y').'.pdf';
  727.         //$ids = array("118","101","93");
  728.         for ($i 0$i count($ids); $i++) {
  729.             $repo $em->getRepository(Commande::class);
  730.             $bon  $repo->find($ids[$i]);
  731.             if (is_object($bon)) {
  732.                 $this->pdfOrdreReparationAction($request$bon,  $em$snappy);
  733.                 $tableauPdf[] = $chemin_pdf 'PDF/OR/OR-'.$bon->getReference().'.pdf';
  734.             }
  735.         }
  736.         $cmd "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$pdfRelier ";
  737.         foreach ($tableauPdf as $file) {
  738.             $cmd .= $file." ";
  739.         }
  740.         //echo "<div>".$cmd."</div>";
  741.         $result shell_exec($cmd);
  742.         return new JsonResponse(['target' => '_blank''url' => '/'.$pdfRelier'valide' => '1']);
  743.     }
  744.     /**
  745.      * @Route("/ordre-reparation/suivi-main-oeuvre", name="dtc_ordre_reparation_suivi_mo_liste")
  746.      */
  747.     public function suiviMainOeuvreAction(Request $requestEntityManagerInterface $emColonneTableauService $serviceColonneTableauDatatable $datatableTranslatorInterface $translator)
  748.     {
  749.         $repo_utilisateur   $em->getRepository(Utilisateur::class);
  750.         $repo_interventions $em->getRepository(Intervention::class);
  751.         $repo_commande      $em->getRepository(Commande::class);
  752.         $mecanicien    0;
  753.         $mecanicienId  0;
  754.         $dateDebut     = new \DateTime('first day of');
  755.         $dateFin       = new \DateTime();
  756.         $dateFinPlusUn = new \DateTime();
  757.         if ($request->getMethod() == 'POST') {
  758.             $dateDebutRequest $request->request->get('dateDebut');
  759.             $dateFinRequest   $request->request->get('dateFin');
  760.             $mecanicien       $request->request->get('mecanicien');
  761.             $dateDebut     date_create_from_format('d/m/Y'$dateDebutRequest);
  762.             $dateFin       date_create_from_format('d/m/Y'$dateFinRequest);
  763.             $dateFinPlusUn date_create_from_format('d/m/Y'$dateFinRequest);
  764.             $dateDebut->setTime(000000);
  765.             $dateFin->setTime(235959);
  766.             $dateFinPlusUn->setTime(235959);
  767.         }
  768.         $interval = new \DateInterval('P1D');
  769.         $dateFinPlusUn->add($interval);
  770.         $mecanos $repo_utilisateur->findByType(4);
  771.         if ($mecanicien != && $mecanicien != '') {
  772.             $mecanicien $repo_utilisateur->find($mecanicien);
  773.             if (is_object($mecanicien)) {
  774.                 $nbMecanos    1;
  775.                 $mecanicienId $mecanicien->getId();
  776.             }
  777.         } else {
  778.             $nbMecanos count($mecanos);
  779.         }
  780.         //Nbre de jours ouvrables sur la période * 7h * nombre de mécanos
  781.         $nbHFacturables $this->get_nb_open_days(strtotime($dateDebut->format('Y-m-d')), strtotime($dateFin->format('Y-m-d'))) * $nbMecanos;
  782.         //Nombre heures travaillees sur la période = somme des des durees interventions dont la date d'intervention est dans la période
  783.         $nbHPassees max(0$repo_interventions->getTotalTempsInterventionDsPeriode($dateDebut$dateFin$mecanicien));
  784.         //Nombre d'heures de mo sur les factures de la période
  785.         $nbHFacturees max(0$repo_commande->getTotalHeuresFactureesDsPeriode($dateDebut$dateFin$mecanicienId));
  786.         if (is_numeric($nbHFacturees) && $nbHPassees != 0) {
  787.             $taux $nbHFacturees $nbHPassees;
  788.         } else {
  789.             $taux '';
  790.         }
  791.         $tableau_class_cellule = [];
  792.         //    $tableau_class_cellule[]=array("className"=>"visible_export colonne_id","targets"=>array(0),"visible"=>true,"orderable"=>false);
  793.         $tableau_class_cellule[] = [
  794.             "className" => "visible_export colonne_id",
  795.             "targets"   => [0],
  796.             // TODO CHANGE THIS
  797.             "visible"   => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi""date"),
  798.         ];
  799.         $tableau_class_cellule[] = [
  800.             "className" => "visible_export colonne_id",
  801.             "targets"   => [1],
  802.             "visible"   => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi""numero"),
  803.         ];
  804.         $tableau_class_cellule[] = [
  805.             "className" => "visible_export colonne_id",
  806.             "targets"   => [2],
  807.             "visible"   => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi""nom"),
  808.         ];
  809.         $tableau_class_cellule[] = [
  810.             "className" => "visible_export colonne_id",
  811.             "targets"   => [3],
  812.             "visible"   => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi""heure"),
  813.         ];
  814.         $tableau_class_cellule[] = [
  815.             "className" => "visible_export colonne_id",
  816.             "targets"   => [4],
  817.             "visible"   => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi""heurefac"),
  818.         ];
  819.         $tableau_class_cellule[] = ["orderable" => false"className" => "colonne_id""targets" => [5], "visible" => true];
  820.         //$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(4),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"client"));
  821.         //$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(5),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"heuresPassees"));
  822.         //$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(6),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"heuresFacturees"));
  823.         $this->datatableSuiviMainOeuvre($datatable$translator$mecanicienId$dateDebut->format('Y-m-d'), $dateFinPlusUn->format('Y-m-d'));
  824.         return $this->render('GestionComerciale/OrdreRep/lister-suivi-main-oeuvre.html.twig', [
  825.             'tableauClassColonne' => $tableau_class_cellule,
  826.             'nbHFacturables'      => $nbHFacturables,
  827.             'nbHPassees'          => $nbHPassees,
  828.             'nbHFacturees'        => $nbHFacturees,
  829.             'taux'                => $taux,
  830.             'dateDebut'           => $dateDebut,
  831.             'dateFin'             => $dateFin,
  832.             'dateFinPlusUn'       => $dateFinPlusUn,
  833.             'mecanos'             => $mecanos,
  834.             'mecanicien'          => $mecanicien,
  835.             'mecanicienId'        => $mecanicienId,
  836.         ]);
  837.     }
  838.     private function datatableSuiviMainOeuvre(Datatable $datatableTranslatorInterface $translator$mecanicien null$dateDebut null$dateFin null)
  839.     {
  840.         $where      "x.typeDocumentCommercial = :typeDocumentCommercial";
  841.         $parameters = ['typeDocumentCommercial' => TypeDocumentCommercial::ORDREREPARATION];
  842.         if ($dateDebut != null && $dateFin != null) {
  843.             $where                   .= " and x.dateBon >= :dateDebut and x.dateBon < :dateFin";
  844.             $parameters['dateDebut'] = $dateDebut;
  845.             $parameters['dateFin']   = $dateFin;
  846.         }
  847.         $datatable->setDatatableId('dta-or')
  848.                   ->setEntity(Commande::class, "x")
  849.                   ->setFields(
  850.                       [
  851.                           //$translator->trans("ID") =>  'x.id',   
  852.                           $translator->trans("Date OR")                 => 'x.dateBon',
  853.                           $translator->trans("Numéro OR")               => 'x.reference',
  854.                           $translator->trans("Nom client")              => 'c.id',
  855.                           $translator->trans("Nombre heures passées")   => 'x.tempsPasse',
  856.                           $translator->trans("Nombre heures facturées") => 'x.id',
  857.                           $translator->trans("Actions")                 => 'x.id',
  858.                           "_identifier_"                                => 'x.id',
  859.                       ]
  860.                   )
  861.                   ->addJoin('x.client''c'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  862.             //->addJoin('vc.marque', 'ma', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)      
  863.             //->addJoin('vc.modele', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)      
  864.             /*->setWhere(                                                     
  865.                     $type_jointure.' = :objet',
  866.                     array('objet' => $objet)
  867.                )
  868.               */
  869.         ;
  870.         if ($mecanicien != null && $mecanicien != 0) {
  871.             $where                    .= ' and m.id = :mecanicien';
  872.             $parameters['mecanicien'] = $mecanicien;
  873.             $datatable->addJoin('x.interventions''i'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  874.                       ->addJoin('i.mecanicien''m'\Doctrine\ORM\Query\Expr\Join::INNER_JOIN);
  875.         }
  876.         $datatable->setWhere($where$parameters)
  877.                   ->setRenderers(
  878.                       [
  879.                           => [
  880.                               'view' => 'FO/DataTable/heure.html.twig',
  881.                           ],
  882.                           => [
  883.                               'view'   => 'FO/DataTable/avec_lien_edit_route.html.twig',
  884.                               'params' => [
  885.                                   'edit_route' => 'dtc_ordre_reparation_modifier',
  886.                               ],
  887.                           ],
  888.                           => [
  889.                               'view'   => 'FO/DataTable/prenom_nom.html.twig',
  890.                               'params' => [
  891.                                   'typeUtilisateur' => 'client',
  892.                               ],
  893.                           ],
  894.                           => [
  895.                               'view' => 'FO/DataTable/num2chiffres.html.twig',
  896.                           ],
  897.                           => [
  898.                               'view' => 'FO/DataTable/heures_facturees.html.twig',
  899.                           ],
  900.                           => [
  901.                               'view'   => 'FO/DataTable/actions_modal.html.twig',
  902.                               'params' => [
  903.                                   //'edit_route'  => 'dtc_ordre_reparation_modifier', 
  904.                                   //'supprimer_route'  => 'dtc_ordre_reparation_supprimer', 
  905.                                   'pdf_route' => 'dtc_ordre_reparation_pdf',
  906.                                   'entite'    => 'ordreRep',
  907.                                   'objet'     => Commande::class,
  908.                               ],
  909.                           ],
  910.                       ]
  911.                   )
  912.                   ->setOrder("x.id""desc")
  913.                   ->setSearch(true)
  914.                   ->setGroupBy('x.id')
  915.                   ->setSearchFields([1234]);
  916.         return $datatable;
  917.     }
  918.     /**
  919.      * @Route("/ordre-reparation/suivi-main-oeuvre/grid", name="dtc_ordre_reparation_suivi_mo_liste_grid")
  920.      */
  921.     public function suiviMainOeuvreGridAction(Request $requestDatatable $datatableTranslatorInterface $translator)
  922.     {
  923.         $mecanicien $request->query->get('mecanicien');
  924.         $dateDebut  $request->query->get('dateDebut');
  925.         $dateFin    $request->query->get('dateFin');
  926.         return $this->datatableSuiviMainOeuvre($datatable$translator$mecanicien$dateDebut$dateFin)->execute();
  927.     }
  928.     // Fonction permettant de compter le nombre de jours ouvrés entre deux dates
  929.     public function get_nb_open_days($date_start$date_stop)
  930.     {
  931.         $arr_bank_holidays = []; // Tableau des jours feriés
  932.         // On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
  933.         $diff_year date('Y'$date_stop) - date('Y'$date_start);
  934.         for ($i 0$i <= $diff_year$i++) {
  935.             $year = (int)date('Y'$date_start) + $i;
  936.             // Liste des jours feriés
  937.             $arr_bank_holidays[] = '1_1_'.$year// Jour de l'an
  938.             $arr_bank_holidays[] = '1_5_'.$year// Fete du travail
  939.             $arr_bank_holidays[] = '8_5_'.$year// Victoire 1945
  940.             $arr_bank_holidays[] = '14_7_'.$year// Fete nationale
  941.             $arr_bank_holidays[] = '15_8_'.$year// Assomption
  942.             $arr_bank_holidays[] = '1_11_'.$year// Toussaint
  943.             $arr_bank_holidays[] = '11_11_'.$year// Armistice 1918
  944.             $arr_bank_holidays[] = '25_12_'.$year// Noel
  945.             // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote    
  946.             $easter              easter_date($year);
  947.             $arr_bank_holidays[] = date('j_n_'.$year$easter 86400); // Paques
  948.             $arr_bank_holidays[] = date('j_n_'.$year$easter + (86400 39)); // Ascension
  949.             $arr_bank_holidays[] = date('j_n_'.$year$easter + (86400 50)); // Pentecote    
  950.         }
  951.         //print_r($arr_bank_holidays);
  952.         $nb_days_open 0;
  953.         // Mettre <= si on souhaite prendre en compte le dernier jour dans le décompte    
  954.         while ($date_start $date_stop) {
  955.             // Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés    
  956.             if ( ! in_array(date('w'$date_start), [06])
  957.                  && ! in_array(date('j_n_'.date('Y'$date_start), $date_start), $arr_bank_holidays)) {
  958.                 $nb_days_open++;
  959.             }
  960.             $date_start mktime(date('H'$date_start), date('i'$date_start), date('s'$date_start), date('m'$date_start), date('d'$date_start) + 1date('Y'$date_start));
  961.         }
  962.         return $nb_days_open;
  963.     }
  964. }