Skip to content
Snippets Groups Projects
Commit 05a966de authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Renforcement général des scripts de migration

parent 83809242
No related branches found
No related tags found
No related merge requests found
<?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
......@@ -23,6 +23,10 @@ foreach ($ref as $ddlClass => $objects) {
}
}
//if (isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == 'ose-dev.pc-local') {
$filters['materialized-view']['excludes'][] = 'MV_EXT_SERVICE';
//}
$tablesDep = [
Ddl::INDEX,
Ddl::PRIMARY_CONSTRAINT,
......
......@@ -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
......@@ -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');
}
......
......@@ -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');
}
......
......@@ -17,12 +17,12 @@ class v18Statuts extends AbstractMigration
public function utile(): bool
{
return $this->manager->hasOld('table', 'STATUT_INTERVENANT')
&& $this->manager->hasTable('SAVE_V18_STATUT')
&& $this->manager->hasTable('SAVE_V18_STATUT_PRIVILEGE')
&& $this->manager->hasTable('SAVE_V18_DOSSIER_AUTRE_STATUT')
&& $this->manager->hasTable('SAVE_V18_TA_STATUT')
&& $this->manager->hasTable('SAVE_V18_INTERVENANT')
&& $this->manager->hasTable('SAVE_V18_DOSSIER');
&& $this->manager->tableRealExists('SAVE_V18_STATUT')
&& $this->manager->tableRealExists('SAVE_V18_STATUT_PRIVILEGE')
&& $this->manager->tableRealExists('SAVE_V18_DOSSIER_AUTRE_STATUT')
&& $this->manager->tableRealExists('SAVE_V18_TA_STATUT')
&& $this->manager->tableRealExists('SAVE_V18_INTERVENANT')
&& $this->manager->tableRealExists('SAVE_V18_DOSSIER');
}
......
......@@ -193,7 +193,7 @@ class MigrationManager
protected function tableRealExists($tableName): bool
public function tableRealExists($tableName): bool
{
$sql = "SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = :tableName";
$tn = $this->getBdd()->select($sql, compact('tableName'), ['fetch' => Bdd::FETCH_ONE]);
......
......@@ -5,7 +5,7 @@
return [
'name' => 'INTERVENANT_SOURCE_UN',
'table' => 'INTERVENANT',
'index' => 'INTERVENANT_SOURCE_UN1',
'index' => 'INTERVENANT_SOURCE_UN',
'columns' => [
'SOURCE_CODE',
'ANNEE_ID',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment