Commit dc96072e authored by joriot221's avatar joriot221
Browse files

Merge branch 'master' into FJ_Date_Modif

parents 7b4eb3b1 125aea0f
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
<?php

require_once dirname(__DIR__) . '/migration/v18Plafonds.php';
/*
require_once dirname(__DIR__) . '/migration/v18Divers.php';

$mm  = new MigrationManager($oa, new \BddAdmin\Ddl\Ddl(), []);
$v18 = new v18Plafonds($mm);
$v18 = new v18Divers($mm);

$v18->checkDoublons();*/

$v18->migrationParamsStatut();
 No newline at end of file
phpinfo();
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -23,6 +23,10 @@ foreach ($ref as $ddlClass => $objects) {
    }
}

if (($_SERVER['IGNORE_MV_EXT_SERVICE'] ?? "false") == "true") {
    $filters['materialized-view']['excludes'][] = 'MV_EXT_SERVICE';
}

$tablesDep = [
    Ddl::INDEX,
    Ddl::PRIMARY_CONSTRAINT,
+191 −77
Original line number Diff line number Diff line
@@ -31,6 +31,24 @@ class v18Divers extends AbstractMigration
            $c->printDie('Attention : vous devez d\'abord mettre à jour en version 17.3 AVANT de mettre à jour en version 18');
        }

        try {
            $bdd->exec("alter trigger F_INTERVENANT disable");
        } catch (\Exception $e) {
        }

        try {
            $bdd->exec("alter trigger F_INTERVENANT_S disable");
        } catch (\Exception $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'");
        } catch (\Exception $e) {
            // rien à faire : la contrainte a déjà du être supprimée
        }


        if (!$this->checkDoublons()) {
            $c->printDie('Attention : des doublons ont été trouvés dans vos intervenants. Merci de purger d\'abord votre base de données, puis de relancer ensuite la procédure de mise à jour.');
        }
@@ -104,107 +122,203 @@ class v18Divers extends AbstractMigration
        $bdd = $this->manager->getBdd();
        $c   = $this->manager->getOseAdmin()->getConsole();

        $need = $this->manager->hasNew(\BddAdmin\Ddl\Ddl::UNIQUE_CONSTRAINT, 'INTERVENANT_CODE_UN')
            || $this->manager->hasNew(\BddAdmin\Ddl\Ddl::UNIQUE_CONSTRAINT, 'INTERVENANT_SOURCE_UN')
            || $this->manager->hasNew(\BddAdmin\Ddl\Ddl::UNIQUE_CONSTRAINT, 'INTERVENANT_UTIL_CODE_UN');
        $uc = \BddAdmin\Ddl\Ddl::UNIQUE_CONSTRAINT;

        if (!$need) return true;
        $res = [];
        if ($this->manager->hasNew($uc, 'INTERVENANT_CODE_UN')) {
            $lres = $this->checkDoublonsCode();
            foreach ($lres as $r) {
                $res[] = $r;
            }
        }

        if ($this->manager->hasNew($uc, 'INTERVENANT_SOURCE_UN')) {
            $lres = $this->checkDoublonsSourceCode();
            foreach ($lres as $r) {
                $res[] = $r;
            }
        }

        $data     = [];
        $sqls     = [];
        $autoSqls = [];
        foreach ($res as $i) {
            if ($i['HISTO_DESTRUCTION']) {
                $autoSqls[$i['USQL']] = $i['USQL'];
            } else {
                if (isset($i['CODE'])) {
                    $cl = 'Code';
                    $cv = $i['CODE'];
                } elseif (isset($i['SOURCE_CODE'])) {
                    $cl = 'Code Source';
                    $cv = $i['SOURCE_CODE'];
                } elseif (isset($i['UTILISATEUR_CODE'])) {
                    $cl = 'Code Utilisateur';
                    $cv = $i['UTILISATEUR_CODE'];
                } else {
                    $cl = 'Code inconnu';
                    $cv = null;
                }

                $data[$i['USQL']] = [
                    'Année'     => $i['ANNEE_ID'],
                    $cl         => $cv,
                    'STATUT'    => $i['STATUT'],
                    'Nom usuel' => $i['NOM_USUEL'],
                    'Prénom'    => $i['PRENOM'],
                ];
                $sqls[$i['USQL']] = $i['USQL'];
            }
        }

        foreach ($autoSqls as $sql) {
            $bdd->exec($sql);
        }

        if (!empty($data)) {
            $c->printArray($data);
            $c->println('Des intervenants ayant deux fois le même statut, le même source_code ou le même utilisateur_code pour la même année ont été trouvés.');
            $c->println('Afin de régler ce problème, vous devrez historiser les fiches concernées en exécutant vous-mêmes en BDD les requêtes suivantes :');
            $c->println('');
            $c->println(implode("\n", $sqls));
            $c->println('');
            $c->println('Une fois le traitement effectué, vous pourrez reprendre la mise à jour via la commande ./bin/ose update-bdd.');

            return false;
        } else {
            return true;
        }
    }



    private function checkDoublonsCode(): array
    {
        $bdd = $this->manager->getBdd();
        $c   = $this->manager->getOseAdmin()->getConsole();

        $statutTable = $this->manager->hasTable('STATUT') ? 'STATUT' : 'STATUT_INTERVENANT';

        $sql = "SELECT
          COALESCE(t1.annee, t2.annee, t3.annee) annee,
          COALESCE(t1.nom, t2.nom, t3.nom) nom,
          COALESCE(t1.prenom, t2.prenom, t3.prenom) prenom,
          COALESCE(t1.statut, t2.statut, t3.statut) statut,
          CASE WHEN t1.cc IS NULL THEN '' ELSE t1.c || ' identiques' END CODE,
          CASE WHEN t2.cc IS NULL THEN '' ELSE t2.c || ' identiques' END SOURCE_CODE,
          CASE WHEN t3.cc IS NULL THEN '' ELSE t3.c || ' identiques' END UTILISATEUR_CODE
        FROM
          (
        $sql = "
        SELECT
              i.ANNEE_ID annee, 
          i.*,
          i.nom_usuel nom,
          i.prenom prenom,
          si.libelle statut,
              'code_un' cc,
              count(*) c
          CASE WHEN i.histo_destruction IS NOT NULL THEN
            'UPDATE INTERVENANT SET HISTO_DESTRUCTION = HISTO_DESTRUCTION + interval ''1'' second WHERE ID = ' || i.id
          ELSE
            'UPDATE INTERVENANT SET HISTO_DESTRUCTION = sysdate, HISTO_DESTRUCTEUR_ID = ose_parametre.get_ose_user WHERE ID = ' || i.id || ';'
          END usql
        FROM
              intervenant i
              JOIN $statutTable si ON si.id = i.statut_id
            WHERE
              i.HISTO_DESTRUCTION IS NULL
            GROUP BY
              i.CODE, 
              i.ANNEE_ID, 
              i.STATUT_ID,
              i.nom_usuel,
              i.prenom,
              si.libelle
            HAVING 
              COUNT(*) > 1
          ) t1

          FULL JOIN (
          (
          SELECT
              i.ANNEE_ID annee,
              i.nom_usuel nom,
              i.prenom prenom,
              si.libelle statut,
              'source_un' cc,
              count(*) c
            i.*,
            min(nbdeps) OVER (PARTITION BY code, annee_id, statut_id, histo_destruction) minnbdeps,
            max(nbdeps) OVER (PARTITION BY code, annee_id, statut_id, histo_destruction) maxnbdeps,
            ROW_NUMBER() OVER (PARTITION BY code, annee_id, statut_id, histo_destruction ORDER BY id) ordre
          FROM
            (
              SELECT
                code, annee_id, statut_id, histo_destruction
                ,id,prenom,nom_usuel,
                (
                    (SELECT count(*) FROM SERVICE_REFERENTIEL WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM VALIDATION WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM AGREMENT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM CONTRAT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM HISTO_INTERVENANT_SERVICE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM AFFECTATION_RECHERCHE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM PIECE_JOINTE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM SERVICE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM MODIFICATION_SERVICE_DU WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INDIC_MODIF_DOSSIER WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INTERVENANT_PAR_DEFAUT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INTERVENANT_DOSSIER WHERE intervenant_id = i.id)
                ) nbdeps,
                COUNT(*) OVER (PARTITION BY code, annee_id, statut_id, histo_destruction) nbr
              FROM
                intervenant i
            ) i
          WHERE 
            nbr > 1
          ) i
          JOIN $statutTable si ON si.id = i.statut_id
        WHERE
              i.HISTO_DESTRUCTION IS NULL
            GROUP BY
              i.SOURCE_CODE, 
              i.ANNEE_ID, 
              i.STATUT_ID,
              i.nom_usuel,
              i.prenom,
              si.libelle
            HAVING COUNT(*) > 1
          ) t2 ON t2.nom = t1.nom AND t2.prenom = t1.prenom AND t2.statut = t1.statut

          FULL JOIN (
          CASE 
            WHEN nbdeps < maxnbdeps AND nbdeps = minnbdeps THEN 1
            WHEN i.ordre > 1 THEN 1
            ELSE 0
          END = 1
        ";

        return $bdd->select($sql);
    }



    private function checkDoublonsSourceCode(): array
    {
        $bdd = $this->manager->getBdd();
        $c   = $this->manager->getOseAdmin()->getConsole();

//        $statutTable = $this->manager->hasTable('STATUT') ? 'STATUT' : 'STATUT_INTERVENANT';
        $statutTable = 'STATUT_INTERVENANT';

        $sql = "
        SELECT
              i.ANNEE_ID annee,
          i.*,
          i.nom_usuel nom,
          i.prenom prenom,
          si.libelle statut,
              'util_code_un' cc,
              count(*) c
          CASE WHEN i.histo_destruction IS NOT NULL THEN
            'UPDATE INTERVENANT SET HISTO_DESTRUCTION = HISTO_DESTRUCTION + interval ''1'' second WHERE ID = ' || i.id
          ELSE
            'UPDATE INTERVENANT SET HISTO_DESTRUCTION = sysdate, HISTO_DESTRUCTEUR_ID = ose_parametre.get_ose_user WHERE ID = ' || i.id || ';'
          END usql
        FROM
          (
          SELECT
            i.*,
            min(nbdeps) OVER (PARTITION BY source_code, annee_id, statut_id, histo_destruction) minnbdeps,
            max(nbdeps) OVER (PARTITION BY source_code, annee_id, statut_id, histo_destruction) maxnbdeps,
            ROW_NUMBER() OVER (PARTITION BY source_code, annee_id, statut_id, histo_destruction ORDER BY id) ordre
          FROM
            (
              SELECT
                source_code, annee_id, statut_id, histo_destruction
                ,id,prenom,nom_usuel,
                (
                    (SELECT count(*) FROM SERVICE_REFERENTIEL WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM VALIDATION WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM AGREMENT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM CONTRAT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM HISTO_INTERVENANT_SERVICE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM AFFECTATION_RECHERCHE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM PIECE_JOINTE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM SERVICE WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM MODIFICATION_SERVICE_DU WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INDIC_MODIF_DOSSIER WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INTERVENANT_PAR_DEFAUT WHERE intervenant_id = i.id)
                  + (SELECT count(*) FROM INTERVENANT_DOSSIER WHERE intervenant_id = i.id)
                ) nbdeps,
                COUNT(*) OVER (PARTITION BY source_code, annee_id, statut_id, histo_destruction) nbr
              FROM
                intervenant i
            ) i
          WHERE 
            nbr > 1
          ) i
          JOIN $statutTable si ON si.id = i.statut_id
        WHERE
              i.HISTO_DESTRUCTION IS NULL
              AND i.UTILISATEUR_CODE IS NOT NULL
            GROUP BY
              i.UTILISATEUR_CODE, 
              i.ANNEE_ID, 
              i.STATUT_ID,
              i.nom_usuel,
              i.prenom,
              si.libelle
            HAVING COUNT(*) > 1
          ) t3 ON t3.nom = COALESCE(t1.nom,t2.nom) AND t3.prenom = COALESCE(t1.prenom,t2.prenom) AND t3.statut = COALESCE(t1.statut,t2.statut)
          CASE 
            WHEN nbdeps < maxnbdeps AND nbdeps = minnbdeps THEN 1
            WHEN i.ordre > 1 THEN 1
            ELSE 0
          END = 1
        ";

        $res = $bdd->select($sql);

        if (!empty($res)) {
            $c->printArray($res);
            $c->println('Des intervenants ayant le même statut, le même source_code ou le même utilisateur_code pour la même année ont été trouvés.');
            $c->println('Merci de supprimer ou modifier manuellement les intervenants concernés AVANT de poursuivre la mise à jour.');
            $c->println('Une fois le traitement effectué, vous pourrez reprendre la mise à jour via la commande ./bin/ose update-bdd.');

            return false;
        } else {
            return true;
        }
        return $bdd->select($sql);
    }

}
 No newline at end of file
