Subversion Repositories eFlore/Applications.cel

Rev

Rev 1198 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1198 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Script de migration des Observations de la version 1 de la base de données du CEL à la v2.
5
 *
6
 * @category	php 5.2
7
 * @package		Cel/Scripts
8
 * @author		Aurélien 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
 */
1149 gduche 15
class MigrationObs extends Cel {
1184 jpm 16
 
1189 jpm 17
	const truncate = true; //Doit on vider les tables de destination ?
18
	const dry_run = false;
19
	const PATTERN_LAT = '/^[+-]?(?:[1-9][0-9]|[0-9])(?:[.][0-9]+|)$/';
20
	const PATTERN_LNG = '/^[+-]?(?:1[0-8][0-9]|[1-9][0-9]|[0-9])(?:[.][0-9]+|)$/';
21
 
1158 aurelien 22
	public static $bdd_cel_migration;
23
	public static $bdd_utilisateurs;
1189 jpm 24
	private $communesOubliees = array();
25
	private $tableau_utilisateurs = array();
26
	private $tableau_mots_cles = array();
27
	private $tableau_zones_geo = array();
1184 jpm 28
 
1149 gduche 29
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
30
	* La clé est un md5 du message à afficher au démarrage de la boucle.
31
	* @var array
32
	*/
33
	private static $avancement = array();
1184 jpm 34
 
1149 gduche 35
	private $tableau_nouveau_ancien = array(
36
		'id_observation' 		=> 'id',
37
		'ordre'					=> 'ordre',
38
		'ce_utilisateur'		=> 'traiterIdentifiantUtilisateur',
39
		'prenom_utilisateur'	=> 'traiterPrenomUtilisateur',
40
		'nom_utilisateur'		=> 'traiterNomUtilisateur',
41
		'courriel_utilisateur'  => 'identifiant',
42
		'nom_sel'				=> 'nom_sel',
43
		'nom_sel_nn'			=> 'num_nom_sel',
44
		'nom_ret'				=> 'nom_ret',
45
		'nom_ret_nn'			=> 'num_nom_ret',
46
		'nt'					=> 'num_taxon',
47
		'famille'				=> 'famille',
48
		'nom_referentiel'		=> 'traiterReferentiel',
49
		'ce_zone_geo'			=> 'traiterIdentifiantZoneGeo',
50
		'zone_geo'				=> 'location',
51
		'lieudit'				=> 'lieudit',
52
		'station'				=> 'station',
53
		'milieu'				=> 'milieu',
1189 jpm 54
		'latitude'				=> 'traiterLat',
55
		'longitude'				=> 'traiterLng',
1186 jpm 56
		'geodatum'				=> 'traiterGeodatum',
1149 gduche 57
		'date_observation'		=> 'date_observation',
58
		'mots_cles_texte'		=> 'traiterMotsClesTexte',
59
		'commentaire'			=> 'commentaire',
60
		'transmission'			=> 'transmission',
61
		'date_creation'			=> 'date_creation',
62
		'date_modification'		=> 'date_modification',
63
		'date_transmission'		=> 'date_transmission'
64
		);
1184 jpm 65
 
1149 gduche 66
	private $tableau_ancien_nouveau = array(
67
		'id'					=> 'id_observation',
68
		'identifiant'			=> '',
69
		'prenom_utilisateur'	=> 'prenom_utilisateur',
70
		'nom_utilisateur'		=> 'nom_utilisateur',
71
		'ordre'					=> 'ordre',
72
		'nom_sel'				=> 'nom_sel',
73
		'num_nom_sel'			=> 'nom_sel_nn',
74
		'nom_ret'				=> 'nom_ret',
75
		'num_nom_ret'			=> 'nom_ret_nn',
76
		'num_taxon'				=> 'nt',
77
		'famille'				=> 'famille',
78
		'location'				=> '',
79
		'id_location'			=> '',
80
		'date_observation'		=> 'date_observation',
81
		'lieu_dit'				=> 'lieudit',
82
		'station'				=> 'station',
83
		'milieu'				=> 'milieu',
84
		'commentaire'			=> 'commentaire',
85
		'transmission'			=> 'transmission',
86
		'date_creation' 		=> 'date_creation',
87
		'date_modification' 	=> 'date_modification',
88
		'date_transmission'		=> 'date_transmission',
89
		'mots_cles'				=> '',
90
		'coord_x'				=> 'latitude',
91
		'coord_y'				=> 'longitude',
92
		'ref_geo'				=> 'geodatum'
93
		);
94
 
95
	/**
96
	 * Méthode appelée avec une requête de type GET.
97
	 */
98
	public function getElement($params) {
1184 jpm 99
 
1158 aurelien 100
		if(!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') {
101
			echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n";
102
			exit;
103
		}
1184 jpm 104
 
1158 aurelien 105
		if(!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') {
106
			echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n";
107
			exit;
108
		}
1184 jpm 109
 
1158 aurelien 110
		self::$bdd_cel_migration = $this->config['database_cel']['database_migration'];
111
		self::$bdd_utilisateurs = $this->config['database_ident']['database'];
1184 jpm 112
 
1149 gduche 113
		echo "--MIGRATION DES OBSERVATIONS --------------------------------------\n";
114
		//1. TEMPORAIRE : vider les tables de destinations
115
		if (self::truncate) {
116
			echo "-------------------------------------------------------------------\n\n";
117
			echo "  ETAPE 0. Vider les tables ... \n\n";
118
			echo "-------------------------------------------------------------------\n\n";
1189 jpm 119
			$nouvellesTables = array('cel_obs', 'cel_utilisateurs_infos', 'cel_zones_geo');
1149 gduche 120
			foreach ($nouvellesTables as $nomTable) {
121
				echo 'Vider la table '.$nomTable.'...';
1158 aurelien 122
				$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable;
1149 gduche 123
				$resultatTruncate = $this->executerRequete($requeteTruncate);
124
				echo "ok \n";
125
			}
1184 jpm 126
 
1149 gduche 127
			echo "\n---------------------------------------------------------------- OK\n\n";
128
		}
1184 jpm 129
 
1149 gduche 130
		echo "-------------------------------------------------------------------\n\n";
131
		echo "  ETAPE 1. Paramétrage ... \n\n";
132
		echo "-------------------------------------------------------------------\n\n";
133
		$this->getUtilisateurs();
134
		$this->getMotsCles();
1184 jpm 135
 
1149 gduche 136
		echo "-------------------------------------------------------------------\n\n";
137
		echo "  ETAPE 2. Migration des utilisateurs ... \n\n";
138
		echo "-------------------------------------------------------------------\n\n";
1200 jpm 139
		$this->migrerUtilisateurs();
1184 jpm 140
 
1200 jpm 141
 
1149 gduche 142
		echo "-------------------------------------------------------------------\n\n";
143
		echo "  ETAPE 3. Migration des zone géographiques ... \n\n";
144
		echo "-------------------------------------------------------------------\n\n";
145
		$this->migrerZonesGeo();
1184 jpm 146
 
1149 gduche 147
		echo "-------------------------------------------------------------------\n\n";
148
		echo "  ETAPE 4. Migration des observations ... \n\n";
149
		echo "-------------------------------------------------------------------\n\n";
150
		$this->migrerObs();
1200 jpm 151
		$this->mettreANullPrenomNomVide();
152
		$this->ordonnerObs();
1149 gduche 153
		echo "\n"."\n"."\n";
154
	}
1184 jpm 155
 
1149 gduche 156
	public function executerRequeteSimple($requete) {
157
		// Fonction de commodité pour afficher les requetes au lieu de les executer
158
		if (self::dry_run) {
1184 jpm 159
			echo str_replace('),','),'."\n", $requete);
1149 gduche 160
			return true;
161
		} else {
162
			return parent::executerRequeteSimple($requete);
163
		}
164
	}
1184 jpm 165
 
1149 gduche 166
	private function getUtilisateurs() {
167
		echo "\n-------------------------------------------------------------------\n";
168
		echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n";
1184 jpm 169
 
1189 jpm 170
		$requete = 'SELECT DISTINCT u_id AS id, u_mail AS mail, u_name AS nom, u_surname AS prenom, u_passwd AS pass '.
171
			'FROM cel_inventory INNER JOIN '.self::$bdd_utilisateurs.'.annuaire_tela ON (u_mail = identifiant) ';
1184 jpm 172
		$tableau_utilisateurs = $this->executerRequete($requete);
173
 
1149 gduche 174
		foreach( $tableau_utilisateurs as &$utilisateur) {
175
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
176
		}
1184 jpm 177
 
1149 gduche 178
		echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés";
179
		echo "\n-----------------------------------------------------------------OK\n";
180
	}
1184 jpm 181
 
1149 gduche 182
	private function getMotsCles() {
183
		echo "\n-------------------------------------------------------------------\n";
184
		echo "--SELECTION DES MOTS-CLES -----------------------------------------\n\n";
185
 
1184 jpm 186
		$requete = 'SELECT cmc_id_proprietaire as id_utilisateur, cmc_id_mot_cle_utilisateur as id_mot_cle, '.
187
			'cmc_mot_cle as mot_cle '.
188
			'FROM cel_mots_cles_obs ';
189
		$tableau_mots_cles = $this->executerRequete($requete);
190
 
1149 gduche 191
		foreach( $tableau_mots_cles as &$mot_cle) {
192
			$this->tableau_mots_cles[$mot_cle['id_utilisateur']][$mot_cle['id_mot_cle']] = $mot_cle;
193
		}
1184 jpm 194
 
1149 gduche 195
		echo sizeof($this->tableau_mots_cles)." mots-clés sélectionnés";
196
		echo "\n-----------------------------------------------------------------OK\n";
1184 jpm 197
 
1149 gduche 198
	}
1184 jpm 199
 
200
	/**
1149 gduche 201
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
1184 jpm 202
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
203
	 *
1149 gduche 204
	 * @param string le message d'information.
205
	 * @param int le nombre de départ à afficher.
206
	 * @return void le message est affiché dans la console.
207
	 */
208
	protected function afficherAvancement($message, $depart = 0) {
209
		if (! isset(self::$avancement[$message])) {
210
			self::$avancement[$message] = $depart;
211
			echo "$message : ";
1184 jpm 212
 
1149 gduche 213
			$actuel =& self::$avancement[$message];
214
			echo $actuel++;
215
		} else {
216
			$actuel =& self::$avancement[$message];
1184 jpm 217
 
1149 gduche 218
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
219
			$passage = 0;
220
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
1184 jpm 221
				$passage = 1;
1149 gduche 222
			}
1184 jpm 223
 
1149 gduche 224
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
225
			echo $actuel++;
226
		}
227
	}
1184 jpm 228
 
1149 gduche 229
	private function migrerUtilisateurs() {
1189 jpm 230
		$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_utilisateurs_infos '.
231
					'(id_utilisateur) '.
232
					'VALUES ';
1184 jpm 233
 
1189 jpm 234
		$sous_requete = array();
235
		foreach ($this->tableau_utilisateurs as $id => &$utilisateur) {
236
			$sous_requete[] = '('.$this->proteger($utilisateur['id']).')';
237
		}
238
		$requete .= implode(',', $sous_requete);
1184 jpm 239
 
1189 jpm 240
		$migration_utilisateurs = $this->executerRequeteSimple($requete);
241
 
242
		if ($migration_utilisateurs) {
243
			echo "Migration utilisateurs : ".count($sous_requete);
244
		} else {
245
			exit('Erreur lors de la migration des utilisateurs '."\n");
1149 gduche 246
		}
247
		echo "\n---------------------------------------------------------------- OK\n\n";
1184 jpm 248
 
1149 gduche 249
	}
1184 jpm 250
 
1149 gduche 251
	private function migrerZonesGeo() {
1184 jpm 252
 
1149 gduche 253
		$pas = 5000;
1184 jpm 254
 
1149 gduche 255
		//SELECTIONNER LE NOMBRE DE ZONE GEO
256
		$requete_nombreZonesGeo = 'SELECT count(*) as nb FROM locations';
257
		$resultatNbZonesGeo = $this->executerRequete($requete_nombreZonesGeo);
258
		$nbZones = (int) $resultatNbZonesGeo[0]['nb'];
1184 jpm 259
 
1149 gduche 260
		$nbTotal = 0;
261
		for($i = 0; $i <= $nbZones ; $i += $pas) {
1184 jpm 262
 
1149 gduche 263
			$requete_selection_zones_geo = 'SELECT * FROM locations LIMIT '.$i.', '.$pas;
1184 jpm 264
 
1149 gduche 265
			$zones_geo = $this->executerRequete($requete_selection_zones_geo);
1184 jpm 266
 
1158 aurelien 267
			$requete_insertion_nouvelles_zones_geo = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_zones_geo '.
1149 gduche 268
					'(id_zone_geo, code, nom, utm_secteur, utm_x, utm_y, wgs84_latitude, wgs84_longitude, date_modification) '.
269
					'VALUES ';
1184 jpm 270
 
1149 gduche 271
			$sous_requete_insertion_valeurs = '';
1184 jpm 272
 
273
			if(count($zones_geo) > 0) {
1149 gduche 274
				foreach($zones_geo as $zone_geo) {
1184 jpm 275
 
1149 gduche 276
					$zone_geo['nouveau_code_geo'] = 'INSEE-C:'.$zone_geo['insee_code'];
277
					$lat_long = $this->convertirUtmVersLatLong($zone_geo['x_utm'],$zone_geo['y_utm'],$zone_geo['sector']);
1184 jpm 278
 
1149 gduche 279
					$indice_tableau_localites = $this->construireIndiceTableauLocalites($zone_geo['name'], $zone_geo['insee_code']);
280
					$this->tableau_zones_geo[$indice_tableau_localites] = $zone_geo;
1184 jpm 281
 
1149 gduche 282
					$sous_requete_insertion_valeurs .= '('.$this->proteger($zone_geo['nouveau_code_geo']).','.
283
														$this->proteger($zone_geo['insee_code']).','.
284
														$this->proteger($zone_geo['name']).','.
285
														$this->proteger($zone_geo['sector']).','.
286
														$this->proteger($zone_geo['x_utm']).','.
287
														$this->proteger($zone_geo['y_utm']).','.
288
														$this->proteger($lat_long['lat']).','.
289
														$this->proteger($lat_long['long']).','.
290
														$this->proteger($zone_geo['update_date']).
291
														'),';
292
				}
1184 jpm 293
 
1149 gduche 294
				$sous_requete_insertion_valeurs = rtrim($sous_requete_insertion_valeurs,',');
1184 jpm 295
 
1149 gduche 296
				$requete_insertion_nouvelles_zones_geo .= $sous_requete_insertion_valeurs;
1184 jpm 297
 
1149 gduche 298
				$migration_zones_geo = $this->executerRequeteSimple($requete_insertion_nouvelles_zones_geo);
299
			} else {
300
				echo 'Fin de migration des zones géo '."\n";
1184 jpm 301
				return;
1149 gduche 302
			}
1184 jpm 303
 
1149 gduche 304
			if ($migration_zones_geo) {
1184 jpm 305
				$nbTotal ++;
1149 gduche 306
				$this->afficherAvancement('Migration des zones (par '.$pas.')', $nbTotal);
307
			} else {
308
				exit('Erreur lors de la migration des zones géo '.$i.' à '.($i+$pas)."\n");
309
			}
310
		}
311
		echo "\n---------------------------------------------------------------- OK\n\n";
312
	}
1184 jpm 313
 
1149 gduche 314
	private function convertirUtmVersLatLong($x, $y, $sector) {
315
    	$lat_long = array();
1184 jpm 316
 
1149 gduche 317
    	$convertisseur = new gPoint();
318
		$convertisseur->setUTM($x, $y, $sector);
319
		$convertisseur->convertTMtoLL();
320
		$lat_long['lat'] = str_replace(',','.',$convertisseur->Lat());
321
		$lat_long['long'] = str_replace(',','.',$convertisseur->Long());
1184 jpm 322
 
1149 gduche 323
		return $lat_long;
324
    }
1184 jpm 325
 
1149 gduche 326
	private function migrerObs() {
327
		$debut = 0;
328
		$pas = 1000;
329
		$nbTotal = 0;
1184 jpm 330
 
1149 gduche 331
		//Selectionner le nombre d'observations
332
		$requeteNbObs = "SELECT COUNT(*) as nb FROM cel_inventory";
333
		$resultatNbObs = $this->executerRequete($requeteNbObs);
334
		$fin = $resultatNbObs[0]['nb'];
1184 jpm 335
 
1149 gduche 336
		for ($i = $debut; $i < $fin ; $i += $pas) {
337
			$requete_selection_obs = 'SELECT * FROM cel_inventory '.
338
											'ORDER BY identifiant LIMIT '.$i.','.$pas;
339
			$observations = $this->requeter($requete_selection_obs);
1184 jpm 340
 
1158 aurelien 341
			$requete_insertion_observations = 'INSERT IGNORE INTO '.self::$bdd_cel_migration.'.cel_obs (';
1184 jpm 342
 
1149 gduche 343
			foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) {
344
				$requete_insertion_observations .= $nouveau_champ.',';
1184 jpm 345
			}
346
 
1149 gduche 347
			$requete_insertion_observations = rtrim($requete_insertion_observations, ',');
348
			$requete_insertion_observations = $requete_insertion_observations.') VALUES ';
1184 jpm 349
 
350
			if (count($observations) > 0) {
1149 gduche 351
				foreach($observations as $observation) {
352
					$nouvelle_observation = $this->traiterLigneObservation($observation);
1184 jpm 353
 
1189 jpm 354
					$nouvelle_observation = array_map(array($this, 'protegerSiNonNull'), $nouvelle_observation);
355
					$requete_insertion_observations .= '('.join(',', array_values($nouvelle_observation)).'),';
1149 gduche 356
				}
1184 jpm 357
 
1149 gduche 358
				$requete_insertion_observations = rtrim($requete_insertion_observations, ',');
1184 jpm 359
 
1149 gduche 360
				$migration_observations = $this->executerRequeteSimple($requete_insertion_observations);
361
			} else {
362
				echo 'Fin de migration des observations '."\n"."\n";
1184 jpm 363
				return;
1149 gduche 364
			}
1184 jpm 365
 
1149 gduche 366
			if ($migration_observations) {
1184 jpm 367
				$nbTotal ++;
1149 gduche 368
				$this->afficherAvancement('Migration des observations (par '.$pas.')', $nbTotal);
369
			} else {
370
				exit('Erreur lors de la migration des observation de '.$i.' à '.($i+$pas)."\n");
371
			}
372
		}
