Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1320 → Rev 1321

/trunk/jrest/services/InventoryImportExcel.php
2,12 → 2,9
// In : utf8
// Out : utf8
 
 
// TODO : traiter image multilignes
// TODO : doublons
 
/*
 
/**
Octobre 2010 David Delon.
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
et liaison d'images déjà chargee aux observations ainsi crées.
17,10 → 14,8
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
**/
 
*/
 
 
// Nom des colonnes
 
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
42,42 → 37,37
define('LIGNE_NORMALE',2); //
define('LIGNE_IMAGE_SEULEMENT',3); //
 
 
//TODO: refactoriser entièrement cette classe
class InventoryImportExcel extends Cel {
 
// Element constituant une observation
 
// Element constituant une observation
var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
 
// Fichier configuration
var $config;
 
// Encapsulation classe lecture fichier excel
// Encapsulation classe lecture fichier excel
var $extendExcelReader;
 
// Dernier numero d'ordre utilise
var $dernier_ordre=1;
// Dernier numero d'ordre utilise
var $dernier_ordre = 1;
var $cpt_images_liees=0;
var $cpt_images_liees = 0;
 
/**
Constructeur
**/
/**
Constructeur
**/
function InventoryImportExcel($config) {
 
$this->config=$config;
parent::__construct($config);
// Pas d'heritage multiple en php :(
 
$this->extendExcelReader = new ExcelReader();
$this->extendExcelReader->initExcelReader();
}
 
/**
Sur post
**/
/**
Sur post
**/
function createElement($pairs) {
 
 
$pairs['utilisateur']=$_POST['identifiant'];
if(!isset($_SESSION)) {session_start();}
$this->controleUtilisateur($pairs['utilisateur']);
 
85,8 → 75,7
$infos_fichier = $file ;
}
 
 
// Chargement tableau en memoire
// Chargement tableau en memoire
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
$arr = array();
 
98,17 → 87,15
exit;
}
 
// Chargement tableau
// Chargement tableau
for($row=1;$row<=$rowcount;$row++)
for($col=1;$col<=$colcount;$col++)
$arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
// 1 : Traitement intitules
 
// 1 : Traitement intitules
$line = array();
 
/* Les colonnes ne sont pas forcemment dans l'ordre : on les extrait pour traitement futur */
 
/* Les colonnes ne sont pas forcemment dans l'ordre : on les extrait pour traitement futur */
for($col=1;$col<=$colcount;$col++) {
$colonne=strtolower($arr[$col][1]);
$colonne=trim($colonne);
139,31 → 126,26
$cpt_img=0;
 
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' ";
$requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($pairs['utilisateur'])." ";
$resultat = $this->requeter($requete);
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
if(is_array($resultat) && count($resultat) > 0) {
$this->dernier_ordre = $resultat[0]['ordre']; // 1 par defaut
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$this->dernier_ordre=$row['ordre']; // 1 par defaut
}
 
for ($i=0;$i<=$rowcount-1;$i++) {
// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
// print "image non rattachee a une observation";
// image non rattachée à une observation
}
else {
// print "vide";
// ligne vide
}
$i++;
}
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur']);
if ($ordre>0) {
$cpt_obs++; // Compteur d'observations crees
}
174,13 → 156,11
$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
}
else {
// print "vide";
// print "vide";
}
$i++;
}
}
}
$message = '';
190,692 → 170,341
$message .= $cpt_obs;
print $message;
 
}
 
