Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
 
3
// In : utf8
4
// Out : utf8
5
 
6
// Import depuis une feuille de calcul
7
 
8
// Test fonction d'import
9
// Import de base
10
// TODO : soigner les controles ...
11
// Scenario avance
12
 
445 david 13
 
14
// Nom des colonnes
15
 
16
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
17
define('LIEUDIT','lieu-dit'); // Texte libre
18
define('STATION','station'); // Texte libre
19
define('MILIEU','milieu'); // Texte libre
20
define('LATITUDE','latitude'); // En decimal systeme WGS84
21
define('LONGITUDE','longitude'); // En decimal systeme WGS84
22
define('NOTES','notes'); // Texte libre
23
define('DATEOBS','date'); // date au format jj/mm/aaaa
24
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
25
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
26
 
27
// Resultat analyse ligne // TODO : Classe ?
28
define('LIGNE_VIDE',1); //
29
define('LIGNE_NORMALE',2); //
30
define('LIGNE_IMAGE_SEULEMENT',3); //
31
 
449 david 32
include_once('Decoupage.class.php'); // TODO : Autoload
33
include_once('DecoupageNomLatin.class.php');
445 david 34
 
35
// Element constituant une observation
36
 
417 aurelien 37
Class InventoryImportExcel extends DBAccessor  {
38
 
445 david 39
// Element constituant une observation
417 aurelien 40
 
445 david 41
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
417 aurelien 42
	var $config;
43
	var $extendExcelReader;
44
 
45
	function InventoryImportExcel($config) {
46
 
47
		$this->config=$config;
48
		// Pas d'heritage multiple en php :(
49
 
50
		$this->extendExcelReader = new ExcelReader();
51
		$this->extendExcelReader->initExcelReader();
52
	}
53
 
54
 
445 david 55
	function createElement($pairs) {
417 aurelien 56
 
445 david 57
		// uid[0] : utilisateur obligatoire
417 aurelien 58
 
59
 
445 david 60
		session_start();
61
                $this->controleUtilisateur($pairs['identifiant']);
417 aurelien 62
 
445 david 63
                foreach($_FILES as $file) { // FIXME : est necessaire
417 aurelien 64
 
445 david 65
                        $infos_fichier = $file ;
66
                }
417 aurelien 67
 
68
 
445 david 69
// Chargement tableau en memoire FIXME : limiter le nombre de ligne ?
70
 
71
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
72
 
73
		$arr = array();
74
		$rowcount=$data->rowcount(0);
75
		$colcount=$data->colcount(0);
76
 
77
		if ($rowcount<=1) { // TODO : retour erreur
78
			print "Tableau vide";
79
			exit;
80
		}
81
 
82
	        for($row=1;$row<=$rowcount;$row++)
83
        	        for($col=1;$col<=$colcount;$col++)
84
                	        $arr[$col][$row] = $data->val($row,$col,0);
85
 
86
 
87
		//print_r($arr);
417 aurelien 88
 
445 david 89
// 1 : Traitement colonnes
417 aurelien 90
 
445 david 91
		$line = array();
417 aurelien 92
 
445 david 93
/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
94
 
95
                for($col=1;$col<=$colcount;$col++) {
96
			$colonne=strtolower($arr[$col][1]);
97
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
98
				case COMMUNE:
99
				case LIEUDIT:
100
				case STATION:
101
				case MILIEU:
102
				case LATITUDE:
103
				case LONGITUDE:
104
				case NOTES:
105
				case DATEOBS:
106
				case ESPECE:
107
				case IMAGE:
108
					$selection=array_values($arr[$col]);
109
					array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
110
					$line[$colonne]=$selection;
111
					break;
112
 
113
			}
114
		}
115
 
116
	/*
117
		print_r($line[COMMUNE]);
118
		print_r($line[LIEUDIT]);
119
		print_r($line[STATION]);
120
		print_r($line[MILIEU]);
121
		print_r($line[LATITUDE]);
122
		print_r($line[LONGITUDE]);
123
		print_r($line[NOTES]);
124
		print_r($line[DATEOBS]);
125
		print_r($line[ESPECE]);
126
		print_r($line[IMAGE]);
127
	*/
128
 
129
// 1 : Traitement lignes
130
 
131
		for ($i=0;$i<=$colcount-1;$i++) {
132
			// On saute les lignes vides
133
			while (($this->analyserLigne($line,$i)==LIGNE_VIDE) && ($i<=$colcount)) {
134
				print "vide";
135
				$i++;
136
			}
137
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$colcount)) {
138
				$this->traiterLigne($line,$i);
139
				$i++;
140
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$colcount)) {
141
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
142
						$this->traiterLigneComplement($line,$i);
143
					}
