Subversion Repositories eFlore/Applications.cel

Rev

Rev 445 | Rev 480 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

// In : utf8
// Out : utf8

// Import depuis une feuille de calcul

// Test fonction d'import
// Import de base
// TODO : soigner les controles ...
// Scenario avance


// 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 analyse ligne // TODO : Classe ?
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 );
        var $config;
        var $extendExcelReader;

        function InventoryImportExcel($config) {

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

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


        function createElement($pairs) {

                // uid[0] : utilisateur obligatoire

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

                foreach($_FILES as $file) { // FIXME : est necessaire

                        $infos_fichier = $file ;
                }


// Chargement tableau en memoire FIXME : limiter le nombre de ligne ?

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


                //print_r($arr);
                        
// 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

                for ($i=0;$i<=$colcount-1;$i++) {
                        // On saute les lignes vides 
                        while (($this->analyserLigne($line,$i)==LIGNE_VIDE) && ($i<=$colcount)) {
                                print "vide";
                                $i++;
                        }
                        while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$colcount)) {
                                $this->traiterLigne($line,$i);
                                $i++;
                                while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$colcount)) {
                                        if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
                                                $this->traiterLigneComplement($line,$i);
                                        }
                                        else {
                                                print "vide";
                                        }
                                        $i++;
                                }       
                        }
                        
                        // Cas special : seul l'image est presente
        
                }

        }

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) {
        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]);
                                        echo $info_commune['name'];     
                                        echo $info_commune['code'];     
                                        break;
                                case LIEUDIT:
                                        $this->traiterLieudit($line[LIEUDIT][$i]);
                                        break;
                                case STATION:
                                        $this->traiterStation($line[STATION][$i]);
                                        break;
                                case MILIEU:
                                        $this->traiterMilieu($line[MILIEU][$i]);
                                        break;
                                case LATITUDE:
                                        $this->traiterLatitude($line[LATITUDE][$i]);
                                        break;
                                case LONGITUDE:
                                        $this->traiterLongitude($line[LONGITUDE][$i]);
                                        break;
                                case NOTES:
                                        $this->traiterNotes($line[NOTES][$i]);
                                        break;
                                case DATEOBS:
                                        $this->traiterDateObs($line[DATEOBS][$i]);
                                        break;
                                case ESPECE:
                                        $this->traiterEspece($line[ESPECE][$i]);
                                        break;
                                case IMAGE:
                                        $this->traiterImage($line[IMAGE][$i]);
                                        break;
                        }
                        print "\n";
                }
        }

}

function traiterLigneComplement($line,$i) {
        $this->traiterImage($line[IMAGE][$i]);
        print "\n";

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


        echo "traitement commune";

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

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 

                $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_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 ";
                }

                else { // Nom scientifique


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

    [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

*/
/*


                        $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, esn_ce_statut" .
                                        " 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 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'])."' " .
                                        " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' 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 " .
                                        " AND esn_id_nom= en_id_nom ".
                                        " ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";

*/
                        }

}



function traiterImage($image) { // recherche id image de ce nom et creation table correspondance
        echo "traitement  image";
}


// utilitaire : FIXME mutualiser avec autres scripts

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 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$
*
*
*/


?>