Subversion Repositories eFlore/Applications.cel

Rev

Rev 1765 | Rev 1778 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1765 Rev 1770
Line 157... Line 157...
157
		parent::__construct($config);
157
		parent::__construct($config);
158
	}
158
	}
Line 159... Line 159...
159
 
159
 
160
	function createElement($pairs) {
160
	function createElement($pairs) {
161
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
161
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
162
			echo '0'; exit;
162
			exit('0');
Line 163... Line 163...
163
		}
163
		}
164
 
164
 
Line 177... Line 177...
177
		/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
177
		/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
178
		   $this->initialiser_pdo_ordered_statements($this->colonnes_statiques); */
178
		   $this->initialiser_pdo_ordered_statements($this->colonnes_statiques); */
179
		list(self::$insert_prefix, self::$insert_ligne_pattern) =
179
		list(self::$insert_prefix, self::$insert_ligne_pattern) =
180
			$this->initialiser_pdo_statements($this->colonnes_statiques);
180
			$this->initialiser_pdo_statements($this->colonnes_statiques);
Line 181... Line -...
181
 
-
 
182
 
181
 
Line 183... Line 182...
183
		$infos_fichier = array_pop($_FILES);
182
		$infos_fichier = array_pop($_FILES);
184
		
183
		
Line 293... Line 292...
293
		}
292
		}
Line 294... Line 293...
294
 
293
 
Line 295... Line 294...
295
		restore_error_handler();
294
		restore_error_handler();
296
 
295
 
-
 
296
		if($this->bilan) echo implode("\n", $this->bilan) . "\n";
-
 
297
 		$summary = sprintf('%1$d observation%2$c ajoutée%2$c' . "\n" .
-
 
298
						   '%3$d image%4$c attachée%4$c' . "\n" . 
-
 
299
						   // '%5$d mot%6$c-clef ajouté%6$c [TODO]' . "\n" . // TODO
297
		if($this->bilan) echo implode("\n", $this->bilan) . "\n";
300
						   count($filtre->exclues) > 0? 'colonnes non-traitées: %7$s' . "\n" : '',
-
 
301
 
298
 		$summary = sprintf("%d observation(s) ajoutée(s)\n%d image(s) attachée(s)\n%d mot(s)-clé ajouté(s) [TODO]\ncolonnes non-traitées: %s\n",
302
						   $obs_ajouts,
-
 
303
						   count($obs_ajouts) > 1 ? 's' : '',
299
						   $obs_ajouts,
304
						   $nb_images_ajoutees,
-
 
305
						   count($nb_images_ajoutees) > 1 ? 's' : '',
300
						   $nb_images_ajoutees,
306
						   $nb_mots_cle_ajoutes,
Line 301... Line 307...
301
						   $nb_mots_cle_ajoutes,
307
						   count($nb_mots_cle_ajoutes) > 1 ? 's' : '',
302
						   implode(', ', $filtre->exclues));
308
						   implode(', ', $filtre->exclues));
Line 318... Line 324...
318
					$colonnes_reconnues[$k] = 1;
324
					$colonnes_reconnues[$k] = 1;
319
					break;
325
					break;
320
				}
326
				}
321
			}
327
			}
322
		}
328
		}
-
 
329
		// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
-
 
330
		// le tableau renvoyé par PHPExcel
-
 
331
		// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
-
 
332
		// les utilisent
-
 
333
		foreach($cols as $col) {
-
 
334
			if(!defined("C_" . strtoupper($col['abbrev'])))
-
 
335
				define("C_" . strtoupper($col['abbrev']), "C_" . strtoupper($col['abbrev']));
-
 
336
		}
Line 323... Line 337...
323
 
337
 
Line 324... Line 338...
324
		// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
338
		// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
325
 
339
 
Line 442... Line 456...
442
	  cad aucune des valeurs retournée par traiter{Espece|Localisation}()
456
	  cad aucune des valeurs retournée par traiter{Espece|Localisation}()
