Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1149 gduche 1
<?php
2
 
3
class MigrationObs extends Cel {
4
 
5
	const bdd_cel_migration = 'cel';
6
	const bdd_utilisateurs = 'cel_old';
7
 
8
	const truncate = true; //Doit on vider les tables de destination ?
9
 
10
	const dry_run = true;
11
 
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();
17
 
18
	private $communesOubliees = array();
19
	private $tableau_utilisateurs = array();
20
	private $tableau_mots_cles = array();
21
	private $tableau_zones_geo = array();
22
 
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',
44
		'geodatum'				=> 'ref_geo',
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
		);
53
 
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) {
87
 
88
		echo "--MIGRATION DES OBSERVATIONS --------------------------------------\n";
89
		//1. TEMPORAIRE : vider les tables de destinations
90
		if (self::truncate) {
91
			echo "-------------------------------------------------------------------\n\n";
92
			echo "  ETAPE 0. Vider les tables ... \n\n";
93
			echo "-------------------------------------------------------------------\n\n";
94
			$nouvellesTables = array('`cel_images`', '`cel_images_mots_cles`', '`cel_mots_cles_images`', '`cel_mots_cles_obs`;',
95
								'`cel_obs`', '`cel_obs_images`', '`cel_obs_mots_cles`', '`cel_utilisateurs`', '`cel_utilisateurs`', '`cel_zones_geo`');
96
			foreach ($nouvellesTables as $nomTable) {
97
				echo 'Vider la table '.$nomTable.'...';
98
				$requeteTruncate = 'TRUNCATE TABLE '.self::bdd_cel_migration.'.'.$nomTable;
99
				$resultatTruncate = $this->executerRequete($requeteTruncate);
100
				echo "ok \n";
101
			}
102
 
103
			echo "\n---------------------------------------------------------------- OK\n\n";
104
		}
105
 
106
		echo "-------------------------------------------------------------------\n\n";
107
		echo "  ETAPE 1. Paramétrage ... \n\n";
108
		echo "-------------------------------------------------------------------\n\n";
109
 
110
		$this->getUtilisateurs();
111
		$this->getMotsCles();
112
 
113
		echo "-------------------------------------------------------------------\n\n";
114
		echo "  ETAPE 2. Migration des utilisateurs ... \n\n";
115
		echo "-------------------------------------------------------------------\n\n";
116
 
117
		$this->migrerUtilisateurs();
118
 
119
		echo "-------------------------------------------------------------------\n\n";
120
		echo "  ETAPE 3. Migration des zone géographiques ... \n\n";
121
		echo "-------------------------------------------------------------------\n\n";
122
		$this->migrerZonesGeo();
123
 
124
		echo "-------------------------------------------------------------------\n\n";
125
		echo "  ETAPE 4. Migration des observations ... \n\n";
126
		echo "-------------------------------------------------------------------\n\n";
127
		$this->migrerObs();
128
		echo "\n"."\n"."\n";
129
	}
130
 
131
	public function executerRequeteSimple($requete) {
132
		// Fonction de commodité pour afficher les requetes au lieu de les executer
133
		if (self::dry_run) {
134
			echo str_replace('),','),'."\n", $requete);
135
			return true;
136
		} else {
137
			return parent::executerRequeteSimple($requete);
138
		}
139
	}
140
 
141
	private function getUtilisateurs() {
142
		echo "\n-------------------------------------------------------------------\n";
143
		echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n";
144
 
145
		$requete_selection_utilisateurs = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom, U_PASSWD as pass FROM '.self::bdd_utilisateurs.'.annuaire_tela';
146
		$tableau_utilisateurs = $this->executerRequete($requete_selection_utilisateurs);
147
 
148
		foreach( $tableau_utilisateurs as &$utilisateur) {
149
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
150
		}
151
 
152
		echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés";
153
		echo "\n-----------------------------------------------------------------OK\n";
154
	}
155
 
156
	private function getMotsCles() {
157
		echo "\n-------------------------------------------------------------------\n";
158
		echo "--SELECTION DES MOTS-CLES -----------------------------------------\n\n";
159
 
160
		$requete_selection_mots_cles = 'SELECT cmc_id_proprietaire as id_utilisateur, cmc_id_mot_cle_utilisateur as id_mot_cle, cmc_mot_cle as mot_cle FROM cel_mots_cles_obs';
161
		$tableau_mots_cles = $this->executerRequete($requete_selection_mots_cles);
162
 
163
		foreach( $tableau_mots_cles as &$mot_cle) {
164
			$this->tableau_mots_cles[$mot_cle['id_utilisateur']][$mot_cle['id_mot_cle']] = $mot_cle;
165
		}
166
 
167
		echo sizeof($this->tableau_mots_cles)." mots-clés sélectionnés";
168
		echo "\n-----------------------------------------------------------------OK\n";
169
 
170
	}
171
 
172
	/**
173
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
174
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
175
	 *
176
	 * @param string le message d'information.
177
	 * @param int le nombre de départ à afficher.
178
	 * @return void le message est affiché dans la console.
179
	 */
180
	protected function afficherAvancement($message, $depart = 0) {
181
		if (! isset(self::$avancement[$message])) {
182
			self::$avancement[$message] = $depart;
183
			echo "$message : ";
184
 
185
			$actuel =& self::$avancement[$message];
186
			echo $actuel++;
187
		} else {
188
			$actuel =& self::$avancement[$message];
189
 
190
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
191
			$passage = 0;
192
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
193
				$passage = 1;
194
			}
195
 
196
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
197
			echo $actuel++;
198
		}
199
	}
200
 
201
	private function migrerUtilisateurs() {
202
 
203
		$pas = 1000;
204
		$nbTotal = 0;
205
		$tabUtilisateurs = $this->tableau_utilisateurs;
206
		while (!empty($tabUtilisateurs)) {
207
			$requete_insertion_utilisateurs = 'INSERT INTO '.self::bdd_cel_migration.'.cel_utilisateurs '.
208
						'(id_utilisateur, prenom, nom, courriel, mot_de_passe) '.
209
						'VALUES ';
210
			$sous_requete_insertion = '';
211
 
212
			$i = 0;
213
			foreach ($tabUtilisateurs as $id => &$utilisateur) {
214
 
215
				$i++;
216
				if ($i == $pas) {
217
					break;
218
				}
219
				$sous_requete_insertion .= '('.$this->proteger($utilisateur['id']).','.
220
												$this->proteger($utilisateur['prenom']).','.
221
												$this->proteger($utilisateur['nom']).','.
222
												$this->proteger($utilisateur['mail']).','.
223
												$this->proteger($utilisateur['pass']).'),';
224
				unset($tabUtilisateurs[$id]);
225
 
226
			}
227
 
228
			$sous_requete_insertion = rtrim($sous_requete_insertion,',');
229
			$requete_insertion_utilisateurs = $requete_insertion_utilisateurs.$sous_requete_insertion;
230
 
231
			$migration_utilisateurs = $this->executerRequeteSimple($requete_insertion_utilisateurs);
232
 
233
			if ($migration_utilisateurs) {
234
				$nbTotal ++;
235
				$this->afficherAvancement('Migration utilisateurs (par '.$pas.')', $nbTotal);
236
			} else {
237
				exit($requete_insertion_utilisateurs);
238
				exit('Erreur lors de la migration des utilisateurs '."\n");
239
			}
240
		}
241
		echo "\n---------------------------------------------------------------- OK\n\n";
242
 
243
	}
244
 
245
	private function migrerZonesGeo() {
246
 
247
		$pas = 5000;
248
 
249
		//SELECTIONNER LE NOMBRE DE ZONE GEO
250
		$requete_nombreZonesGeo = 'SELECT count(*) as nb FROM locations';
251
		$resultatNbZonesGeo = $this->executerRequete($requete_nombreZonesGeo);
252
		$nbZones = (int) $resultatNbZonesGeo[0]['nb'];
253
 
254
		$nbTotal = 0;
255
		for($i = 0; $i <= $nbZones ; $i += $pas) {
256
 
257
			$requete_selection_zones_geo = 'SELECT * FROM locations LIMIT '.$i.', '.$pas;
258
 
259
			$zones_geo = $this->executerRequete($requete_selection_zones_geo);
260
 
261
			$requete_insertion_nouvelles_zones_geo = 'INSERT INTO '.self::bdd_cel_migration.'.cel_zones_geo '.
262
					'(id_zone_geo, code, nom, utm_secteur, utm_x, utm_y, wgs84_latitude, wgs84_longitude, date_modification) '.
263
					'VALUES ';
264
 
265
			$sous_requete_insertion_valeurs = '';
266
 
267
			if(count($zones_geo) > 0) {
268
				foreach($zones_geo as $zone_geo) {
269
 
270
					$zone_geo['nouveau_code_geo'] = 'INSEE-C:'.$zone_geo['insee_code'];
271
					$lat_long = $this->convertirUtmVersLatLong($zone_geo['x_utm'],$zone_geo['y_utm'],$zone_geo['sector']);
272
 
273
					$indice_tableau_localites = $this->construireIndiceTableauLocalites($zone_geo['name'], $zone_geo['insee_code']);
274
					$this->tableau_zones_geo[$indice_tableau_localites] = $zone_geo;
275
 
276
					$sous_requete_insertion_valeurs .= '('.$this->proteger($zone_geo['nouveau_code_geo']).','.
277
														$this->proteger($zone_geo['insee_code']).','.
278
														$this->proteger($zone_geo['name']).','.
279
														$this->proteger($zone_geo['sector']).','.
280
														$this->proteger($zone_geo['x_utm']).','.
281
														$this->proteger($zone_geo['y_utm']).','.
282
														$this->proteger($lat_long['lat']).','.
283
														$this->proteger($lat_long['long']).','.
284
														$this->proteger($zone_geo['update_date']).
285
														'),';
286
				}
287
 
288
				$sous_requete_insertion_valeurs = rtrim($sous_requete_insertion_valeurs,',');
289
 
290
				$requete_insertion_nouvelles_zones_geo .= $sous_requete_insertion_valeurs;
291
 
292
				$migration_zones_geo = $this->executerRequeteSimple($requete_insertion_nouvelles_zones_geo);
293
			} else {
294
				echo 'Fin de migration des zones géo '."\n";
295
				return;
296
			}
297
 
298
			if ($migration_zones_geo) {
299
				$nbTotal ++;
300
				$this->afficherAvancement('Migration des zones (par '.$pas.')', $nbTotal);
301
			} else {
302
				exit('Erreur lors de la migration des zones géo '.$i.' à '.($i+$pas)."\n");
303
			}
304
		}
305
		echo "\n---------------------------------------------------------------- OK\n\n";
306
	}
307
 
308
	private function convertirUtmVersLatLong($x, $y, $sector) {
309
 
310
    	$lat_long = array();
311
 
312
    	$convertisseur = new gPoint();
313
		$convertisseur->setUTM($x, $y, $sector);
314
		$convertisseur->convertTMtoLL();
315
		$lat_long['lat'] = str_replace(',','.',$convertisseur->Lat());
316
		$lat_long['long'] = str_replace(',','.',$convertisseur->Long());
317
 
318
		return $lat_long;
319
    }
320
 
321
	private function migrerObs() {
322
 
323
		$debut = 0;
324
		$pas = 1000;
325
		$nbTotal = 0;
326
 
327
		//Selectionner le nombre d'observations
328
		$requeteNbObs = "SELECT COUNT(*) as nb FROM cel_inventory";
329
		$resultatNbObs = $this->executerRequete($requeteNbObs);
330
		$fin = $resultatNbObs[0]['nb'];
331
 
332
		for ($i = $debut; $i < $fin ; $i += $pas) {
333
			$requete_selection_obs = 'SELECT * FROM cel_inventory '.
334
											'ORDER BY identifiant LIMIT '.$i.','.$pas;
335
			$observations = $this->requeter($requete_selection_obs);
336
 
337
			$requete_insertion_observations = 'INSERT IGNORE INTO '.self::bdd_cel_migration.'.cel_obs (';
338
 
339
			foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) {
340
				$requete_insertion_observations .= $nouveau_champ.',';
341
			}
342
 
343
			$requete_insertion_observations = rtrim($requete_insertion_observations, ',');
344
			$requete_insertion_observations = $requete_insertion_observations.') VALUES ';
345
 
346
			if (count($observations) > 0) {
347
				foreach($observations as $observation) {
348
					$nouvelle_observation = $this->traiterLigneObservation($observation);
349
 
350
					$nouvelle_observation = array_map(array($this,'proteger'),$nouvelle_observation);
351
					$requete_insertion_observations .= '('.join(',',array_values($nouvelle_observation)).'),';
352
				}
353
 
354
				$requete_insertion_observations = rtrim($requete_insertion_observations, ',');
355
 
356
				$migration_observations = $this->executerRequeteSimple($requete_insertion_observations);
357
				//exit($requete_insertion_observations);
358
			} else {
359
				echo 'Fin de migration des observations '."\n"."\n";
360
				return;
361
			}
362
 
363
			if ($migration_observations) {
364
				$nbTotal ++;
365
				$this->afficherAvancement('Migration des observations (par '.$pas.')', $nbTotal);
366
			} else {
367
				exit('Erreur lors de la migration des observation de '.$i.' à '.($i+$pas)."\n");
368
			}
369
		}
