modification planning

This commit is contained in:
ryana 2026-06-10 16:40:50 +02:00
parent 58e028a0eb
commit 5c630a9f2e
6 changed files with 141 additions and 131 deletions

View file

@ -1,92 +1,39 @@
<?php
function planning_afficher_ctrl() {
function planning_afficher_ctrl()
{
require('models/connection.php');
require('models/lecture_page_model.php');
$c = connection();
$pdo = connection();
// Date : aujourd'hui par défaut, modifiable via ?date=YYYY-MM-DD
$date = $_GET['date'] ?? date('Y-m-d');
$date_precedente = date('Y-m-d', strtotime($date . ' -1 day'));
$date_suivante = date('Y-m-d', strtotime($date . ' +1 day'));
// Date du planning
if (isset($_GET['date'])) {
$date = $_GET['date'];
} else {
$date = date('Y-m-d');
}
// Tous les sauveteurs et leurs missions du jour
$sauveteurs = get_all_sauveteurs($c);
$missions = get_missions_by_date($c, $date);
// Données depuis la base
$sauveteurs = get_sauveteurs($pdo);
$missions = get_missions_planning($pdo, $date);
// Couleurs par spécialité (numéro → couleur)
$couleurs = [
1 => '#e74c3c', // Évacuation
2 => '#3498db', // ASV
3 => '#f39c12', // Transmission
4 => '#9b59b6', // Conseiller technique
5 => '#2ecc71', // Gestion
6 => '#8B4513', // Désobstruction
7 => '#e91e63', // Médical
8 => '#00bcd4', // Ventilation
9 => '#95a5a6', // Pas de spécialité
];
// Créneaux 8h-20h (toutes les 30 min)
// Créneaux horaires : 0h à 24h toutes les 30 minutes
$creneaux = [];
for ($min = 8 * 60; $min < 20 * 60; $min += 30) {
$creneaux[] = sprintf('%02d:%02d', intdiv($min, 60), $min % 60);
for ($minutes = 0; $minutes < 1440; $minutes = $minutes + 30) {
$heures = intdiv($minutes, 60);
$mins = $minutes % 60;
$creneaux[] = sprintf('%02d:%02d', $heures, $mins);
}
// Index des sauveteurs + couleur par spécialité
$sauveteurs_index = [];
foreach ($sauveteurs as $s) {
$spe_num = (int) ($s['specialite'] ?? 0);
$s['couleur'] = $couleurs[$spe_num] ?? '#cccccc';
$sauveteurs_index[$s['ID']] = $s;
// Regrouper les missions par sauveteur
$missions_par_sauveteur = [];
foreach ($missions as $mission) {
$id_sauv = $mission['ID_Sauveteur'];
$missions_par_sauveteur[$id_sauv][] = $mission;
}
// Grille : sauveteur_id → créneau → [couleur, en_prepa]
$grille = [];
foreach ($sauveteurs as $s) {
$grille[$s['ID']] = [];
foreach ($creneaux as $c) {
$grille[$s['ID']][$c] = null;
}
}
// Remplissage de la grille avec les missions
foreach ($missions as $m) {
$id_sauv = $m['ID_Sauveteur'];
if (!isset($grille[$id_sauv])) continue;
$debut = new DateTime($m['DateHeureDebut']);
$fin = new DateTime($m['DateHeureFin']);
$en_prepa = (bool) $m['EnPrepa'];
foreach ($creneaux as $c) {
$debut_creneau = new DateTime($date . ' ' . $c . ':00');
$fin_creneau = (clone $debut_creneau)->modify('+30 minutes');
if ($debut < $fin_creneau && $fin > $debut_creneau) {
$grille[$id_sauv][$c] = [
'couleur' => $sauveteurs_index[$id_sauv]['couleur'],
'en_prepa' => $en_prepa,
'mission_id' => $m['ID'],
];
}
}
}
// Légende des spécialités
$legendes = [
1 => 'Évacuation',
2 => 'ASV',
3 => 'Transmission',
4 => 'Conseiller technique',
5 => 'Gestion',
6 => 'Désobstruction',
7 => 'Médical',
8 => 'Ventilation',
9 => 'Pas de spécialité',
];
// Affichage
require('views/lecture_page.php');
planning_view($sauveteurs, $sauveteurs_index, $creneaux, $grille, $date, $date_precedente, $date_suivante, $couleurs, $legendes);
planning_view($sauveteurs, $creneaux, $missions_par_sauveteur, $date);
}

View file

@ -174,6 +174,15 @@ 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; }
/* FORMULAIRES */
form label { display: inline-block; min-width: 140px; }
form input[type="text"],

View file

@ -1,21 +1,22 @@
<?php
// Récupère tous les sauveteurs
function get_all_sauveteurs(PDO $c): array {
$req = "SELECT ID, nom, prenom, specialite FROM Sauveteur ORDER BY nom, prenom";
return $c->query($req)->fetchAll(PDO::FETCH_ASSOC);
function get_sauveteurs(PDO $pdo): array
{
$sql = "SELECT ID, nom, prenom, specialite
FROM Sauveteur
ORDER BY nom, prenom";
return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
// Récupère les missions d'une date donnée
function get_missions_by_date(PDO $c, string $date): array {
$req = "SELECT ID, DateHeureDebut, DateHeureFin, ID_Sauveteur, EnPrepa
FROM Mission
WHERE DATE(DateHeureDebut) = :date
OR DATE(DateHeureFin) = :date
ORDER BY DateHeureDebut";
$stmt = $c->prepare($req);
$stmt->bindValue(':date', $date);
$stmt->execute();
function get_missions_planning(PDO $pdo, string $date): array
{
$sql = "SELECT m.ID_Sauveteur, m.DateHeureDebut, m.DateHeureFin, m.EnPrepa, s.TypeStatut
FROM Mission m
JOIN Statut s ON m.ID_statut = s.ID
WHERE DATE(m.DateHeureDebut) = :date
OR DATE(m.DateHeureFin) = :date
ORDER BY m.ID_Sauveteur, m.DateHeureDebut";
$stmt = $pdo->prepare($sql);
$stmt->execute([':date' => $date]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

View file

@ -1,8 +1,8 @@
</article>
<footer>
<span>Spéléo-Secours Français Application de gestion des sauveteurs</span>
<span>&copy; 2025 Tous droits réservés</span>
<span>Spéléo-Secours Français - Application de gestion des sauveteurs</span>
<span>&copy; 2025 - Tous droits réservés</span>
</footer>
</body>

View file

@ -38,7 +38,7 @@ $notif = '';
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSF Gestion des sauveteurs</title>
<title>SSF - Gestion des sauveteurs</title>
<link rel="stylesheet" type="text/css" href="css/global.css">
</head>
@ -47,7 +47,7 @@ $notif = '';
<div class="header-top">
<a href="index.php">
<img src="images/logo_ssf.png" alt="Logo SSF">
<span>Spéléo-Secours Français Gestion des sauveteurs</span>
<span>Spéléo-Secours Français - Gestion des sauveteurs</span>
</a>
</div>

View file

@ -1,47 +1,84 @@
<?php
function planning_view(array $sauveteurs, array $sauveteurs_index, array $creneaux, array $grille, string $date, string $date_prec, string $date_suiv, array $couleurs, array $legendes) {
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 = [
'Sauveteur disponible' => '#2ecc71',
'Sauveteur en approche de la cavite' => '#9b59b6',
'Sauveteur sous terre' => '#8B4513',
'Sauveteur equipe de gestion' => '#f1c40f',
'Sauveteur en mission a l\'exterieur' => '#f39c12',
'Sauveteur en repos' => '#3498db',
'Sauveteur en brancardage civiere' => '#e74c3c',
];
?>
<h2>Planning du <?= date('d/m/Y', strtotime($date)) ?></h2>
<h2>Planning du <?= $date_formatee ?></h2>
<!-- Navigation des dates -->
<nav class="planning-nav">
<a href="index.php?date=<?= $date_prec ?>">&larr; Jour précédent</a>
<strong><?= date('d/m/Y', strtotime($date)) ?></strong>
<a href="index.php?date=<?= $date_suiv ?>">Jour suivant &rarr;</a>
</nav>
<!-- Tableau du planning -->
<div class="planning-tableau">
<table>
<thead>
<tr>
<th>Sauveteur</th>
<?php foreach ($creneaux as $c): ?>
<th><?= substr($c, 0, 5) ?></th>
<?php foreach ($creneaux as $creneau): ?>
<th><?= $creneau ?></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($sauveteurs as $s): ?>
<?php foreach ($sauveteurs as $sauveteur): ?>
<tr>
<td class="sauveteur-nom">
<?= htmlentities($s['nom'] . ' ' . $s['prenom']) ?>
<br><small><?= $legendes[(int) $s['specialite']] ?? 'Inconnu' ?></small>
<?= htmlentities($sauveteur['nom'] . ' ' . $sauveteur['prenom']) ?>
<br><small><?= htmlentities($sauveteur['specialite']) ?></small>
</td>
<?php foreach ($creneaux as $c):
$cell = $grille[$s['ID']][$c] ?? null;
$bg = $cell ? $cell['couleur'] : '';
$class = '';
if ($cell) {
$class = $cell['en_prepa'] ? 'cell-prepa' : 'cell-actif';
<?php foreach ($creneaux as $creneau): ?>
<?php
// Chercher si ce sauveteur a une mission sur ce créneau
$statut = null;
$en_prepa = false;
$debut_creneau = new DateTime($date . ' ' . $creneau . ':00');
$fin_creneau = clone $debut_creneau;
$fin_creneau->modify('+30 minutes');
$liste_missions = $missions_par_sauveteur[$sauveteur['ID']] ?? [];
foreach ($liste_missions as $mission) {
$debut_mission = new DateTime($mission['DateHeureDebut']);
$fin_mission = new DateTime($mission['DateHeureFin']);
if ($debut_mission < $fin_creneau && $fin_mission > $debut_creneau) {
$statut = $mission['TypeStatut'];
$en_prepa = (bool) $mission['EnPrepa'];
break;
}
}
?>
<td class="<?= $class ?>" style="<?= $bg ? 'background:' . $bg : '' ?>">
<?= $cell && $cell['en_prepa'] ? 'P' : '' ?>
</td>
// Affichage de la cellule
if ($statut === null) {
$style = '';
$titre = '';
$texte = '';
} else {
$couleur = $couleurs[$statut] ?? '#ccc';
$titre = htmlspecialchars($statut);
if ($en_prepa) {
$style = 'background:' . $couleur . '; opacity:0.4;';
$titre .= ' (préparation)';
$texte = 'P';
} else {
$style = 'background:' . $couleur . '; opacity:0.85;';
$texte = '';
}
}
?>
<td style="<?= $style ?>" title="<?= $titre ?>"><?= $texte ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
@ -49,20 +86,36 @@ function planning_view(array $sauveteurs, array $sauveteurs_index, array $crenea
</table>
</div>
<!-- Légende -->
<div class="planning-legende">
<h3>Légende : Spécialités</h3>
<?php foreach ($legendes as $num => $nom): ?>
<span class="legende-item">
<span class="legende-couleur" style="background:<?= $couleurs[$num] ?>"></span>
<?= $nom ?>
</span>
<?php endforeach; ?>
<h3>Légende</h3>
<span class="legende-item">
<span class="legende-couleur" style="background:#ccc; opacity:0.5;"></span>
<span class="legende-couleur" style="background:#2ecc71;"></span> Sauveteur disponible
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#9b59b6;"></span> En approche de la cavité
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#8B4513;"></span> Sous terre
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#f1c40f;"></span> Équipe de gestion
</span>
<span class="legende-item">
<span class="legende-couleur" style="background:#f39c12;"></span> En mission à l'extérieur
</span>
<span class="legende-item">
<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>
<span class="legende-item">
<span class="legende-couleur" style="background:#ccc; opacity:0.4;"></span>
En préparation (P)
</span>
</div>
<?php require('views/footer.php');
<?php
require('views/footer.php');
}