Subversion Repositories eFlore/Applications.cel

Rev

Rev 2131 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * @category  PHP
 * @package   jrest
 * @author    Aurélien Peronnet <aurelien@tela-botania.org>
 * @author    Raphaël Droz <raphael@tela-botania.org>
 * @copyright 2013 Tela-Botanica
 * @license   Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
 * @license       GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 *
 */
class CelValidationObservation extends Cel {
        /**
        * Méthode appelée avec une requête de type POST avec un identifiant d'obs.
        * Modifie le taxon associé à une observation avec les informations envoyées
        * Utilisé par:
        * - del/services/modules/0.1/determinations/ValiderDetermination.php::modifierObservationParDetermination()
        *
        * @param int $uid[0] identifiant observation
        * @param pairs array tableau contenant les valeurs à modifier
        * @param pairs['obsKeywordDelete'] optional string: mot-clef à délier à cette observation
        */
        public function updateElement($uid, $pairs) {
                // ce service est uniquement destiné à être appelé en local, 
                // depuis le serveur lui même 
                // en particulier par l'application identiplante
                $this->controleAppelIpAutorisee();
                self::verifierParametresObligatoires($uid, $pairs);
                $id = $uid[0];

                $gestion_observation = new GestionObservation($this->config);
                $pairs = array_map('trim', $pairs);
                $utilisateur = $pairs['ce_utilisateur'];
                unset($pairs['ce_utilisateur'], $pairs['id_observation']);

                // mise à jour des mots-clefs suite à une validation:
                // typiquement, DEL modifierObservationParDetermination()
                // nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
                $obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
                // $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
                unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);

                // complete les données de la proposition validée car:
                // 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
                // 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
                // 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
                $more_data = CelTaxonNomFrom::NN2($this->bdd, @$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
                if($more_data) $pairs = array_merge($pairs, $more_data);

                $modification = $gestion_observation->modifierObservationPublique($utilisateur, $id, $pairs);
                if($modification) {
                        $gestion_mots_cles = new GestionMotsClesChemin($this->config, 'obs');
                        // supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
                        $supp_liaison_mot_cle = $gestion_mots_cles->supprimerLiaisonPourMotCleEtIdElementLie($obsKeywordDelete, $id, $utilisateur);
                        // TODO : quel impact de la valeur de retour ?
                        header("Content-Type: text/plain; charset=utf-8");
                        die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
                }
                // cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
                elseif($modification === 0) {
            header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
                        header("Content-Type: text/plain; charset=utf-8");
                        die("Not Modified");
                }
                else {
                        header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
                        header("Content-Type: text/plain; charset=utf-8");
                        die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
                }
        }
        
        static function verifierParametresObligatoires($uid, $params) {
                if(!@intval($uid[0]) || !@intval($params['id_observation'])) {
                        header("Content-Type: text/plain; charset=utf-8");
                        die("L'identifiant d'observation doit être un entier");
                }

                // TODO: check sur 'id_observation' en tant que param est superflu ?
                // TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel
                // puisque nous regénérons des données valides avant l'update et puisque
                // seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.
                $params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
                foreach($params_obligatoires as $param) {
                        if(@trim($params[$param])) continue;
            header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failed
                        header("Content-Type: text/plain; charset=utf-8");
                        die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));
                }
        }
}

// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...
// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus
// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()
class CelTaxonNomFrom {
  const db = 'tb_eflore';
  const bdtfx = 'bdtfx_v2_00';
  const bdtxa = 'bdtxa_v1_01';
  const isfan = 'isfan_v2013';
  const apd = 'apd_v1_00';

  // get from num_nom(_sel)
  static function NN($db, $id, $ref) {
        if(!$db || !$id || !$ref) return FALSE;
        return $db->query(sprintf("SELECT num_nom_retenu AS nom_ret_nn, num_taxon AS nt, CONCAT(nom_sci, ' ', auteur) AS nom_sel".
                                                          " FROM cel_references".
                                                          " WHERE referentiel = %s AND num_nom = %d", $db->quote($ref), intval($id)))->fetch(PDO::FETCH_ASSOC);
  }

  // get from num_nom(_sel) directement via la DB
  // ce qui nous permet l'initialisation des champs non-présents dans cel_references
  // cf TODO
  static function NN2($db, $id, $ref) {
        if(!$db || !$id || !$ref) return FALSE;
        switch($ref) {
        case "bdtfx":
          return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
                                                                " , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
                                                                " FROM %s.%s o".
                                                                " LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
                                                                " WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtfx,  self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
        case "bdtxa":
          return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel". // subtilité: "num_tax"
                                                                " , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
                                                                " FROM %s.%s o".
                                                                " LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
                                                                " WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa,  self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
        case "isfan":
          return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
                                                                " , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
                                                                " FROM %s.%s o".
                                                                " LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
                                                                " WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan,  self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
        case "apd":
          return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
                                                                " , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
                                                                " FROM %s.%s o".
                                                                " LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
                                                                " WHERE o.num_nom = %d -- %s:%d", self::db, self::apd,  self::db, self::apd, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
        }
        return FALSE;
  }
}