Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Classe de nettoyage de la base de données du CEL.
 * Suppression des antislash
 * Remplacement des chaines vides par des NULL
 * Unifier les référentiels : pas de nom de version, majuscule...
 * Unifier les certitudes
 * Supprimer les INSEE-C: non rempli, les dates 0000-00 
 *
 * Utilisation :
 * - <code>/opt/lamp/bin/php cli.php nettoyage -a (voir méthode executer)</code>
 *
 * @category   CEL
 * @package    Scripts
 * @subpackage Nettoyage
 * @author     Delphine CAUQUIL <delphine@tela-botanica.org>
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright  1999-2016 Tela Botanica <accueil@tela-botanica.org>
 */
class Nettoyage extends Script {

        protected $bdd;
        protected $colonnes;


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

        public function executer() {
                $cmd = $this->getParametre('a');
                $requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";
                $this->colonnes = $this->bdd->recupererTous($requete_colonnes);
                try {
                        switch ($cmd) {
                                case 'tout' :
                                        $this->supprimerRetourLigne();
                                        $this->supprimerAntislash();
                                        $this->supprimerGuillement();
                                        $this->unifierNull();
                                        $this->unifierNomReferentiel();
                                        $this->unifierCertitude();
                                        $this->supprimerCertitudeAutre();
                                        $this->unifierUtilisateur();
                                        $this->verifierCodeInsee();
                                        $this->verifierGeodatum();
                                        $this->analyserMotsCles();
                                        $this->supprimerInfosLiesObsInexistante();
                                        $this->unifierNull();
                                        break;
                                case 'supprimerAntislash' :
                                        $this->supprimerAntislash();
                                        break;
                                case 'unifierNomReferentiel' :
                                        $this->unifierNomReferentiel();
                                        break;
                                case 'unifierCertitude' :
                                        $this->unifierCertitude();
                                        break;
                                case 'supprimerCertitudeAutre' : // après unifier certitude si les autres valeurs sont bien à supprimer
                                    $this->supprimerCertitudeAutre();
                                    break;
                                case 'analyserMotsCles' : // après unifier certitude si les autres valeurs sont bien à supprimer
                                    $this->analyserMotsCles();
                                    break;
                                case 'verifierGeodatum' :
                                        $this->verifierGeodatum();
                                        break;
                                case 'verifierCodeInsee' :
                                    $this->verifierCodeInsee();
                                    break;
                                case 'unifierNull' : // lancer en dernier pour bien réussir
                                        $this->unifierNull();
                                        break;
                                case 'supprimerInfosLiesObsInexistante' :
                                    $this->supprimerInfosLiesObsInexistante();
                                    break;
                                case 'unifierUtilisateur' : 
                                    $this->unifierUtilisateur();
                                    break;
                                default :
                                        $msg = "Erreur : la commande '$cmd' n'existe pas!\n".
                                                "Commandes existantes : regenererMotsClesTexteObs, regenererMotsClesTexteImages"
                                                        . ", regenererMotsClesTexteObsTout, regenererMotsClesTexteImagesTout"
                                                        . ", viderMotsClesTexteImagesSansMotsCles, viderMotsClesTexteObsSansMotsCles"
                                                        . ", regenererChampsTailleImage, reparerLiaisonsOublieesObs, reparerLiaisonsOublieesImages"
                                                        . ", reparerLiaisonsObsParMotsClesTexte, reductionMotsClesImages, reductionMotsClesImagesUtil"
                                                        . ", reduireEtNormaliserMotsClesImagesUtil, reduireEtNormaliserMotsClesImages"
                                                        . ", reductionMotsClesObs, reductionMotsClesObsUtil, reduireEtNormaliserMotsClesObsUtil"
                                                        . ", reduireEtNormaliserMotsClesObs";
                                        throw new Exception($msg);
                        }
                } catch (Exception $e) {
                        $this->traiterErreur($e->getMessage());
                }
        }
        

        private function supprimerRetourLigne() {               
                foreach ($this->colonnes as $id=>$colonne) {
                        echo "Suppression des retour ligne dans la colonne ".$colonne['column_name']." ...";
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\n", "")';
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
        }
        
        private function supprimerAntislash() {
                foreach ($this->colonnes as $id=>$colonne) {
                        echo "Suppression des antislash dans la colonne ".$colonne['column_name']." ...";
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\", "")';
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
        }
        
        private function supprimerGuillemet() {
                foreach ($this->colonnes as $id=>$colonne) {
                        echo "Suppression des guillements dans la colonne ".$colonne['column_name']." ...";
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].',"\"", "")';
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
        }
        
        private function unifierNull() {
                $requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'tb_nettoye_cel.cel_obs' AND table_schema='tb_cel';";
                $colonnes = $this->bdd->recupererTous($requete_colonnes);
                foreach ($colonnes as $colonne) {
                        echo "Suppression des vides dans la colonne ".$colonne['column_name']." ...";
                        $dsl = array( 'transmission', 'altitude');
                        if (isset($dsl[$colonne['column_name']])) {
                                $requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= ''";
                        } else {
                                $requete = "UPDATE tb_nettoye_cel.cel_obs SET ".$colonne['column_name']." = NULL WHERE ".$colonne['column_name']."= '' OR ".$colonne['column_name']." IN ('INSEE-C:', '0000-00-00 00:00:00', '0.00000')";
                        }
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
        }
        
        private function unifierCertitude() {
                echo "Uniformisation du champ certitude/identification";
                $certitude = array("A déterminer" => "à déterminer",
                    "À déterminer, voir photo" => "à déterminer",
                    "aDeterminer" => "à déterminer",
                    "déterminer" => "à déterminer",
                    "Inconnue" => "à déterminer",
                    "Ceraine" => "certain",
                    "certain" => "certain",
                    "Certainaaua" => "certain",
                    "Certaine" => "certain",
                    "Certaine K- rhizines blanche" => "certain",
                    "Certaine ( mais voir notes)" => "certain",
                    "Certaine (à 99%)" => "certain",
                    "Certaine Anett" => "certain",
                    "Certaine Anette" => "certain",
                    "Certaine Valériane officinale" => "certain",
                    "Certaine, Faite et confirmée par JM BERAUD" => "certain",
                    "Certaine, par Jean Lebail" => "certain",
                    "Certaine, subsp. minus" => "certain",
                    "Certainea" => "certain",
                    "Certaineanno" => "certain",
                    "Certainearia n" => "certain",
                    "Certainee" => "certain",
                    "Certainej" => "certain",
                    "Certainel" => "certain",
                    "CertaineNom de travai" => "certain",
                    "CertaineNom de travail" => "certain",
                    "Certainesites" => "certain",
                    "Certainesous-bois de feuillus en versant sud à sud-ouest" => "certain",
                    "Certaineu" => "certain",
                    "sure" => "certain",
                    "validée sur forum Naturalistes de l'ouest" => "certain",
                    "à confirmer" => "douteux",
                    "à approfondir" => "douteux",
                    "à cofirmer" => "douteux",
                    "À confiermer" => "douteux",
                    "A confirlmer" => "douteux",
                    "A confirmer" => "douteux",
                    "à confirmer vs. pumilum" => "douteux",
                    "à conirmer" => "douteux",
                    "à vérifier" => "douteux",
                    "douteuse" => "douteux",
                    "Douteuse (canadensis ?)" => "douteux",
                    "Douteuse ?" => "douteux",
                    "Douteuse à confirmer" => "douteux",
                    "Douteuse peut-être cordata" => "douteux",
                    "Douteuse, fleurs rouges" => "douteux",
                    "douteux" => "douteux",
                    "espèce bisannuelle mais non bien déterminée" => "douteux",
                    "Incertaine" => "douteux",
                    "Pavot douteux" => "douteux",
                    "Potentille ansérine, supposé" => "douteux",
                    "presque certaine" => "douteux",
                    "Quasi Certaine" => "douteux",
                    "ssp déterminer" => "douteux",
                    "subsp à vérifier" => "douteux",
                    "subsp. microphyllum ?" => "douteux",
                    "très douteuse" => "douteux",
                    "Très probable" => "douteux");
                foreach ($certitude as $valeur=>$saisie) {
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET commentaire = concat(commentaire, ' ', certitude), certitude = '".$saisie."' WHERE certitude ='".$valeur."'";
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
                $requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'aDeterminer', '', NULL)";
                $verif = $this->bdd->recupererTous($requete_verif);
                if ($verif != array()) print_r($verif);
        }
        
        private function supprimerCertitudeAutre() {
            echo "suppression des valeurs non compréhensible du champ certitude/identification";
            $requete = "UPDATE tb_nettoye_cel.cel_obs 
                SET commentaire = case isnull(commentaire) when 1 THEN certitude ELSE concat(commentaire, ' ', certitude) END, 
                certitude IS NULL WHERE `certitude` NOT IN ('douteux', 'certain', 'aDeterminer', '') and certitude is not NULL";
            $this->bdd->requeter($requete);
                echo "effectuée \n";
            $requete_verif = "SELECT certitude FROM tb_nettoye_cel.cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'aDeterminer', '', NULL)";
            $verif = $this->bdd->recupererTous($requete_verif);
            if ($verif != array()) print_r($verif);
        }
        
        private function unifierUtilisateur() {
             echo "suppression des images anonymes";
            $requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_images` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
                OR ce_utilisateur = 0) and `courriel_utilisateur` is null";
            $this->bdd->requeter($requete_anonyme);
            echo "suppression des tags images anonymes";
            $requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_images` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
                OR ce_utilisateur = 0) and `courriel_utilisateur` is null)";
            $this->bdd->requeter($requete_anonyme);
            echo "suppression des tags obs anonymes";
            $requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_arbre_mots_cles_obs` WHERE id_utilisateur in (select ce_utilisateur FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
                OR ce_utilisateur = 0) and `courriel_utilisateur` is null)";
            $this->bdd->requeter($requete_anonyme); 
            echo "suppression des obs anonymes";
            $requete_anonyme = "DELETE FROM tb_nettoye_cel.`cel_obs` WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
                OR ce_utilisateur = 0) and `courriel_utilisateur` is null";
            $this->bdd->requeter($requete_anonyme);
            
            echo "modification des observations ayant une adresse mail en identifiant";
            $requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = ce_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` , 
                `courriel_utilisateur` =  `U_MAIL`  WHERE ce_utilisateur like '%@%'";
            $utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
            
            echo "modification des observations ayant une adresse mail mais pas d'identifiant";
            $requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON `U_MAIL` = courriel_utilisateur SET `ce_utilisateur` = `U_ID`, `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,
                `courriel_utilisateur` =  `U_MAIL`  WHERE (ce_utilisateur IS NULL OR LENGTH(ce_utilisateur) > 6
                OR ce_utilisateur = 0) and courriel_utilisateur like '%@%'";
            $utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
            
            echo "modification des observations ayant un identifiant";
            $requete_annu_mail = "UPDATE tb_nettoye_cel.`cel_obs` join tela_prod_v4.`annuaire_tela` ON U_ID = ce_utilisateur SET `prenom_utilisateur` = `U_NAME`, `nom_utilisateur` = `U_SURNAME` ,
                `courriel_utilisateur` =  `U_MAIL` WHERE (ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6) and courriel_utilisateur not like '%@%'";
            $utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
            
            $requete_verif = "SELECT `ce_utilisateur`, `prenom_utilisateur`, `nom_utilisateur`, `courriel_utilisateur`  FROM tb_nettoye_cel.cel_obs 
                    WHERE ce_utilisateur IS NOT NULL OR LENGTH(ce_utilisateur) > 6";
            $verif = $this->bdd->recupererTous($requete_verif);
            if ($verif != array()) print_r($verif);
        }
        
        private function unifierNomReferentiel() {
                echo "Uniformisation du nom de référentiel";
                $referentiels = array("BDTFX", "BDTRE", "BDTXA", "APD", "LBF", "ISFAN");
                foreach ($referentiels as $referentiel) {
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = '".$referentiel."' WHERE nom_referentiel like '".$referentiel."%'";
                        $this->bdd->requeter($requete);
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = NULL WHERE nom_sel_nn = '' or nom_sel_nn = '0'";
                        $this->bdd->requeter($requete);
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'APD' WHERE nom_referentiel like 'bdtao%'";
                        $this->bdd->requeter($requete);
                        $requete = "UPDATE tb_nettoye_cel.cel_obs SET nom_referentiel = 'BDTFX' WHERE nom_referentiel like 'bdnff%'";
                        $this->bdd->requeter($requete);
                        echo "effectuée \n";
                }
                $requete_verif = "SELECT nom_referentiel FROM tb_nettoye_cel.cel_obs WHERE nom_referentiel NOT IN ('".implode("', '", $referentiels)."', 'autre')";
                $verif = $this->bdd->recupererTous($requete_verif);
                if ($verif != array()) print_r($verif);
        }
        
        private function supprimerInfosLiesObsInexistante() {
            echo "Supprimer infos liés à obs inexistante";
            $requete = "DELETE FROM tb_nettoye_cel.`cel_obs_etendues` WHERE `id_observation` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
            $this->bdd->requeter($requete);
            $requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_obs_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
            $this->bdd->requeter($requete);
            $requete = "DELETE FROM tb_nettoye_cel.`cel_mots_cles_images_liaison` WHERE `id_element_lie` not in (select `id_observation` from tb_nettoye_cel.cel_obs);";
            $this->bdd->requeter($requete);
            echo "effectuée \n";
        }
        
        private function verifierGeodatum() {
                echo "Uniformisation du geodatum";
                $requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = 'wgs84' WHERE (latitude IS NOT NULL or latitude != '0.00000') AND geodatum = ''";
                $this->bdd->requeter($requete);
                $requete = "UPDATE tb_nettoye_cel.cel_obs SET geodatum = NULL WHERE (latitude IS NULL or latitude == '0.00000')";
                $this->bdd->requeter($requete);
                echo "effectuée \n";
        }
        
        private function verifierCodeInsee() {
            echo "Vérification du code insee";
            $requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '0' WHERE 
                ((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and 
                replace(`ce_zone_geo`, 'INSEE-C:', '') != `code_insee_calcule`";
            $this->bdd->requeter($requete);
            $requete = "UPDATE tb_nettoye_cel.cel_obs SET locality_consistency = '1' WHERE
                ((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and
                replace(`ce_zone_geo`, 'INSEE-C:', '') = `code_insee_calcule`";$this->bdd->requeter($requete);
            echo "effectuée \n";
        }
        
        private function analyserMotsCles(){
            
        }
}