modification planning
This commit is contained in:
parent
58e028a0eb
commit
5c630a9f2e
6 changed files with 141 additions and 131 deletions
|
|
@ -1,92 +1,39 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
function planning_afficher_ctrl() {
|
function planning_afficher_ctrl()
|
||||||
|
{
|
||||||
require('models/connection.php');
|
require('models/connection.php');
|
||||||
require('models/lecture_page_model.php');
|
require('models/lecture_page_model.php');
|
||||||
|
|
||||||
$c = connection();
|
$pdo = connection();
|
||||||
|
|
||||||
// Date : aujourd'hui par défaut, modifiable via ?date=YYYY-MM-DD
|
// Date du planning
|
||||||
$date = $_GET['date'] ?? date('Y-m-d');
|
if (isset($_GET['date'])) {
|
||||||
$date_precedente = date('Y-m-d', strtotime($date . ' -1 day'));
|
$date = $_GET['date'];
|
||||||
$date_suivante = date('Y-m-d', strtotime($date . ' +1 day'));
|
} else {
|
||||||
|
$date = date('Y-m-d');
|
||||||
|
}
|
||||||
|
|
||||||
// Tous les sauveteurs et leurs missions du jour
|
// Données depuis la base
|
||||||
$sauveteurs = get_all_sauveteurs($c);
|
$sauveteurs = get_sauveteurs($pdo);
|
||||||
$missions = get_missions_by_date($c, $date);
|
$missions = get_missions_planning($pdo, $date);
|
||||||
|
|
||||||
// Couleurs par spécialité (numéro → couleur)
|
// Créneaux horaires : 0h à 24h toutes les 30 minutes
|
||||||
$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)
|
|
||||||
$creneaux = [];
|
$creneaux = [];
|
||||||
for ($min = 8 * 60; $min < 20 * 60; $min += 30) {
|
for ($minutes = 0; $minutes < 1440; $minutes = $minutes + 30) {
|
||||||
$creneaux[] = sprintf('%02d:%02d', intdiv($min, 60), $min % 60);
|
$heures = intdiv($minutes, 60);
|
||||||
|
$mins = $minutes % 60;
|
||||||
|
$creneaux[] = sprintf('%02d:%02d', $heures, $mins);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Index des sauveteurs + couleur par spécialité
|
// Regrouper les missions par sauveteur
|
||||||
$sauveteurs_index = [];
|
$missions_par_sauveteur = [];
|
||||||
foreach ($sauveteurs as $s) {
|
foreach ($missions as $mission) {
|
||||||
$spe_num = (int) ($s['specialite'] ?? 0);
|
$id_sauv = $mission['ID_Sauveteur'];
|
||||||
$s['couleur'] = $couleurs[$spe_num] ?? '#cccccc';
|
$missions_par_sauveteur[$id_sauv][] = $mission;
|
||||||
$sauveteurs_index[$s['ID']] = $s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grille : sauveteur_id → créneau → [couleur, en_prepa]
|
// Affichage
|
||||||
$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é',
|
|
||||||
];
|
|
||||||
|
|
||||||
require('views/lecture_page.php');
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,6 +174,15 @@ table td { padding: 8px 10px; border-bottom: 1px solid #e8e2d2; }
|
||||||
vertical-align: middle;
|
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 */
|
/* FORMULAIRES */
|
||||||
form label { display: inline-block; min-width: 140px; }
|
form label { display: inline-block; min-width: 140px; }
|
||||||
form input[type="text"],
|
form input[type="text"],
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,22 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
// Récupère tous les sauveteurs
|
function get_sauveteurs(PDO $pdo): array
|
||||||
function get_all_sauveteurs(PDO $c): array {
|
{
|
||||||
$req = "SELECT ID, nom, prenom, specialite FROM Sauveteur ORDER BY nom, prenom";
|
$sql = "SELECT ID, nom, prenom, specialite
|
||||||
return $c->query($req)->fetchAll(PDO::FETCH_ASSOC);
|
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_planning(PDO $pdo, string $date): array
|
||||||
function get_missions_by_date(PDO $c, string $date): array {
|
{
|
||||||
$req = "SELECT ID, DateHeureDebut, DateHeureFin, ID_Sauveteur, EnPrepa
|
$sql = "SELECT m.ID_Sauveteur, m.DateHeureDebut, m.DateHeureFin, m.EnPrepa, s.TypeStatut
|
||||||
FROM Mission
|
FROM Mission m
|
||||||
WHERE DATE(DateHeureDebut) = :date
|
JOIN Statut s ON m.ID_statut = s.ID
|
||||||
OR DATE(DateHeureFin) = :date
|
WHERE DATE(m.DateHeureDebut) = :date
|
||||||
ORDER BY DateHeureDebut";
|
OR DATE(m.DateHeureFin) = :date
|
||||||
|
ORDER BY m.ID_Sauveteur, m.DateHeureDebut";
|
||||||
$stmt = $c->prepare($req);
|
$stmt = $pdo->prepare($sql);
|
||||||
$stmt->bindValue(':date', $date);
|
$stmt->execute([':date' => $date]);
|
||||||
$stmt->execute();
|
|
||||||
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<span>Spéléo-Secours Français — Application de gestion des sauveteurs</span>
|
<span>Spéléo-Secours Français - Application de gestion des sauveteurs</span>
|
||||||
<span>© 2025 — Tous droits réservés</span>
|
<span>© 2025 - Tous droits réservés</span>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ $notif = '';
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<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">
|
<link rel="stylesheet" type="text/css" href="css/global.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ $notif = '';
|
||||||
<div class="header-top">
|
<div class="header-top">
|
||||||
<a href="index.php">
|
<a href="index.php">
|
||||||
<img src="images/logo_ssf.png" alt="Logo SSF">
|
<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>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,84 @@
|
||||||
<?php
|
<?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');
|
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 ?>">← Jour précédent</a>
|
|
||||||
<strong><?= date('d/m/Y', strtotime($date)) ?></strong>
|
|
||||||
<a href="index.php?date=<?= $date_suiv ?>">Jour suivant →</a>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!-- Tableau du planning -->
|
|
||||||
<div class="planning-tableau">
|
<div class="planning-tableau">
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Sauveteur</th>
|
<th>Sauveteur</th>
|
||||||
<?php foreach ($creneaux as $c): ?>
|
<?php foreach ($creneaux as $creneau): ?>
|
||||||
<th><?= substr($c, 0, 5) ?></th>
|
<th><?= $creneau ?></th>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($sauveteurs as $s): ?>
|
<?php foreach ($sauveteurs as $sauveteur): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="sauveteur-nom">
|
<td class="sauveteur-nom">
|
||||||
<?= htmlentities($s['nom'] . ' ' . $s['prenom']) ?>
|
<?= htmlentities($sauveteur['nom'] . ' ' . $sauveteur['prenom']) ?>
|
||||||
<br><small><?= $legendes[(int) $s['specialite']] ?? 'Inconnu' ?></small>
|
<br><small><?= htmlentities($sauveteur['specialite']) ?></small>
|
||||||
</td>
|
</td>
|
||||||
<?php foreach ($creneaux as $c):
|
|
||||||
$cell = $grille[$s['ID']][$c] ?? null;
|
<?php foreach ($creneaux as $creneau): ?>
|
||||||
$bg = $cell ? $cell['couleur'] : '';
|
<?php
|
||||||
$class = '';
|
// Chercher si ce sauveteur a une mission sur ce créneau
|
||||||
if ($cell) {
|
$statut = null;
|
||||||
$class = $cell['en_prepa'] ? 'cell-prepa' : 'cell-actif';
|
$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 class="<?= $class ?>" style="<?= $bg ? 'background:' . $bg : '' ?>">
|
<td style="<?= $style ?>" title="<?= $titre ?>"><?= $texte ?></td>
|
||||||
<?= $cell && $cell['en_prepa'] ? 'P' : '' ?>
|
|
||||||
</td>
|
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
@ -49,20 +86,36 @@ function planning_view(array $sauveteurs, array $sauveteurs_index, array $crenea
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Légende -->
|
|
||||||
<div class="planning-legende">
|
<div class="planning-legende">
|
||||||
<h3>Légende : Spécialités</h3>
|
<h3>Légende</h3>
|
||||||
<?php foreach ($legendes as $num => $nom): ?>
|
|
||||||
<span class="legende-item">
|
<span class="legende-item">
|
||||||
<span class="legende-couleur" style="background:<?= $couleurs[$num] ?>"></span>
|
<span class="legende-couleur" style="background:#2ecc71;"></span> Sauveteur disponible
|
||||||
<?= $nom ?>
|
|
||||||
</span>
|
</span>
|
||||||
<?php endforeach; ?>
|
|
||||||
<span class="legende-item">
|
<span class="legende-item">
|
||||||
<span class="legende-couleur" style="background:#ccc; opacity:0.5;"></span>
|
<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)
|
En préparation (P)
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php require('views/footer.php');
|
<?php
|
||||||
|
require('views/footer.php');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue