Subversion Repositories eFlore/Applications.cel

Rev

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