src/PaaBundle/Controller/DefaultController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\PaaBundle\Controller;
  3. //use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  4. use App\PaaBundle\Controller\PAABaseController;
  5. // use App\PaaBundle\Component\Paa\Paa_Constantes;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. // use Symfony\Component\HttpFoundation\JsonResponse;    // LG 20180622
  9. // use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. // use Symfony\Component\Routing\Router;
  11. // use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  12. // use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  13. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  14. //use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
  15. //use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
  16. // use Symfony\Component\Routing\Annotation\Route;
  17. use App\Limoog\PartageBundle\Component\cParametresBDD;
  18. use App\PaaBundle\Component\Paa\Paa_Constantes;
  19. use App\PaaBundle\Entity\actibases;
  20. // use App\PaaBundle\Entity\actiGroupesacti;
  21. //MG Modification 20200218 Début
  22. //Table actiRealisations renommer en seances
  23. // use App\PaaBundle\Entity\seances;
  24. //use App\PaaBundle\Entity\actiRealisations;
  25. //MG Modification 20200218 Fin
  26. // use App\PaaBundle\Entity\actiSsgroupesacti;
  27. // use App\PaaBundle\Entity\actibases;
  28. // use App\PaaBundle\Entity\activites;
  29. // use App\PaaBundle\Entity\annees;
  30. // use App\PaaBundle\Entity\caisses;
  31. // use App\PaaBundle\Entity\caissesPersonnes;
  32. // use App\PaaBundle\Entity\compteurs;
  33. // use App\PaaBundle\Entity\conventions;
  34. // use App\PaaBundle\Entity\etablissements;
  35. // use App\PaaBundle\Entity\groupes;
  36. // use App\PaaBundle\Entity\intervenants;
  37. // use App\PaaBundle\Entity\intervenantsContrats;
  38. // use App\PaaBundle\Entity\joursferies;
  39. // use App\PaaBundle\Entity\referents;
  40. // use App\PaaBundle\Entity\salles;
  41. // use App\PaaBundle\Entity\services;
  42. // use App\PaaBundle\Entity\specialites;
  43. // use App\PaaBundle\Entity\usagers;
  44. // use App\PaaBundle\Component\Logs;
  45. use App\PaaBundle\Security\PaaVoter;
  46. // use App\PaaBundle\Component\Paa\Paa; //MG 20200701
  47. // use App\PaaBundle\Entity\seriesseances; //MG 20200316
  48. use Symfony\Component\Config\Definition\Exception\Exception;
  49. use \DateTime//HL 20211220
  50. use Symfony\Component\HttpFoundation\JsonResponse// LG 20230905
  51. class DefaultController extends PAABaseController {
  52.     protected function PAA_Autorise(String $psNomTableBoolean $pbListeBoolean $pbEcriture) {
  53.         return true;
  54.     }
  55.     // Page par défault (e.g. page planning pour Etudiant et Enseignant)
  56.     public function defaultAction(Request $request) {
  57.         if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
  58.             // Personne n'est authentifié
  59.             return $this->redirectToLogin($request);
  60.         }
  61.         $loUser $this->getUser();
  62.         $laRolesUser $loUser->getRoles();
  63. // LG 20230210 old        if (count($laRolesUser) == 2 && ($laRolesUser[0] == 'ROLE_ETUDIANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT')) {
  64.         if (count($laRolesUser) == && ($laRolesUser[0] == 'ROLE_ETUDIANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT_POSEDIVERS')) {
  65.             // 2 rôles : le rôle user (qui est attribué par Sympfony pour tout le monde) + un rôle étudiant ou enseignant
  66.             // Page par défaut : planning
  67.             $lsRes $loUser->getcRes();
  68. // $lsRes = "I1000125" ;            
  69.             $lvSemaine Null// par défaut
  70. // LG 20230210 old            return $this->planningAction($request, $lvSemaine, $lsRes);
  71.             return $this->redirectToroute("paa_planning", ["pvSemaine"=>"-""psLstRes"=>$lsRes]);
  72.         } else {
  73.             // Page par défaut : index
  74.             return $this->indexAction($request);
  75.         }
  76.     }
  77.     // Page d'index
  78.     public function indexAction(Request $request) {
  79.         if ($LoginResponse $this->RedirectIfDisconnected($request'ROLE_USER'$request->headers->get('referer'))) {
  80.             // L'utilisateur en cours n'est pas authentifié, ou sa session a expiré
  81.             // On retourne à la page appellante ($request->headers->get('referer'))
  82.             return $LoginResponse;
  83.         }
  84.         $laOptions = Array();
  85.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  86.         if($loUser $this->getUser()){
  87.             $laRolesUser $loUser->getRoles();
  88.             // JM 20211223 OLD On restreint les droits sur la page d'accueil a ROLE_ENSEIGNANT_POSEDIVERS
  89.             //if (count($laRolesUser) == 2 && ($laRolesUser[0] == 'ROLE_ETUDIANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT')) {
  90.             if (count($laRolesUser) == && ($laRolesUser[0] == 'ROLE_ETUDIANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT' || $laRolesUser[0] == 'ROLE_ENSEIGNANT_POSEDIVERS')) {
  91.                 return $this->render('@Paa/Default/indexEtudiant.html.twig'$laOptions);
  92.             }
  93.         }
  94.         // Effectuer les traitements pour l'affichage
  95.         return $this->render('@Paa/Default/index.html.twig'$laOptions);
  96.     }
  97.     // $request         : la requête injectée par Symfony
  98.     // $psNomTable      : le nom de la table qu'on souhaite afficher
  99.     //($pbPopup)        : non-vide dans le cas d'un appel pour popup
  100.     public function pageAvecGrilleAction(request $request$psNomTable$pbPopup) {
  101.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::VOIR $psNomTable), $response))
  102.             return $response;
  103.         $lsTwig $psNomTable;
  104.         // S'inscrire à l'événement postConnect pour effectuer l'identification sous Postgres dès l'ouverture de la connexion
  105.         // LG 20170728 déac $this->suscribeToPostConnectionEvent();
  106.         // Récupérer le manager Doctrine
  107.         $m $this->getDoctrineManager();
  108.         $loListeEntités '';
  109.         $loListeSéances '';
  110. // LG 20231025 old        $this->refreshDatesSession($request);
  111.         $this->refreshSession($request);
  112.         // Récupérer la liste des entités à utiliser pour le traitement demandé
  113.         if ($psNomTable == 'activitesTrad' || $psNomTable == 'activites') {
  114.             $pvDateDebut $request->getSession()->get('dateDebut');
  115.             $numSemaineDebut getNoSemaine($pvDateDebut);
  116.             $pvDateFin $request->getSession()->get('dateFin');
  117.             $numSemaineFin getNoSemaine($pvDateFin);
  118.             if ($numSemaineFin != $numSemaineDebut) {
  119.                 $this->addFlash("warning""Vous avez choisi deux semaines différentes, mais cet écran ne peut prendre en charge qu'une seule semaine. "
  120.                         "Seules les activités de la semaine du " date("d/m/Y"strtotime($pvDateDebut)) . " seront affichées.");
  121.             }
  122.             $lbActiSysteme $request->getSession()->get('activitésActiSysteme');
  123.             if($lbActiSysteme == null) {
  124.                 $lbActiSysteme 'true';
  125.             }
  126.             $lbActiGenerique $request->getSession()->get('activitésActiGenerique');
  127.             if($lbActiGenerique == null) {
  128.                 $lbActiGenerique 'true';
  129.             }
  130.             $lsActiBase $request->getSession()->get('activitésActiBase');
  131.             if($lsActiBase == null) {
  132.                 $lsActiBase '\'SansFiltre\'';
  133.             }
  134.             $lsIntervenant $request->getSession()->get('activitésInterv');
  135.             if($lsIntervenant == null) {
  136.                 $lsIntervenant '\'SansFiltre\'';
  137.             }
  138.             $lsUsager $request->getSession()->get('activitésUsager');
  139.             if($lsUsager == null) {
  140.                 $lsUsager '\'SansFiltre\'';
  141.             }
  142.             $lsSalle $request->getSession()->get('activitésSalle');
  143.             if($lsSalle == null) {
  144.                 $lsSalle '\'SansFiltre\'';
  145.             }
  146.             $lsGroupe $request->getSession()->get('activitésGroupe');
  147.             if($lsGroupe == null) {
  148.                 $lsGroupe '\'SansFiltre\'';
  149.             }
  150.             $liEtablissement $request->getSession()->get('iEtablissement');
  151.             $loListeEntités $m->getRepository("PaaBundle:activitesTrad")->findAllPourSemaine($numSemaineDebut$lbActiSysteme$lbActiGenerique$lsActiBase$lsIntervenant$lsUsager$lsSalle$lsGroupe);
  152.             $psNomTable 'activites';
  153.         } else if ($psNomTable == 'seancesTrad') {
  154.             $pvDateDebut $request->getSession()->get('dateDebut');
  155.             $pvDateFin $request->getSession()->get('dateFin');
  156.             if (estSemaineRecurrente($pvDateDebut)) {
  157.                 // Pas de séances dans les semaines récurrentes
  158.                 // AV 20230427 déac $request->getSession()->getFlashBag()->set("warning", "<strong>Il ne peut y avoir aucune séance sur cette semaine!</strong><br>La semaine récurrente est prévue uniquement pour définir des activités qui seront valides sur plusieurs semaines. Elle ne peut pas contenir de séances.");
  159.                 // AV 20230428 début
  160.                 $laOptions = array('pdDateDébut' => date('Y-m-d'strtotime('monday this week')),
  161.                 'pdDateFin' => date('Y-m-d'strtotime('next sunday')),
  162.                 'psNomTable' => $psNomTable,
  163.                 'poController' => $this,
  164.                 );
  165.                 $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  166.                 return $this->render('@Paa/Planning/Planning2_SemaineRecurrente.html.twig'$laOptions);
  167.                 // AV 20230428 fin
  168.             }
  169.             $loListeSéances $m->getRepository("PaaBundle:seancesTrad")->findSeancesParDate($pvDateDebut$pvDateFin'','false'truefalsefalse);
  170.             $psNomTable 'seances';
  171.         } else if ($psNomTable == 'groupes'){
  172.             $lvDateDebut $request->getSession()->get('dateDebut');
  173.             $lvDateFin $request->getSession()->get('dateFin');
  174.             $liEtablissement $request->getSession()->get('iEtablissement');
  175. // LG 20240219 début
  176. //            $lsParamètres = "vDebut=$lvDateDebut&vFin=$lvDateFin&iEtablissement=$liEtablissement";
  177.             $lbPresent $request->getSession()->get('groupesAffichePresents');
  178.             $lbSortis $request->getSession()->get('groupesAfficheSortis') ;
  179.             $lbPasEntres $request->getSession()->get('groupesAffichePasEntrés') ;
  180.             $lvIntervenants $request->getSession()->get('groupesiIntervenant') ;
  181.             if (is_array($lvIntervenants)) {
  182.                 $lsLstIntervenants implode(","$lvIntervenants) ;
  183.             } else {
  184.                 // Supprimer le "I" devant l'id de l'intervenant
  185.                 $lsLstIntervenants substr($lvIntervenants1) ;
  186.             }
  187.             $lsParamètres "vDebut=$lvDateDebut&vFin=$lvDateFin&iEtablissement=$liEtablissement&iIntervenant=$lsLstIntervenants&lAffiche_PasEntrés=$lbPasEntres&lAffiche_Sortis=$lbSortis&lAffiche_Présents=$lbPresent";
  188. // LG 20240219 fin
  189.             $repo $m->getRepository("PaaBundle:groupes");
  190.             $loListeEntités $repo->findAllAvecParametres($lsParamètres);
  191.         } else if ($psNomTable == 'services'){
  192.             $liEtablissement $request->getSession()->get('iEtablissement');
  193.             $lsParamètres "iEtablissement=$liEtablissement";
  194.             $repo $m->getRepository("PaaBundle:services");
  195.             $loListeEntités $repo->findAllAvecParametres($lsParamètres);
  196.         } else if ($psNomTable == 'usagers'){
  197.             $lvDateDebut $request->getSession()->get('dateDebut') ;
  198.             $lvDateFin $request->getSession()->get('dateFin') ;
  199.             $liEtablissement $request->getSession()->get('iEtablissement') ;
  200.             $lbPresent $request->getSession()->get('usagersAffichePresents');
  201.             $lbSortis $request->getSession()->get('usagersAfficheSortis') ;
  202.             $lbPasEntres $request->getSession()->get('usagersAffichePasEntrés') ;
  203. // LG 20240201 début
  204. //            $liGroupes = substr($request->getSession()->get('usagersiGroupe'), 1) ;
  205.             $lvGroupes $request->getSession()->get('usagersiGroupe') ;
  206.             if (is_array($lvGroupes)) {
  207.                 $liGroupes implode(","$lvGroupes) ;
  208.             } else {
  209.                 // Supprimer le "G" devant l'id du groupe
  210.                 $liGroupes substr($lvGroupes1) ;
  211.             }
  212. // LG 20240201 fin
  213.             $lbUniquePeriode $request->getSession()->get('usagersPeriodeDemandée') ;
  214.             $lsParamètres "vDebut=$lvDateDebut&vFin=$lvDateFin&iEtablissement=$liEtablissement&iGroupe=$liGroupes&lGroupePourPériodeDemandée=$lbUniquePeriode&lAffiche_PasEntrés=$lbPasEntres&lAffiche_Sortis=$lbSortis&lAffiche_Présents=$lbPresent";
  215. // LG 20240301 essai            $loListeEntités = $m->getRepository("PaaBundle:" . $psNomTable)->findAllAvecParametres($lsParamètres);
  216.             $loListeEntités $m->getRepository("PaaBundle:" $psNomTable)->findAllAvecParametres($lsParamètrestrue);
  217.         } else if ($psNomTable == 'intervenants'){
  218.             $lvDateDebut $request->getSession()->get('dateDebut');
  219.             $lvDateFin $request->getSession()->get('dateFin');
  220.             $liEtablissement $request->getSession()->get('iEtablissement');
  221.             $lbPresent $request->getSession()->get('intervenantAffichePresent');
  222.             $lbSortis $request->getSession()->get('intervenantAfficheSortis');
  223.             $lbPasEntres $request->getSession()->get('intervenantAffichePasEntrés');
  224.             $liGroupes $request->getSession()->get('intervenantiGroupe');
  225.             $liService $request->getSession()->get('intervenantiService');
  226.             $liSpecialite $request->getSession()->get('intervenantiSpecialité');
  227.             $lbRemplaçants $request->getSession()->get('intervenantRemplaçants');
  228.             $lbIntervExt $request->getSession()->get('intervenantIntervExt');
  229.             $lsLibre1 $request->getSession()->get('intervenantcIntervenant_Libre1');
  230.             $lsLibre2 $request->getSession()->get('intervenantcIntervenant_Libre2');
  231.             $lsParamètres "vDebut=$lvDateDebut&vFin=$lvDateFin&iEtablissement=$liEtablissement&iGroupe=$liGroupes&lAffiche_PasEntrés=$lbPasEntres&lAffiche_Sortis=$lbSortis&lAffiche_Présents=$lbPresent&iService=$liService&iSpécialité=$liSpecialite&lAffiche_Remplacants=$lbRemplaçants&lAffiche_Extérieurs=$lbIntervExt&cIntervenant_Libre1=$lsLibre1&cIntervenant_Libre2=$lsLibre2";
  232.             $loListeEntités $m->getRepository("PaaBundle:" $psNomTable)->findAllAvecParametres($lsParamètres);
  233.             
  234.         } else if ($psNomTable == 'changelog') {
  235.             $loListeEntités $m->getRepository("PaaBundle:changelog")->getAllHierarchique(false);
  236.         } else if ($psNomTable == 'salles') {
  237.             $liEtablissement $request->getSession()->get('iEtablissement');
  238.             $lsParamètres "iEtablissement=$liEtablissement";
  239.             $loListeEntités $m->getRepository("PaaBundle:salles")->findAllAvecParametres($lsParamètres);
  240.         } else if ($psNomTable == 'caisses') {
  241.             $liType_caisse $request->query->get("type_caisse");
  242.             $lbCboTypeCaisseDisabled $request->query->get("cboTypeCaisseDisabled");
  243.             $loListeEntités $m->getRepository("PaaBundle:caisses")->findAllNonSysteme($liType_caisse);
  244.         } 
  245.         else if ($psNomTable == 'module'){
  246.             $loListeEntités $m->getRepository("PaaBundle:" $psNomTable)->findAll();
  247.         }
  248.         else if ($psNomTable == 'diplomes'){
  249.             $loListeEntités $m->getRepository("PaaBundle:" $psNomTable)->findAll();
  250.         } else {
  251.             $loListeEntités $m->getRepository("PaaBundle:" $psNomTable)->findBy(array() /* Pas de filtre ni de tri */
  252.                     //,array('iidAnnee' => 'ASC') // On trie par date décroissante
  253.             );
  254.         }
  255.         $laOptions = array(
  256.             'poListeEntités' => $loListeEntités,
  257.             'poListeSéances' => $loListeSéances,
  258.             'psNomTable' => $psNomTable,
  259.         );
  260.         if ($psNomTable == 'caisses') {
  261.             $laOptions['piTypeCaisse'] = $liType_caisse;
  262.             $laOptions['pbCboTypeCaisseDisabled'] = $lbCboTypeCaisseDisabled;
  263.         }
  264.         $laOptions['pbSansMenu'] = ($pbPopup?true:false) ;
  265.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  266.         return $this->render('@Paa/pageAvecGrille/' $lsTwig '.html.twig'$laOptions);
  267.     }
  268.     protected function getLibelléTable(string $psNomTable) {
  269.         if ($psNomTable == 'annees') {
  270.             return "années";
  271.         } else if ($psNomTable == 'salles') {
  272.             return "équipements";
  273.         } else if ($psNomTable == 'etablissements') {
  274.             return "établissements";
  275.         } else if ($psNomTable == 'actibases') {
  276.             return "activités de base";
  277.         } else if ($psNomTable == 'actiGroupesacti') {
  278.             return "groupes d'activités de base";
  279.         } else if ($psNomTable == 'actiSsgroupesacti') {
  280.             return "sous-groupes d'activités de base";
  281.         } else if ($psNomTable == 'users') {
  282.             return "utilisateurs de l'application";
  283.         } else if ($psNomTable == 'tmails2') {
  284.             return "mails";
  285.         } else if ($psNomTable == 'conventions') {
  286.             return "conventions collectives";
  287.         } else if ($psNomTable == 'joursferies') {
  288.             return "jours fériés";
  289.         } else if ($psNomTable == 'groupesDroits') {
  290.             return "groupes de droits des utilisateurs";
  291.         } else if ($psNomTable == 'caisses') {
  292.             return "organismes de rattachement des usagers";
  293.         } else if ($psNomTable == 'specialites') {
  294.             return "spécialités des intervenants";
  295.         } else if ($psNomTable == 'caissesType') {
  296.             return "types d'organismes";
  297.         } else if ($psNomTable == 'modelesHoraires') {
  298.             return "modèles horaires";
  299.         } else if ($psNomTable == 'contrainteshoraires') {
  300.             return "contraintes horaires";
  301.         } else if ($psNomTable == 'seances') {
  302.             return "séances";
  303. // LG 20230419 début
  304.         } else if ($psNomTable == 'typesmatieres') {
  305.             return "types de matières";
  306. // LG 20230419 fin
  307.         } else if ($psNomTable == 'typesclasses') {
  308.             return "types de classes";
  309.         }
  310.         return $psNomTable;
  311.     }
  312.     public function pageEntityFormAction($psNomTablerequest $request$piId) {
  313.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::VOIR $psNomTable$piId), $response))
  314.             return $response;
  315. // LG 20231020 old : ajout de paramètre        return $this->entityFormAction($request, $psNomTable, $piId, "", true);
  316.         return $this->entityFormAction($request$psNomTable$piId""""true);
  317.     }
  318.     // Déterminer si l'utilisateur a les droits d'écriture et/ou de lecture
  319.     // Si pas droits de lecture, lance une exception
  320.     // Sinon, renvoie true si droits d'écriture, false sinon
  321.     // LG 20191217
  322.     public function getDroitsEcritureLectureOrDie($psNomTable$piId) {
  323.         $lbADroitDEcriture $this->isGranted(PaaVoter::MODIFIER $psNomTable$piId);
  324.         if ($lbADroitDEcriture) {
  325.             $lbADroitDeLecture true;
  326.         } else {
  327.             $lbADroitDeLecture $this->isGranted(PaaVoter::VOIR $psNomTable$piId);
  328.         }
  329.         if (!$lbADroitDeLecture) {
  330.             throw new \Exception("Désolé, vous ne disposez pas de droits suffisants pour afficher ces informations.");
  331.         }
  332.         return $lbADroitDEcriture;
  333.     }
  334.     // $request         : l'objet request Symfony
  335.     // $psNomTable      : nom de la table/entité pour laquelle on souhaite récupérer une entité
  336.     // $piId            : Id de l'entité demandée
  337.     // $psOnglet        : l'onglet enttiyForm demandé
  338.     // $psContexte      : informations de context (utilisé pour distinguer le contexte "usagers du groupes" du contexte "Groupes de l'usager")
  339.     //($pbDansPage)     : ajouté par pageEntityFormAction pour spécifier ce ce sera une page complète (cad avec les menus)
  340. // LG 20230412 old    public function entityFormAction(Request $request, $psNomTable, $piId, $psOnglet, $psContexte, $pbDansPage = false) {
  341.     public function entityFormAction(Request $request$psNomTable$piId$psOnglet$psContexte null$pbDansPage false) {
  342.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::VOIR $psNomTable$piId), $response)) {
  343.             return $response;
  344.         }
  345.         if (strtolower($psOnglet) == "null"$psOnglet null ;
  346.         // Déterminer les droits de lecture et d'écriture
  347.         $lbADroitDEcriture $this->getDroitsEcritureLectureOrDie($psNomTable$piId);
  348.         // Reprise de cas particuliers de noms de table
  349.         if ($psNomTable == 'intervenantsAdresse') {
  350.             $psNomTable 'intervenants';
  351.         } else if ($psNomTable == 'intervenantsSécurité') {
  352.             $psNomTable 'intervenants';
  353.         } else if ($psNomTable == 'activitesTrad' || $psNomTable == 'activites') {
  354.             //Cas particulier, affichage de activitesTrad, mais form de activites demandé
  355.             $psNomTable 'activites';
  356.             if (!$psOnglet) {
  357.                 $psOnglet 'OngletGénéral';
  358.             }
  359.         } else if ($psNomTable == 'seancesTrad' || $psNomTable == 'seances') {
  360.             //Cas particulier, affichage de seancesTrad, mais form de actiRealisation demandé
  361.             $psNomTable 'seances';
  362.             if (!$psOnglet) {
  363.                 $psOnglet 'OngletGénéral';
  364.             }
  365.         }
  366. // LG 20231025 début
  367.         $lsNomEntité $psNomTable ;
  368.         if ($psNomTable == "creneaux") {
  369.             $lsNomEntité "seances" ;
  370.         }
  371. // LG 20231025 fin
  372.         $em $this->getDoctrineManager();
  373. // LG 20231025 old        $loEntité = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
  374.         $loEntité $em->getRepository("PaaBundle:" $lsNomEntité)->find($piId);
  375.         if ($loEntité !== null) {
  376.             $loEntité->setEntityManager($em);
  377.         }
  378. // LG 20230901 Pour tests
  379. // $r = $em->getRepository("PaaBundle:seances") ;
  380. // $a = $r->rtvCurCréneaux('G1000086', '1901/01/28', '1901/02/03') ;
  381. // $o = new \stdClass();
  382. // $o->iid_seance = 1 ;
  383. // $o->ctype_res = 'G' ;
  384. // $o->iid_res = 1 ;
  385. // $o->tdebut = "1901-01-28 08:00:00" ;
  386. // $o->tfin = "1901-01-28 10:00:00" ;
  387. // $o->clibelle = "Lundi 8h00-10h00" ;
  388. // $a[] = $o ;
  389.         $lsLstInfos '';
  390.         $libelleActi '';
  391.         $lstJoursFeries '';
  392.         if ($psNomTable == 'activites') {            
  393.             $liActiBase ;
  394.             $laLstRessource null ;        // LG 20210615
  395.             if ($loEntité) {
  396.                 // Une activité est demandée
  397.                 $laLstRessource $loEntité->getressources();
  398.                 $liActiBase $loEntité->getActibase()->getIidactibase() ;
  399.             } else if ($request->request->get("psLstRes")) {
  400.                 // Pas d'activité demandée, mais liste de ressources fournie (sous forme de chaine séparée par des virgules)
  401.                 $lsLstRessource $request->request->get("psLstRes") ;
  402.                 $laLstRessource explode(","$lsLstRessource) ;
  403.             }
  404.             if ($laLstRessource) {
  405.                 // Récupérer la liste des activités de base communes à toutes les ressources sélectionnées
  406.                 $lsLstInfos $em->getRepository("PaaBundle:actibases")->rtvCurCompetencesCommunes($laLstRessourcefalse$liActiBase$this->getIdEtablissementCourant());           
  407.             } else if($liActiBase) {
  408.                 // Récupérer au moins l'activité de base actuellement choisie
  409.                 $lsLstInfos $em->getRepository("PaaBundle:actibases")->rtvCurCompetencesCommunes([''], false$liActiBase$this->getIdEtablissementCourant()); 
  410.             } else {
  411.                 $lsLstInfos = [] ;
  412.             }
  413. // LG 20230828 old            if ($loEntité) {
  414.             if ($loEntité && $psOnglet== "OngletLibellé") {
  415.                 $idActivite $loEntité->getId();
  416.                 $libelleActi $em->getRepository("PaaBundle:" $psNomTable)->rtvlibelleacti($idActivite400511 pow(221)); //1449087 sans balise body, mais visiblement aucun effet 
  417.                 if ($_ENV['APP_ENV'] === 'dev') {
  418.                     $libelleActi "Activité : " $loEntité->getId() . "<br>" $libelleActi ;
  419.                 }
  420.             }
  421.         }
  422.         if ($psNomTable == 'seances') {
  423.             if ($loEntité) {
  424.                 $lbEstAbsenceOuPresence $loEntité->estAbsenceOuPresence() ;
  425.                 $lbEstSemaineType estSemaineType($loEntité->getTdebut()) ;
  426.                 if ($psOnglet == "OngletParticipants" && $lbEstAbsenceOuPresence) {
  427.                     // L'onglet participants est masqué pour les absences et les présences
  428.                     $psOnglet "OngletGénéral" ;
  429.                 }
  430.                 if ($psOnglet == "OngletSérie" and ($lbEstAbsenceOuPresence or $lbEstSemaineType)) {
  431.                     // L'onglet série est masqué pour les absences et les présences, et dans le cas de la semaine-type
  432.                     $psOnglet "OngletGénéral" ;
  433.                 }
  434.             } else {
  435.                 // Au cas où ...
  436.                 $psOnglet "OngletGénéral" ;
  437.             }
  438.             if ($psOnglet == "OngletParticipants") {
  439.                 $lsLstInfos $em->getRepository("PaaBundle:seancesRessources")->RtvCurRessourcesSeance_TtesInfos(
  440.                         $piId           // $piId_Seance
  441.                         ''            // $psLstType_Res = ''
  442.                         true          // $pbListeDesUsagersDuGroupe = 'false'
  443.                         true          // $pbToutesRessources = 'false'
  444.                         2             // $lcEvalueCompétence = 'null'
  445.                         1             // $piEvalueSiDisponible = 'null'
  446. // LG 20240319 début
  447.                         null          // $piId_Acti = null
  448.                         null          // $piId_ActiBase = null
  449.                         null          // $ptDébutSéance = null
  450.                         null          // $ptFinSéance = null
  451.                         false         // $pbEvalueIncompatibilitésUsagers = false
  452.                         false         // $pbEvalueHeuresFaitesEtAFaireUsagers = false
  453.                         null          // $pcLstResFiltre = null
  454.                         false         // $pbEvalueUneSéanceParJourUsagers = false
  455.                         false         // $pbEvalueHeuresFaitesEtAFaireGroupes = false
  456.                         true          // $pbInclParticipationsAnnulées = false
  457.                         false         // $pbLblUsagerInclutNomGroupe = false
  458.                         null          // $pvInfosSuppl = null
  459.                         null          // $pbInclInfosFlags = null
  460. // LG 20240319 fin
  461.                 );
  462.             }
  463.             if ($loEntité) {
  464.                 $idActivite $loEntité->getActivité()->getId();
  465.                 $libelleActi $em->getRepository("PaaBundle:activites")->rtvlibelleacti($idActivite50207998$loEntité->getId()); //6069375 sans balise body, mais visiblement aucun effet
  466.                 if ($_ENV['APP_ENV'] === 'dev') {
  467.                     $libelleActi "Séance : " $loEntité->getId() . "<br>" $libelleActi ;
  468.                 }
  469.             }
  470.         }
  471. // LG 20231024 déac        if ($psNomTable == 'users') {
  472. // LG 20231024 déac            $userBDD = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
  473. // LG 20231024 déac            $pwdBDD = $userBDD->getPassword();
  474. // LG 20231024 déac        }
  475.         $laFormOptions = array();
  476.         if (!isset($lsType)) {
  477.             $lsType $psNomTable;
  478.         }
  479.         $lsSousType "";
  480.         if (!isset($lsTwig)) {
  481.             $lsTwig $psNomTable;
  482.         }
  483.         if ($psNomTable == 'users') {
  484.             if ($this->isGranted("ROLE_ADMIN")) {
  485.                 // L'utilisateur en cours a le droit de modifier les droits
  486.                 $lsSousType "PlusAdmin";
  487.             }
  488.         }
  489.         $laOptionsSécurité null;
  490.         // ajout d'une condition pour assigner le sous type dans intervenants
  491.         if ($psNomTable == 'intervenants') {
  492.             if ($psOnglet == 'OngletAdresse') {
  493.                 $lsSousType "Adresse";
  494.             }
  495.             if ($psOnglet == 'OngletSécurité') {
  496.                 $lsSousType "Sécurité";
  497.                 $laOptionsSécurité = \App\PaaBundle\Component\Paa\Paa_Constantes_Sécurité::getOptionsSécurité();
  498.             }
  499.         }
  500.         if ($psNomTable == 'usagers' && $psOnglet == 'OngletUsagerStatuts') {
  501.             $lsSousType "Statuts";
  502.         }
  503.         if ($psNomTable == 'groupesDroits') {
  504.             $laOptionsSécurité = \App\PaaBundle\Component\Paa\Paa_Constantes_Sécurité::getOptionsSécurité();
  505.         }
  506.         if (($psNomTable == 'intervenants' || $psNomTable == 'usagers' || $psNomTable == 'groupes' || $psNomTable == 'salles' || $psNomTable == 'seances' || $psNomTable == 'activites')
  507.                 && ($psOnglet == 'OngletCompétences') || substr($psOnglet018) == 'OngletParticipants' || $psOnglet == 'OngletSérie' || $psOnglet == 'OngletLibellé' || $psOnglet == 'OngletSeanceGraphique' || $psOnglet == 'OngletSeanceListe') {
  508.             $lsSousType "SansProprietes";
  509.         }
  510.         $lsRepertoire '';
  511.         $lsSousRepTwig '';
  512.         if (strtolower($psNomTable) == 'actiSsgroupesacti' || strtolower($psNomTable) == 'actigroupesacti' || strtolower($psNomTable) == 'actibases') {
  513.             $lsRepertoire "ActiBases\\";
  514.             $lsSousRepTwig 'actiBases/';
  515.         }
  516.         if (strtolower($psNomTable) == 'seances' && $psOnglet == 'OngletSérie') {
  517.             //Dans le cas de l'onglet Série, on utilise le formulaire de série
  518.             $lsType 'seances_seriesseances';
  519.             $psNomTable 'seances';
  520.             $lsTwig 'seances' ;
  521.             $lstJoursFeries $em->getRepository("PaaBundle:seriesseances")->getJoursFeries(date("Y") . '-01-01'date("Y") . '-12-31');
  522.             $lsLstSerie = [];
  523.             if ($loEntité && $loEntité->getIserie()) {
  524.                 $lsLstSerie $em->getRepository("PaaBundle:seriesseances")->findSeriesSeance($loEntité->getIserie(), 'null''null''null''false');
  525.             }
  526.             $lsSousType '';
  527.             $lsLstInfos $lsLstSerie;
  528.         }
  529.         $lsForm 'App\PaaBundle\Form\\' $lsRepertoire $lsType $lsSousType 'Type';
  530.         if ($psNomTable == 'seances') {
  531.             // Nécessaire pour le cas où pbGèreLieuxSéances est true (LG 20230331)
  532.             $laFormOptions['pbGèreLieuxSéances'] = $this->getParamètresBDD()->lGèreLieuxSéances() ;
  533.         };
  534.         $laFormOptions['doctrine'] = $this->get('doctrine');    // Injecter Doctrine dans le form builder
  535.         $laFormOptions['controller'] = $this//JM 20220225
  536.         $loForm $this->createForm($lsForm$loEntité$laFormOptions);
  537.         if ($this->isGranted('ROLE_CONCEPTEUR')) {
  538.             $lbEstEnseignantRemarque false;
  539.         } else if ($this->isGranted('ROLE_ENSEIGNANT_POSEDIVERS')) {
  540.             $lbEstEnseignantRemarque true;
  541.         } else {
  542.             $lbEstEnseignantRemarque false;            
  543.         }
  544.         $laOptions = array(
  545.             'poEntité' => $loEntité,
  546.             'poForm' => $loForm->createView(),
  547.             'psNomTable' => $psNomTable,
  548.             'psLibelléTable' => $this->getLibelléTable($psNomTable),
  549.             'bAutoriseListing' => false,
  550.             'psOngletActif' => $psOnglet,
  551.             'lstJoursFeries' => $lstJoursFeries,
  552.             'lsLstInfos' => $lsLstInfos,
  553.             'libelleActi' => $libelleActi,
  554.             'poController' => $this,        // Injecter le contrôleur
  555.             'paOptionsSécurité' => $laOptionsSécurité,
  556.             'pbEstEnseignantRemarque' => $lbEstEnseignantRemarque,
  557.         );
  558.         $laOptions["psContexte"] = $psContexte?:"toto";         // LG 20230120        
  559.         if (isset($lsLstRessource)) $laOptions["lsLstRessource"] = $lsLstRessource ;
  560.         if (($psNomTable == 'intervenants') && $psOnglet == 'OngletAdresse') {
  561.             $laOptions["psURLTable"] = "intervenantsAdresse";
  562.         }
  563.         if (($psNomTable == 'intervenants') && $psOnglet == 'OngletSécurité') {
  564.             $laOptions["psURLTable"] = "intervenantsSécurité";
  565.         }
  566.         if (($psNomTable == 'intervenants' || $psNomTable == 'usagers' || $psNomTable == 'groupes' || $psNomTable == 'salles') && $psOnglet == 'OngletCompétences') {
  567.             //récupération de la liste des AB, GAB, SGAB depuis la bdd            
  568.             $o getORessources($a$b);
  569.             $loConnexion $this->getDoctrineConnection();
  570.             $liEtablissement $this->getIdEtablissementCourant() ;
  571.             $resultat $o->getActiGabSgabArthur($r$loConnexion$liEtablissement);
  572.             //convertion d'un array en un objet afin que l'on puisse créer le treeview
  573.             $loRepo $this->get('doctrine')->getRepository("PaaBundle:ressourcesActibases");
  574.             $res $loRepo->remplirNoeudArthur(null$resultat);
  575.             //on rajoute le node 'tous' qui permet de séléctionner toutes les compétences.
  576.             array_unshift($res->nodes, (object) array('ctype' => 'GAB',
  577.                         'cid' => 'GAB0',
  578.                         'text' => 'Tous',
  579.                         'icouleur' => 16777215,
  580.                         'iid' => 0,
  581.                         'cid_parent' => null));
  582.             $laOptions["psDataNodes"] = json_encode($res->nodes);
  583.             $loListeActiIntervenants $loRepo->getActivitésOfRessource($psNomTable$piId''null$liEtablissement) ;
  584.             $laOptions["poListeActiBases"] = $loListeActiIntervenants;
  585.             $laOptions["pbAfficheCapacité"] = ($psNomTable == 'intervenants' || $psNomTable == 'usagers' || $psNomTable == 'salles');
  586.             $laOptions["psTitreColNom"] = "Activité de base";
  587.         }
  588.         if ((($psNomTable == 'seances')) || $psNomTable == 'caisses') {
  589.             $laOptions["pbGèreLieuxSéances"] = $this->getParamètresBDD()->lGèreLieuxSéances();
  590. // LG 20240624 début
  591.         }
  592.         if ($psNomTable == 'seances') {
  593. // LG 20240624 fin
  594. // LG 20231017 début
  595.             if (estPucette()) {
  596.                 // On est dans le cas Pucette
  597.                 // Faire la liste des créneaux pour la fournir au twig, si un groupe participe à la séance
  598.                 $laCreneaux = [];
  599. // TODO : faire passer l'info sur les créneaux en cache
  600. $pbCreneauxEnCache false ;
  601.                 if ($pbCreneauxEnCache == "false"$pbCreneauxEnCache == false ;
  602.                 if (!$pbCreneauxEnCache) {
  603.                     $lsLstGroupes $loEntité->getLstRessources("G") ;
  604.                 }
  605.                 if (!$pbCreneauxEnCache && $lsLstGroupes) {
  606.                     // Cette séance concerne au moins un groupe
  607.                     // Pas de créneaux en cache, on les récupère
  608.                     $seancesRepo $em->getRepository("PaaBundle:seances");
  609.                     $ldDate $loEntité->getDate() ;
  610.                     if (estSemaineType($ldDate)) {
  611.                         // Prendre toutes les dates de la ST
  612.                         $liSemaine = -;
  613.                     } else {
  614.                         // Prendre toutes les dates de la semaine de la date demandée
  615.                         $liSemaine getNoSemaine($ldDate) ;
  616.                     }
  617.                     $ldDébut GetDateAvecJour(1$liSemaine);
  618.                     $ldFin GetDateAvecJour(7$liSemaine);
  619.                     $laCreneaux $seancesRepo->rtvCurCréneaux($lsLstGroupes$ldDébut$ldFinfalse);
  620.                 }
  621.                 $laOptions['psResActive'] = $lsLstGroupes ;
  622.                 $laOptions['paCreneaux'] = $laCreneaux ;
  623.             }
  624. // LG 20231017 fin            
  625.         }
  626.         $laOptions["pbDroitEcriture"] = $lbADroitDEcriture;
  627.         if ($pbDansPage) {
  628.             $lsTwig "pageEntityForm";
  629.             $lsRep "Default";
  630.             $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  631.         } else {
  632.             $this->fillOptionsPourPopup($laOptions$request) ;     // LG 20230831
  633.             $lsRep "form";
  634.         }
  635.         $lsTwig '@Paa/' $lsRep '/' $lsSousRepTwig $lsTwig '.html.twig';
  636.         $lsResponse $this->render($lsTwig$laOptions);
  637.         return $lsResponse;
  638.     }
  639.     // Récupération du nom et de la description de l'entité fille de l'entité fournie en paramètre, pour l'onglet fourni en paramètre
  640.     // LG 20220720
  641.     public function getInfosEntiteFille($psNomEntiteMere$psOnglet "") {
  642.         $loInfos = new \stdClass() ;
  643.         $loInfos->nomEntite "introuvable" ;
  644.         $loInfos->descEntite "introuvable" ;
  645. // LG 20231024 déac        $lsNomTable = "";
  646. // LG 20231024 déac        $lsNomEntité = "";
  647.         if ($psNomEntiteMere !== "caisses" 
  648.                 && $psNomEntiteMere !== "intervenants" 
  649.                 && $psNomEntiteMere !== "compteurs" 
  650.                 && $psNomEntiteMere !== "usagers" 
  651.                 && $psNomEntiteMere !== "groupes" 
  652.                 && $psNomEntiteMere !== "activites"
  653.                 && $psNomEntiteMere !== "trspSocietes"
  654.                 && $psNomEntiteMere !== "contrainteshoraires"
  655.                 && $psNomEntiteMere !== "diplomes"
  656.             ) {
  657.             throw new \Exception("Attention, le nom de table n'est pas encore pris en charge dans defaultController.getInfosEntiteFille : " $psNomEntiteMere) ;
  658.         }
  659.         if($psNomEntiteMere === "caisses" ){
  660.             $loInfos->nomEntite "caissesPersonnes" ;
  661.             $loInfos->descEntite "Contact de caisse" ;
  662.             
  663.         } else if ($psNomEntiteMere === "intervenants") {
  664.             $loInfos->nomEntite "intervenantsContrats";
  665.             $loInfos->descEntite "Contrat d'intervenant";
  666.         } else if ($psNomEntiteMere === "compteurs") {
  667.             $loInfos->nomEntite "compteursRegles";
  668.             $loInfos->descEntite "Règles de compteurs";
  669.         } else if ($psNomEntiteMere === "usagers" 
  670.                 && $psOnglet == "OngletContacts"){
  671.             $loInfos->nomEntite "referents";
  672.             $loInfos->descEntite "Contact d'usager" ;
  673.         } else if ($psNomEntiteMere === "usagers" && $psOnglet == "OngletGroupes"){
  674.             $loInfos->nomEntite "usagersGroupes";
  675.             $loInfos->descEntite "Groupes de l'usager" ;
  676.             $loInfos->contexte "GroupesDeLUsager" ;   // LG 20230120
  677.         } else if ($psNomEntiteMere === "usagers") {
  678.             // Cas anormal : on devrait être dans l'un des cas usagers ci-dessus
  679.             throw new \Exception("Cas d'onglet non prévu pour les usagers : " $psOnglet) ;
  680.         } else if ($psNomEntiteMere === "groupes" && $psOnglet == "OngletSousGroupes"){
  681.             $loInfos->nomEntite "sousGroupes";
  682.             $loInfos->descEntite "Sous-groupes" ;
  683.         } else if ($psNomEntiteMere === "groupes" && $psOnglet == "OngletUsagers"){
  684.             $loInfos->nomEntite "usagersGroupes";
  685.             $loInfos->descEntite "Usagers du groupe";
  686.             $loInfos->contexte "UsagersDuGroupe" ;   // LG 20230120
  687.         } else if ($psNomEntiteMere === "groupes" && $psOnglet == "OngletMatieres"){
  688.             $loInfos->nomEntite "matieres";
  689.             $loInfos->descEntite "Matières du groupe";
  690. // LG 20231024 début
  691.         } else if ($psNomEntiteMere === "groupes" && $psOnglet == "OngletCréneaux") {
  692.             $loInfos->nomEntite "creneaux";
  693.             $loInfos->descEntite "Créneaux horaires";
  694. // LG 20231024 fin
  695.         } else if($psNomEntiteMere === "activites"){
  696.             $loInfos->nomEntite "seances" 
  697.             $loInfos->descEntite " Séances de l'activité" ;
  698.         } else if($psNomEntiteMere === "trspSocietes"
  699.                 && $psOnglet == "OngletChauffeurs"){
  700.             $loInfos->nomEntite "trspChauffeurs" 
  701.             $loInfos->descEntite "Chauffeurs" ;
  702.         } else if($psNomEntiteMere === "trspSocietes"
  703.                 && $psOnglet == "OngletVehicules"){
  704.             $loInfos->nomEntite "trspVehicules" 
  705.             $loInfos->descEntite "Véhicules" ;
  706.         } else if ($psNomEntiteMere === "trspSocietes") {
  707.             // Cas anormal : on devrait être dans l'un des cas trspSocietes ci-dessus
  708.             throw new \Exception("Cas d'onglet non prévu pour les trspSocietes : " $psOnglet) ;
  709.         } else if($psNomEntiteMere === "contrainteshoraires"){
  710.             $loInfos->nomEntite "contrainteshorairesDetails" 
  711.             $loInfos->descEntite "Détails" ;
  712.         } else if ($psNomEntiteMere === "diplomes" && $psOnglet == "OngletModule") {
  713.             $loInfos->nomEntite "modules";
  714.             $loInfos->descEntite "module";
  715.         } else {
  716.             throw new \Exception("Cas non prévu : psNomEntiteMere = '$psNomEntiteMere' & psOnglet = '$psOnglet'") ;
  717.         }
  718.         return $loInfos ;
  719.     }
  720.     // Récupération du Type de table qui est contenu dans l'id
  721.     public function getCodeTable($piId) {
  722.         if (substr($piId03) == 'GAB') {
  723.             $piId substr($piId3strlen($piId) - 3);
  724.             $psNomTable "actiGroupesacti";
  725.         } elseif (substr($piId04) == 'SGAB') {
  726.             $piId substr($piId4strlen($piId) - 4);
  727.             $psNomTable "actiSsgroupesacti";
  728.         } elseif (substr($piId02) == 'AB') {
  729.             $piId substr($piId2strlen($piId) - 2);
  730.             $psNomTable "actibases";
  731.         } else {
  732.             throw new exception("Cas non prévu : " $piId);
  733.         }
  734.         $res = array('id' => $piId'nomTable' => $psNomTable);
  735.         return $res;
  736.     }
  737.     // Validation des modifications d'un item préexistant
  738.     public function updateAction(Request $request$psNomTable$piId) {
  739.         $lsRepertoire '';
  740.         $lsSousType '';
  741.         $lbFlush true;
  742.         if (!$request->isMethod('POST')) {
  743.             throw new \Exception("La requête de mise à jour doit être effectuée en POST");
  744.         }
  745.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::MODIFIER $psNomTable$piId), $response))
  746.             return $response;
  747.         $lajAllFormData $request->request->all();
  748.         if (strtolower($psNomTable) == 'actibasesousgroupegroupe' || strtolower($psNomTable) == 'actibases') {
  749.             $donnesacti $this->getCodeTable($piId);
  750.             $piId $donnesacti['id'];
  751.             $lsRepertoire "ActiBases\\";
  752.             $psNomTable $donnesacti['nomTable'];
  753.             if ($piId == || $piId == 'NaN') {
  754.                 $this->addAction($request$psNomTable);
  755.                 $response = new Response(
  756.                         '{"status": "OK", "idEntite": 0}'Response::HTTP_OK, array('content-type' => 'text/json')
  757.                 );
  758.                 return $response;
  759.             }
  760.             if (isset($lajAllFormData["fEntityForm_actibases"])) {
  761.                 // On traite les activités de base
  762.                 $liSousGroupe $lajAllFormData["fEntityForm_actibases"]["isousgroupe"];
  763. // LG 20221219 old                $lsSousType = getSousTypeFormActibase($liSousGroupe);
  764.                 $lsSousType $this->getSousTypeFormActibase($liSousGroupe);
  765.             }
  766.         } else if ($psNomTable == "actibases") {
  767.             $liSousGroupe $lajAllFormData["fEntityForm_actibases"]["isousgroupe"];
  768. // LG 20221219 old            $lsSousType = getSousTypeFormActibase($liSousGroupe);
  769.             $lsSousType $this->getSousTypeFormActibase($liSousGroupe);
  770.         } else if ($psNomTable == 'intervenantsAdresse') {
  771.             $psNomTable 'intervenants';
  772.             $lsSousType 'Adresse';
  773.         } else if ($psNomTable == 'intervenantsSécurité') {
  774.             $psNomTable 'intervenants';
  775.             $lsSousType 'Sécurité';
  776.         } else if ($psNomTable == 'seances' && isset($lajAllFormData['OngletSérie'])) {
  777.             // Ce qu'on doit enregistrer, c'est la série, avec le form "seances_seriesseancesType"
  778.             $lsSousType '_seriesseances';
  779.         } else if ($psNomTable == 'usagers' && isset($lajAllFormData['OngletStatuts'])) {
  780.             $lsSousType "Statuts";
  781.         }
  782.         $em $this->getDoctrineManager();
  783. // LG 20220728 début
  784.         if ($psNomTable == 'seances' && $piId && isset($lajAllFormData['ConfirmeModification']) && $lajAllFormData['ConfirmeModification']) {
  785.             // On est en modification d'une séance d'une série, et on dispose de la réponse au dialogue de la portée de la modification
  786.             // Il faut mémoriser la séance avant qu'elle ne soit altérée pér l'exploitation des données saisies par l'utilisateur
  787.             $loEntitéInitiale $this->get('doctrine')->getRepository("PaaBundle:seances")->find($piId) ;
  788.             // Faire en sorte que l'entité séance initiale ne se rafraichisse pas toute seule avec les nouvelles données
  789.             // A noter : Detach est dit déprécié, mais des références disent que finalement c'est dé-déprécié
  790.             $em->detach($loEntitéInitiale) ;
  791.             if (isset($lajAllFormData['OngletParticipants'])) {
  792.                 // On vient de l'onglet Participants
  793.                 // Il faut récupérer aussi les participants actuels de la séance, avant enregistrement
  794.                 $lsLstResSeanceOriginale "" ;
  795.                 $this->get('doctrine')->getRepository("PaaBundle:seances")->RtvLstRessourcesSéance($loEntitéInitiale$lsLstResSeanceOriginale) ;
  796.                 $loEntitéInitiale->sLstRes $lsLstResSeanceOriginale ;
  797.             }
  798.         }
  799. // LG 20220728 fin
  800.         
  801. // LG 20231025 début
  802. //        $loEntité = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
  803.         $lsNomEntité $psNomTable ;
  804.         if ($psNomTable == "creneaux") {
  805.             $lsNomEntité "seances" ;
  806.         }
  807.         $loRepository $em->getRepository("PaaBundle:" $lsNomEntité) ;
  808.         $loEntité $loRepository->find($piId);
  809. // LG 20231025 fin
  810.         if ($loEntité) {
  811.             $loEntité->setEntityManager($em);       // Injecter le entityManager ici est une (TRES) mauvaise pratique, mais je ne trouve pas d'autre solution pour que les div générées par Form pour les clés étrangères ne deviennent pas des select qui incluent toutes les lignes de la table mère de la relation
  812.         } else {
  813. // LG 20231025 old            $className = $em->getRepository("PaaBundle:" . $psNomTable)->getClassName();
  814.             $className $loRepository->getClassName();
  815.             $loEntité = new $className($em);        // Injecter le entityManager ici est une (TRES) mauvaise pratique, mais je ne trouve pas d'autre solution pour que les div générées par Form pour les clés étrangères ne deviennent pas des select qui incluent toutes les lignes de la table mère de la relation
  816.         }
  817.         $loEntitéOriginale = clone $loEntité ;       // LG 20230818
  818.         $laFormOptions = array();
  819.         if ($psNomTable == 'users') {
  820.             // On doit mémoriser le mot de passe actuel pour le comparer ultérieurement avec le mdp à enregistrer
  821. // LG 20231025 old            $userBDD = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
  822.             $userBDD $loRepository->find($piId);
  823.             $pwdBDD $userBDD->getPassword();
  824.             if ($this->isGranted("ROLE_ADMIN")) {
  825.                 // L'utilisateur en cours a le droit de modifier les droits
  826.                 $lsSousType "PlusAdmin";
  827.             }
  828.             // Pour éviter l'erreur "Ce formulaire ne doit pas contenir des champs supplémentaires."
  829.             // selon https://stackoverflow.com/questions/23018907/symfony2-4-form-this-form-should-not-contain-extra-fields-error
  830.             $laFormOptions['allow_extra_fields'] = true;
  831.         } 
  832.         if ($psNomTable == 'seances') {
  833.             $laFormOptions['pbGèreLieuxSéances'] = $this->getParamètresBDD()->lGèreLieuxSéances();
  834.         };
  835.                 
  836.         $laFormOptions['doctrine'] = $this->get('doctrine');    // Injecter Doctrine dans le form builder
  837.         $laFormOptions['controller'] = $this;                   // Injecter le controleur dans le form builder      // LG 20220415
  838.         $lsForm 'App\PaaBundle\Form\\' $lsRepertoire $psNomTable $lsSousType 'Type';
  839.         $loForm $this->createForm($lsForm$loEntité$laFormOptions);
  840.         
  841.         if ($psNomTable == 'actibases' && $piId || isset($lajAllFormData['OngletCompétences'])) {
  842.             // On enregistre une activité de base ou les compétences d'une ressource
  843.             // Il faut enregistrer les compétences
  844.             $loRepo $this->get('doctrine')->getRepository("PaaBundle:ressourcesActibases");
  845.             if ($psNomTable == 'actibases') {
  846.                 // On traite les ressources compétentes pour une actiBase
  847.                 $loRepo->EnregistreCompétencesAvecCoches('I'$piId$lajAllFormData);
  848.                 $loRepo->EnregistreCompétencesAvecCoches('U'$piId$lajAllFormData);
  849.                 $loRepo->EnregistreCompétencesAvecCoches('G'$piId$lajAllFormData);
  850.                 $loRepo->EnregistreCompétencesAvecCoches('S'$piId$lajAllFormData);
  851.             }
  852.             if (isset($lajAllFormData['OngletCompétences'])) {
  853.                 // On traite les compétences d'une ressource
  854.                 $lsType_Res strtoupper(substr($psNomTable01));
  855.                 $loRepo->EnregistreCompétencesAvecCoches('C'$lsType_Res $piId$lajAllFormData);
  856.                 // On ne doit pas poursuivre l'enregistrement sinon on crée un enregistrement vide (????)
  857.                 $lbFlush false;
  858.             }
  859.         }
  860.         
  861.         $loHandleRequest $loForm->handleRequest($request);
  862.         if (!$loHandleRequest->isSubmitted()) {
  863.             // A partir de Symfony4, le form doit être submitted
  864.             throw new \Exception("Erreur Limoog : La requête de mise à jour n'a pas été \"Submitted\"");
  865.         }
  866.         
  867.         if ($loHandleRequest->isValid()) {
  868.             if ($psNomTable == 'users') {
  869.                 // Pour les users, il faut encoder le mdp s'il a changé
  870.                 // A noter que ca semble fait dans D:\Luc\Dev\DevWeb\Symfony\applicationPAA\src\PaaBundle\Controller\UserController.php, qui n'est utilisé nulle part
  871.                 $pwd $loEntité->getPassword();
  872.                 $encoder $this->get("security.password_encoder");
  873.                 $pwdEndodé $encoder->encodePassword($loEntité$pwd);
  874.                 if ($pwd === null) {
  875.                     $loEntité->setPassword($pwdBDD);
  876.                 } else if ($pwdEndodé !== $pwdBDD) {
  877.                     // Le password a changé, l'encoder avant de l'enregistrer
  878.                     $loEntité->setPassword($pwdEndodé);
  879.                 }
  880.             }
  881.             $em $this->getDoctrineManager();
  882. // LG 20231025 old            $repo = $em->getRepository("PaaBundle:" . $psNomTable);
  883.             $repo $em->getRepository("PaaBundle:" $lsNomEntité);
  884.             if (method_exists($repo'checkValidité')) {
  885.                 $msgErreur $repo->checkValidité($loEntité);
  886.             } else {
  887.                 $msgErreur false;
  888.             }
  889.             if ($msgErreur) {
  890. // LG 20230804 old                return new Response('{"msgErreur": "' . $msgErreur . '"}', Response::HTTP_OK, array('content-type' => 'text/json'));
  891.                 return new Response('{"msgErreur": ' json_encode($msgErreur) . '}'Response::HTTP_OK, array('content-type' => 'text/json'));
  892.             }
  893.             if ($lbFlush) {
  894.                 if (!isset($lajAllFormData['URL'])) {
  895.                     // L'information sur l'URL appellante n'est pas encore dans les data de la requête : l'ajouter maintenant
  896.                     $lsURL $request->getPathInfo() ;
  897.                     if (substr($lsURL01) == "/") {
  898.                         // Enlever le 1er slash
  899.                         $lsURL substr($lsURL1) ;
  900.                     }
  901.                     $lajAllFormData['URL'] = $lsURL ;
  902.                 }
  903.                 $lsTypeDiffusionSérie "" ;
  904.                 if ($psNomTable == 'seances' && !isset($lajAllFormData['OngletSérie']) && $liSérie $repo->getSérieSéance($loEntité->getId())) {
  905.                     // Enregistrement d'une séance qui fait partie d'une série (sauf onglet série)
  906.                     $lsTypeDiffusionSérie = isset($lajAllFormData['ConfirmeModification'])?$lajAllFormData['ConfirmeModification']:"" ;
  907.                     if (!$lsTypeDiffusionSérie) {
  908.                         // La question de la portée de la modification n'a pas encore été posée : la poser maintenant
  909.                         $lsJSONDialogue $this->jsonDialogue_SérieSéances(""                     // $pcMsgAvertissement
  910.                                                                             $lajAllFormData     // $paDemandeInitiale
  911.                                                                             $loEntité           // $poSéance
  912.                                                                             "Modification"      // $psTypeModification = "Déplacement"
  913.                                                                             false               // $pbScinderDisabled = false
  914.                                                                             ) ;
  915.                         $response = new Response($lsJSONDialogueResponse::HTTP_OK, array('content-type' => 'text/json')
  916.                         );
  917.                         return $response ;
  918.                     }
  919.                 }
  920.                 if ($psNomTable == 'seances' && isset($lajAllFormData['OngletParticipants'])) {
  921.                     // Cas de l'onglet Participants d'une séance
  922.                     // On enregistre des participants de la séance
  923.                     $loRepo $this->get('doctrine')->getRepository("PaaBundle:seancesRessources");
  924. // LG 20240321 début
  925. //                    if (isset($lajAllFormData['OngletParticipants_I'])) {
  926. //                        // Sous-onglet Intervenants
  927. //                        $loRepo->EnregistreParticipationAvecCoches('I', $piId, $lajAllFormData);
  928. //                    }
  929. //                    if (isset($lajAllFormData['OngletParticipants_U'])) {
  930. //                        // Sous-onglet Usagers
  931. //                        $loRepo->EnregistreParticipationAvecCoches('U', $piId, $lajAllFormData);
  932. //                    }
  933. //                    if (isset($lajAllFormData['OngletParticipants_G'])) {
  934. //                        // Sous-onglet Groupes
  935. //                        $loRepo->EnregistreParticipationAvecCoches('G', $piId, $lajAllFormData);
  936. //                    }
  937. //                    if (isset($lajAllFormData['OngletParticipants_S'])) {
  938. //                        // Sous-onglet Salles
  939. //                        $loRepo->EnregistreParticipationAvecCoches('S', $piId, $lajAllFormData);
  940. //                    }
  941.                     $lsLstTypeRes "" ;
  942.                     if (isset($lajAllFormData['OngletParticipants_I'])) {
  943.                         // Sous-onglet Intervenants
  944.                         $lsLstTypeRes .= "I" ;
  945.                     }
  946.                     if (isset($lajAllFormData['OngletParticipants_U'])) {
  947.                         // Sous-onglet Usagers
  948.                         $lsLstTypeRes .= "U" ;
  949.                     }
  950.                     if (isset($lajAllFormData['OngletParticipants_G'])) {
  951.                         // Sous-onglet Groupes
  952.                         $lsLstTypeRes .= "G" ;
  953.                     }
  954.                     if (isset($lajAllFormData['OngletParticipants_S'])) {
  955.                         // Sous-onglet Salles
  956.                         $lsLstTypeRes .= "S" ;
  957.                     }
  958.                     $lsMsgAnomalie $loRepo->EnregistreParticipationAvecCoches($lsLstTypeRes$piId$lajAllFormData);
  959.                     if ($lsMsgAnomalie) {
  960.                         // Les ressources ajoutées sont en conflit
  961.                         $lsToastMsg "Attention, $lsMsgAnomalie;
  962.                         $lsAction = <<<ACTION
  963. window.oPlanning.oControleur.getGestionnaireActions().lanceActionSymfony({"URL": "montreConflits", "iId_Seance": $piId});
  964. ACTION ;
  965. //                        $lsToastBoutons = '[{"texte": "Voir les conflits", "action": "toastr.success(\"toto\");"}]' ;
  966.                         $lsToastBoutons '[{"texte": "Voir les conflits", "action": ' json_encode($lsAction) . '}]' ;
  967.                     }
  968. // LG 20240321 fin
  969.                     // On ne doit pas poursuivre l'enregistrement sinon on crée une séance invalide (début et fin nulls)
  970.                     $lbFlush false;
  971.                     
  972.                 }
  973.             }
  974.             
  975.             $lbReturnRafraichirTout false ;
  976.             if ($lbFlush) {
  977. // LG 20230818 début
  978.                 if (strtolower($psNomTable) == 'matieres') {
  979.                     // Matière pour laquelle l'Id de l'activité de base n'est pas encore défini : on va aussi insérer une activité de base pour cette matière
  980. // $fieldMappings = $em->getClassMetadata("App\PaaBundle\Entity\matieres")->fieldMappings ;
  981.                     // En principe, on est en modification d'une matière préexistante
  982.                     if (!$loEntité->getId()) {
  983.                         throw new \Exception("La matière modifiée n'a pas encore d'Id") ;
  984.                     } else if ($loEntité->getIactibase() == $loEntitéOriginale->getIactibase()) {
  985.                         // L'id de l'activité de base n'a pas changé : RAS
  986.                     } else {
  987.                         // Mémoriser les modifications que l'utilisateur souhaitait éventuellement appliquer à l'activité de base nouvellement sélectionnée
  988.                         $loActiBaseSouhaitée = clone $loEntité->getActibase() ;
  989.                         // Annuler les changements sur l'AB qui était auparavant liée à la matière
  990.                         // (car sinon Doctrine, remplacer les données de l'ancienne AB par celles de la nouvelle, y compris l'identifiant)
  991.                         $em->refresh($loEntité->getActibase());
  992.                         // Récupérer l'activité de base qui est maintenant liée à cette matière
  993.                         $loRepoActiBases $this->get('doctrine')->getRepository("PaaBundle:actibases");
  994.                         if ($loEntité->getIactibase()) {
  995.                             // L'activité de base qui vient d'être associée est une AB préexistante (qui a peut-être été modifiée par l'utilisateur)
  996.                             // Recharger cette AB préexistante pour lui appliquer les changements apportés dans le form
  997.                             $loActiBaseFinale $loRepoActiBases->find($loEntité->getIactibase()) ;
  998.                         } else {
  999.                             if ($loActiBaseFinale $loRepoActiBases->findIdentiqueA($loEntité->getActibase())) {
  1000.                                 // On a trouvé une activité de base identique à celle qu'on cherche à insérer, l'utiliser
  1001.                             } else {
  1002.                                 // L'activité de base qui vient d'être associée est une nouvelle AB
  1003.                                 $loActiBaseFinale = new actibases() ;
  1004.                             }
  1005.                         }
  1006.                         $loActiBaseFinale->setEntityManager($em) ;
  1007.                         if (!$loActiBaseFinale->getIsousgroupe()) {
  1008.                             // Le sous-groupe d'AB n'est pas encore défini : le faire maintenant
  1009.                             $loActiBaseFinale->setIsousgroupe(Paa_Constantes::eiActiSsGpeMatiere) ;
  1010.                         }
  1011.                         // Reporter dans la nouvelle activité de base les modifications apportées dans le formulaire
  1012.                         $loActiBaseFinale->setCnom($loActiBaseSouhaitée->getCnom()) ;
  1013.                         $loActiBaseFinale->setCnomcourt($loActiBaseSouhaitée->getCnomcourt()) ;
  1014.                         $loActiBaseFinale->setCcode($loActiBaseSouhaitée->getCcode()) ;
  1015.                         $loActiBaseFinale->setIcouleur($loActiBaseSouhaitée->getIcouleur()) ;
  1016.                         $loActiBaseFinale->setIcouleurtexte($loActiBaseSouhaitée->getIcouleurtexte()) ;
  1017.                         $em->persist($loActiBaseFinale) ;
  1018.                         if (!$loEntité->getIactibase()) {
  1019.                             // On vient de persister la nouvelle activité de base : fournir l'information à l'entité matière
  1020.                             $loEntité->setIactibase($loActiBaseFinale->getIidactibase()) ;
  1021.                         }
  1022.                     }
  1023.                 }   // Fin du cas spécifique de l'entité Matières
  1024. // LG 20230818 fin
  1025.                // Sauvegarder les changements
  1026.                 $em->flush();
  1027.                 
  1028.                 if ($psNomTable == 'seances' && isset($lajAllFormData['OngletSérie'])) {
  1029.                     // Enregistrement des séances de la série
  1030.                     $loRepo $this->get('doctrine')->getRepository("PaaBundle:seriesSeances");
  1031.                     $loRepo->EnregistreSéancesSériesAvecCoches($piId$lajAllFormData);
  1032.                 }
  1033.             }   // Fin de si on doit faire le flush
  1034.             
  1035.             if ($psNomTable == 'seances' && $lsTypeDiffusionSérie && ($lbFlush || isset($lajAllFormData['OngletParticipants']))) {
  1036.                 // On est en modification d'une séance d'une série, et on dispose de la réponse au dialogue de la portée de la modification
  1037.                 // Exécuter la diffusion sur la série
  1038.                 $liIdSeance $loEntité->getId() ;
  1039.                 $ldDate $loEntité->getDate() ;
  1040.                 // Faire en sorte que l'entité séance finale sot ectement remplie dans tous les cas (sans quoi le find ci-dessous ne charge pas les données qui n'ont pas été fournies par le form)
  1041.                 // A noter : Detach est dit déprécié, mais des références disent que finalement c'est dé-déprécié
  1042.                 $em->detach($loEntité) ;
  1043.                 $loEntitéFinale $this->get('doctrine')->getRepository("PaaBundle:seances")->find($loEntité->getId()) ;       // Il faut recharger l'entité pour être certain qu'elle dispose de toutes les propriétés, même celles qui n'ont pas été fournies par le form
  1044.                 if (isset($lajAllFormData['OngletParticipants'])) {
  1045.                     // On vient de l'onglet Participants
  1046.                     // Il faut récupérer aussi les nouveaux participants de la séance
  1047.                     $lsLstResSeance "" ;
  1048.                     $this->get('doctrine')->getRepository("PaaBundle:seances")->RtvLstRessourcesSéance($loEntité$lsLstResSeance) ;
  1049.                     $loEntitéFinale->sLstRes $lsLstResSeance ;
  1050.                 }
  1051.                 $lbResult $this->serieSeances_DiffuseModificationSurSérie($lsTypeDiffusionSérie       // $psTypeDiffusionSérie
  1052.                                                                         $liIdSeance                   // $piIdSeance
  1053.                                                                         $liSérie                      // $piIdSérie
  1054.                                                                         $ldDate                       // $pdDate
  1055.                                                                         $loEntitéInitiale             // poSeanceInitiale, LG 20220729
  1056.                                                                         $loEntitéFinale               // poSeanceFinale, LG 20220729
  1057.                                                                         ) ;
  1058.                 if ($lbResult) {
  1059.                     $lbReturnRafraichirTout true ;
  1060.                 }
  1061.             }
  1062.             // Le return permet de ne pas actualiser le formulaire lors d'une sauvegarde
  1063.             if ($loEntité == NULL) {
  1064.                 $lsJSON '"idEntite": 0' ;
  1065.             } else {
  1066.                 $lsJSON '"status": "OK", "idEntite": ' $loEntité->getId() ;
  1067.             }
  1068.             if ($lbReturnRafraichirTout) {
  1069.                 $lsJSON .= ', "bRafraichirTout": true' ;
  1070.             }
  1071. // LG 20240321 début
  1072.             if (isset($lsToastMsg) && $lsToastMsg) {
  1073.                 // Il y a un toast à présenter à l'utilisateur
  1074.                 if (isset($lsToastBoutons) && $lsToastBoutons) {
  1075.                     $lsToastBoutons ', "boutons":' $lsToastBoutons ;
  1076.                 } else {
  1077.                     $lsToastBoutons '' ;
  1078.                 }
  1079.                 $lsJSON .= ', "toast": {"msg": "' $lsToastMsg '", "niveau": "warning", "durée": 0' $lsToastBoutons '}' ;
  1080.             } else {
  1081.                 $lsJSON .= ', "toast": {"msg": "Modifications enregistrées", "niveau": "success"}' ;
  1082.             }
  1083. // LG 20240321 fin            
  1084.             $response = new Response("{" $lsJSON "}"Response::HTTP_OK, array('content-type' => 'text/json')
  1085.             );
  1086.             return $response;
  1087.         } else {
  1088.             // Au moins une saisie est invalide
  1089.             $lsErreurs $this->getStringErrorsForm($loForm) . "<br>" $lsForm;
  1090.             
  1091.             if (false) {
  1092.                 // pour déboguer le cas "Ce formulaire ne doit pas contenir des champs supplémentaires"
  1093.                 // Ce code permet d'avoir la liste des champs supplémentaires
  1094.                 // Selon https://askcodez.com/symfony-2-ce-formulaire-ne-doit-pas-contenir-de-champs-supplementaires.html
  1095.                 $data $request->request->all();
  1096.                 print("REQUEST DATA<br/>");
  1097.                 foreach ($data as $k => $d) {
  1098.                     print("$k: <pre>"); print_r($d); print("</pre>");
  1099.                 }
  1100.                 $children $loForm->all();
  1101.                 print("<br/>FORM CHILDREN<br/>");
  1102.                 foreach ($children as $ch) {
  1103.                     print($ch->getName() . "<br/>");
  1104.                 }
  1105.                 $data array_diff_key($data$children);
  1106.                 //$data contains now extra fields
  1107.                 print("<br/>DIFF DATA<br/>");
  1108.                 foreach ($data as $k => $d) {
  1109.                     print("$k: <pre>"); print_r($d); print("</pre>");
  1110.                 }
  1111.             }
  1112.             if (strpos($lsErreurs"Le jeton CSRF est invalide. Veuillez renvoyer le formulaire.")) {
  1113.                 $lsErreurs "Le délai de validité du formulaire de saisie est dépassé, ou vous avez été déconnecté depuis son affichage.<br>Il vous faut annuler puis recommencer votre saisie." ;
  1114.             }
  1115.             $lsJSONDialogue '{"Dialogue": {"Message": ' json_encode($lsErreurs) . ', "Titre":"Erreur lors de l&apos;enregistrement"'
  1116.                     ', "Boutons": [{"text":"OK", "Action":"closeDialog"}]}'
  1117.                     '}';
  1118.             $response = new Response($lsJSONDialogue);
  1119.             $response->headers->set('Content-Type''application/json');
  1120.             return $response;
  1121.         }
  1122.     }
  1123.     // Validation des modifications d'un nouvel item
  1124.     public function addAction(Request $request$psNomTable) {
  1125. // CB 20230120 début
  1126.         $lsNomForm $psNomTable;
  1127. // CB 20230120 fin
  1128. //        if($psNomTable == 'sousGroupes') {
  1129. //            $psNomTable = 'groupes';
  1130. //            $lsNomForm = 'sousGroupes';
  1131. //        }
  1132.         
  1133.         if (!$request->isMethod('POST')) {
  1134.             throw new \Exception("La requête d'ajout doit être effectuée en POST");
  1135.         }
  1136.         $lsRepertoire '';
  1137.         $lsSousType '' ;      // LG 20220307
  1138.         if (strtolower($psNomTable) == 'actibasesousgroupegroupe') {
  1139.             $psNomTable $request->request->all()["NomEntité"];
  1140.             $lsNomForm $psNomTable;   // LG 20230227
  1141.             if ($psNomTable == "actibases") {
  1142.                 // Il faut détecter le sous-type d'activité de base (absence intervenant, ...)
  1143.                 $liSousGroupe $request->request->all()["fEntityForm_" $psNomTable]["isousgroupe"];
  1144.                 $lsSousType $this->getSousTypeFormActibase($liSousGroupe);
  1145.             }
  1146.         }
  1147.         if (strtolower($psNomTable) == 'actissgroupesacti' || strtolower($psNomTable) == 'actigroupesacti' || strtolower($psNomTable) == 'actibases') {
  1148.             $lsRepertoire "ActiBases\\";
  1149.         }
  1150. // LG 20231025 début
  1151.         $lsNomEntité $psNomTable ;
  1152.         if ($psNomTable == "creneaux") {
  1153.             $lsNomEntité "seances" ;
  1154.         }
  1155. // LG 20231025 fin
  1156.         //$this->denyAccessUnlessGranted(PaaVoter::AJOUTER . $psNomTable, null, 'Désolé, vous ne disposez pas de droits d\'ajout d\'éléments de ce type.');
  1157.         $em $this->getDoctrineManager();
  1158. // LG 20231025 old        $repo = $em->getRepository("PaaBundle:" . $psNomTable);
  1159.         $repo $em->getRepository("PaaBundle:" $lsNomEntité);
  1160.         $className $repo->getClassName();
  1161.         $loEntité = new $className($em); // Injecter le entityManager ici est une (TRES) mauvaise pratique, mais je ne trouve pas d'autre solution pour que les div générées par Form pour les clés étrangères ne deviennent pas des select qui incluent toutes les lignes de la table mère de la relation
  1162. // LG 20230920 début
  1163.         if ($psNomTable == "matieres") {
  1164.             // Pour les matières, le form a besoin de la liste des sous-groupes (dans matieresType.getFiltreGroupe())
  1165.             // Pour ça, il faut que le groupe de la matière soit défini
  1166.             $la $request->request->all() ;
  1167.             $liGroupe $la["fEntityForm_matieres"]["igroupe"] ;
  1168.             $loEntité->setIgroupe($liGroupe) ;            
  1169.         }
  1170. // LG 20230920 fin
  1171.         $laFormOptions = array();
  1172.         if ($psNomTable == 'users') {
  1173.             // Pour éviter l'erreur "Ce formulaire ne doit pas contenir des champs supplémentaires."
  1174.             // selon https://stackoverflow.com/questions/23018907/symfony2-4-form-this-form-should-not-contain-extra-fields-error
  1175.             $laFormOptions['allow_extra_fields'] = true;
  1176.         }
  1177.         $laFormOptions['doctrine'] = $this->get('doctrine');            // Pour injecter Doctrine dans le form builder
  1178.         $laFormOptions['controller'] = $this;                           // Injecter le controleur dans le form builder      // LG 20220415
  1179.         $lsForm 'App\PaaBundle\Form' '\\' $lsRepertoire $lsNomForm $lsSousType 'Type';
  1180.         $loForm $this->get('form.factory')->create($lsForm$loEntité$laFormOptions);
  1181.         $loHandleRequest $loForm->handleRequest($request);
  1182.         
  1183.         if ($loHandleRequest->isValid()) {
  1184.             // Les saisies sont valides
  1185.             $loEntité $loForm->getData();
  1186.             $loEntité->setEntityManager($em) ;      // LG 20230804
  1187.             if ($psNomTable == 'users') {
  1188.                 // Pour les users, il faut encoder le mdp
  1189.                 $encoder $this->get("security.password_encoder");
  1190.                 $pwd $loEntité->getPassword();
  1191.                 $pwdEndodé $encoder->encodePassword($loEntité$pwd);
  1192.                 $loEntité->setPassword($pwdEndodé);
  1193.                 // Et pour une raison inconnue les rôles ne sont pas enregistrés
  1194.                 if (count($loEntité->getRoles()) < 2) {     // 2 car il y a toujours le role "user" par défaut
  1195.                     // Aucun rôle remonté dans l'entité
  1196.                     if (isset($request->request->All()["fEntityForm_users"]) && isset($request->request->All()["fEntityForm_users"]["roles"])) {
  1197.                         $laRoles $request->request->All()["fEntityForm_users"]["roles"] ;
  1198.                         $loEntité->setRoles($laRoles) ;
  1199.                     }
  1200.                 }
  1201.             }
  1202. // LG 20230804 début
  1203.             if (strtolower($psNomTable) == 'matieres' /*&& !$loEntité->getActibase()->getId()*/) {
  1204.                 // Matière pour laquelle l'Id de l'activité de base n'est pas encore défini : on va aussi insérer une activité de base pour cette matière
  1205.                 $loActiBase $loEntité->getActibase() ;
  1206.                 $loActiBase->setEntityManager($em) ;
  1207.                 if (!$loEntité->getActibase()->getIsousgroupe()) {
  1208.                     // Il faut forcer le sous-groupe d'appartenance de l'activité de base créée avec la matière
  1209.                     $loActiBase->setIsousgroupe(\App\PaaBundle\Component\Paa\Paa_Constantes::eiActiSsGpeMatiere) ;
  1210.                 } else if (!$loActiBase->getSousgroupe()) {
  1211.                     // L'objet sousgroupe n'est pas set : le mettre à jour maintenant en imposant l'id du sous-groupe
  1212.                     $loActiBase->setIsousgroupe($loActiBase->getIsousgroupe(), true) ;
  1213.                 }
  1214.                 if ($loEntité->getActibase()->getId()) {
  1215.                     // Il s'agit d'une activité de base préexistante : Docrtine a envie de la réinsérer
  1216. // Ne fait rien                    $em->detach($loEntité->getActibase()) ;
  1217.                     $liActiBase $loEntité->getActibase()->getId() ;
  1218.                     $loEntité->setActibase(null) ;
  1219.                     $loEntité->setiActibase($liActiBase) ;
  1220.                 }
  1221. //  LG 20230822 déac début : fait par triggers
  1222. //                 // et affecter un seul groupe à l'activité de base : celui de la matière
  1223. //                 $loActiBase->setLtousgroupes(false) ;
  1224. //                 // Impossible tant que l'AB n'a pas d'ID ; on doit le faire après le flush : $loActiBase->setLstResCompetentes('G' . $loEntité->getiGroupe() . ',') ;
  1225. //  LG 20230822 déac fin
  1226.             }
  1227. // LG 20230804 fin
  1228.             if (method_exists($repo'checkValidité')) {
  1229.                 // Ici on appelle la fonction checkValidité en fonction de si on est en mode démo ou pas
  1230.                 // Si on est en démo, on lui passe en paramètre l'id de l'établissement courant
  1231.                 if($this->estDemoMode()) {
  1232.                     $lidEtablissement $this->getIdEtablissementCourant();
  1233.                     $msgErreur $repo->checkValidité($loEntité$lidEtablissement);
  1234.                 } else {
  1235.                     $msgErreur $repo->checkValidité($loEntité);
  1236.                 }
  1237.             } else {
  1238.                 $msgErreur false;
  1239.             }
  1240.             if ($msgErreur) {
  1241. // LG 20230804 old                return new Response('{"msgErreur": "' . $msgErreur . '"}', Response::HTTP_OK, array('content-type' => 'text/json'));
  1242. // LG 20230920 old                return new Response('{"msgErreur": ' . json_encode($msgErreur) . '}', Response::HTTP_OK, array('content-type' => 'text/json'));
  1243.                 return new Response('{"status": "KO", "msgErreur": ' json_encode($msgErreur) . '}'Response::HTTP_OK, array('content-type' => 'text/json'));
  1244.             }
  1245.             if (method_exists($loEntité'getEtablissement')) {
  1246.                 // Astuce pour que l'id d'établissement d'un nouvel enregistrement soit correctement enregistré
  1247.                 $loEntité->setEntityManager($em) ;
  1248.                 if($etablissement $loEntité->getEtablissement()) {
  1249.                     $toto $etablissement->getId();
  1250.                 }
  1251.             }
  1252.             $em->persist($loEntité);
  1253.             $em->flush();
  1254. // LG 20230822 déac début : fait par triggers
  1255. // // LG 20230602 début
  1256. // // LG 20230804 old            if (strtolower($psNomTable) == 'matieres' && !$loEntité->getActibase()->getIsousgroupe()) {
  1257. //             if (strtolower($psNomTable) == 'matieres') {
  1258. //                 // Matière
  1259. //                 $loEntitéCréé = $em->getRepository("PaaBundle:matieres")->find($loEntité->getId());
  1260. //                 $loActiBase = $em->getRepository("PaaBundle:actibases" )->find($loEntité->getIactibase());
  1261. //                 $loActiBase->setEntityManager($em) ;
  1262. //                 // et affecter un seul groupe à l'activité de base : celui de la matière
  1263. //                 $loActiBase->setLtousgroupes(false) ;
  1264. //                 $loActiBase->setLstResCompetentes('G' . $loEntitéCréé->getiGroupe() . ',') ;
  1265. //                 $em->persist($loEntitéCréé);
  1266. //                 $em->flush();
  1267. //             }
  1268. // // LG 20230602 fin
  1269. // LG 20230822 déac fin
  1270.             if (strtolower($psNomTable) == 'intervenants') {
  1271.                 // Le contrat de l'intervenant a été créé par le trigger PG avec établissement NULL
  1272.                 // Modifier le contrat pour y mettre l'établissement courant
  1273.                 $loContrat $em->getRepository("PaaBundle:intervenantsContrats" )->findOneBy(['iintervenant' => $loEntité->getId()]);
  1274.                 if ($loContrat !== null) {
  1275.                     $loContrat->setEntityManager($em);
  1276.                     $loContrat->setIetablissement(intval($this->getIdEtablissementCourant())) ;
  1277.                     $em->persist($loContrat);
  1278.                     $em->flush();
  1279.                 }
  1280.             }
  1281.         } else {
  1282.             // Au moins une saisie est invalide
  1283.             $lsErreurs $this->getStringErrorsForm($loForm) ;
  1284. // LG 20230920 début
  1285.             throw new \Exception("La requête d'ajout n'est pas valide : " $lsErreurs);
  1286. // FINALEMENT, mieux vaut lancer une exception
  1287. //             $lsMsgErr = json_encode("La requête d'ajout n'est pas valide : " . $lsErreurs) ;
  1288. //             $response = new Response(
  1289. //                     '{"status": "KO", "msgErreur": ' . $lsMsgErr . '}', Response::HTTP_OK, array('content-type' => 'text/json')
  1290. //             );
  1291. //             return $response;
  1292. // LG 20230920 fin
  1293.         }
  1294.         $response = new Response(
  1295.                 '{"status": "OK", "idEntite": ' $loEntité->getId() . '}'Response::HTTP_OK, array('content-type' => 'text/json')
  1296.         );
  1297.         
  1298.         return $response;
  1299.     }
  1300.  // LG 20230828 début
  1301.  //   public function deleteAction(Request $request, $psNomTable, $piId) {
  1302. //        if ($this->RedirectIfNotGranted($request, $this->isGranted(PaaVoter::MODIFIER . $psNomTable, $piId), $response))
  1303. //            return $response;
  1304. //        
  1305. //        if ($psNomTable === "actiBases") $psNomTable ="actibases" ;
  1306. //        if (strtolower($psNomTable) === "actissgroupesacti") $psNomTable ="actiSsgroupesacti" ;     // LG 20210907
  1307. //        if (strtolower($psNomTable) === "getidactivites") $psNomTable ="activites" ;                // LG 20210909
  1308. //        
  1309. //        // Retrouver l'entité à supprimer
  1310. //        $em = $this->getDoctrineManager();
  1311. //// LG 20230828 début
  1312. ////        $loEntité = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
  1313. //        $loRepo = $em->getRepository("PaaBundle:" . $psNomTable) ;
  1314. //        $loEntité = $loRepo->find($piId);
  1315. //// LG 20230828 fin
  1316. //
  1317. //        // Tester si l'entité est supprimable
  1318. //        $lsMsgErr = "" ;
  1319. //// LG 20230828 déac : inutilisé        $lsNomEntite = $psNomTable ;
  1320. //// LG 20230828 déac : inutilisé        if ($psNomTable == "sousGroupes") $lsNomEntite = "groupes" ;
  1321. //
  1322. //// LG 20230828 début
  1323. ////        if ($loEntité && !$em->getRepository("PaaBundle:" . $lsNomEntite)->estSupprimable($loEntité, $lsMsgErr)) {
  1324. //        if ($loEntité && !$loRepo->estSupprimable($loEntité, $lsMsgErr)) {
  1325. //            // Cette entité n'est pas supprimable du tout
  1326. //            $lsMsgErr = $lsMsgErr?:"Désolé, cet item n'est pas supprimable." ;
  1327. //        }
  1328. //// LG 20230828 fin
  1329. //
  1330. //// LG 20230828 déac début : déplacé dans repository
  1331. ////        else if (strtolower($psNomTable) === "activites" && $loEntité->getLgenerique()) {
  1332. ////            $lsMsgErr = "Désolé, une activité générique n'est pas supprimable" ;
  1333. ////        }
  1334. //// LG 20230828 déac fin
  1335. //        if ($lsMsgErr) {
  1336. //            // Une règle interdit la suppression
  1337. //// LG 20230804 old            $response = new Response('{"status": "KO", "msgErreur": "' . $lsMsgErr . '"}', Response::HTTP_OK, array('content-type' => 'text/json'));            
  1338. //            $response = new Response('{"status": "KO", "msgErreur": ' . json_encode($lsMsgErr) . '}', Response::HTTP_OK, array('content-type' => 'text/json'));            
  1339. //            return $response ;
  1340. //        }
  1341. //// LG 20230828 début
  1342. //        else if ($lsMsgConfimation = $loRepo->rtvMsgConfirmationSuppression($loEntité)) {
  1343. //            // Cette entité n'est supprimable qu'avec confirmation de la part de l'utilisateur
  1344. //            
  1345. //        }
  1346. //// LG 20230828 fin
  1347. //
  1348. //        // Effectuer la suppression
  1349. //        $em->remove($loEntité);
  1350. //        $em->flush();
  1351. //
  1352. //        $response = new Response('{"status": "OK"}', Response::HTTP_OK, array('content-type' => 'text/json'));
  1353. //        return $response;
  1354. //    }
  1355.     public function deleteAction(Request $request$psNomTable$piId) {
  1356.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::MODIFIER $psNomTable$piId), $response))
  1357.             return $response;
  1358.         
  1359.         if ($psNomTable === "actiBases"$psNomTable ="actibases" ;
  1360.         if (strtolower($psNomTable) === "actissgroupesacti"$psNomTable ="actiSsgroupesacti" ;
  1361.         if (strtolower($psNomTable) === "getidactivites"$psNomTable ="activites" ;
  1362.         if (strtolower($psNomTable) === "sousgroupes"$psNomTable ="groupes" ;                // LG 20230829
  1363.         
  1364.         // Retrouver l'entité à supprimer
  1365.         $lsNomEntité $psNomTable ;
  1366.         if ($psNomTable == "creneaux") {
  1367.             $lsNomEntité "seances" ;
  1368.         }
  1369.         $em $this->getDoctrineManager();
  1370. // LG 20231025 old        $loRepo = $em->getRepository("PaaBundle:" . $psNomTable) ;
  1371.         $loRepo $em->getRepository("PaaBundle:" $lsNomEntité) ;
  1372.         $loEntité $loRepo->find($piId);
  1373. // LG 20240619 début
  1374.         if (!$loEntité) {
  1375.             // L'entité n'a pas été trouvée
  1376.             // RAS
  1377.         } else {
  1378. // LG 20240619 fin
  1379.             if ($request->query->has("msgConfirm")) {
  1380.                 // On est en mode "demande de message de confirmation
  1381.                 if (!method_exists($loRepo"estSupprimable")) {
  1382.                     // Le repository ne dispose pas des méthodes personnalisées
  1383.                     $lsMsgConfimation "Confirmez-vous la suppression de cet élément ?" ;
  1384.                     $response = new Response('{"status": "OK", "msgConfirm": ' json_encode($lsMsgConfimation) . '}'Response::HTTP_OK, array('content-type' => 'text/json'));            
  1385.                     return $response ;
  1386.                 } else {
  1387.                     // Le Repository dispose des méthodes de test de supprimabilité
  1388.                     // Tester si l'entité est supprimable
  1389.                     $lsMsgErr "" ;
  1390.                     if ($loEntité && !$loRepo->estSupprimable($loEntité$lsMsgErr)) {
  1391.                         // Cette entité n'est pas supprimable du tout
  1392.                         $lsMsgErr $lsMsgErr?:"Désolé, cet item n'est pas supprimable." ;
  1393.                     }
  1394.                     if ($lsMsgErr) {
  1395.                         // Une règle interdit la suppression
  1396.                         $response = new Response('{"status": "KO", "msgErreur": ' json_encode($lsMsgErr) . '}'Response::HTTP_OK, array('content-type' => 'text/json'));            
  1397.                         return $response ;
  1398.                         
  1399.                     } else {
  1400.                         // Cette entité est supprimable, renvoyer un message de demande de confirmation adéquat
  1401.                         $lsLibelleEntitéType $loRepo->getLibelléEntité() ;
  1402.                         $lsLibelleEntité $loEntité->__toString() ;
  1403.                         $lbFéminin $loRepo->estLibelléEntitéFéminin() ;
  1404.                         if ($lbFéminin$lsPronom "cette" ;
  1405.                         else if (in_array(mb_substr($lsLibelleEntitéType01), ["a""à""e""é""è""i""o""u""y"])) $lsPronom "cet" ;
  1406.                         else $lsPronom "ce" ;
  1407.                         $lsMsgConfimation "Confirmez-vous la suppression de " $lsPronom $lsLibelleEntitéType ($lsLibelleEntité)&nbsp;?" ;
  1408.                         if ($lsMsgConfimation2 $loRepo->rtvMsgConfirmationSuppression($loEntité)) {
  1409.                             // Il y a une alerte supplémentaire à afficher à l'utilisateur
  1410.                             $lsMsgConfimation .= "<br><br><strong>Attention</strong> : " $lsMsgConfimation2 ;
  1411.                         }
  1412.                         $response = new Response('{"status": "OK", "msgConfirm": ' json_encode($lsMsgConfimation) . '}'Response::HTTP_OK, array('content-type' => 'text/json'));            
  1413.                         return $response ;
  1414.                         
  1415.                     }
  1416.                 }
  1417.             }
  1418.             // Effectuer la suppression
  1419.             $em->remove($loEntité);
  1420.             $em->flush();
  1421.         }       // LG 20240619
  1422.         $response = new Response('{"status": "OK"}'Response::HTTP_OK, array('content-type' => 'text/json'));
  1423.         return $response;
  1424.     }
  1425.  // LG 20230828 fin
  1426.  
  1427.     protected function autoriseListing($psNomTable) {
  1428.         return in_array($psNomTable, array("annees""intervenants""salles""usagers""groupes""actibases"));
  1429.     }
  1430.     public function listingTableAction(Request $request$psNomTable$psParametres) {
  1431.         require_once(dirname(__DIR__) . "/Resources/editions/listings.php");
  1432.         // Simple exécution en PDF pour l'instant
  1433.         executeListing($psNomTable"PDF"$psParametres$this->getDoctrineConnection());
  1434.         $response = new Response(
  1435.                 'Table : ' $psNomTable '<br>Paramètres : ' $psParametresResponse::HTTP_OK, array('content-type' => 'text/html')
  1436.         );
  1437.         return $response;
  1438.     }
  1439.     /**
  1440.      * @Security("has_role('ROLE_USER')")
  1441.      */
  1442.     public function setParametreAction($psNomParametre$pvValeur$psType) {
  1443. // LG 20230331 old        $lsRep = $this->getParamètresBDD()->setParamètre($psNomParametre, $pvValeur, $psType);
  1444. // LG 20240201 début
  1445.         $pvValeur str_replace("@lb@""\n"$pvValeur) ;      // Les LineBreak sont à présent interdits dans les URLS ?
  1446.         $pvValeur str_replace("@sp@"" "$pvValeur) ;       // Les espaces sont à présent interdits dans les URLS ?
  1447.         $pvValeur str_replace("@vide@"""$pvValeur) ;      // L'URL avec un paramètre vide n'est pas valide ?
  1448. // LG 20240201 fin
  1449.         $lsRep $this->setParamètre($psNomParametre$pvValeur$psType);
  1450.         $response = new Response($lsRepResponse::HTTP_OK, array('content-type' => 'text/html'));
  1451.         return $response;
  1452.     }
  1453.     protected function getDataPourEnTeteMenu($poDoctrineManager, &$paAnnees, &$paEtablissements/* , &$paSemaine */) {
  1454.         $paAnnees $poDoctrineManager->getRepository("PaaBundle:annees")->findListe();
  1455.         $paEtablissements $poDoctrineManager->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
  1456. // pour tests         $paAbsences = $poDoctrineManager->getRepository("PaaBundle:actiBases")->rtvCurActiBasesAbsence("I");
  1457.         return;
  1458.     }
  1459.     // Remplissage de données d'options spécifiques aux pages popup (utile en particulier pour Activités)
  1460.     // LG 20230831
  1461.     function fillOptionsPourPopup(&$paOptionsRequest $request) {
  1462. // LG 20231025 old        $session = $request->getSession();
  1463.         $session $this->refreshSession($request);
  1464.         $ldDebut $session->get('dateDebut');
  1465.         $ldFin $session->get('dateFin');
  1466. // LG 20231024 début
  1467.         $paOptions["pdDebutSélectionSemaines"] = $ldDebut ;
  1468.         $paOptions["pdFinSélectionSemaines"] = $ldFin ;
  1469. // LG 20231024 fin
  1470.         $paOptions["piIdAnnee"] = $this->trouveAnnéeAvecDates($ldDebut$ldFin);
  1471.         if (estSemaineType($ldDebut)) {
  1472.             // La date demandée est dans la semaine-type
  1473.             // Prendre les bornes de l'année scolaire actuelle
  1474.             $loAnnée $this->getEntitéAnnéeCourante() ;
  1475.             $ldDebut date_format($loAnnée->getDdebut(), "Y-m-d") ;
  1476.             $ldFin date_format($loAnnée->getDFin(), "Y-m-d") ;
  1477.         }
  1478.         $paOptions["pdDebut"] = $ldDebut;       // LG 20231024 DANGER : ces paramètres ont le même nom mais pas le même contenu dans ce cas (appellé pour les entityForm) que dans fillOptionsPourRenderEnTeteMenu (appellé par les pages de + haut niveau)
  1479.         $paOptions["pdFin"] = $ldFin;
  1480.     }
  1481.     //Utilisation de l'object request pour acceder a la session afin de garder certains parametres entre les pages
  1482.     function fillOptionsPourRenderEnTeteMenu(&$paOptionsRequest $request) {
  1483. // LG 20231025 old        $session = $this->refreshDatesSession($request);
  1484.         $session $this->refreshSession($request);
  1485.         $paOptions["pdDebut"] = $session->get('dateDebut');     // LG 20231024 DANGER : ces paramètres ont le même nom mais pas le même contenu dans ce cas (appellé par les pages de + haut niveau) que dans fillOptionsPourPopup (appellé pour les entityForm)
  1486.         $paOptions["pdFin"] = $session->get('dateFin');
  1487.         
  1488.         $m $this->getDoctrineManager();       // Récupérer le manager Doctrine
  1489.         // Listes des années et des établissements, pour affichage dans la barre de menu
  1490.         $this->getDataPourEnTeteMenu($m$laAnnees$laEtablissements);
  1491.         // Remplir le tableau des options
  1492.         $paOptions["paAnnées"] = $laAnnees;
  1493. // LG 20230831 début
  1494.         $paOptions["piIdAnnee"] = $this->trouveAnnéeAvecDates($paOptions["pdDebut"], $paOptions["pdFin"], $laAnnees);
  1495. //        $liAnnée = $this->trouveAnnéeAvecDates($paOptions["pdDebut"], $paOptions["pdFin"], $laAnnees);
  1496. //        $paOptions["piIdAnnee"] = $liAnnée ;
  1497. //        $this->setIdAnnéeCourante($liAnnée) ;     // Enregistrer le paramètre, en particulier pour utilisation dans les popups
  1498. // LG 20230831 fin       
  1499.         $paOptions["paEtablissements"] = $laEtablissements;
  1500.         $paOptions["piIdEtablissement"] = $this->getIdEtablissementCourant();
  1501.         $paOptions["poController"] = $this;
  1502.         if (isset($paOptions["psNomTable"])) {
  1503.             $paOptions["psLibelléTable"] = $this->getLibelléTable($paOptions["psNomTable"]);
  1504.             $paOptions["bAutoriseListing"] = $this->autoriseListing($paOptions["psNomTable"]);
  1505.         }
  1506.     }
  1507.     // Renvoyer l'id de la période dans laquelle est contenue au moins la 1ere des dates fournies
  1508.     // $psDate1, $psDate2, $paAnnées
  1509.     // LG 20230126
  1510.     private function trouveAnnéeAvecDates($psDate1$psDate2$paAnnées null) {
  1511.         if (!$paAnnées) {
  1512.             $paAnnées $this->getDoctrine_Secure()->getRepository("PaaBundle:annees")->findListe();       // LG 20230831
  1513.         }
  1514.         $ldDate1 DateTime::createFromFormat('Y-m-d'$psDate1);
  1515.         $ldDate2 DateTime::createFromFormat('Y-m-d'$psDate2);
  1516.         $liAnnéeCourante $this->getIdAnnéeCourante() ;
  1517.         $liAnnée $this->trouveAnnéeAvecDates2($ldDate1$ldDate2$paAnnées) ;
  1518.         if (!$liAnnée) {
  1519.             // L'année n'a pas été trouvée : prendre l'année mémorisée
  1520.             $liAnnée $liAnnéeCourante ;
  1521.         }
  1522.         if (!$liAnnée) {
  1523.             // L'année n'a pas été trouvée : prendre l'année de la date du jour
  1524.             $liAnnée $this->trouveAnnéeAvecDates2(new DateTime(), new DateTime(), $paAnnées) ;
  1525.         }
  1526.         if ($liAnnée != $liAnnéeCourante) {
  1527.             // On change d'année; il faut mémoriser cette nouvelle année
  1528.             $this->setIdAnnéeCourante($liAnnée) ;
  1529.         }
  1530.         return $liAnnée ;
  1531.     }
  1532.     // Renvoyer l'id de la période dans laquelle est contenue au moins la 1ere des dates fournies
  1533.     // $psDate1, $psDate2, $paAnnées
  1534.     // LG 20230126
  1535.     private function trouveAnnéeAvecDates2($pdDate1$pdDate2$paAnnées) {
  1536.         $ldDate1 $pdDate1 ;
  1537.         $ldDate2 $pdDate2 ;
  1538.         $liAnnée ;
  1539.         if (estSemaineRéelle($ldDate1)) {
  1540.             // On est dans le contexte d'une semaine réelle : chercher dans la liste des années celle qui correspond le mieux
  1541.             $liLastProximité 99999999999 ;
  1542.             $liAnnéeLaPlusProche null ;
  1543.             for($i count($paAnnées) - 1$i >= 0$i--) {
  1544.                 $laAnnée $paAnnées[$i] ;
  1545.                 $ldDateDébut $laAnnée->getDDebut() ;
  1546.                 $ldDateFin $laAnnée->getDFin() ;
  1547.                 if (Between($ldDate1$ldDateDébut$ldDateFin) && Between($ldDate2$ldDateDébut$ldDateFin)) {
  1548.                     // Les deux dates sont incluses dans cette période : c'est la bonne
  1549.                     $liAnnée $laAnnée->getId() ;
  1550.                     break;
  1551.                     
  1552.                 } else if(Between($ldDate1$ldDateDébut$ldDateFin) || Between($ldDate2$ldDateDébut$ldDateFin)) {
  1553.                     // L'une des deux dates sont incluses dans cette période, c'est la bone si on ne trouve pas mieux plus loin
  1554.                     if (!$liAnnée) {
  1555.                         // On n'en a pas encore trouvé
  1556.                         $liAnnée $laAnnée->getId() ;                    
  1557.                     }
  1558.                 }
  1559.                 else {
  1560.                     // On n'a pas encore trouvé d'année proche
  1561.                     // Calculer la proximité de cette année avec les dates demandées
  1562.                     $liProximité = ($ldDate1->diff($ldDateDébut)->format("%a") + $ldDate2->diff($ldDateFin)->format("%a")) / ;
  1563.                     if ($liProximité $liLastProximité) {
  1564.                         // Cette année est + proche des dates demandées que la précédente : la mémoriser
  1565.                         $liAnnéeLaPlusProche $laAnnée->getId() ;
  1566.                         $liLastProximité $liProximité ;
  1567.                     }
  1568.                 }
  1569.             }
  1570.             if (!$liAnnée && $liAnnéeLaPlusProche) {
  1571.                 // On n'a pas trouvée d'année exacte, mais on a l'année la + proche : prendre celle-là
  1572.                 $liAnnée $liAnnéeLaPlusProche ;
  1573.             }
  1574.         }
  1575.         return $liAnnée ;
  1576.     }
  1577.     // Sur réception d'une notification (d'erreur en général)
  1578.     // e.g. "OnNotifie?Message=ErreurJS : Erreur de JavaScript : Uncaught TypeError: Cannot read property 'oAut' of undefined@Chr(13)@dans le fichier http://www.paa.localhost.net/Limoog/Planning/cGrd_HTML-V2/src/cMenu_Grd.js@Chr(13)@à la ligne 237@Chr(13)@+ de détails : TypeError: Cannot read property 'oAut' of undefined@Chr(13)@    at _Class.buildItemsList_Seance (http://www.paa.localhost.net/Limoog/Planning/cGrd_HTML-V2/src/cMenu_Grd.js:237:40)@Chr(13)@    at _Class.BuildItemsList (http://www.paa.localhost.net/Limoog/Planning/cGrd_HTML-V2/src/cMenu_Grd.js:198:16)@Chr(13)@    at Object.build (http://www.paa.localhost.net/Limoog/Planning/cGrd_HTML-V2/src/cMenu_Grd.js:29:41)@Chr(13)@    at Object.contextmenuTermine [as callbackPoséParbuildAvecCallback] (http://www.paa.localhost.net/jQuery.contextMenu/jquery.contextMenu.js:287:24)@Chr(13)@    at buildCallback (http://www.paa.localhost.net/Limoog/Planning/cGrd_HTML-V2/src/cMenu_Grd.js:65:13)@Chr(13)@    at XMLHttpRequest.LG_Ajax_GetText_Navigateur.xhr_object.onreadystatechange (http://www.paa.localhost.net/Limoog/Partages/src/functions_AJAX.js:264:5)"
  1579.     // Valeur de retour : JSON validant le succès de l'enegistrement de la notification
  1580.     function onNotifieAction(Request $request) {
  1581.         $lsMsg $request->get('Message');
  1582.         $lsIdLog $request->get('idLog');
  1583.         $lsMsg str_replace("@Chr(13)@"PHP_EOL$lsMsg);
  1584.         $lsProjectDir $this->get('kernel')->getProjectDir();
  1585.         $logger = new \App\PaaBundle\Component\MyLogger('onNotifieAction'$lsProjectDirnull$lsIdLog ?: null);
  1586.         $idLog $logger->Log($lsMsg"info", array(), false);
  1587.         $lsRep '{"OK":"true","idLog":"' $idLog '"}';
  1588.         $response = new Response($lsRep);
  1589.         $response->headers->set('Content-Type''application/json');
  1590.         return $response;
  1591.     }
  1592.     public function ongletGeneralAction(Request $request$psNomTable$piId) {
  1593.         throw new Exception("Fonction marquée comme obsolète");
  1594.         $em $this->getDoctrineManager();
  1595.         $loEntité $em->getRepository("PaaBundle:" $psNomTable)->find($piId);
  1596.         $loForm $this->get('form.factory')->create('App\PaaBundle\Form' '\\' $psNomTable 'Type'$loEntité);
  1597.         if ($request->isMethod('POST') && $loForm->handleRequest($request)->isValid()) {
  1598.             // Inutile de persister ici, Doctrine connait déjà notre annonce
  1599.             $em->flush();
  1600.             // Ce return permet de ne pas actualiser le formulaire lors d'une sauvegarde
  1601.             return new \Symfony\Component\HttpFoundation\Response();
  1602.         }
  1603.         return $this->render('@Paa/form:' $psNomTable 'OngletGeneral.html.twig', array(
  1604.                     'poEntité' => $loEntité,
  1605.                     'poForm' => $loForm->createView(),
  1606.                     'psNomTable' => $psNomTable,
  1607.                     'id' => $piId
  1608.         ));
  1609.     }
  1610.     // LG 20230427
  1611.     private function calcNbSemainesAvance($dateCible) {
  1612.         $dateCibleStr $dateCible->format('Y-m-d') ;
  1613.         if ($dateCible < new DateTime('1950-01-01')) {
  1614.             // Semaine-type
  1615.             $liSemaineType getNoSemaine($dateCible) ;
  1616.             if ($liSemaineType == eiSemaineInexistante$liSemaineType = -;
  1617.             return 10000 abs($liSemaineType) ;
  1618.         }
  1619.         $countSem 0;
  1620.         $jourSem 0;
  1621.         $dateAujourdhui = new DateTime();
  1622.         $dateActuelle = new DateTime();
  1623.         $dateActuelleStr $dateActuelle->format('Y-m-d');
  1624.         while($dateActuelleStr != $dateCibleStr) {
  1625.             if($dateActuelle $dateCible) {
  1626.                 $dateActuelle->modify('+1 days');
  1627.                 $jourSem 1;
  1628.             } else if($dateActuelle $dateCible) { 
  1629.                 $dateActuelle->modify('-1 days'); 
  1630.                 $jourSem 7;
  1631.             } else {break;}
  1632.             
  1633.             $dateActuelleStr $dateActuelle->format('Y-m-d');
  1634.             if($dateActuelle->format('N') == $jourSem){
  1635.                 if($dateAujourdhui $dateCible) {
  1636.                     $countSem++;
  1637.                 }
  1638.                 else if ($dateAujourdhui $dateCible) { 
  1639.                     $countSem $countSem-1
  1640.                 }
  1641.             }
  1642.         }
  1643.         return $countSem;
  1644.     }
  1645.     // LG 20230427
  1646.     private function calcDateAvecNbSemainesAvance($piNbSemAvance$pvTime) {
  1647.         if ($piNbSemAvance 5000) {
  1648.             // Le nb de semaines d'avance est encodé pour une semaine-type
  1649.             $liSemaineType $piNbSemAvance 10000 ;
  1650.             $ldDate GetDateAvecJour(date('Y-m-d'$pvTime), $liSemaineType) ;
  1651.         } else if ($piNbSemAvance < -5000) {
  1652.             // Le nb de semaines d'avance est mal encodé pour une semaine-type (on a quitté PAA sur une semaine-type, on s'y reconnecte la semaine suivante)
  1653.             $liSemaineType = -;
  1654.             $ldDate GetDateAvecJour(date('Y-m-d'$pvTime), $liSemaineType) ;
  1655.         } else {
  1656.             // Semaine réelle
  1657.             $ldDate date("Y-m-d"strtotime("+" $piNbSemAvance "week"$pvTime)) ;
  1658.         }
  1659.         return $ldDate ;
  1660.     }
  1661. // LG 20231025 old    public function refreshDatesSession(Request $request) {
  1662.     public function refreshSession(Request $request) {
  1663.         require_once('../src/Limoog/PartageBundle/Component/fonctions.php');
  1664.         $loCnxn $this->getDoctrineConnection();
  1665.         $loUser $this->getUser();
  1666.         if ($loUser) {
  1667.             $laRolesUser $loUser->getRoles();
  1668.         } else {
  1669.             $laRolesUser = [];
  1670.         }
  1671.         $session $request->getSession();
  1672.         $params $request->query;
  1673.         // Gestion de la date de début
  1674.         if ($params->get('dateDebut')) {
  1675.             // On a fourni la date de début : la mémoriser, ainsi que le nb de semaines d'avance
  1676.             $session->set('dateDebut'$params->get('dateDebut'));          
  1677.             $dateCible = new DateTime($params->get('dateDebut'));
  1678.             $giNbSemAvance = (int) $this->setParamètre('giNbSemAvance'$this->calcNbSemainesAvance($dateCible), 'N');
  1679.         } else if (!$params->get('dateDebut') && !$session->get('dateDebut')) {
  1680.             // On n'a pas fourni la date de début, et on ne la connait pas encore
  1681.             // La retrouver en utilisant le nb de semaines d'avance mémorisé
  1682.             $giNbSemAvance = (int) $this->getParamètre('giNbSemAvance''0''N'); 
  1683.             $today getdate();
  1684.             if ($today['wday'] == 1) {
  1685.                 $session->set('dateDebut'$this->calcDateAvecNbSemainesAvance($giNbSemAvancestrtotime("today")));
  1686.             } else {
  1687.                 $session->set('dateDebut'$this->calcDateAvecNbSemainesAvance($giNbSemAvancestrtotime("last monday"))) ;
  1688.             }
  1689.             
  1690.         } else {
  1691.             // On n'a pas fourni la date de début, mais on l'avait déjà mémorisée : utiliser celle-là
  1692.             $session->set('dateDebut'$session->get('dateDebut'));
  1693.         }
  1694.         // Gestion de la date de fin
  1695.         if ($params->get('dateFin')) {
  1696.             // On a fourni la date de fin : la mémoriser
  1697.             $session->set('dateFin'$params->get('dateFin'));
  1698.         } else if (!$params->get('dateFin') && !$session->get('dateFin')) {
  1699.             // On n'a pas fourni la date de fin, et on ne la connait pas encore
  1700.             // La retrouver en utilisant le nb de semaines d'avance mémorisé
  1701.             if (!isset($giNbSemAvance)) {
  1702.                 $giNbSemAvance = (int) $this->getParamètre('giNbSemAvance''0''N');
  1703.             }
  1704.             $session->set('dateFin'$this->calcDateAvecNbSemainesAvance($giNbSemAvancestrtotime("next sunday")));
  1705.             
  1706.         } else if (!$params->get('dateFin') && !$session->get('dateFin') && $laRolesUser[0] === 'ROLE_CONCEPTEUR') {
  1707.             // On n'a pas fourni la date de fin, et on ne la connait pas encore
  1708.             // POURQUOI $laRolesUser[0] === 'ROLE_CONCEPTEUR' ????
  1709. // LG 20231025 début
  1710. if ($this->estDevMode()) {
  1711.     // Mode dev, lancer une exception pour voir quand on passe dans ce cas, en principe inatteignable
  1712.     throw new \Exception("refreshSession : CE CODE EST EN PRINCIPE INATTEIGNABLE") ;
  1713. }
  1714. // LG 20231025 fin            
  1715.             $session->set('dateFin'$this->calcDateAvecNbSemainesAvance($giNbSemAvancestrtotime("sunday")));
  1716.             
  1717.         } else {
  1718.             // On n'a pas fourni la date de fin, mais on l'avait déjà mémorisée : utiliser celle-là
  1719.             $session->set('dateFin'$session->get('dateFin'));
  1720.         }
  1721.         if ($params->get('iEtablissement')) {
  1722.             // On a reçu l'Id d'établissement en paramètres : le mémoriser
  1723.             $session->set('iEtablissement'$params->get('iEtablissement'));
  1724.             $this->setParamètre("giEtablissement"$params->get('iEtablissement'), "NU");
  1725.         } else if (!$params->get('iEtablissement') && !$session->get('iEtablissement')) {
  1726.             // On a pas reçu l'information en paramètre et elle n'est pas encore en session : prendre l'info dans les paramètres
  1727.             $session->set('iEtablissement', (int)$this->getParamètre("giEtablissement""-1""NU"));
  1728.         }
  1729.         if ($params->get('iAnnee')) {
  1730.             // On a reçu l'Id d'année en paramètres : le mémoriser
  1731.             $session->set('iAnnee'$params->get('iAnnee'));
  1732.             $this->setParamètre("giAnnée"$params->get('iAnnee'), "NU");
  1733.         } else if (!$params->get('iAnnee') && !$session->get('iAnnee')) {
  1734.             // On a pas reçu l'information en paramètre et elle n'est pas encore en session : prendre l'info dans les paramètres
  1735.             $session->set('iAnnee', (int)$this->getParamètre("giAnnee""1""NU"));
  1736.         }
  1737.         $paramsFiltre $request->request;
  1738.         if(isset($_POST["dansFiltreIntervenant"]) && $_POST["dansFiltreIntervenant"] == "1") {
  1739.             // Exploitation des données de filtre de la page de liste de intervenants
  1740.             if($paramsFiltre->get('lAffiche_Présents')) {
  1741.                 if($paramsFiltre->get('lAffiche_Présents') == "on"){
  1742.                     $session->set('intervenantAffichePresent''true');
  1743.                 } else {
  1744.                     $session->set('intervenantAffichePresent''false');
  1745.                 }
  1746.             } else {
  1747.                 $session->set('intervenantAffichePresent''false');
  1748.             }
  1749.             if($paramsFiltre->get('lAffiche_Sortis')) {
  1750.                 if($paramsFiltre->get('lAffiche_Sortis') == "on"){
  1751.                     $session->set('intervenantAfficheSortis''true');
  1752.                 } else {
  1753.                     $session->set('intervenantAfficheSortis''false');
  1754.                 }
  1755.             } else {
  1756.                 $session->set('intervenantAfficheSortis''false');
  1757.             }
  1758.             if($paramsFiltre->get('lAffiche_PasEntrés')) {
  1759.                 if($paramsFiltre->get('lAffiche_PasEntrés') == "on"){
  1760.                     $session->set('intervenantAffichePasEntrés''true');
  1761.                 } else {
  1762.                     $session->set('intervenantAffichePasEntrés''false');
  1763.                 }
  1764.             } else {
  1765.                 $session->set('intervenantAffichePasEntrés''false');
  1766.             }
  1767.             if($paramsFiltre->get('iGroupe')) {
  1768.                 if(count($paramsFiltre->get('iGroupe')) == 0) {
  1769.                     // Aucun groupe sélectionné -> tous les groupes
  1770.                     $session->set('intervenantiGroupe'null);
  1771.                 } else {
  1772.                     $lsLstGroupes "" ;
  1773.                     foreach ($paramsFiltre->get('iGroupe') As $lsGroupe) {
  1774.                         if ($lsLstGroupes$lsLstGroupes .= "," ;
  1775.                         $lsLstGroupes .= substr($lsGroupe1) ;
  1776.                     }
  1777.                     $session->set('intervenantiGroupe'$lsLstGroupes);
  1778.                 }
  1779.             } else {
  1780.                     $session->set('intervenantiGroupe'null);
  1781.             }
  1782.             if($paramsFiltre->get('iService')) {
  1783.                 if($paramsFiltre->get('iService') == "Tous") {
  1784.                     $session->set('intervenantiService'null);
  1785.                 } else {
  1786.                     $session->set('intervenantiService'$paramsFiltre->get('iService'));
  1787.                 }
  1788.             } else {
  1789.                 $session->set('intervenantiService'null);
  1790.             }
  1791.             if($paramsFiltre->get('iSpécialité')) {
  1792.                 if($paramsFiltre->get('iSpécialité') == "Tous") {
  1793.                     $session->set('intervenantiSpecialité'null);
  1794.                 } else {
  1795.                     $session->set('intervenantiSpecialité'$paramsFiltre->get('iSpécialité'));
  1796.                 }
  1797.             } else {
  1798.                 $session->set('intervenantiSpecialité'null);
  1799.             }
  1800.             if($paramsFiltre->get('lAffiche_Remplacants')) {
  1801.                 if($paramsFiltre->get('lAffiche_Remplacants') == "on"){
  1802.                     $session->set('intervenantRemplaçants''true');
  1803.                 } else {
  1804.                     $session->set('intervenantRemplaçants''false');
  1805.                 }
  1806.             } else {
  1807.                 $session->set('intervenantRemplaçants''false');
  1808.             }
  1809.             if($paramsFiltre->get('lAffiche_Extérieurs')) {
  1810.                 if($paramsFiltre->get('lAffiche_Extérieurs') == "on"){
  1811.                     $session->set('intervenantIntervExt''true');
  1812.                 } else {
  1813.                     $session->set('intervenantIntervExt''false');
  1814.                 }
  1815.             } else {
  1816.                 $session->set('intervenantIntervExt''false');
  1817.             }
  1818.             if($paramsFiltre->get('cIntervenant_Libre1')) {
  1819.                 if($paramsFiltre->get('cIntervenant_Libre1') == "Tous") {
  1820.                     $session->set('intervenantcIntervenant_Libre1'null);
  1821.                 } else {
  1822.                         $session->set('intervenantcIntervenant_Libre1'$paramsFiltre->get('cIntervenant_Libre1'));
  1823.                 }
  1824.             } else {
  1825.                 $session->set('intervenantcIntervenant_Libre1'null);
  1826.             }
  1827.             if($paramsFiltre->get('cIntervenant_Libre2')) {
  1828.                 if($paramsFiltre->get('cIntervenant_Libre2') == "Tous") {
  1829.                     $session->set('intervenantcIntervenant_Libre2'null);
  1830.                 } else {
  1831.                         $session->set('intervenantcIntervenant_Libre2'$paramsFiltre->get('cIntervenant_Libre2'));
  1832.                 }
  1833.             } else {
  1834.                 $session->set('intervenantcIntervenant_Libre2'null);
  1835.             }
  1836.             if($paramsFiltre->get('iEtablissement')) {
  1837.                 $session->set('iEtablissement'$paramsFiltre->get('iEtablissement'));
  1838.             }
  1839.             if($paramsFiltre->get('dateDebutAnnee')) {
  1840.                 $session->set('dateDebut'$paramsFiltre->get('dateDebutAnnee'));
  1841.             }
  1842.             if($paramsFiltre->get('dateFinAnnee')) {
  1843.                 $session->set('dateFin'$paramsFiltre->get('dateFinAnnee'));
  1844.             }
  1845.         } else if(isset($_POST["dansFiltreUsager"]) && $_POST["dansFiltreUsager"] == "1") {
  1846.             // Exploitation des données de filtre de la page de liste des usagers
  1847.             if($paramsFiltre->get('lAffiche_Présents')) {
  1848.                 if($paramsFiltre->get('lAffiche_Présents') == "on"){
  1849.                     $session->set('usagersAffichePresents''true');
  1850.                 } else {
  1851.                     $session->set('usagersAffichePresents''false');
  1852.                 }
  1853.             } else {
  1854.                 $session->set('usagersAffichePresents''false');
  1855.             }
  1856.             if($paramsFiltre->get('lAffiche_Sortis')) {
  1857.                 if($paramsFiltre->get('lAffiche_Sortis') == "on"){
  1858.                     $session->set('usagersAfficheSortis''true');
  1859.                 } else {
  1860.                     $session->set('usagersAfficheSortis''false');
  1861.                 }
  1862.             } else {
  1863.                 $session->set('usagersAfficheSortis''false');
  1864.             }
  1865.             if($paramsFiltre->get('lAffiche_PasEntrés')) {
  1866.                 if($paramsFiltre->get('lAffiche_PasEntrés') == "on"){
  1867.                     $session->set('usagersAffichePasEntrés''true');
  1868.                 } else {
  1869.                     $session->set('usagersAffichePasEntrés''false');
  1870.                 }
  1871.             } else {
  1872.                 $session->set('usagersAffichePasEntrés''false');
  1873.             }
  1874.             if($paramsFiltre->get('lGroupePourPériodeDemandée')) {
  1875.                 if($paramsFiltre->get('lGroupePourPériodeDemandée') == "on"){
  1876.                     $session->set('usagersPeriodeDemandée''true');
  1877.                 } else {
  1878.                     $session->set('usagersPeriodeDemandée''false');
  1879.                 }
  1880.             } else {
  1881.                 $session->set('usagersPeriodeDemandée''false');
  1882.             }
  1883.             if($paramsFiltre->get('iGroupe')) {
  1884.                 $session->set('usagersiGroupe'$paramsFiltre->get('iGroupe'));
  1885.             } else {
  1886.                 $session->set('usagersiGroupe'null);
  1887.             }
  1888.             if($paramsFiltre->get('iEtablissement')) {
  1889.                 $session->set('iEtablissement'$paramsFiltre->get('iEtablissement'));
  1890.             }
  1891.             if($paramsFiltre->get('dateDebutAnnee')) {
  1892.                 $session->set('dateDebut'$paramsFiltre->get('dateDebutAnnee'));
  1893.             }
  1894.             if($paramsFiltre->get('dateFinAnnee')) {
  1895.                 $session->set('dateFin'$paramsFiltre->get('dateFinAnnee'));
  1896.             }
  1897. // LG 20240219 début
  1898.         } else if(isset($_POST["dansFiltreGroupe"]) && $_POST["dansFiltreGroupe"] == "1") {
  1899.             // Exploitation des données de filtre de la page de liste des usagers
  1900.             if($paramsFiltre->get('lAffiche_Présents')) {
  1901.                 if($paramsFiltre->get('lAffiche_Présents') == "on"){
  1902.                     $session->set('groupesAffichePresents''true');
  1903.                 } else {
  1904.                     $session->set('groupesAffichePresents''false');
  1905.                 }
  1906.             } else {
  1907.                 $session->set('groupesAffichePresents''false');
  1908.             }
  1909.             if($paramsFiltre->get('lAffiche_Sortis')) {
  1910.                 if($paramsFiltre->get('lAffiche_Sortis') == "on"){
  1911.                     $session->set('groupesAfficheSortis''true');
  1912.                 } else {
  1913.                     $session->set('groupesAfficheSortis''false');
  1914.                 }
  1915.             } else {
  1916.                 $session->set('groupesAfficheSortis''false');
  1917.             }
  1918.             if($paramsFiltre->get('lAffiche_PasEntrés')) {
  1919.                 if($paramsFiltre->get('lAffiche_PasEntrés') == "on"){
  1920.                     $session->set('groupesAffichePasEntrés''true');
  1921.                 } else {
  1922.                     $session->set('groupesAffichePasEntrés''false');
  1923.                 }
  1924.             } else {
  1925.                 $session->set('groupesAffichePasEntrés''false');
  1926.             }
  1927.             if($paramsFiltre->get('iIntervenant')) {
  1928.                 $session->set('groupesiIntervenant'$paramsFiltre->get('iIntervenant'));
  1929.             } else {
  1930.                 $session->set('groupesiIntervenant'null);
  1931.             }
  1932.             if($paramsFiltre->get('iEtablissement')) {
  1933.                 $session->set('iEtablissement'$paramsFiltre->get('iEtablissement'));
  1934.             }
  1935.             if($paramsFiltre->get('dateDebutAnnee')) {
  1936.                 $session->set('dateDebut'$paramsFiltre->get('dateDebutAnnee'));
  1937.             }
  1938.             if($paramsFiltre->get('dateFinAnnee')) {
  1939.                 $session->set('dateFin'$paramsFiltre->get('dateFinAnnee'));
  1940.             }
  1941. // LG 20240219 fin
  1942.         } else if(isset($_POST["dansFiltreActivité"]) && $_POST["dansFiltreActivité"] == "1") {
  1943.             // Exploitation des données de filtre de la page de liste des activités
  1944.             if($paramsFiltre->get('llMasqueActivitésSystème')) {
  1945.                 if($paramsFiltre->get('llMasqueActivitésSystème') == "on"){
  1946.                     $session->set('activitésActiSysteme''true');
  1947.                 } else {
  1948.                     $session->set('activitésActiSysteme''false');
  1949.                 }
  1950.             } else {
  1951.                 $session->set('activitésActiSysteme''false');
  1952.             }
  1953.             if($paramsFiltre->get('pbExclActivitésGénériques')) {
  1954.                 if($paramsFiltre->get('pbExclActivitésGénériques') == "on"){
  1955.                     $session->set('activitésActiGenerique''true');
  1956.                 } else {
  1957.                     $session->set('activitésActiGenerique''false');
  1958.                 }
  1959.             } else {
  1960.                 $session->set('activitésActiGenerique''false');
  1961.             }
  1962. // LG 20240219 début
  1963. //            if($paramsFiltre->get('iActi')) {
  1964. //                $session->set('activitésActiBase', '\''.$paramsFiltre->get('iActi').'\'');
  1965. //
  1966.             if($paramsFiltre->get('iActiBase')) {
  1967.                 $session->set('activitésActiBase''\''.$paramsFiltre->get('iActiBase').'\'');
  1968. // LG 20240219 fin
  1969.             } else {
  1970.                 $session->set('activitésActiBase''\'SansFiltre\'');
  1971.             }
  1972.             if($paramsFiltre->get('iIntervenant')) {
  1973.                 $session->set('activitésInterv''\''.$paramsFiltre->get('iIntervenant').'\'');
  1974.             } else {
  1975.                 $session->set('activitésInterv''\'SansFiltre\'');
  1976.             }
  1977.             if($paramsFiltre->get('iUsager')) {
  1978.                 $session->set('activitésUsager''\''.$paramsFiltre->get('iUsager').'\'');
  1979.             } else {
  1980.                 $session->set('activitésUsager''\'SansFiltre\'');
  1981.             }
  1982.             if($paramsFiltre->get('iSalle')) {
  1983.                 $session->set('activitésSalle''\''.$paramsFiltre->get('iSalle').'\'');
  1984.             } else {
  1985.                 $session->set('activitésSalle''\'SansFiltre\'');
  1986.             }
  1987.             if($paramsFiltre->get('iGroupe')) {
  1988.                 $session->set('activitésGroupe''\''.$paramsFiltre->get('iGroupe').'\'');
  1989.             } else {
  1990.                 $session->set('activitésGroupe''\'SansFiltre\'');
  1991.             }
  1992.             if($paramsFiltre->get('iEtablissement')) {
  1993.                 $session->set('iEtablissement'$paramsFiltre->get('iEtablissement'));
  1994.             }
  1995.         }
  1996.         // Remettre à zéro les variables d'environnement de filtre si c'est demandé
  1997.         if(isset($_POST["resetFiltreIntervenant"]) && $_POST["resetFiltreIntervenant"] == "1") {
  1998.             $session->remove('intervenantAffichePresent');
  1999.             $session->remove('intervenantAfficheSortis');
  2000.             $session->remove('intervenantAffichePasEntrés');
  2001.             $session->remove('intervenantiGroupe');
  2002.             $session->remove('intervenantiService');
  2003.             $session->remove('intervenantiSpecialité');
  2004.             $session->remove('intervenantRemplaçants');
  2005.             $session->remove('intervenantcIntervenant_Libre1');
  2006.             $session->remove('intervenantcIntervenant_Libre2');
  2007.         } else if (isset($_POST["resetFiltreUsager"]) && $_POST["resetFiltreUsager"] == "1") {
  2008.             $session->remove('usagersAffichePresents');
  2009.             $session->remove('usagersAfficheSortis');
  2010.             $session->remove('usagersAffichePasEntrés');
  2011.             $session->remove('usagersPeriodeDemandée');
  2012.             $session->remove('usagersiGroupe');
  2013. // LG 20240219 début
  2014.         } else if (isset($_POST["resetFiltreGroupe"]) && $_POST["resetFiltreGroupe"] == "1") {
  2015.             $session->remove('groupesAffichePresents');
  2016.             $session->remove('groupesAfficheSortis');
  2017.             $session->remove('groupesAffichePasEntrés');
  2018.             $session->remove('groupesiIntervenant');
  2019. // LG 20240219 fin
  2020.         } else if (isset($_POST["resetFiltreActivité"]) && $_POST["resetFiltreActivité"] == "1") {
  2021.             $session->remove('activitésActiSysteme');
  2022.             $session->remove('activitésActiGenerique');
  2023.             $session->remove('activitésActiBase');
  2024.             $session->remove('activitésInterv');
  2025.             $session->remove('activitésUsager');
  2026.             $session->remove('activitésSalle');
  2027.             $session->remove('activitésGroupe');
  2028.         }
  2029.         // ---------------------------------------------------------------------------------------------
  2030.         // Remettre les valeurs par défaut des variables d'environnement de filtres si elles sont indéfinies
  2031.         // ---------------------------------------------------------------------------------------------
  2032.         // Variables des filtres d'intervenants
  2033.         if($session->get('intervenantAffichePresent')) {
  2034.             // OK 
  2035.         } else {
  2036.             $session->set('intervenantAffichePresent''true');
  2037.         }
  2038.         if($session->get('intervenantAfficheSortis')) {
  2039.             // OK 
  2040.         } else {
  2041.            $session->set('intervenantAfficheSortis''false');
  2042.         }
  2043.         if($session->get('intervenantAffichePasEntrés')) {
  2044.             // OK 
  2045.         } else {
  2046.            $session->set('intervenantAffichePasEntrés''false');
  2047.         }
  2048.         if($session->get('intervenantiGroupe')) {
  2049.             // OK 
  2050.         } else {
  2051.            $session->set('intervenantiGroupe'null);
  2052.         }
  2053.         if($session->get('intervenantiService')) {
  2054.             // OK 
  2055.         } else {
  2056.            $session->set('intervenantiService', -1);
  2057.         }
  2058.         if($session->get('intervenantiSpecialité')) {
  2059.             // OK 
  2060.         } else {
  2061.            $session->set('intervenantiSpecialité', -1);
  2062.         }
  2063.         if($session->get('intervenantRemplaçants')) {
  2064.             // OK 
  2065.         } else {
  2066.            $session->set('intervenantRemplaçants''false');
  2067.         }
  2068.         if($session->get('intervenantcIntervenant_Libre1')) {
  2069.             // OK 
  2070.         } else {
  2071.            $session->set('intervenantcIntervenant_Libre1'null);
  2072.         }
  2073.         if($session->get('intervenantcIntervenant_Libre2')) {
  2074.             // OK 
  2075.         } else {
  2076.            $session->set('intervenantcIntervenant_Libre2'null);
  2077.         }
  2078.         if($session->get('intervenantiService')) {
  2079.             // OK 
  2080.         } else {
  2081.            $session->set('intervenantiService', -1);
  2082.         }
  2083.         // ---------------------------------------------------------------------------------------------
  2084.         // Variables des filtres d'usagers
  2085.         if($session->get('usagersAffichePresents')) {
  2086.             // OK 
  2087.         } else {
  2088.            $session->set('usagersAffichePresents''true');
  2089.         }
  2090.         if($session->get('usagersAfficheSortis')) {
  2091.             // OK 
  2092.         } else {
  2093.            $session->set('usagersAfficheSortis''false');
  2094.         }
  2095.         if($session->get('usagersAffichePasEntrés')) {
  2096.             // OK 
  2097.         } else {
  2098.            $session->set('usagersAffichePasEntrés''false');
  2099.         }
  2100.         if($session->get('usagersPeriodeDemandée')) {
  2101.             // OK 
  2102.         } else {
  2103.            $session->set('usagersPeriodeDemandée''false');
  2104.         }
  2105.         if($session->get('usagersiGroupe')) {
  2106.             // OK 
  2107.         } else {
  2108.            $session->set('usagersiGroupe'null);
  2109.         }
  2110. // LG 20240219 début
  2111.         // ---------------------------------------------------------------------------------------------
  2112.         // Variables des filtres de groupes
  2113.         if($session->get('groupesAffichePresents')) {
  2114.             // OK 
  2115.         } else {
  2116.            $session->set('groupesAffichePresents''true');
  2117.         }
  2118.         if($session->get('groupesAfficheSortis')) {
  2119.             // OK 
  2120.         } else {
  2121.            $session->set('groupesAfficheSortis''false');
  2122.         }
  2123.         if($session->get('groupesAffichePasEntrés')) {
  2124.             // OK 
  2125.         } else {
  2126.            $session->set('groupesAffichePasEntrés''false');
  2127.         }
  2128.         if($session->get('groupesiIntervenant')) {
  2129.             // OK 
  2130.         } else {
  2131.            $session->set('groupesiIntervenant'null);
  2132.         }
  2133. // LG 20240219 fin
  2134.         // ---------------------------------------------------------------------------------------------
  2135.         // Variables des filtres d'usagers
  2136.         if($session->get('activitésActiSysteme')) {
  2137.             // OK 
  2138.         } else {
  2139.            $session->set('activitésActiSysteme''true');
  2140.         }
  2141.         if($session->get('activitésActiGenerique')) {
  2142.             // OK 
  2143.         } else {
  2144.            $session->set('activitésActiGenerique''true');
  2145.         }
  2146.         if($session->get('activitésActiBase')) {
  2147.             // OK 
  2148.         } else {
  2149.            $session->set('activitésActiBase''\'SansFiltre\'');
  2150.         }
  2151.         if($session->get('activitésInterv')) {
  2152.             // OK 
  2153.         } else {
  2154.            $session->set('activitésInterv''\'SansFiltre\'');
  2155.         }
  2156.         if($session->get('activitésUsager')) {
  2157.             // OK 
  2158.         } else {
  2159.            $session->set('activitésUsager''\'SansFiltre\'');
  2160.         }
  2161.         if($session->get('activitésSalle')) {
  2162.             // OK 
  2163.         } else {
  2164.            $session->set('activitésSalle''\'SansFiltre\'');
  2165.         }
  2166.         if($session->get('activitésGroupe')) {
  2167.             // OK 
  2168.         } else {
  2169.            $session->set('activitésGroupe''\'SansFiltre\'');
  2170.         }
  2171. // JM 20220304 fin
  2172.         
  2173.         return $session;
  2174.     }
  2175.     public function setVariableDeSession($psNomParametre$pvValeur$psTypeRequest $request) {
  2176.         $session $request->getSession();
  2177.         if ($psNomParametre === 'dateDebut') {
  2178.             $session->set('dateDebut'$pvValeur);
  2179. // LG 20240409 début
  2180.             // Recalculer et enregistrer le nb de semaines d'avance
  2181.             $dateCible = new DateTime($pvValeur);
  2182.             $giNbSemAvance = (int) $this->setParamètre('giNbSemAvance'$this->calcNbSemainesAvance($dateCible), 'N');
  2183. // LG 20240409 fin            
  2184.         }
  2185.         if ($psNomParametre === 'dateFin') {
  2186.             $session->set('dateFin'$pvValeur);
  2187.         }
  2188.         if ($psNomParametre === 'giEtablissement') {
  2189.             $session->set('giEtablissement'$pvValeur);
  2190.             $this->setParamètre("giEtablissement"$pvValeur"NU");
  2191.         }
  2192.          if ($psNomParametre === 'giAnnée') {
  2193.             $session->set('giAnnée'$pvValeur);
  2194.             $this->setParamètre("giAnnée"$pvValeur"NU");
  2195.          }
  2196.         
  2197.         $response = new Response('{"status": "OK"}'Response::HTTP_OK, array('content-type' => 'text/json'));
  2198.         return $response;
  2199.     }
  2200.     public function entityForActiviteAction($psNomTable$piId$psOngletRequest $request) {
  2201.         $em $this->getDoctrineManager();
  2202.         if ($psNomTable === "seancesTrad") {
  2203.             return $this->entityFormAction($request'seances'$piId$psOnglet);
  2204.             
  2205.         } else if ($psNomTable === "activitesTrad") {
  2206.             $seances $em->getRepository("PaaBundle:seances")->find($piId);
  2207.             $idActivite $seances->getActivité();
  2208.             return $this->entityFormAction($request'activites'$idActivite"");
  2209.             
  2210.         } else {
  2211.             throw new \Exception("Cas non prévu : table " $psNomTable);
  2212.         }
  2213.     }
  2214.     /*
  2215.      * recuperation du html pour afficher la page d'option de cration de semaine 
  2216.      * MC 20201023
  2217.      * retounre le fichier twig
  2218.      */
  2219.     function pageCreeSemaineAction(request $request$pdDebut$pdFin) {
  2220.         //si pas  concepteur retunr echec A faire
  2221.         if (!$this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  2222.             // L'utilisateur en cours ne dispose pas des droits sur cette page
  2223.             $loUser $this->getUser();
  2224.             if ($loUser) {
  2225.                 $lcUser " " $loUser->getusername();
  2226.             } else {
  2227.                 $lcUser "";
  2228.             }
  2229.             $lsHTML "Désolé" $lcUser ", vous n'avez pas accès à cette information.";
  2230.             return new \Symfony\Component\HttpFoundation\Response($lsHTML);
  2231.         }
  2232. // LG 20230822 début
  2233. //        $laOptions = array(
  2234. //            'pdDebut' => $pdDebut,
  2235. //            'pdFin' => $pdFin,
  2236. //            'psLstTypesRes' => "@Tous@"
  2237. //        );
  2238. //
  2239. //        $this->fillOptionsPourRenderEnTeteMenu($laOptions, $request);
  2240. //
  2241.         $laOptions = array(
  2242.             'psLstTypesRes' => "@Tous@"
  2243.         );
  2244.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2245.         $laOptions['pdDebut'] = $pdDebut ;
  2246.         $laOptions['pdFin'] = $pdFin ;
  2247. // LG 20230822 fin
  2248.         return $this->render('@Paa/Dialog/creeSemaine/creeSemaine.html.twig'$laOptions);
  2249.     }
  2250.     //Utilisé pour traiter les données recu du formulaire du popup cree semaine
  2251.     function creeSemaineAction(Request $request) {
  2252.         if (!$this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  2253.             // L'utilisateur en cours ne dispose pas des droits sur cette page
  2254.             $loUser $this->getUser();
  2255.             if ($loUser) {
  2256.                 $lcUser " " $loUser->getusername();
  2257.             } else {
  2258.                 $lcUser "";
  2259.             }
  2260.             $lsHTML "Désolé" $lcUser ", vous n'avez pas accès à cette information.";
  2261.             return new \Symfony\Component\HttpFoundation\Response($lsHTML);
  2262.         }
  2263.         $ltFormData $request->request->all();
  2264.         $loFormData = new \stdClass;
  2265.         $loFormData->isLstRes "";
  2266.         //pour chaque ligne du tableau on convertie la valeur "on" en true pour la preparer avant envoie dans le repositorie
  2267.         foreach ($ltFormData as $key => $value) {
  2268.             if ($value == "on") {
  2269.                 $value 'true';
  2270.                 $loFormData->$key $value;
  2271.             } elseif ($key == "listeRessources") {
  2272.                 //sert a cree la chaine de caractere si il y a une liste de ressources
  2273.                 if (is_null($value)) {
  2274.                     $loFormData->isLstRes null;
  2275.                 } else {
  2276.                     foreach ($value as $key => $ressource) {
  2277.                         $loFormData->isLstRes .= $ressource ",";
  2278.                     }
  2279.                 }
  2280.             } elseif ($key == "listeChoixRessources") {
  2281.                 if ($value == "allRessources") {
  2282.                     $loFormData->isLstRes null;
  2283.                 }
  2284.             } else {
  2285.                 $loFormData->$key $value;
  2286.             }
  2287.         }
  2288. //            var_dump($loFormData);
  2289.         $creeSemaine $this->getDoctrineRepository("PaaBundle:etablissementsSemaines")->creeSemaine($loFormData);
  2290.         if ($creeSemaine) {
  2291.             // La fonction a renvoyé un message d'erreur
  2292.             $ress "ko";
  2293.         } else {
  2294.             $ress "ok";
  2295.         }
  2296.         $response = new Response(
  2297.                 '{"status": "' $ress '", "message": "' $creeSemaine '" }'Response::HTTP_OK, array('content-type' => 'text/json')
  2298.         );
  2299.         return $response;
  2300.     }
  2301. //MC 20210419 debut
  2302.     function pageCollageSpecialAction(request $request$libelle$dateDest$timeDebut$timeFin,$estSeanceVide$estSeanceVirtuel) {
  2303.         if (!$this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  2304.             // L'utilisateur en cours ne dispose pas des droits sur cette page
  2305.             $loUser $this->getUser();
  2306.             if ($loUser) {
  2307.                 $lcUser " " $loUser->getusername();
  2308.             } else {
  2309.                 $lcUser "";
  2310.             }
  2311.             $lsHTML "Désolé" $lcUser ", vous n'avez pas accès à cette information.";
  2312.             return new \Symfony\Component\HttpFoundation\Response($lsHTML);
  2313.         }
  2314.         $laOptions = array(
  2315.             'libelle' => $libelle,
  2316.             'dateDest' => $dateDest,
  2317.             'timeDebut' => uNumVersHeure($timeDebut/60,false,true,true),
  2318.             'timeFin' => uNumVersHeure($timeFin/60,false,true,true),
  2319.             'estSeanceVide' => $estSeanceVide,
  2320.             'estSeanceVirtuel' => $estSeanceVirtuel,
  2321.         );
  2322.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2323.         return $this->render('@Paa/Dialog/colagespecial/colagespecial.html.twig'$laOptions);
  2324.     }
  2325. //MC 20210419 Fin
  2326. //MC 20210518 debut
  2327. function pageEnvoiMailAction(request $request$liidSeance) {
  2328.     if (!$this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  2329.         // L'utilisateur en cours ne dispose pas des droits sur cette page
  2330.         $loUser $this->getUser();
  2331.         if ($loUser) {
  2332.             $lcUser " " $loUser->getusername();
  2333.         } else {
  2334.             $lcUser "";
  2335.         }
  2336.         $lsHTML "Désolé" $lcUser ", vous n'avez pas accès à cette information.";
  2337.         return new \Symfony\Component\HttpFoundation\Response($lsHTML);
  2338.     }
  2339.     
  2340.     $em $this->getDoctrineManager();
  2341.     $repository $em->getRepository("PaaBundle:seances");
  2342.     $loSeance $repository->find($liidSeance);
  2343.     $lsSujet "";
  2344.     $lsCorp $repository->envoieEnvoieSeanceParMail_RtvCorps($loSeance->getid(),$lsSujet);
  2345.     $laOptions = array(
  2346.         'texte' => $lsCorp,
  2347.         'sujet' => $lsSujet
  2348.     );
  2349.     
  2350.     $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2351.     
  2352.     return $this->render('@Paa/Dialog/envoimail/envoimail.html.twig'$laOptions);
  2353. }
  2354. //MC 20210518 fin
  2355.     
  2356.     // LG 20210610 : cette méthode doit être dans un controleur héritant d'un controleur standard Symphony (par exemple, pas dans ErrorController)
  2357.     function rapportErreurClientAction(Request $request) {
  2358.         $LogId $request->request->get('iderreur');
  2359.         $Message $request->request->get('Message');
  2360. // Si le message n'est pas vide, il sera envoyé dans les logs
  2361.         if ($Message != "") {
  2362.             $Rapport "Message Utilisateur en commentaire du bug [logId: " $LogId "] : \"" $Message '"' ;
  2363.             $lsProjectDir $this->get('kernel')->getProjectDir();
  2364.             $logger = new \App\PaaBundle\Component\MyLogger('PAABaseController'$lsProjectDir);
  2365.             $logger->Log($Rapport"info", array(), false);
  2366.         }
  2367.         if (isset($_POST['retourpage'])) {
  2368. // LG 20210210 old            return $this->redirectToRoute($_SERVER['HTTP_REFERER']);
  2369.             return $this->redirect($_SERVER['HTTP_REFERER']);
  2370.         } else if (isset($_POST['accueil'])) {
  2371.             return $this->redirectToRoute('paa_index');
  2372.         } else {
  2373.             return new Response('{"status": "OK"}'Response::HTTP_OK, array('content-type' => 'text/json')) ;
  2374.         }
  2375.     }
  2376.     // $request         : l'objet request Symfony
  2377.     // $psNomTable      : nom de la table/entité pour laquelle on souhaite récupérer une entité
  2378.     // $piId            : Id de l'entité demandée
  2379.     // $psOnglet        : l'onglet enttiyForm demandé, inutilisé ici
  2380.     // $psContexte      : informations de context, inutilisé ici (utilisé dans entityFormAction pour distinguer le contexte "usagers du groupes" du contexte "Groupes de l'usager")
  2381. // LG 20230120 old    public function entityFormAction_ActiBaseSousGroupeGroupe(request $request, $psId) {
  2382.     public function entityFormAction_ActiBaseSousGroupeGroupe(request $request$psId$psOnglet$psContexte) {
  2383.         if ($this->RedirectIfNotGranted($request$this->isGranted(PaaVoter::VOIR 'actibases'), $response))
  2384.             return $response;
  2385.         
  2386.         $laOptions = Array();
  2387.         $lbADroitDEcriture $this->getDroitsEcritureLectureOrDie('actibases'$psId);
  2388.         $laOptions["pbDroitEcriture"] = $lbADroitDEcriture;
  2389.         $psSousType "";
  2390.         if (substr($psId03) == 'GAB') {
  2391.             $Type 'GAB';
  2392.             $Id substr($psId3strlen($psId) - 3);
  2393.             $lsNomTable "actiGroupesacti";
  2394.         } elseif (substr($psId04) == 'SGAB') {
  2395.             $Type 'SGAB';
  2396.             $Id substr($psId4strlen($psId) - 4);
  2397.             $lsNomTable "actiSsgroupesacti";
  2398.         } elseif (substr($psId02) == 'AB') {
  2399.             $Type 'AB';
  2400.             $Id substr($psId2strlen($psId) - 2);
  2401.             if (substr($Id017) == "_NouvellePourSGAB") {
  2402.                 // On cherche à créer une nouvelle activité de base et on fournit l'Id du SGAB concerné
  2403.                 $liSousGroupe substr($Id17strlen($Id) - 17);
  2404.                 $Id ;
  2405.             }
  2406.             $lsNomTable "actibases";
  2407.         } else {
  2408.             $lsNomTable "";
  2409.             $Type null;
  2410.             // throw new exception("Cas non prévu : " . $psId);
  2411.         }
  2412.         
  2413.         $laOptions["bAutoriseListing"] = $this->autoriseListing($lsNomTable);
  2414.         $laOptions["psNomTable"] = strtolower($lsNomTable);
  2415.         $laOptions["psURLTable"] = "actiBaseSousGroupeGroupe";
  2416.         $laOptions["psLibelléTable"] = "Arborescence des activités de base";
  2417.         $laOptions["Type"] = $Type;
  2418.         //modifier le cas pour changer d'entity en fonction de l'onglet et mettre l'onglet intervenant de base
  2419.         if ($Type == 'AB') {
  2420.             $lRepo $this->getDoctrineRepository("PaaBundle:ressourcesActibases");
  2421.             $loListeIntervenants $lRepo->findAllPourActiBase('I'$Id$this);
  2422.             $loListeUsagers $lRepo->findAllPourActiBase('U'$Id$this);
  2423.             $loListeGroupes $lRepo->findAllPourActiBase('G'$Id$this);
  2424.             $loListeSalles $lRepo->findAllPourActiBase('S'$Id$this);
  2425.             $laOptions["poListeIntervenants"] = $loListeIntervenants;
  2426.             $laOptions["poListeUsagers"] = $loListeUsagers;
  2427.             $laOptions["poListeGroupes"] = $loListeGroupes;
  2428.             $laOptions["poListeSalles"] = $loListeSalles;
  2429.         }
  2430.         $em $this->getDoctrineManager();
  2431.         if (!$Id) {
  2432.             if ($Type == 'AB') {
  2433.                 $loEntité = new \App\PaaBundle\Entity\actibases($this->getDoctrineManager());
  2434.                 if (isset($liSousGroupe)) {
  2435.                     $loEntité->setIsousgroupe($liSousGroupe) ;
  2436.                 } else {
  2437.                     $toto "toto" ;        // Pour mettre un point d'arrêt
  2438.                 }
  2439.                 $loEntité->setIetablissement(intval($this->getIdEtablissementCourant())) ;
  2440.             } else if ($Type == "GAB") {
  2441.                 $loEntité = new \App\PaaBundle\Entity\actiGroupesacti($this->getDoctrineManager());
  2442.                 $loEntité->setIetablissement(intval($this->getIdEtablissementCourant())) ;
  2443.             } else if ($Type == "SGAB") {
  2444.                 $loEntité = new \App\PaaBundle\Entity\actiSsgroupesacti($this->getDoctrineManager());
  2445.                 $loEntité->setIetablissement(intval($this->getIdEtablissementCourant())) ;
  2446.             } else {
  2447.                 $loEntité null ;
  2448.             }
  2449.         } else {
  2450.             $loEntité $em->getRepository("PaaBundle:" $lsNomTable)->find($Id);
  2451.             if ($loEntité == null) {
  2452.                 return new \Symfony\Component\HttpFoundation\Response("Enregistrement inexistant ;"
  2453.                         Response::HTTP_NOT_FOUND
  2454.                         , array('content-type' => 'text/html')
  2455.                 );
  2456.             }
  2457.         }
  2458.         if ($lsNomTable == "actibases") {
  2459.             $psSousType $this->getSousTypeFormActibase($loEntité->getiSousGroupe());
  2460.         } else {
  2461.             $psSousType "" ;
  2462.         }
  2463.             
  2464.         $laFormOptions = array();
  2465.         $laFormOptions['doctrine'] = $this->get('doctrine');    // Injecter Doctrine dans le form builder
  2466.         $laFormOptions['controller'] = $this;                   // Injecter le controleur dans le form builder      // LG 20220415
  2467.         $loForm $this->createForm('App\PaaBundle\Form\ActiBases\\' $lsNomTable $psSousType 'Type'$loEntité$laFormOptions);
  2468.         $laOptions['poForm'] = $loForm->createView();
  2469.         $laOptions['poEntité'] = $loEntité;
  2470.         $laOptions["poController"] = $this//JM 20220413 ajout controller
  2471.         return $this->render('@Paa/form/actiBases/actiBaseSousGroupeGroupe.html.twig'$laOptions);
  2472.     }
  2473.     
  2474. // LG 20210720 passé de <PlanningController début
  2475.    
  2476.     // Préparer la boite de dialogue pour affichage à l'utilisateur
  2477.     // Lors d'une action sur le planning pour une séance sans série
  2478.     // private function jsonDialogue($pcMsgErr, $pcMsgAvertissement, $paDemandeInitiale) {
  2479.     protected function jsonDialogue($pcMsgErr$pcMsgAvertissement$paDemandeInitiale$psAfterAction '"refreshAfterAction_Dialog_OK"') {
  2480.         if ($pcMsgErr) {
  2481.             // Préparer l'affichage de l'erreur
  2482.             $lsJSONDialogue '{"Dialogue": {"Message": ' json_encode($pcMsgErr) . ', "Titre":"Déplacement de la séance"'
  2483.                     ', "Boutons": [{"text":"OK", "Action":"refreshAfterAction_Dialog_Annuler"}]}'
  2484.                     '}';
  2485.         } else if ($pcMsgAvertissement) {
  2486.             $lsJSONDialogue '{"Dialogue": {"Message": ' json_encode($pcMsgAvertissement) . ', "Titre":"Déplacement de la séance"'
  2487.                     ', "Boutons": [{"text":"OK", "class": "cmdOk", "Action":"refreshAfterAction_Dialog_OK"}'
  2488.                     ', {"text":"Annuler", "class": "cmdCancel", "Action":"refreshAfterAction_Dialog_Annuler"}]}'
  2489.                     ', "DemandeInitiale": ' json_encode($paDemandeInitiale)
  2490.                     . ', "DialogueEnCours": "ConfirmeDéplacement"'
  2491.                     '}';
  2492.         } else {
  2493.             $lsJSONDialogue '';
  2494.         }
  2495.         return $lsJSONDialogue;
  2496.     }
  2497.         
  2498.     // Préparer la boite de dialogue pour affichage à l'utilisateur
  2499.     // Lors d'une action sur le planning pour une séance avec série
  2500.         // $pcMsgAvertissement      : le texte du message à afficher
  2501.         // $paDemandeInitiale       : le tableau des données de la requête initiale
  2502.         // $poSéance                : l'entité séance initialement concerné par la demande
  2503.         // $psTypeModification      : valeurs possibles : "Déplacement", "SuppressionSurSérie"
  2504. // LG 20210716 old    private function jsonDialogue_SérieSéances($pcMsgAvertissement, $paDemandeInitiale, $poSéance) {
  2505.     protected function jsonDialogue_SérieSéances($pcMsgAvertissement$paDemandeInitiale$poSéance$psTypeModification "Déplacement"$pbScinderDisabled false) {
  2506.             $lcMsgAvertissement "Cette séance fait partie d'une série de séances dont les caractéristiques sont résumées ci-dessous.\n"
  2507.                             "Souhaitez-vous répercuter le changement fait sur cette séance aux autres séances de cette série ?";
  2508.             if ($pcMsgAvertissement) {
  2509.                 $lcMsgAvertissement .= "<br><br>" $pcMsgAvertissement ;
  2510.             }
  2511.             //LP 08/07/2021 On Mémorise le choix de l'utilisateur debut
  2512. // LG 20230331 old            $liBoutonActif = $this->getParamètresBDD()->getParamètre("gsDemandeTypeModifSerie", "2", "NU");
  2513.             $liBoutonActif $this->getParamètre("gsDemandeTypeModifSerie""2""NU");
  2514.             $CetteSeanceFocused "";
  2515.             $ToutLaSerieFocused "";
  2516.             $IciFocused "";
  2517.             $ScinderFocused "";
  2518.             $ChaqueFocused "";
  2519.             if ($liBoutonActif == 1) {
  2520.                     $CetteSeanceFocused '"focused": true, ';
  2521.             } else if ($liBoutonActif == 2) {
  2522.                     $ToutLaSerieFocused '"focused": true, ';
  2523.             } else if ($liBoutonActif == 3) {
  2524.                     $IciFocused '"focused": true, ';
  2525.             } else if ($liBoutonActif == 4){
  2526.                     $ScinderFocused '"focused": true,';
  2527.             } else {
  2528.                     $ChaqueFocused '"focused": true,';
  2529.             }
  2530.             $lsOptionScinder ', {"text":"Scinder ici", "id":"cmdScinder", "disabled": ' . ($pbScinderDisabled?'true':'false') . ','.$ScinderFocused.' "Action":"refreshAfterAction_Dialog_Série_Scinder"}' ;
  2531.             $lsJSONDialogue '{"Dialogue": {"Message": ' json_encode($lcMsgAvertissement) . ', "Titre":"Modification d&lsquo;une séance faisant partie d&lsquo;une série"'
  2532.                             ', "Boutons": [{"text":"Cette seance", "id":"cmdCetteSeance", '.$CetteSeanceFocused.' "Action":"refreshAfterAction_Dialog_Série_CetteSéance"}'
  2533.                             ', {"text":"Toute la série", "id":"cmdTouteLaSerie", '.$ToutLaSerieFocused.' "Action":"refreshAfterAction_Dialog_Série_TouteLaSérie"}'
  2534.                             ', {"text":"A partir d\'ici (inclus)", "id":"cmdIci",'.$IciFocused.' "Action":"refreshAfterAction_Dialog_Série_APartirDeCetteSéance"}'
  2535.                             $lsOptionScinder
  2536.                             ', {"text":"Chaque ' strtolower($poSéance->getNomJour()) . '", "id":"cmdChaque", '.$ChaqueFocused.' "Action":"refreshAfterAction_Dialog_Série_CeJourDeLaSemaine"}'
  2537.                             ', {"text":"Annuler", "class": "cmdCancel", "Action":"refreshAfterAction_Dialog_Annuler"}]}'
  2538.                             ', "DemandeInitiale": ' json_encode($paDemandeInitiale)
  2539.                             . ', "DialogueEnCours": "Confirme' $psTypeModification '"'
  2540.                             '}';
  2541.             return $lsJSONDialogue
  2542.     }
  2543. //LP 08/07/2021 On Mémorise le choix de l'utilisateur fin
  2544. // LG 20210720 passé de <PlanningController fin
  2545.     // Diffuser les caractéristiques d'une séance sur toutes les autres séances de la même série de séances
  2546.     // psTypeDiffusionSérie     : le type de diffusion : Série_CetteSéance, Série_TouteLaSérie, Série_APartirDeCetteSéance, Série_Scinder, Série_CeJourDeLaSemaine
  2547.     // piIdSeance               : id de la séance à l'origine de la modification
  2548.     // piIdSérie                : id de la série de cette séance
  2549.     // pdDate                   : date de cette séance
  2550.     //(poSeanceInitiale)        : entité séance, données avant modification (+ propriété facultative sLstRes : liste des participants "I1,G2,...")
  2551.     //(poSeanceFinale)          : entité séance, données après modification (+ propriété facultative sLstRes : liste des participants "I1,G2,...")
  2552.     // LG 20210719
  2553.     protected function serieSeances_DiffuseModificationSurSérie($psTypeDiffusionSérie
  2554.                                                                     $piIdSeance
  2555.                                                                     $piIdSérie
  2556.                                                                     $pdDate
  2557.                                                                     $poSeanceInitiale null     // LG 20220729
  2558.                                                                     $poSeanceFinale null       // LG 20220729
  2559.                                                                     ) {
  2560.         // Mémoriser le choix de l'utilisateur
  2561.         $this->serieSeances_EnregistreChoixUtilisateur($psTypeDiffusionSérie) ;
  2562.         // Effectuer la diffusion
  2563. // LG 20230830 old            if ($psTypeDiffusionSérie == "Série_CetteSéance") {
  2564.         if ($psTypeDiffusionSérie == "Série_CetteSéance" || $psTypeDiffusionSérie == "Serie_CetteSéance") {
  2565.             // RAS
  2566.             return ;
  2567.         } else if ($psTypeDiffusionSérie == "Série_TouteLaSérie") {
  2568.             $liPortée ;
  2569.             $pdDate null ;
  2570.             
  2571.         } else if ($psTypeDiffusionSérie == "Série_APartirDeCetteSéance") {
  2572.             // Appliquer les changements à partir de cette séance
  2573.             $liPortée ;
  2574.             
  2575.         } else if ($psTypeDiffusionSérie == "Série_Scinder") {
  2576.             // Scinder à partir de la date de la séance
  2577.             $liPortée ;
  2578.             
  2579.         } else if ($psTypeDiffusionSérie == "Série_CeJourDeLaSemaine") {
  2580.             // Appliquer le changement à chaque jour de la semaine qui est le même que celui de la séance modifiée, à partir de la date de la séance modifiée
  2581.             $liPortée ;
  2582.             
  2583.         } else {
  2584.             throw new \Exception("Cas de type de diffusion sur la série non prévu : " $psTypeDiffusionSérie) ;
  2585.             
  2586.         }
  2587.         $lbResult $this->getDoctrineManager()
  2588.                         ->getRepository("PaaBundle:seriesseances")
  2589.                         ->serieseances_diffusesurserie($piIdSeance              // $piséancemodèle
  2590.                                                     $piIdSérie                // &$pisérie
  2591.                                                     $pdDate                   // $pdDate
  2592.                                                     $liPortée                 // $piPortée
  2593.                                                     0                         // $pitypedépendance
  2594.                                                     $poSeanceInitiale         // $poSeanceInitiale, LG 20220729
  2595.                                                     $poSeanceFinale           // $poSeanceFinale, LG 20220729
  2596.                                                     );
  2597.     
  2598.         return $lbResult ;
  2599.     }
  2600.     
  2601.     // Obtenir la liste des évolutions de PAA
  2602.     public function evolutionsAction(request $request) {
  2603.         $m $this->getDoctrineManager();
  2604.         $laListeVersion $m->getRepository("PaaBundle:changelog")->getAllVersions();
  2605.         if (count($laListeVersion) > 0) {
  2606.             $ldVersionChoisieDebut $laListeVersion[count($laListeVersion) - 1]->d_version ;
  2607.             $ldVersionChoisieFin $laListeVersion[0]->d_version ;
  2608.         } else {
  2609.             $ldVersionChoisieDebut date('Y-m-d') ;
  2610.             $ldVersionChoisieFin date('Y-m-d') ;
  2611.         }
  2612.         $lbCategories false ;
  2613.         $laParamètres $request->request->all() ;
  2614.         if (isset($laParamètres["deDateVersion"])) $ldVersionChoisieDebut $laParamètres["deDateVersion"] ;
  2615.         if (isset($laParamètres["aDateVersion"])) $ldVersionChoisieFin $laParamètres["aDateVersion"] ;
  2616.         if (isset($laParamètres["categories"])) $lbCategories = ($laParamètres["categories"] =="on") ;
  2617.         $laListeEntites $m->getRepository("PaaBundle:changelog")->getAllHierarchiqueParType($ldVersionChoisieDebut$ldVersionChoisieFin$lbCategories);
  2618.         
  2619.         $laOptions = array(
  2620.             'paListeVersion' => $laListeVersion,
  2621.             'pdVersionChoisieDebut' => $ldVersionChoisieDebut,
  2622.             'pdVersionChoisieFin' => $ldVersionChoisieFin,
  2623.             'poListeEntites' => $laListeEntites,
  2624.             'psNomTable' => 'changelog',
  2625.             'pbCategories' => $lbCategories
  2626.         );
  2627.         
  2628.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2629.         
  2630.         return $this->render('@Paa/Default/evolutions.html.twig'$laOptions);
  2631.     }
  2632.     
  2633.     // Obtenir une aide pour bien démarrer avec PAA
  2634.     // LG 20220914
  2635.     public function aidePriseEnMainAction(request $request) {
  2636.         $laOptions = array() ;
  2637.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2638.         return $this->render('@Paa/Default/aidePriseEnMain.html.twig'$laOptions);
  2639.     }
  2640.     
  2641.     // Mémoriser le choix de l'utilisateur en réponse à jsonDialogue_SérieSéances
  2642.     // LG 20210719
  2643.     protected function serieSeances_EnregistreChoixUtilisateur($psTypeDiffusionSérie) {
  2644.         if ($psTypeDiffusionSérie == "Série_TouteLaSérie") {
  2645.             $this->setParamètre("gsDemandeTypeModifSerie""2""NU");
  2646.         } else if ($psTypeDiffusionSérie == "Série_APartirDeCetteSéance") {
  2647.             $this->setParamètre("gsDemandeTypeModifSerie""3""NU");
  2648.         } else if ($psTypeDiffusionSérie == "Série_Scinder") {
  2649.             $this->setParamètre("gsDemandeTypeModifSerie""4""NU");
  2650.         } else if ($psTypeDiffusionSérie == "Série_CeJourDeLaSemaine") {
  2651.             $this->setParamètre("gsDemandeTypeModifSerie""5""NU");
  2652.         }            
  2653.     }
  2654.     // JM 20211102 Début
  2655. // LG 20240219 old    function filtresAction(request $request, $psNomTable){
  2656.     function filtresAction(request $request$psNomTable$pbNoReinit){
  2657. // LG 20231025 dédupliqué début
  2658.         $m $this->getDoctrineManager();
  2659.         $session $this->refreshSession($request);
  2660.         $laOptions = Array();
  2661.         $laOptions['poController'] = $this;
  2662. // LG 20231025 dédupliqué fin
  2663. // LG 20240219 début
  2664.         $laOptions["pbNoReinit"] = $pbNoReinit true false ;
  2665. // LG 20240219 fin
  2666.         if($psNomTable == "intervenants"){
  2667. // LG 20231025 passé + haut            $m = $this->getDoctrineManager();
  2668. // LG 20231025 passé + haut            $session = $this->refreshDatesSession($request);
  2669.             $liEtablissement $request->getSession()->get('iEtablissement');       
  2670.             $lsParamètres "iEtablissement=$liEtablissement";
  2671.             $repo $m->getRepository("PaaBundle:groupes");
  2672.             $loListeGroupes $repo->findAllAvecParametres($lsParamètres);
  2673.             $loListeEtablissements $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
  2674.             $loListeService $m->getRepository("PaaBundle:services")->findAll();
  2675.             $loListeSpecialite $m->getRepository("PaaBundle:specialites")->findAll();
  2676.             $loListeLibre1 $m->getRepository("PaaBundle:intervenants")->getAllLibre1();
  2677.             $loListeLibre2 $m->getRepository("PaaBundle:intervenants")->getAllLibre2();
  2678.             $pdDebut $session->get('dateDebut');
  2679.             $pdFin $session->get('dateFin');
  2680. // LG 20231025 passé + haut            $laOptions = Array();
  2681. // LG 20231025 passé + haut            $laOptions['poController'] = $this;
  2682.             $laOptions["pdDebut"] = $pdDebut;
  2683.             $laOptions["pdFin"] = $pdFin;
  2684.             $laOptions['entityGroupe'] = $loListeGroupes;
  2685.             $laOptions['paEtablissements'] = $loListeEtablissements;
  2686.             $laOptions['entityService'] = $loListeService;
  2687.             $laOptions['entitySpecialite'] = $loListeSpecialite;
  2688.             $laOptions['entityLibre1'] = $loListeLibre1;
  2689.             $laOptions['entityLibre2'] = $loListeLibre2;
  2690.             $anneeCourante $this->getIdAnnéeCourante();
  2691.             $paAnnées $m->getRepository("PaaBundle:annees")->find(intval($anneeCourante));
  2692.             $laOptions['paAnnées'] = $paAnnées;
  2693.             $laOptions["affichePresent"] = $session->get('intervenantAffichePresent');      
  2694.             $laOptions["afficheSortis"] = $session->get('intervenantAfficheSortis');        
  2695.             $laOptions["affichePasEntrés"] = $session->get('intervenantAffichePasEntrés');
  2696.             $laOptions["iGroupe"] = "G" str_replace(","",G"$session->get('intervenantiGroupe'));           
  2697.             $laOptions["iEtablissement"] = $session->get('iEtablissement');                 
  2698.             $laOptions["iService"] = $session->get('intervenantiService');                  
  2699.             $laOptions["iSpecialité"] = $session->get('intervenantiSpecialité');            
  2700.             $laOptions["Remplaçants"] = $session->get('intervenantRemplaçants');            
  2701.             $laOptions["IntervExt"] = $session->get('intervenantIntervExt');                
  2702.             $laOptions['libre1'] = $session->get('intervenantcIntervenant_Libre1');         
  2703.             $laOptions['libre2'] = $session->get('intervenantcIntervenant_Libre2');         
  2704.             return $this->render('@Paa/Dialog/filtres/filtreIntervenants.html.twig'$laOptions);
  2705.         } else if($psNomTable == "usagers"){
  2706. // LG 20231025 passé + haut            $m = $this->getDoctrineManager();
  2707. // LG 20231025 passé + haut            $session = $this->refreshDatesSession($request);
  2708.             $liEtablissement $session->get('iEtablissement');                             
  2709.             $lsParamètres "iEtablissement=$liEtablissement";
  2710.             $repo $m->getRepository("PaaBundle:groupes");
  2711. // LG 20240201 déac inutilisé            $loListeGroupes = $repo->findAllAvecParametres($lsParamètres);
  2712.             $loListeEtablissements $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
  2713.             $pdDebut $session->get('dateDebut');
  2714.             $pdFin $session->get('dateFin');
  2715. // LG 20231025 passé + haut            $laOptions = Array();
  2716.             $anneeCourante $this->getIdAnnéeCourante();
  2717.             $loAnnée $m->getRepository("PaaBundle:annees")->find(intval($anneeCourante));
  2718. // LG 20231025 passé + haut            $laOptions['poController'] = $this;
  2719.             $laOptions['pdDebut'] = $pdDebut;
  2720.             $laOptions['pdFin'] = $pdFin;
  2721. // LG 20240201 déac inutilisé            $laOptions['entityGroupe'] = $loListeGroupes;
  2722.             $laOptions['paEtablissements'] = $loListeEtablissements;
  2723.             $laOptions['poAnnée'] = $loAnnée;
  2724.             $laOptions["affichePresent"] = $session->get('usagersAffichePresents');         
  2725.             $laOptions["afficheSortis"] = $session->get('usagersAfficheSortis');            
  2726.             $laOptions["affichePasEntrés"] = $session->get('usagersAffichePasEntrés');      
  2727. // LG 20240201 début
  2728. //            $laOptions["iGroupe"] = $session->get('usagersiGroupe');                        
  2729.             $lvGroupes $session->get('usagersiGroupe') ;
  2730.             if (is_array($lvGroupes)) {
  2731.                 $laOptions["iGroupe"] = implode(","$lvGroupes);
  2732.             } else {
  2733.                 $laOptions["iGroupe"] = $lvGroupes ;
  2734.             }
  2735. // LG 20240201 fin
  2736.             $laOptions["iEtablissement"] = $session->get('iEtablissement');                 
  2737.             $laOptions["pbGroupesDeLaPeriodeDemandée"] = $session->get('usagersPeriodeDemandée');        
  2738.             return $this->render('@Paa/Dialog/filtres/filtreUsagers.html.twig'$laOptions);
  2739. // LG 20240219 début
  2740.         } else if($psNomTable == "groupes"){
  2741.             $liEtablissement $session->get('iEtablissement');                             
  2742.             $lsParamètres "iEtablissement=$liEtablissement";
  2743.             $repo $m->getRepository("PaaBundle:groupes");
  2744.             $loListeEtablissements $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
  2745.             $pdDebut $session->get('dateDebut');
  2746.             $pdFin $session->get('dateFin');
  2747.             $anneeCourante $this->getIdAnnéeCourante();
  2748.             $loAnnée $m->getRepository("PaaBundle:annees")->find(intval($anneeCourante));
  2749.             $laOptions['pdDebut'] = $pdDebut;
  2750.             $laOptions['pdFin'] = $pdFin;
  2751.             $laOptions['paEtablissements'] = $loListeEtablissements;
  2752.             $laOptions['poAnnée'] = $loAnnée;
  2753.             $laOptions["affichePresent"] = $session->get('groupesAffichePresents');         
  2754.             $laOptions["afficheSortis"] = $session->get('groupesAfficheSortis');            
  2755.             $laOptions["affichePasEntrés"] = $session->get('groupesAffichePasEntrés');
  2756.             $lvIntervenants $session->get('groupesiIntervenant') ;
  2757.             if (is_array($lvIntervenants)) {
  2758.                 $laOptions["iIntervenant"] = implode(","$lvIntervenants);
  2759.             } else {
  2760.                 $laOptions["iIntervenant"] = $lvIntervenants ;
  2761.             }
  2762.             $laOptions["iEtablissement"] = $session->get('iEtablissement');                 
  2763.             return $this->render('@Paa/Dialog/filtres/filtreGroupes.html.twig'$laOptions);
  2764. // LG 20240219 fin
  2765. // LG 20240215 old        } else if($psNomTable == "activites"){
  2766.         } else if($psNomTable == "activites" || $psNomTable == "activités"){
  2767. // LG 20231025 passé + haut            $m = $this->getDoctrineManager();
  2768. // LG 20231025 passé + haut            $session = $this->refreshDatesSession($request);
  2769.             $liEtablissement $session->get('iEtablissement');                             
  2770.             $lsParamètres "iEtablissement=$liEtablissement";
  2771.             $repo $m->getRepository("PaaBundle:groupes");
  2772.             $loListeGroupes $repo->findAllAvecParametres($lsParamètres);
  2773.             $repo $this->getDoctrineRepository("PaaBundle:actibases");
  2774.             $loListeActiBase $repo->findAll();
  2775.             $repo $this->getDoctrineRepository("PaaBundle:intervenants");
  2776.             $loListeIntervenants $repo->findAllAvecParametres($lsParamètres);
  2777.             $repo $this->getDoctrineRepository("PaaBundle:usagers");
  2778.             $loListeUsagers $repo->findAllAvecParametres($lsParamètres);
  2779.             $repo $this->getDoctrineRepository("PaaBundle:groupes");
  2780.             $loListeGroupes $repo->findAllAvecParametres($lsParamètres);
  2781.             $repo $this->getDoctrineRepository("PaaBundle:salles");
  2782.             $loListeSalles $repo->findAllAvecParametres($lsParamètres);
  2783.             $loListeEtablissements $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E"); // JM 20220425
  2784. // LG 20231025 passé + haut            $laOptions = Array();
  2785.             $laOptions["entityActiBase"] = $loListeActiBase;
  2786.             $laOptions['entityIntervenant'] = $loListeIntervenants;
  2787.             $laOptions['entityUsager'] = $loListeUsagers;
  2788.             $laOptions['entitySalle'] = $loListeSalles;
  2789.             $laOptions['entityGroupe'] = $loListeGroupes;
  2790.             $laOptions['paEtablissements'] = $loListeEtablissements// JM 20220425
  2791. // LG 20231025 passé + haut            $laOptions['poController'] = $this; // JM 20220425
  2792.             $laOptions["actiSysteme"] = $session->get('activitésActiSysteme');              
  2793.             $laOptions['actiGenerique'] = $session->get('activitésActiGenerique');          
  2794.             $laOptions['actiBase'] = substr($session->get('activitésActiBase'), 1);         
  2795.             $laOptions['actiInterv'] = substr($session->get('activitésInterv'), 1);         
  2796.             $laOptions['actiUsager'] = substr($session->get('activitésUsager'), 1);         
  2797.             $laOptions['actiSalle'] = substr($session->get('activitésSalle'), 1);           
  2798.             $laOptions['actiGroupe'] = substr($session->get('activitésGroupe'), 1);         
  2799.             $laOptions['actiEtablissement'] = $session->get('iEtablissement');              
  2800.             
  2801.             return $this->render('@Paa/Dialog/filtres/filtreActivites.html.twig'$laOptions);
  2802.         }
  2803. // LG 20240215 début
  2804.         else {
  2805.             return new Response("Désolé, le filtre n'est pas encore implémenté pour ce type de ressource ($psNomTable).") ;
  2806.         }
  2807. // LG 20240215 fin        
  2808.     }
  2809.     // JM 20211102 Fin
  2810.     // JM 20211124 début ajout function pour popup visualisation séance quand clic
  2811.     function visualisationSeanceAction($idSeance){
  2812.         $em $this->getDoctrineManager();
  2813.         $loEntité $em->getRepository("PaaBundle:seances")->find($idSeance);
  2814.         $idActivite $loEntité->getActivité()->getId();
  2815.         $libelleActi $em->getRepository("PaaBundle:activites")->rtvlibelleacti($idActivite50207998$idSeance); //1449087 sans balise body, mais visiblement aucun effet 
  2816.         $laOptions["libelleActi"] = $libelleActi;
  2817.         return $this->render('@Paa/Dialog/visualisation/visualisationSeance.html.twig'$laOptions);
  2818.     }
  2819.     // JM 20211124 fin ajout function pour popup visualisation séance quand clic
  2820.     //HL 20220616
  2821.     public function getLiensAction() {
  2822.         $em $this->getDoctrineManager();
  2823.         $loListeLiens $em->getRepository("PaaBundle:referents")->getLiens();
  2824.         $laListeLiens json_decode(json_encode($loListeLiens), true);
  2825.         return $laListeLiens;
  2826.     }
  2827.     //HL 20220629
  2828.     // LG 20220720 TODO : renommer en getUsagersScolarite_AnneesScolairesDistinct
  2829.     public function getAnneeScolaireAction() {
  2830.         $em $this->getDoctrineManager();
  2831. // LG 20220701 old        $loListeAnneeScolaire = $em->getRepository("PaaBundle:usagers_scolarite")->getAnneeScolaire();
  2832.         // LG 20220720 TODO : renommer en getUsagersScolarite_AnneesScolairesDistinct
  2833.         $loListeAnneeScolaire $em->getRepository("PaaBundle:usagersScolarite")->getAnneeScolaire();
  2834.         $laListeAnneeScolaire json_decode(json_encode($loListeAnneeScolaire), true);
  2835.         return $laListeAnneeScolaire;
  2836.     }
  2837.     // LG 20220720 TODO : renommer en getUsagersScolarite_ClassesDistinct
  2838.     public function getClasseAction() {
  2839.         $em $this->getDoctrineManager();
  2840.         // LG 20220720 TODO : renommer en getUsagersScolarite_ClassesDistinct
  2841.         $loListeClasse $em->getRepository("PaaBundle:usagersScolarite")->getClasse();
  2842.         $laListeClasse json_decode(json_encode($loListeClasse), true);
  2843.         return $laListeClasse;
  2844.     }
  2845.     function modelesHorairesform() {
  2846.         $form $this->createForm(modelesHorairesType::class);
  2847.         return $this->render('@Paa/Resources/form/modelesHoraires.html.twig', [
  2848.             'modeleshorairesform' => $form->createView()
  2849.         ]);
  2850.     }
  2851.     // LP 27/05/2021
  2852.     // $NomTable : toujours "actibases"
  2853.     // $piSousGroupe
  2854.     // LG 20221219 : déplacé comme méthode private de la classe
  2855.     private function getSousTypeFormActibase($piSousGroupeAB){
  2856.         $psSousType '';
  2857.         switch ($piSousGroupeAB) {
  2858.             case '-2':
  2859.                 $psSousType 'AbsenceIntervenant';
  2860.                 break;
  2861.             case '-3':
  2862.                 $psSousType 'AbsenceAutre';
  2863.                 break;
  2864.             case '-4':
  2865.                 $psSousType 'AbsenceAutre';
  2866.                 break;
  2867.             case '-6':
  2868.                 $psSousType 'AbsenceUsager';
  2869.                 break;
  2870.             case '-7':
  2871. // CB 20230216 old               $psSousType = 'AbsenceAutre';
  2872.                 $psSousType 'AbsenceGroupe';
  2873.                 break;
  2874.             case '-11':
  2875.                 $psSousType 'Base';
  2876.                 break;
  2877.             case '-5':
  2878.                 $psSousType 'Base';
  2879.                 break;
  2880.             default:
  2881.                 $psSousType '';
  2882.         }
  2883.         return $psSousType;
  2884.     }
  2885.     public function planFormationAction(request $request) {
  2886.         $m $this->getDoctrineManager();
  2887.  // LG 20231207 début
  2888.  //       $ldDebut = $request->getSession()->get('dateDebut');  // Début de la sélection de semaines
  2889. //        $ldFin = $request->getSession()->get('dateFin');
  2890.         $loAnnée $this->getEntitéAnnéeCourante() ;
  2891.         $ldDebut date_format($loAnnée->getDdebut(), "Y-m-d") ;    // Début de l'année en cours
  2892.         $ldFin date_format($loAnnée->getDFin(), "Y-m-d") ;
  2893.  // LG 20231207 fin
  2894.  
  2895.         $laOptions = array(
  2896.             'pdDebut' => $ldDebut,
  2897.             'pdFin' => $ldFin,
  2898.             'poController' => $this,
  2899.         );
  2900.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  2901.         return $this->render('@Paa\form\planFormation.html.twig'$laOptions);
  2902.     }
  2903. // LG 20230905 passé de testController
  2904.     public function checkSecondsToExpireAction(): JsonResponse {
  2905.         return new JsonResponse(['secToExp' => 0]);
  2906.         //throw new \Exception("On ne devrait jamais passer dans cette action puisqu'elle est gérée dans la function onKernelRequest de la classe SessionIdleHandler") ;
  2907.     }
  2908. }