function analyserLigne($line,$i) {
$ligne_vide=true;
$ligne_image_seulement=true;
$ligne_normale=true;
$ligne_identique_sauf_image = true;
foreach ($this->format_observation as $colonne) {
function analyserLigne($line,$i) {
if($i < 1) {
$ligne_identique_sauf_image = false;
} else {
$ligne_vide=true;
$ligne_image_seulement=true;
$ligne_normale=true;
$ligne_identique_sauf_image = true;
foreach ($this->format_observation as $colonne) {
if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i])
&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
if($i < 1) {
$ligne_identique_sauf_image = false;
}
}
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
if ($colonne!=IMAGE) {
$ligne_image_seulement=false;
} else {
if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i])
&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
$ligne_identique_sauf_image = false;
}
}
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
if ($colonne!=IMAGE) {
$ligne_image_seulement=false;
$ligne_vide=false;
}
$ligne_vide=false;
}
$ligne_vide=false;
}
}
if ($ligne_vide) {
return LIGNE_VIDE;
}
else {
if ($ligne_image_seulement || $ligne_identique_sauf_image) {
return LIGNE_IMAGE_SEULEMENT;
}
if ($ligne_vide) {
return LIGNE_VIDE;
}
else {
return LIGNE_NORMALE;
if ($ligne_image_seulement || $ligne_identique_sauf_image) {
return LIGNE_IMAGE_SEULEMENT;
}
else {
return LIGNE_NORMALE;
}
}
}
 
}
 
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
$info_image=array();
$info_transmettre = "0";
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
function traiterLigne($line,$i,$utilisateur) {
// Controle donnee et insertion
$info_image=array();
$info_transmettre = "0";
$info_espece = array('en_id_nom' => '',
'nom_sel' => '',
'nom_ret' => '',
'nom_ret_nn' => '',
'nt' => '',
'famille' => ''
);
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
$info_commune = $this->traiterCommune($line[COMMUNE][$i]);
break;
case LIEUDIT:
$info_lieudit = $this->traiterLieudit($line[LIEUDIT][$i]);
break;
case STATION:
$info_station = $this->traiterStation($line[STATION][$i]);
break;
case MILIEU:
$info_milieu = $this->traiterMilieu($line[MILIEU][$i]);
break;
case DEPARTEMENT:
$info_commune['code'] = $this->traiterDepartement($line[DEPARTEMENT][$i]);
break;
case LATITUDE:
$info_latitude = $this->traiterLatitude($line[LATITUDE][$i]);
break;
case LONGITUDE:
$info_longitude = $this->traiterLongitude($line[LONGITUDE][$i]);
break;
case NOTES:
$info_notes = $this->traiterNotes($line[NOTES][$i]);
break;
case DATEOBS:
$info_dateobs = $this->traiterDateObs($line[DATEOBS][$i]);
break;
case TRANSMETTRE:
$info_transmettre = $this->traiterTransmettre($line[TRANSMETTRE][$i]);
break;
case LIEUDIT:
$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]);
break;
case STATION:
$info_station=$this->traiterStation($line[STATION][$i]);
break;
case MILIEU:
$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
break;
case DEPARTEMENT:
$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]);
break;
case LATITUDE:
$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
break;
case LONGITUDE:
$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]);
break;
case NOTES:
$info_notes=$this->traiterNotes($line[NOTES][$i]);
break;
case DATEOBS:
$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]);
break;
case TRANSMETTRE:
$info_transmettre=$this->traiterTransmettre($line[TRANSMETTRE][$i]);
break;
case ESPECE:
$info_espece=$this->traiterEspece($line[ESPECE][$i]);
if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
$complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
$info_espece['nom_ret']=$complement['Nom_Retenu'];
$info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
$info_espece['num_taxon']=$complement['Num_Taxon'];
$info_espece['famille']=$complement['Famille'];
}
break;
case IMAGE:
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
break;
case ESPECE:
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
$resultat_recherche_espece = $chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax($line[ESPECE][$i]);
if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom']!='') {
$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
$complement = $chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
$info_espece['nom_ret'] = $complement['Nom_Retenu'];
$info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
$info_espece['nt'] = $complement['Num_Taxon'];
$info_espece['famille'] = $complement['Famille'];
} else {
$info_espece['nom_sel'] = $line[ESPECE][$i];
}
break;
case IMAGE:
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
break;
}
}
}
else {
switch($colonne) {
case COMMUNE:
$info_commune['name']="000null";
else {
switch($colonne) {
case COMMUNE:
$info_commune['nom']="";
break;
case LIEUDIT:
$info_lieudit="";
break;
case STATION:
$info_station="";
break;
case MILIEU:
$info_milieu="";
break;
case DEPARTEMENT:
if (!isset ($info_commune['code']) || $info_commune['code']=='') {
$info_commune['code']="";
}
break;
case LATITUDE:
$info_latitude = "";
break;
case LONGITUDE:
$info_longitude = "";
break;
case NOTES:
$info_notes='';
break;
case TRANSMETTRE:
$info_transmettre = "0";
break;
case LIEUDIT:
$info_lieudit="000null";
break;
case STATION:
$info_station="000null";
break;
case MILIEU:
$info_milieu="000null";
break;
case DEPARTEMENT:
if (!isset ($info_commune['code']) || $info_commune['code']=='') {
$info_commune['code']="000null";
}
break;
case LATITUDE:
$info_latitude="000null";
break;
case LONGITUDE:
$info_longitude="000null";
break;
case NOTES:
$info_notes='';
break;
case TRANSMETTRE:
$info_transmettre = "0";
break;
 
}
}
 
}
}
 
