# Fonctionnalité de Gestion des Travaux ## Vue d'ensemble La gestion des travaux permet de créer, modifier et supprimer des travaux planifiés sur les lignes, avec la possibilité de définir des horaires de substitution pour informer les voyageurs des alternatives disponibles. ## Structure des fichiers ### Pages - `src/pages/travaux/Travaux.js` : Page principale listant tous les travaux - `src/pages/travaux/CreerTravaux.js` : Page de création de travaux (multi-étapes) - `src/pages/travaux/Travaux.css` : Styles pour les pages travaux ### API - `src/api/travaux.js` : Fonctions pour interagir avec Supabase - `getAllTravaux()` : Récupère tous les travaux avec leurs substitutions - `getTravauxById(id)` : Récupère un travail spécifique - `createTravaux(payload, substitutions)` : Crée de nouveaux travaux - `updateTravaux(id, payload, substitutions)` : Met à jour des travaux - `deleteTravaux(id)` : Supprime des travaux (soft delete) - `getHorairesSubstitution(searchQuery)` : Récupère les horaires disponibles pour substitution - `getTravauxActifs(dateDebut, dateFin)` : Récupère les travaux actifs pour une période ### Base de données - `migrations/create_travaux_tables.sql` : Script de création des tables - Table `travaux` : Informations principales des travaux - Table `travaux_substitutions` : Liaison avec les horaires de substitution ## Structure de la base de données ### Table `travaux` | Colonne | Type | Description | |---------|------|-------------| | id | UUID | Identifiant unique | | titre | TEXT | Titre des travaux (requis) | | description | TEXT | Description détaillée | | date_debut | DATE | Date de début (requis) | | date_fin | DATE | Date de fin (requis) | | jours_travaux | TEXT[] | Jours de la semaine concernés | | heure_debut | TIME | Heure de début (requis) | | heure_fin | TIME | Heure de fin (requis) | | actif | BOOLEAN | Statut actif/inactif | | created_at | TIMESTAMP | Date de création | | updated_at | TIMESTAMP | Date de dernière modification | ### Table `travaux_substitutions` | Colonne | Type | Description | |---------|------|-------------| | id | UUID | Identifiant unique | | travaux_id | UUID | Référence vers les travaux | | horaire_id | UUID | Référence vers l'horaire de substitution | | ordre | INTEGER | Ordre d'affichage | | created_at | TIMESTAMP | Date de création | ## Processus de création (multi-étapes) ### Étape 1 : Informations générales - **Titre** : Nom descriptif des travaux (requis) - **Description** : Description détaillée (optionnel) - **Dates** : Date de début et fin (requises) - **Jours de travaux** : Sélection des jours de la semaine concernés (requis) - **Horaires** : Heure de début et fin des travaux (requis) - **Statut** : Actif/Inactif (par défaut actif) ### Étape 2 : Substitutions - **Activation** : Case à cocher pour activer les substitutions - **Recherche** : Barre de recherche pour trouver des horaires de substitution - Filtre automatique sur les horaires ayant `substitution_disponible = true` - Recherche par numéro de train, gare de départ/arrivée, ligne - **Sélection** : Ajout/retrait d'horaires dans la liste des substitutions - **Affichage** : Liste des horaires sélectionnés avec possibilité de les retirer ### Étape 3 : Résumé - Affichage de toutes les informations saisies - Validation avant création - Création en base de données ## Fonctionnalités ### Page principale - **Liste des travaux** : Affichage en grille avec cartes - **Recherche** : Filtrage par titre ou description - **Détails** : Chaque carte affiche : - Titre et description - Période (dates) - Jours concernés - Horaires - Nombre de substitutions - Statut (Actif/Inactif) - **Actions** : - Créer de nouveaux travaux - Modifier des travaux existants - Supprimer des travaux ### Validation #### Contraintes base de données - `date_fin >= date_debut` - `heure_fin > heure_debut` - `titre` est requis #### Contraintes applicatives - Au moins un jour de travaux doit être sélectionné - Tous les champs requis doivent être remplis - Les dates doivent être cohérentes ## Intégration ### Navigation - Entrée "Travaux" ajoutée dans le NavPanel avec l'icône "construction" - Accessible via `/travaux` - Page de création accessible via `/travaux/creer` ### Routes Ajoutées dans `PanelRouter.js` : - `/travaux` : Liste des travaux - `/travaux/creer` : Création de travaux ### Style - Cohérent avec le reste de l'application - Utilisation des composants WCS (Web Components Système) - Animations et transitions fluides - Responsive design ## Exemples d'utilisation ### Créer des travaux ```javascript import { createTravaux } from '../../api/travaux'; const payload = { titre: 'Travaux ligne Paris-Lyon', description: 'Rénovation des voies', date_debut: '2026-03-01', date_fin: '2026-03-31', jours_travaux: ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi'], heure_debut: '09:00', heure_fin: '17:00', actif: true }; const substitutions = ['uuid-horaire-1', 'uuid-horaire-2']; const { data, error } = await createTravaux(payload, substitutions); ``` ### Récupérer les travaux actifs ```javascript import { getTravauxActifs } from '../../api/travaux'; const { data, error } = await getTravauxActifs('2026-03-01', '2026-03-31'); ``` ### Rechercher des horaires de substitution ```javascript import { getHorairesSubstitution } from '../../api/travaux'; const { data, error } = await getHorairesSubstitution('TGV'); ``` ## Migration Pour créer les tables en base de données : ```sql -- Exécuter le fichier migrations/create_travaux_tables.sql psql -U postgres -d nom_base -f migrations/create_travaux_tables.sql ``` Ou via Supabase Dashboard : 1. Ouvrir SQL Editor 2. Copier le contenu de `create_travaux_tables.sql` 3. Exécuter ## Améliorations futures possibles 1. **Page de modification** : Créer `ModifierTravaux.js` similaire à `CreerTravaux.js` 2. **Filtres avancés** : Ajouter des filtres par date, statut, etc. 3. **Export** : Permettre l'export des travaux en CSV/PDF 4. **Notifications** : Système de notifications pour les travaux à venir 5. **Récurrence** : Support des travaux récurrents 6. **Historique** : Journal des modifications 7. **Permissions** : Gestion des droits par utilisateur 8. **API publique** : Endpoint pour les applications externes ## Notes techniques - Les substitutions sont ordonnées (`ordre` dans `travaux_substitutions`) - Trigger automatique pour `updated_at` - Index sur les dates et le statut actif pour optimiser les requêtes - Contraintes d'intégrité référentielle avec CASCADE sur les substitutions