Go to most recent revision | Blame | Compare with Previous | 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);
}
}
?>