Subversion Repositories eFlore/Applications.cel

Rev

Rev 417 | Blame | 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); //  


// 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 latin, ou code nomenclatural (format BDNFFnn999999)
/*
        $identifiant_espece=ltrim($identifiant_espece);
 
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau

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

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

        if ($elements[1]) { // departeme
                      $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 LIKE '".$DB->escapeSimple($genre)."%' " .
                                        " AND en_ce_rang > 160 " .
                                        " AND en_epithete_espece like '".$DB->escapeSimple($espece)."%' 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";



        echo "traitement  espece";
*/
}



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




}



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


?>