Subversion Repositories eFlore/Applications.del

Rev

Rev 1793 | Rev 1795 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Permet d'ajouter un commentaire.
 *
 * @category DEL
 * @package Services
 * @subpackage Commentaires
 * @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 AjouterCommentaire {

        private $conteneur;
        private $navigation;
        private $bdd;
        private $parametres = array();
        private $ressources = array();

        private $commentaire;

        public function __construct(Conteneur $conteneur) {
                $this->conteneur = $conteneur;
                $this->conteneur->chargerConfiguration('config_commentaires.ini');
                $this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
                $this->navigation = $conteneur->getNavigation();
                $this->bdd = $this->conteneur->getBdd();
        }

        /**
         * Ajoute un commentaire/determination si les objets fournis en paramètres sont valides
         * pour l'afficher.
         * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
         * @param array $parametres les paramètres situés après le ? dans l'url
         * */
        public function ajouter($ressources, $parametres) {
                $this->initialiserRessourcesEtParametres($ressources, $parametres);

                // Gestion des configuration du script
                $this->configurer();
                $this->verifierConfiguration();
                $utilisateur = $this->chercherUtilisateur();
                $proposition_initiale = $this->verifierEtCreerPropositionDeterminationInitiale();
                $insertion = $this->insererCommentaire($utilisateur);

                // Mettre en forme le résultat et l'envoyer pour affichage
                $resultat = new ResultatService();
                $resultat->corps = array('id_commentaire' => $insertion);

                return $resultat;
        }

        //ce_observation=728176&texte=ABC&auteur.id=11623&auteur.prenom=grégoire&auteur.nom=duché&auteur.courriel=gregoire@tela-botanica.org
        private function initialiserRessourcesEtParametres($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;
        }

        /*-------------------------------------------------------------------------------
                                                                CONFIGURATION DU SERVICE
         --------------------------------------------------------------------------------*/
        /**
         * Initialiser les attributs de la classe avec les parametres
         * */
        public function configurer() {
                $this->mappingCommentaire = $this->conteneur->getParametre('mapping_commentaire');
                //TODO : Gérer le cas d'une proposition
        }

        /**
         * Vérifier que le service est bien configuré
         * */
        public function verifierConfiguration() {
                $erreurs = array();

                if (empty($this->mappingCommentaire)) {
                        $erreurs[] = "Le fichier de configuration ne contient pas le tableau [mapping_commentaire] ou celui-ci est vide.";
                }

                $parametresPossibles = array_values($this->mappingCommentaire);
                foreach ($this->parametres as $nomParam => $valeur) {
                        if (!in_array($nomParam, $parametresPossibles)) {
                                $erreurs[] = "Paramètre « {$nomParam} » non autorisé.";
                        }
                }

                if (!isset($this->parametres['observation'])) {
                        $erreurs[] = "Impossible d'ajouter un commentaire sans observation.";
                }

                if (!isset($this->parametres['auteur.id'])) {
                        if (!isset($this->parametres['auteur.nom'])) {
                                $erreurs[] = "Pas de nom d'utilisateur donné.";
                        }

                        if (!isset($this->parametres['auteur.prenom'])) {
                                $erreurs[] = "Pas de prenom d'utilisateur donné.";
                        }

                        if (!isset($this->parametres['auteur.courriel'])) {
                                $erreurs[] = "Pas de courriel d'utilisateur donné.";
                        }
                }

                if (isset($this->parametres['nom_sel']) &&trim($this->parametres['nom_sel']) == '') {
                        $erreurs[] = "S'il est présent le paramètre «nom_sel» ne peut pas être vide.";
                }

                //TODO : Gérer le cas d'une proposition

                if (!empty($erreurs)) {
                        $e = implode("\n", $erreurs);
                        $msg = "Erreur de configuration :\n $e";
                        echo $msg;
                        throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
                }
        }

        /*-------------------------------------------------------------------------------
                                                           INSERTION DES COMMENTAIRES
        --------------------------------------------------------------------------------*/
        /**
         * Trouver l'utilisateur en fonction des paramètres ou de la base de données si le nom, prénom et courriel ne sont pas donnés
         * @return le tableau utilisateur
         * */
        private function chercherUtilisateur() {
                $utilisateur = array();

                // Si l'id est fournit, on récupère les informations de l'utilisateur dans la base de données
                // Sinon, on récupère les informations depuis le tableau Commentaire et on vérifie leur cohérence
                if (isset($this->parametres['auteur.id'])) {
                        $requete = "SELECT id_utilisateur as 'auteur.id', nom as 'auteur.nom', prenom as 'auteur.prenom', courriel as 'auteur.courriel' ".
                                'FROM del_utilisateur '.
                                'WHERE id_utilisateur = '.$this->bdd->proteger($this->parametres['auteur.id']);
                        $utilisateur = $this->bdd->recuperer($requete);
                } else {
                        if (isset($this->parametres['auteur.nom']) && isset($this->parametres['auteur.prenom']) && isset($this->parametres['auteur.courriel'])) {
                                $utilisateur['auteur.nom'] = $this->parametres['auteur.nom'];
                                $utilisateur['auteur.prenom'] = $this->parametres['auteur.prenom'];
                                $utilisateur['auteur.courriel'] = $this->parametres['auteur.courriel'];
                                if ($utilisateur_recherche = $this->estValideDansBdd($utilisateur)) {
                                        // si l'utilisateur est trouvé, on affecte son id au lieu du numéro temporaire
                                        $utilisateur = $utilisateur_recherche;
                                        $this->parametres['auteur.id'] = $utilisateur_recherche['auteur.id'];
                                }
                                // sinon pas d'erreur, on considere simplement que l'utilisateur
                                // est un homonyme ou bien qu'il a décidé d'utiliser un autre mail
                        }
                }

                return $utilisateur;
        }

        /**
         * Vérifier que les informations saisies pour un utilisateur sont valides pour la bdd
         * @param $utilisateur array le tableau de l'utilisateur
         * */
        private function estValideDansBdd($utilisateur) {
                $nom = $this->bdd->proteger($utilisateur['auteur.nom']);
                $prenom = $this->bdd->proteger($utilisateur['auteur.prenom']);
                $courriel = $this->bdd->proteger($utilisateur['auteur.courriel']);

                $requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
                        "       courriel AS 'auteur.courriel' ".
                        'FROM del_utilisateur '.
                        "WHERE courriel = $courriel ".
                        "       AND nom = $nom ".
                        "       AND prenom = $prenom ";
                $utilisateurBdd = $this->bdd->recuperer($requete);
                return $utilisateurBdd;
        }

        /**
         * Insère un commentaire dans la table
         * @param $utilisateur array la liste des paramètres utilisateur
         * */
        private function insererCommentaire($utilisateur) {
                $requete = 'INSERT INTO del_commentaire '.
                        '('.$this->genererEntete($utilisateur).') '.
                        'VALUES ('.$this->genererValues().')';

                $retour = $this->bdd->requeter($requete);
                if ($retour == null) {
                        $e = "Erreur inopinée lors de l'insertion";
                        throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
                }

                $retour = $this->bdd->recupererIdDernierAjout();

                return $retour;
        }

        private function verifierEtCreerPropositionDeterminationInitiale() {
                $id_observation = $this->parametres['observation'];
                $proposition_existe = $this->propositionInitialeExiste($id_observation);
                if (!$proposition_existe) {
                        $this->creerPropositionAPartirObservation($id_observation);
                }
        }

        private function propositionInitialeExiste($id_observation) {
                $requete = 'SELECT COUNT(*) >= 1 AS existe '.
                        'FROM del_commentaire '.
                        "WHERE ce_observation = $id_observation ".
                        '       AND proposition_initiale = 1';
                $resultat = $this->bdd->recuperer($requete);
                return $resultat['existe'] == 1;
        }

        private function creerPropositionAPartirObservation($id_observation) {
                $idObs =  $this->bdd->proteger($id_observation);
                $insertion = 'INSERT IGNORE INTO del_commentaire '.
                        '(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
                        'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
                        'SELECT id_observation, ce_utilisateur, prenom, nom, '.
                        '               courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
                        "               nt, famille, nom_referentiel, NOW(), '1' ".
                        'FROM del_observation AS do '.
                        '       LEFT JOIN del_utilisateur AS du '.
                        '               ON do.ce_utilisateur = du.id_utilisateur '.
                        "WHERE id_observation = $idObs ";

                $resultat = $this->bdd->requeter($insertion);
                return $resultat;
        }

        private function genererEntete($utilisateur) {
                $this->parametres = array_merge($this->parametres, $utilisateur);

                $entete = array('date');
                foreach ($this->mappingCommentaire as $nomOriginal => $nomFinal) {
                        if (isset($this->parametres[$nomFinal]) && $this->parametres[$nomFinal] != null) {
                                $entete[] = $nomOriginal;
                        }
                }

                return implode(', ', $entete);
        }

        private function genererValues() {
                $valeurs = array('NOW()');
                foreach ($this->mappingCommentaire as $nomOriginal => $nomFinal) {
                        if (isset($this->parametres[$nomFinal]) && $this->parametres[$nomFinal] != null) {
                                $valeurs[] = $this->bdd->proteger($this->parametres[$nomFinal]);
                        }
                }

                return implode(', ', $valeurs);
        }
}