144
					else {
145
						print "vide";
146
					}
147
					$i++;
148
				}
149
			}
150
 
151
			// Cas special : seul l'image est presente
152
 
153
		}
154
 
417 aurelien 155
	}
156
 
445 david 157
function analyserLigne($line,$i) {
158
	$ligne_vide=true;
159
	$ligne_image_seulement=true;
160
	$ligne_normale=true;
161
	foreach ($this->format_observation as $colonne) {
162
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
163
			if ($colonne!=IMAGE) {
164
				$ligne_image_seulement=false;
165
				$ligne_vide=false;
166
				break;
167
			}
168
			$ligne_vide=false;
169
		}
170
	}
171
	if ($ligne_vide) {
172
		return LIGNE_VIDE;
173
	}
174
	else {
175
		if ($ligne_image_seulement) {
176
			return LIGNE_IMAGE_SEULEMENT;
177
		}
178
		else {
179
			return LIGNE_NORMALE;
180
		}
181
	}
182
 
417 aurelien 183
 
445 david 184
}
417 aurelien 185
 
445 david 186
function traiterLigne($line,$i) {
187
	foreach ($this->format_observation as $colonne) {
188
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
189
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
190
				case COMMUNE:
191
					$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
192
					echo $info_commune['name'];
193
					echo $info_commune['code'];
194
					break;
195
				case LIEUDIT:
196
					$this->traiterLieudit($line[LIEUDIT][$i]);
197
					break;
198
				case STATION:
199
					$this->traiterStation($line[STATION][$i]);
200
					break;
201
				case MILIEU:
202
					$this->traiterMilieu($line[MILIEU][$i]);
203
					break;
204
				case LATITUDE:
205
					$this->traiterLatitude($line[LATITUDE][$i]);
206
					break;
207
				case LONGITUDE:
208
					$this->traiterLongitude($line[LONGITUDE][$i]);
209
					break;
210
				case NOTES:
211
					$this->traiterNotes($line[NOTES][$i]);
212
					break;
213
				case DATEOBS:
214
					$this->traiterDateObs($line[DATEOBS][$i]);
215
					break;
216
				case ESPECE:
217
					$this->traiterEspece($line[ESPECE][$i]);
218
					break;
219
				case IMAGE:
220
					$this->traiterImage($line[IMAGE][$i]);
221
					break;
222
			}
223
			print "\n";
224
		}
225
	}
226
 
417 aurelien 227
}
228
 
445 david 229
function traiterLigneComplement($line,$i) {
230
	$this->traiterImage($line[IMAGE][$i]);
231
	print "\n";
417 aurelien 232
 
445 david 233
}
234
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
235
 
236
 
237
	echo "traitement commune";
238
 
239
        $identifiant_commune=ltrim($identifiant_commune);
240
 
241
        $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
242
 
243
	preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);
244
 
245
        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
246
 
247
	if ($elements[1]) { // departement present
248
		$nom_commune=$elements[1];
249
		$code_commune=$elements[2];
250
 
251
 	        $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."%' AND code ='".$DB->escapeSimple($code_commune)."'";
252
 
253
	}
254
	else {
255
		preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
256
		if ($elements[1]) { // code insee  commune
257
			$code_insee_commune=$elements[1];
258
 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
259
		}
260
		else {
261
		preg_match('/(.*)/',$identifiant_commune,$elements);
262
			if ($elements[1]) { // commune
263
				$nom_commune=$elements[1];
264
	 	        	$query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."'";
265
			}
266
		}
267
	}
268
 
269
 
270
	$res =& $DB->query($query);
271
 
272
        if (DB::isError($res)) {
273
		 die($res->getMessage());
274
	}
275
 
276
	return $res->fetchrow(DB_FETCHMODE_ASSOC);
277
 
278
 
279
 
280
 
281
}
282
 
283
function traiterLieudit($lieudit) { // texte libre
284
 
285
	echo "traitement lieudit";
286
	return utf8_encode(ltrim($lieudit));
287
}
288
 
289
function traiterStation($station) { // texte libre
290
	echo "traitement station";
291
	return utf8_encode(ltrim($station));
292
}
293
 
294
function traiterMilieu($milieu) { // texte libre
295
	echo "traitement milieu";
296
	return utf8_encode(ltrim($milieu));
297
}
298
 
299
function traiterLatitude($latitude) {	//  verifier formal decimal + limite france ? TODO
300
	echo "traitement latitude";
301
	return ltrim($latitude);
302
}
303
 
304
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
305
	echo "traitement longitude";
306
	return ltrim($longitude);
307
}
308
 
309
function traiterNotes($notes) { // texte libre
310
	echo "traitement notes";
311
	return utf8_encode(ltrim($notes));
312
}
313
 
314
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
315
	echo "traitement dateobs";
316
	return ltrim($notes);
317
}
318
 
449 david 319
function traiterEspece($identifiant_espece) {  // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999)
320
 
321
	echo "traitement  espece";
445 david 322
        $identifiant_espece=ltrim($identifiant_espece);
323
 
324
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
325
 
449 david 326
	preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
445 david 327
 
449 david 328
		if ($elements[1]) { // Numero nomenclatural
445 david 329
 
449 david 330
	 	$DB=$this->connectDB($this->config);
331
 
332
                    $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
445 david 333
                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
334
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
335
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
336
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
449 david 337
                                        " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
338
                                        " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
339
                                        "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
340
                                            "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
341
                                            "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
342
                                            "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
343
                             " WHERE a.esn_id_nom= '".$elements[1]. "'".
344
                             " AND a.esn_id_version_projet_taxon = 25 ".
345
                             " AND en_ce_rang = enrg_id_rang" .
346
                             " AND en_id_nom = a.esn_id_nom" .
347
                             " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
348
	                     " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
349
        	             " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
350
                	     " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
351
                             " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
352
		}
353
 
354
		else { // Nom scientifique
355
 
356
 
357
			$decoupageNomLatin=new DecoupageNomLatin();
358
			$nom_latin_decoupe=$decoupageNomLatin->decouper($identifiant_espece);
359
			print_r($nom_latin_decoupe);
360
 
361
/*
362
 
363
    [nom_genre] => Acer
364
    [nom_sp] => monspessulanum
365
    [auteur_sp] =>
366
    [nom_complement] =>
367
    [type_infrasp] =>
368
    [nom_infrasp] =>
369
    [num_nomenc] =>
370
    [num_taxo] =>
371
    [rang_taxonomique] => 250
372
    [nom_courant] => monspessulanum
373
    [nom_superieur] => Acer
374
    [agg] =>
375
    [nom_complet] => Acer monspessulanum
376
 
377
/*
378
 
379
  [nom_genre] => Acer
380
    [nom_sp] => monspessulanum
381
    [auteur_sp] =>
382
    [nom_complement] =>
383
    [type_infrasp] => subsp.
384
    [nom_infrasp] => monspessulanum
385
    [num_nomenc] =>
386
    [num_taxo] =>
387
    [rang_taxonomique] => 280
388
    [nom_courant] => monspessulanum
389
    [nom_superieur] => monspessulanum
390
    [agg] =>
391
    [nom_complet] => Acer monspessulanum subsp. monspessulanum
392
 
393
*/
394
/*
395
 
396
 
397
                      	$query="SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
398
                                        "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
399
                                        " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
400
                                        " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
401
                                        " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
445 david 402
                                        " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom, esn_ce_statut" .
403
                                        " FROM eflore_nom, eflore_nom_rang, " .
404
                                        "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
405
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
406
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
407
                                        "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
408
                                "   , eflore_selection_nom".
449 david 409
                                        " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['nom_genre'])."' " .
410
                                        " AND en_ce_rang = '".$DB->escapeSimple($nom_latin_decoupe['rang_taxonomique'])."' " .
411
                                        " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' AND en_ce_rang = enrg_id_rang " .
445 david 412
                                        " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
413
                                        " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
414
                                        " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
415
                                        " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
416
                                        " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
417
                                        " AND esn_id_nom= en_id_nom ".
418
                                        " ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";
419
 
449 david 420
*/
421
			}
445 david 422
 
423
}
424
 