373
		if (sizeof($this->communesOubliees) > 0) {
1158 aurelien 374
			echo "\nxxxxxxxxx communes oubliées : ".sizeof($this->communesOubliees)." xxxxxxxxx \\n";
1149 gduche 375
		}
376
		echo "\n---------------------------------------------------------------- OK\n\n";
377
	}
1184 jpm 378
 
379
	private function ordonnerObs() {
1186 jpm 380
		$requete = 'ALTER TABLE '.self::$bdd_cel_migration.'.cel_obs ORDER BY id_observation';
1184 jpm 381
		$this->executerRequeteSimple($requete);
382
	}
383
 
1149 gduche 384
	private function traiterLigneObservation($obs) {
385
		$nouvelle_obs = array();
1184 jpm 386
		foreach($this->tableau_nouveau_ancien as $nouveau_champ_obs => $ancien_champ_obs) {
1149 gduche 387
			if ($this->estUnChampATraiter($ancien_champ_obs)) {
1186 jpm 388
				if (method_exists($this, $ancien_champ_obs)) {
1149 gduche 389
					$nouvelle_obs[$nouveau_champ_obs] = $this->$ancien_champ_obs($obs);
390
				} else {
391
					$nouvelle_obs[$nouveau_champ_obs] = '';
392
				}
393
			} else {
1186 jpm 394
				if ($obs[$ancien_champ_obs] == '000null' || $obs[$ancien_champ_obs] == 'null' || trim($obs[$ancien_champ_obs]) == '') {
1158 aurelien 395
					$obs[$ancien_champ_obs] = 'NULL';
396
				}
1184 jpm 397
 
1186 jpm 398
				if (($ancien_champ_obs == 'coord_x' || $ancien_champ_obs == 'coord_y') && ($obs[$ancien_champ_obs] == '0' || $obs[$ancien_champ_obs] == 0)) {
1158 aurelien 399
					$obs[$ancien_champ_obs] = 'NULL';
400
				}
1184 jpm 401
 
1149 gduche 402
				$nouvelle_obs[$nouveau_champ_obs] = $obs[$ancien_champ_obs];
403
			}
404
		}
405
		return $nouvelle_obs;
406
	}
