diff --git a/admin/migration/MigrationPrivileges.php b/admin/migration/MigrationPrivileges.php index 7f9989884e346e009acda3525bb1ecefcd42b891..1543c6f913fd8ccf995bc3254cbf0b1445ece90f 100644 --- a/admin/migration/MigrationPrivileges.php +++ b/admin/migration/MigrationPrivileges.php @@ -19,7 +19,7 @@ class MigrationPrivileges extends AbstractMigration public function utile(): bool { - return $this->manager->hasNew('table', 'DOSSIER_CHAMP_AUTRE'); + return $this->manager->hasNew('table', 'DOSSIER_CHAMP_AUTRESS'); } @@ -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); - - 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 . "')"; - $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); - }*/ + $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'])) { + + //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); + $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; } }