370
		if (sizeof($this->communesOubliees) > 0) {
371
			echo "\nxxxxxxxxx communes oubliées : ".sizeof($this->communnesOubliees)." xxxxxxxxx \\n";
372
			echo var_dump(array_keys($this->communesOubliees));
373
		}
374
		echo "\n---------------------------------------------------------------- OK\n\n";
375
	}
376
 
377
	private function traiterLigneObservation($obs) {
378
 
379
		$nouvelle_obs = array();
380
 
381
		foreach($this->tableau_nouveau_ancien as $nouveau_champ_obs => $ancien_champ_obs) {
382
 
383
			if ($this->estUnChampATraiter($ancien_champ_obs)) {
384
				if (method_exists($this,$ancien_champ_obs)) {
385
					$nouvelle_obs[$nouveau_champ_obs] = $this->$ancien_champ_obs($obs);
386
				} else {
387
					$nouvelle_obs[$nouveau_champ_obs] = '';
388
				}
389
 
390
			} else {
391
				$nouvelle_obs[$nouveau_champ_obs] = $obs[$ancien_champ_obs];
392
			}
393
		}
394
		return $nouvelle_obs;
395
	}
396
 
397
	private function estUnChampATraiter($champ) {
398
		return strpos($champ,'traiter') !== false;
399
	}
400
 
401
	private function traiterReferentiel($observation) {
402
		return 'bdtfx_v1';
403
	}
404
 
405
	private function traiterMotsClesTexte($ligne_observation) {
406
 
407
		$mail_observation = $ligne_observation['identifiant'];
408
		$retour = $ligne_observation['mots_cles'];
409
		if (isset($this->tableau_mots_cles[$mail_observation])) {
410
			$mots_cles_tableau = $this->parserMotsCles($mail_observation, $ligne_observation['mots_cles'], ';');
411
			$retour =  join(';',$mots_cles_tableau);
412
			$retour = ltrim($retour,';;') ;
413
		}
414
 
415
		return $retour;
416
	}
417
 
418
	private function parserMotsCles($utilisateur, $mot_cles, $separateur = ',') {
419
 
420
		$tableau_mots_cles = explode($separateur,$mot_cles);
421
		$tableau_mots_cles_formates = array();
422
 
423
		foreach($tableau_mots_cles as $mot_cle) {
424
 
425
			$mot_cle = str_replace($separateur.$separateur,'',$mot_cle);
426
			$mot_cle = str_replace('null','',$mot_cle);
427
 
428
			if ($this->estUnIdentifiantMotCle($mot_cle)) {
429
 
430
				// certains mots clés mal formatés contiennent des virgules
431
				if (strpos($mot_cle,',') !== false) {
432
					$tab_mot_cle_mal_formate = explode(',',$mot_cle);
433
 
434
					foreach ($tab_mot_cle_mal_formate as $mot_cle_mal_formate) {
435
						if ($this->estUnIdentifiantMotCle($mot_cle_mal_formate)) {
436
							$tableau_mots_cles_formates[$mot_cle_mal_formate] = $this->tableau_mots_cles[$utilisateur][$mot_cle_mal_formate]['mot_cle'];
437
						}
438
					}
439
				} else {
440
					// on met le mot clé dans sa propre case afin d'éviter
441
					// facilement les doublons provoqués par de mauvais formatages
442
					if (isset($this->tableau_mots_cles[$utilisateur][$mot_cle]) && trim($this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']) != '') {
443
						$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle'];
444
					}
445
				}
446
 
447
			}
448
		}
449
 
450
		return $tableau_mots_cles_formates;
451
	}
452
 
453
	private function estUnIdentifiantMotCle($chaine) {
454
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine) ;
455
	}