1184 jpm 407
 
1158 aurelien 408
	private function protegerSiNonNull($valeur) {
1186 jpm 409
		if ($valeur != 'NULL') {
1158 aurelien 410
			$valeur = $this->proteger($valeur);
411
		}
412
		return $valeur;
413
	}
1184 jpm 414
 
1149 gduche 415
	private function estUnChampATraiter($champ) {
416
		return strpos($champ,'traiter') !== false;
417
	}
1184 jpm 418
 
1149 gduche 419
	private function traiterReferentiel($observation) {
1186 jpm 420
		$retour = 'NULL';
421
		if ($observation['num_nom_sel'] != '' && $observation['num_nom_sel'] != '0') {
422
			$retour = 'bdnff:4.02';
423
		}
424
		return $retour;
1149 gduche 425
	}
1184 jpm 426
 
1189 jpm 427
	private function traiterLat(&$observation) {
428
		if ($this->etreNull($observation['coord_x'])) {
429
			$observation['coord_x'] = 'NULL';
430
		} else if (preg_match(self::PATTERN_LAT, $observation['coord_x']) == false) {
431
			$latNote = 'Latitude éronnée : '.$observation['coord_x'];
432
			if ($this->etreNull($observation['commentaire'])) {
433
				$observation['commentaire'] = $latNote;
434
			} else {
435
				$observation['commentaire'] .= "\n".$latNote;
436
			}
437
			$observation['coord_x'] = 'NULL';
438
		}
439
		$retour = $observation['coord_x'];
440
		return $retour;
441
	}
