commentaires plus pertinent + supression anciens fichiers et anciens commentaires

This commit is contained in:
Noah 2026-06-10 23:14:46 +02:00
parent 5393f44339
commit ec24a2f129
23 changed files with 401 additions and 376 deletions

View file

@ -1,11 +1,11 @@
<?php
/**
* Aiguille vers le bon contrôleur selon la méthode HTTP
*/
function login_ctrl()
{
$ask_route = null;
if (isset($_GET['ask'])) {
$ask_route = htmlentities($_GET['ask']);
}
$ask_route = isset($_GET['ask']) ? htmlentities($_GET['ask']) : null;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
verify_login_ctrl($ask_route);
} else {
@ -13,36 +13,43 @@ function login_ctrl()
}
}
/**
* Affichage du formulaire de connexion
*/
function login_form_ctrl(?string $route)
{
require('views/login_views.php');
login_form_view($route);
}
/**
* Vérification du login/mot de passe
*/
function verify_login_ctrl(?string $route)
{
require('models/connection.php');
require('models/user_crud.php');
$login = isset($_POST['login']) ? htmlentities($_POST['login']) : '';
// On récupère les données du formulaire
$login = isset($_POST['login']) ? htmlentities($_POST['login']) : '';
$passwd = isset($_POST['password']) ? $_POST['password'] : '';
$c = connection();
$c = connection();
$user = recuperation_auth($c, $login);
if ($user && password_verify($passwd, $user['passwd'])) {
session_regenerate_id(true);
$_SESSION['id'] = $user['ID'];
$_SESSION['id'] = $user['ID'];
$_SESSION['login'] = $user['login'];
$_SESSION['role'] = $user['type'];
$_SESSION['role'] = $user['type'];
// Si une route était demandée avant auth, on y redirige
// Si une route était demandée avant connexion, on y retourne
if ($route) {
header('Location: index.php?route=' . $route);
exit;
}
// Sinon, redirection selon le rôle
// Sinon on redirige selon le rôle
switch ($user['type']) {
case 'administration':
header('Location: index.php?route=modif_utilisateurs_form');
@ -55,14 +62,18 @@ function verify_login_ctrl(?string $route)
break;
}
exit;
} else {
$_SESSION['notification'] = 'Erreur d\'authentification : login ou mot de passe incorrect.';
$ask = $route ? '&ask=' . $route : '';
header('Location: index.php?route=auth' . $ask);
exit;
}
// Échec de l'authentification
$_SESSION['notification'] = 'Erreur d\'authentification : login ou mot de passe incorrect.';
$ask = $route ? '&ask=' . $route : '';
header('Location: index.php?route=auth' . $ask);
exit;
}
/**
* Déconnexion
*/
function logout_ctrl()
{
session_unset();

View file

@ -1,40 +1,28 @@
<?php
// True if user is logged (auth is right)
function is_logged() {
$status = false;
if (isset($_SESSION['login'])) {
$status = true;
}
return $status;
// Vérifie si l'utilisateur est connecté
function is_logged()
{
return isset($_SESSION['login']);
}
// True if user has the role $role
function has_role(string $role) {
$status = false;
if (isset($_SESSION['role'])) {
if ($_SESSION['role'] == $role) {
$status = true;
}
}
return $status;
// Vérifie si l'utilisateur a un rôle précis
function has_role(string $role)
{
return isset($_SESSION['role']) && $_SESSION['role'] == $role;
}
// True if user has at least one of the given roles
// Vérifie si l'utilisateur a au moins un des rôles donnés
function has_any_role(array $roles): bool
{
if (!isset($_SESSION['role'])) {
return false;
}
return in_array($_SESSION['role'], $roles, true);
return isset($_SESSION['role']) && in_array($_SESSION['role'], $roles, true);
}
function verify_grants(string $route, string $role='') {
if (! has_role($role) && ! ($role == '' && is_logged())) {
// Contrôle d'accès : redirige vers auth si les droits sont insuffisants
function verify_grants(string $route, string $role = '')
{
if (!has_role($role) && !($role == '' && is_logged())) {
header('Location: index.php?route=auth&ask=' . $route);
exit;
}
// Nothing is done so process goes on
}

View file

@ -1,11 +1,17 @@
<?php
function contact_ctrl() {
/**
* Aiguille vers le bon contrôleur selon la méthode HTTP
*/
function contact_ctrl()
{
// Réservé gestionnaire et administration
require_once('controllers/auth_utilities.php');
if (!has_any_role(['gestionnaire', 'administration'])) {
header('Location: index.php?route=auth&ask=ajout_personnes');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
contact_write_ctrl();
} else {
@ -13,21 +19,28 @@ function contact_ctrl() {
}
}
function contact_form_ctrl() {
/**
* Affichage du formulaire
*/
function contact_form_ctrl()
{
require('views/contact_views.php');
}
function contact_write_ctrl() {
$nom = $_POST['nom'];
/**
* Enregistrement d'un nouveau sauveteur
*/
function contact_write_ctrl()
{
// Données du formulaire
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$dep = $_POST['dep'];
$spe = $_POST['spe'];
$tel = $_POST['tel'];
$date = $_POST['ladate'];
$heure = $_POST['lheure'];
$dep = $_POST['dep'];
$spe = $_POST['spe'];
$tel = $_POST['tel'];
// Combine date + heure en DateTime
$date_heure = $date . ' ' . $heure . ':00';
// Assemblage date + heure
$date_heure = $_POST['ladate'] . ' ' . $_POST['lheure'] . ':00';
if (empty($nom) || empty($prenom) || empty($tel)) {
$_SESSION['notification'] = 'Veuillez remplir tous les champs obligatoires.';
@ -35,6 +48,7 @@ function contact_write_ctrl() {
return;
}
// On écrit dans la base
require('models/connection.php');
$c = connection();
require('models/contact_crud.php');

View file

@ -1,41 +1,39 @@
<?php
/**
* Affichage du planning
*/
function planning_afficher_ctrl()
{
// Tout utilisateur connecté peut voir le planning
require_once('controllers/auth_utilities.php');
verify_grants('planning');
require('models/connection.php');
require('models/lecture_page_model.php');
$pdo = connection();
// Date du planning
if (isset($_GET['date'])) {
$date = $_GET['date'];
} else {
$date = date('Y-m-d');
}
$date = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d');
// Données depuis la base
// On récupère les sauveteurs et leurs missions du jour
$sauveteurs = get_sauveteurs($pdo);
$missions = get_missions_planning($pdo, $date);
// Créneaux horaires : 0h à 24h toutes les 30 minutes
// Créneaux de 30 minutes sur 24h
$creneaux = [];
for ($minutes = 0; $minutes < 1440; $minutes = $minutes + 30) {
for ($minutes = 0; $minutes < 1440; $minutes += 30) {
$heures = intdiv($minutes, 60);
$mins = $minutes % 60;
$creneaux[] = sprintf('%02d:%02d', $heures, $mins);
}
// Regrouper les missions par sauveteur
// On regroupe les missions par sauveteur
$missions_par_sauveteur = [];
foreach ($missions as $mission) {
$id_sauv = $mission['ID_Sauveteur'];
$missions_par_sauveteur[$id_sauv][] = $mission;
$missions_par_sauveteur[$mission['ID_Sauveteur']][] = $mission;
}
// Affichage
require('views/lecture_page.php');
planning_view($sauveteurs, $creneaux, $missions_par_sauveteur, $date);
}

View file

@ -1,40 +1,50 @@
<?php
function modif_utilisateurs_form_ctrl() {
/**
* Affichage du formulaire de modification de compte
*/
function modif_utilisateurs_form_ctrl()
{
// Réservé administration
require_once('controllers/auth_utilities.php');
verify_grants('modif_utilisateurs_form', 'administration');
// On charge la liste des comptes
require('models/connection.php');
$c = connection();
require('models/modif_compte_model.php');
$comptes = get_all_comptes($c);
$compte_select = null;
if (isset($_GET['id'])) {
$compte_select = get_compte_by_id($c, (int) $_GET['id']);
}
$compte_select = isset($_GET['id']) ? get_compte_by_id($c, (int) $_GET['id']) : null;
require('views/modif_compte_view.php');
modif_compte_view($comptes, $compte_select);
}
function modif_utilisateurs_write_ctrl() {
/**
* Enregistrement des modifications d'un compte
*/
function modif_utilisateurs_write_ctrl()
{
require_once('controllers/auth_utilities.php');
verify_grants('modif_utilisateurs', 'administration');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php?route=modif_utilisateurs_form');
exit;
}
$id = (int) $_POST['id'];
$nom = htmlentities($_POST['nom']);
// Données du formulaire
$id = (int) $_POST['id'];
$nom = htmlentities($_POST['nom']);
$prenom = htmlentities($_POST['prenom']);
$role = htmlentities($_POST['role']);
$role = htmlentities($_POST['role']);
$nomdep = htmlentities($_POST['nomdep']);
$num_tel = htmlentities($_POST['num_tel']);
$login = htmlentities($_POST['login']);
$login = htmlentities($_POST['login']);
$passwd = $_POST['passwd'] ?? '';
// On met à jour dans la base
require('models/connection.php');
$c = connection();
require('models/modif_compte_model.php');

View file

@ -1,13 +1,18 @@
<?php
/**
* Affiche le formulaire d'assignation de mission
*/
function operations_form_ctrl()
{
// Réservé gestionnaire et administration
require_once('controllers/auth_utilities.php');
if (!has_any_role(['gestionnaire', 'administration'])) {
header('Location: index.php?route=auth&ask=operations');
exit;
}
// On charge les sauveteurs et les statuts pour les listes déroulantes
require('models/connection.php');
require('models/lecture_page_model.php');
$pdo = connection();
@ -17,6 +22,9 @@ function operations_form_ctrl()
require('views/operations_view.php');
}
/**
* Enregistre une nouvelle mission dans la base
*/
function add_operation_write_ctrl()
{
require_once('controllers/auth_utilities.php');
@ -29,43 +37,32 @@ function add_operation_write_ctrl()
exit;
}
$id_sauveteur = (int) $_POST['id_sauveteur'];
$id_statut = (int) $_POST['id_statut'];
$lieu = $_POST['lieu'];
$date_debut = str_replace('T', ' ', $_POST['date_debut']) . ':00';
$en_prepa = isset($_POST['en_prepa']) ? 1 : 0;
$indeterminee = isset($_POST['duree_indeterminee']);
// Données du formulaire
$id_sauveteur = (int) $_POST['id_sauveteur'];
$id_statut = (int) $_POST['id_statut'];
$lieu = $_POST['lieu'];
$date_debut = str_replace('T', ' ', $_POST['date_debut']) . ':00';
$en_prepa = isset($_POST['en_prepa']) ? 1 : 0;
// Durée indéterminée → date très lointaine
if ($indeterminee || empty($_POST['date_fin'])) {
// Durée indéterminée ou fin normale
if (isset($_POST['duree_indeterminee']) || empty($_POST['date_fin'])) {
$date_fin = '2099-12-31 23:59:00';
} else {
$date_fin = str_replace('T', ' ', $_POST['date_fin']) . ':00';
}
// Utilisateur connecté
$id_utilisateur = isset($_SESSION['id']) ? (int) $_SESSION['id'] : 1;
// On écrit dans la base
require('models/connection.php');
$c = connection();
require('models/operation_crud.php');
$resultat = create_operation_crud(
$c,
$date_debut,
$date_fin,
$lieu,
$en_prepa,
$id_sauveteur,
$id_statut,
$id_utilisateur
);
$resultat = create_operation_crud($c, $date_debut, $date_fin, $lieu, $en_prepa, $id_sauveteur, $id_statut, $id_utilisateur);
if ($resultat) {
$_SESSION['notification'] = 'Mission enregistrée avec succès.';
} else {
$_SESSION['notification'] = 'Erreur lors de l\'enregistrement de la mission.';
}
$_SESSION['notification'] = $resultat
? 'Mission enregistrée avec succès.'
: 'Erreur lors de l\'enregistrement de la mission.';
header('Location: index.php?route=operations');
exit;

View file

@ -1,39 +1,45 @@
<?php
function add_utilisateurs_form_ctrl() {
/**
* Affichage du formulaire de création de compte
*/
function add_utilisateurs_form_ctrl()
{
// Réservé administration
require_once('controllers/auth_utilities.php');
verify_grants('add_utilisateurs_form', 'administration');
require('views/creation_compte_view.php');
}
function add_utilisateurs_write_ctrl() {
/**
* Enregistrement d'un nouveau compte utilisateur
*/
function add_utilisateurs_write_ctrl()
{
require_once('controllers/auth_utilities.php');
verify_grants('add_utilisateurs', 'administration');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php?route=add_utilisateurs_form');
exit;
}
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$role = $_POST['role'];
$nomdep = $_POST['nomdep'];
$num_tel = $_POST['num_tel'];
$login = $_POST['login'];
$mdp = $_POST['mdp'];
if (!preg_match('/^[a-zA-Z0-9_-]+$/', $login)) {
// Contrôle des caractères du login
if (!preg_match('/^[a-zA-Z0-9_-]+$/', $_POST['login'])) {
$_SESSION['notification'] = 'Erreur : le login contient des caractères non autorisés.';
require('views/creation_compte_view.php');
return;
}
$mdp_hache = password_hash($mdp, PASSWORD_DEFAULT);
// Hashage du mot de passe
$mdp_hache = password_hash($_POST['mdp'], PASSWORD_DEFAULT);
// On écrit dans la base
require('models/connection.php');
$c = connection();
require('models/utilisateur_crud.php');
create_utilisateur_crud($c, $nom, $prenom, $role, $nomdep, $num_tel, $login, $mdp_hache);
create_utilisateur_crud($c, $_POST['nom'], $_POST['prenom'], $_POST['role'], $_POST['nomdep'], $_POST['num_tel'], $_POST['login'], $mdp_hache);
$_SESSION['notification'] = 'Utilisateur créé avec succès.';
header('Location: index.php');

View file

@ -7,8 +7,10 @@ body {
margin: 0;
}
/* HEADER */
header { background: #fff; border-bottom: 1px solid #d9d2c0; }
header {
background: #fff;
border-bottom: 1px solid #d9d2c0;
}
.header-top {
max-width: 1000px;
@ -25,10 +27,14 @@ header { background: #fff; border-bottom: 1px solid #d9d2c0; }
font-size: 1.2rem;
}
.header-top img { height: 45px; }
.header-top img {
height: 45px;
}
/* NAVIGATION */
nav { background: #f8f6f0; border-bottom: 2px solid #c49a3c; }
nav {
background: #f8f6f0;
border-bottom: 2px solid #c49a3c;
}
nav ul {
max-width: 1000px;
@ -45,10 +51,14 @@ nav a {
text-decoration: none;
}
nav a:hover { color: #c49a3c; }
nav a.nav-right { margin-left: auto; }
nav a:hover {
color: #c49a3c;
}
nav a.nav-right {
margin-left: auto;
}
/* BARRE SESSION */
.session-bar {
max-width: 1000px;
margin: 0 auto;
@ -58,7 +68,6 @@ nav a.nav-right { margin-left: auto; }
color: #8b7a5c;
}
/* NOTIFICATION */
#notification {
max-width: 1000px;
margin: 10px auto 0 auto;
@ -68,7 +77,6 @@ nav a.nav-right { margin-left: auto; }
border-left: 4px solid #6a9f6a;
}
/* CONTENU */
article {
max-width: 1100px;
margin: 20px auto;
@ -78,9 +86,11 @@ article {
border: 1px solid #e0dbce;
}
article h2 { color: #3b4a2e; margin-top: 0; }
article h2 {
color: #3b4a2e;
margin-top: 0;
}
/* SOUS-NAVIGATION */
.sub-nav {
margin-bottom: 15px;
padding-bottom: 10px;
@ -94,14 +104,29 @@ article h2 { color: #3b4a2e; margin-top: 0; }
text-decoration: none;
}
.sub-nav a:hover { text-decoration: underline; }
.sub-nav a:hover {
text-decoration: underline;
}
/* TABLEAUX */
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
table th { background: #f8f6f0; color: #3b4a2e; padding: 10px; text-align: left; border-bottom: 2px solid #c49a3c; }
table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
table {
width: 100%;
border-collapse: collapse;
margin: 10px 0;
}
table th {
background: #f8f6f0;
color: #3b4a2e;
padding: 10px;
text-align: left;
border-bottom: 2px solid #c49a3c;
}
table td {
padding: 8px 10px;
border-bottom: 1px solid #e8e2d2;
}
/* PLANNING */
.planning-nav {
margin-bottom: 15px;
display: flex;
@ -114,21 +139,24 @@ table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
text-decoration: none;
}
.planning-nav a:hover { text-decoration: underline; }
.planning-nav a:hover {
text-decoration: underline;
}
.planning-tableau {
overflow-x: auto;
margin-bottom: 20px;
}
.planning-tableau table { margin: 0; }
.planning-tableau table {
margin: 0;
}
.planning-tableau th {
font-size: 0.7rem;
padding: 5px 3px;
text-align: center;
min-width: 35px;
writing-mode: horizontal-tb;
}
.planning-tableau td {
@ -149,11 +177,10 @@ table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
border-right: 2px solid #c49a3c;
}
.sauveteur-nom small { color: #8b7a5c; font-size: 0.7rem; }
.cell-actif { opacity: 0.85; }
.cell-prepa { opacity: 0.4; }
.sauveteur-nom small {
color: #8b7a5c;
font-size: 0.7rem;
}
.planning-legende {
margin-top: 15px;
@ -161,9 +188,16 @@ table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
border-top: 1px solid #e8e2d2;
}
.planning-legende h3 { font-size: 0.9rem; margin-bottom: 8px; }
.planning-legende h3 {
font-size: 0.9rem;
margin-bottom: 8px;
}
.legende-item { display: inline-block; margin-right: 15px; font-size: 0.8rem; }
.legende-item {
display: inline-block;
margin-right: 15px;
font-size: 0.8rem;
}
.legende-couleur {
display: inline-block;
@ -174,28 +208,33 @@ table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
vertical-align: middle;
}
/* Couleurs des statuts (classes CSS) */
.vert { background-color: #2ecc71; }
.violet { background-color: #9b59b6; }
.marron { background-color: #8B4513; }
.jaune { background-color: #f1c40f; }
.orange { background-color: #f39c12; }
.bleu { background-color: #3498db; }
.rouge { background-color: #e74c3c; }
form label {
display: inline-block;
min-width: 140px;
}
/* FORMULAIRES */
form label { display: inline-block; min-width: 140px; }
form input[type="text"],
form input[type="password"],
form input[type="date"],
form select { padding: 5px 10px; border: 1px solid #d0cbb8; border-radius: 4px; }
form input[type="submit"] {
background: #c49a3c; color: #fff; border: none;
padding: 8px 25px; border-radius: 4px; cursor: pointer;
form select {
padding: 5px 10px;
border: 1px solid #d0cbb8;
border-radius: 4px;
}
form input[type="submit"] {
background: #c49a3c;
color: #fff;
border: none;
padding: 8px 25px;
border-radius: 4px;
cursor: pointer;
}
form input[type="submit"]:hover {
background: #b38a2e;
}
form input[type="submit"]:hover { background: #b38a2e; }
/* FOOTER */
footer {
background: #f8f6f0;
border-top: 2px solid #c49a3c;
@ -205,9 +244,17 @@ footer {
font-size: 0.8rem;
}
/* RESPONSIVE */
@media (max-width: 700px) {
nav ul { flex-wrap: wrap; justify-content: center; }
nav a { padding: 8px 15px; font-size: 0.9rem; }
article { margin: 10px 5px; padding: 15px; }
nav ul {
flex-wrap: wrap;
justify-content: center;
}
nav a {
padding: 8px 15px;
font-size: 0.9rem;
}
article {
margin: 10px 5px;
padding: 15px;
}
}

134
index.php
View file

@ -1,92 +1,78 @@
<?php
/**
* The front controller
* Vincent Verdon - 20240604
*/
require('controllers/auth_utilities.php');
session_start();
//Loads some functions for session managment and starts the session
require('controllers/auth_utilities.php');
session_start();
//var_dump($_SESSION);
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
ini_set('display_errors', 1);
//The requested route
$route = null;
if (isset($_GET['route'])) {
$route = 'invalid';
if (preg_match('#^[a-zA-Z0-9 _]*$#', $_GET['route'])) {
$route = $_GET['route'];
}
$route = null;
if (isset($_GET['route'])) {
$route = 'invalid';
if (preg_match('#^[a-zA-Z0-9 _]*$#', $_GET['route'])) {
$route = $_GET['route'];
}
}
//We switch to the good controller
switch ($route) {
switch ($route) {
case null:
case '':
require('controllers/auth_ctrl2.php');
login_ctrl();
break;
case null:
require('controllers/auth_ctrl2.php');
login_ctrl();
break;
case 'auth':
require('controllers/auth_ctrl2.php');
login_ctrl();
break;
case '':
require('controllers/auth_ctrl2.php');
login_ctrl();
break;
case 'logout':
require('controllers/auth_ctrl2.php');
logout_ctrl();
break;
case 'planning':
require('controllers/lecture_page_ctrl.php');
planning_afficher_ctrl();
break;
case 'planning':
require('controllers/lecture_page_ctrl.php');
planning_afficher_ctrl();
break;
case 'auth':
require('controllers/auth_ctrl2.php');
login_ctrl();
break;
case 'add_utilisateurs_form':
require('controllers/utilisateur_ctrl.php');
add_utilisateurs_form_ctrl();
break;
case 'logout':
require('controllers/auth_ctrl2.php');
logout_ctrl();
break;
case 'add_utilisateurs':
require('controllers/utilisateur_ctrl.php');
add_utilisateurs_write_ctrl();
break;
case 'add_utilisateurs_form':
require('controllers/utilisateur_ctrl.php');
add_utilisateurs_form_ctrl();
break;
case 'modif_utilisateurs_form':
require('controllers/modif_compte_ctrl.php');
modif_utilisateurs_form_ctrl();
break;
case 'add_utilisateurs':
require('controllers/utilisateur_ctrl.php');
add_utilisateurs_write_ctrl();
break;
case 'modif_utilisateurs':
require('controllers/modif_compte_ctrl.php');
modif_utilisateurs_write_ctrl();
break;
case 'modif_utilisateurs_form':
require('controllers/modif_compte_ctrl.php');
modif_utilisateurs_form_ctrl();
break;
case 'ajout_personnes':
require('controllers/contact_crtl.php');
contact_ctrl();
break;
case 'modif_utilisateurs':
require('controllers/modif_compte_ctrl.php');
modif_utilisateurs_write_ctrl();
break;
case 'operations':
require('controllers/operation_ctrl.php');
operations_form_ctrl();
break;
case 'ajout_personnes':
require('controllers/contact_crtl.php');
contact_ctrl();
break;
case 'add_operation':
require('controllers/operation_ctrl.php');
add_operation_write_ctrl();
break;
case 'operations':
require('controllers/operation_ctrl.php');
operations_form_ctrl();
break;
case 'add_operation':
require('controllers/operation_ctrl.php');
add_operation_write_ctrl();
break;
default:
require('views/404_view.php');
break;
}
default:
require('views/404_view.php');
break;
}

View file

@ -1,14 +1,11 @@
<?php
/**
* Create a PDO connection
* Crée une connexion PDO
* @return PDO
*/
function connection() {
//Loads config from file config.php
function connection(): PDO
{
require_once('config/config.php');
//Db connection
$connex = new PDO('mysql:host=' . HOST . ';dbname=' . DB,USER , PASSWORD);
return $connex;
return new PDO('mysql:host=' . HOST . ';dbname=' . DB, USER, PASSWORD);
}

View file

@ -1,9 +1,12 @@
<?php
function create_sauveteur(PDO $c, string $nom, string $prenom, string $dep, string $spe, string $date_heure, string $tel): void {
/**
* Ajoute un sauveteur dans la base
*/
function create_sauveteur(PDO $c, string $nom, string $prenom, string $dep, string $spe, string $date_heure, string $tel): void
{
$req = "INSERT INTO Sauveteur (nom, prenom, departement, specialite, DateHeureEngagement, NumTel)
VALUES (:nom, :prenom, :dep, :spe, :date_heure, :tel)";
$prep = $c->prepare($req);
$prep->bindValue(':nom', $nom);
$prep->bindValue(':prenom', $prenom);

View file

@ -1,19 +1,26 @@
<?php
/**
* Liste des statuts (utilisé pour les select)
*/
function get_statuts(PDO $pdo): array
{
$sql = "SELECT ID, TypeStatut FROM Statut ORDER BY TypeStatut";
return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Liste des sauveteurs
*/
function get_sauveteurs(PDO $pdo): array
{
$sql = "SELECT ID, nom, prenom, specialite
FROM Sauveteur
ORDER BY nom, prenom";
$sql = "SELECT ID, nom, prenom, specialite FROM Sauveteur ORDER BY nom, prenom";
return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Missions d'une journée avec leur statut
*/
function get_missions_planning(PDO $pdo, string $date): array
{
$sql = "SELECT m.ID_Sauveteur, m.DateHeureDebut, m.DateHeureFin, m.EnPrepa, s.TypeStatut

View file

@ -1,7 +1,10 @@
<?php
// Récupère tous les comptes utilisateurs
function get_all_comptes(PDO $c): array {
/**
* Récupère tous les comptes utilisateurs
*/
function get_all_comptes(PDO $c): array
{
$req = "SELECT ID, login, type, nom, prenom, nomdep, num_tel FROM Utilisateur ORDER BY nom, prenom";
$res = $c->query($req);
$comptes = $res->fetchAll(PDO::FETCH_ASSOC);
@ -9,8 +12,11 @@ function get_all_comptes(PDO $c): array {
return $comptes;
}
// Récupère un compte par son ID
function get_compte_by_id(PDO $c, int $id): ?array {
/**
* Récupère un compte par son ID
*/
function get_compte_by_id(PDO $c, int $id): ?array
{
$req = "SELECT ID, login, type, nom, prenom, nomdep, num_tel FROM Utilisateur WHERE ID = :id";
$prep = $c->prepare($req);
$prep->bindValue(':id', $id, PDO::PARAM_INT);
@ -20,8 +26,11 @@ function get_compte_by_id(PDO $c, int $id): ?array {
return $compte ?: null;
}
// Met à jour un compte utilisateur
function update_compte(PDO $c, int $id, string $nom, string $prenom, string $role, string $nomdep, string $num_tel, string $login, string $passwd): void {
/**
* Met à jour un compte (mot de passe optionnel)
*/
function update_compte(PDO $c, int $id, string $nom, string $prenom, string $role, string $nomdep, string $num_tel, string $login, string $passwd): void
{
$req = "UPDATE Utilisateur SET nom = :nom, prenom = :prenom, type = :role, nomdep = :dep, num_tel = :tel, login = :login WHERE ID = :id";
$prep = $c->prepare($req);
$prep->bindValue(':nom', $nom);

View file

@ -1,13 +1,13 @@
<?php
function create_operation_crud(PDO $connex, string $date_debut, string $date_fin, string $lieu, int $en_prepa, int $id_sauveteur, int $id_statut, int $id_utilisateur): bool {
// On insère les données dans la table Mission avec le champ Lieu ajouté
/**
* Insère une nouvelle mission
*/
function create_operation_crud(PDO $connex, string $date_debut, string $date_fin, string $lieu, int $en_prepa, int $id_sauveteur, int $id_statut, int $id_utilisateur): bool
{
$req = "INSERT INTO Mission (DateHeureDebut, DateHeureFin, EnPrepa, ID_Sauveteur, ID_statut, ID_Utilisateur, Lieu)
VALUES (:date_debut, :date_fin, :en_prepa, :id_sauveteur, :id_statut, :id_utilisateur, :lieu)";
$prep = $connex->prepare($req);
$prep->bindValue(':date_debut', $date_debut);
$prep->bindValue(':date_fin', $date_fin);
$prep->bindValue(':lieu', $lieu);
@ -15,10 +15,7 @@ function create_operation_crud(PDO $connex, string $date_debut, string $date_fin
$prep->bindValue(':id_sauveteur', $id_sauveteur, PDO::PARAM_INT);
$prep->bindValue(':id_statut', $id_statut, PDO::PARAM_INT);
$prep->bindValue(':id_utilisateur', $id_utilisateur, PDO::PARAM_INT);
$resultat = $prep->execute();
$prep->closeCursor();
return $resultat;
}
?>

View file

@ -1,16 +1,16 @@
<?php
function recuperation_auth(PDO $connex, string $login):?array {
require_once('config/config.php');
/**
* Récupère les infos d'authentification d'un utilisateur
*/
function recuperation_auth(PDO $connex, string $login): ?array
{
require_once('config/config.php');
$req = "SELECT ID, login, passwd, type FROM Utilisateur WHERE login = :login";
$prep = $connex->prepare($req);
$prep->bindValue(':login', $login);
$prep->execute();
$auth = $prep->fetch(PDO::FETCH_ASSOC);
$prep->closeCursor();
return $auth ?: null;
}
}

View file

@ -1,8 +1,12 @@
<?php
// Crée un nouvel utilisateur (tous les champs dans Utilisateur)
function create_utilisateur_crud(PDO $c, string $nom, string $prenom, string $role, string $nomdep, string $num_tel, string $login, string $mdp_hache): void {
$req = "INSERT INTO Utilisateur (login, passwd, type, nom, prenom, nomdep, num_tel) VALUES (:login, :passwd, :type, :nom, :prenom, :nomdep, :num_tel)";
/**
* Crée un nouveau compte utilisateur
*/
function create_utilisateur_crud(PDO $c, string $nom, string $prenom, string $role, string $nomdep, string $num_tel, string $login, string $mdp_hache): void
{
$req = "INSERT INTO Utilisateur (login, passwd, type, nom, prenom, nomdep, num_tel)
VALUES (:login, :passwd, :type, :nom, :prenom, :nomdep, :num_tel)";
$prep = $c->prepare($req);
$prep->bindValue(':login', $login);
$prep->bindValue(':passwd', $mdp_hache);

View file

@ -1,8 +1,5 @@
<?php
header('Status: 404 Not Found', true, 404);
require('views/header.php');
echo '<h2>Page introuvable !</h2>';
echo '<h2>Page introuvable</h2>';
require('views/footer.php');

View file

@ -5,18 +5,13 @@
<a href="index.php?route=modif_utilisateurs_form">Modifier un compte</a>
</nav>
<h2>Ajout d'un nouveau compte</h2>
<h2>Créer un compte</h2>
<form action="index.php?route=add_utilisateurs" method="post">
<p><label>Nom :</label> <input type="text" name="nom" required></p>
<p><label>Prénom :</label> <input type="text" name="prenom" required></p>
<p>
Nom : <input type="text" name="nom" required>
</p>
<p>
Prénom : <input type="text" name="prenom" required>
</p>
<p>
<label for="role">Choix du rôle :</label>
<label for="role">Rôle :</label>
<select name="role" id="role" required>
<option value="">-- Sélectionnez un profil --</option>
<option value="gestionnaire">Gestionnaire</option>
@ -24,28 +19,11 @@
<option value="administration">Administration</option>
</select>
</p>
<p>
NOM DEP : <input type="text" name="nomdep" required>
</p>
<p>
n°tel : <input type="text" name="num_tel" required>
</p>
<p>
<label for="login">Login :</label>
<input type="text" id="login" name="login" required>
</p>
<p>
<label for="mdp">Mot de passe :</label>
<input type="password" id="mdp" name="mdp" required>
</p>
<p>
<input type="submit" value="Enregistrer">
</p>
<p><label>Département :</label> <input type="text" name="nomdep" required></p>
<p><label>Téléphone :</label> <input type="text" name="num_tel" required></p>
<p><label for="login">Login :</label> <input type="text" id="login" name="login" required></p>
<p><label for="mdp">Mot de passe :</label> <input type="password" id="mdp" name="mdp" required></p>
<p><input type="submit" value="Enregistrer"></p>
</form>
<?php require('views/footer.php'); ?>

View file

@ -1,7 +1,6 @@
<?php
require_once('controllers/auth_utilities.php');
// --- NAVIGATION selon le rôle ---
$nav = '';
if (is_logged()) {
@ -18,14 +17,12 @@ if (is_logged()) {
$nav .= '<li><a href="index.php?route=logout" class="nav-right">Déconnexion</a></li>';
}
// --- BARRE DE SESSION ---
if (is_logged()) {
$session = 'Connecté : ' . htmlentities($_SESSION['login']) . ' (' . htmlentities($_SESSION['role']) . ')';
} else {
$session = 'Non connecté';
}
// --- NOTIFICATION ---
$notif = '';
if (!empty($_SESSION['notification'])) {
$notif = '<div id="notification">' . htmlentities($_SESSION['notification']) . '</div>';

View file

@ -1,11 +1,14 @@
<?php
/**
* Affichage du planning avec le tableau des créneaux
*/
function planning_view(array $sauveteurs, array $creneaux, array $missions_par_sauveteur, string $date)
{
$date_formatee = date('d/m/Y', strtotime($date));
require('views/header.php');
// Correspondance TypeStatut (base) → couleur HTML
// Couleurs associées à chaque statut
$couleurs = [
'Sauveteur disponible' => '#2ecc71',
'Sauveteur en approche de la cavite' => '#9b59b6',
@ -40,34 +43,33 @@ function planning_view(array $sauveteurs, array $creneaux, array $missions_par_s
<?php foreach ($creneaux as $creneau): ?>
<?php
// Chercher si ce sauveteur a une mission sur ce créneau
$statut = null;
$statut = null;
$en_prepa = false;
$debut_creneau = new DateTime($date . ' ' . $creneau . ':00');
$fin_creneau = clone $debut_creneau;
$fin_creneau = clone $debut_creneau;
$fin_creneau->modify('+30 minutes');
// On cherche si une mission couvre ce créneau
$liste_missions = $missions_par_sauveteur[$sauveteur['ID']] ?? [];
foreach ($liste_missions as $mission) {
$debut_mission = new DateTime($mission['DateHeureDebut']);
$fin_mission = new DateTime($mission['DateHeureFin']);
$fin_mission = new DateTime($mission['DateHeureFin']);
if ($debut_mission < $fin_creneau && $fin_mission > $debut_creneau) {
$statut = $mission['TypeStatut'];
$statut = $mission['TypeStatut'];
$en_prepa = (bool) $mission['EnPrepa'];
break;
}
}
// Affichage de la cellule
if ($statut === null) {
$style = '';
$titre = '';
$texte = '';
} else {
$couleur = $couleurs[$statut] ?? '#ccc';
$titre = htmlspecialchars($statut);
$titre = htmlspecialchars($statut);
if ($en_prepa) {
$style = 'background:' . $couleur . '; opacity:0.4;';
$titre .= ' (préparation)';
@ -88,9 +90,8 @@ function planning_view(array $sauveteurs, array $creneaux, array $missions_par_s
<div class="planning-legende">
<h3>Légende</h3>
<span class="legende-item">
<span class="legende-couleur" style="background:#2ecc71;"></span> Sauveteur disponible
<span class="legende-couleur" style="background:#2ecc71;"></span> Disponible
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#9b59b6;"></span> En approche de la cavité
@ -108,7 +109,7 @@ function planning_view(array $sauveteurs, array $creneaux, array $missions_par_s
<span class="legende-couleur" style="background:#3498db;"></span> En repos
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#e74c3c;"></span> En brancardage civière
<span class="legende-couleur" style="background:#e74c3c;"></span> Brancardage civière
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#ccc; opacity:0.4;"></span>

View file

@ -1,15 +1,17 @@
<?php
function login_form_view(?string $route) {
/**
* Formulaire de connexion
*/
function login_form_view(?string $route)
{
require('views/header.php');
echo '<h2>Page d\'authentification</h2>';
echo '<p>Merci de vous authentifier pour accéder à cette fonctionnalité.</p>';
echo '<h2>Connexion</h2>';
echo '<p>Merci de vous authentifier pour accéder à l\'application.</p>';
echo '<form action="index.php?route=auth&ask=' . $route . '" method="post">';
echo '<p><label>Login :</label> <input type="text" name="login"></p>';
echo '<p><label>Mot de passe :</label> <input type="password" name="password"></p>';
echo '<p><input type="submit" value="Valider"></p>';
echo '<p><input type="submit" value="Se connecter"></p>';
echo '</form>';
require('views/footer.php');
}

View file

@ -1,6 +1,10 @@
<?php
function modif_compte_view(array $comptes, ?array $compte_select) {
/**
* Page de modification d'un compte existant
*/
function modif_compte_view(array $comptes, ?array $compte_select)
{
require('views/header.php');
?>
@ -9,12 +13,10 @@ function modif_compte_view(array $comptes, ?array $compte_select) {
<a href="index.php?route=modif_utilisateurs_form">Modifier un compte</a>
</nav>
<h2>Modifier un compte existant</h2>
<h2>Modifier un compte</h2>
<table>
<tr>
<!-- COLONNE GAUCHE : liste des comptes -->
<td style="width: 40%; vertical-align: top;">
<h3>Liste des comptes</h3>
<ul>
@ -31,55 +33,37 @@ function modif_compte_view(array $comptes, ?array $compte_select) {
</ul>
</td>
<!-- COLONNE DROITE : formulaire de modification -->
<td style="vertical-align: top;">
<h3>Modifier les informations</h3>
<h3>Informations</h3>
<?php if ($compte_select !== null): ?>
<form action="index.php?route=modif_utilisateurs" method="post">
<input type="hidden" name="id" value="<?= $compte_select['ID'] ?>">
<p>
<label>Nom :</label>
<input type="text" name="nom" size="40" value="<?= htmlentities($compte_select['nom']) ?>">
</p>
<p>
<label>Prénom :</label>
<input type="text" name="prenom" size="40" value="<?= htmlentities($compte_select['prenom']) ?>">
</p>
<p>
<label>Rôle :</label>
<p><label>Nom :</label>
<input type="text" name="nom" size="40" value="<?= htmlentities($compte_select['nom']) ?>"></p>
<p><label>Prénom :</label>
<input type="text" name="prenom" size="40" value="<?= htmlentities($compte_select['prenom']) ?>"></p>
<p><label>Rôle :</label>
<select name="role">
<option value="gestionnaire" <?= $compte_select['type'] === 'gestionnaire' ? 'selected' : '' ?>>Gestionnaire</option>
<option value="lecture" <?= $compte_select['type'] === 'lecture' ? 'selected' : '' ?>>Lecture</option>
<option value="administration" <?= $compte_select['type'] === 'administration' ? 'selected' : '' ?>>Administration</option>
</select>
</p>
<p>
<label>Département :</label>
<input type="text" name="nomdep" size="10" value="<?= htmlentities($compte_select['nomdep']) ?>">
</p>
<p>
<label> téléphone :</label>
<input type="text" name="num_tel" size="20" value="<?= htmlentities($compte_select['num_tel']) ?>">
</p>
<p>
<label>Login :</label>
<input type="text" name="login" size="40" value="<?= htmlentities($compte_select['login']) ?>">
</p>
<p>
<label>Nouveau mot de passe :</label>
<input type="password" name="passwd" size="40" placeholder="Laisser vide pour ne pas modifier">
</p>
<p>
<input type="submit" value="Enregistrer les modifications">
</p>
</select></p>
<p><label>Département :</label>
<input type="text" name="nomdep" size="10" value="<?= htmlentities($compte_select['nomdep']) ?>"></p>
<p><label> téléphone :</label>
<input type="text" name="num_tel" size="20" value="<?= htmlentities($compte_select['num_tel']) ?>"></p>
<p><label>Login :</label>
<input type="text" name="login" size="40" value="<?= htmlentities($compte_select['login']) ?>"></p>
<p><label>Nouveau mot de passe :</label>
<input type="password" name="passwd" size="40" placeholder="Laisser vide pour ne pas modifier"></p>
<p><input type="submit" value="Enregistrer les modifications"></p>
</form>
<?php else: ?>
<p>Cliquez sur un compte dans la liste pour le modifier.</p>
<?php endif; ?>
</td>
</tr>
</table>

View file

@ -1,8 +0,0 @@
<?php
require('views/header.php');
?>
<h2>Bienvenue sur l'application de gestion</h2>
<p>Ceci est le contenu central de ma page d'accueil.</p>
<?php
require('views/footer.php');
?>