443
	  car ce tableau est passé à un PDO::preparedStatement() qui applique
457
	  car ce tableau est passé à un PDO::preparedStatement() qui applique
444
	  proprement les règle d'échappement.
458
	  proprement les règle d'échappement.
445
	 */
459
	 */
446
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
460
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
-
 
461
		// évite des notices d'index lors des trigger_error()
-
 
462
		$ref_ligne = !empty($ligne[C_NOM_SEL]) ? trim($ligne[C_NOM_SEL]) : '';
-
 
463
 
447
		// en premier car le résultat est utile pour
464
		// en premier car le résultat est utile pour
448
		// * traiter espèce (traiterEspece())
465
		// * traiter espèce (traiterEspece())
449
		// * traiter longitude et latitude (traiterLonLat())
466
		// * traiter longitude et latitude (traiterLonLat())
450
		$referentiel = self::identReferentiel(trim(strtolower($ligne[C_NOM_REFERENTIEL])), $ligne);
467
		$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne);
Line 451... Line 468...
451
 
468
 
452
		// $espece est rempli de plusieurs informations
469
		// $espece est rempli de plusieurs informations
453
		$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
470
		$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
454
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
471
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
Line 479... Line 496...
479
 
496
 
480
			"zone_geo" => $localisation[C_ZONE_GEO],
497
			"zone_geo" => $localisation[C_ZONE_GEO],
Line 481... Line 498...
481
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
498
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
482
 
499
 
Line 483... Line 500...
483
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
500
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
484
			"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
501
			"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL,
485
 
502
 
Line 493... Line 510...
493
 
510
 
494
			"transmission" => $transmission,
511
			"transmission" => $transmission,
Line 495... Line 512...
495
			"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
512
			"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
496
 
513
 
497
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
514
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
498
			"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne) : NULL,
515
			"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL,
Line 499... Line 516...
499
			"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne) : NULL,
516
			"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL,
500
			"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
517
			"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
501
 
518
 
Line 558... Line 575...
558
	/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
575
	/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
Line 559... Line 576...
559
 
576
 
560
	// TODO: PHP 5.3, utiliser date_parse_from_format()
577
	// TODO: PHP 5.3, utiliser date_parse_from_format()
561
	// TODO: parser les heures (cf product-owner)
578
	// TODO: parser les heures (cf product-owner)
562
	// TODO: passer par le timestamp pour s'assurer de la validité
579
	// TODO: passer par le timestamp pour s'assurer de la validité
563
	static function traiterDateObs($date, $ligne) {
580
	static function traiterDateObs($date, $ref_ligne) {
564
		// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
581
		// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
565
		if(is_double($date)) {
582
		if(is_double($date)) {
566
			if($date > 0)
583
			if($date > 0)
567
				return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
584
				return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
568
			trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " .
585
			trigger_error("ligne \"{$ref_ligne}\": " .
569
						  "Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
586
						  "Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
570
						  E_USER_NOTICE);
587
						  E_USER_NOTICE);
571
			
588
 
Line 572... Line 589...
572
			// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
589
			// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
573
 
590
 
574
			// attention, UNIX timestamp, car Excel les décompte depuis 1900
591
			// attention, UNIX timestamp, car Excel les décompte depuis 1900
Line 588... Line 605...
588
			if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
605
			if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
589
				$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
606
				$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
590
			}
607
			}
591
			$timestamp = strtotime($date);
608
			$timestamp = strtotime($date);
592
			if(! $timestamp) {
609
			if(! $timestamp) {
593
				if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE);
610
				if($date) trigger_error("ligne \"{$ref_ligne}\": Attention: date erronée ($date)", E_USER_NOTICE);
594
				return NULL;
611
				return NULL;
595
			}
612
			}
596
			return strftime("%Y-%m-%d 00:00:00", $timestamp);
613
			return strftime("%Y-%m-%d 00:00:00", $timestamp);
597
		}
614
		}
598
	}
615
	}
Line 599... Line 616...
599
 
616
 