$this->dernier_ordre++;
 
list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
$info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
$query = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, transmission, date_creation,date_modification,coord_x,coord_y) " .
" VALUES('".$DB->escapeSimple($utilisateur)."','".
$DB->escapeSimple($this->dernier_ordre)."','".
$DB->escapeSimple($info_espece['nom_sel'])."','".
$DB->escapeSimple($info_espece['en_id_nom'])."','".
$DB->escapeSimple($info_espece['nom_ret'])."','".
$DB->escapeSimple($info_espece['num_nom_ret'])."','".
$DB->escapeSimple($info_espece['num_taxon'])."','".
$DB->escapeSimple($info_espece['famille'])."','".
$DB->escapeSimple($info_commune['name'])."','".
$DB->escapeSimple($info_commune['code'])."','".
$DB->escapeSimple($info_dateobs)."','".
$DB->escapeSimple($info_lieudit)."','".
$DB->escapeSimple($info_station)."','".
$DB->escapeSimple($info_milieu)."','".
$DB->escapeSimple($info_notes)."','".
$DB->escapeSimple($info_transmettre)."',".
"now() , now(),'".
$DB->escapeSimple($info_latitude)."','".
$DB->escapeSimple($info_longitude)."')";
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
}
// creation lien image
foreach ($info_image as $pic) {
 
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation ) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
} else {
$this->cpt_images_liees++;
}
}
 
return $this->dernier_ordre;
 
 
}
 
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) {
 
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
$this->dernier_ordre++;
list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
$info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
$requete = "INSERT INTO cel_obs (".
"ce_utilisateur,ordre,".
"nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
"zone_geo,ce_zone_geo,".
"date_observation,".
"lieudit,station, milieu, commentaire, transmission, ".
"date_creation,date_modification,latitude,longitude) ".
" VALUES(".$this->proteger($utilisateur).",".
$this->proteger($this->dernier_ordre).",".
$this->proteger($info_espece['nom_sel']).",".
$this->proteger($info_espece['nom_sel_nn']).",".
$this->proteger($info_espece['nom_ret']).",".
$this->proteger($info_espece['nom_ret_nn']).",".
$this->proteger($info_espece['nt']).",".
$this->proteger($info_espece['famille']).",".
$this->proteger($info_commune['nom']).",".
$this->proteger($info_commune['code']).",".
$this->proteger($info_dateobs).",".
$this->proteger($info_lieudit).",".
$this->proteger($info_station).",".
$this->proteger($info_milieu).",".
$this->proteger($info_notes).",".
$this->proteger($info_transmettre).",".
"now() , now(),".
$this->proteger($info_latitude).",".
$this->proteger($info_longitude).")";
// creation lien image
foreach ($info_image as $pic) {
 
$DB=$this->connectDB($this->config,'cel_db');
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
} else {
$this->cpt_images_liees++;
}
}
}
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
 
$identifiant_commune=trim($identifiant_commune);
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
 
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
 
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
 
if (isset($elements[1])) { // commune + departement : montpellier (34)
$nom_commune=$elements[1];
$code_commune=$elements[2];
$query="SELECT DISTINCT name, code FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'";
}
else { // Code insee seul
preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
if (isset($elements[1])) { // code insee commune
$code_insee_commune=$elements[1];
$query="SELECT DISTINCT name, code FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
}
else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
// Commune
preg_match('/(.*)/',$identifiant_commune,$elements);
if (isset($elements[1])) { // commune
$nom_commune=$elements[1];
$nom_commune=trim($nom_commune);
$nom_commune=utf8_decode($nom_commune);
$nom_commune=cp1252_to_utf8($nom_commune);
$nom_commune=remove_accent($nom_commune);
$nom_commune=preg_replace("/ /","%",$nom_commune);
$query="SELECT DISTINCT name, code FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'";
$insertion = $this->executer($requete);
// creation lien image
foreach ($info_image as $pic) {
$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation ) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$this->proteger($this->dernier_ordre).') ON DUPLICATE KEY UPDATE id_image = id_image ';
$liaison = $this->executer($requete_liaison);
if ($liaison !== false) {
$this->cpt_images_liees++;
} else {
return false;
}
}
}
return $this->dernier_ordre;
}
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) {
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
// creation lien image
foreach ($info_image as $pic) {
$requete = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observations) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$this->proteger($this->dernier_ordre).') ON DUPLICATE KEY UPDATE id_image = id_image' ;
$resultat_liaison = $this->executer($requete);
if ($resultat_liaison !== false) {
$this->cpt_images_liees++;
} else {
return false;
}
}
}
$commune_code = $res->fetchrow(DB_FETCHMODE_ASSOC);
function traiterCommune($identifiant_commune) {
// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
$identifiant_commune=trim($identifiant_commune);
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
// cas de la commune introuvable dans le référentiel
if(!is_array($commune_code) || count($commune_code) == 0) {
$commune_code['name'] = fix_latin($identifiant_commune);
$commune_code['code'] = '000null';
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
if (isset($elements[1])) { // commune + departement : montpellier (34)
$nom_commune=$elements[1];
$code_commune=$elements[2];
$requete="SELECT DISTINCT nom, code FROM cel_zone_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
}
else { // Code insee seul
preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
if (isset($elements[1])) { // code insee commune
$code_insee_commune=$elements[1];
$requete="SELECT DISTINCT nom, code FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
}
else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
// Commune
preg_match('/(.*)/',$identifiant_commune,$elements);
if (isset($elements[1])) { // commune
$nom_commune=$elements[1];
$nom_commune=trim($nom_commune);
$nom_commune=utf8_decode($nom_commune);
$nom_commune=cp1252_to_utf8($nom_commune);
$nom_commune=remove_accent($nom_commune);
$nom_commune=preg_replace("/ /","%",$nom_commune);
$requete="SELECT DISTINCT nom, code FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
}
}
}
$resultat_commune = $this->requeter($requete);
// cas de la commune introuvable dans le référentiel
if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
$resultat_commune['nom'] = fix_latin($identifiant_commune);
$resultat_commune['code'] = 'NULL';
} else {
$resultat_commune = $resultat_commune[0];
}
return $resultat_commune;
}
return $commune_code;
}
 
function traiterLieudit($lieudit) { // texte libre
function traiterLieudit($lieudit) {
// texte libre
$lieudit=fix_latin($lieudit);
return trim($lieudit);
}
 
//echo "traitement lieudit";
$lieudit=fix_latin($lieudit);
return trim($lieudit);
}
function traiterStation($station) {
// texte libre
$station=fix_latin($station);
return trim($station);
}
 
