src/Controller/HomeController.php line 35

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Client;
  4. use App\Entity\Contrat;
  5. use App\Entity\Chantier;
  6. use App\Entity\Personne;
  7. use App\Entity\Activites;
  8. use App\Entity\Prestation;
  9. use App\Form\ChantierType;
  10. use App\Entity\Utilisateur;
  11. use App\Entity\Qualification;
  12. use App\Service\ClientService;
  13. use App\Service\AccessByClient;
  14. use App\Service\PersonneService;
  15. use App\Entity\ProfilUtilisateur;
  16. use App\Entity\DesignationActivite;
  17. use App\Repository\ContratRepository;
  18. use App\Entity\RepresentantEntreprise;
  19. use App\Repository\PointageRepository;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use App\Repository\RepresentantEntrepriseRepository;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. class HomeController extends AbstractController
  27. {
  28.     #[Route('/'name'app_home')]
  29.     public function index(): Response
  30.     {
  31.         return $this->redirectToRoute('app_redirect_auth');
  32.     }
  33.     #[Route('/{nom}.php'name'app_publicpage_static')]
  34.     public function staticPage(
  35.         $nom
  36.     ): Response
  37.     {
  38.         $html file_get_contents('pages/' $nom ".php");
  39.         return $this->render('static_page/index.html.twig', [
  40.             'html' => $html,
  41.         ]);
  42.     }
  43.     #[Route('/p/dashboard'name'app_dashboard')]
  44.     public function dashboard(
  45.         EntityManagerInterface           $entityManager,
  46.         PointageRepository               $pointageRepository,
  47.         AccessByClient                   $accessByClient,
  48.         ContratRepository                $contratRepository,
  49.         PersonneService                  $personneService,
  50.         RepresentantEntrepriseRepository $representantEntrepriseRepository,
  51.         ClientService                    $clientService
  52.     ): Response
  53.     {
  54.         /** @var Utilisateur $currentUser */
  55.         $currentUser $this->getUser();
  56.         // --------- INIT DB  --------------
  57.         $clientAdmin $entityManager->getRepository(Client::class)->find($currentUser->getIdClient());
  58.         if ($clientAdmin) {
  59.             $clientService->initDB($clientAdmin);
  60.         }
  61.         // ---------  /// INIT DB ///  --------------
  62.         $currentDate = new \DateTime();
  63.         $currentDateDebut = clone $currentDate;
  64.         $currentDateDebut->setTime(00);
  65.         $currentDateFin = clone $currentDate;
  66.         $currentDateFin->setTime(2359);
  67.         $allPointageDuJour $pointageRepository->findByDate($currentDateDebut$currentDateFin);
  68.         $allPointageDuJour $accessByClient->getAccess_pointage($allPointageDuJour$currentUser);
  69.         $allChantiers $entityManager->getRepository(Chantier::class)->findBy([
  70.             'estActif' => true
  71.         ]);
  72.         $allPersonnes $entityManager->getRepository(Personne::class)->findBy([
  73.             'estActif' => true
  74.         ]);
  75.         $allPersonnes $accessByClient->getAccess_personne($allPersonnes$currentUser);
  76.         $personneActifInternes $personneService->getPersonneInterne($allPersonnes);
  77.         $personneActifExternes $personneService->getPersonneExterne($allPersonnes);
  78.         $allChantiers $accessByClient->getAccess_chantier($allChantiers$currentUser);
  79.         // -------------- NOMBRE STATISTIQUE --------------------------------------------------------------
  80.         $nbChantierActif count($allChantiers);
  81.         $nbPersonneActifInternes count($personneActifInternes);
  82.         $nbPersonneActifExternes count($personneActifExternes);
  83.         // -------------------------------------------------------------------------------------------------
  84.         /** @var Personne[] $persInData */
  85.         $persInData = [];
  86.         $dataChart_personne_entreprise = [];
  87.         $dataChart_personne_qualification = [];
  88.         $dataChart_chantier_categorie = [];
  89.         $dataChart_chantier_region = [];
  90.         foreach ($allPersonnes as $pers) {
  91.             if (!in_array($pers$persInData)) {
  92.                 // ---------------- PERSONNE EXTERNE ------------------------
  93.                 if (!$pers->isPersInterne()) {
  94.                     /** @var Contrat $persContrat */
  95.                     $persContrat null;
  96.                     $personneContrats $contratRepository->findByDatePrecisAndPersonne($currentDate$pers);
  97.                     if (count($personneContrats) > 0) {
  98.                         $persContrat $personneContrats[0];
  99.                     }
  100.                     if ($persContrat) {
  101.                         $persInData[] = $pers;
  102.                         // --------- PERSONNE PAR ENTREPRISE --------------
  103.                         $testIndexEntreprise array_search(
  104.                             needle$persContrat->getIdentreprise()->getEntDenomination(),
  105.                             haystackarray_column($dataChart_personne_entreprise'name')
  106.                         );
  107.                         if ($testIndexEntreprise !== false) {
  108.                             $dataChart_personne_entreprise[$testIndexEntreprise]['value'] += 1;
  109.                         } else {
  110.                             $dataChart_personne_entreprise[] = [
  111.                                 'name' => $persContrat->getIdentreprise()->getEntDenomination(),
  112.                                 'value' => 1
  113.                             ];
  114.                         }
  115.                         // --------- //// PERSONNE PAR ENTREPRISE //// --------------
  116.                         // --------- PERSONNE PAR QUALIFICATION --------------
  117.                         $testIndexQualification array_search(
  118.                             needle$persContrat->getIdqualification()->getQlfDesignation(),
  119.                             haystackarray_column($dataChart_personne_qualification'name')
  120.                         );
  121.                         if ($testIndexQualification !== false) {
  122.                             $dataChart_personne_qualification[$testIndexQualification]['value'] += 1;
  123.                         } else {
  124.                             $dataChart_personne_qualification[] = [
  125.                                 'name' => $persContrat->getIdqualification()->getQlfDesignation(),
  126.                                 'value' => 1
  127.                             ];
  128.                         }
  129.                         // --------- //// PERSONNE PAR QUALIFICATION //// --------------
  130.                     }
  131.                 }
  132.                 // ----------------  ///// PERSONNE EXTERNE /////  ------------------------
  133.                 // ---------------- PERSONNE INTERNE ------------------------
  134.                 if ($pers->isPersInterne()) {
  135.                     $persInData[] = $pers;
  136.                     /** @var RepresentantEntreprise $persRepresentant */
  137.                     $persRepresentant null;
  138.                     $personneRepresentants $representantEntrepriseRepository->findByDatePrecisAndPersonne($currentDate$pers);
  139.                     if (count($personneRepresentants) > 0) {
  140.                         $persRepresentant $personneRepresentants[0];
  141.                     }
  142.                     // --------- PERSONNE PAR ENTREPRISE --------------
  143.                     // Le nom est interne si pas de représentant
  144.                     $nomEntreprise $persRepresentant?->getEntreprise()?->getEntDenomination() ?? 'Interne';
  145.                     $testIndexEntreprise array_search(
  146.                         needle$nomEntreprise,
  147.                         haystackarray_column($dataChart_personne_entreprise'name')
  148.                     );
  149.                     if ($testIndexEntreprise !== false) {
  150.                         $dataChart_personne_entreprise[$testIndexEntreprise]['value'] += 1;
  151.                     } else {
  152.                         $dataChart_personne_entreprise[] = [
  153.                             'name' => $nomEntreprise,
  154.                             'value' => 1
  155.                         ];
  156.                     }
  157.                     // --------- //// PERSONNE PAR ENTREPRISE //// --------------
  158.                     // --------- PERSONNE PAR QUALIFICATION --------------
  159.                     if ($pers->getIdqualification()) {
  160.                         $testIndexQualification array_search(
  161.                             needle$pers->getIdqualification()->getQlfDesignation(),
  162.                             haystackarray_column($dataChart_personne_qualification'name')
  163.                         );
  164.                         if ($testIndexQualification !== false) {
  165.                             $dataChart_personne_qualification[$testIndexQualification]['value'] += 1;
  166.                         } else {
  167.                             $dataChart_personne_qualification[] = [
  168.                                 'name' => $pers->getIdqualification()->getQlfDesignation(),
  169.                                 'value' => 1
  170.                             ];
  171.                         }
  172.                     }
  173.                     // --------- //// PERSONNE PAR QUALIFICATION //// --------------
  174.                 }
  175.                 // ----------------  //// PERSONNE INTERNE ////  ------------------------
  176.             }
  177.         }
  178.         // --------- CHANTIER CATEGORIE --------------
  179.         foreach ($allChantiers as $cht) {
  180.             if ($cht->getIdgroupechantier()) {
  181.                 $testIndexChantierCateg array_search(
  182.                     needle$cht->getIdgroupechantier()->getGpchtLibelle(),
  183.                     haystackarray_column($dataChart_chantier_categorie'name')
  184.                 );
  185.                 if ($testIndexChantierCateg !== false) {
  186.                     $dataChart_chantier_categorie[$testIndexChantierCateg]['value'] += 1;
  187.                 } else {
  188.                     $dataChart_chantier_categorie[] = [
  189.                         'name' => $cht->getIdgroupechantier()->getGpchtLibelle(),
  190.                         'value' => 1
  191.                     ];
  192.                 }
  193.             }
  194.         }
  195.         // --------- //// CHANTIER CATEGORIE //// --------------
  196.         // --------- CHANTIER REGION --------------
  197.         foreach ($allChantiers as $cht) {
  198.             if ($cht->getIdregion()) {
  199.                 $testIndexChantierRegion array_search(
  200.                     needle$cht->getIdregion()->getRegNom(),
  201.                     haystackarray_column($dataChart_chantier_region'name')
  202.                 );
  203.                 if ($testIndexChantierRegion !== false) {
  204.                     $dataChart_chantier_region[$testIndexChantierRegion]['value'] += 1;
  205.                 } else {
  206.                     $dataChart_chantier_region[] = [
  207.                         'name' => $cht->getIdregion()->getRegNom(),
  208.                         'color' => $cht->getIdregion()->getRegCouleur(),
  209.                         'value' => 1
  210.                     ];
  211.                 }
  212.             }
  213.         }
  214.         // ---------  /// CHANTIER REGION ///  --------------
  215.         // --------- FLASH PROFILE PAR DEFAUT --------------
  216.         $defaultProfile $entityManager->getRepository(ProfilUtilisateur::class)->findOneBy([
  217.             "idclient" => $currentUser->getIdClient(),
  218.             "default" => true,
  219.             "estActif" => true
  220.         ]);
  221.         if (
  222.             $defaultProfile
  223.             && count($defaultProfile->getTableAccess()) == 0
  224.         ) {
  225.             $messageInfo "Veuillez contacter votre administrateur pour gérer vos droits d'accès sur la plateforme";
  226.             if ($currentUser->isRole("ROLE_ADMIN")) {
  227.                 $messageInfo "Veuillez configurer les paramètres par défaut du \"Profil utilisateur\"";
  228.                 $this->addFlash('info'$messageInfo);
  229.             } else {
  230.                 if (
  231.                     $currentUser->getIdprofil()
  232.                     && count($currentUser->getIdprofil()->getTableAccess()) == 0
  233.                 ) {
  234.                     $this->addFlash('error'$messageInfo);
  235.                 }
  236.             }
  237.         }
  238.         // ---------  /// FLASH PROFILE PAR DEFAUT ///  --------------
  239.         return $this->render('home/index.html.twig', [
  240.             'dataChart_personne_entreprise' => json_encode($dataChart_personne_entrepriseJSON_UNESCAPED_UNICODE),
  241.             'dataChart_personne_qualification' => json_encode($dataChart_personne_qualificationJSON_UNESCAPED_UNICODE),
  242.             'dataChart_chantier_categorie' => json_encode($dataChart_chantier_categorieJSON_UNESCAPED_UNICODE),
  243.             'dataChart_chantier_region' => json_encode($dataChart_chantier_regionJSON_UNESCAPED_UNICODE),
  244.             'nbChantierActif' => $nbChantierActif,
  245.             'nbPersonneActifInternes' => $nbPersonneActifInternes,
  246.             'nbPersonneActifExternes' => $nbPersonneActifExternes,
  247.         ]);
  248.     }
  249.     #[Route('/my-test'name'app_mytest')]
  250.     public function myTest(): Response
  251.     {
  252.         return $this->render('home/index.html.twig', [
  253.         ]);
  254.     }
  255.     #[Route('/p'name'app_redirect_auth')]
  256.     public function redirectAuth(): Response
  257.     {
  258.         if ($this->isGranted("ROLE_SUPER_ADMIN")) {
  259.             return $this->redirectToRoute("app_admin_compte_admin_index");
  260.         }
  261.         return $this->redirectToRoute("app_dashboard");
  262.     }
  263.     #[Route('/p/liste-chantier'name'liste.chantier')]
  264.     public function listeChantier(): Response
  265.     {
  266.         return $this->render('chantier/index.html.twig',[
  267.             
  268.         ]);
  269.     }
  270.     #[Route('/p/new-chantier'name'new.chantier')]
  271.     public function new(
  272.         Request                $request,
  273.         EntityManagerInterface $entityManager
  274.     ): Response
  275.     {
  276.         /**
  277.          * @var Utilisateur $currentUser
  278.          */
  279.         $currentUser $this->getUser();
  280.         //$formOptions = $this->getFormOptionAccess($entityManager, $accessByClient, $currentUser, $personneService);
  281.         $chantier = new Chantier();
  282.         // INIT ACTIVITE CHANTIER
  283.         if ($chantier->getListActivites()->count() == 0) {
  284.             $chActivite = new Activites();
  285.             $chantier->addListActivite($chActivite);
  286.         }
  287.         // INIT PRESTATION CHANTIER
  288.         if ($chantier->getListPrestations()->count() == 0) {
  289.             $chPrestation = new Prestation();
  290.             $chantier->addListPrestation($chPrestation);
  291.         }
  292.         $form $this->createForm(ChantierType::class, $chantier);
  293.         $form->handleRequest($request);
  294.         if ($form->isSubmitted() && $form->isValid()) {
  295.             $chantier->setIdClientMere($currentUser->getIdClient());
  296.             // DELETE ACTIVITE & PRESTATION IF NULL
  297.            // $this->removeUnitule($chantier);
  298.             $entityManager->persist($chantier);
  299.             $entityManager->flush();
  300.             $entityManager->persist($chantier);
  301.             $entityManager->flush();
  302.             //$this->updateActiviteOnSubmit($chantier, $entityManager);
  303.             //$this->updatePrestationOnSubmit($chantier, $entityManager);
  304.             return $this->redirectToRoute('app_administration_chantier_index', [], Response::HTTP_SEE_OTHER);
  305.         }
  306.         // LIST QUALIFICATION FOR INIT ADD PRESTATION
  307.         /** @var Qualification[] $listQualifications */
  308.         ///$listQualifications = $formOptions['qualifications'];
  309.         // LIST DESIGNATION FOR INIT ADD ACTIVITE
  310.         /** @var DesignationActivite[] $listQualifications */
  311.         //$listDesignationActivites = $formOptions['designation_activies'];
  312.         return $this->render('chantier/new.html.twig', [
  313.             'chantier' => $chantier,
  314.             'form' => $form->createView(),
  315.         ]);
  316.     }
  317.     #[Route('/p/edit-chantier'name'edit.chantier')]
  318.     public function edit(
  319.         Request                $request,
  320.         EntityManagerInterface $entityManager
  321.     ): Response
  322.     {
  323.         /**
  324.          * @var Utilisateur $currentUser
  325.          */
  326.         $currentUser $this->getUser();
  327.         //$formOptions = $this->getFormOptionAccess($entityManager, $accessByClient, $currentUser, $personneService);
  328.         $chantier = new Chantier();
  329.         // INIT ACTIVITE CHANTIER
  330.         if ($chantier->getListActivites()->count() == 0) {
  331.             $chActivite = new Activites();
  332.             $chantier->addListActivite($chActivite);
  333.         }
  334.         // INIT PRESTATION CHANTIER
  335.         if ($chantier->getListPrestations()->count() == 0) {
  336.             $chPrestation = new Prestation();
  337.             $chantier->addListPrestation($chPrestation);
  338.         }
  339.         $form $this->createForm(ChantierType::class, $chantier);
  340.         $form->handleRequest($request);
  341.         if ($form->isSubmitted() && $form->isValid()) {
  342.             $chantier->setIdClientMere($currentUser->getIdClient());
  343.             // DELETE ACTIVITE & PRESTATION IF NULL
  344.            // $this->removeUnitule($chantier);
  345.             $entityManager->persist($chantier);
  346.             $entityManager->flush();
  347.             $entityManager->persist($chantier);
  348.             $entityManager->flush();
  349.             //$this->updateActiviteOnSubmit($chantier, $entityManager);
  350.             //$this->updatePrestationOnSubmit($chantier, $entityManager);
  351.             return $this->redirectToRoute('app_administration_chantier_index', [], Response::HTTP_SEE_OTHER);
  352.         }
  353.         // LIST QUALIFICATION FOR INIT ADD PRESTATION
  354.         /** @var Qualification[] $listQualifications */
  355.         ///$listQualifications = $formOptions['qualifications'];
  356.         // LIST DESIGNATION FOR INIT ADD ACTIVITE
  357.         /** @var DesignationActivite[] $listQualifications */
  358.         //$listDesignationActivites = $formOptions['designation_activies'];
  359.         return $this->render('chantier/edit.html.twig', [
  360.             'chantier' => $chantier,
  361.             'form' => $form->createView(),
  362.         ]);
  363.     }
  364.     #[Route('/p/liste-bordereaux'name'liste.bordereaux')]
  365.     public function listeBordereaux(): Response
  366.     {
  367.         return $this->render('bordereaux/index.html.twig',[
  368.             
  369.         ]);
  370.     }
  371.     #[Route('/p/new-bordereaux'name'new.bordereaux')]
  372.     public function newBordereaux(): Response
  373.     {
  374.         return $this->render('bordereaux/new.html.twig',[
  375.             
  376.         ]);
  377.     }
  378.     #[Route('/p/edit-bordereaux'name'edit.bordereaux')]
  379.     public function editBordereaux(): Response
  380.     {
  381.         return $this->render('bordereaux/edit.html.twig',[
  382.             
  383.         ]);
  384.     }
  385.     #[Route('/p/detail-bordereaux'name'detail.bordereaux')]
  386.     public function detailBordereaux(): Response
  387.     {
  388.         return $this->render('bordereaux/detail.html.twig',[
  389.             
  390.         ]);
  391.     }
  392.     #[Route('/p/modifier-bordereaux'name'modifier.bordereaux')]
  393.     public function modifierBordereaux(): Response
  394.     {
  395.         return $this->render('bordereaux/modifier.html.twig',[
  396.             
  397.         ]);
  398.     }
  399.     #[Route('/p/afficher-editer-bordereaux'name'affichage.modification.bordereaux')]
  400.     public function afficherEditerBordereaux(): Response
  401.     {
  402.         return $this->render('bordereaux/affichage-and-modification.html.twig',[
  403.             
  404.         ]);
  405.     }
  406.     #[Route('/p/liste-etat-avancement'name'liste.etat.avancement')]
  407.     public function listeAvancement(): Response
  408.     {
  409.         return $this->render('etat-avancement/index.html.twig',[
  410.             
  411.         ]);
  412.     }
  413.     #[Route('/p/new-etat-avancement'name'new.etat.avancement')]
  414.     public function newAvancement(): Response
  415.     {
  416.         return $this->render('etat-avancement/nouvelle.html.twig',[
  417.             
  418.         ]);
  419.     }
  420.     #[Route('/p/detail-etat-avancement'name'detail.etat.avancement')]
  421.     public function detailAvancement(): Response
  422.     {
  423.         return $this->render('etat-avancement/detail.html.twig',[
  424.             
  425.         ]);
  426.     }
  427.     #[Route('/p/edit-etat-avancement'name'edit.etat.avancement')]
  428.     public function editAvancement(): Response
  429.     {
  430.         return $this->render('etat-avancement/edit1.html.twig',[
  431.             
  432.         ]);
  433.     }
  434.     #[Route('/p/modifier-etat-avancement'name'modifier.etat.avancement')]
  435.     public function modifierAvancement(): Response
  436.     {
  437.         return $this->render('etat-avancement/edit.html.twig',[
  438.             
  439.         ]);
  440.     }
  441.     #[Route('/p/cloturer-etat-avancement'name'cloturer.etat.avancement')]
  442.     public function cloturerAvancement(): Response
  443.     {
  444.         return $this->render('etat-avancement/cloturer.html.twig',[
  445.             
  446.         ]);
  447.     }
  448.     #[Route('/p/ajouter-fichier'name'ajouter.fichier')]
  449.     public function ajouterFichier(): Response
  450.     {
  451.         return $this->render('administration/chantier/ajouter-fichier.html.twig',[
  452.             
  453.         ]);
  454.     }
  455.     #[Route('/p/document-etat-avancement'name'document.etat.avancement')]
  456.     public function docAvancement(): Response
  457.     {
  458.         return $this->render('etat-avancement/document.html.twig',[
  459.             
  460.         ]);
  461.     }
  462.     #[Route('/p/document1-etat-avancement'name'document1.etat.avancement')]
  463.     public function docAvancemente(): Response
  464.     {
  465.         return $this->render('etat-avancement/document1.html.twig',[
  466.             
  467.         ]);
  468.     }
  469.     #[Route('/p/liste-rubriques'name'liste.rubriques')]
  470.     public function listeRubrique(): Response
  471.     {
  472.         return $this->render('rubriques/index.html.twig',[
  473.             
  474.         ]);
  475.     }
  476.     #[Route('/p/new-rubriques'name'new.rubriques')]
  477.     public function newRubrique(): Response
  478.     {
  479.         return $this->render('rubriques/new.html.twig',[
  480.             
  481.         ]);
  482.     }
  483.     #[Route('/p/edit-rubriques'name'edit.rubriques')]
  484.     public function editRubrique(): Response
  485.     {
  486.         return $this->render('rubriques/edit.html.twig',[
  487.             
  488.         ]);
  489.     }
  490.     #[Route('/p/rapport-avancement'name'rapport.avancement')]
  491.     public function rapportAvancement(): Response
  492.     {
  493.         return $this->render('rapport/rapport-avancement.html.twig',[
  494.             
  495.         ]);
  496.     }
  497.     #[Route('/p/rapport-recapitulatif'name'rapport.recapitulatif')]
  498.     public function rapportRecapitulatif(): Response
  499.     {
  500.         return $this->render('rapport/rapport-recapitulatif.html.twig',[
  501.             
  502.         ]);
  503.     }
  504.     #[Route('/p/rapport-rectificatif'name'rapport.rectificatif')]
  505.     public function rapportRectificatif(): Response
  506.     {
  507.         return $this->render('rapport/rapport-rectificatif.html.twig',[
  508.             
  509.         ]);
  510.     }
  511.     #[Route('/p/document'name'rapport.document')]
  512.     public function document(): Response
  513.     {
  514.         return $this->render('administration/chantier/document.html.twig',[
  515.             
  516.         ]);
  517.     }
  518.     #[Route('/p/unite'name'unite.index')]
  519.     public function uniteIndex(): Response
  520.     {
  521.         return $this->render('unites/index.html.twig',[
  522.             
  523.         ]);
  524.     }
  525.     #[Route('/p/unite-edut'name'unite.edit')]
  526.     public function editUnite(): Response
  527.     {
  528.         return $this->render('unites/edit.html.twig',[
  529.             
  530.         ]);
  531.     }
  532.     #[Route('/p/unite-new'name'unite.new')]
  533.     public function newUnite(): Response
  534.     {
  535.         return $this->render('unites/new.html.twig',[
  536.             
  537.         ]);
  538.     }
  539.     #[Route('/p/prestation'name'prestation.index')]
  540.     public function prestationIndex(): Response
  541.     {
  542.         return $this->render('prestation/index.html.twig',[
  543.             
  544.         ]);
  545.     }
  546.     #[Route('/p/saisie-etat-avancement'name'saisie.etat.avancement')]
  547.     public function saisieEtatAvancement(): Response
  548.     {
  549.         return $this->render('etat-avancement/page-saisie-etat-avancement.html.twig',[
  550.             
  551.         ]);
  552.     }
  553.     #[Route('/p/copie-etat-avancement'name'copie.etat.avancement')]
  554.     public function copieEtatAvancement(): Response
  555.     {
  556.         return $this->render('etat-avancement/copier.html.twig',[
  557.             
  558.         ]);
  559.     }
  560.     #[Route('/p/inserer-position'name'inserer.position')]
  561.     public function insererPosition(): Response
  562.     {
  563.         return $this->render('bordereaux/inserer-position.html.twig',[
  564.             
  565.         ]);
  566.     }
  567. }