Subversion Repositories eFlore/Applications.cel

Rev

Rev 1433 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1433 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Réalise la migration des obs du référentiel bdnff vers le référentie bdtfx
5
 *
6
 * @category	php 5.2
7
 * @package		Cel/Scripts
8
 * @author		Aurelien PERONNET <aurelien@tela-botanica.org>
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
11
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @version		$Id$
14
 */
15
class MigrationReferentiel {
16
 
17
	private $bdd = null;
18
	private $script = null;
19
 
20
	private $table_eflore = 'tb_eflore.bdtfx_v1_01';
21
	private $table_cel = 'tb_cel.cel_obs';
22
	private $correspondance_nn_sel_nn_ret = null;
23
	private $infos_noms = array();
24
 
25
	private $obs_sans_nn = array();
26
	private $obs_a_modifier = array();
27
	private $modif_douteuses = array();
28
	private $modif_familles = 0;
29
 
30
	private $chemin_log = '/home/telabotap/www/tmp/migration_noms_log.csv';
31
	private $fp = null;
32
 
33
	public function __construct(Conteneur $conteneur) {
34
		$this->bdd = $conteneur->getBdd();
35
		$this->script = $conteneur->getScript();
36
		$this->initialiserLog();
37
	}
38
 
39
	public function executer($arguments) {
40
		if (isset($arguments[0]) == false) {
41
			throw new Exception("Veuillez indiquer l'action à réaliser en paramètre.", E_USER_ERROR);
42
		}
43
		$action = $arguments[0];
44
		switch ($action) {
45
			case 'migration_referentiel' :
46
				$this->migrerReferentiel();
47
				break;
48
		}
49
		fclose($this->fp);
50
	}
51
 
52
	private function migrerReferentiel() {
53
 
54
		echo "-------------------------------------------------------------------\n";
55
		echo "  ETAPE 1. Paramétrage ... \n";
56
		echo "-------------------------------------------------------------------\n";
57
		$this->chargerInfosNoms();
58
 
59
		echo "-------------------------------------------------------------------\n";
60
		echo "  ETAPE 2. Chargement des observations ... \n";
61
		echo "-------------------------------------------------------------------\n";
62
 
63
		$requete_selection_obs = 'SELECT id_observation, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, '.
64
								'famille, nom_referentiel FROM '.$this->table_cel;
65
		$liste_obs = $this->bdd->requeter($requete_selection_obs);
66
		echo sizeof($liste_obs)." observations sélectionnées \n";
67
 
68
		foreach ($liste_obs as $obs) {
69
			if($this->doitChangerNomRetenu($obs)) {
70
				$nouveau_nom = $this->getInfosNouveauNumNomRetenu($obs);
71
				$this->obs_a_modifier[] = array(
72
					'id' => $obs['id_observation'],
73
					'nouveau_nom_sci_retenu' => $nouveau_nom['nom_complet'],
74
					'nouveau_nn_retenu' => $nouveau_nom['num_nom'],
75
					'nouveau_num_tax' => $nouveau_nom['num_taxonomique'],
76
					'nouvelle_famille' => $nouveau_nom['famille']
77
				);
78
				$this->logger($obs, $nouveau_nom);
79
			}
80
		}
81
 
82
		echo "-------------------------------------------------------------------\n";
83
		echo "  ETAPE 3. modification des observations ... \n";
84
		echo "-------------------------------------------------------------------\n";
85
		echo sizeof($this->obs_a_modifier)." obs doivent voir changer leur nom retenu \n";
86
		echo $this->modif_familles." obs doivent voir changer leur famille \n";
87
		echo sizeof($this->obs_sans_nn)." observations n'ont pas de num nom \n";
88
		echo sizeof($this->modif_douteuses)." modifications sont douteuses et ne seront pas effectuées \n";
89
		echo "\n";
90
		$this->executerRequeteMiseAJour();
91
		echo "\n";
92
		echo "-------------------------------------------------------------------\n";
93
		echo "  Migration des noms terminée ... \n";
94
		echo "-------------------------------------------------------------------\n";
95
 
96
	}
97
 
98
	private function chargerInfosNoms() {
99
 
100
		$requete = 'SELECT num_nom, num_nom_retenu, nom_complet, num_taxonomique, famille FROM '.$this->table_eflore;
101
		$nums = $this->bdd->requeter($requete);
102
 
103
		foreach ($nums as $num) {
104
			$this->correspondance_nn_sel_nn_ret[$num['num_nom']] = $num['num_nom_retenu'];
105
			$this->infos_noms[$num['num_nom']] = $num;
106
		}
107
 
108
		echo sizeof($this->correspondance_nn_sel_nn_ret)." noms sélectionnés\n";
109
	}
110
 
111
	private function doitChangerNomRetenu($obs) {
112
		$changement = false;
113
		$nn_retenu_obs = $obs['nom_ret_nn'];
114
		$nn_saisi_obs = $obs['nom_sel_nn'];
115
		$famille_saisie_obs = $obs['famille'];
116
		$sans_nn_retenu = false;
117
 
118
		if($nn_saisi_obs != '') {
119
			if(!isset($this->correspondance_nn_sel_nn_ret[$nn_saisi_obs]) || $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] == 0) {
120
				$this->obs_sans_nn[] = $obs['id_observation'];
121
				$sans_nn_retenu = true;
122
			} else {
123
				if($nn_retenu_obs != $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] && str_word_count($obs['nom_ret']) >= 1) {
124
					$changement = true;
125
				}
126
			}
127
 
128
			if(!$sans_nn_retenu && $famille_saisie_obs != $this->infos_noms[$nn_saisi_obs]['famille']) {
129
				$changement = true;
130
				$this->modif_familles++;
131
			}
132
		}
