Subversion Repositories eFlore/Applications.coel

Rev

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

<?php

/**
 * Exemple lancement:
 * /opt/lampp/bin/php -d memory_limit=3500M cli.php desontologisation -a unitebase
 */

class Desontologisation extends Script {

        private $bdd = null;
        private $structures = array();
        private $communes = array();
        private $nonTrouvees = array();

        public function __construct($script_nom, $parametres) {
                parent::__construct($script_nom, $parametres);
                $this->bdd = new Bdd();
        }

        public function executer() {
                try {
                        $cmd = $this->getParametre('a');
                        switch ($cmd) {
                                case "unitebase" :
                                        $this->desontologiserUniteBase(); break;
                                case "uniterangement" :
                                        $this->desontologiserUniteRangement(); break;
                                case "inventaire" :
                                        $this->desontologiserInventaire(); break;
                                case "etat" :
                                        $this->desontologiserEtat(); break;
                                default :
                                        $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
                        }
                } catch (Exception $erreur) {
                        $this->traiterErreur($erreur->getMessage());
                }
        }
        
        private function desontologiserInventaire() {
                $requete_table = "ALTER TABLE coel_collection_botanique ".
                        "CHANGE `ccb_ce_inventaire` `ccb_ce_inventaire` VARCHAR(20) NULL DEFAULT NULL COMMENT 'Existe-t-il un inventaire de cette collection?', ".
                        "CHANGE `ccb_ce_inventaire_auteur` `ccb_ce_inventaire_auteur` VARCHAR(20) NULL DEFAULT NULL COMMENT 'L''auteur de la collection a-t-il participé à cet inventaire?';";
                
                $infos_truk = $this->bdd->requeter($requete_table);
                
                $requete = "SELECT ccb_id_collection, ccb_ce_inventaire, ccb_ce_inventaire_auteur ".
                                "FROM coel_collection_botanique ".
                                "WHERE (ccb_ce_inventaire IS NOT NULL AND ccb_ce_inventaire != '') OR (ccb_ce_inventaire_auteur IS NOT NULL AND ccb_ce_inventaire_auteur != '')";
                
                $infos_truk = $this->bdd->recupererTous($requete);
                
                foreach ($infos_truk as $truk) {
                        $id_collection = $truk['ccb_id_collection'];
                        $inventaire = $this->transformerouinon($truk["ccb_ce_inventaire"]);
                        $inventaire_auteur = $this->transformerouinon($truk["ccb_ce_inventaire_auteur"]);
                        $update = 'UPDATE coel_collection_botanique '.
                                        'SET '.
                                        'ccb_ce_inventaire = "'.$inventaire.'", '.
                                        'ccb_ce_inventaire_auteur = "'.$inventaire_auteur.'" '.
                                        'WHERE ccb_id_collection = "'.$id_collection.'"';
                                
                        $this->bdd->executer($update);
                }
        }
        
        private function desontologiserEtat() {
                $requete_table = "ALTER TABLE coel_collection_botanique ".
                                "CHANGE `ccb_ce_unite_rangement_etat` `ccb_ce_unite_rangement_etat` VARCHAR(20) NULL DEFAULT NULL, ".
                                "CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` VARCHAR(20) NULL DEFAULT NULL;";
        
                $infos_truk = $this->bdd->requeter($requete_table);
        
                $requete = "SELECT ccb_id_collection, ccb_ce_unite_rangement_etat, ccb_ce_etat_general ".
                                "FROM coel_collection_botanique ".
                                "WHERE (ccb_ce_unite_rangement_etat IS NOT NULL AND ccb_ce_unite_rangement_etat != '') OR (ccb_ce_etat_general IS NOT NULL AND ccb_ce_etat_general != '')";
        
                $infos_truk = $this->bdd->recupererTous($requete);
        
                foreach ($infos_truk as $truk) {
                        $id_collection = $truk['ccb_id_collection'];
                        $inventaire = $this->transformerBonMauvaisEtat($truk["ccb_ce_unite_rangement_etat"]);
                        $inventaire_auteur = $this->transformerBonMauvaisEtat($truk["ccb_ce_etat_general"]);
                        $update = 'UPDATE coel_collection_botanique '.
                                        'SET '.
                                        'ccb_ce_unite_rangement_etat = "'.$inventaire.'", '.
                                        'ccb_ce_etat_general = "'.$inventaire_auteur.'" '.
                                        'WHERE ccb_id_collection = "'.$id_collection.'"';
        
                        $this->bdd->executer($update);
                }
        }
        
        private function transformerBonMauvaisEtat($cle) {
                if ($cle==0) $cle="NULL";
                $valeur = $cle;
                $ontologies = array("2265" => "Très mauvais état",
                                                "2266" => "Mauvais état",
                                                "2267" => "État moyen",
                                                "2268" => "Bon état",
                                                "2269" => "Très bon état",
                                );
                if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
                return $valeur;
        }
        
        private function transformerouinon($cle) {
                $valeur = $cle;
                $ontologies = array("2092" => "non",
                                                "2093" => "oui",
                                                "2094" => "en partie",
                                                "2239" => "ne sait pas",
                                                "2240" => "peut-être",
                                                "2241" => "oui",
                                                "2242" => "non",
                                                "2339" => "oui",
                                                "2340" => "non",
                                                "2341" => "en grande partie",
                                                "2342" => "ne sait pas)",
                                                "2343" => "parfois",
                                                "2344" => "oui",
                                                "2345" => "non",
                                                "30744" => "indéterminé",
                                                "30745" => "oui",
                                                "30746" => "non");
                if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
                return $valeur;
        }
        
        private function desontologiserUniteBase() {
                $requete_table = "ALTER TABLE coel_collection_botanique ADD ".
                                " ccb_nb_planches_herbiers int(20)  AFTER `ccb_truk_unite_base`, ADD ccb_nb_especes int(20)  AFTER ccb_nb_planches_herbiers;";
                
                $infos_truk = $this->bdd->requeter($requete_table);
                
                $requete = "SELECT ccb_id_collection, ccb_truk_unite_base ".
                                        "FROM coel_collection_botanique ".
                                        "WHERE ccb_truk_unite_base IS NOT NULL AND ccb_truk_unite_base != ''";

                $infos_truk = $this->bdd->recupererTous($requete);
                                
                foreach($infos_truk as $truk) {
                        
                        $id_collection = $truk['ccb_id_collection'];
                        
                        // Séparation de chaque catégorie d'unite de truk
                        $categories_truk = explode(';;', $truk['ccb_truk_unite_base']);
                        // Iteration sur toutes les catégories de truk trouvées
                        foreach($categories_truk as $categorie_truk) {                                          
                                // extraction du numéro d'ontologie de la liste concernée
                                $categorie_truk_unite_infos = explode('##', $categorie_truk);           
                                // Seules les infos de planche d'herbier nous interessent (donc numéro d'ontologie 2270)
                                if($categorie_truk_unite_infos[0] == '2270') {
                                        $truk_unite_infos = $categorie_truk_unite_infos[1];
                                        
                                        $truk_unite_infos = explode('||', $truk_unite_infos);
                                        $nb_planches_herbiers = $truk_unite_infos[0];
                                        $nb_especes =  $truk_unite_infos[5];
                                        
                                        $update = 'UPDATE coel_collection_botanique '.
                                                                'SET '.
                                                                        'ccb_nb_planches_herbiers = "'.$nb_planches_herbiers.'", '.
                                                                        'ccb_nb_especes = "'.$nb_especes.'" '.
                                                                'WHERE ccb_id_collection = "'.$id_collection.'"';
                                        
                                        $this->bdd->executer($update);
                                }
                        }
                }
        }
        
        private function desontologiserUniteRangement() {
                $requete_table = "ALTER TABLE coel_collection_botanique ADD ".
                                " ccb_nb_liasses int(20)  AFTER `ccb_truk_unite_rangement`, ADD ccb_format_liasses varchar(50)  AFTER ccb_nb_liasses ,".
                                " ADD ccb_nb_cartons_herbier int(20)  AFTER `ccb_format_liasses`, ADD ccb_format_cartons_herbier varchar(50)  AFTER ccb_nb_cartons_herbier , ".
                                "ADD ccb_autres_unites_rangement text AFTER ccb_format_cartons_herbier;";
                                
                //print_r($requete_table);
                $infos_truk = $this->bdd->requeter($requete_table);
                
                $requete = "SELECT ccb_id_collection, ccb_truk_unite_rangement ".
                                        "FROM coel_collection_botanique ".
                                        "WHERE ccb_truk_unite_rangement IS NOT NULL AND ccb_truk_unite_rangement != '' ";

                $infos_truk = $this->bdd->recupererTous($requete);
                
                // Récupération de la liste des termes d'ontologies pour les types de rangement
                $requete_onto = "SELECT * FROM coel_meta_liste_valeur ".
                                        "WHERE cmlv_ce_parent = 1044";
                
                $infos_onto = $this->bdd->recupererTous($requete_onto);
                
                // Pour associer facilement chaque id d'ontologie à sa signification
                $ontologie_rangement = array();
                foreach($infos_onto as $onto) {
                        $ontologie_rangement[$onto['cmlv_id_valeur']] = $onto;
                }
                
                foreach($infos_truk as $truk) {

                        $id_collection = $truk['ccb_id_collection'];
                        $unite_rangement_des = array('cartons' => array(), 'liasses' => array(), 'autres' => array());
                        
                        // Séparation de chaque catégorie d'unite de truk
                        $categories_unite_rangement = explode(';;', $truk['ccb_truk_unite_rangement']);
                        
                        // Pour éviter de modifier une collection où seul un "squelette" de truk serait présent
                        $collection_a_modifier = false;
                        
                        // Iteration sur toutes les catégories de rangement trouvées
                        foreach($categories_unite_rangement as $unite_rangement) {                                              
                                // extraction du numéro d'ontologie de la liste concernée
                                list($id_ontologie_rangement, $infos_unite_rangement) = explode('##', $unite_rangement);                        
                                $tableau_unite_rangement = $this->parserUniteRangement($infos_unite_rangement);
                                
                                if($tableau_unite_rangement['nombre'] > 0) {
                                        $collection_a_modifier = true;
                                        switch($id_ontologie_rangement) {
                                                // Liasses : 2256
                                                case "2256":
                                                        $unite_rangement_des['liasses'] = $tableau_unite_rangement;
                                                break;
                                                // Cartons d'herbier : 2255
                                                case "2255":
                                                        $unite_rangement_des['cartons'] = $tableau_unite_rangement;
                                                break;
                                                // Autres
                                                default:
                                                        $unite_rangement_des['autres'][] = $this->formaterLigneAutreUniteRangement($id_ontologie_rangement, $ontologie_rangement, $tableau_unite_rangement);
                                        }       
                                }                                                               
                        }
                        
                        // Pas la peine de modifier une collection qui ne content ni liasse, ni carton d'herbier, ni autre
                        // (on ne le sait qu'à ce moment là après analyse par le script car la colonne ccb_truk_unite_rangement
                        // est tout de même quelquefois remplie par une syntaxe d'ontologie vide quand il n'y a rien)
                        if($collection_a_modifier) {
                                $update = "UPDATE coel_collection_botanique ".
                                                                "SET ";
                                
                                $champs = array();
                                
                                if(!empty($unite_rangement_des['liasses'])) {
                                        $champs[] = "ccb_nb_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['nombre']).", ".
                                        "ccb_format_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['format'])." ";
                                }
                                
                                if(!empty($unite_rangement_des['cartons'])) {
                                        $champs[] = "ccb_nb_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['nombre']).", ".
                                        "ccb_format_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['format'])." ";
                                }
                                
                                if(!empty($unite_rangement_des['autres'])) {
                                        // Pour éviter de casser les sauts de lignes il faut les remplacer après avoir protégé la valeur
                                        $champs[] = "ccb_autres_unites_rangement = ".str_replace('NEWLINE', "\r\n", $this->bdd->proteger(implode('NEWLINE', $unite_rangement_des['autres'])));
                                }
                                                                
                                $update .= implode(', ', $champs)." ".
                                                        "WHERE ccb_id_collection = '".$id_collection."'";

                                $this->bdd->executer($update);
                        }
                }
        }
        
        private function parserUniteRangement($unite_rangement) {
                $tableau_unite_rangement = explode('||', $unite_rangement);
                return array(
                        'nombre' => $tableau_unite_rangement[0],
                        'precision' => $tableau_unite_rangement[1],
                        'format' => $tableau_unite_rangement[2]
                );
        }
        
        private function formaterLigneAutreUniteRangement($id_ontologie, $ontologie_rangement, $tableau_unite_rangement) {
                $nom_rangement = $id_ontologie;
                
                // Des fois on a un numéro d'ontologie des fois un nom de type de rangement
                if(!is_numeric($id_ontologie)) {
                        $nom_rangement = $id_ontologie;
                } else if(!empty($ontologie_rangement[$id_ontologie])) {
                        $nom_rangement = $ontologie_rangement[$id_ontologie]['cmlv_nom'];
                } else {
                        $nom_rangement = 'Type de rangement inconnu';
                }
                
                // Le nombre d'unités est directement accolé au type
                $tab_autre_ligne_rangement = array($nom_rangement);
                if(!empty($tableau_unite_rangement['nombre'])) {
                        $tab_autre_ligne_rangement[0] .= ' : '.$tableau_unite_rangement['nombre'];
                }
                
                // La précision est soit exacte soit approximative
                if(!empty($tableau_unite_rangement['precision'])) {
                        $precision = $tableau_unite_rangement['precision'] == 'E' ? 'exacte' : 'appromixative';
                        $tab_autre_ligne_rangement[] = 'Précision '.$precision;
                }
                
                // Le format est une suite de de type YxZ ou Y et Z sont des longueurs et largeurs
                // eventuellement séparés par des virgules s'il y a différents formats
                if(!empty($tableau_unite_rangement['format'])) {
                        $tab_autre_ligne_rangement[] = 'Format '.$tableau_unite_rangement['format'];
                }
                // On retourne une ligne de la forme "type de rangement : nombre - Précision précision - Format format"               
                return implode(' - ', $tab_autre_ligne_rangement);
        }
}
?>