442
 
443
	private function traiterLng(&$observation) {
444
		if ($this->etreNull($observation['coord_y'])) {
445
			$observation['coord_y'] = 'NULL';
446
		} else if (preg_match(self::PATTERN_LNG, $observation['coord_y']) == false) {
447
			$lngNote = 'Longitude éronnée : '.$observation['coord_y'];
448
			if ($this->etreNull($observation['commentaire'])) {
449
				$observation['commentaire'] = $lngNote;
450
			} else {
451
				$observation['commentaire'] .= "\n".$lngNote;
452
			}
453
			$observation['coord_y'] = 'NULL';
454
		}
455
		$retour = $observation['coord_y'];
456
		return $retour;
457
	}
458
 
1186 jpm 459
	private function traiterGeodatum($observation) {
460
		$retour = 'NULL';
461
		if ($observation['coord_x'] != 'NULL' && $observation['coord_y'] != 'NULL') {
462
			$retour = 'WGS84';
463
		}
464
		return $retour;
465
	}
466
 
1149 gduche 467
	private function traiterMotsClesTexte($ligne_observation) {
468
		$mail_observation = $ligne_observation['identifiant'];
1184 jpm 469
		$retour = $ligne_observation['mots_cles'];
1149 gduche 470
		if (isset($this->tableau_mots_cles[$mail_observation])) {
471
			$mots_cles_tableau = $this->parserMotsCles($mail_observation, $ligne_observation['mots_cles'], ';');
1186 jpm 472
			$retour =  join(',', $mots_cles_tableau);
473
			$retour = ltrim($retour, ',,') ;
1149 gduche 474
		}
1184 jpm 475
 
1149 gduche 476
		return $retour;
1184 jpm 477
	}
478
 
