From 42c70e8c5a93bd980e97ae0ed29f3c459e26e69c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Wed, 4 May 2022 10:43:10 +0200
Subject: [PATCH] Fiabilisation des sauvegardes et de la migration v18

---
 admin/migration/v18Divers.php   | 50 ++++++++++++++++++++++++++++----
 admin/migration/v18Plafonds.php | 30 -------------------
 admin/migration/v18Statuts.php  | 51 +++++++--------------------------
 data/ddl_config.php             |  1 +
 4 files changed, 56 insertions(+), 76 deletions(-)

diff --git a/admin/migration/v18Divers.php b/admin/migration/v18Divers.php
index d4b2d05d73..6a5f81bf99 100644
--- a/admin/migration/v18Divers.php
+++ b/admin/migration/v18Divers.php
@@ -27,25 +27,65 @@ class v18Divers extends AbstractMigration
         $c   = $this->manager->getOseAdmin()->getConsole();
 
         try {
-            $c->msg('Suppression de la contrainte TYPE_INTERVENANT_CODE_UN en prévision de sa recréation');
-            $bdd->exec("DELETE FROM AFFECTATION_RECHERCHE WHERE structure_id NOT IN (SELECT ID FROM STRUCTURE)");
+            $c->msg('Coupure forcée de la synchronisation sur la table INTERVENANT');
+            $bdd->exec("UPDATE IMPORT_TABLES SET SYNC_ENABLED = 0 WHERE TABLE_NAME = 'INTERVENANT'");
         } catch (\Exception $e) {
             // rien à faire : la contrainte a déjà du être supprimée
         }
 
+        $this->sauvegardes();
+
         try {
             $c->msg('Suppression de la contrainte TYPE_INTERVENANT_CODE_UN en prévision de sa recréation');
-            $bdd->exec("ALTER TABLE TYPE_INTERVENANT DROP CONSTRAINT TYPE_INTERVENANT_CODE_UN");
+            $bdd->exec("DELETE FROM AFFECTATION_RECHERCHE WHERE structure_id NOT IN (SELECT ID FROM STRUCTURE)");
         } catch (\Exception $e) {
             // rien à faire : la contrainte a déjà du être supprimée
         }
 
         try {
-            $c->msg('Coupure forcée de la synchronisation sur la table INTERVENANT');
-            $bdd->exec("UPDATE IMPORT_TABLES SET SYNC_ENABLED = 0 WHERE TABLE_NAME = 'INTERVENANT'");
+            $c->msg('Suppression de la contrainte TYPE_INTERVENANT_CODE_UN en prévision de sa recréation');
+            $bdd->exec("ALTER TABLE TYPE_INTERVENANT DROP CONSTRAINT TYPE_INTERVENANT_CODE_UN");
         } catch (\Exception $e) {
             // rien à faire : la contrainte a déjà du être supprimée
         }
     }
 
+
+
+    protected function sauvegardes()
+    {
+        $bdd = $this->manager->getBdd();
+        $c   = $this->manager->getOseAdmin()->getConsole();
+
+        $tables = [
+            'INTERVENANT'         => 'SAVE_V18_INTERVENANT',
+            'INTERVENANT_DOSSIER' => 'SAVE_V18_DOSSIER',
+
+            'TYPE_PIECE_JOINTE_STATUT' => 'SAVE_V18_TPJS',
+            'TYPE_INTERVENTION_STATUT' => 'SAVE_V18_TIS',
+
+            'STATUT_INTERVENANT'             => 'SAVE_V18_STATUT',
+            'STATUT_PRIVILEGE'               => 'SAVE_V18_STATUT_PRIVILEGE',
+            'TYPE_AGREMENT_STATUT'           => 'SAVE_V18_TA_STATUT',
+            'DOSSIER_CHAMP_AUTRE_PAR_STATUT' => 'SAVE_V18_DOSSIER_AUTRE_STATUT',
+            'STRUCTURE'                      => 'SAVE_V18_STRUCTURE',
+            'FONCTION_REFERENTIEL'           => 'SAVE_V18_REFERENTIEL',
+            'PLAFOND_APPLICATION'            => 'SAVE_V18_PLAFOND_APP',
+            'PLAFOND'                        => 'SAVE_V18_PLAFOND',
+        ];
+
+        foreach ($tables as $table => $saveTable) {
+            if (!$this->manager->hasTable($table) || $this->manager->hasTable($saveTable)) {
+                unset($tables[$table]);
+            }
+        }
+
+        $c->begin('Sauvegarde des anciennes données');
+        foreach ($tables as $table => $saveTable) {
+            $c->msg('"' . $table . '" => "' . $saveTable . '".');
+            $this->manager->sauvegarderTable($table, $saveTable);
+        }
+        $c->end();
+    }
+
 }
\ No newline at end of file
diff --git a/admin/migration/v18Plafonds.php b/admin/migration/v18Plafonds.php
index f4a030e46d..633ac46b12 100644
--- a/admin/migration/v18Plafonds.php
+++ b/admin/migration/v18Plafonds.php
@@ -26,36 +26,6 @@ class v18Plafonds extends AbstractMigration
         $bdd = $this->manager->getBdd();
         $c   = $this->manager->getOseAdmin()->getConsole();
 
-        if (empty($bdd->table()->get('SAVE_V18_STATUT'))) {
-            $this->manager->sauvegarderTable('STATUT_INTERVENANT', 'SAVE_V18_STATUT');
-            $c->msg('Anciens statuts "STATUT_INTERVENANT" sauvegardés dans "SAVE_V18_STATUT".');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_STRUCTURE'))) {
-            $this->manager->sauvegarderTable('STRUCTURE', 'SAVE_V18_STRUCTURE');
-            $c->msg('Anciennes structures "STRUCTURE" sauvegardés dans "SAVE_V18_STRUCTURE".');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_REFERENTIEL'))) {
-            $this->manager->sauvegarderTable('FONCTION_REFERENTIEL', 'SAVE_V18_REFERENTIEL');
-            $c->msg('Anciennes fonctions référentielles "FONCTION_REFERENTIEL" sauvegardées dans "SAVE_V18_REFERENTIEL".');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_PLAFOND_APP'))) {
-            $this->manager->sauvegarderTable('PLAFOND_APPLICATION', 'SAVE_V18_PLAFOND_APP');
-            $c->msg('Anciens paramétrages des plafonds "PLAFOND_APPLICATION" sauvegardées dans "SAVE_V18_PLAFOND_APP".');
-        }
-
-        if (!empty($bdd->table()->get('PLAFOND_APPLICATION'))) {
-            $bdd->exec('DROP TABLE PLAFOND_APPLICATION');
-            $c->msg('Suppression des anciens paramétrages de plafonds');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_PLAFOND'))) {
-            $this->manager->sauvegarderTable('PLAFOND', 'SAVE_V18_PLAFOND');
-            $c->msg('Anciens plafonds "PLAFOND" sauvegardées dans "SAVE_V18_PLAFOND".');
-        }
-
         if (!empty($bdd->table()->get('PLAFOND'))) {
             $bdd->exec('DROP TABLE PLAFOND CASCADE CONSTRAINTS');
             $c->msg('Suppression des anciens plafonds');
diff --git a/admin/migration/v18Statuts.php b/admin/migration/v18Statuts.php
index dddf93970e..248de5091c 100644
--- a/admin/migration/v18Statuts.php
+++ b/admin/migration/v18Statuts.php
@@ -130,7 +130,7 @@ class v18Statuts extends AbstractMigration
         $c   = $this->manager->getOseAdmin()->getConsole();
 
         $c->begin('Préparation à la mise à jour des indicateurs');
-        if (empty($bdd->table()->get('TYPE_INDICATEUR'))) {
+        if (!$this->manager->hasTable('TYPE_INDICATEUR')) {
             $bdd->exec('ALTER TABLE INDICATEUR ADD (TYPE_INDICATEUR_ID NUMBER)');
             $bdd->exec('CREATE TABLE TYPE_INDICATEUR (  
               ID NUMBER NOT NULL ENABLE,
@@ -152,27 +152,6 @@ class v18Statuts extends AbstractMigration
 
         $c->begin('Mise à jour de la liste des statuts');
 
-        if (empty($bdd->table()->get('SAVE_V18_STATUT'))) {
-            $this->manager->sauvegarderTable('STATUT_INTERVENANT', 'SAVE_V18_STATUT');
-            $c->msg('Anciens statuts "STATUT_INTERVENANT" sauvegardés dans "SAVE_V18_STATUT".');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_STATUT_PRIVILEGE'))) {
-            $this->manager->sauvegarderTable('STATUT_PRIVILEGE', 'SAVE_V18_STATUT_PRIVILEGE');
-            $c->msg('Anciens statuts "STATUT_PRIVILEGE" sauvegardés dans "SAVE_V18_STATUT_PRIVILEGE".');
-        }
-
-        if (empty($bdd->table()->get('SAVE_V18_TA_STATUT'))) {
-            $this->manager->sauvegarderTable('TYPE_AGREMENT_STATUT', 'SAVE_V18_TA_STATUT');
-            $c->msg('Anciens statuts "TYPE_AGREMENT_STATUT" sauvegardés dans "SAVE_V18_TA_STATUT".');
-        }
-
-        if (!$this->manager->hasTable('SAVE_V18_DOSSIER_AUTRE_STATUT') && $this->manager->hasTable('DOSSIER_CHAMP_AUTRE_PAR_STATUT')) {
-            $this->manager->sauvegarderTable('DOSSIER_CHAMP_AUTRE_PAR_STATUT', 'SAVE_V18_DOSSIER_AUTRE_STATUT');
-            $c->msg('Anciens statuts "DOSSIER_CHAMP_AUTRE_PAR_STATUT" sauvegardés dans "SAVE_V18_DOSSIER_AUTRE_STATUT".');
-        }
-
-
         /* Modifications préalables à faire en BDD */
         if (empty($bdd->sequence()->get('STATUT_ID_SEQ'))) {
             $bdd->exec('CREATE SEQUENCE STATUT_ID_SEQ INCREMENT BY 1 MINVALUE 1 NOCACHE');
@@ -317,7 +296,7 @@ class v18Statuts extends AbstractMigration
         SELECT
           max(si.id) id, i.annee_id
         FROM
-          intervenant i
+          SAVE_V18_INTERVENANT i
           JOIN SAVE_V18_STATUT si ON si.id = i.statut_id
         GROUP BY
           si.code, i.annee_id
@@ -492,7 +471,7 @@ class v18Statuts extends AbstractMigration
           osi.id old_statut_id,
           nsi.id new_statut_id
         FROM
-          intervenant i
+          SAVE_V18_INTERVENANT i
           JOIN SAVE_V18_STATUT osi ON osi.id = i.statut_id
           LEFT JOIN statut nsi ON nsi.code = osi.code AND nsi.annee_id = i.annee_id
         WHERE
@@ -542,7 +521,7 @@ class v18Statuts extends AbstractMigration
           osi.id old_statut_id,
           nsi.id new_statut_id
         FROM
-          intervenant_dossier d
+          SAVE_V18_DOSSIER d
           JOIN intervenant i ON i.id = d.intervenant_id
           JOIN SAVE_V18_STATUT osi ON osi.id = d.statut_id
           LEFT JOIN statut nsi ON nsi.code = osi.code AND nsi.annee_id = i.annee_id
@@ -581,14 +560,6 @@ class v18Statuts extends AbstractMigration
 
         $c->begin('Application des nouveaux statuts aux paramétrages de PJ');
 
-        if (empty($bdd->table()->get('SAVE_V18_TPJS'))) {
-            $this->manager->sauvegarderTable('TYPE_PIECE_JOINTE_STATUT', 'SAVE_V18_TPJS');
-            $c->msg('Anciens paramètres "TYPE_PIECE_JOINTE_STATUT" sauvegardés dans "SAVE_V18_TPJS".');
-
-            $bdd->exec('DELETE FROM TYPE_PIECE_JOINTE_STATUT');
-            $c->msg("Vidage de la table \"TYPE_PIECE_JOINTE_STATUT\" avant d'insérer les nouveaux paramètres");
-        }
-
         try {
             $bdd->exec("ALTER TABLE TYPE_PIECE_JOINTE_STATUT DROP CONSTRAINT TPJS_STATUT_INTERVENANT_FK");
         } catch (\Exception $e) {
@@ -598,6 +569,9 @@ class v18Statuts extends AbstractMigration
         /* Modifications au niveau de la table TPJS */
         $ddl = $bdd->table()->get('TYPE_PIECE_JOINTE_STATUT')['TYPE_PIECE_JOINTE_STATUT'];
         if (!isset($ddl['columns']['ANNEE_ID'])) {
+            $bdd->exec('DELETE FROM TYPE_PIECE_JOINTE_STATUT');
+            $c->msg("Vidage de la table \"TYPE_PIECE_JOINTE_STATUT\" avant d'insérer les nouveaux paramètres");
+
             $bdd->exec("ALTER TABLE TYPE_PIECE_JOINTE_STATUT ADD(ANNEE_ID NUMBER)");
         }
         if (!isset($ddl['columns']['NUM_REGLE'])) {
@@ -675,17 +649,12 @@ class v18Statuts extends AbstractMigration
 
         $c->begin('Application des nouveaux statuts aux paramétrages des types d\'intervention');
 
-        if (empty($bdd->table()->get('SAVE_V18_TIS'))) {
-            $this->manager->sauvegarderTable('TYPE_INTERVENTION_STATUT', 'SAVE_V18_TIS');
-            $c->msg('Anciens paramètres "TYPE_INTERVENTION_STATUT" sauvegardés dans "SAVE_V18_TIS".');
-
-            $bdd->exec('DELETE FROM TYPE_INTERVENTION_STATUT');
-            $c->msg("Vidage de la table \"TYPE_INTERVENTION_STATUT\" avant d'insérer les nouveaux paramètres");
-        }
-
         /* Modifications au niveau de la table TIS */
         $ddl = $bdd->table()->get('TYPE_INTERVENTION_STATUT')['TYPE_INTERVENTION_STATUT'];
         if (!isset($ddl['columns']['ANNEE_ID'])) {
+            $bdd->exec('DELETE FROM TYPE_INTERVENTION_STATUT');
+            $c->msg("Vidage de la table \"TYPE_INTERVENTION_STATUT\" avant d'insérer les nouveaux paramètres");
+
             $bdd->exec("ALTER TABLE TYPE_INTERVENTION_STATUT ADD(ANNEE_ID NUMBER)");
         }
         if (!isset($ddl['columns']['STATUT_ID'])) {
diff --git a/data/ddl_config.php b/data/ddl_config.php
index 2f103d7f37..ad938b88ab 100644
--- a/data/ddl_config.php
+++ b/data/ddl_config.php
@@ -11,6 +11,7 @@ return [
             'TBL_SERVICE_SAISIE',
             'STATUT_PRIVILEGE',
             'TYPE_AGREMENT_STATUT',
+            'PLAFOND_APPLICATION',
         ],
     ],
     'materialized-view' => [
-- 
GitLab