133
 
134
		if($changement && str_word_count($obs['nom_ret']) == 1) {
135
			$this->modif_douteuses[] = $obs;
136
			$changement = false;
137
		}
138
 
139
		return $changement;
140
	}
141
 
142
	private function getInfosNouveauNumNomRetenu($obs) {
143
		$nouveau_nn_ret = $this->correspondance_nn_sel_nn_ret[$obs['nom_sel_nn']];
144
		return $this->infos_noms[$nouveau_nn_ret];
145
	}
146
 
147
	private function executerRequeteMiseAJour() {
148
		$total = 0;
149
		foreach($this->obs_a_modifier as $valeurs) {
150
			$requete = $this->assemblerRequeteMiseAJour($valeurs);
151
			$migration_noms = $this->bdd->executer($requete);
152
			if ($migration_noms) {
153
				$total++;
154
				$this->script->afficherAvancement('Migration des noms (par 1)', $total);
155
			} else {
156
				echo $requete."\n";
157
				exit('Erreur lors de la migration des noms de l\'observation '.$valeurs['id']."\n");
158
			}
159
		}
160
	}
161
	private function proteger($valeur) {
162
		return $this->bdd->proteger($valeur);
163
	}
164
 
165
	private function assemblerRequeteMiseAJour($tableau) {
166
		$requete = 'UPDATE '.$this->table_cel.' '.
167
		           	'SET nom_ret = '.$this->proteger($tableau['nouveau_nom_sci_retenu']).', '.
168
					'nom_ret_nn = '.$this->proteger($tableau['nouveau_nn_retenu']).', '.
169
					'nt = '.$this->proteger($tableau['nouveau_num_tax']).', '.
170
					'famille = '.$this->proteger($tableau['nouvelle_famille']).', '.
171
					'nom_referentiel = "bdtfx:v1.01" '.
172
					'WHERE id_observation = '.$this->proteger($tableau['id']);
173
		return $requete;
174
	}
175
 
176
	private function initialiserLog() {
177
		$this->fp = fopen($this->chemin_log, 'w');
178
		$colonnes = 'nom sélectionné, nn nom sélectionné, ancien nom retenu, nn ancien nom retenu, '.
179
		'nouveau nom sélectionné, nn nouveau nom sélectionné'."\n";
180
		fwrite($this->fp, $colonnes);
181
	}
182
 
183
	private function logger($obs, $nouveau_nom) {
184
		$chaine = '"'.$obs['nom_sel'].'"'.','.'"'.$obs['nom_sel_nn'].'"'.','.'"'.$obs['nom_ret'].'"'.','.
185
					'"'.$obs['nom_ret_nn'].'"'.','.'"'.$nouveau_nom['nom_complet'].'"'.','.
186
					'"'.$nouveau_nom['num_nom'].'"'."\n";
187
		fwrite($this->fp, $chaine);
188
	}
189
}
190
?>