Subversion Repositories eFlore/Applications.cel

Rev

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

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