src/PaaBundle/Controller/DefaultController.php line 26

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