+5 −5
Original line number Diff line number Diff line
@@ -17,11 +17,11 @@ class v18Plafonds extends AbstractMigration
    public function utile(): bool
    {
        return $this->manager->hasNew('table', 'PLAFOND_PERIMETRE')
            && $this->manager->hasTable('SAVE_V18_PLAFOND')
            && $this->manager->hasTable('SAVE_V18_STRUCTURE')
            && $this->manager->hasTable('SAVE_V18_PLAFOND_APP')
            && $this->manager->hasTable('SAVE_V18_REFERENTIEL')
            && $this->manager->hasTable('SAVE_V18_STATUT');
            && $this->manager->tableRealExists('SAVE_V18_PLAFOND')
            && $this->manager->tableRealExists('SAVE_V18_STRUCTURE')
            && $this->manager->tableRealExists('SAVE_V18_PLAFOND_APP')
            && $this->manager->tableRealExists('SAVE_V18_REFERENTIEL')
            && $this->manager->tableRealExists('SAVE_V18_STATUT');
    }


+2 −1
Original line number Diff line number Diff line
@@ -16,7 +16,8 @@ class v18Privileges extends AbstractMigration

    public function utile(): bool
    {
        return $this->manager->hasTable('SAVE_V18_PRIVILEGE') && $this->manager->hasTable('SAVE_V18_ROLE_PRIVILEGE');
        return $this->manager->tableRealExists('SAVE_V18_PRIVILEGE')
            && $this->manager->tableRealExists('SAVE_V18_ROLE_PRIVILEGE');
    }


Loading