Subversion Repositories eFlore/Applications.coel

Rev

Rev 1921 | 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 "sauvegarder" :
                                        $this->sauvegarder(); break;
                                case "unitebase" :
                                        $this->desontologiserUniteBase(); break;
                                case "uniterangement" :
                                        $this->desontologiserUniteRangement(); break;
                                case "inventaire" :
                                        $this->desontologiserInventaire(); break;
                                case "etat" :
                                        $this->desontologiserEtat(); break;
                                case "periode" :
                                        $this->desontologiserPeriode(); break;
                                default :
                                        $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
                        }
                } catch (Exception $erreur) {
                        $this->traiterErreur($erreur->getMessage());
                }
        }
        
        private function sauvegarder() {
                $requete = "CREATE TABLE coel_collection_sauv SELECT * FROM coel_collection; CREATE TABLE coel_collection_botanique_sauv SELECT * FROM coel_collection_botanique;";
                $infos_truk = $this->bdd->requeter($requete);
        }
        
        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?', ".
                        "CHANGE `ccb_ce_traitement` `ccb_ce_traitement` 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, ccb_ce_traitement ".
                                "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"]);
                        $traitement = $this->transformerouinon($truk["ccb_ce_traitement"]);
                        $update = 'UPDATE coel_collection_botanique '.
                                        'SET '.
                                        'ccb_ce_inventaire = "'.$inventaire.'", '.
                                        'ccb_ce_inventaire_auteur = "'.$inventaire_auteur.'" '.
                                        'ccb_ce_traitement = "'.$traitement.'" '.
                                        '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` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon', ".
                                "CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon';";
        
                $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 desontologiserPeriode() {
                $requete_table = "ALTER TABLE coel_collection ADD ".
                                " cc_periode_constitution_debut int(4)  AFTER cc_truk_periode_constitution, ADD cc_periode_constitution_fin int(4)  AFTER cc_periode_constitution_debut;";
                
        //      $infos_truk = $this->bdd->requeter($requete_table);
        
                $requete = "SELECT cc_id_collection, substr(`ccb_recolte_date_debut`, 1, 4) AS annee_debut, ccb_ce_recolte_date_debut_type as type_debut, ".
                                "substr(`ccb_recolte_date_fin`, 1, 4) AS annee_fin, ccb_ce_recolte_date_fin_type as type_fin,".
                " cc_truk_periode_constitution AS siecle FROM `coel_collection_botanique`, `coel_collection` 
                                        WHERE `ccb_id_collection`=`cc_id_collection` ";
        
                $infos_truk = $this->bdd->recupererTous($requete);
                
                
                foreach ($infos_truk as $truk) {
                        $id_collection = $truk['ccb_id_collection'];
                        $periode = $this->transformerPeriode($truk);
                        $update = 'UPDATE coel_collection '.
                                        'SET '.
                                        'cc_periode_constitution_debut = "'.$periode[0].'", '.
                                        'cc_periode_constitution_fin = "'.$periode[1].'" '.
                                        'WHERE cc_id_collection = "'.$id_collection.'"';
        
                        $this->bdd->executer($update);
                }
                
                $requete = "SELECT cc_id_collection, '0000' AS annee_debut, '' as type_debut, ".
                                "'0000' AS annee_fin, '' as type_fin,".
                                " cc_truk_periode_constitution AS siecle FROM `coel_collection`
                                        WHERE `cc_periode_constitution_debut` is null and `cc_truk_periode_constitution` != ''";
                
                $infos_truk = $this->bdd->recupererTous($requete);
                
                
                foreach ($infos_truk as $truk) {
                        $id_collection = $truk['cc_id_collection'];
                        $periode = $this->transformerPeriode($truk);
                        $update = 'UPDATE coel_collection '.
                                        'SET '.
                                        'cc_periode_constitution_debut = "'.$periode[0].'", '.
                                        'cc_periode_constitution_fin = "'.$periode[1].'" '.
                                        'WHERE cc_id_collection = "'.$id_collection.'"';
                
                        $this->bdd->executer($update);
                }
                /*supprimer ccb_recolte_date_debut,  ccb_ce_recolte_date_debut_type, ccb_recolte_date_fin,  ccb_ce_recolte_date_fin_type, cc_truk_periode_constitution
                 * 
                 * $requete_table = "ALTER TABLE coel_collection_botanique ".
                 "CHANGE `ccb_ce_unite_rangement_etat` `ccb_ce_unite_rangement_etat` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon', ".
                 "CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon';";
                
                 $infos_truk = $this->bdd->requeter($requete_table);
                 */
        }
        
        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);
        }
        
        
        private function transformerPeriode($donnees) {
                // initialisation
                $siecle = array("2233"=>"15",
                                "2234"=>"16",
                                "2235"=>"17",
                                "2236"=>"18",
                                "2237"=>"19",
                                "2238"=>"20");
                $type = array("2316"=>"Date inconnue",
                                "2317"=>"Date exacte",
                                "2318"=>"Antérieure à",
                                "2319"=>"Postérieure à",
                                "2320"=>"Date estimée",
                                "2321"=>"Date inconnue",
                                "2322"=>"Date exacte",
                                "2323"=>"Antérieure à",
                                "2324"=>"Postérieure à",
                                "2325"=>"Date estimée",
                                "2326"=>"Encore en activité");
                $periode_debut = ""; $periode_fin = "";
                if ($donnees["annee_debut"] == "") $donnees["annee_debut"] = "0000";
                if($donnees["annee_fin"] == "") $donnees["annee_fin"] = "0000";
        
                // si une date de début ET une date de fin sont indiquées
                if ($donnees["annee_debut"] !== "0000" && $donnees["annee_fin"] !== "0000") {
                        $periode_debut = $donnees["annee_debut"];
                        $periode_fin = $donnees["annee_fin"];
                                
                        // si un (ou plusieurs) siècles sont indiqué(s)
                } else if($donnees["siecle"] != "") {
                        // initialisation années début et fin de siècle
                        $siecles = explode(";;", $donnees["siecle"]);
                        $siecle_debut = $siecle[$siecles[0]]."01";
                        $siecle_fin = $siecle[array_pop($siecles)]."99";
                                
                        // si les centaines de l'année de début et du siècle sont égales
                        if (substr($donnees["annee_debut"],0,2) == substr($siecle_debut,0,2)) {
                                $periode_debut = $donnees["annee_debut"];
                        } else if ($donnees["annee_debut"] != "0000" && $donnees["annee_debut"] < $siecle_debut) {
                                $periode_debut = $donnees["annee_debut"];
                        } else {
                                $periode_debut = $siecle_debut;
                        }
        
                        if (substr($donnees["annee_fin"],0,2) == substr($siecle_fin,0,2)) {
                                $periode_fin = $donnees["annee_fin"];
                        } else if ($donnees["annee_fin"] != "0000" && $donnees["annee_fin"] > $siecle_fin) {
                                $periode_fin = $donnees["annee_fin"];
                        } else {
                                $periode_fin = $siecle_fin;
                        }
                } else {
                        if ($donnees["annee_debut"] !== "0000") $periode_debut = $donnees["annee_debut"];
                        if($donnees["annee_fin"] !== "0000") $periode_fin = $donnees["annee_fin"];
                }
                //print_r($donnees); echo $periode_debut." - ".$periode_fin;
                return array($periode_debut,$periode_fin);
        }
        
        private function transformerBonMauvaisEtat($cle) {
                if ($cle==0) $cle="NULL";
                $valeur = $cle;
                $ontologies = array("2265" => "1",
                                "2266" => "2",
                                "2267" => "3",
                                "2268" => "4",
                                "2269" => "5",
                );
                if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
                return $valeur;
        }
        
        private function transformerouinon($cle) {
                $valeur = $cle;
                $ontologies = array("2092" => "non",
                                "2093" => "oui",
                                "2094" => "enPartie",
                                "2239" => "neSaitPas",
                                "2240" => "peutEtre",
                                "2241" => "oui",
                                "2242" => "non",
                                "2339" => "oui",
                                "2340" => "non",
                                "2341" => "enGrandePartie",
                                "2342" => "neSaitPas)",
                                "2343" => "parfois",
                                "2344" => "oui",
                                "2345" => "non",
                                "30744" => "indetermine",
                                "30745" => "oui",
                                "30746" => "non");
                if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
                return $valeur;
        }
}
?>