Subversion Repositories eFlore/Applications.cel

Rev

Rev 480 | Blame | Last modification | View Log | RSS feed

<?php

// In : utf8
// Out : utf8


// TODO : traiter image multilignes

/*

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.

Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
Aucune valeur dans les colonnes n'est obligatoire
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)"
define('LIEUDIT','lieu-dit'); // Texte libre
define('STATION','station'); // Texte libre
define('MILIEU','milieu'); // Texte libre
define('LATITUDE','latitude'); // En decimal systeme WGS84
define('LONGITUDE','longitude'); // En decimal systeme WGS84 
define('NOTES','notes'); // Texte libre
define('DATEOBS','date'); // date au format jj/mm/aaaa
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"

// Resultat de l'analyse d'une ligne
define('LIGNE_VIDE',1); //  
define('LIGNE_NORMALE',2); //  
define('LIGNE_IMAGE_SEULEMENT',3); //  

include_once('Decoupage.class.php'); // TODO : Autoload
include_once('DecoupageNomLatin.class.php');

// Element constituant une observation 

Class InventoryImportExcel extends DBAccessor  {

// Element constituant une observation 

        var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );


// Fichier configuration
        var $config;

// Encapsulation classe lecture fichier excel

        var $extendExcelReader;

/**
 Constructeur
**/
        function InventoryImportExcel($config) {

                $this->config=$config;
                // Pas d'heritage multiple en php :(

                $this->extendExcelReader = new ExcelReader();
                $this->extendExcelReader->initExcelReader();
        }

/**
 Sur post
**/
        function createElement($pairs) {


                $pairs['utilisateur']=$_POST['identifiant'];
                        

                session_start();
                $this->controleUtilisateur($pairs['utilisateur']);


                foreach($_FILES as $file) { // C'est le plus simple

                        $infos_fichier = $file ;
                }


// Chargement tableau en memoire

                $data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
                $arr = array();

                $rowcount=$data->rowcount(0);
                $colcount=$data->colcount(0);

                if ($rowcount<=1) { // TODO : retour erreur
                        print "Tableau vide";
                        exit;
                }
 
                for($row=1;$row<=$rowcount;$row++) 
                        for($col=1;$col<=$colcount;$col++) 
                                $arr[$col][$row] = $data->val($row,$col,0);


                        
// 1 : Traitement colonnes 

                $line = array();

/* 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]);
                        switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
                                case COMMUNE:
                                case LIEUDIT:
                                case STATION:
                                case MILIEU:
                                case LATITUDE:
                                case LONGITUDE:
                                case NOTES:
                                case DATEOBS:
                                case ESPECE:
                                case IMAGE:
                                        $selection=array_values($arr[$col]);
                                        array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
                                        $line[$colonne]=$selection;
                                        break;

                        }
                } 

        /*      
                print_r($line[COMMUNE]);
                print_r($line[LIEUDIT]);
                print_r($line[STATION]);
                print_r($line[MILIEU]);
                print_r($line[LATITUDE]);
                print_r($line[LONGITUDE]);
                print_r($line[NOTES]);
                print_r($line[DATEOBS]);
                print_r($line[ESPECE]);
                print_r($line[IMAGE]);
        */

// 1 : Traitement lignes

                $cpt_obs=0;
                for ($i=0;$i<=$rowcount-1;$i++) {
                        // On saute les 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";
                                }
                                else {
        //                              print "vide";
                                }
                                $i++;
                        }
                        while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
                                $ordre=$this->traiterLigne($line,$i,$pairs['utilisateur']);
                                if ($ordre>0) {
                                        $cpt_obs++; // Compteur d'observations crees
                                }
                                $i++;
                                // On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
                                while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
                                        if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
                                                $this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
                                        }
                                        else {
        //                                      print "vide";
                                        }
                                        $i++;
                                }       
                        }
                        
        
                }
                print $cpt_obs;

        }

function analyserLigne($line,$i) {
        $ligne_vide=true;
        $ligne_image_seulement=true;
        $ligne_normale=true;
        foreach ($this->format_observation as $colonne) {
                if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
                        if ($colonne!=IMAGE) {
                                $ligne_image_seulement=false;
                                $ligne_vide=false;
                                break;
                        }               
                        $ligne_vide=false;
                }
        }
        if ($ligne_vide) {
                return LIGNE_VIDE;
        }
        else {
                if ($ligne_image_seulement) {
                        return LIGNE_IMAGE_SEULEMENT;
                }
                else {
                        return LIGNE_NORMALE;
                }
        }
        

}

