Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1769 → Rev 1770

/trunk/jrest/services/ImportXLS.php
159,7 → 159,7
 
function createElement($pairs) {
if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
echo '0'; exit;
exit('0');
}
 
$id_utilisateur = intval($pairs['utilisateur']);
179,7 → 179,6
list(self::$insert_prefix, self::$insert_ligne_pattern) =
$this->initialiser_pdo_statements($this->colonnes_statiques);
 
 
$infos_fichier = array_pop($_FILES);
/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']);
295,10 → 294,17
restore_error_handler();
 
if($this->bilan) echo implode("\n", $this->bilan) . "\n";
$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",
$summary = sprintf('%1$d observation%2$c ajoutée%2$c' . "\n" .
'%3$d image%4$c attachée%4$c' . "\n" .
// '%5$d mot%6$c-clef ajouté%6$c [TODO]' . "\n" . // TODO
count($filtre->exclues) > 0? 'colonnes non-traitées: %7$s' . "\n" : '',
 
$obs_ajouts,
count($obs_ajouts) > 1 ? 's' : '',
$nb_images_ajoutees,
count($nb_images_ajoutees) > 1 ? 's' : '',
$nb_mots_cle_ajoutes,
count($nb_mots_cle_ajoutes) > 1 ? 's' : '',
implode(', ', $filtre->exclues));
 
die("$summary");
320,6 → 326,14
}
}
}
// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
// le tableau renvoyé par PHPExcel
// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
// les utilisent
foreach($cols as $col) {
if(!defined("C_" . strtoupper($col['abbrev'])))
define("C_" . strtoupper($col['abbrev']), "C_" . strtoupper($col['abbrev']));
}
 
// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
 
444,10 → 458,13
proprement les règle d'échappement.
*/
static function chargerLigne($ligne, $dernier_ordre, $cel) {
// évite des notices d'index lors des trigger_error()
$ref_ligne = !empty($ligne[C_NOM_SEL]) ? trim($ligne[C_NOM_SEL]) : '';
 
// en premier car le résultat est utile pour
// * traiter espèce (traiterEspece())
// * traiter longitude et latitude (traiterLonLat())
$referentiel = self::identReferentiel(trim(strtolower($ligne[C_NOM_REFERENTIEL])), $ligne);
$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne);
 
// $espece est rempli de plusieurs informations
$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
481,7 → 498,7
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL,
 
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : NULL,
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : NULL,
495,8 → 512,8
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne) : NULL,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne) : NULL,
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL,
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
 
// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé)
560,15 → 577,15
// TODO: PHP 5.3, utiliser date_parse_from_format()
// TODO: parser les heures (cf product-owner)
// TODO: passer par le timestamp pour s'assurer de la validité
static function traiterDateObs($date, $ligne) {
static function traiterDateObs($date, $ref_ligne) {
// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
if(is_double($date)) {
if($date > 0)
return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " .
trigger_error("ligne \"{$ref_ligne}\": " .
"Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
E_USER_NOTICE);
 
// throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
 
// attention, UNIX timestamp, car Excel les décompte depuis 1900
590,7 → 607,7
}
$timestamp = strtotime($date);
if(! $timestamp) {
if($date) trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: date erronée ($date)", E_USER_NOTICE);
if($date) trigger_error("ligne \"{$ref_ligne}\": Attention: date erronée ($date)", E_USER_NOTICE);
return NULL;
}
return strftime("%Y-%m-%d 00:00:00", $timestamp);
597,7 → 614,7
}
}
 
static function identReferentiel($referentiel, $ligne) {
static function identReferentiel($referentiel, $ligne, $ref_ligne) {
// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx:v1.01';
if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa:v1.00';
605,10 → 622,12
if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan:v1.00';
if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
 
if($referentiel) {
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": Attention: référentiel inconnu", E_USER_NOTICE);
if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE);
return 'autre';
}
 
// pas de référentiel ou pas de NOM_SEL: NULL
return NULL;
/* TODO: cf story,
En cas de NULL faire une seconde passe de détection à partir du nom saisi
615,7 → 634,7
+ accepter les n° de version */
}
 
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ligne) {
static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01', $ref_ligne) {
// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
626,7 → 645,7
if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
 
if($lon || $lat) {
trigger_error("ligne \"{$ligne[C_NOM_SEL]}\": " .
trigger_error("ligne \"{$ref_ligne}\": " .
"Attention: longitude ou latitude erronée",
E_USER_NOTICE);
}
656,7 → 675,7
pour des questions de performances
*/
static function traiterEspece($ligne, Array &$espece, $referentiel, $cel) {
if(!$ligne[C_NOM_SEL]) return;
if(empty($ligne[C_NOM_SEL])) return;
 
// nom_sel reste toujours celui de l'utilisateur
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
712,7 → 731,7
$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
$espece[C_NT] = $complement['Num_Taxon'];
$espece[C_FAMILLE] = $complement['Famille'];
//var_dump("a", $espece);die;
//var_dump($complement, $espece);die;
}
 
static function detectFromNom($nom) {
730,6 → 749,9
 
 
static function traiterLocalisation($ligne, Array &$localisation) {
if(empty($ligne[C_ZONE_GEO])) $ligne[C_ZONE_GEO] = NULL;
if(empty($ligne[C_CE_ZONE_GEO])) $ligne[C_CE_ZONE_GEO] = NULL;
 
$identifiant_commune = trim($ligne[C_ZONE_GEO]);
if(!$identifiant_commune) {
$departement = trim($ligne[C_CE_ZONE_GEO]);