function traiterStation($station) { // texte libre
// echo "traitement station";
$station=fix_latin($station);
return trim($station);
}
function traiterMilieu($milieu) {
// texte libre
$milieu=fix_latin($milieu);
return trim($milieu);
}
 
function traiterMilieu($milieu) { // texte libre
// echo "traitement milieu";
$milieu=fix_latin($milieu);
return trim($milieu);
}
 
function traiterDepartement($departement) { // texte libre
 
if(is_numeric($departement) && strlen($departement) == 5) {
$departement = substr($departement,0,2);
}
function traiterDepartement($departement) {
// texte libre
if(is_numeric($departement) && strlen($departement) == 5) {
$departement = substr($departement,0,2);
}
if(is_numeric($departement) && strlen($departement) == 4) {
$departement = substr($departement,0,1);
$departement = "0"+$departement;
}
if(is_numeric($departement) && strlen($departement) == 4) {
$departement = substr($departement,0,1);
$departement = "0"+$departement;
if(is_numeric($departement) && $departement <= 9) {
$departement = "0"+$departement;
}
return utf8_encode(trim($departement));
}
 
if(is_numeric($departement) && $departement <= 9) {
$departement = "0"+$departement;
function traiterLatitude($latitude) {
// verifier formal decimal + limite france ? TODO
return trim($latitude);
}
return utf8_encode(trim($departement));
}
 
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO
// echo "traitement latitude";
return trim($latitude);
}
 
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
// echo "traitement longitude";
return trim($longitude);
}
 
function traiterNotes($notes) { // texte libre
// echo "traitement notes";
$notes=remove_accent($notes);
return utf8_encode(trim($notes));
}
 
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
// echo "traitement dateobs";
return trim($dateobs);
}
 
function traiterTransmettre($transmettre) {
$transmission = '0';
function traiterLongitude($longitude) {
// verifier format decimal + limite france ? TODO
return trim($longitude);
}
if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
$transmission = '1';
function traiterNotes($notes) {
// texte libre
$notes=remove_accent($notes);
return utf8_encode(trim($notes));
}
return $transmission;
}
function traiterDateObs($dateobs) {
// verifier jj/mm/aaaa sinon date vide TODO
$date = trim($dateobs);
if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
$date = '00/00/0000';
}
return $date;
}
 
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
 
// echo "traitement espece";
$identifiant_espece=trim($identifiant_espece);
$identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
 
preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
function traiterTransmettre($transmettre) {
$transmission = '0';
if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
$transmission = '1';
}
return $transmission;
}
if (isset($elements[1])) { // Numero nomenclatural
 
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" WHERE a.esn_id_nom= '".$elements[1]. "'".
" AND a.esn_id_version_projet_taxon = 25 ".
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = a.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
 
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
$liste_images = explode("/",$images) ;
$row =array();
foreach($liste_images as $image) {
$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
$ligne = $this->requeter($requete);
if(is_array($ligne) && !empty($ligne)) {
$row[] = $ligne[0];
}
}
 
else { // Numero taxonomique ou nom scientifique
preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
if (isset($elements[1])) { // Numero taxonomique
$DB=$this->connectDB($this->config);
 
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang," .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" , eflore_selection_nom ".
" WHERE esn_id_taxon = '".$elements[1]. "'".
" AND esn_id_version_projet_taxon = 25 ".
" AND esn_ce_statut=3 ".
" AND en_id_nom = esn_id_nom" .
" AND en_ce_rang = enrg_id_rang" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']);
 
 
}
 
else { // Nom scientifique
$nameparser=new NameParser();
$nom_latin_decoupe=$nameparser->parse($identifiant_espece);
 
$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
 
// requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
else { // espece (on privilegie les noms retenu cf tri par esn_ce_statut)
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = 'sp.' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
" AND a.esn_id_version_projet_taxon = 25 ".
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = a.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($res->numRows() > 0 ) {
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
}
else {
return array("nom_sel"=>$identifiant_espece);
}
 
 
}
}
 
}
 
 
 
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
 
$DB=$this->connectDB($this->config,'cel_db');
 
$liste_images = explode("/",$images) ;
 
$row =array();
foreach($liste_images as $image) {
 
$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
 
$res =& $DB->query($query);
$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
return $row;
}
return $row;
 
 
}
 