1149 gduche 479
	private function parserMotsCles($utilisateur, $mot_cles, $separateur = ',') {
480
		$tableau_mots_cles = explode($separateur,$mot_cles);
481
		$tableau_mots_cles_formates = array();
1184 jpm 482
 
1186 jpm 483
		foreach ($tableau_mots_cles as $mot_cle) {
1184 jpm 484
 
1149 gduche 485
			$mot_cle = str_replace($separateur.$separateur,'',$mot_cle);
486
			$mot_cle = str_replace('null','',$mot_cle);
1184 jpm 487
 
1149 gduche 488
			if ($this->estUnIdentifiantMotCle($mot_cle)) {
1184 jpm 489
 
1149 gduche 490
				// certains mots clés mal formatés contiennent des virgules
491
				if (strpos($mot_cle,',') !== false) {
492
					$tab_mot_cle_mal_formate = explode(',',$mot_cle);
1184 jpm 493
 
1149 gduche 494
					foreach ($tab_mot_cle_mal_formate as $mot_cle_mal_formate) {
495
						if ($this->estUnIdentifiantMotCle($mot_cle_mal_formate)) {
496
							$tableau_mots_cles_formates[$mot_cle_mal_formate] = $this->tableau_mots_cles[$utilisateur][$mot_cle_mal_formate]['mot_cle'];
497
						}
1184 jpm 498
					}
1149 gduche 499
				} else {
500
					// on met le mot clé dans sa propre case afin d'éviter
1184 jpm 501
					// facilement les doublons provoqués par de mauvais formatages
502
					if (isset($this->tableau_mots_cles[$utilisateur][$mot_cle]) && trim($this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']) != '') {
1149 gduche 503
						$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle'];
504
					}
505
				}
506
 
507
			}
508
		}
1184 jpm 509
 
1149 gduche 510
		return $tableau_mots_cles_formates;
511
	}
1184 jpm 512
 
1149 gduche 513
	private function estUnIdentifiantMotCle($chaine) {
514
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine) ;
515
	}
1184 jpm 516
 
1149 gduche 517
	private function traiterIdentifiantUtilisateur($ligne_observation) {
518
		$mail_observation = $ligne_observation['identifiant'];
1181 aurelien 519
		$retour = $this->renvoyerIdPourMigration($mail_observation);
1149 gduche 520
		return $retour;
521
	}
1184 jpm 522
 
1149 gduche 523
	private function traiterPrenomUtilisateur($ligne_observation) {
524
		$mail_observation = $ligne_observation['identifiant'];
1184 jpm 525
 
526
		$retour = '';
1149 gduche 527
		if (isset($this->tableau_utilisateurs[$mail_observation])) {
1184 jpm 528
			$prenom =  $this->tableau_utilisateurs[$mail_observation]['prenom'];
529
			$retour = self::formaterMotPremiereLettreChaqueMotEnMajuscule($prenom);
1149 gduche 530
		}
531
		return $retour;
532
	}
1184 jpm 533
 
1149 gduche 534
	private function traiterNomUtilisateur($ligne_observation) {
535
		$mail_observation = $ligne_observation['identifiant'];
1184 jpm 536
 
537
		$retour = '';
1149 gduche 538
		if (isset($this->tableau_utilisateurs[$mail_observation])) {
1184 jpm 539
			$nom =  $this->tableau_utilisateurs[$mail_observation]['nom'];
540
			$retour = self::formaterMotEnMajuscule($nom);
1149 gduche 541
		}
542
		return $retour;
543
	}
1184 jpm 544
 
545
	public static function formaterMotPremiereLettreChaqueMotEnMajuscule($chaine, $encodage= 'UTF-8') {
546
		$chaine = str_replace('-', ' - ', $chaine);
547
		$chaine = mb_strtolower($chaine, $encodage);
548
		$chaine = mb_convert_case($chaine, MB_CASE_TITLE, $encodage);
549
		$chaine = str_replace(' - ', '-', $chaine);
550
		return $chaine;
551
	}
552
 
553
	public static function formaterMotEnMajuscule($chaine, $encodage= 'UTF-8') {
554
		return mb_convert_case($chaine, MB_CASE_UPPER, $encodage);
555
	}
556
 
1149 gduche 557
	private function traiterZoneGeo($ligne_observation) {
1184 jpm 558
 
1149 gduche 559
		$zone_geo = $ligne_observation['location'];
1184 jpm 560
 
561
		if ($ligne_observation['id_location'] != null && !is_numeric($ligne_observation['id_location']) && $ligne_observation['id_location'] != '000null') {
1149 gduche 562
			$id_zone_geo_ancienne = $ligne_observation['id_location'];
1184 jpm 563
			if ($zone_geo != '') {
1149 gduche 564
				$id_zone_geo_ancienne = '('.$id_zone_geo_ancienne.')';
565
			}
1184 jpm 566
 
1149 gduche 567
			$zone_geo .= $id_zone_geo_ancienne;
1184 jpm 568
		} else if ($ligne_observation['location'] == null || $ligne_observation['location'] == "" || $ligne_observation['location'] == "000null") {
569
 
570
			if ($ligne_observation['id_location'] != '' && $ligne_observation['id_location'] != '000null') {
1158 aurelien 571
				$id_zone_geo_ancienne = $ligne_observation['id_location'];
572
				$id_zone_geo_ancienne = $id_zone_geo_ancienne;
573
				$zone_geo = $id_zone_geo_ancienne;
574
			} else {
575
				$zones_geo = 'NULL';
576
			}
1149 gduche 577
		}
1184 jpm 578
 
1149 gduche 579
		return $zone_geo;
580
	}
