src/PaaBundle/Controller/editionsController.php line 198

Open in your IDE?
  1. <?php
  2. namespace App\PaaBundle\Controller;
  3. // LG 20231031 déac use App\PaaBundle\Controller\PAABaseController;
  4. use App\PaaBundle\Controller\DefaultController;
  5. // LG 20231031 déacuse App\PaaBundle\Component\Paa\Paa_Constantes;
  6. // LG 20231031 déacuse App\Limoog\PartageBundle\Component\Limoog_Constantes;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;  // LG 20180622
  9. // use Symfony\Component\HttpFoundation\JsonResponse;    // LG 20180622
  10. // LG 20231031 déacuse Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. // LG 20231031 déacuse Symfony\Component\Routing\Router;
  12. // LG 20231031 déacuse Symfony\Component\Security\Core\Exception\AccessDeniedException;
  13. // LG 20231031 déacuse Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  14. // LG 20231031 déacuse Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  15. //use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
  16. //use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
  17. // LG 20231031 déacuse Symfony\Component\Routing\Annotation\Route;
  18. use App\Limoog\PartageBundle\Component\cParametresBDD;
  19. use App\PaaBundle\Component\Paa\Paa_Constantes_Editions;
  20. use App\PaaBundle\Component\Paa\EditionsWidgetFactory;
  21. // LG 20231031 déacuse App\PaaBundle\Entity\actiGroupesacti;
  22. //MG Modification 20200218 Début
  23. //Table actiRealisations renommer en seances
  24. //use App\PaaBundle\Entity\actiRealisations;
  25. // LG 20231031 déacuse App\PaaBundle\Entity\seances;
  26. //MG Modification 20200218 Fin
  27. // LG 20231031 déacuse App\PaaBundle\Entity\actiSsgroupesacti;
  28. // LG 20231031 déacuse App\PaaBundle\Entity\actibases;
  29. // LG 20231031 déacuse App\PaaBundle\Entity\activites;
  30. // LG 20231031 déacuse App\PaaBundle\Entity\annees;
  31. // LG 20231031 déacuse App\PaaBundle\Entity\caisses;
  32. // LG 20231031 déacuse App\PaaBundle\Entity\caissesPersonnes;
  33. // LG 20231031 déacuse App\PaaBundle\Entity\compteurs;
  34. // LG 20231031 déacuse App\PaaBundle\Entity\conventions;
  35. // LG 20231031 déacuse App\PaaBundle\Entity\etablissements;
  36. // LG 20231031 déacuse App\PaaBundle\Entity\groupes;
  37. // LG 20231031 déacuse App\PaaBundle\Entity\intervenants;
  38. // LG 20231031 déacuse App\PaaBundle\Entity\joursferies;
  39. // LG 20231031 déacuse App\PaaBundle\Entity\referents;
  40. // LG 20231031 déacuse App\PaaBundle\Entity\salles;
  41. // LG 20231031 déacuse App\PaaBundle\Entity\services;
  42. // LG 20231031 déacuse App\PaaBundle\Entity\specialites;
  43. // LG 20231031 déacuse App\PaaBundle\Entity\usagers;
  44. // LG 20231031 déacuse App\PaaBundle\Security\PaaVoter;
  45. // LG 20231031 déacuse phpDocumentor\Reflection\Types\Mixed_;
  46. use Symfony\Component\Dotenv\Dotenv// JM 20211029 
  47. class editionsController extends DefaultController {
  48.     // LG 20210817 : simplification de l'appel des écrans de choix des options
  49.     function getOptionsEditionsAction(Request $request$psTwig) {
  50.         return $this->optionEditionsController($request$psTwig ".html.twig"nullnull);
  51.     }
  52.     function optionEditionsController(Request $request$twig$psLstRes$laOptions) {  // Méthode de factorisation pour la déclaration des actions
  53.         if ($this->RedirectIfNotGranted($request$this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
  54.             return $response;
  55.         if ($this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  56.             $lsLstTypesRes "@Tous@";
  57.         } else if ($this->get('security.authorization_checker')->isGranted('ROLE_ENSEIGNANT')) {
  58. // LG 20240827 old            $lsLstTypesRes = "GI";
  59.             $lsLstTypesRes "G,I";
  60.         } else {
  61.             $lsLstTypesRes "G";
  62.         }
  63.         $m $this->getDoctrineManager();       // Récupérer le manager Doctrine
  64.         $loCnxn $this->getDoctrineConnection();
  65. // LG 20240612 déac        $psNomTable = "paa_para";
  66.         if ($laOptions == null) {
  67.             $laOptions = array(
  68.                 'poParametre' => new cParametresBDD($loCnxn),
  69.                 'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
  70.                 'poController' => $this,        // Injecter le contrôleur
  71. //                'psNomTable' => $twig           // LG 20240612 : psTable avait disparu ????
  72.             );
  73.         } else {
  74.             throw new \Exception("On a fourni le tableau d'options : ce cas est-il géré ?");
  75.         }
  76.         if ($twig == "Rapports.html.twig" || $twig == "Recapitulatifs_Avancé.html.twig" || $twig == "Recapitulatifs_standard.html.twig" || $twig == "Recapitulatifs_ExtractionpourstatistiquesEspaceSingulier.html.twig" || /*JM 20220208*/$twig == "PlanningsParActivite_graphique.html.twig" || $twig == "PlanningsParActivite_listing_semaine.html.twig" || $twig == "PlanningsParActivite_listing_AB_semaines.html.twig" || $twig == "PlanningsParActivite_listing_AB_mois.html.twig" || $twig == "PlanningsParActivite_listing_AB_continu.html.twig" || $twig == "PlanningsParActivite_listing_AB_mois_et_intervenants.html.twig" || $twig == "PlanningsParActivite_Calendrier_annuel_Excel.html.twig") {
  77.                 // Liste des activités de base au format select HTML
  78.             $repoActiBases $m->getRepository("PaaBundle:actibases");
  79.             $laOptions["psHTML_cboActiBases"] = $repoActiBases->getHTML_cboActiBases();
  80.             // Liste des sous-groupes d'activités de base au format select HTML
  81.             $laOptions["psHTML_cboSousGroupesActiBases"] = $repoActiBases->getHTML_cboActiBases_ParSousGroupes();
  82.             
  83.             // Liste des groupes d'activités de base au format select HTML
  84.             $laOptions["psHTML_cboGroupesActiBases"] = $repoActiBases->getHTML_cboActiBases_ParGroupes();
  85.         }
  86.         if ($twig == "ListingsUsagers.html.twig") {
  87.             $repoGroupe $m->getRepository("PaaBundle:groupes");
  88.             $repoEtablissements $m->getRepository("PaaBundle:etablissements");
  89.             // $laOptions["poLstGroupes"] = $repoGroupe->getAllGroupesParents($exclureGroupesSysteme = true); OLD JM 20220225
  90.     
  91.             $liEtablissement $request->getSession()->get('iEtablissement');
  92.             $lsParamètres "iEtablissement=$liEtablissement";
  93.             $repo $m->getRepository("PaaBundle:groupes");
  94.             $loListeGroupes $repo->findAllAvecParametres($lsParamètres);
  95.             $laOptions["poLstGroupes"] = $loListeGroupes;
  96.             $laOptions["poLstEtablissements"] = $repoEtablissements->getEtablissementExclude($exclureGroupesSysteme true);
  97.             
  98.             // Liste des groupes d'activités de base au format select HTML
  99.         
  100.         }
  101.         if($twig == "PlanningsParActivite_graphique.html.twig" || $twig == "PlanningsParActivite_listing_semaine.html.twig" || $twig == "PlanningsParActivite_listing_AB_semaines.html.twig" || $twig == "PlanningsParActivite_listing_AB_mois.html.twig" || $twig == "PlanningsParActivite_listing_AB_continu.html.twig" || $twig == "PlanningsParActivite_listing_AB_mois_et_intervenants.html.twig") {
  102.             $m $this->getDoctrineManager();
  103.             $loListeEtablissements $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
  104.             $laOptions['paEtablissements'] = $loListeEtablissements;
  105.         }
  106.         if($twig == "PresencesIntervenants_ParServices_Quotidien.html.twig" || $twig == "PresencesIntervenants_ParServices_Hebdomadaire.html.twig" || $twig == "PresencesIntervenants_ParServices_Mensuel.html.twig" || $twig == "PresencesIntervenants_ParServices_MensuelA3.html.twig" || $twig == "PresencesIntervenants_ParServices_Parhorairescritiques.html.twig" || $twig == "PresencesIntervenants_ParServices_Bulletindepointagemensuelexcel.html.twig") {
  107.             $m $this->getDoctrineManager();
  108.             $loListeService $m->getRepository("PaaBundle:services")->findAll();
  109.             $laOptions['entityService'] = $loListeService;
  110.         }
  111.         if($twig == "PresencesIntervenants_Absencesparintervenants.html.twig") {
  112.             $m $this->getDoctrineManager();
  113.             $loListeAbsence $m->getRepository("PaaBundle:actibases")->rtvCurActiBasesAbsence("I");
  114.             $laOptions['entityAbsence'] = $loListeAbsence;
  115.         }
  116.         if($twig == "PresencesUsagers_Listingparcommentairesdabsences.html.twig" || $twig == "PresencesUsagers_Listingabsencesparusager.html.twig") {
  117.             $m $this->getDoctrineManager();
  118.             $loListeAbsence $m->getRepository("PaaBundle:actibases")->rtvCurActiBasesAbsence("U");
  119.             $laOptions['entityAbsence'] = $loListeAbsence;
  120.         }
  121.         if($twig == "PresencesIntervenants_Etatdescompteurs.html.twig") {
  122.             $m $this->getDoctrineManager();
  123.             $loListeCompteur $m->getRepository("PaaBundle:compteurs")->findAll();
  124.             $laOptions['entityCompteur'] = $loListeCompteur;
  125.         }
  126.         // Effectuer les traitements pour l'affichage
  127.         return $this->render('@Paa/editions/' $twig$laOptions);
  128.     }
  129.     // LG 20190626 pour debug
  130.     protected function tmp_ClearFavoris() {
  131.         $set = <<<EOT
  132.                 [{
  133.             "id": "5d134eed7bbd0",
  134.             "nom": "Laine Klemp",
  135.             "node": "PlanningIndividuels_listing_ressources_semaines",
  136.             "json": {
  137.                 "giTypeHorairesXL": "1",
  138.                 "giTypeCouleursPlanIndividuel": "2",
  139.                 "gbImprPlanInclActivit\u00e9s": "on",
  140.                 "gbImprPlanInclAbsences": "on",
  141.                 "gbImprPlanInclAbsencesStd": "on",
  142.                 "gbImprPlanInclPr\u00e9sences": "on",
  143.                 "gbLibell\u00e9ExclNomPlanType": "off",
  144.                 "gbImprPlanningIndividuelUtiliseNomsCourts": "off",
  145.                 "gbImprPlanningIndividuelInclRemarque": "on",
  146.                 "gbPlanningsMultiplesInclD\u00e9butFin": "off",
  147.                 "gbPlanningsMultiplesInclEffectif": "off",
  148.                 "gbPlanningsMultiplesUnePageParJour": "off",
  149.                 "cboTypeCouleurs": "2",
  150.                 "gbPlanningListingInclutBilansParAB": "off",
  151.                 "gbPlanningListingInclutBilansParCommentaire": "off"
  152.             }
  153.         }, {
  154.             "id": "5d134eff5079c",
  155.             "nom": "Georgianna Buresh",
  156.             "node": "PlanningIndividuels_graphique",
  157.             "json": {
  158.                 "giTypeHorairesXL": "1",
  159.                 "giTypeCouleursPlanIndividuel": "2",
  160.                 "gbImprPlanInclActivit\u00e9s": "on",
  161.                 "gbImprPlanInclAbsences": "on",
  162.                 "gbImprPlanInclAbsencesStd": "on",
  163.                 "gbImprPlanInclPr\u00e9sences": "on",
  164.                 "gbLibell\u00e9ExclNomPlanType": "off",
  165.                 "gbImprPlanningIndividuelUtiliseNomsCourts": "off",
  166.                 "gbImprPlanningIndividuelInclRemarque": "on",
  167.                 "gbPlanningsMultiplesInclD\u00e9butFin": "off",
  168.                 "gbPlanningsMultiplesInclEffectif": "off",
  169.                 "gbPlanningsMultiplesUnePageParJour": "off"
  170.             }
  171.         }]
  172. EOT;
  173. //        $this->setParamètre("EditionFavoriJson", $set, "MU");
  174.         $this->setParamètre("EditionFavoriJson""""MU");
  175.     }
  176.     // LG 20190626 déplacé de DefaultController
  177.     public function editAction(request $request$pvSemaine$psLstRes) {
  178. // $this->tmp_ClearFavoris() ;
  179.         if ($this->RedirectIfNotGranted($request$this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
  180.             return $response;
  181.         if ($this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
  182.             $lsLstTypesRes "@Tous@";
  183.         } else if ($this->get('security.authorization_checker')->isGranted('ROLE_ENSEIGNANT')) {
  184. // LG 20240827 old            $lsLstTypesRes = "GI";
  185.             $lsLstTypesRes "G,I";
  186.         } else {
  187.             $lsLstTypesRes "G";
  188.         }
  189.         $m $this->getDoctrineManager();
  190.         if ($_SERVER['REQUEST_METHOD'] === 'POST') {  //Si un boutton est utilisé
  191.             $all $request->request->all();  //Récupération des élément passé en POST
  192.             if (isset($_POST['btnSubmit'])) {
  193.                 // On a cliqué sur le bouton "Enregistrer"
  194.                 foreach ($all as $key => $val) {
  195.                     if ($val == 'on' || $val == "off") {
  196.                         //Vérification si la valeur de retour est "on" ou "off" c'est alors un checkbox, sinon c'est un select
  197.                         $this->setParamètre($key$val"L");
  198.                     } elseif (substr($key02) == "gb") {
  199.                         $this->setParamètre($key$val"NU");
  200.                     }
  201.                 }
  202.             } elseif (isset($_POST['btnFavoris'])) {
  203.                 // On a cliqué sur le boutton "Mettre en Favoris"
  204.                 $json $this->Favoris_requestToJSON($request);
  205.                 $this->Favoris_EnregistreFavori($json);
  206.             } elseif (isset($_POST['btnSubmitFavori'])) {  //Si le bouton de mise a jour des favoris est utilisé
  207.                 $json $this->Favoris_requestToJSON($request);
  208.                 $this->Favoris_EnregistreFavori($json);
  209.             }
  210.         }
  211.         $loCnxn $this->getDoctrineConnection();
  212.         $bddGet $this->getParamètre("EditionFavoriJson""""MU");
  213.         $bddGetTwig json_decode($bddGettrue);
  214.         if ($bddGetTwig) {
  215.             $countBddGet count($bddGetTwig);
  216.         } else {
  217.             $countBddGet 0;
  218.         }
  219.         $jsonTwig = array();
  220.         for ($i 0$i != $countBddGet$i++) {
  221.             $jsonTwig[] = ['id' => $bddGetTwig[$i]["id"]
  222.                 , 'nom' => $bddGetTwig[$i]["nom"]
  223.                 , 'node' => $bddGetTwig[$i]["node"]
  224.             ];  // Récupération de tout les favoris
  225.         }
  226. // LG 20220908 début
  227. //         $laOptions = array('pdDateDébut' => date('Y-m-d', strtotime('monday this week')),
  228. //             'pdDateFin' => date('Y-m-d', strtotime('next sunday')),
  229. //             'psLstRes' => $psLstRes,
  230. //             'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
  231. //             'psDataNodes' => $jsonTwig
  232. //         );
  233.         $laOptions = array('psLstRes' => $psLstRes,
  234.             'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
  235.             'psDataNodes' => $jsonTwig
  236.         );
  237. // LG 20220908 fin
  238.         $this->fillOptionsPourRenderEnTeteMenu($laOptions$request);
  239.         // Effectuer les traitements pour l'affichage
  240.         return $this->render('@Paa/Default/edit.html.twig'$laOptions);
  241.     }
  242.     // Renvoyer le json d'un favori
  243.     private function Favoris_requestToJSON($request$psName null) {
  244.         $all $request->request->all();  //Récupération des éléments passé en POST
  245.         $node $all['node'];
  246.         if (isset($all['idFavori'])) {
  247.             $id $all['idFavori'];
  248.         } else {
  249.             $id uniqid();
  250.         }
  251.         if ($psName) {
  252.             $name $psName;
  253.         } else if (isset($all['nomFavori'])) {
  254.             $name $all['nomFavori'];
  255.         } else {
  256.             $name $node "_" $id;
  257.         }
  258.         unset($all["idFavori"]);
  259.         unset($all["nomFavori"]);
  260.         unset($all["favori"]);
  261.         unset($all["node"]);
  262.         unset($all["btnFavoris"]);
  263.         unset($all["urlConfig"]);
  264.         $loJson = array('id' => $id
  265.             'nom' => $name
  266.             'node' => $node
  267.             'json' => $all);
  268.         return $loJson;
  269.     }
  270.     // Enregistrer un favori
  271.     private function Favoris_EnregistreFavori($favori) {
  272.         $lsFavorisActuels $this->getParamètre("EditionFavoriJson""""MU");
  273.         if ($lsFavorisActuels) {
  274.             // Il y a déja des favoris
  275.             $laFavorisActuels $lsFavorisActuels json_decode($lsFavorisActuelstrue) : "";
  276.             $exist ExistsInArray($laFavorisActuels'id'$favori['id']);
  277.         } else {
  278.             // Il n'y a pas encore de favoris
  279.             $laFavorisActuels = array();
  280.             $exist null;
  281.         }
  282.         $laFavorisActuels[is_numeric($exist) ? $exist count($laFavorisActuels)] = $favori;
  283.         $lsFavorisNouveau json_encode($laFavorisActuels);  //tableau d'un objet Json 
  284.         $this->setParamètre("EditionFavoriJson"$lsFavorisNouveau"MU");
  285.     }
  286.     public function GetFavorisAction($psId) {
  287.         $loCnxn $this->getDoctrineConnection();
  288.         $bdd = new cParametresBDD($loCnxn);
  289.         $bddGet $bdd->getParamètre("EditionFavoriJson""""MU"); //Récuperation des favoris
  290.         $jsonDecode json_decode($bddGet);
  291.         $jsonCount count($jsonDecode);
  292.         $twig "EditionNonTrouvée";
  293.         $laOptions = array();
  294.         for ($i 0$i != $jsonCount$i++) {
  295.             $loFavori $jsonDecode[$i];
  296.             if (isset($loFavori->id) && $loFavori->id == $psId) {  //Si l'id d'un des favori est égale a l'id en paramêtre
  297.                 foreach ($loFavori as $key => $value) {
  298.                     $formulaire[$key] = $value;  // Création du tableau associatif
  299.                 }
  300.                 if (!isset($formulaire['node']) || !$formulaire['node']) {
  301.                     // Information inexistante ou vide ?
  302.                     break;
  303.                 }
  304.                 $twig $formulaire['node'];
  305.                 $objCount count($loFavori->json);
  306.                 $CheckerOrNotEdition = new EditionsWidgetFactory($loCnxn);
  307.                 $CheckerOrNotEdition->setjsonPredefini($loFavori->json); //Complétion de l'attribut jsonPredefini
  308.                 $laOptions = array('psNomFav' => $loFavori->nom,
  309.                     'psIdFav' => $loFavori->id,
  310.                     'poParametre' => $bdd/* new cParametresBDD($loCnxn) */,
  311.                     'poConstantesEditions' => new Paa_Constantes_Editions(),
  312.                     'poWidgetFactory' => $CheckerOrNotEdition,
  313.                     'psNode' => $formulaire['node']
  314.                 );
  315.                 break;
  316.             }
  317.         }
  318.         return $this->optionEditionsController($request$twig '.html.twig'"5"$laOptions);
  319.     }
  320.     public function retour($twig) {
  321.         optionEditionsController($request'PlanningIndividuels_axe.html.twig');
  322.     }
  323.     private function IndexSelect(string $valuestring $modelstring $tvalue) {
  324. // LG 20200513 old        $m = $this->getDoctrine()->getManager();
  325.         $m $this->getDoctrineManager();
  326. // LG 20200513 old        $loCnxn = $this->getDoctrine()->getConnection();
  327.         $loCnxn $this->getDoctrineConnection();
  328.         $poParametre = new cParametreBDD($loCnxn);
  329.         $resultat $poParametre->getParamètre($value$model$tvalue);
  330.         $ligne explode("\n"$resultat);
  331.         $nbligne 0;
  332.         do {
  333.             $index explode(":"$ligne[$nbligne]);
  334.             $nbligne++;
  335.         } while ($nbligne <= $ligne);
  336.         return $index;
  337.     }
  338.     // --------------------------------------------------------------------------------------------------------------------
  339.     private function créeObjetParamètres() {
  340.         $loParamètres = array();
  341.         $loParamètres['gsLogiciel'] = "'PAA'";
  342.         $loParamètres['gcPDF_PostScriptPrinter'] = "'Limoog Virtual Printer'";
  343.         $loParamètres['gsVersion'] = "'cServiceImpresion " lg_getenv("paa_version") . "'";
  344.         $loParamètres['gsDateVersion'] = "'" lg_getenv("paa_version_date") . "'";
  345.         $loParamètres['gsNomEtablissement'] = "'Nom de l établissement non disponible'";
  346.         $loParamètres['gbCléAutoriseDossierUsager'] = ".F.";
  347.         $loParamètres['gvDateDébutDataPAA'] = "{^1951-01-01}";
  348.         $loParamètres['gbUtiliseSemaineCivile'] = ".T.";
  349.         return $loParamètres;
  350.     }
  351.     // --------------------------------------------------------------------------------------------------------------------
  352.     private function getJSON_ConfigBDD() {
  353.         $host lg_getenv('doctrine_database_host');
  354.         $port lg_getenv('doctrine_database_port');
  355.         $dbname lg_getenv('doctrine_database_name');
  356.         $user lg_getenv('doctrine_database_user');
  357.         $password lg_getenv('doctrine_database_password');
  358.         if(empty($host) || empty($port) || empty($dbname) || empty($user) || empty($password)) {
  359.             echo $OnNeDevraitPlusPasserIci;
  360.             $o = new Dotenv() ;
  361.             // Astuce malpropre pour résoudre le pb de mauvaise lecture des variables d'environnement dans le cas des éditions multiples
  362.             $lsFichEnv realpath('../.env.local') ;
  363.             $o->load($lsFichEnv) ;
  364.             $host lg_getenv('doctrine_database_host');
  365.             $port lg_getenv('doctrine_database_port');
  366.             $dbname lg_getenv('doctrine_database_name');
  367.             $user lg_getenv('doctrine_database_user');
  368.             $password lg_getenv('doctrine_database_password');
  369.         }
  370.         if (strpos($password"[") || strpos($password"]") || strpos$password"{") || strpos($password"}")) {
  371.             throw new \Exception("Note aux développeurs : Le mot de passe de la base de données ne devrait pas contenir de caractères [ ou ] ou { ou }, cars ils perturbent le décodage du JSON fourni au service d'impression") ;
  372.         }
  373.         $lsJSONConfigBDD '{"SERVER": "' $host '", "PORT": "' $port '", "DATABASE": "' $dbname '", "UID": "' $user '", "PWD": "' $password '", "SSL": "0"}';  // BDD sur serveur Debian prod, pour VM XP sur serveur debian test impression
  374.         return $lsJSONConfigBDD;
  375.     }
  376.     // --------------------------------------------------------------------------------------------------------------------
  377.     // $url         : l'URL qu'on cherche à atteindre
  378.     // $data        : les données à transmettre en POST
  379.     //($timeout)    : le timeout en secondes
  380.     private function file_post_contents($url$data$timeout) {
  381.         if ($timeout) {
  382.             // Forcer le timeout du serveur d'impression
  383.             $data["timeout"] = $timeout ;
  384.         }
  385.         $postdata http_build_query($data);
  386.         $opts = array('http' =>
  387.             array(
  388.                 'method' => 'POST',
  389.                 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
  390.                 'content' => $postdata
  391.             )
  392.         );
  393.         if ($timeout) {
  394.             // Mémoriser les timeouts actuels
  395.             $liOld_max_execution_time ini_get("max_execution_time") ; // LG 20220202
  396.             // Définir le timeout de la requête sortante
  397.             $opts["http"]["timeout"] =  $timeout ;
  398.         }
  399.         $context stream_context_create($opts);
  400.         try {
  401.             $start_time microtime(true);
  402.             $lsReponse file_get_contents($urlfalse$context);
  403.         } catch (\Exception $e) {
  404.             $execution_time = (microtime(true) - $start_time); 
  405.             $lsReponse $e->getMessage() ;
  406.         }
  407.         // Restaurer les timeouts précédents
  408.         return $lsReponse ;
  409.     }
  410.     // Méthode de lancement d'une édition
  411.     public function DoEditionsAction(request $request) {
  412.     
  413.         $lsURLServeur lg_getenv("URL_SERVEUR_EDITIONS"); 
  414.         if(empty($lsURLServeur))
  415.         {
  416.             // Astuce malpropre pour résoudre le pb de mauvaise lecture des variables d'environnement dans le cas des éditions multiples
  417.             $lsFichEnv realpath('../.env.local') ;
  418.             $o = new Dotenv() ;
  419.             $o->load($lsFichEnv) ;
  420.             $lsURLServeur lg_getenv("URL_SERVEUR_EDITIONS");
  421.         }
  422.         if ($this->RedirectIfNotGranted($request$this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
  423.             return $response;
  424.         
  425.         $laTabEditions $request->request->all();
  426. // LG 20231201 début
  427.         if (isset($laTabEditions["bInterditSemaineType"]) && $laTabEditions["bInterditSemaineType"]) {
  428.             // On interdit cette éditions dans le cas d'une semaine-type
  429.             if (estSemaineType($laTabEditions["datedébut"]) || estSemaineType($laTabEditions["datefin"])) {
  430.                 $lsReponse "Désolé, cette édition n'est pas disponible dans le cas des semaines-types." ;
  431.                 return new response($lsReponse);
  432.             }
  433.         }
  434. // LG 20231201 fin
  435.         $lsURLServeur lg_getenv("URL_SERVEUR_EDITIONS");
  436.         $lsAction "DoEditions";
  437.         $lsExecuter = isset($_POST["executer"])?$_POST["executer"]:"Télécharger le résultat";
  438.         $lbModeDebug = isset($_POST["debug"])?$_POST["debug"]:false;
  439.         $lsNiveauLog = isset($_POST["niveauLog"]) ? $_POST["niveauLog"] : eiNiveauLog_ToutSaufData;
  440.         $lsNomEtablissement = isset($_POST["nomEtablissement"]) ? $_POST["nomEtablissement"] : "non précisé";
  441.         if ($lsExecuter) {
  442.             // Essayer de contacter le serveur d'impression pour savoir s'il répond
  443.             $lsURL "http://" $lsURLServeur "ServiceImpressionVFP.php" ;
  444.             $lsReponse $this->file_post_contents($lsURL, array("testService" => true), 1);     // timeout de 1 seconde
  445.             if (substr($lsReponse04) !== "OK") {
  446.                 // Le test a échoué : pas la peine de lancer la vraie requête
  447.                 $lsExecuter false ;
  448.                 $lsReponse "Err Impossible de contacter le serveur d'impression : " str_replace("Warning:"""$lsReponse) ;
  449.             }
  450.         } else {
  451.             $lsReponse "";
  452.         }
  453.         
  454.         if ($lsExecuter) {
  455.             $lsJSON $this->getJSON($lsAction$laTabEditions$this);
  456.             $laData = array("action" => $lsAction
  457.                 "data" => $lsJSON
  458.                 "debug" => $lbModeDebug
  459.                 "niveauLog" => $lsNiveauLog
  460.                     );
  461.             // Puisque le service a répondu plus haut sur une requête rapide, on peut essayer maintenant de lui demander le vrai traitement, avec un grand timeout pour lui laisser le temps de traiter
  462.             $lsReponse $this->file_post_contents($lsURL $laData300);     // timeout de 300 secondes = 5 minutes
  463. // Pour tests sleep(1) ;
  464.         }
  465.         if ($lsReponse) {
  466.             // Interpréter la réponse du serveur
  467.             if (substr($lsReponse011) == 'Err Message'
  468.                 || substr($lsReponse023) == "Err Erreur lors de l'ex") {
  469.                 
  470.                 $this->Log("Erreur du serveur d'impression : " utf8_encode($lsReponse));
  471.                 // Le serveur d'impression a réncontré une erreur
  472.                 throw new \Exception("Erreur du serveur d'impression : " utf8_encode($lsReponse) . "Url: " "\n" "BDD: " "\n" "Login User: ") ;
  473.             } else if (substr($lsReponse04) == "Err ") {
  474.                 // Le serveur d'impression n'a rien trouvé à éditer
  475.                 $this->Log(utf8_encode(substr($lsReponse4)));
  476.                 throw new \Exception(utf8_encode(substr($lsReponse4))) ;
  477.             } else if ($lsExecuter === "Télécharger le résultat") {
  478.                 // On a demandé le téléchargement : la réponse est un stream fichier + les 4 premiers caractères pour indiquer le type de fichier
  479.                 $lsType substr($lsReponse04);
  480.                 $lsType str_replace(' '''$lsType);
  481.                 $lsReponse substr($lsReponse4);
  482.                 if ($lbModeDebug) {
  483.                     $lsReponse "Attention, en mode debug, le fichier généré contient les informations du log du serveur. Il ne peut plus être correctement interprété comme un PDF, un Excel, ...<br>\r\n" 
  484.                                 $lsReponse ;
  485.                 }
  486.                 $lsFileName $this->rtvNomFichEdition($laTabEditions$lsType);
  487.                 $newResponse = new response($lsReponse);
  488.                 $newResponse->headers->add([
  489.                     'Content-type' => 'application/octet-stream',
  490.                     'Content-disposition' => 'attachment;filename="' $lsFileName '"',
  491.                 ]);
  492.                 return $newResponse;
  493.             } else {
  494.                 // Cas non prévu
  495.                 echo $lsReponse?:"Erreur imprévue";
  496.             } 
  497.         }
  498.         return new response;
  499.     }
  500.     // --------------------------------------------------------------------------------------------------------------------
  501.     // LG 20220321, déplacé de inline
  502.     protected function getJSON($psAction$paTabEditions$poController) {
  503.         if ($psAction === "DoEditions") {
  504. // LG 20220321 old            return getJSON_DoEditions($paTabEditions, $poController);
  505.             return $this->getJSON_DoEditions($paTabEditions$poController);
  506.         } else {
  507.             return "{}";
  508.         }
  509.     }
  510.     // --------------------------------------------------------------------------------------------------------------------
  511.     // LG 20220321, déplacé de inline
  512.     protected function getJSON_DoEditions($paTabEditions$poController) {
  513. // LG 20210819 début                    
  514.         if (!isset($paTabEditions["typeedition1"]) || !$paTabEditions["typeedition1"]) {
  515.             throw new \Exception("Le paramètre typeedition1 n'est pas fourni : il est indispensable");
  516.         }
  517. // LG 20210819 fin                    
  518.         $lsJSONConfigBDD $this->getJSON_ConfigBDD();
  519.         $loParamètres $this->créeObjetParamètres();
  520.         // Liste des noms de paramètres selon leur type attendu dans VFP
  521.         $ignoreValue = array('nomBase''bInterditSemaineType');
  522.         $ignoreParametre = array('gcEditionsRapport_SelectionAB''gcEditionsRapport_SelectionSGAB''gcEditionsRapport_SelectionGAB');
  523.         $quoteValue = array('ctypehoraire''intervenants''lstjours'
  524.         'mGroupes''mSalles''mUsagers''donneesusager'); 
  525.         $quoteValue[] = 'ActivitésBase';
  526.         $quoteValue[] = 'gtfDocXL';
  527.         $quoteValue[] = 'OptGroupListingUsagers';
  528.         $quoteValue[] = 'GSCODEETABLISSEMENT';
  529.         $quoteValue[] = 'typeressource';
  530.         $quoteValue[] = 'gsModèlePlanXL';               // JM 20211222
  531.         $quoteValue[] = 'gsModèleSynhtèseAnnuelXL';
  532.         $quoteValue[] = 'fEntityForm_groupes_icouleur_T'// JM 20220201
  533.         $quoteValue[] = 'fEntityForm_groupes_icouleur_ST'// JM 20220201
  534.         $quoteValue[] = 'cboTaillePapier'// JM 20220208  
  535.         $quoteValue[] = 'etablissements'// JM 20220211
  536.         $quoteValue[] = 'mgroupes';         // LG 20240131
  537.         $quoteValue[] = 'gcTailleImprPlanningActivité'// JM 20220211
  538.         $quoteValue[] = 'typecouleur';   // JM 20220214
  539.         $quoteValue[] = 'couleurtitre';   // JM 20220214
  540.         $quoteValue[] = 'couleursoustitre';   // JM 20220214
  541.         $quoteValue[] = 'cboTypeCouleurs';   // JM 20220214
  542.         $quoteValue[] = 'activitéspasdansbilan'// JM 20220221
  543.         $quoteValue[] = 'gsLastFichPlanAnnéeXL'// JM 20220222
  544.         $quoteValue[] = 'gsplanxldest'// JM 20220222 
  545.         $quoteValue[] = 'gsFeuilleModèlePlanXL'// JM 20220222
  546.         $quoteValue[] = 'titre';  // JM 20220223
  547.         $quoteValue[] = 'soustitre';  // JM 20220223
  548.         $quoteValue[] = 'gtfFichDest'// JM 20220225
  549.         $quoteValue[] = 'txtCalendrierUsagers_Titre'// JM 20220225
  550.         $quoteValue[] = 'txtTitreCalendrierPersonnel'// JM 20220225
  551.         $quoteValue[] = 'txtSousTitreCalendrierPersonnel'// JM 20220225
  552.         $quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_NOMFICHIER'// JM 20220225
  553.         $quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_USAGERS_TITRE'// JM 20220225
  554.         $quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_TITRE'// JM 20220225
  555.         $quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_SOUSTITRE'// JM 20220225
  556.         $quoteValue[] = 'services'// JM 20220308
  557.         $quoteValue[] = 'gsCheminEditions'// JM 20220308
  558.         $quoteValue[] = 'absences'// JM 20220309
  559.         $quoteValue[] = 'clstcompteurs'// JM 20220311
  560.         $quoteValue[] = 'gsRécapAbsUsagersParCommentaire_Titre'// JM 20220525
  561.         $quoteValue[] = 'gcNomCaisse_EtablissementSoins'// JM 20220923
  562.         $quoteValue[] = 'gcNomCaisse_AideSociale'// JM 20220923
  563.         $quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_LSTABSENCES';
  564.         $quoteValue[] = 'gcRécapAbsUsagers_LstFlds';
  565.         $quoteValue[] = 'gsFichierRécapAbsJournalièresExcel';
  566.         $quoteValue[] = 'gsFichierExportUsagersExcel_Editions';     // LG 20240130
  567.         $quoteValue[] = 'gsLblUsager_dDate1';     // LG 20240130
  568.         $quoteValue[] = 'gsLblUsager_dDate2';     // LG 20240130
  569.         $quoteValue[] = 'gsLblUsager_dDate3';     // LG 20240130
  570.         $quoteValue[] = 'gsLblUsager_dDate4';     // LG 20240130
  571.         $noQuoteValue = array('destination''exclureintervenantsabsents''exclureusagersabsents'
  572.                         'typeedition1''typeedition2''semainedébut''semainefin''typeedition3''typehorairexl'
  573.                         'giRègleNomCourt_I''gitaillepoliceplanindividuel''gitaillepoliceminiplanindividuel'
  574.                         'gitaillepoliceplanMultiple''gitaillepoliceminiplanMultiple''girécaplargeur'
  575.                         'giTypeGradientPlanningPNG''giIntensitéGradientPlanningPNG''giNbSemAnnée');
  576.         $noQuoteValue[] = 'ExclureIntervenantsAbsents';    // Ligne pour les ajouts de LG
  577.         $noQuoteValue[] = 'giTypeListingUsagers' ;
  578.         $noQuoteValue[] = 'TypeHoraireXL' ;
  579.         $noQuoteValue[] = 'TypePrésence';                  // JM 20210917
  580.         $noQuoteValue[] = 'giTypeHorairesXL';                  // JM 20210923
  581.         $noQuoteValue[] = 'giSensImpressionPlanMultiple';                  // JM 20210923
  582.         $noQuoteValue[] = 'sensimpression';                     //JM 20220216
  583.         $noQuoteValue[] = 'giTypeCouleursPlanIndividuel';                  // JM 20210923
  584.         $noQuoteValue[] = 'txtTitre';                  // JM 20210923
  585.         $noQuoteValue[] = 'fEntityForm_groupes';                  // JM 20210923
  586.         $noQuoteValue[] = 'txtSousTitre';                  // JM 20210923
  587.         $noQuoteValue[] = 'EntityForm_groupes';                  // JM 20210923
  588.         $noQuoteValue[] = 'giSensImpressionGrille';                  // JM 20210923
  589.         $noQuoteValue[] = 'cboTypeImprPlanning';
  590.         $noQuoteValue[] = 'spnNbExemplaires';
  591.         $noQuoteValue[] = 'giTaillePolicePlanIndividuelXL'//JM 20220222
  592.         $noQuoteValue[] = 'typehoraire';            // JM 20220215
  593.         $noQuoteValue[] = 'giImprPrésencesIntervListingContinuTypeFiltreJours'// JM 20220224
  594.         $noQuoteValue[] = 'iPeriode'// JM 20220308
  595.         $noQuoteValue[] = 'giRécapAbsUsagersParCommentaire_Granularité'// JM 20220525
  596.         $noQuoteValue[] = 'ExclureUsagersAbsents';                          // LG 20240131
  597.         $dateValue = array("DuJourDe",'dtpDatePrésenceUsagers','dtpDatePrésenceUsagersFin'"AuJourDe"'datedébut''datefin');
  598.         $boolValue = array("gbGèreObjectifsUsagers""gbPlanningEcranActiBasesNomsLongs"
  599.         "gbPlanningEcranLibellesHTML""gbPlanningEcranLibellesVertical""inclureactivités",
  600.         "incluregroupeactivités""inclurerécaps""incluresousgroupeactivités""pbexclabsencesstandard",
  601.         "listingactivitésbase""listingGroupes""listingetablissements""ListingIntervenants""listingsalles",
  602.         "planningofficiel""gbListesUtiliseNomCourt""gsLblPlanTxtPiedPage""listingUsagers""inclureabscences",
  603.         "inclureprésences""gbUtiliseSécurité""CUSER""gbImprPlanningActivitéForceRecalcLibellé""gbPrésencesAbsencesGèreService",
  604.         "gbOptimise_EstRessourceSortie""optTout""optChoix""gbRécap_présences_RessourceU_graphAffTotaux""gbRécap_Présences_RessourceU_Graph_MontreHoraires",
  605.         "gbRécap_Présences_RessourceU_Graph_MontreHorairesEtAbsences");
  606.         // Traiter les éléments particuliets "Parametres" et "Config_Parametre"
  607.         if (isset($paTabEditions['Parametres'])) {
  608.             // L'élément "Parametres" contient les valeurs des parametres globaux qui seront passés à VFP
  609.             // Parcourir ce tableau pour l'ajouter à l'objet qui passera toutes ces valeurs au serveur VFP
  610.             foreach ($paTabEditions['Parametres'] as $key2 => $value2) {
  611.                 if (is_array($value2)) {
  612.                     // Cet élément est un tableau : le convertir en liste à séparateur virgule
  613.                     $value2 implode(','$value2) ;
  614.                     $paTabEditions['Parametres'][$key2] = $value2 ;
  615.                 }
  616.                 if (in_array($key2$ignoreParametre)) {
  617.                     continue ;
  618.                 }
  619.                 if (in_array($key2$boolValue)) {
  620.                     if(strtolower($value2) == "false") {
  621.                         $value2 ".F.";
  622.                     }
  623.                     else if(strtolower($value2) == "true") {
  624.                         $value2 ".T.";
  625.                     }
  626.                 }
  627.                 if (in_array($key2$quoteValue) && $key2 != "ActivitésBase") { 
  628.                     $value2 "'$value2'";
  629.                 }
  630.             $loParamètres[$key2] = $value2;
  631.             }
  632.         }
  633.         if (isset($paTabEditions['Parametres']) && isset($paTabEditions['Config_Parametre'])) {
  634.             // L'élément "Config_Parametre" contient les informations pour la mémorisation des paramètres globaux
  635.             // Parcourir ce tableau pour enregistrer chacun des paramètres globaux dont il contient les informations
  636.             foreach ($paTabEditions['Config_Parametre'] as $key2 => $value2) {
  637.                 $lsNomParamètre explode(","$key2)[0] ;
  638.                 $lsTypeParamètre trim(explode(","$key2)[1]) ;
  639.                 // Trouver la valeur à affecter à ce paramètre
  640.                 foreach ($paTabEditions['Parametres'] as $key3 => $value3) {
  641.                     if ($lsNomParamètre === $key3) {
  642.                         $lvValue $value3 ;
  643.                         // Enregistrer la paramètre
  644.                         $poController->setParamètre($lsNomParamètre$lvValue$lsTypeParamètre);
  645.                         break ;
  646.                     }
  647.                 }
  648.             }
  649.         }
  650.         
  651.         $i 0;
  652.         $lsJSONConfigEdition '[{';
  653.         foreach ($paTabEditions as $key => $value) {
  654.             if ($key == 'Parametres') {
  655.             } else if($key == 'Config_Parametre') {
  656.             } else {
  657.                 if (in_array($key$ignoreValue)) {
  658.                     continue;
  659.                 }
  660.                 if ($i 0) {
  661.                     $lsJSONConfigEdition .= ",";
  662.                 }
  663.                 if (substr($key03) == 'val') {//Si une clé contient 'val' dans ses 3 premiers caracteres c'est que l'input est créé par checkedornoteditons on doit donc lui retirer ces 3 caracteres pour qu'il soit reconnu
  664.                     $key substr($key3);
  665.                 }
  666.                 if (in_array($key$quoteValue)) {//Certaines valeurs nécéssitent ou non d'etre mise entre quote pour fonctionner on compare donc nos clés a un tableau pour savoir si elle doit etre mise entre quote ou non
  667.                     $lsJSONConfigEdition .= "\"$key\": \"$value\"";
  668.                 } else if (in_array($key$noQuoteValue)) {
  669.                     $lsJSONConfigEdition .= "\"$key\": $value";
  670.                 } else if (in_array($key$dateValue)) {
  671.                     $lsJSONConfigEdition .= "\"$key\": \"{^$value}\"";
  672.                 } else if (in_array($key$boolValue)) { 
  673.                     $lsJSONConfigEdition .= "\"$key\": \"$value\"";
  674.                 } else {
  675.                     throw new \Exception("Editions : ce champ n'est pas prévu : " $key);
  676.                 }
  677.                 $i++;
  678.             }
  679.         }
  680.         $lsJSONConfigEdition .= '}]';
  681.         // Paramètres 
  682.         if ($loParamètres) {
  683.             //        $lsJSONParamètres = json_encode($loParamètres, JSON_UNESCAPED_UNICODE + JSON_INVALID_UTF8_IGNORE) ;
  684.             $lsJSONParamètres json_encode($loParamètresJSON_UNESCAPED_UNICODE);
  685.             $lsJSONParamètres stripslashes($lsJSONParamètres) ;   // LG 20220920 : json_encode double les antislashes, il faut les dédoubler (par exemple, pour des chemins : les double-antislashes ne sont pas acceptés par Win XP)
  686.         } else {
  687.             $lsJSONParamètres "{}";
  688.         }
  689.         // JSON final
  690.         $lsJSON = <<<JSON
  691.         {"configEdition": "$lsJSONConfigEdition", 
  692.         "configBDD": "$lsJSONConfigBDD", 
  693.         "paramètres": "$lsJSONParamètres"}
  694.         JSON;
  695.         try {
  696.             if ($poController->estDevMode()) {
  697.                 if (file_exists("/home/luc/partage_win10/Poubelle/")) {
  698.                     // Ordinateur de Luc
  699.                     $jsonfile "/home/luc/partage_win10/Poubelle/json.txt";
  700.                 } else if (file_exists("C:\\Travail_Limoog\\fichierjson\\")) {
  701.                     // Ordinateur de Jules
  702.                     $jsonfile "C:\\Travail_Limoog\\fichierjson\json".date("Ymd-His").".txt";
  703.                 } else if (file_exists($poController->get('kernel')->getProjectDir() . "/var/log/editions/")) {
  704.                     // Serveur de recette dans lequel on a créé un répertoire spécifique
  705.                     $jsonfile $poController->get('kernel')->getProjectDir() . "/var/log/editions/json".date("Ymd-His").".txt";
  706.                 } else {
  707.                     $jsonfile "" ;
  708.                 }
  709.                 if ($jsonfile) {
  710.                     // On est sur l'ordinateur de Luc ou sur celui de Jules : enregistrer la configuration d'édition JSON dans un fichier
  711.                     file_put_contents($jsonfile$lsJSONLOCK_EX);
  712.                 }
  713.             }
  714.         } catch (\Exception $e) {
  715.             $poController->Log("Impossible de créer le fichier de débogage " $jsonfile " : " $e->getMessage()) ;
  716.         }
  717.         return $lsJSON;
  718.     }
  719. //LP 13/07/2021 ajout impression edition fin
  720.     // LG 20210817
  721.     // Retrouver le nom à donner à un fichier d'édition
  722.     protected function rtvNomFichEdition($paTabEditions$psExtension) {
  723.         $lsStem "";
  724.         if (isset($paTabEditions['nomBase']) && $paTabEditions['nomBase']) {
  725.             // On a fourni un nom de base non vide pour ce fichier
  726.             if ($lsStem) {
  727.                 $lsStem .= " ";
  728.             }
  729.             $lsStem .= $paTabEditions['nomBase'];
  730.         }
  731.         // Noms des ressources
  732.         $em $this->getDoctrineManager();
  733.         $repoRes $em->getRepository("PaaBundle:ressources");
  734.         $repoActiBases $em->getRepository("PaaBundle:actibases");
  735. // LG20220923 début
  736.         // if (isset($paTabEditions['intervenants']) && $paTabEditions['intervenants']) {
  737.         //     // On a fourni une liste d'intervenants non vide
  738.         //     if ($lsStem) {
  739.         //         $lsStem .= " ";
  740.         //     }
  741.         //     $lsStem .= $repoRes->rtvNomRessource_Std('I', $paTabEditions['intervenants']);
  742.         // }
  743.         // if (isset($paTabEditions['usagers']) && $paTabEditions['usagers']) {
  744.         //     // On a fourni une liste d'usagers non vide
  745.         //     if ($lsStem) {
  746.         //         $lsStem .= " ";
  747.         //     }
  748.         //     $lsStem .= $repoRes->rtvNomRessource_Std('U', $paTabEditions['usagers']);
  749.         // }
  750.         // if (isset($paTabEditions['groupes']) && $paTabEditions['groupes']) {
  751.         //     // On a fourni une liste de groupes non vide
  752.         //     if ($lsStem) {
  753.         //         $lsStem .= " ";
  754.         //     }
  755.         //     $lsStem .= $repoRes->rtvNomRessource_Std('G', $paTabEditions['groupes']);
  756.         // }
  757.         // if (isset($paTabEditions['salles']) && $paTabEditions['salles']) {
  758.         //     // On a fourni une liste de salles non vide
  759.         //     if ($lsStem) {
  760.         //         $lsStem .= " ";
  761.         //     }
  762.         //     $lsStem .= $repoRes->rtvNomRessource_Std('S', $paTabEditions['salles']);
  763.         // }
  764.         $lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes$paTabEditions"I""intervenants"$lsStem) ;
  765.         $lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes$paTabEditions"U""usagers"$lsStem) ;
  766.         $lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes$paTabEditions"G""groupes"$lsStem) ;
  767.         $lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes$paTabEditions"S""salles"$lsStem) ;
  768. // LG20220923 fin
  769.         // Tronquer à 200 caractères
  770.         if (strlen($lsStem) > 200) {
  771.             $lsStem substr($lsStem0197) . "..." ;
  772.         }
  773. // JM 20220825 début
  774.         // si activités
  775.         if(isset($paTabEditions['ActivitésBase']) && $paTabEditions['ActivitésBase']) {
  776.             $tabActibase explode(","$paTabEditions['ActivitésBase']);
  777.             if ($lsStem) {
  778.                 $lsStem .= " ";
  779.             }
  780.             $nbActi sizeof($tabActibase);
  781.             $nomPremiereActi trim($repoActiBases->find($tabActibase[0]), " ");
  782.             if($nbActi == 1) {
  783.                 $lsStem .= $nomPremiereActi;
  784.             } else {
  785.                 $lsStem .= $nomPremiereActi " + " $nbActi " activite(s) de base";
  786.             }
  787.         }
  788. // JM 20220825 fin
  789.         // Dates de début et de fin
  790.         if (isset($paTabEditions['datedébut']) && $paTabEditions['datedébut'] && isset($paTabEditions['datefin']) && $paTabEditions['datefin']) {
  791.             // On a fourni des dates de début et de fin
  792. //            $lsStem .= " du " . $paTabEditions['datedébut'] . " au " . $paTabEditions['datefin'] ;
  793.             $ldDebut $paTabEditions['datedébut'];
  794.             $ldDebut str_replace('{'''$ldDebut);
  795.             $ldDebut str_replace('}'''$ldDebut);
  796.             $ldDebut str_replace('^'''$ldDebut);
  797.             $ldFin $paTabEditions['datefin'];
  798.             $ldFin str_replace('{'''$ldFin);
  799.             $ldFin str_replace('}'''$ldFin);
  800.             $ldFin str_replace('^'''$ldFin);
  801.             if ($lsStem) {
  802.                 $lsStem .= " ";
  803.             }
  804. // LG 20220923 old            $lsStem .= RtvLblDuAu($ldDebut, $ldFin);
  805.             $lsDuAu RtvLblDuAu($ldDebut$ldFin);
  806.             $lsStem .= str_replace('/''_'$lsDuAu) ;
  807.         }
  808.         // Par défaut, si pas de nom calculé
  809.         if ($lsStem) {
  810.             // On a pu déterminer le nom du fichier : le rendre conforme à la norme (selon https://stackoverflow.com/questions/39404949/err-response-headers-multiple-content-disposition)
  811.             $lsStem str_replace(array('"'"'"' '','), '_'$lsStem);
  812.         } else if ($psExtension === "PNG") {
  813.             $lsStem "monPNG";
  814.         } else if ($psExtension === "PDF") {
  815.             $lsStem "monPDF";
  816.         } else if ($psExtension === "XLS" || $psExtension === "XLSX") {
  817.             $lsStem "monXL";
  818. // JM 20220222 ajout extenzion zip
  819.         } else if ($psExtension === "ZIP") {
  820.             $lsStem "monZIP";
  821.         } else {
  822.             $lsStem "monFichier";
  823.         }
  824.         // Valeur de retour
  825.         $lsFileName $lsStem "." $psExtension;
  826.         return $lsFileName;
  827.     }
  828.     // Retrouver la partie du nom de fichier concernant une ressource
  829.     // LG 20220923
  830.     protected function rtvNomFichEdition_getStemRessource($repoRes$paTabEditions$psTypeRes$psNomTypeRes$psStem) {
  831.         $lsStem "" ;
  832.         $lsLstRes "" ;
  833.         if (isset($paTabEditions[$psNomTypeRes]) && $paTabEditions[$psNomTypeRes]) {
  834.             // Le tableau paTabEditions contient des informations non vides sur la liste des ressources du type demandé
  835.             $lsLstRes .= $paTabEditions[$psNomTypeRes] ;
  836.         }
  837.         if (isset($paTabEditions["m" ucfirst($psNomTypeRes)]) && $paTabEditions["m" ucfirst($psNomTypeRes)]) {
  838.             // Le tableau paTabEditions contient des informations non vides sur la liste des ressources du type demandé (préfixé par "m")
  839.             $lsLstRes .= $paTabEditions["m" ucfirst($psNomTypeRes)] ;
  840.         }
  841.         if ($lsLstRes) {
  842.             // La liste des ressources demandées de ce type n'est pas vide
  843.             if ($psStem) {
  844.                 $lsStem .= " ";
  845.             }
  846.             $lsStem .= $repoRes->rtvNomRessource_Std($psTypeRes$lsLstRes);
  847.         }
  848.         return $lsStem ;
  849.     }
  850. }