425
 
426
 
427
function traiterImage($image) { // recherche id image de ce nom et creation table correspondance
428
	echo "traitement  image";
429
}
430
 
431
 
449 david 432
// utilitaire : FIXME mutualiser avec autres scripts
445 david 433
 
449 david 434
function formaterNom($rawnom) {
435
                // Constitution du nom:
436
                $nom = '';
445 david 437
 
449 david 438
                if ($rawnom['en_nom_supra_generique'] != '') {
439
                    $nom .= $rawnom['en_nom_supra_generique'];
440
                } else if ($rawnom['en_epithete_infra_generique'] != '') {
441
                    $nom .= $rawnom['en_epithete_infra_generique'];
442
                } else {
443
                        if ($rawnom['en_nom_genre'] != '') {
444
                            $nom .=  $rawnom['en_nom_genre'];
445
                        }
446
                        if ($rawnom['en_epithete_espece']!= '') {
447
                            $nom .= ' '.$rawnom['en_epithete_espece'];
448
                        }
449
                        if ($rawnom['en_epithete_infra_specifique'] != '') {
450
                                if (!empty($rawnom['enrg_abreviation_rang'])) {
451
                                        $nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
452
                                }
453
                                $nom .= ' '.$rawnom['en_epithete_infra_specifique'];
454
                        }
455
 
456
                }
457
                return $nom.$this->retournerAuteur($rawnom) ;
445 david 458
}
459
 
449 david 460
function retournerAuteur($rawnom) {
461
	$auteurs = '';
462
	$auteur_basio = '';
463
	$auteur_modif = '';
464
	if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' )  {
465
	    $auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
466
	    if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
467
		$auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
468
	    }
469
	} else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
470
	    $auteur_basio .= $rawnom['abreviation_auteur_basio'];
471
	}
445 david 472
 
449 david 473
	if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
474
	    $auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
475
	    if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
476
		$auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
477
	    }
478
	} else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-')  {
479
	    $auteur_modif .= $rawnom['abreviation_auteur_modif'];
480
	}
445 david 481
 
449 david 482
	if (!empty($auteur_modif)) {
483
	    $auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
484
	} elseif (!empty($auteur_basio)) {
485
	    $auteurs = ' '.$auteur_basio;
486
	}
487
 
488
	return $auteurs ;
489
}
490
 
491
 
492
 
493
}
494
 
495
 
496
 
417 aurelien 497
/* +--Fin du code ---------------------------------------------------------------------------------------+
498
* $Log$
499
*
500
*
501
*/
502
 
503
 
504
?>