<?php
namespace App\PaaBundle\Controller;
// LG 20231031 déac use App\PaaBundle\Controller\PAABaseController;
use App\PaaBundle\Controller\DefaultController;
// LG 20231031 déacuse App\PaaBundle\Component\Paa\Paa_Constantes;
// LG 20231031 déacuse App\Limoog\PartageBundle\Component\Limoog_Constantes;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; // LG 20180622
// use Symfony\Component\HttpFoundation\JsonResponse; // LG 20180622
// LG 20231031 déacuse Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
// LG 20231031 déacuse Symfony\Component\Routing\Router;
// LG 20231031 déacuse Symfony\Component\Security\Core\Exception\AccessDeniedException;
// LG 20231031 déacuse Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
// LG 20231031 déacuse Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
//use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
//use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route"
// LG 20231031 déacuse Symfony\Component\Routing\Annotation\Route;
use App\Limoog\PartageBundle\Component\cParametresBDD;
use App\PaaBundle\Component\Paa\Paa_Constantes_Editions;
use App\PaaBundle\Component\Paa\EditionsWidgetFactory;
// LG 20231031 déacuse App\PaaBundle\Entity\actiGroupesacti;
//MG Modification 20200218 Début
//Table actiRealisations renommer en seances
//use App\PaaBundle\Entity\actiRealisations;
// LG 20231031 déacuse App\PaaBundle\Entity\seances;
//MG Modification 20200218 Fin
// LG 20231031 déacuse App\PaaBundle\Entity\actiSsgroupesacti;
// LG 20231031 déacuse App\PaaBundle\Entity\actibases;
// LG 20231031 déacuse App\PaaBundle\Entity\activites;
// LG 20231031 déacuse App\PaaBundle\Entity\annees;
// LG 20231031 déacuse App\PaaBundle\Entity\caisses;
// LG 20231031 déacuse App\PaaBundle\Entity\caissesPersonnes;
// LG 20231031 déacuse App\PaaBundle\Entity\compteurs;
// LG 20231031 déacuse App\PaaBundle\Entity\conventions;
// LG 20231031 déacuse App\PaaBundle\Entity\etablissements;
// LG 20231031 déacuse App\PaaBundle\Entity\groupes;
// LG 20231031 déacuse App\PaaBundle\Entity\intervenants;
// LG 20231031 déacuse App\PaaBundle\Entity\joursferies;
// LG 20231031 déacuse App\PaaBundle\Entity\referents;
// LG 20231031 déacuse App\PaaBundle\Entity\salles;
// LG 20231031 déacuse App\PaaBundle\Entity\services;
// LG 20231031 déacuse App\PaaBundle\Entity\specialites;
// LG 20231031 déacuse App\PaaBundle\Entity\usagers;
// LG 20231031 déacuse App\PaaBundle\Security\PaaVoter;
// LG 20231031 déacuse phpDocumentor\Reflection\Types\Mixed_;
use Symfony\Component\Dotenv\Dotenv; // JM 20211029
class editionsController extends DefaultController {
// LG 20210817 : simplification de l'appel des écrans de choix des options
function getOptionsEditionsAction(Request $request, $psTwig) {
return $this->optionEditionsController($request, $psTwig . ".html.twig", null, null);
}
function optionEditionsController(Request $request, $twig, $psLstRes, $laOptions) { // Méthode de factorisation pour la déclaration des actions
if ($this->RedirectIfNotGranted($request, $this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
return $response;
if ($this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
$lsLstTypesRes = "@Tous@";
} else if ($this->get('security.authorization_checker')->isGranted('ROLE_ENSEIGNANT')) {
// LG 20240827 old $lsLstTypesRes = "GI";
$lsLstTypesRes = "G,I";
} else {
$lsLstTypesRes = "G";
}
$m = $this->getDoctrineManager(); // Récupérer le manager Doctrine
$loCnxn = $this->getDoctrineConnection();
// LG 20240612 déac $psNomTable = "paa_para";
if ($laOptions == null) {
$laOptions = array(
'poParametre' => new cParametresBDD($loCnxn),
'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
'poController' => $this, // Injecter le contrôleur
// 'psNomTable' => $twig // LG 20240612 : psTable avait disparu ????
);
} else {
throw new \Exception("On a fourni le tableau d'options : ce cas est-il géré ?");
}
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") {
// Liste des activités de base au format select HTML
$repoActiBases = $m->getRepository("PaaBundle:actibases");
$laOptions["psHTML_cboActiBases"] = $repoActiBases->getHTML_cboActiBases();
// Liste des sous-groupes d'activités de base au format select HTML
$laOptions["psHTML_cboSousGroupesActiBases"] = $repoActiBases->getHTML_cboActiBases_ParSousGroupes();
// Liste des groupes d'activités de base au format select HTML
$laOptions["psHTML_cboGroupesActiBases"] = $repoActiBases->getHTML_cboActiBases_ParGroupes();
}
if ($twig == "ListingsUsagers.html.twig") {
$repoGroupe = $m->getRepository("PaaBundle:groupes");
$repoEtablissements = $m->getRepository("PaaBundle:etablissements");
// $laOptions["poLstGroupes"] = $repoGroupe->getAllGroupesParents($exclureGroupesSysteme = true); OLD JM 20220225
$liEtablissement = $request->getSession()->get('iEtablissement');
$lsParamètres = "iEtablissement=$liEtablissement";
$repo = $m->getRepository("PaaBundle:groupes");
$loListeGroupes = $repo->findAllAvecParametres($lsParamètres);
$laOptions["poLstGroupes"] = $loListeGroupes;
$laOptions["poLstEtablissements"] = $repoEtablissements->getEtablissementExclude($exclureGroupesSysteme = true);
// Liste des groupes d'activités de base au format select HTML
}
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") {
$m = $this->getDoctrineManager();
$loListeEtablissements = $m->getRepository("PaaBundle:ressources")->findAllFiltrée("E");
$laOptions['paEtablissements'] = $loListeEtablissements;
}
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") {
$m = $this->getDoctrineManager();
$loListeService = $m->getRepository("PaaBundle:services")->findAll();
$laOptions['entityService'] = $loListeService;
}
if($twig == "PresencesIntervenants_Absencesparintervenants.html.twig") {
$m = $this->getDoctrineManager();
$loListeAbsence = $m->getRepository("PaaBundle:actibases")->rtvCurActiBasesAbsence("I");
$laOptions['entityAbsence'] = $loListeAbsence;
}
if($twig == "PresencesUsagers_Listingparcommentairesdabsences.html.twig" || $twig == "PresencesUsagers_Listingabsencesparusager.html.twig") {
$m = $this->getDoctrineManager();
$loListeAbsence = $m->getRepository("PaaBundle:actibases")->rtvCurActiBasesAbsence("U");
$laOptions['entityAbsence'] = $loListeAbsence;
}
if($twig == "PresencesIntervenants_Etatdescompteurs.html.twig") {
$m = $this->getDoctrineManager();
$loListeCompteur = $m->getRepository("PaaBundle:compteurs")->findAll();
$laOptions['entityCompteur'] = $loListeCompteur;
}
// Effectuer les traitements pour l'affichage
return $this->render('@Paa/editions/' . $twig, $laOptions);
}
// LG 20190626 pour debug
protected function tmp_ClearFavoris() {
$set = <<<EOT
[{
"id": "5d134eed7bbd0",
"nom": "Laine Klemp",
"node": "PlanningIndividuels_listing_ressources_semaines",
"json": {
"giTypeHorairesXL": "1",
"giTypeCouleursPlanIndividuel": "2",
"gbImprPlanInclActivit\u00e9s": "on",
"gbImprPlanInclAbsences": "on",
"gbImprPlanInclAbsencesStd": "on",
"gbImprPlanInclPr\u00e9sences": "on",
"gbLibell\u00e9ExclNomPlanType": "off",
"gbImprPlanningIndividuelUtiliseNomsCourts": "off",
"gbImprPlanningIndividuelInclRemarque": "on",
"gbPlanningsMultiplesInclD\u00e9butFin": "off",
"gbPlanningsMultiplesInclEffectif": "off",
"gbPlanningsMultiplesUnePageParJour": "off",
"cboTypeCouleurs": "2",
"gbPlanningListingInclutBilansParAB": "off",
"gbPlanningListingInclutBilansParCommentaire": "off"
}
}, {
"id": "5d134eff5079c",
"nom": "Georgianna Buresh",
"node": "PlanningIndividuels_graphique",
"json": {
"giTypeHorairesXL": "1",
"giTypeCouleursPlanIndividuel": "2",
"gbImprPlanInclActivit\u00e9s": "on",
"gbImprPlanInclAbsences": "on",
"gbImprPlanInclAbsencesStd": "on",
"gbImprPlanInclPr\u00e9sences": "on",
"gbLibell\u00e9ExclNomPlanType": "off",
"gbImprPlanningIndividuelUtiliseNomsCourts": "off",
"gbImprPlanningIndividuelInclRemarque": "on",
"gbPlanningsMultiplesInclD\u00e9butFin": "off",
"gbPlanningsMultiplesInclEffectif": "off",
"gbPlanningsMultiplesUnePageParJour": "off"
}
}]
EOT;
// $this->setParamètre("EditionFavoriJson", $set, "MU");
$this->setParamètre("EditionFavoriJson", "", "MU");
}
// LG 20190626 déplacé de DefaultController
public function editAction(request $request, $pvSemaine, $psLstRes) {
// $this->tmp_ClearFavoris() ;
if ($this->RedirectIfNotGranted($request, $this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
return $response;
if ($this->get('security.authorization_checker')->isGranted('ROLE_CONCEPTEUR')) {
$lsLstTypesRes = "@Tous@";
} else if ($this->get('security.authorization_checker')->isGranted('ROLE_ENSEIGNANT')) {
// LG 20240827 old $lsLstTypesRes = "GI";
$lsLstTypesRes = "G,I";
} else {
$lsLstTypesRes = "G";
}
$m = $this->getDoctrineManager();
if ($_SERVER['REQUEST_METHOD'] === 'POST') { //Si un boutton est utilisé
$all = $request->request->all(); //Récupération des élément passé en POST
if (isset($_POST['btnSubmit'])) {
// On a cliqué sur le bouton "Enregistrer"
foreach ($all as $key => $val) {
if ($val == 'on' || $val == "off") {
//Vérification si la valeur de retour est "on" ou "off" c'est alors un checkbox, sinon c'est un select
$this->setParamètre($key, $val, "L");
} elseif (substr($key, 0, 2) == "gb") {
$this->setParamètre($key, $val, "NU");
}
}
} elseif (isset($_POST['btnFavoris'])) {
// On a cliqué sur le boutton "Mettre en Favoris"
$json = $this->Favoris_requestToJSON($request);
$this->Favoris_EnregistreFavori($json);
} elseif (isset($_POST['btnSubmitFavori'])) { //Si le bouton de mise a jour des favoris est utilisé
$json = $this->Favoris_requestToJSON($request);
$this->Favoris_EnregistreFavori($json);
}
}
$loCnxn = $this->getDoctrineConnection();
$bddGet = $this->getParamètre("EditionFavoriJson", "", "MU");
$bddGetTwig = json_decode($bddGet, true);
if ($bddGetTwig) {
$countBddGet = count($bddGetTwig);
} else {
$countBddGet = 0;
}
$jsonTwig = array();
for ($i = 0; $i != $countBddGet; $i++) {
$jsonTwig[] = ['id' => $bddGetTwig[$i]["id"]
, 'nom' => $bddGetTwig[$i]["nom"]
, 'node' => $bddGetTwig[$i]["node"]
]; // Récupération de tout les favoris
}
// LG 20220908 début
// $laOptions = array('pdDateDébut' => date('Y-m-d', strtotime('monday this week')),
// 'pdDateFin' => date('Y-m-d', strtotime('next sunday')),
// 'psLstRes' => $psLstRes,
// 'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
// 'psDataNodes' => $jsonTwig
// );
$laOptions = array('psLstRes' => $psLstRes,
'poWidgetFactory' => new EditionsWidgetFactory($loCnxn),
'psDataNodes' => $jsonTwig
);
// LG 20220908 fin
$this->fillOptionsPourRenderEnTeteMenu($laOptions, $request);
// Effectuer les traitements pour l'affichage
return $this->render('@Paa/Default/edit.html.twig', $laOptions);
}
// Renvoyer le json d'un favori
private function Favoris_requestToJSON($request, $psName = null) {
$all = $request->request->all(); //Récupération des éléments passé en POST
$node = $all['node'];
if (isset($all['idFavori'])) {
$id = $all['idFavori'];
} else {
$id = uniqid();
}
if ($psName) {
$name = $psName;
} else if (isset($all['nomFavori'])) {
$name = $all['nomFavori'];
} else {
$name = $node . "_" . $id;
}
unset($all["idFavori"]);
unset($all["nomFavori"]);
unset($all["favori"]);
unset($all["node"]);
unset($all["btnFavoris"]);
unset($all["urlConfig"]);
$loJson = array('id' => $id
, 'nom' => $name
, 'node' => $node
, 'json' => $all);
return $loJson;
}
// Enregistrer un favori
private function Favoris_EnregistreFavori($favori) {
$lsFavorisActuels = $this->getParamètre("EditionFavoriJson", "", "MU");
if ($lsFavorisActuels) {
// Il y a déja des favoris
$laFavorisActuels = $lsFavorisActuels ? json_decode($lsFavorisActuels, true) : "";
$exist = ExistsInArray($laFavorisActuels, 'id', $favori['id']);
} else {
// Il n'y a pas encore de favoris
$laFavorisActuels = array();
$exist = null;
}
$laFavorisActuels[is_numeric($exist) ? $exist : count($laFavorisActuels)] = $favori;
$lsFavorisNouveau = json_encode($laFavorisActuels); //tableau d'un objet Json
$this->setParamètre("EditionFavoriJson", $lsFavorisNouveau, "MU");
}
public function GetFavorisAction($psId) {
$loCnxn = $this->getDoctrineConnection();
$bdd = new cParametresBDD($loCnxn);
$bddGet = $bdd->getParamètre("EditionFavoriJson", "", "MU"); //Récuperation des favoris
$jsonDecode = json_decode($bddGet);
$jsonCount = count($jsonDecode);
$twig = "EditionNonTrouvée";
$laOptions = array();
for ($i = 0; $i != $jsonCount; $i++) {
$loFavori = $jsonDecode[$i];
if (isset($loFavori->id) && $loFavori->id == $psId) { //Si l'id d'un des favori est égale a l'id en paramêtre
foreach ($loFavori as $key => $value) {
$formulaire[$key] = $value; // Création du tableau associatif
}
if (!isset($formulaire['node']) || !$formulaire['node']) {
// Information inexistante ou vide ?
break;
}
$twig = $formulaire['node'];
$objCount = count($loFavori->json);
$CheckerOrNotEdition = new EditionsWidgetFactory($loCnxn);
$CheckerOrNotEdition->setjsonPredefini($loFavori->json); //Complétion de l'attribut jsonPredefini
$laOptions = array('psNomFav' => $loFavori->nom,
'psIdFav' => $loFavori->id,
'poParametre' => $bdd/* new cParametresBDD($loCnxn) */,
'poConstantesEditions' => new Paa_Constantes_Editions(),
'poWidgetFactory' => $CheckerOrNotEdition,
'psNode' => $formulaire['node']
);
break;
}
}
return $this->optionEditionsController($request, $twig . '.html.twig', "5", $laOptions);
}
public function retour($twig) {
optionEditionsController($request, 'PlanningIndividuels_axe.html.twig');
}
private function IndexSelect(string $value, string $model, string $tvalue) {
// LG 20200513 old $m = $this->getDoctrine()->getManager();
$m = $this->getDoctrineManager();
// LG 20200513 old $loCnxn = $this->getDoctrine()->getConnection();
$loCnxn = $this->getDoctrineConnection();
$poParametre = new cParametreBDD($loCnxn);
$resultat = $poParametre->getParamètre($value, $model, $tvalue);
$ligne = explode("\n", $resultat);
$nbligne = 0;
do {
$index = explode(":", $ligne[$nbligne]);
$nbligne++;
} while ($nbligne <= $ligne);
return $index;
}
// --------------------------------------------------------------------------------------------------------------------
private function créeObjetParamètres() {
$loParamètres = array();
$loParamètres['gsLogiciel'] = "'PAA'";
$loParamètres['gcPDF_PostScriptPrinter'] = "'Limoog Virtual Printer'";
$loParamètres['gsVersion'] = "'cServiceImpresion " . lg_getenv("paa_version") . "'";
$loParamètres['gsDateVersion'] = "'" . lg_getenv("paa_version_date") . "'";
$loParamètres['gsNomEtablissement'] = "'Nom de l établissement non disponible'";
$loParamètres['gbCléAutoriseDossierUsager'] = ".F.";
$loParamètres['gvDateDébutDataPAA'] = "{^1951-01-01}";
$loParamètres['gbUtiliseSemaineCivile'] = ".T.";
return $loParamètres;
}
// --------------------------------------------------------------------------------------------------------------------
private function getJSON_ConfigBDD() {
$host = lg_getenv('doctrine_database_host');
$port = lg_getenv('doctrine_database_port');
$dbname = lg_getenv('doctrine_database_name');
$user = lg_getenv('doctrine_database_user');
$password = lg_getenv('doctrine_database_password');
if(empty($host) || empty($port) || empty($dbname) || empty($user) || empty($password)) {
echo $OnNeDevraitPlusPasserIci;
$o = new Dotenv() ;
// Astuce malpropre pour résoudre le pb de mauvaise lecture des variables d'environnement dans le cas des éditions multiples
$lsFichEnv = realpath('../.env.local') ;
$o->load($lsFichEnv) ;
$host = lg_getenv('doctrine_database_host');
$port = lg_getenv('doctrine_database_port');
$dbname = lg_getenv('doctrine_database_name');
$user = lg_getenv('doctrine_database_user');
$password = lg_getenv('doctrine_database_password');
}
if (strpos($password, "[") || strpos($password, "]") || strpos( $password, "{") || strpos($password, "}")) {
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") ;
}
$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
return $lsJSONConfigBDD;
}
// --------------------------------------------------------------------------------------------------------------------
// $url : l'URL qu'on cherche à atteindre
// $data : les données à transmettre en POST
//($timeout) : le timeout en secondes
private function file_post_contents($url, $data, $timeout) {
if ($timeout) {
// Forcer le timeout du serveur d'impression
$data["timeout"] = $timeout ;
}
$postdata = http_build_query($data);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => $postdata
)
);
if ($timeout) {
// Mémoriser les timeouts actuels
$liOld_max_execution_time = ini_get("max_execution_time") ; // LG 20220202
// Définir le timeout de la requête sortante
$opts["http"]["timeout"] = $timeout ;
}
$context = stream_context_create($opts);
try {
$start_time = microtime(true);
$lsReponse = file_get_contents($url, false, $context);
} catch (\Exception $e) {
$execution_time = (microtime(true) - $start_time);
$lsReponse = $e->getMessage() ;
}
// Restaurer les timeouts précédents
return $lsReponse ;
}
// Méthode de lancement d'une édition
public function DoEditionsAction(request $request) {
$lsURLServeur = lg_getenv("URL_SERVEUR_EDITIONS");
if(empty($lsURLServeur))
{
// Astuce malpropre pour résoudre le pb de mauvaise lecture des variables d'environnement dans le cas des éditions multiples
$lsFichEnv = realpath('../.env.local') ;
$o = new Dotenv() ;
$o->load($lsFichEnv) ;
$lsURLServeur = lg_getenv("URL_SERVEUR_EDITIONS");
}
if ($this->RedirectIfNotGranted($request, $this->get('security.authorization_checker')->isGranted('ROLE_USER'), $response))
return $response;
$laTabEditions = $request->request->all();
// LG 20231201 début
if (isset($laTabEditions["bInterditSemaineType"]) && $laTabEditions["bInterditSemaineType"]) {
// On interdit cette éditions dans le cas d'une semaine-type
if (estSemaineType($laTabEditions["datedébut"]) || estSemaineType($laTabEditions["datefin"])) {
$lsReponse = "Désolé, cette édition n'est pas disponible dans le cas des semaines-types." ;
return new response($lsReponse);
}
}
// LG 20231201 fin
$lsURLServeur = lg_getenv("URL_SERVEUR_EDITIONS");
$lsAction = "DoEditions";
$lsExecuter = isset($_POST["executer"])?$_POST["executer"]:"Télécharger le résultat";
$lbModeDebug = isset($_POST["debug"])?$_POST["debug"]:false;
$lsNiveauLog = isset($_POST["niveauLog"]) ? $_POST["niveauLog"] : eiNiveauLog_ToutSaufData;
$lsNomEtablissement = isset($_POST["nomEtablissement"]) ? $_POST["nomEtablissement"] : "non précisé";
if ($lsExecuter) {
// Essayer de contacter le serveur d'impression pour savoir s'il répond
$lsURL = "http://" . $lsURLServeur . "ServiceImpressionVFP.php" ;
$lsReponse = $this->file_post_contents($lsURL, array("testService" => true), 1); // timeout de 1 seconde
if (substr($lsReponse, 0, 4) !== "OK") {
// Le test a échoué : pas la peine de lancer la vraie requête
$lsExecuter = false ;
$lsReponse = "Err Impossible de contacter le serveur d'impression : " . str_replace("Warning:", "", $lsReponse) ;
}
} else {
$lsReponse = "";
}
if ($lsExecuter) {
$lsJSON = $this->getJSON($lsAction, $laTabEditions, $this);
$laData = array("action" => $lsAction
, "data" => $lsJSON
, "debug" => $lbModeDebug
, "niveauLog" => $lsNiveauLog
);
// 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
$lsReponse = $this->file_post_contents($lsURL , $laData, 300); // timeout de 300 secondes = 5 minutes
// Pour tests sleep(1) ;
}
if ($lsReponse) {
// Interpréter la réponse du serveur
if (substr($lsReponse, 0, 11) == 'Err Message'
|| substr($lsReponse, 0, 23) == "Err Erreur lors de l'ex") {
$this->Log("Erreur du serveur d'impression : " . utf8_encode($lsReponse));
// Le serveur d'impression a réncontré une erreur
throw new \Exception("Erreur du serveur d'impression : " . utf8_encode($lsReponse) . "Url: " . "\n" . "BDD: " . "\n" . "Login User: ") ;
} else if (substr($lsReponse, 0, 4) == "Err ") {
// Le serveur d'impression n'a rien trouvé à éditer
$this->Log(utf8_encode(substr($lsReponse, 4)));
throw new \Exception(utf8_encode(substr($lsReponse, 4))) ;
} else if ($lsExecuter === "Télécharger le résultat") {
// 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
$lsType = substr($lsReponse, 0, 4);
$lsType = str_replace(' ', '', $lsType);
$lsReponse = substr($lsReponse, 4);
if ($lbModeDebug) {
$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"
. $lsReponse ;
}
$lsFileName = $this->rtvNomFichEdition($laTabEditions, $lsType);
$newResponse = new response($lsReponse);
$newResponse->headers->add([
'Content-type' => 'application/octet-stream',
'Content-disposition' => 'attachment;filename="' . $lsFileName . '"',
]);
return $newResponse;
} else {
// Cas non prévu
echo $lsReponse?:"Erreur imprévue";
}
}
return new response;
}
// --------------------------------------------------------------------------------------------------------------------
// LG 20220321, déplacé de inline
protected function getJSON($psAction, $paTabEditions, $poController) {
if ($psAction === "DoEditions") {
// LG 20220321 old return getJSON_DoEditions($paTabEditions, $poController);
return $this->getJSON_DoEditions($paTabEditions, $poController);
} else {
return "{}";
}
}
// --------------------------------------------------------------------------------------------------------------------
// LG 20220321, déplacé de inline
protected function getJSON_DoEditions($paTabEditions, $poController) {
// LG 20210819 début
if (!isset($paTabEditions["typeedition1"]) || !$paTabEditions["typeedition1"]) {
throw new \Exception("Le paramètre typeedition1 n'est pas fourni : il est indispensable");
}
// LG 20210819 fin
$lsJSONConfigBDD = $this->getJSON_ConfigBDD();
$loParamètres = $this->créeObjetParamètres();
// Liste des noms de paramètres selon leur type attendu dans VFP
$ignoreValue = array('nomBase', 'bInterditSemaineType');
$ignoreParametre = array('gcEditionsRapport_SelectionAB', 'gcEditionsRapport_SelectionSGAB', 'gcEditionsRapport_SelectionGAB');
$quoteValue = array('ctypehoraire', 'intervenants', 'lstjours',
'mGroupes', 'mSalles', 'mUsagers', 'donneesusager');
$quoteValue[] = 'ActivitésBase';
$quoteValue[] = 'gtfDocXL';
$quoteValue[] = 'OptGroupListingUsagers';
$quoteValue[] = 'GSCODEETABLISSEMENT';
$quoteValue[] = 'typeressource';
$quoteValue[] = 'gsModèlePlanXL'; // JM 20211222
$quoteValue[] = 'gsModèleSynhtèseAnnuelXL';
$quoteValue[] = 'fEntityForm_groupes_icouleur_T'; // JM 20220201
$quoteValue[] = 'fEntityForm_groupes_icouleur_ST'; // JM 20220201
$quoteValue[] = 'cboTaillePapier'; // JM 20220208
$quoteValue[] = 'etablissements'; // JM 20220211
$quoteValue[] = 'mgroupes'; // LG 20240131
$quoteValue[] = 'gcTailleImprPlanningActivité'; // JM 20220211
$quoteValue[] = 'typecouleur'; // JM 20220214
$quoteValue[] = 'couleurtitre'; // JM 20220214
$quoteValue[] = 'couleursoustitre'; // JM 20220214
$quoteValue[] = 'cboTypeCouleurs'; // JM 20220214
$quoteValue[] = 'activitéspasdansbilan'; // JM 20220221
$quoteValue[] = 'gsLastFichPlanAnnéeXL'; // JM 20220222
$quoteValue[] = 'gsplanxldest'; // JM 20220222
$quoteValue[] = 'gsFeuilleModèlePlanXL'; // JM 20220222
$quoteValue[] = 'titre'; // JM 20220223
$quoteValue[] = 'soustitre'; // JM 20220223
$quoteValue[] = 'gtfFichDest'; // JM 20220225
$quoteValue[] = 'txtCalendrierUsagers_Titre'; // JM 20220225
$quoteValue[] = 'txtTitreCalendrierPersonnel'; // JM 20220225
$quoteValue[] = 'txtSousTitreCalendrierPersonnel'; // JM 20220225
$quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_NOMFICHIER'; // JM 20220225
$quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_USAGERS_TITRE'; // JM 20220225
$quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_TITRE'; // JM 20220225
$quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_SOUSTITRE'; // JM 20220225
$quoteValue[] = 'services'; // JM 20220308
$quoteValue[] = 'gsCheminEditions'; // JM 20220308
$quoteValue[] = 'absences'; // JM 20220309
$quoteValue[] = 'clstcompteurs'; // JM 20220311
$quoteValue[] = 'gsRécapAbsUsagersParCommentaire_Titre'; // JM 20220525
$quoteValue[] = 'gcNomCaisse_EtablissementSoins'; // JM 20220923
$quoteValue[] = 'gcNomCaisse_AideSociale'; // JM 20220923
$quoteValue[] = 'GCEDITIONS_CALENDRIERANNUELEXCEL_INTERVENANTS_LSTABSENCES';
$quoteValue[] = 'gcRécapAbsUsagers_LstFlds';
$quoteValue[] = 'gsFichierRécapAbsJournalièresExcel';
$quoteValue[] = 'gsFichierExportUsagersExcel_Editions'; // LG 20240130
$quoteValue[] = 'gsLblUsager_dDate1'; // LG 20240130
$quoteValue[] = 'gsLblUsager_dDate2'; // LG 20240130
$quoteValue[] = 'gsLblUsager_dDate3'; // LG 20240130
$quoteValue[] = 'gsLblUsager_dDate4'; // LG 20240130
$noQuoteValue = array('destination', 'exclureintervenantsabsents', 'exclureusagersabsents',
'typeedition1', 'typeedition2', 'semainedébut', 'semainefin', 'typeedition3', 'typehorairexl',
'giRègleNomCourt_I', 'gitaillepoliceplanindividuel', 'gitaillepoliceminiplanindividuel',
'gitaillepoliceplanMultiple', 'gitaillepoliceminiplanMultiple', 'girécaplargeur',
'giTypeGradientPlanningPNG', 'giIntensitéGradientPlanningPNG', 'giNbSemAnnée');
$noQuoteValue[] = 'ExclureIntervenantsAbsents'; // Ligne pour les ajouts de LG
$noQuoteValue[] = 'giTypeListingUsagers' ;
$noQuoteValue[] = 'TypeHoraireXL' ;
$noQuoteValue[] = 'TypePrésence'; // JM 20210917
$noQuoteValue[] = 'giTypeHorairesXL'; // JM 20210923
$noQuoteValue[] = 'giSensImpressionPlanMultiple'; // JM 20210923
$noQuoteValue[] = 'sensimpression'; //JM 20220216
$noQuoteValue[] = 'giTypeCouleursPlanIndividuel'; // JM 20210923
$noQuoteValue[] = 'txtTitre'; // JM 20210923
$noQuoteValue[] = 'fEntityForm_groupes'; // JM 20210923
$noQuoteValue[] = 'txtSousTitre'; // JM 20210923
$noQuoteValue[] = 'EntityForm_groupes'; // JM 20210923
$noQuoteValue[] = 'giSensImpressionGrille'; // JM 20210923
$noQuoteValue[] = 'cboTypeImprPlanning';
$noQuoteValue[] = 'spnNbExemplaires';
$noQuoteValue[] = 'giTaillePolicePlanIndividuelXL'; //JM 20220222
$noQuoteValue[] = 'typehoraire'; // JM 20220215
$noQuoteValue[] = 'giImprPrésencesIntervListingContinuTypeFiltreJours'; // JM 20220224
$noQuoteValue[] = 'iPeriode'; // JM 20220308
$noQuoteValue[] = 'giRécapAbsUsagersParCommentaire_Granularité'; // JM 20220525
$noQuoteValue[] = 'ExclureUsagersAbsents'; // LG 20240131
$dateValue = array("DuJourDe",'dtpDatePrésenceUsagers','dtpDatePrésenceUsagersFin', "AuJourDe", 'datedébut', 'datefin');
$boolValue = array("gbGèreObjectifsUsagers", "gbPlanningEcranActiBasesNomsLongs",
"gbPlanningEcranLibellesHTML", "gbPlanningEcranLibellesVertical", "inclureactivités",
"incluregroupeactivités", "inclurerécaps", "incluresousgroupeactivités", "pbexclabsencesstandard",
"listingactivitésbase", "listingGroupes", "listingetablissements", "ListingIntervenants", "listingsalles",
"planningofficiel", "gbListesUtiliseNomCourt", "gsLblPlanTxtPiedPage", "listingUsagers", "inclureabscences",
"inclureprésences", "gbUtiliseSécurité", "CUSER", "gbImprPlanningActivitéForceRecalcLibellé", "gbPrésencesAbsencesGèreService",
"gbOptimise_EstRessourceSortie", "optTout", "optChoix", "gbRécap_présences_RessourceU_graphAffTotaux", "gbRécap_Présences_RessourceU_Graph_MontreHoraires",
"gbRécap_Présences_RessourceU_Graph_MontreHorairesEtAbsences");
// Traiter les éléments particuliets "Parametres" et "Config_Parametre"
if (isset($paTabEditions['Parametres'])) {
// L'élément "Parametres" contient les valeurs des parametres globaux qui seront passés à VFP
// Parcourir ce tableau pour l'ajouter à l'objet qui passera toutes ces valeurs au serveur VFP
foreach ($paTabEditions['Parametres'] as $key2 => $value2) {
if (is_array($value2)) {
// Cet élément est un tableau : le convertir en liste à séparateur virgule
$value2 = implode(',', $value2) ;
$paTabEditions['Parametres'][$key2] = $value2 ;
}
if (in_array($key2, $ignoreParametre)) {
continue ;
}
if (in_array($key2, $boolValue)) {
if(strtolower($value2) == "false") {
$value2 = ".F.";
}
else if(strtolower($value2) == "true") {
$value2 = ".T.";
}
}
if (in_array($key2, $quoteValue) && $key2 != "ActivitésBase") {
$value2 = "'$value2'";
}
$loParamètres[$key2] = $value2;
}
}
if (isset($paTabEditions['Parametres']) && isset($paTabEditions['Config_Parametre'])) {
// L'élément "Config_Parametre" contient les informations pour la mémorisation des paramètres globaux
// Parcourir ce tableau pour enregistrer chacun des paramètres globaux dont il contient les informations
foreach ($paTabEditions['Config_Parametre'] as $key2 => $value2) {
$lsNomParamètre = explode(",", $key2)[0] ;
$lsTypeParamètre = trim(explode(",", $key2)[1]) ;
// Trouver la valeur à affecter à ce paramètre
foreach ($paTabEditions['Parametres'] as $key3 => $value3) {
if ($lsNomParamètre === $key3) {
$lvValue = $value3 ;
// Enregistrer la paramètre
$poController->setParamètre($lsNomParamètre, $lvValue, $lsTypeParamètre);
break ;
}
}
}
}
$i = 0;
$lsJSONConfigEdition = '[{';
foreach ($paTabEditions as $key => $value) {
if ($key == 'Parametres') {
} else if($key == 'Config_Parametre') {
} else {
if (in_array($key, $ignoreValue)) {
continue;
}
if ($i > 0) {
$lsJSONConfigEdition .= ",";
}
if (substr($key, 0, 3) == '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
$key = substr($key, 3);
}
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
$lsJSONConfigEdition .= "\"$key\": \"$value\"";
} else if (in_array($key, $noQuoteValue)) {
$lsJSONConfigEdition .= "\"$key\": $value";
} else if (in_array($key, $dateValue)) {
$lsJSONConfigEdition .= "\"$key\": \"{^$value}\"";
} else if (in_array($key, $boolValue)) {
$lsJSONConfigEdition .= "\"$key\": \"$value\"";
} else {
throw new \Exception("Editions : ce champ n'est pas prévu : " . $key);
}
$i++;
}
}
$lsJSONConfigEdition .= '}]';
// Paramètres
if ($loParamètres) {
// $lsJSONParamètres = json_encode($loParamètres, JSON_UNESCAPED_UNICODE + JSON_INVALID_UTF8_IGNORE) ;
$lsJSONParamètres = json_encode($loParamètres, JSON_UNESCAPED_UNICODE);
$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)
} else {
$lsJSONParamètres = "{}";
}
// JSON final
$lsJSON = <<<JSON
{"configEdition": "$lsJSONConfigEdition",
"configBDD": "$lsJSONConfigBDD",
"paramètres": "$lsJSONParamètres"}
JSON;
try {
if ($poController->estDevMode()) {
if (file_exists("/home/luc/partage_win10/Poubelle/")) {
// Ordinateur de Luc
$jsonfile = "/home/luc/partage_win10/Poubelle/json.txt";
} else if (file_exists("C:\\Travail_Limoog\\fichierjson\\")) {
// Ordinateur de Jules
$jsonfile = "C:\\Travail_Limoog\\fichierjson\json".date("Ymd-His").".txt";
} else if (file_exists($poController->get('kernel')->getProjectDir() . "/var/log/editions/")) {
// Serveur de recette dans lequel on a créé un répertoire spécifique
$jsonfile = $poController->get('kernel')->getProjectDir() . "/var/log/editions/json".date("Ymd-His").".txt";
} else {
$jsonfile = "" ;
}
if ($jsonfile) {
// On est sur l'ordinateur de Luc ou sur celui de Jules : enregistrer la configuration d'édition JSON dans un fichier
file_put_contents($jsonfile, $lsJSON, LOCK_EX);
}
}
} catch (\Exception $e) {
$poController->Log("Impossible de créer le fichier de débogage " . $jsonfile . " : " . $e->getMessage()) ;
}
return $lsJSON;
}
//LP 13/07/2021 ajout impression edition fin
// LG 20210817
// Retrouver le nom à donner à un fichier d'édition
protected function rtvNomFichEdition($paTabEditions, $psExtension) {
$lsStem = "";
if (isset($paTabEditions['nomBase']) && $paTabEditions['nomBase']) {
// On a fourni un nom de base non vide pour ce fichier
if ($lsStem) {
$lsStem .= " ";
}
$lsStem .= $paTabEditions['nomBase'];
}
// Noms des ressources
$em = $this->getDoctrineManager();
$repoRes = $em->getRepository("PaaBundle:ressources");
$repoActiBases = $em->getRepository("PaaBundle:actibases");
// LG20220923 début
// if (isset($paTabEditions['intervenants']) && $paTabEditions['intervenants']) {
// // On a fourni une liste d'intervenants non vide
// if ($lsStem) {
// $lsStem .= " ";
// }
// $lsStem .= $repoRes->rtvNomRessource_Std('I', $paTabEditions['intervenants']);
// }
// if (isset($paTabEditions['usagers']) && $paTabEditions['usagers']) {
// // On a fourni une liste d'usagers non vide
// if ($lsStem) {
// $lsStem .= " ";
// }
// $lsStem .= $repoRes->rtvNomRessource_Std('U', $paTabEditions['usagers']);
// }
// if (isset($paTabEditions['groupes']) && $paTabEditions['groupes']) {
// // On a fourni une liste de groupes non vide
// if ($lsStem) {
// $lsStem .= " ";
// }
// $lsStem .= $repoRes->rtvNomRessource_Std('G', $paTabEditions['groupes']);
// }
// if (isset($paTabEditions['salles']) && $paTabEditions['salles']) {
// // On a fourni une liste de salles non vide
// if ($lsStem) {
// $lsStem .= " ";
// }
// $lsStem .= $repoRes->rtvNomRessource_Std('S', $paTabEditions['salles']);
// }
$lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes, $paTabEditions, "I", "intervenants", $lsStem) ;
$lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes, $paTabEditions, "U", "usagers", $lsStem) ;
$lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes, $paTabEditions, "G", "groupes", $lsStem) ;
$lsStem .= $this->rtvNomFichEdition_getStemRessource($repoRes, $paTabEditions, "S", "salles", $lsStem) ;
// LG20220923 fin
// Tronquer à 200 caractères
if (strlen($lsStem) > 200) {
$lsStem = substr($lsStem, 0, 197) . "..." ;
}
// JM 20220825 début
// si activités
if(isset($paTabEditions['ActivitésBase']) && $paTabEditions['ActivitésBase']) {
$tabActibase = explode(",", $paTabEditions['ActivitésBase']);
if ($lsStem) {
$lsStem .= " ";
}
$nbActi = sizeof($tabActibase);
$nomPremiereActi = trim($repoActiBases->find($tabActibase[0]), " ");
if($nbActi == 1) {
$lsStem .= $nomPremiereActi;
} else {
$lsStem .= $nomPremiereActi . " + " . $nbActi . " activite(s) de base";
}
}
// JM 20220825 fin
// Dates de début et de fin
if (isset($paTabEditions['datedébut']) && $paTabEditions['datedébut'] && isset($paTabEditions['datefin']) && $paTabEditions['datefin']) {
// On a fourni des dates de début et de fin
// $lsStem .= " du " . $paTabEditions['datedébut'] . " au " . $paTabEditions['datefin'] ;
$ldDebut = $paTabEditions['datedébut'];
$ldDebut = str_replace('{', '', $ldDebut);
$ldDebut = str_replace('}', '', $ldDebut);
$ldDebut = str_replace('^', '', $ldDebut);
$ldFin = $paTabEditions['datefin'];
$ldFin = str_replace('{', '', $ldFin);
$ldFin = str_replace('}', '', $ldFin);
$ldFin = str_replace('^', '', $ldFin);
if ($lsStem) {
$lsStem .= " ";
}
// LG 20220923 old $lsStem .= RtvLblDuAu($ldDebut, $ldFin);
$lsDuAu = RtvLblDuAu($ldDebut, $ldFin);
$lsStem .= str_replace('/', '_', $lsDuAu) ;
}
// Par défaut, si pas de nom calculé
if ($lsStem) {
// 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)
$lsStem = str_replace(array('"', "'", ' ', ','), '_', $lsStem);
} else if ($psExtension === "PNG") {
$lsStem = "monPNG";
} else if ($psExtension === "PDF") {
$lsStem = "monPDF";
} else if ($psExtension === "XLS" || $psExtension === "XLSX") {
$lsStem = "monXL";
// JM 20220222 ajout extenzion zip
} else if ($psExtension === "ZIP") {
$lsStem = "monZIP";
} else {
$lsStem = "monFichier";
}
// Valeur de retour
$lsFileName = $lsStem . "." . $psExtension;
return $lsFileName;
}
// Retrouver la partie du nom de fichier concernant une ressource
// LG 20220923
protected function rtvNomFichEdition_getStemRessource($repoRes, $paTabEditions, $psTypeRes, $psNomTypeRes, $psStem) {
$lsStem = "" ;
$lsLstRes = "" ;
if (isset($paTabEditions[$psNomTypeRes]) && $paTabEditions[$psNomTypeRes]) {
// Le tableau paTabEditions contient des informations non vides sur la liste des ressources du type demandé
$lsLstRes .= $paTabEditions[$psNomTypeRes] ;
}
if (isset($paTabEditions["m" . ucfirst($psNomTypeRes)]) && $paTabEditions["m" . ucfirst($psNomTypeRes)]) {
// Le tableau paTabEditions contient des informations non vides sur la liste des ressources du type demandé (préfixé par "m")
$lsLstRes .= $paTabEditions["m" . ucfirst($psNomTypeRes)] ;
}
if ($lsLstRes) {
// La liste des ressources demandées de ce type n'est pas vide
if ($psStem) {
$lsStem .= " ";
}
$lsStem .= $repoRes->rtvNomRessource_Std($psTypeRes, $lsLstRes);
}
return $lsStem ;
}
}