diff --git a/controllers/lecture_page_ctrl.php b/controllers/lecture_page_ctrl.php index baf0f83..3fbdf9f 100644 --- a/controllers/lecture_page_ctrl.php +++ b/controllers/lecture_page_ctrl.php @@ -1,64 +1,92 @@ '#2ecc71', - 'Sauveteur en approche de la cavité' => '#9b59b6', - 'Sauveteur sous terre' => '#8B4513', - 'Sauveteur équipe de gestion' => '#f1c40f', - "Sauveteur en mission à l'extérieur" => '#e67e22', - 'Sauveteur en repos' => '#3498db', - 'Sauveteur en brancardage civière' => '#e74c3c', + 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 (30 min) + // Créneaux 8h-20h (toutes les 30 min) $creneaux = []; for ($min = 8 * 60; $min < 20 * 60; $min += 30) { $creneaux[] = sprintf('%02d:%02d', intdiv($min, 60), $min % 60); } - // Index sauveteurs + grille vide - $sauveteursById = []; - $grille = []; - + // Index des sauveteurs + couleur par spécialité + $sauveteurs_index = []; foreach ($sauveteurs as $s) { - $sauveteursById[$s['ID']] = $s; - $grille[$s['ID']] = array_fill_keys($creneaux, ''); + $spe_num = (int) ($s['specialite'] ?? 0); + $s['couleur'] = $couleurs[$spe_num] ?? '#cccccc'; + $sauveteurs_index[$s['ID']] = $s; } - // Remplissage des missions + // 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 = $m['ID']; - - if (!isset($grille[$id])) continue; - - $specialite = $sauveteursById[$id]['Specialite'] ?? ''; - $couleur = $couleurs[$specialite] ?? '#cccccc'; + $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'); - $start = new DateTime($date . ' ' . $c . ':00'); - $end = (clone $start)->modify('+30 minutes'); - - if ($debut < $end && $fin > $start) { - $grille[$id][$c] = $couleur; + 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'); + planning_view($sauveteurs, $sauveteurs_index, $creneaux, $grille, $date, $date_precedente, $date_suivante, $couleurs, $legendes); } diff --git a/controllers/operation_ctrl.php b/controllers/operation_ctrl.php index 902e681..b3278bf 100644 --- a/controllers/operation_ctrl.php +++ b/controllers/operation_ctrl.php @@ -1,45 +1,37 @@ Erreur lors de l'enregistrement."; - } - + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: index.php?route=operations'); - exit(); + exit; } + + $date_debut = $_POST['date_debut']; + $date_fin = $_POST['date_fin']; + $lieu = $_POST['lieu']; + + // Valeurs par défaut pour les clés étrangères (à adapter quand l'auth sera active) + $en_prepa = 0; + $id_sauveteur = 1; + $id_statut = 1; + $id_utilisateur = 1; + + 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); + + if ($resultat) { + $_SESSION['notification'] = 'Opération enregistrée avec succès.'; + } else { + $_SESSION['notification'] = 'Erreur lors de l\'enregistrement.'; + } + + header('Location: index.php?route=operations'); + exit; } -?> \ No newline at end of file diff --git a/css/global.css b/css/global.css index f76742e..8bf294e 100644 --- a/css/global.css +++ b/css/global.css @@ -70,7 +70,7 @@ nav a.nav-right { margin-left: auto; } /* CONTENU */ article { - max-width: 1000px; + max-width: 1100px; margin: 20px auto; padding: 20px 30px; background: #fff; @@ -101,6 +101,79 @@ 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; + justify-content: space-between; + align-items: center; +} + +.planning-nav a { + color: #c49a3c; + text-decoration: none; +} + +.planning-nav a:hover { text-decoration: underline; } + +.planning-tableau { + overflow-x: auto; + margin-bottom: 20px; +} + +.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 { + padding: 0; + height: 28px; + min-width: 35px; + border: 1px solid #e0dbce; + text-align: center; + font-size: 0.65rem; + vertical-align: middle; +} + +.sauveteur-nom { + min-width: 150px; + padding: 4px 8px; + font-size: 0.85rem; + white-space: nowrap; + border-right: 2px solid #c49a3c; +} + +.sauveteur-nom small { color: #8b7a5c; font-size: 0.7rem; } + +.cell-actif { opacity: 0.85; } + +.cell-prepa { opacity: 0.4; } + +.planning-legende { + margin-top: 15px; + padding-top: 10px; + border-top: 1px solid #e8e2d2; +} + +.planning-legende h3 { font-size: 0.9rem; margin-bottom: 8px; } + +.legende-item { display: inline-block; margin-right: 15px; font-size: 0.8rem; } + +.legende-couleur { + display: inline-block; + width: 14px; + height: 14px; + border-radius: 2px; + margin-right: 4px; + vertical-align: middle; +} + /* FORMULAIRES */ form label { display: inline-block; min-width: 140px; } form input[type="text"], diff --git a/index.php b/index.php index b8585e5..0838420 100644 --- a/index.php +++ b/index.php @@ -83,12 +83,8 @@ break; case 'lecture': - require('views/lecture_page.php'); - planning_afficher_ctrl(); - break; - - case 'lecture_ctrl': require('controllers/lecture_page_ctrl.php'); + planning_afficher_ctrl(); break; default: diff --git a/models/lecture_page_model.php b/models/lecture_page_model.php index 9e540ae..8ccb108 100644 --- a/models/lecture_page_model.php +++ b/models/lecture_page_model.php @@ -1,26 +1,21 @@ query($req)->fetchAll(PDO::FETCH_ASSOC); } -// Récupère les missions d'une date +// 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 - FROM Mission - WHERE DATE(DateHeureDebut) = :date - OR DATE(DateHeureFin) = :date - "; + $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(); - return $stmt->fetchAll(PDO::FETCH_ASSOC); } - diff --git a/views/lecture_page.php b/views/lecture_page.php index 16939f0..29609d2 100644 --- a/views/lecture_page.php +++ b/views/lecture_page.php @@ -1,37 +1,68 @@ - - -Planning - -

Planning du

+

Planning du

- - - - - + + + + +
+
Nom / Prénom
+ + + + + + + + + + + + + + + + - - - - - - - - - +
Sauveteur
+ +
+
+ +
>
+ - - - +
+

Légende : Spécialités

+ $nom): ?> + + + + + + + + En préparation (P) + +
+ +Page d\'authentification'; + echo '

Merci de vous authentifier pour accéder à cette fonctionnalité.

'; echo '
'; - echo '

Login

'; - echo '

Mot de passe

'; - echo '

'; + echo '

'; + echo '

'; + echo '

'; + echo ''; - #require('footer.php'); -} \ No newline at end of file + require('views/footer.php'); +}