<?php
namespace App\PaaBundle\Controller;
// LG 20231027 déac use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use App\PaaBundle\Security\PaaVoter;
// LG 20231027 déac use App\PaaBundle\Component\Paa\Paa_Constantes;
// LG 20220629 début
use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Component\Serializer\Serializer;
// LG 20231027 déac use Symfony\Component\Serializer\Annotation\MaxDepth;
// LG 20231027 déac use Symfony\Component\Serializer\Encoder\JsonEncode;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
// LG 20220629 fin
// LG 20221222 début (pour decomposeRessource)
$lsFich = dirname(dirname(__FILE__)) . '/Component/Paa/ressources.php';
require_once $lsFich;
// LG 20221222 fin
class RestController extends PAABaseController {
// Récupération du JSON des données d'une ligne d'une table
// Besoin de token : cf. \applicationPAA\app\config\security.yml
/**
* @Security("has_role('ROLE_USER')")
*/
// LG 20180622
public function getJSONEntityAction(Request $request, $psNomTable, $piId) {
if ($LoginResponse = $this->RedirectIfDisconnected($request, 'ROLE_USER', $request->headers->get('referer'))) {
// L'utilisateur en cours n'est pas authéntifié, ou sa session a expiré
// On retourne à la page appellante
return $LoginResponse;
}
$em = $this->getDoctrineManager();
$entity = $em->getRepository("PaaBundle:" . $psNomTable)->find($piId);
if ($entity !== null) {
$entity->setEntityManager($em);
}
$data = $this->get('serializer')->serialize($entity, 'json');
$response = new Response($data);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
// LG 20221219
public function getJSONPlanningAction(Request $request) {
if ($LoginResponse = $this->RedirectIfDisconnected($request, 'ROLE_USER', $request->headers->get('referer'))) {
// L'utilisateur en cours n'est pas authentifié, ou sa session a expiré
// On retourne à la page appellante
return $LoginResponse;
}
if (!$this->isGranted(PaaVoter::VOIR . "Planning")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour visualiser ces données"}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour visualiser ces données");
return $response;
}
$lsFich = dirname(dirname(__FILE__)) . '/Component/Paa/planning.php';
require_once $lsFich;
$lsQueryString = $request->getQueryString();
$loConnexion = $this->getDoctrineConnection();
$lbKO = !Planning_RtvJSONPlanning($lsQueryString, $loConnexion, $this, true, $lsData, $lsErreur);
$response = new Response($lsData);
if ($lbKO) {
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR, $lsErreur);
} else {
$response->headers->set('Content-Type', 'application/json');
}
return $response ;
}
// LG 20180622
// Récupération du JSON des données d'une ligne d'une table de ressources
// Besoin de token : cf. \applicationPAA\app\config\security.yml
public function getJSONEntitiesAction(Request $request, string $psNomTable, string $psParametres) {
if ($LoginResponse = $this->RedirectIfDisconnected($request, 'ROLE_USER', $request->headers->get('referer'))) {
// L'utilisateur en cours n'est pas authentifié, ou sa session a expiré
// On retourne à la page appellante
return $LoginResponse;
}
if (!$this->isGranted(PaaVoter::VOIR . $psNomTable)) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour visualiser ces données"}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour visualiser ces données");
return $response;
}
// Récupérer la liste des entités convertie en JSON
$lbKO = false ;
$lsErreur = "" ;
$lsData = $this->getJSONEntities($request, $psNomTable, $psParametres) ;
$response = new Response($lsData);
if ($lbKO) {
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR, $lsErreur);
} else {
$response->headers->set('Content-Type', 'application/json');
}
return $response;
}
// LG 20180622
// Récupération du JSON des données d'une ligne d'une table de ressources
public function getJSONEntities(Request $request, string $psNomTable, string $psParametres) {
$laIgnoredAttributes = [] ; // Liste des attributs qu'on a pas besoin de sérialiser
$laParametresPOST = $request->request->all() ;
$lbPourCbo = false ;
if (isset($laParametresPOST["pourCbo"]) && $laParametresPOST["pourCbo"]) {
// On demande un remplissage pour cbo
$lbPourCbo = true ;
// Si la demande concerne des intervenants/usagers/groupes/salles, forcer le passage comme si on demandait "Ressources"
if (in_array(ucwords($psNomTable), ["Intervenants", "Usagers", "Groupes", "Salles", "Etablissements"])) {
$psParametres = $psParametres?$psParametres."&":"" ;
$psParametres .= "cType_Res=" . strtoupper(substr($psNomTable, 0, 1)) ;
if (isset($laParametresPOST["selectedItem"]) && $laParametresPOST["selectedItem"]) {
// LG 20240826 début
// $psParametres .= "&cLstResForcées=" . $laParametresPOST["selectedItem"] ;
if (is_array($laParametresPOST["selectedItem"])) {
$lsLstResForcées = "" ;
foreach($laParametresPOST["selectedItem"] as $liId_Res) {
if ($lsLstResForcées) $lsLstResForcées .= "," ;
$lsLstResForcées .= $liId_Res ;
}
} else {
$lsLstResForcées = $laParametresPOST["selectedItem"] ;
}
$psParametres .= "&cLstResForcées=" . $lsLstResForcées ;
// LG 20240826 fin
}
$psNomTable = "Ressources" ;
}
}
$lbKO = false;
if (isset($request->query->all()["psNomTable"])) {
// On a fourni le nom de table dans le queryString
$psNomTable = $request->query->all()["psNomTable"] ;
}
if (ucwords($psNomTable) == 'Ressources' || ucwords($psNomTable) == 'RessourcesIgnoreParticipantes' || ucwords($psNomTable) == 'RessourcesPourActi') {
// Dans ce cas particulier, si iActi est défini dans les paramètres, il faut construire un JSON + complexe
// Cas obsolètes
if (ucwords($psNomTable) == 'RessourcesPourActi') {
// CAS OBSOLETE ????
$this->logAppelObsolète("getJSONEntitiesAction, psTable = 'RessourcesPourActi'") ; // LG 20221219
}
if (ucwords($psNomTable) == 'RessourcesIgnoreParticipantes') {
// CAS OBSOLETE ????
$this->logAppelObsolète("getJSONEntitiesAction, psTable = 'RessourcesIgnoreParticipantes'") ; // LG 20221219
}
// La fonction function ajax_FillcbcRessources fournit les paramètres en GET dans le queryString : on doit ajouter ces paramètres à ceux reçus éventuellement dans psParamètres
$lsQueryString = $request->getQueryString();
if ($lsQueryString) {
$psParametres = $lsQueryString . "&" . $psParametres ;
}
$laQueryString = array();
parse_str($lsQueryString, $laQueryString);
if (isset($laQueryString["iActi"]) && $laQueryString["iActi"] && !strpos($psParametres, "IgnoreIActi")) {
// Cas particulier
// On a fourni une activité : on va aussi vouloir
// * la liste des ressources compétentes ou participant à l'activité
// * la liste des ressources participant à l'activité
$lsJSONRessourcesCompétentes = $this->getJSONEntities($request, "Ressources", $psParametres . "&IgnoreIActi=1"); // Ajouter "IgnoreIActi=1" pour éviter la récurrence
$lsJSONRessourcesParticipantes = $this->getJSONEntities($request, "ParticipantsAActi", $psParametres);
$lsData = '{"Compétentes": ' . $lsJSONRessourcesCompétentes
. ', "Participantes": ' . $lsJSONRessourcesParticipantes . '}';
return $lsData ;
}
// // LG 20240826 début
// if (isset($laQueryString["cType_Res"]) && $laQueryString["cType_Res"] == "M") {
// // Cas particulier des matières
// $psNomTable = "matieres" ;
// $lbPourCbo = true ;
// }
// // LG 20240826 fin
}
// Récupérer le liste des entités
$entities = $this->getEntities($psNomTable, $psParametres);
if (ucwords($psNomTable) == 'Usagers') {
// Liste des usagers pour une combobox
// CAS OBSOLETE ????
$this->logAppelObsolète("getJSONEntitiesAction, psTable = 'Usagers'") ; // LG 20221219
$lbPourCbo = true ;
}
if ($lbPourCbo) {
$repo = $this->getDoctrineRepository("PaaBundle:" . $psNomTable) ;
// LG 20240826 début
// $laIgnoredAttributes = $repo->getAllFields($repo->getAllFieldsPourCbo()) ; // tous les champs inutiles pour les cbos
$loEntiteModele = null ;
if (count($entities)) $loEntiteModele = $entities[0] ;
$laIgnoredAttributes = $repo->getAllFields($repo->getAllFieldsPourCbo(), $loEntiteModele) ; // tous les champs inutiles pour les cbos
// LG 20240826 fin
}
if (isset($laParametresPOST["lstFlds"]) && $lsLstFlds = $laParametresPOST["lstFlds"]) {
$repo = $this->getDoctrineRepository("PaaBundle:" . $psNomTable) ;
$laFlds = explode(",", $lsLstFlds) ;
$laIgnoredAttributes = $repo->getAllFields($laFlds) ; // tous les champs inutiles pour les cbos
}
if (!isset($lsData)) {
// La chaine de caractères à renvoyer n'a pas encore été déterminée : la déterminer maintenant en sérialisant $entities
// certaines classes génèrent une référence circulaire (par exemple caisses référence contacts, qui références caisses, etc.)
// De plus, il faut ignorer certains attributs, qui ne sont pas accessibles dans ce contexte (par exemple, ceux qui demandent que l'entité connaisse son entityManager)
if (in_array(ucwords($psNomTable), ['Salles', 'Intervenants', 'Usagers', 'Groupes', 'Etablissements'])) {
// Inutile de récupérer les activités
$laIgnoredAttributes = array_merge($laIgnoredAttributes, ['activites', 'listeContrats']) ;
} else if (ucwords($psNomTable) == 'Caisses') {
$laIgnoredAttributes = array_merge($laIgnoredAttributes, ['listeContacts', 'type']) ; // Pour les caisses, on n'a pas besoin de ces attributs, qui chargent des sous-entités inutiles pour ce que l'on a à en faire pour l'instant
// LG 20240419 old } else if (ucwords($psNomTable) == 'CaissesPersonnes') {
} else if (ucwords($psNomTable) == 'Caissespersonnes') {
$laIgnoredAttributes = array_merge($laIgnoredAttributes, ['icaisse']) ; // Pour les contacts de caisses, on n'a pas besoin de ces attributs, qui chargent des sous-entités inutiles pour ce que l'on a à en faire pour l'instant
}
if (ucwords($psNomTable) =='Groupes') {
$laIgnoredAttributes = array_merge($laIgnoredAttributes, ['listeGroupesUsagers']) ;
}
$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$circularReferenceHandler = function ($object, $format, $context) {
return $object->getId();
};
$defaultContext = [
AbstractObjectNormalizer::CIRCULAR_REFERENCE_HANDLER => $circularReferenceHandler,
AbstractObjectNormalizer::CIRCULAR_REFERENCE_LIMIT => 1,
AbstractNormalizer::IGNORED_ATTRIBUTES => $laIgnoredAttributes
];
$normalizer = new ObjectNormalizer($classMetadataFactory, null, null, null, null, null, $defaultContext);
$serializer = new Serializer(array($normalizer), array(new JsonEncoder()));
$entitiesNormalized = $serializer->normalize($entities, null);
$lsData = $serializer->serialize($entitiesNormalized, 'json') ;
}
return $lsData ;
}
// MC 20201021
// recupere la semaine select et la valeur du checkbox pour le transmetre au repository qui sert a modifier la valeur de lValidee
// Appellé par la requette ajax apres le clic sur le bouton checkbox semaine validee
// Retoune le status, ok si l'action c'est bien passer et ko sinon
// LG 20240524 old public function setEtatSemaineAction(Request $request, $piSem, $pbValue) {
public function setEtatSemaineAction(Request $request, $piSem, $pbValue, $pbAutoriseCreation) {
if ($LoginResponse = $this->RedirectIfDisconnected($request, 'ROLE_USER', $request->headers->get('referer'))) {
// L'utilisateur en cours n'est pas authéntifié, ou sa session a expiré
// On retourne à la page appellante
return $LoginResponse;
}
$lbValue = ($pbValue && $pbValue === "true") ;
$lbSemaineNonCréée = false ;
// LG 20240612 début
// $lbOK = $this->getDoctrineRepository("PaaBundle:etablissementsSemaines")->valideSemaine($piSem, $lbValue, $pbAutoriseCreation, $lbSemaineNonCréée);
$lsMsgErr = "" ;
$lbOK = $this->getDoctrineRepository("PaaBundle:etablissementsSemaines")->valideSemaine($piSem, $lbValue, $pbAutoriseCreation, $lbSemaineNonCréée, $lsMsgErr);
// LG 20240612 fin
if ($lbOK) {
$lsJSONRep = '{"status": "ok"}' ;
} else if ($lbSemaineNonCréée) {
// La semaine n'est pas encore créée et on n'autorise pas la création automatique : il faut demander à l'utilisateur s'il confirme la création par défaut
$lsJSONRep = '{"Dialogue": {"Message": "La semaine à valider n\'est pas encore créée. Souhatez-vous la créer maintenant avec les options par défaut ?"'
. ', "Titre":"Valider la semaine"'
. ', "Boutons": [{"text":"OK", "id": "cmdParticipation", "focused": true, "Action":"valideSemaine_AvecCreation"}'
. ', {"text":"Annuler", "class":"cmdCancel", "id": "cmdAnnuler", "Action":"valideSemaine_Annule"}]}'
. ', "DemandeInitiale": ""'
. ', "DialogueEnCours": "ConfirmeSuppression"'
. '}';
} else {
// LG 20240612 old $lsJSONRep = '{"status": "ko"}' ;
$lsJSONRep = '{"status": "ko", "message": "' . $lsMsgErr . '"}' ;
}
$response = new Response($lsJSONRep, Response::HTTP_OK, array('content-type' => 'text/json'));
return $response;
}
// MC 20201211
// LG 20240528 old public function getStatutSemainesAction(Request $request, $pdDebut, $pdFin) {
// $pdDebut : date ou semaine de début
// $pdFin : date ou semaine de fin
// ($pbCheckLstClasses) : true pour vérifier aussi la liste des classes présentes (en comparaison avec ce qu'elle était lors de la création éventuelle)
public function getStatutSemainesAction(Request $request, $pdDebut, $pdFin, $pbCheckLstClasses = false) {
if ($LoginResponse = $this->RedirectIfDisconnected($request, 'ROLE_USER', $request->headers->get('referer'))) {
// L'utilisateur en cours n'est pas authéntifié, ou sa session a expiré
// On retourne à la page appellante
return $LoginResponse;
}
// LG 20240528 old $laStatuValid = $this->getDoctrineRepository("PaaBundle:etablissementsSemaines")->getStatutSemaines($pdDebut, $pdFin);
$laStatuValid = $this->getDoctrineRepository("PaaBundle:etablissementsSemaines")->getStatutSemaines($pdDebut, $pdFin, $pbCheckLstClasses);
$myJSON = json_encode($laStatuValid);
$response = new Response(
$myJSON, Response::HTTP_OK, array('content-type' => 'text/json')
);
return $response;
}
//MC 20210727
public function getJSONTypesAbsencesAction($psIdRessource) {
$em = $this->getDoctrineManager();
$repository = $em->getRepository("PaaBundle:actibases");
$laTypeAbsence = $repository->getActivitesAbsencesRessourcesJSON($psIdRessource);
$response = new Response(
$laTypeAbsence, Response::HTTP_OK, array('content-type' => 'text/json')
);
return $response;
}
// Nettoyer les données du planning
// $data : tableau contenant
// "dDébut : date de début de nettoyage (incluse)
// "dFin" : date de fin de nettoyage (incluse)
// "iGroupeAB" : groupe d'activités de base pour lequel il faut nettoyer
// &$pcLog : pour retour du message d'erreur
// LG 20211214
function nettoiePlanningAction(Request $request) {
if (!$this->isGranted(PaaVoter::MODIFIER . "séances")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$data = $request->request->all();
$em = $this->getDoctrineManager();
$repo = $em->getRepository("PaaBundle:seances");
try {
$repo->nettoiePlanning($data, $lcLog) ;
$loResponse = new Response('{"status": "OK"}', Response::HTTP_OK, array('content-type' => 'text/json')) ;
} catch (\Exception $e) {
$loResponse = new Response('{"status": "KO", "msgErreur": "' . json_encode($e->getMessage(), JSON_HEX_APOS) . '"}', Response::HTTP_OK, array('content-type' => 'text/json')) ;
$this->Log("Erreur lors du nettoyage du planning : " . $e->getMessage(), "critical", true) ;
}
return $loResponse ;
}
// Modifier le type d'absence d'une ressource sur une semaine
// Les paramètres sont passés en POST :
// {
// aLstRes: [{idRes: "I1022", nomRes: "toto",{idRes: "U55589", nomRes: "tata"}]
// , aSemaines: [3761, 3762) ]
// , lExceptionnel: true
// , iSemType: -1
// }
// LG 20221215
function setTypeAbsenceAction(Request $request) {
if (!$this->isGranted(PaaVoter::MODIFIER . "RendHoraireExceptionnel")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$lbOK = true ;
$liNbEchecs = 0 ;
$liNbSuccès = 0 ;
$lsMsgEchecs = "" ;
$laParams = $request->request->all() ;
$liTypeAbs = $laParams["iSemType"] ;
if ($laParams["lExceptionnel"]) {
// Pour passer en "semaine exceptionnelle, on doit passer idSemType / 100 à setTypeAbsence
if (!is_numeric($liTypeAbs)) $liTypeAbs = -1 ; // LG 20230412
$liTypeAbs = $liTypeAbs / 100 ;
}
$laSemaines = $laParams["aSemaines"] ;
$lsLstSemaines = "" ;
$lsLstSemainesValidées = "" ; // LG 20240612
$loRepoEtablissementsSemaines = $this->getDoctrineManager()->getRepository("PaaBundle:etablissementsSemaines") ;
foreach($laSemaines as $liSem) {
// LG 20240612 début
if ($loRepoEtablissementsSemaines->estSemaineValidee((int)$liSem)) {
$lsLstSemainesValidées.= $liSem ;
}
// LG 20240612 fin
$lsLstSemaines .= $liSem . ",";
}
// LG 20240612 début
if ($lsLstSemainesValidées) {
$lsRep = "{\"status\": \"KO\", \"message\": \"Il n'est pas possible de modifier le type d'absence d'une ressource pour une semaine validée : il vous faut la dévalider au préalable.\"}" ;
$loResponse = new Response($lsRep, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $loResponse ;
}
// LG 20240612 fin
$laRessources = $laParams["aLstRes"] ;
foreach($laRessources as $loRes) {
$lsRes = $loRes["idRes"] ;
decomposeRessource($lsRes, $lsTypeRes, $liIdRes) ;
// Poser le type d'horaires demandé pour cette ressource
$lbRes = $this->getDoctrineManager()->getRepository("PaaBundle:ressources")->setTypeAbsence($lsTypeRes, $liIdRes, $lsLstSemaines, $liTypeAbs);
if ($lbRes) {
$liNbSuccès ++ ;
$lsMsgEchecs .= "Succès de la mise à jour pour " . $loRes["nomRes"] . ".<br>" ;
} else {
// La modification a échoué pour cette ressource
$liNbEchecs ++ ;
$lsMsgEchecs .= "Echec de la mise à jour pour " . $loRes["nomRes"] . ".<br>" ;
}
}
// Construction de la réponse
if ($liNbEchecs == 0) {
// Tout a réussi
$lsRep = '{"status": "OK"}' ;
} else if ($liNbSuccès == 0) {
// Tout a échoué
$lsRep = "{\"status\": \"KO\", \"message\": \"Echec de la mise à jour\"}" ;
} else {
// Mélange de succès et d'échecs
$lsRep = "{\"status\": \"KO\", \"message\": \"Certaines mises à jour ont échoué : <br>$lsMsgEchecs\"}" ;
}
$loResponse = new Response($lsRep, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $loResponse ;
}
// LG 20230118 passé de TestController Début
//HL 20211014 DEBUT
// LG 20230118 old private function addEntity(array $paPostdata, $psNomTable) {
private function addEntity(array $paPostdata, $psNomTable, $pbAutoriseUtiliseExistant = false) {
$em = $this->getDoctrineManager();
$repo = $em->getRepository("PaaBundle:" . $psNomTable);
$className = $repo->getClassName();
$loEntite = new $className($em);
foreach($paPostdata as $key => $value) {
$lsNomMethode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
if (method_exists($loEntite, $lsNomMethode)) {
if ($psNomTable == 'users' && $key == 'password') {
// Pour les users, il faut encoder le mdp s'il a changé
// A noter que ca semble fait dans D:\Luc\Dev\DevWeb\Symfony\applicationPAA\src\PaaBundle\Controller\UserController.php, qui n'est utilisé nulle part
$pwd = $paPostdata[$key];
$encoder = $this->get("security.password_encoder");
$paPostdata[$key] = $encoder->encodePassword($loEntite, $pwd);
}
$loEntite->$lsNomMethode($paPostdata[$key]);
}
}
try { // LG 20230118
$em->persist($loEntite);
$em->flush();
// LG 20230118 début
} catch (\Doctrine\DBAL\Exception\UniqueConstraintViolationException $e) {
// Gestion du cas des violations de contraintes unique
if ($pbAutoriseUtiliseExistant) {
// On accepte la récupération de l'entité pré-existante qui viole la contrainte d'unicité
// Récupérer cette entité
/* Le message d'erreur contient un texte du type :
"SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "u_actibases_cnom"
DETAIL: Key (cnom, isousgroupe)=(Education, pédagogie, apprentissages , -9) already exists."
*/
$lsDetails = explode("DETAIL: ", $e->getMessage())[1] ;
// LG 20230901 début
// Résolution du problème de présence de parenthèses ou de virules dans les champs caractère impliqués dans cette erreur
$laCorrections = [] ;
foreach($paPostdata as $lsFld => $lvValue) {
if (strpos($lsDetails, strtolower($lsFld))) {
// Ce champ est sans doutes présent dans la liste des champs incriminés
if (strpos($lvValue, ",") || strpos($lvValue, "(") || strpos($lvValue, ")")) {
// La valeur correspondant à ce champ contient des caractères interdits
$lvValueCorr = $lvValue ;
$lvValueCorr = str_replace(",", "@VIRGULE@", $lvValueCorr);
$lvValueCorr = str_replace("(", "@PARENTHESEOUVRANTE@", $lvValueCorr);
$lvValueCorr = str_replace(")", "@PARENTHESEFERMANTE@", $lvValueCorr);
$laCorrections[$lvValue] = $lvValueCorr ;
// Remplacer dans le texte des détails
$lsDetails = str_replace($lvValue, $lvValueCorr, $lsDetails) ;
}
}
}
// LG 20230901 fin
if ($lsDetails) {
if (preg_match_all('~\(([^()]*)\)~', $lsDetails, $laMatches)) {
// Déterminer les critères de recherche de l'entité qui fait doublon
// laMatches a la forme : "[0: [0: ["(cinitiales)", 1:"(ECH )"], 1: [0:"cinitiales", 1:"ECH "]]
$laDétails = $laMatches[1] ;
// LG 20230901 début
// $loEntite = $repo->getEntityByUniqueConstraint($laDétails[0], $laDétails[1]) ;
$lsLstFlds = $laDétails[0] ;
$laFlds = explode(",", $lsLstFlds) ;
$lsLstValues = $laDétails[1] ;
$laValues = explode(",", $lsLstValues) ;
foreach($laCorrections as $lsOrignial => $lsCorrigé) {
for ($i = 0; $i < count($laValues); $i++) {
$laValues[$i] = str_replace($lsCorrigé, $lsOrignial, $laValues[$i]) ;
}
}
// Retrouver l'entité correspondant à ces critères
$loEntite = $repo->getEntityByUniqueConstraint($laFlds, $laValues) ;
// LG 20230901 fin
if (!$loEntite) {
throw new \Exception("Impossible de trouver l'entité violant la contrainte unique " . $e->getMessage()) ;
}
} else {
throw new \Exception("Impossible de trouver les informations sur l'entité cause de l'exception de contrainte unique " . $e->getMessage()) ;
}
} else {
throw new \Exception("Impossible de trouver le détail de l'exception de contrainte unique " . $e->getMessage()) ;
}
} else {
// On n'accepte pas la récupération d'un élément existant
throw $e ;
}
// LG 20230118 fin
} catch (\Exception $e) {
// Cas d'exception non prévu
throw $e ;
}
return $loEntite ;
}
public function addEntityAction(Request $request, $psNomTable) {
// LG 20230118 old $loEntite = $this->addEntity($request->request->all(), $psNomTable);
$loEntite = $this->addEntity($request->request->all(), $psNomTable, $request->query->get("pbAutoriseUtiliseExistant"));
$response = new Response(
'{"status": "OK", "idEntite": ' . $loEntite->getId() . '}', Response::HTTP_OK, array('content-type' => 'text/json')
);
return $response ; // LG 20230830
}
// LG 20230118 passé de TestController fin
// CB 20230301 début
// Permuter les rangs de deux groupes
public function permuteGroupesAction($piIdGroupe1, $piIdGroupe2) {
$em = $this->getDoctrineManager();
$repo = $em->getRepository("PaaBundle:groupes");
// - $loGroupe1 = $repo->find($piIdGroupe1) ;
// $loGroupe2 = $repo->find($piIdGroupe2) ;
// $lsMsg = "" ;
// if (!$loGroupe1) {
// if ($lsMsg) $lsMsg .= ", " ;
// $lsMsg .= "Erreur : le groupe $piIdGroupe1 n'existe pas" ;
// }
// if (!$loGroupe2) {
// if ($lsMsg) $lsMsg .= ", " ;
// $lsMsg .= "Erreur : le groupe $piIdGroupe2 n'existe pas" ;
// }
// if ($lsMsg) {
// // Il y a eu une erreur
// $lsJSON = '{"status": "KO", "message": "' . $lsMsg . '}' ;
// } else {
// // Pas d'erreur, on peut permuter
// $liTmp = $loGroupe1->getIRang() ;
// $loGroupe1->setIRang($loGroupe2->getIRang()) ;
// $loGroupe2->setIRang($liTmp) ;
// $em->persist($loGroupe1);
// $em->persist($loGroupe2);
// $em->flush();
// $lsJSON = '{"status": "OK", "piIdGroupe1": ' . $piIdGroupe1 . ', "piIdGroupe2": ' . $piIdGroupe2 . '}' ;
// }
$lsMsgErr = "" ;
if ($repo->permuteGroupes($piIdGroupe1, $piIdGroupe2, $lsMsgErr)) {
$lsJSON = '{"status": "OK", "piIdGroupe1": ' . $piIdGroupe1 . ', "piIdGroupe2": ' . $piIdGroupe2 . '}' ;
} else {
$lsJSON = '{"status": "KO", "message": "' . $lsMsgErr . '}' ;
}
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response;
}
// CB 20230301 fin
// LG 20240430 old public function getPlanFormationAction(Request $request, $psIdRes, $pdDebut, $pdFin) {
public function getPlanFormationAction(Request $request, $psIdRes, $pdDebut, $pdFin, $pbAfficheSemainesAbsences) {
if (!$this->isGranted(PaaVoter::VOIR . "PlansFormation")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
decomposeRessource($psIdRes, $lsType_Res, $liId_Res) ;
if ($lsType_Res !== "G") {
$lsJSON = '{"status": "KO", "message": "Cette fonction n\'est disponible que pour les groupes"}' ;
} else {
$em = $this->getDoctrineManager() ;
$r = $em->getRepository("PaaBundle:groupes") ;
try {
// LG 20240430 old $loPF = $r->getPlanFormation($liId_Res, $pdDebut, $pdFin) ;
$loPF = $r->getPlanFormation($liId_Res, $pdDebut, $pdFin, $pbAfficheSemainesAbsences) ;
$loRep = ["status" => "OK", "data" => $loPF] ;
$lsJSON = json_encode($loRep) ;
} catch(\Exception $e) {
$lsMsg = $e->getMessage() ;
$lsJSON = '{"status": "KO", "message": ' . json_encode($lsMsg) . '}' ;
}
}
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response;
}
public function savePlanFormationAction(Request $request, $psIdRes) {
if (!$this->isGranted(PaaVoter::MODIFIER . "PlansFormation")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
decomposeRessource($psIdRes, $lsType_Res, $liId_Res) ;
if ($lsType_Res !== "G") {
$lsJSON = '{"status": "KO", "message": "Cette fonction n\'est disponible que pour les groupes"}' ;
} else {
$em = $this->getDoctrineManager() ;
$r = $em->getRepository("PaaBundle:groupes") ;
$laData = $request->request->all() ;
try {
$lsRep = $r->savePlanFormation($liId_Res, $laData) ;
if ($lsRep) {
// Erreur lors de l'enregsitrement
$lsJSON = '{"status": "KO", "message": ' . json_encode($lsRep) . '}' ;
} else {
// OK
$lsJSON = '{"status": "OK"}' ;
}
} catch(\Exception $e) {
$lsMsg = $e->getMessage() ;
$lsJSON = '{"status": "KO", "message": ' . json_encode($lsMsg) . '}' ;
}
}
// $lsJSON = '{"status": "OK", "message": "coucou, votre demande d\'enregistrement de données concerne le groupe ' . $psIdRes . '"}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response;
}
// LG 20240516
public function getPrésencesClassesAction(Request $request, $pdDebut, $pdFin) {
if (!$this->isGranted(PaaVoter::VOIR . "PrésencesClasses")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager() ;
$r = $em->getRepository("PaaBundle:groupes") ;
try {
$loPF = $r->getPrésencesClasses($pdDebut, $pdFin) ;
$loRep = ["status" => "OK", "data" => $loPF] ;
$lsJSON = json_encode($loRep) ;
} catch(\Exception $e) {
$lsMsg = $e->getMessage() ;
$lsJSON = '{"status": "KO", "message": ' . json_encode($lsMsg) . '}' ;
}
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response;
}
public function getListeCreneauxAction(Request $request, $pdDebut, $pdFin, $psLstRes) {
if (!$this->isGranted(PaaVoter::VOIR . "séances")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager();
$loRepoSeances = $em->getRepository("PaaBundle:seances") ;
$laCreneaux = $loRepoSeances->rtvCurCréneaux($psLstRes, $pdDebut, $pdFin, true /*$pbInclSimulationHorairesType*/) ;
$lsJSON = json_encode($laCreneaux);
$lsJSON = '{"status": "OK", "data": ' . $lsJSON . '}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response;
}
/** Créer pour un groupe et une semaine une collection complète de créneaux horaires
* $piIdGroupe
* $piSemaine
*($psLstHoraires) : chaine de caractères de la forme "<Hdeb>-<HFin>[;<Hdeb>-<HFin>[...]]", exemple : '8-10; 10:15-12:15; 13:45-15:45; 16-18'
* Valeur de retour : message d'erreur éventuel (vide si succès)
* LG 20231027
*/
public function creeCreneauxStandardAction(Request $request, $piIdGroupe, $piSemaine, $psLstHoraires) {
if (!$this->isGranted(PaaVoter::MODIFIER . "séances")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager();
$loRepoSeances = $em->getRepository("PaaBundle:seances") ;
$lvRep = $loRepoSeances->creeCreneauxStandard($piIdGroupe, $piSemaine, $psLstHoraires) ;
if ($lvRep) {
// Messagd d'erreur non vide
$lsJSON = '{"status": "KO", "message": ' . json_encode($lvRep) . '}' ;
$response = new Response($lsJSON, Response::HTTP_BAD_REQUEST, array('content-type' => 'text/json')) ;
} else {
$lsJSON = '{"status": "OK"}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
}
return $response;
}
/** Copier les créneaux horaires d'un groupe vers un autre et/ou d'un jour vers l'autre
* $piIdGroupeSource : Id du groupe source de la copie
* $piIdGroupeDest : Id du groupe destination de la copie
* $piSemaineSource : semaine des horaires source
* $piSemaineDest : semaine des horaires destination
* ($piJourSource) : journée source des horaires à copier (dft = 0 : toutes, 1= lundi)
* ($piJourDest) : journée destination des horaires (dft = 0 : toutes, 1= lundi)
* Valeur de retour : message d'erreur éventuel (vide si succès)
* LG 20231027
*/
public function copieCreneauxAction(Request $request, $piIdGroupeSource, $piIdGroupeDest, $piSemaineSource, $piSemaineDest, $piJourSource=0, $piJourDest=0) {
if (!$this->isGranted(PaaVoter::MODIFIER . "séances")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager();
$loRepoSeances = $em->getRepository("PaaBundle:seances") ;
$lvRep = $loRepoSeances->copieCreneaux($piIdGroupeSource, $piIdGroupeDest, $piSemaineSource, $piSemaineDest, $piJourSource, $piJourDest) ;
if ($lvRep) {
// Messagd d'erreur non vide
$lsJSON = '{"status": "KO", "message": ' . json_encode($lvRep) . '}' ;
$response = new Response($lsJSON, Response::HTTP_BAD_REQUEST, array('content-type' => 'text/json')) ;
} else {
$lsJSON = '{"status": "OK"}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
}
return $response;
}
// LG 20240305
function prochaineEcheanceUsagerAction(Request $request, $piIdUsager) {
if (!$this->isGranted(PaaVoter::VOIR . "usagers")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager();
$loRepoUsagers = $em->getRepository("PaaBundle:usagers") ;
$laData = $loRepoUsagers->getProchaineEchéanceUsager($piIdUsager) ;
$lsData = json_encode($laData) ;
$lsJSON = '{"status": "OK", "data": ' . $lsData . '}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response ;
}
// LG 20240826
function getValeursDftMatiereAction(Request $request, $piIdMatiere) {
if (!$this->isGranted(PaaVoter::VOIR . "activites")) {
$response = new Response('{"status": "KO", "message": "Vous ne disposez pas des droits nécessaires pour effectuer cette action."}');
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(Response::HTTP_FORBIDDEN, "Vous ne disposez pas des droits nécessaires pour effectuer cette action.");
return $response;
}
$em = $this->getDoctrineManager();
$loRepo = $em->getRepository(\App\PaaBundle\Entity\matieres::class) ;
$loMatiere = $loRepo->find($piIdMatiere) ;
$laSousGroupes = $loMatiere->getSousGroupes() ;
$laData["iMatiere"] = $loMatiere->getId() ;
$laData["aSousGroupes"] = $loMatiere->getSousGroupesArray() ;
$laData["aIntervenants"] = [$loMatiere->getIintervenant()] ;
$laData["aSalles"] = [] ;
$laData["nPrevuSem"] = 2 ;
$laData["nHeuresMax"] = 2 ;
$lsData = json_encode($laData) ;
$lsJSON = '{"status": "OK", "data": ' . $lsData . '}' ;
$response = new Response($lsJSON, Response::HTTP_OK, array('content-type' => 'text/json')) ;
return $response ;
}
}