function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
 
$DB=$this->connectDB($this->config);
 
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
" FROM eflore_nom, eflore_nom_rang," .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" ,eflore_selection_nom a, eflore_selection_nom b".
" WHERE a.esn_id_nom= ".$numNom.
" AND a.esn_id_version_projet_taxon = 25 ".
" AND a.esn_id_taxon=b.esn_id_taxon ".
" AND b.esn_ce_statut=3 ".
" AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = b.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
 
$res =& $DB->query($query);
 
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
// Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
 
$value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
 
// Recherche Famille
while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
$fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
}
if ($fam['en_ce_rang']==120) {
$famille=$fam['en_nom_supra_generique'];
}
else {
$famille="Famille inconnue";
}
 
$value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
}
 
return $value;
 
 
 
}
 
function formaterNom($rawnom) {
 
 
// Constitution du nom:
$nom = '';
 
if ($rawnom['en_nom_supra_generique'] != '') {
$nom .= $rawnom['en_nom_supra_generique'];
} else if ($rawnom['en_epithete_infra_generique'] != '') {
$nom .= $rawnom['en_epithete_infra_generique'];
} else {
if ($rawnom['en_nom_genre'] != '') {
$nom .= $rawnom['en_nom_genre'];
}
if ($rawnom['en_epithete_espece']!= '') {
$nom .= ' '.$rawnom['en_epithete_espece'];
}
if ($rawnom['en_epithete_infra_specifique'] != '') {
if (!empty($rawnom['enrg_abreviation_rang'])) {
$nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
}
$nom .= ' '.$rawnom['en_epithete_infra_specifique'];
}
 
}
 
return $nom .$this->retournerAuteur($rawnom) ;
 
}
 
 
function rechercherFamille($taxon,&$DB) {
 
$row=array();
 
$query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
" FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
" WHERE etr_id_taxon_1 = ".$taxon.
" AND etr_id_version_projet_taxon_1 = 25 ".
" AND etr_id_categorie_taxon = 3 ".
" AND etr_id_valeur_taxon = 3 ".
" AND esn_id_taxon = etr_id_taxon_2 ".
" AND esn_ce_statut = 3 ".
" AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
" AND en_id_nom = esn_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
return $row;
}
else {
$row['en_ce_rang']='fin';
return $row;
}
 
}
 
 
function retournerAuteur($rawnom) {
 
$auteurs = '';
$auteur_basio = '';
$auteur_modif = '';
if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' ) {
$auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
}
} else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= $rawnom['abreviation_auteur_basio'];
}
 
if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
}
} else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif'];
}
 
if (!empty($auteur_modif)) {
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
} elseif (!empty($auteur_basio)) {
$auteurs = ' '.$auteur_basio;
}
 
return $auteurs ;
}
 
 
 
 
}
 
function init_byte_map(){
$byte_map = array();
for($x=128;$x<256;++$x){
949,9 → 578,7
return $outstr;
}
 
 
function remove_accent($str)
{
function remove_accent($str) {
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
983,45 → 610,36
return str_replace($a, $b, $str);
}
 
 
function cp1252_to_utf8($str) {
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
 
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
return strtr ( utf8_encode ( $str ), $cp1252_map );
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
return strtr(utf8_encode($str), $cp1252_map);
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*
*
*/
 
 
?>
?>