1184 jpm 581
 
1149 gduche 582
	private function traiterIdentifiantZoneGeo($ligne_observation) {
583
		$id_zone_geo = '';
1184 jpm 584
 
585
		if ($ligne_observation['id_location'] != '' && $ligne_observation['id_location'] != '000null') {
1149 gduche 586
			$indice = $this->construireIndiceTableauLocalites($ligne_observation['location'], $ligne_observation['id_location']);
1184 jpm 587
			if (isset($this->tableau_zones_geo[$indice])) {
1149 gduche 588
				$id_zone_geo = $this->tableau_zones_geo[$indice]['nouveau_code_geo'];
589
			} else {
1184 jpm 590
				if ($ligne_observation['location'] != "000null") {
1149 gduche 591
					$this->communesOubliees[$indice] = false;
592
				}
593
			}
1158 aurelien 594
		} else {
595
			$id_zone_geo = 'NULL';
1149 gduche 596
		}
1184 jpm 597
 
1149 gduche 598
		return $id_zone_geo;
599
	}
1184 jpm 600
 
1149 gduche 601
	private function construireIndiceTableauLocalites($nom, $id) {
602
		$nom = htmlentities($nom, ENT_NOQUOTES, 'UTF-8');
1184 jpm 603
 
1149 gduche 604
    	$nom = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $nom);
605
    	$nom = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $nom); // pour les ligatures e.g. '&oelig;'
606
    	$nom = preg_replace('#&[^;]+;#', '', $nom); // supprime les autres caractères
1184 jpm 607
 
1149 gduche 608
    	$nom = str_replace("'",'_',$nom);
609
		$nom = str_replace(' ','_',$nom);
610
		$nom = str_replace('-','_',$nom);
611
		$nom = str_replace('  ','_',$nom);
612
		$indice = strtolower($nom).substr($id,0,2);
1184 jpm 613
 
1149 gduche 614
		return $indice;
1184 jpm 615
	}
616
 
617
	// Par défaut, on garde l'utilisateur tel quel (cas de la chaine de session des utilisateur anonymes)
1181 aurelien 618
	private function renvoyerIdPourMigration($utilisateur) {
619
		$retour = $utilisateur;
620
		// si le mail correspond a un utilisateur de la bdd
621
		if (isset($this->tableau_utilisateurs[$utilisateur])) {
1184 jpm 622
			// on renvoie son id
623
			$retour = $this->tableau_utilisateurs[$utilisateur]['id'];
624
		} else if ($utilisateur != '') {
625
			// sinon si c'est un mail inconnu, on garde le md5
626
			if ($this->mailValide($utilisateur)) {
627
				$retour = md5($utilisateur);
628
			}
1181 aurelien 629
		}
630
		return $retour;
631
	}
1184 jpm 632
 
1181 aurelien 633
	public function mailValide($mail) {
634
		// vérification bidon mais ça suffit pour ici
1184 jpm 635
		return !(strpos('@', $mail) === false);
1200 jpm 636
	}
637
 
638
	private function mettreANullPrenomNomVide() {
639
		$bdd = self::$bdd_cel_migration;
640
		$requete = 	"UPDATE $bdd.cel_obs ".
641
				'SET prenom_utilisateur = NULL '.
642
				"WHERE prenom_utilisateur = '' ";
643
		$this->executer($requete);
644
 
645
		$requete = 	"UPDATE $bdd.cel_obs ".
646
				'SET nom_utilisateur = NULL '.
647
				"WHERE nom_utilisateur = '' ";
648
		$this->executer($requete);
1181 aurelien 649
	}
1149 gduche 650
}