Rev 1935 | Rev 2117 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Le web service récupére un identifiant de proposition et appelle un service web externe* (du CEL) afin de modifier le nom de l'observation associée par celui de la proposition.** @category DEL* @package Services* @subpackage Determinations* @version 0.1* @author Mathias CHOUET <mathias@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurelien PERONNET <aurelien@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>*/class ValiderDetermination {private $conteneur;private $bdd;private $idObs = null;private $idProposition = null;private $idAuteurObs = null;private $idValidateurObs = null;public function __construct(Conteneur $conteneur = null) {$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;$this->bdd = $this->conteneur->getBdd();}public function modifier($ressources, $parametres) {$this->verifierParametres($ressources, $parametres);$this->idProposition = $ressources[1];$this->idValidateurObs = $this->validateurEstPresent($parametres) ? $parametres['validateur.id'] : $parametres['auteur.id'] ;$retourCel = $this->modifierObservationParDetermination();if (preg_match('/^(OK|Not Modified)$/i', $retourCel) == false) {$msg = "Erreur: le web service du CEL a retourné : $retourCel";$code = RestServeur::HTTP_CODE_ERREUR;throw new Exception($msg, $code);}return 'OK';}private function validateurEstPresent($parametres) {return isset($parametres['validateur.id']) && is_numeric($parametres['validateur.id']) && $parametres['validateur.id'] != 0;}private function verifierParametres($ressources, $parametres) {$erreurs = array();if (!is_numeric($ressources[1])) {$erreurs[] = "La ressource indiquant l'identifiant de la proposition doit être numérique.";}// Le paramètre auteur.id (id de l'auteur de la détermination)// est là pour éviter que le $_POST ne soit videif (!isset($parametres['auteur.id'])) {$erreurs[] = "Le paramètre 'auteur.id' est manquant.";}// Le paramètre validateur.id (id de la personne validant la détemrinatiuon)// est là pour éviter que le $_POST ne soit videif (isset($parametres['validateur.id']) && !is_numeric($parametres['validateur.id'])) {$erreurs[] = "Le paramètre 'validateur.id' doit être un entier.";}if ($erreurs) {$msg = "Erreur dans les paramètres d'appel au web service :\n\n" . implode("\n", $erreurs);throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);}}/*** 1) récupère l'observation, autrement échec* 2) récupère et l'id auteur de l'obs et vérifie qu'il correspond à l'id de l'utilisateur actuel* 3) prépare les nouvelles valeurs à transférer au service CEL* 4) effectue la mise à jour* 5) si tout s'est passé comme convenu, marque la proposition comme "retenue"*/private function modifierObservationParDetermination() {$propositionInfos = $this->getInfosProposition();$this->idObs = $propositionInfos['ce_observation'];$this->idAuteurObs = $this->getIdAuteurObs();$this->verifierDroitUtilisateur();$parametres = array('id_observation' => $this->idObs,'nom_sel_nn' => $propositionInfos['nom_sel_nn'],'nom_referentiel' => $propositionInfos['nom_referentiel']);$urlBase = $this->conteneur->getParametre('urlServiceCelObs');$url = $urlBase.$this->idObs;$retour = $this->conteneur->getRestClient()->modifier($url, $parametres);// TODO: check sur HTTP code == 200, plutôt que sur texteif ($retour == 'ok' || $retour == 'OK') {$this->mettreAJourPropositionRetenue();if($this->idAuteurObs != $this->idValidateurObs) {$this->avertirAuteurObservation();}}return $retour;}private function getInfosProposition() {$idPropositionP = $this->bdd->proteger($this->idProposition);$requete = "SELECT id_commentaire, ce_observation, nom_sel_nn, nom_referentiel ".'FROM del_commentaire '."WHERE id_commentaire = $idPropositionP ".' -- '.__FILE__.' : '.__LINE__;$resultat = $this->bdd->recuperer($requete);if (! $resultat) {throw new Exception("Cette proposition est invalide.", RestServeur::HTTP_CODE_ERREUR);}return $resultat;}private function getIdAuteurObs() {$obsIdP = $this->bdd->proteger($this->idObs);$requete = 'SELECT ce_utilisateur '.'FROM del_observation '."WHERE id_observation = $obsIdP ".' -- '.__FILE__.' : '.__LINE__;$auteurInfo = $this->bdd->recuperer($requete);return $auteurInfo['ce_utilisateur'];}private function getInfosObs() {$obsIdP = $this->bdd->proteger($this->idObs);$requete = 'SELECT * '.'FROM del_observation '."WHERE id_observation = $obsIdP ".' -- '.__FILE__.' : '.__LINE__;$obsInfos = $this->bdd->recuperer($requete);return $obsInfos;}private function verifierDroitUtilisateur() {$controleAcces = $this->conteneur->getControleAcces();$utilisateurInfos = $controleAcces->getInfosUtilisateurConnecte();$utilisateurId = $utilisateurInfos['id_utilisateur'];// si l'utilisateur connecté n'est ni auteur de l'observation, ni au moins administrateur de niveau 1if (($this->idAuteurObs != $utilisateurId) && $utilisateurInfos['admin'] < 1) {$msg = "Seul l'utilisateur ayant saisi l'observation, un administrateur ou un validateur peut la valider : veuillez vous identifier.\n";throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);}}/*** Remet à 0 le status "proposition_retenue" pour toutes les propositions faites sur cette* observation à l'exception de celle désormais validée (qui voit son ce_validateur et sa date validation mise à jour)*/private function mettreAJourPropositionRetenue() {$requete = 'UPDATE del_commentaire '."SET proposition_retenue = IF(id_commentaire = {$this->idProposition}, 1, 0), "."ce_validateur = IF(id_commentaire = {$this->idProposition}, {$this->idValidateurObs} , ce_validateur), "."date_validation = IF(id_commentaire = {$this->idProposition}, NOW() , date_validation) "."WHERE ce_observation = {$this->idObs} ".' -- '.__FILE__.' : '.__LINE__;return $this->bdd->requeter($requete);}private function avertirAuteurObservation() {// le validateur est forcément celui qui est actuellement connecté$controleAcces = $this->conteneur->getControleAcces();$utilisateurInfos = $controleAcces->getInfosUtilisateurConnecte();$infos_obs = $this->getInfosObs();$donnees = array('auteur_obs_fmt' => $infos_obs['prenom_utilisateur'].' '.$infos_obs['nom_utilisateur'],'validateur_fmt' => $utilisateurInfos['prenom']." ".$utilisateurInfos['nom'],'lien_profil' => sprintf($this->conteneur->getParametre('message.lien_profil'), $this->idObs),'id_obs' => $this->idObs,'lien_obs' => sprintf($this->conteneur->getParametre('obs_fiche_tpl'), $this->idObs),'lien_wiki' => $this->conteneur->getParametre('message.lien_wiki_validation'));$sujet = $this->conteneur->getParametre('message.titre_message_validation');$squelettePhp = $this->conteneur->getSquelettePhp();$squeletteHtml = dirname(__FILE__).DS.'squelettes'.DS.'validation_determination.tpl.html';$corpsHtml = $squelettePhp->analyser($squeletteHtml, $donnees);$squeletteTxt = dirname(__FILE__).DS.'squelettes'.DS.'validation_determination.tpl.txt';$corpsTxt = $squelettePhp->analyser($squeletteTxt, $donnees);$messagerie = $this->conteneur->getMessagerie();$messagerie->envoyerHtml($infos_obs['courriel_utilisateur'],$sujet,$corpsHtml,$corpsTxt);}}