This commit is contained in:
PTA
2026-08-20 17:00:06 +02:00
parent 5d8c0993a6
commit 94e7f09eb4
58 changed files with 5605 additions and 615 deletions

View File

@@ -56,6 +56,8 @@ final class SchemaModel extends BaseModel
'equipe_pta',
'equipe_pta_membre',
'structure_creneau_reference',
'compte_acces',
'journal_activite',
];
$placeholders = implode(',', array_fill(0, count($requiredTables), '?'));
@@ -82,6 +84,7 @@ final class SchemaModel extends BaseModel
'planning' => ['date_validation'],
'agent' => ['email', 'telephone', 'adresse', 'est_diplome', 'diplome_libelle', 'id_structure', 'id_poste', 'type_contrat', 'date_debut_contrat', 'date_fin_contrat', 'droit_enveloppe_formation', 'commentaire_pta'],
'structure' => ['type_affectation'],
'compte_acces' => ['mot_de_passe_hash'],
];
foreach ($requiredColumns as $table => $columns) {
@@ -108,6 +111,7 @@ final class SchemaModel extends BaseModel
}
$this->assertAccessViews();
$this->assertJetonViews();
}
/**
@@ -145,4 +149,39 @@ final class SchemaModel extends BaseModel
);
}
}
/**
* Vues des comptes à jeton et du journal (V7.11).
*
* Même logique fail-closed que pour les vues de droits : sans elles,
* personne ne peut plus s'authentifier et aucune action ne serait tracée.
* Mieux vaut un message explicite au démarrage qu'une application ouverte
* sans journal.
*/
private function assertJetonViews(): void
{
$requiredViews = [
'v_acces_compte',
'v_acces_compte_manquant',
'v_journal_activite',
];
$placeholders = implode(',', array_fill(0, count($requiredViews), '?'));
$stmt = $this->pdo->prepare(
"SELECT TABLE_NAME
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ($placeholders)"
);
$stmt->execute($requiredViews);
$missing = array_values(array_diff($requiredViews, $stmt->fetchAll(\PDO::FETCH_COLUMN)));
if ($missing) {
throw new \RuntimeException(
'Comptes d’accès indisponibles : vue(s) manquante(s) : '
. implode(', ', $missing)
. '. Exécutez database/migration_v7_9e_dsi_comptes_journal.sql.'
);
}
}
}