456
 
457
	private function traiterIdentifiantUtilisateur($ligne_observation) {
458
		$mail_observation = $ligne_observation['identifiant'];
459
		$retour = $mail_observation;
460
		if (isset($this->tableau_utilisateurs[$mail_observation])) {
461
			$retour =  $this->tableau_utilisateurs[$mail_observation]['id'];
462
		}
463
		return $retour;
464
	}
465
 
466
	private function traiterPrenomUtilisateur($ligne_observation) {
467
 
468
		$mail_observation = $ligne_observation['identifiant'];
469
		$retour = $mail_observation;
470
		if (isset($this->tableau_utilisateurs[$mail_observation])) {
471
			$retour =  $this->tableau_utilisateurs[$mail_observation]['prenom'];
472
		} else {
473
		}
474
 
475
		return $retour;
476
	}
477
 
478
	private function traiterNomUtilisateur($ligne_observation) {
479
 
480
		$mail_observation = $ligne_observation['identifiant'];
481
		$retour = $mail_observation;
482
 
483
		if (isset($this->tableau_utilisateurs[$mail_observation])) {
484
			$retour =  $this->tableau_utilisateurs[$mail_observation]['nom'];
485
		}
486
 
487
		return $retour;
488
	}
489
 
490
	private function traiterZoneGeo($ligne_observation) {
491
 
492
		$zone_geo = $ligne_observation['location'];
493
 
494
		if($ligne_observation['id_location'] != null && !is_numeric($ligne_observation['id_location']) && $ligne_observation['id_location'] != '000null') {
495
			$id_zone_geo_ancienne = $ligne_observation['id_location'];
496
			if($zone_geo != '') {
497
				$id_zone_geo_ancienne = '('.$id_zone_geo_ancienne.')';
498
			}
499
 
500
			$zone_geo .= $id_zone_geo_ancienne;
501
		} elseif($ligne_observation['location'] == null || $ligne_observation['location'] == "" || $ligne_observation['location'] == "000null") {
502
 
503
			$id_zone_geo_ancienne = $ligne_observation['id_location'];
504
			$id_zone_geo_ancienne = $id_zone_geo_ancienne;
505
			$zone_geo = $id_zone_geo_ancienne;
506
		}
507
 
508
		return $zone_geo;
509
	}
510
 
511
	private function traiterIdentifiantZoneGeo($ligne_observation) {
512
		$id_zone_geo = '';
513
 
514
		if($ligne_observation['id_location'] != '' && $ligne_observation['id_location'] != '000null') {
515
			$indice = $this->construireIndiceTableauLocalites($ligne_observation['location'], $ligne_observation['id_location']);
516
			if(isset($this->tableau_zones_geo[$indice])) {
517
				$id_zone_geo = $this->tableau_zones_geo[$indice]['nouveau_code_geo'];
518
			} else {
519
				if($ligne_observation['location'] != "000null") {
520
					$this->communesOubliees[$indice] = false;
521
				}
522
			}
523
		}
524
 
525
		return $id_zone_geo;
526
	}
527
 
528
	private function construireIndiceTableauLocalites($nom, $id) {
529
 
530
		$nom = htmlentities($nom, ENT_NOQUOTES, 'UTF-8');
531
 
532
    	$nom = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $nom);
533
    	$nom = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $nom); // pour les ligatures e.g. '&oelig;'
534
    	$nom = preg_replace('#&[^;]+;#', '', $nom); // supprime les autres caractères
535
 
536
    	$nom = str_replace("'",'_',$nom);
537
		$nom = str_replace(' ','_',$nom);
538
		$nom = str_replace('-','_',$nom);
539
		$nom = str_replace('  ','_',$nom);
540
		$indice = strtolower($nom).substr($id,0,2);
541
 
542
		return $indice;
543
	}
544
}