function traiterLigne($line,$i,$utilisateur) { // Controle donnee et insertion
        $info_image=array();
        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 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 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;
                        }
                }
                else {  
                        switch($colonne) {
                                case COMMUNE:
                                        $info_commune['name']="000null";
                                        $info_commune['code']="000null";
                                        break;
                                case LIEUDIT:
                                        $info_lieudit="000null";
                                        break;
                                case STATION:
                                        $info_station="000null";
                                        break;
                                case MILIEU:
                                        $info_milieu="000null";
                                        break;
                                case LATITUDE:
                                        $info_latitude="000null";
                                        break;
                                case LONGITUDE:
                                        $info_longitude="000null";
                                        break;

                        }

                }
        }

                // Dernier numero d'ordre utilise :

                $DB=$this->connectDB($this->config,'database_cel'); // TODO / a garder en memoire pour eviter appels mutliples
                $query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($utilisateur)."' ";

                $res =& $DB->query($query);
                if (DB::isError($res)) {
                        die($res->getMessage());
                }
                $ordre=1;

                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
                    $ordre=$row['ordre']+1;
                }

                list($jour,$mois,$annee)=split("/",$info_dateobs);
                $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, date_creation,date_modification,coord_x,coord_y) " .
                " VALUES('".$DB->escapeSimple($utilisateur)."','".
                $DB->escapeSimple($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)."',".
                "now() , now(),'".
                $DB->escapeSimple($info_latitude)."','".
                $DB->escapeSimple($info_longitude)."')";
//              print $query;
//              print "\n";


                   $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($ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;      
        
//print $query;

                $res =& $DB->query($query);

                if (PEAR::isError($res)) {
                        return false;
                }
                

        }



                return $ordre;


}

function traiterLigneComplement($line,$i,$utilisateur) {

// TODO

}
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee



        $identifiant_commune=ltrim($identifiant_commune);

        $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau

        preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);

        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici

        if ($elements[1]) { // departement present
                $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 {
                preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
                if ($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 {
                preg_match('/(.*)/',$identifiant_commune,$elements);
                        if ($elements[1]) { // commune 
                                $nom_commune=$elements[1];
                                $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."'";
                        }
                }
        }

        
        $res =& $DB->query($query);

        if (DB::isError($res)) {
                 die($res->getMessage());
        }

        return $res->fetchrow(DB_FETCHMODE_ASSOC);

        


}

function traiterLieudit($lieudit) { // texte libre

        //echo "traitement lieudit";

        return utf8_encode(ltrim($lieudit));
}

function traiterStation($station) { // texte libre
//      echo "traitement station";
        return utf8_encode(ltrim($station));
}

function traiterMilieu($milieu) { // texte libre
//      echo "traitement milieu";
        return utf8_encode(ltrim($milieu));
}

function traiterLatitude($latitude) {   //  verifier formal decimal + limite france ? TODO 
//      echo "traitement latitude";
        return ltrim($latitude);
}

function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO 
//      echo "traitement longitude";
        return ltrim($longitude);
}

function traiterNotes($notes) { // texte libre
//      echo "traitement notes";
        return utf8_encode(ltrim($notes));
}

function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO 
//      echo "traitement dateobs";
        return ltrim($dateobs);
}

function traiterEspece($identifiant_espece) {  // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999)

//      echo "traitement  espece";
        $identifiant_espece=ltrim($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);

                if ($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]);

                }

                else { // Nom scientifique


                        $decoupageNomLatin=new DecoupageNomLatin();
                        $nom_latin_decoupe=$decoupageNomLatin->decouper($identifiant_espece);
                        
/*

    [nom_genre] => Acer
    [nom_sp] => monspessulanum
    [auteur_sp] => 
    [nom_complement] => 
    [type_infrasp] => 
    [nom_infrasp] => 
    [num_nomenc] => 
    [num_taxo] => 
    [rang_taxonomique] => 250
    [nom_courant] => monspessulanum
    [nom_superieur] => Acer
    [agg] => 
    [nom_complet] => Acer monspessulanum

/*

  [nom_genre] => Acer
    [nom_sp] => monspessulanum
    [auteur_sp] => 
    [nom_complement] => 
    [type_infrasp] => subsp.
    [nom_infrasp] => monspessulanum
    [num_nomenc] => 
    [num_taxo] => 
    [rang_taxonomique] => 280
    [nom_courant] => monspessulanum
    [nom_superieur] => monspessulanum
    [agg] => 
    [nom_complet] => Acer monspessulanum subsp. monspessulanum

*/


                        $DB=$this->connectDB($this->config); // FIXME regarder si opportun ici

                        $query="SELECT DISTINCT en_id_nom" .
                                        " FROM eflore_nom, eflore_nom_rang " .
                                        " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['nom_genre'])."' " .
                                        " AND en_ce_rang = '".$DB->escapeSimple($nom_latin_decoupe['rang_taxonomique'])."' " ;
                                        if (isset($nom_latin_decoupe['nom_infrasp']) && $nom_latin_decoupe['nom_infrasp']!="") {
                                                $query.=" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['nom_infrasp'])."' " ;
                                        }
                                        $query.=" AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' AND en_ce_rang = enrg_id_rang " .
                                        " 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());
                                        }

                                        $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
                                        return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);



        

}



function traiterImage($images,$utilisateur) { // recherche id image de ce nom 

        //echo "traitement  image";
        $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;


}


// utilitaire : FIXME mutualiser avec autres scripts

       function rechercherInformationsComplementaires($numNom) {

                $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 Nomen nom retenu, Num Taxon,
                                                                                // Famille

                $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);
                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 ;
}




}



/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*
*
*/


?>