600
	static function identReferentiel($referentiel, $ligne) {
617
	static function identReferentiel($referentiel, $ligne, $ref_ligne) {
601
		// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
618
		// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
602
		if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
619
		if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
603
		if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
620
		if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
604
		if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff:4.02';
621
		if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff:4.02';
605
		if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
622
		if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
Line 606... Line 623...
606
		if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
623
		if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
607
 
624
 
608
		if($referentiel) {
625
		if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
609
			trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE);
626
			trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE);
-
 
627
			return 'autre';
-
 
628
		}
610
			return 'autre';
629
 
611
		}
630
		// pas de référentiel ou pas de NOM_SEL: NULL
612
		return NULL;
631
		return NULL;
613
		/* TODO: cf story,
632
		/* TODO: cf story,
614
		   En cas de NULL faire une seconde passe de détection à partir du nom saisi
633
		   En cas de NULL faire une seconde passe de détection à partir du nom saisi
Line 615... Line 634...
615
		   + accepter les n° de version */
634
		   + accepter les n° de version */
616
	}
635
	}
617
 
636
 
618
	static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ligne) {
637
	static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ref_ligne) {
Line 619... Line 638...
619
		// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
638
		// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
620
		if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
639
		if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
621
		if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
640
		if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
622
 
641
 
Line 623... Line 642...
623
		// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
642
		// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
624
		// tout en uniformisant le format de séparateur des décimales (le ".")
643
		// tout en uniformisant le format de séparateur des décimales (le ".")
625
		if($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) return sprintf('%.5F', $lon);
644
		if($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) return sprintf('%.5F', $lon);
626
		if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
645
		if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
627
 
646
 
628
		if($lon || $lat) {
647
		if($lon || $lat) {
Line 654... Line 673...
654
	/*
673
	/*
655
	  TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
674
	  TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
656
	  pour des questions de performances
675
	  pour des questions de performances
657
	*/
676
	*/
658
	static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
677
	static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
659
		if(!$ligne[C_NOM_SEL]) return;
678
		if(empty($ligne[C_NOM_SEL])) return;
Line 660... Line 679...
660
 
679
 
661
		// nom_sel reste toujours celui de l'utilisateur
680
		// nom_sel reste toujours celui de l'utilisateur
Line 662... Line 681...
662
		$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
681
		$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
Line 710... Line 729...
710
		*/
729
		*/
711
		$espece[C_NOM_RET] = $complement['Nom_Retenu'];
730
		$espece[C_NOM_RET] = $complement['Nom_Retenu'];
712
		$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
731
		$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
713
		$espece[C_NT] = $complement['Num_Taxon'];
732
		$espece[C_NT] = $complement['Num_Taxon'];
714
		$espece[C_FAMILLE] = $complement['Famille'];
733
		$espece[C_FAMILLE] = $complement['Famille'];
715
		//var_dump("a", $espece);die;
734
		//var_dump($complement, $espece);die;
716
	}
735
	}
Line 717... Line 736...
717
 
736
 
718
	static function detectFromNom($nom) {
737
	static function detectFromNom($nom) {
719
		$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
738
		$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
Line 728... Line 747...
728
		return $r;
747
		return $r;
729
	}
748
	}
Line 730... Line 749...
730
 
749
 
-
 
750
 
-
 
751
	static function traiterLocalisation($ligne, Array &$localisation) {
-
 
752
		if(empty($ligne[C_ZONE_GEO])) $ligne[C_ZONE_GEO] = NULL;
731
 
753
		if(empty($ligne[C_CE_ZONE_GEO])) $ligne[C_CE_ZONE_GEO] = NULL;
732
	static function traiterLocalisation($ligne, Array &$localisation) {
754
 
733
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
755
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
734
		if(!$identifiant_commune) {
756
		if(!$identifiant_commune) {
735
			$departement = trim($ligne[C_CE_ZONE_GEO]);
757
			$departement = trim($ligne[C_CE_ZONE_GEO]);