Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Réalise la migration des obs du référentiel bdnff vers le référentie bdtfx
 *
 * @category    php 5.2
 * @package             Cel/Scripts
 * @author              Aurelien PERONNET <aurelien@tela-botanica.org>
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @copyright   Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 * @version             $Id$
 */
class MigrationReferentiel {

        private $bdd = null;
        private $script = null;
        
        private $table_eflore = 'tb_eflore.bdtfx_v1_01';
        private $table_cel = 'tb_cel.cel_obs';
        private $correspondance_nn_sel_nn_ret = null;
        private $infos_noms = array();
        
        private $obs_sans_nn = array();
        private $obs_a_modifier = array();
        private $modif_douteuses = array();
        private $modif_familles = 0;
        
        private $chemin_log = '/home/telabotap/www/tmp/migration_noms_log.csv';
        private $fp = null;

        public function __construct(Conteneur $conteneur) {
                $this->bdd = $conteneur->getBdd();
                $this->script = $conteneur->getScript();
                $this->initialiserLog();
        }

        public function executer($arguments) {
                if (isset($arguments[0]) == false) {
                        throw new Exception("Veuillez indiquer l'action à réaliser en paramètre.", E_USER_ERROR);
                }
                $action = $arguments[0];
                switch ($action) {
                        case 'migration_referentiel' :
                                $this->migrerReferentiel();
                                break;
                }
                fclose($this->fp);
        }
        
        private function migrerReferentiel() {
                
                echo "-------------------------------------------------------------------\n";
                echo "  ETAPE 1. Paramétrage ... \n";
                echo "-------------------------------------------------------------------\n";
                $this->chargerInfosNoms();
                
                echo "-------------------------------------------------------------------\n";
                echo "  ETAPE 2. Chargement des observations ... \n";
                echo "-------------------------------------------------------------------\n";
                
                $requete_selection_obs = 'SELECT id_observation, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, '.
                                                                'famille, nom_referentiel FROM '.$this->table_cel;
                $liste_obs = $this->bdd->requeter($requete_selection_obs);
                echo sizeof($liste_obs)." observations sélectionnées \n";
                
                foreach ($liste_obs as $obs) {
                        if($this->doitChangerNomRetenu($obs)) {
                                $nouveau_nom = $this->getInfosNouveauNumNomRetenu($obs);
                                $this->obs_a_modifier[] = array(
                                        'id' => $obs['id_observation'],
                                        'nouveau_nom_sci_retenu' => $nouveau_nom['nom_complet'],
                                        'nouveau_nn_retenu' => $nouveau_nom['num_nom'],
                                        'nouveau_num_tax' => $nouveau_nom['num_taxonomique'],
                                        'nouvelle_famille' => $nouveau_nom['famille']
                                );
                                $this->logger($obs, $nouveau_nom);
                        }
                }
                
                echo "-------------------------------------------------------------------\n";
                echo "  ETAPE 3. modification des observations ... \n";
                echo "-------------------------------------------------------------------\n";
                echo sizeof($this->obs_a_modifier)." obs doivent voir changer leur nom retenu \n";
                echo $this->modif_familles." obs doivent voir changer leur famille \n";
                echo sizeof($this->obs_sans_nn)." observations n'ont pas de num nom \n";
                echo sizeof($this->modif_douteuses)." modifications sont douteuses et ne seront pas effectuées \n";            
                echo "\n";
                $this->executerRequeteMiseAJour();
                echo "\n";
                echo "-------------------------------------------------------------------\n";
                echo "  Migration des noms terminée ... \n";
                echo "-------------------------------------------------------------------\n";
                        
        }
        
        private function chargerInfosNoms() {
                
                $requete = 'SELECT num_nom, num_nom_retenu, nom_complet, num_taxonomique, famille FROM '.$this->table_eflore;
                $nums = $this->bdd->requeter($requete);
                
                foreach ($nums as $num) {
                        $this->correspondance_nn_sel_nn_ret[$num['num_nom']] = $num['num_nom_retenu'];
                        $this->infos_noms[$num['num_nom']] = $num;
                }
                
                echo sizeof($this->correspondance_nn_sel_nn_ret)." noms sélectionnés\n";
        }
        
        private function doitChangerNomRetenu($obs) {
                $changement = false;
                $nn_retenu_obs = $obs['nom_ret_nn'];
                $nn_saisi_obs = $obs['nom_sel_nn'];
                $famille_saisie_obs = $obs['famille'];
                $sans_nn_retenu = false;
                
                if($nn_saisi_obs != '') {
                        if(!isset($this->correspondance_nn_sel_nn_ret[$nn_saisi_obs]) || $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] == 0) {
                                $this->obs_sans_nn[] = $obs['id_observation'];
                                $sans_nn_retenu = true;
                        } else {
                                if($nn_retenu_obs != $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] && str_word_count($obs['nom_ret']) >= 1) {
                                        $changement = true;
                                }
                        }
                        
                        if(!$sans_nn_retenu && $famille_saisie_obs != $this->infos_noms[$nn_saisi_obs]['famille']) {
                                $changement = true;
                                $this->modif_familles++;
                        }
                }
                
                if($changement && str_word_count($obs['nom_ret']) == 1) {
                        $this->modif_douteuses[] = $obs;
                        $changement = false;
                }
                
                return $changement;
        }
        
        private function getInfosNouveauNumNomRetenu($obs) {
                $nouveau_nn_ret = $this->correspondance_nn_sel_nn_ret[$obs['nom_sel_nn']];
                return $this->infos_noms[$nouveau_nn_ret];
        }
        
        private function executerRequeteMiseAJour() {
                $total = 0;
                foreach($this->obs_a_modifier as $valeurs) {
                        $requete = $this->assemblerRequeteMiseAJour($valeurs);
                        $migration_noms = $this->bdd->executer($requete);
                        if ($migration_noms) {
                                $total++;
                                $this->script->afficherAvancement('Migration des noms (par 1)', $total);
                        } else {
                                echo $requete."\n";
                                exit('Erreur lors de la migration des noms de l\'observation '.$valeurs['id']."\n");
                        }
                }
        }
        private function proteger($valeur) {
                return $this->bdd->proteger($valeur);
        }
        
        private function assemblerRequeteMiseAJour($tableau) {
                $requete = 'UPDATE '.$this->table_cel.' '.
                                'SET nom_ret = '.$this->proteger($tableau['nouveau_nom_sci_retenu']).', '.
                                        'nom_ret_nn = '.$this->proteger($tableau['nouveau_nn_retenu']).', '.
                                        'nt = '.$this->proteger($tableau['nouveau_num_tax']).', '.
                                        'famille = '.$this->proteger($tableau['nouvelle_famille']).', '.
                                        'nom_referentiel = "bdtfx:v1.01" '.
                                        'WHERE id_observation = '.$this->proteger($tableau['id']);
                return $requete;
        }
        
        private function initialiserLog() {
                $this->fp = fopen($this->chemin_log, 'w');
                $colonnes = 'nom sélectionné, nn nom sélectionné, ancien nom retenu, nn ancien nom retenu, '.
                'nouveau nom sélectionné, nn nouveau nom sélectionné'."\n";
                fwrite($this->fp, $colonnes);
        }
        
        private function logger($obs, $nouveau_nom) {
                $chaine = '"'.$obs['nom_sel'].'"'.','.'"'.$obs['nom_sel_nn'].'"'.','.'"'.$obs['nom_ret'].'"'.','.
                                        '"'.$obs['nom_ret_nn'].'"'.','.'"'.$nouveau_nom['nom_complet'].'"'.','.
                                        '"'.$nouveau_nom['num_nom'].'"'."\n";
                fwrite($this->fp, $chaine);
        }
}
?>