* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ 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 vide if (!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 vide if (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 texte if ($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() { $gestionUtilisateur = $this->conteneur->getUtilisateur(); $utilisateurInfos = $gestionUtilisateur->getUtilisateur(); $utilisateurId = $utilisateurInfos['id_utilisateur']; // si l'utilisateur connecté n'est ni auteur de l'observation, ni au moins administrateur de niveau 1 if (($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é $gestionUtilisateur = $this->conteneur->getUtilisateur(); $utilisateurInfos = $gestionUtilisateur->getUtilisateur(); $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->idValidateurObs), '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); } }