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
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
</article>
|
||||
|
||||
<footer>
|
||||
<span>Spéléo-Secours Français — Application de gestion des sauveteurs</span>
|
||||
<span>© 2025 — Tous droits réservés</span>
|
||||
<span>Spéléo-Secours Français - Application de gestion des sauveteurs</span>
|
||||
<span>© 2025 - Tous droits réservés</span>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ?>">← 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">
|
||||
<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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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 : '' ?>">
|
||||
<?= $cell && $cell['en_prepa'] ? 'P' : '' ?>
|
||||
</td>
|
||||
<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): ?>
|
||||
<h3>Légende</h3>
|
||||
|
||||
<span class="legende-item">
|
||||
<span class="legende-couleur" style="background:<?= $couleurs[$num] ?>"></span>
|
||||
<?= $nom ?>
|
||||
<span class="legende-couleur" style="background:#2ecc71;"></span> Sauveteur disponible
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
<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)
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<?php require('views/footer.php');
|
||||
<?php
|
||||
require('views/footer.php');
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue