Commit 18e1271f authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Merge branch 'master' of https://git.unicaen.fr/open-source/OSE

parents 030fbd20 4f579d69
Loading
Loading
Loading
Loading
+214 −27
Changes for admin/migration/MigrationPrivileges.php: 214 added lines, 27 removed lines.
Original line number Diff line number Diff line
@@ -47,21 +47,12 @@ class MigrationPrivileges extends AbstractMigration
        $oa      = $this->manager->getOseAdmin();
        $bdd     = $this->manager->getBdd();
        $console = $this->manager->getOseAdmin()->getConsole();
        $console->println("Récupération des statuts intervenants");
        $sqlStatut = "
            SELECT 
              *
            FROM statut_intervenant si 
            WHERE 
                si.histo_destruction IS NULL";


        $statutsIntervenant = $bdd->select($sqlStatut);

        $sqlPrivileges = "
        $console->println("Récupération des nouveaux privilèges données personnelles");
        $sqlNewPrivileges = "
            SELECT
                p.id   id,
                p.code code
                
            FROM
                privilege p 
            JOIN 
@@ -71,27 +62,223 @@ class MigrationPrivileges extends AbstractMigration
            AND 
                p.code NOT IN ('differences', 'purger-differences', 'devalidation', 'validation', 'suppression', 'visualisation', 'edition')";

        $privileges = $bdd->select($sqlPrivileges);
        $newPrivilegesDossier = $bdd->select($sqlNewPrivileges);

        $console->println("Récupération des statuts intervenants ayant des privileges de la catégorie dossier", CONSOLE::COLOR_GREEN);


        //Traitement des privileges pour les statuts
        $statutIntervenant = [];

        $sqlStatut = "SELECT 
            si.code    code_statut,
            si.id      id,
            si.libelle libelle,
            cp.code    categorie_privilege,
            p.code     code_privilege
            FROM statut_intervenant si
            JOIN statut_privilege sp ON sp.statut_id = si.id
            JOIN privilege p ON sp.privilege_id = p.id 
            JOIN categorie_privilege cp ON cp.id = p.categorie_id
            WHERE cp.code = 'dossier'
            AND si.histo_destruction IS NULL
            ORDER BY si.code ASC
        ";

        $statutsIntervenantPrivilegesDossier = $bdd->select($sqlStatut);
        foreach ($statutsIntervenantPrivilegesDossier as $spd) {
            $statutIntervenant[$spd['CODE_STATUT']]['PRIVILEGES'][] = $spd;
            if (!isset($statutIntervenant[$spd['CODE_STATUT']]['ID'])) {
                $statutIntervenant[$spd['CODE_STATUT']]['ID'] = $spd['ID'];
            }
        }

        foreach ($statutIntervenant as $codeStatut => $statut) {
            $ajoutVisualisation      = 0;
            $suppressionVisualiation = 0;
            $ajoutEdition            = 0;
            $suppressionEdition      = 0;
            $console->println('Mise à niveau des privilèges données personnelles du statut : ' . $codeStatut, CONSOLE::COLOR_BLUE);
            if ($this->havePrivilege($statut, 'visualisation')) {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'visualisation')) {
                        if (!$this->havePrivilege($statut, $newPrivilege['CODE'])) {

                            //On ajouter les privleges de visualisation des blocs données perso car il a le droit visualisation sur le dossier
                            $sqlInsert = "INSERT INTO statut_privilege (privilege_id, statut_id) VALUES ('" . $newPrivilege['ID'] . "', '" . $statut['ID'] . "')";
                            $bdd->exec($sqlInsert);
                            $ajoutVisualisation++;
                        }
                    }
                }
                if ($ajoutVisualisation > 0) {
                    //$console->println('Ajout des privileges visualisation pour le statut : ' . $codeStatut, CONSOLE::COLOR_BLUE);
                }
            } else {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'visualisation')) {
                        if ($this->havePrivilege($statut, $newPrivilege['CODE'])) {
                            //On supprime les privileges de visualisation des blocs données perso car il n'a pas le droit visualistion sur le dossier
                            $sqlDelete = "DELETE FROM statut_privilege WHERE privilege_id = " . $newPrivilege['ID'] . " AND statut_id = " . $statut['ID'];
                            $bdd->exec($sqlDelete);
                            $suppressionVisualiation++;
                        }
                    }
                }
                if ($suppressionVisualiation > 0) {
                    //$console->println('Suppression des privileges visualisation pour le statut : ' . $codeStatut, CONSOLE::COLOR_BLUE);
                }
            }
            if ($ajoutVisualisation == 0 && $suppressionEdition == 0) {
                //$console->println('Les priviléges visualisation des blocs dossier perso pour le statut : ' . $codeStatut . ' sont déjà correctement paramétrés', CONSOLE::COLOR_GREEN);
            }
            if ($this->havePrivilege($statut, 'edition')) {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'edition')) {
                        if (!$this->havePrivilege($statut, $newPrivilege['CODE'])) {
                            //On ajouter les privleges d'édition des blocs données perso car il a le droit edition sur le dossier
                            $sqlInsert = "INSERT INTO statut_privilege (privilege_id, statut_id) VALUES ('" . $newPrivilege['ID'] . "', '" . $statut['ID'] . "')";
                            $bdd->exec($sqlInsert);
                            $ajoutEdition++;
                        }
                    }
                }
                if ($ajoutEdition > 0) {
                    //$console->println('Ajout des privileges edition des blocs de données perso pour le statut : ' . $codeStatut, CONSOLE::COLOR_BLUE);
                }
            } else {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'edition')) {
                        if ($this->havePrivilege($statut, $newPrivilege['CODE'])) {
                            //On supprime les privileges d'édition des blocs données perso car il n'a pas le droit edition sur le dossier
                            $sqlDelete = "DELETE FROM statut_privilege WHERE privilege_id = " . $newPrivilege['ID'] . " AND statut_id = " . $statut['ID'];
                            $bdd->exec($sqlDelete);
                            $suppressionEdition++;
                        }
                    }
                }
                if ($suppressionEdition > 0) {
                    //$console->println('Suppression des privileges edition des blocs de données perso pour le statut : ' . $codeStatut, CONSOLE::COLOR_BLUE);
                }
            }
            if ($ajoutEdition == 0 && $suppressionEdition == 0) {
                //$console->println('Les priviléges d\'édition des blocs dossier perso pour le statut : ' . $codeStatut . ' sont déjà correctement paramétrés', CONSOLE::COLOR_GREEN);
            }
        }
        //Traitement des privileges pour les rôles
        $console->println("Récupération des roles ayant des privileges de la catégorie dossier", CONSOLE::COLOR_GREEN);

        $roles = [];

        $sqlRole = "SELECT 
            r.code code_role,
            r.id   id,
            r.libelle libelle,
            cp.code categorie_privilege,
            p.code code_privilege
            FROM role r
            JOIN role_privilege rp ON r.id = rp.role_id
            JOIN privilege p ON p.id = rp.privilege_id
            JOIN categorie_privilege cp ON cp.id = p.categorie_id
            WHERE cp.code = 'dossier'
            AND r.histo_destruction IS NULL 
            ORDER BY r.code ASC
        ";

        $rolePrivilegesDossier = $bdd->select($sqlRole);
        foreach ($rolePrivilegesDossier as $rpd) {
            $roles[$rpd['CODE_ROLE']]['PRIVILEGES'][] = $rpd;
            if (!isset($roles[$rpd['CODE_ROLE']]['ID'])) {
                $roles[$rpd['CODE_ROLE']]['ID'] = $rpd['ID'];
            }
        }

        //Traitement des privileges pour les roles
        foreach ($roles as $codeRole => $role) {
            $ajoutVisualisation      = 0;
            $suppressionVisualiation = 0;
            $ajoutEdition            = 0;
            $suppressionEdition      = 0;
            $console->println('Mise à niveau des privilèges des données personnelles du role : ' . $codeRole, CONSOLE::COLOR_BLUE);
            if ($this->havePrivilege($role, 'visualisation')) {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'visualisation')) {
                        if (!$this->havePrivilege($role, $newPrivilege['CODE'])) {

        foreach ($statutsIntervenant as $statut) {
            $statutId = $statut['ID'];
            $console->println("Insertion priviliege dossier pour le statut : " . $statut['LIBELLE'], $console::COLOR_LIGHT_GREEN);
            foreach ($privileges as $privilege) {
                $privilegeId = $privilege['ID'];
                try {
                    $sqlInsert = "INSERT INTO statut_privilege (privilege_id, statut_id) VALUES ('" . $privilegeId . "', '" . $statutId . "')";
                            //On ajouter les privleges de visualisation des blocs données perso car il a le droit visualisation sur le dossier
                            $sqlInsert = "INSERT INTO role_privilege (privilege_id, role_id) VALUES ('" . $newPrivilege['ID'] . "', '" . $role['ID'] . "')";
                            $bdd->exec($sqlInsert);
                            $ajoutVisualisation++;
                        }
                    }
                }
                if ($ajoutVisualisation > 0) {
                    //$console->println('Ajout des privileges visualisation pour le role : ' . $codeRole, CONSOLE::COLOR_BLUE);
                }
            } else {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'visualisation')) {
                        if ($this->havePrivilege($role, $newPrivilege['CODE'])) {
                            //On supprime les privileges de visualisation des blocs données perso car il n'a pas le droit visualistion sur le dossier
                            $sqlDelete = "DELETE FROM role_privilege WHERE privilege_id = " . $newPrivilege['ID'] . " AND role_id = " . $role['ID'];
                            $bdd->exec($sqlDelete);
                            $suppressionVisualiation++;
                        }
                    }
                }
                if ($suppressionVisualiation > 0) {
                    //$console->println('Suppression des privileges visualisation pour le role : ' . $codeRole, CONSOLE::COLOR_BLUE);
                }
            }
            if ($ajoutVisualisation == 0 && $suppressionEdition == 0) {
                //$console->println('Les priviléges visualisation des blocs dossier perso pour le role : ' . $codeRole . ' sont déjà correctement paramétrés', CONSOLE::COLOR_GREEN);
            }
            if ($this->havePrivilege($role, 'edition')) {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'edition')) {
                        if (!$this->havePrivilege($role, $newPrivilege['CODE'])) {
                            //On ajouter les privleges d'édition des blocs données perso car il a le droit edition sur le dossier
                            $sqlInsert = "INSERT INTO role_privilege (privilege_id, role_id) VALUES ('" . $newPrivilege['ID'] . "', '" . $role['ID'] . "')";
                            $bdd->exec($sqlInsert);
                } catch (Exception $e) {
                    $message = $e->getMessage();
                    continue;
                    /*if (!strpos($message, 'ORA-00001')) {
                        $console->println("Privilege déjà existant en base pour ce statut", $console::COLOR_LIGHT_RED);
                    }*/
                            $ajoutEdition++;
                        }
                    }
                }
                if ($ajoutEdition > 0) {
                    // $console->println('Ajout des privileges edition des blocs de données perso pour le role : ' . $codeStatut, CONSOLE::COLOR_BLUE);
                }
            } else {
                foreach ($newPrivilegesDossier as $newPrivilege) {
                    if (strstr($newPrivilege['CODE'], 'edition')) {
                        if ($this->havePrivilege($role, $newPrivilege['CODE'])) {
                            //On supprime les privileges d'édition des blocs données perso car il n'a pas le droit edition sur le dossier
                            $sqlDelete = "DELETE FROM role_privilege WHERE privilege_id = " . $newPrivilege['ID'] . " AND role_id = " . $role['ID'];
                            $bdd->exec($sqlDelete);
                            $suppressionEdition++;
                        }
                    }
                }
                if ($suppressionEdition > 0) {
                    //$console->println('Suppression des privileges edition des blocs de données perso pour le role : ' . $codeRole, CONSOLE::COLOR_BLUE);
                }
            }
            if ($ajoutEdition == 0 && $suppressionEdition == 0) {
                //$console->println('Les priviléges d\'édition des blocs dossier perso pour le role : ' . $codeRole . ' sont déjà correctement paramétrés', CONSOLE::COLOR_GREEN);
            }
        }
    }



    private function havePrivilege($statut, $privilegeCode)
    {
        foreach ($statut['PRIVILEGES'] as $privilege) {
            if ($privilege['CODE_PRIVILEGE'] == $privilegeCode) {
                return true;
            }
        }

        $console->println("Fin de l'insertion des privileges dossier");
        return false;
    }
}