Files
formation-manager-itinova/todo.md

462 lines
22 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Gestion des Formations Manager Itinova - TODO
## Phase 1 : Planification et initialisation
- [x] Initialiser le projet avec architecture full-stack
- [x] Créer le plan de développement
- [x] Créer le fichier todo.md
## Phase 2 : Modèle de données
- [x] Créer la table des formations (nom, description, lien unique)
- [x] Créer la table des sessions (dates, lieu, capacité max 12, statut blocage J-15)
- [x] Créer la table des inscriptions (apprenant, session, statut)
- [x] Créer la table des apprenants (nom, prénom, email, code établissement)
- [x] Implémenter les relations entre tables
- [x] Ajouter les contraintes d'unicité pour éviter les doubles inscriptions
## Phase 3 : Interface d'administration
- [x] Créer le dashboard administrateur avec navigation
- [x] Créer l'interface de gestion des formations (CRUD)
- [x] Créer l'interface de gestion des sessions (CRUD)
- [x] Créer l'interface de gestion des apprenants (CRUD)
- [x] Afficher les listes d'inscrits par session
- [x] Implémenter la gestion des rôles (admin DRH, responsable, stagiaire)
## Phase 4 : Système d'inscription
- [x] Créer la page d'inscription publique avec lien unique par formation
- [x] Implémenter la validation de capacité maximale (12 participants)
- [x] Implémenter la validation anti-double inscription
- [x] Implémenter le blocage des inscriptions/désinscriptions à J-15
- [x] Créer le système de liste d'attente si session complète
- [x] Afficher les sessions disponibles avec places restantes
## Phase 5 : Invitations et emails automatiques
- [x] Implémenter la génération d'invitations Outlook (.ics) avec statut " occupé "
- [x] Inclure le lieu de formation dans les invitations
- [x] Créer le système d'envoi d'emails automatiques
- [x] Créer le template email de confirmation d'inscription
- [x] Créer le template email teaser pour chaque groupe
- [x] Créer le template email de rappel à J-7
- [x] Implémenter l'envoi automatique des emails selon les événements
## Phase 6 : Exports
- [x] Implémenter l'export Excel des listes d'inscrits par session
- [x] Implémenter l'export PDF des listes d'inscrits par session
- [x] Créer la génération de feuille de présence PDF (nom, prénom, code établissement)
- [x] Ajouter les boutons d'export dans l'interface admin
## Phase 7 : Tests et documentation
- [x] Tester le flux complet d'inscription
- [x] Tester les validations et contraintes
- [x] Tester la génération des invitations et emails
- [x] Tester les exports PDF/Excel
- [x] Créer la documentation utilisateur
- [x] Créer la documentation d'administration
## P## Phase 8 : Livraison
- [x] Vérifier toutes les fonctionnalités
- [x] Créer un checkpoint final
- [x] Présenter l'application à l'utilisateur
## Corrections à apporter
- [x] Corriger la mise à jour de la liste des apprenants après inscription
- [x] Implémenter l'envoi effectif des emails de confirmation
## Nouvelles fonctionnalités
- [x] Ajouter des filtres de tri sur la page des sessions (date, lieu, places restantes)
- [x] Ajouter des filtres de recherche sur la page des formations
- [x] Ajouter des filtres de recherche sur la page des apprenants
- [x] Ajouter des filtres complets sur la page de gestion des inscrits (recherche, statut, établissement, tri par date)
- [x] Ajouter le champ "Fonction" (Directeur, Chef de service, Autre) dans la fiche apprenant
- [x] Mettre à jour le schéma de base de données
- [x] Mettre à jour les formulaires d'inscription et de gestion
- [x] Ajouter la fonction dans les exports PDF/Excel
## Améliorations supplémentaires
- [x] Ajouter un filtre par fonction sur la page des apprenants
- [x] Ajouter un filtre par fonction sur la page des inscrits
- [x] Créer des statistiques de répartition par fonction sur le tableau de bord
- [x] Ajouter des graphiques de visualisation des données
- [x] Personnaliser les templates d'emails avec la fonction de l'apprenant
## Refonte : Sessions → Séquences avec dates multiples
- [x] Renommer "Session" en "Séquence" dans le schéma de base de données
- [x] Créer une table pour gérer jusqu'à 4 dates par séquence
- [x] Mettre à jour toutes les procédures tRPC pour utiliser "séquence"
- [x] Renommer toutes les interfaces et pages (AdminSessions → AdminSequences)
- [x] Adapter le formulaire de création/édition pour gérer 4 dates
- [x] Mettre à jour la page d'inscription pour afficher toutes les dates d'une séquence
- [x] Modifier la logique d'inscription pour inscrire à toutes les dates
- [x] Mettre à jour les exports PDF/Excel avec toutes les dates
- [x] Adapter les emails pour inclure toutes les dates de la séquence
- [x] Mettre à jour les invitations Outlook pour créer 4 événements si nécessaire
- [x] Renommer partout dans l'interface utilisateur (labels, titres, descriptions)
## Corrections urgentes
- [x] Corriger l'erreur React "Cannot update a component while rendering" dans Home.tsx
- [x] Corriger le bug de modification des horaires des séquences
- [x] Corriger le décalage d'une heure lors de l'enregistrement des dates (15h00 saisi devient 16h00 en base)
- [x] Corriger la mise à jour du nombre d'inscrits sur la page d'inscription publique
- [x] Corriger le décalage d'une heure entre la saisie et l'affichage des dates de séquences
- [x] Corriger le décalage d'une heure à l'affichage des dates (problème de formatage lors de la récupération)
- [x] Corriger les fonctions formatDate pour gérer les objets Date JavaScript en plus des chaînes MySQL
- [x] Forcer le fuseau horaire Europe/Paris dans la connexion MySQL pour éliminer le décalage d'une heure
- [x] Corriger le décalage horaire persistant dans parseLocalDateTime (09:48 envoyé devient 10:48 en base)
- [x] Corriger l'erreur "toISOString is not a function" lors de la modification de séquences
- [x] Ajouter le champ "Public cible" dans la fiche formation avec liste déroulante (Directeur, Chef de service, Autre)
- [x] Mettre à jour le schéma de base de données pour les formations
- [x] Mettre à jour les formulaires de gestion des formations
- [x] Afficher le public cible dans les listes et exports
- [x] Déplacer le champ "Public cible" des formations vers les séquences
- [x] Retirer publicCible du schéma formations
- [x] Ajouter publicCible au schéma sequences
- [x] Mettre à jour les procédures tRPC pour sequences
- [x] Mettre à jour le formulaire de création/édition de séquences
- [x] Afficher le public cible dans la liste des séquences
- [x] Afficher le public cible par séquence sur la page d'inscription publique
- [x] Corriger le formulaire de modification des séquences pour afficher le champ Public cible
## Bugs critiques à corriger
- [x] La validation d'une inscription ne fonctionne pas (déjà corrigé dans la version restaurée)
- [x] Lorsqu'un apprenant s'inscrit, il n'apparaît pas dans la liste des apprenants (déjà corrigé dans la version restaurée)
## Nouvelle fonctionnalité - Alerte public cible
- [x] Analyser le code d'inscription pour identifier où ajouter l'alerte
- [x] Implémenter la logique de vérification du public cible dans le formulaire d'inscription
- [x] Afficher une alerte d'information (non bloquante) si le public cible ne correspond pas
- [x] Tester l'alerte avec différents scénarios (correspondance, non-correspondance)
## Inclusion du public cible dans les exports
- [x] Analyser le code des exports Excel et PDF
- [x] Ajouter le public cible dans l'export Excel des listes d'inscrits
- [x] Ajouter le public cible dans l'export PDF des listes d'inscrits
- [x] Ajouter le public cible dans l'export PDF des feuilles de présence
- [x] Tester tous les exports pour vérifier l'affichage correct
## Ajout du filtre par public cible
- [x] Analyser la page AdminSequences pour comprendre le système de filtres existant
- [x] Ajouter un état pour le filtre publicCible
- [x] Ajouter le composant Select pour le filtre publicCible dans l'interface
- [x] Implémenter la logique de filtrage par public cible
- [x] Tester le filtre avec différentes valeurs
## Badges de couleur pour le public cible
- [x] Créer un composant Badge pour afficher le public cible avec des couleurs distinctes
- [x] Intégrer le Badge dans le tableau des séquences (AdminSequences)
- [x] Intégrer le Badge dans la page des inscrits (AdminSequenceInscrits)
- [x] Tester l'affichage des badges avec différents publics cibles
## Rapport d'analyse public cible vs fonction appre- [x] Créer une nouvelle page AdminRapportPublicCible
- [x] Ajouter la route dans App.tsx
- [x] Ajouter un lien dans le menu de navigation (DashboardLayout- [x] Créer une procédure tRPC pour récupérer les données d'analyse
- [x] Implémenter la logique de comparaison public cible vs fonction apprenants
- [x] Afficher les statistiques et écarts dans l'interface
- [x] Tester le rapport avec différentes données
## Gestion des utilisateurs de l'application
- [x] Analyser le schéma actuel de la table users
- [x] Ajouter les champs nécessaires (statut actif/inactif, date de création compte)
- [x] Créer les procédures tRPC pour la gestion des utilisateurs (liste, création, modification, désactivation)
- [x] Créer la page AdminUsers avec tableau des utilisateurs
- [x] Implémenter le formulaire de création d'utilisateur
- [x] Implémenter le formulaire de modification d'utilisateur
- [x] Ajouter la fonctionnalité d'activation/désactivation des comptes
- [x] Ajouter des filtres de recherche (nom, email, rôle, statut)
- [x] Ajouter la gestion des rôles (admin, user)
- [x] Intégrer la page dans le menu de navigation
- [x] Tester toutes les fonctionnalités de gestion des utilisateurs
## Ajout de la fonctionnalité de création d'utilisateurs
- [x] Ajouter une procédure tRPC pour créer un nouvel utilisateur
- [x] Ajouter un bouton "Ajouter un utilisateur" dans la page AdminUsers
- [x] Créer un dialogue de création avec formulaire (nom, email, rôle)
- [x] Tester la création d'un nouvel utilisateur
## Réinitialisation de mot de passe
- [x] Créer une table password_reset_tokens dans le schéma
- [x] Ajouter les fonctions de gestion des tokens dans db.ts
- [x] Créer une procédure tRPC pour générer un token et envoyer l'email
- [x] Ajouter un bouton "Réinitialiser le mot de passe" dans AdminUsers
- [x] Créer un dialogue de confirmation pour la réinitialisation
- [x] Tester la génération de token et l'envoi d'email
## Correction affichage menu latéral
- [x] Intégrer la page AdminUsers dans le DashboardLayout
- [x] Vérifier l'affichage du menu latéral sur la page utilisateurs
## Correction de l'envoi d'emails pour réinitialisation de mot de passe
- [x] Analyser le service d'envoi d'emails actuel
- [x] Rechercher l'API d'envoi d'emails disponible dans Manus
- [x] Intégrer un vrai service d'envoi d'emails (Resend)
- [x] Créer la documentation de configuration EMAIL_SETUP.md
## Interface de personnalisation des templates d'emails
- [x] Créer la table email_templates dans le schéma
- [x] Créer les procédures backend pour CRUD des templates
- [x] Créer la page AdminEmailTemplates
- [x] Implémenter l'éditeur de template (logo, couleurs, textes)
- [x] Ajouter la prévisualisation en temps réel
- [x] Modifier le service d'envoi pour utiliser les templates personnalisés
- [x] Ajouter le lien dans le menu de navigation
- [x] Tester la personnalisation et l'envoi avec templates personnalisés
## Configuration SMTP via interface
- [x] Créer la table email_config dans le schéma
- [x] Créer les procédures backend pour CRUD de la configuration
- [x] Ajouter une procédure de test d'envoi d'email
- [x] Modifier le service d'envoi pour utiliser la config en base
- [x] Créer la page AdminEmailConfig
- [x] Implémenter le formulaire de configuration (API key, email expéditeur, mode)
- [x] Ajouter le test d'envoi immédiat avec feedback
- [x] Ajouter la validation de domaine
- [x] Ajouter le basculement simulation/production
- [x] Ajouter le lien dans le menu de navigation
- [x] Tester la configuration et l'envoi d'emails
## Amélioration disposition formulaire modification séquences
- [x] Réorganiser les champs du formulaire pour éviter tout chevauchement
- [x] Ajouter les champs Public cible et Formateur dans le formulaire de modification
- [x] Séparer Public cible et Formateur sur une ligne dédiée
- [x] Tester la disposition sur différentes tailles d'écran
## Correction bug FormateurCombobox
- [x] Recréer le fichier FormateurCombobox.tsx manquant
- [x] Ajouter l'import de FormateurCombobox dans AdminSequences.tsx
- [x] Redémarrer le serveur pour détecter le nouveau fichier
## Recréation des fichiers manquants
- [x] Recréer le composant CapacityProgressBar avec barre de progression colorée
- [x] Recréer la page AdminCalendrier avec vue calendrier mensuel
- [x] Recréer la page AdminRappels avec gestion des rappels automatiques
- [x] Intégrer CapacityProgressBar dans AdminSequences
- [x] Redémarrer le serveur pour détecter tous les nouveaux fichiers
- [ ] Vérifier que tous les imports et routes sont corrects
- [ ] Créer un checkpoint complet avec toutes les fonctionnalités
## Correction affichage page calendrier
- [x] Ajouter la route /admin/calendrier dans App.tsx
- [x] Ajouter la route /admin/rappels dans App.tsx
- [x] Ajouter le lien "Calendrier" dans DashboardLayout
- [x] Ajouter le lien "Rappels" dans DashboardLayout
- [x] Ajouter les imports CalendarDays et Bell
- [x] Redémarrer le serveur
- [x] Tester l'accès aux pages calendrier et rappels
## Vérification des trois fonctionnalités principales
- [x] Vérifier que CapacityProgressBar est bien utilisé dans AdminSequences
- [x] Vérifier que la page AdminCalendrier existe et est accessible
- [x] Vérifier que la page AdminRappels existe et est accessible
- [x] Ajouter les procédures tRPC manquantes pour les rappels
- [x] Créer un rapport de vérification complet
## Corrections de bugs - Calendrier et taux de remplissage
- [x] Corriger l'affichage des séquences dans le calendrier de novembre (seq.dates au lieu de seq.datesFormation)
- [x] Vérifier la logique de filtrage des séquences par mois dans AdminCalendrier
- [x] Corriger le calcul du taux de remplissage (ajout de nbInscrits dans sequences.list)
- [x] Vérifier que sequences.list retourne bien le nombre d'inscrits
## Correction bug calendrier - parseISO
- [x] Corriger l'erreur "e.split is not a function" dans AdminCalendrier
- [x] Ajouter une vérification du type de dateDebut avant parseISO
- [x] Gérer le cas où dateDebut est déjà un objet Date ou une chaîne
## Trois corrections demandées
- [x] Ajouter "Tous" dans la liste des publics cible du formulaire "Nouvelle séquence"
- [x] Ajouter "Tous" dans les fonctions de badge et label
- [x] Corriger le composant Progress pour supporter indicatorClassName
- [x] Corriger les couleurs de la barre de progression (vert/orange/rouge) selon le taux de remplissage
- [x] Compléter les informations des séquences affichées dans le calendrier (lieu, formateur, nb inscrits)
## Trois nouvelles corrections
- [x] Ajouter le champ formateur dans le formulaire "Nouvelle séquence"
- [x] Modifier le placeholder du formateur : "Sélectionner un formateur" (déjà correct par défaut)
- [x] Afficher le nom de la séquence ET le nom de la formation dans le calendrier
## Vérification des trois corrections
- [ ] Vérifier que le champ formateur apparaît bien dans le formulaire "Nouvelle séquence"
- [ ] Vérifier le texte du placeholder du formateur
- [ ] Vérifier que le nom de la séquence ET le nom de la formation apparaissent dans le calendrier
- [ ] Corriger les problèmes trouvés
## Corrections affichage nom de formation dans calendrier
- [x] Modifier getSequences() pour récupérer les informations de formation via jointure
- [x] Créer getSequencesWithFormation() pour éviter les conflits avec le spread operator
- [x] Mettre à jour la procédure sequences.list pour utiliser getSequencesWithFormation()
- [x] Corriger AdminCalendrier.tsx pour utiliser formation.nom au lieu de formation.titre
- [x] Vérifier que le placeholder du FormateurCombobox est correct (sans "(optionnel)")
- [x] Tester l'affichage du nom de formation dans le calendrier
- [x] Tester l'affichage du nom de formation dans le dialog de détails
## Corrections affichage formateur
- [x] Corriger le placeholder "Sélectionner un formateur (optionnel)" en "Sélectionner un formateur" dans le formulaire de modification de séquence
- [x] Ajouter l'affichage du formateur dans la liste des séquences (AdminSequences)
- [x] Tester les modifications
## Nettoyage de la table utilisateurs
- [x] Vérifier les utilisateurs existants dans la base de données
- [x] Supprimer tous les utilisateurs sauf les 4 spécifiés (IDs: 1110110, 2010001, 2040001, 2070001)
- [x] Vérifier que la suppression a réussi
## Correction erreur formateurs.create
- [x] Identifier le code qui appelle formateurs.create
- [x] Ajouter la procédure formateurs.create manquante dans le routeur
- [x] Tester la correction
## Correction affichage du formateur dans les séquences
- [x] Vérifier comment getSequencesWithFormation récupère les informations du formateur
- [x] Corriger la jointure pour inclure les données du formateur
- [x] Vérifier l'affichage dans AdminSequences.tsx
- [x] Ajouter formateurId dans le schéma de validation de sequences.create
- [x] Ajouter formateurId dans le schéma de validation de sequences.update
- [x] Corriger le schéma Zod pour accepter null (formateurId: z.number().nullable().optional())
- [x] Modifier FormateurCombobox pour stocker l'ID au lieu du nom
- [x] Tester les modifications dans la liste et dans le dialog de modification
## Améliorations des feuilles de présence
- [x] Copier le logo Itinova dans le dossier public du projet
- [x] Ajouter le logo Itinova en haut à droite de chaque page de feuille de présence
- [x] Ajouter le nom du formateur dans l'en-tête de la feuille de présence
- [x] Modifier le tableau pour avoir deux signatures par apprenant et par journée (matin et après-midi)
- [x] Mettre à jour l'interface FeuillePresenceInfo pour inclure le formateur
- [x] Tester la génération des feuilles de présence avec toutes les modifications
## Signature du formateur sur les feuilles de présence
- [x] Ajouter un champ de signature pour le formateur en bas de chaque page de feuille de présence
## Détail par apprenant
- [x] Créer une procédure tRPC pour récupérer toutes les inscriptions d'un apprenant avec les informations de formation et séquence
- [x] Créer la page AdminApprenantDetail affichant la liste des inscriptions par apprenant
- [x] Ajouter un bouton "Détail par apprenant" dans la page AdminApprenants
- [x] Ajouter la route /admin/apprenants/:id dans App.tsx
- [x] Tester l'affichage des détails d'un apprenant
## Problème de création excessive d'utilisateurs
- [x] Analyser la table users pour identifier les utilisateurs en double
- [x] Examiner le code d'authentification OAuth
- [x] Identifier la cause de la création excessive d'utilisateurs
- [x] Corriger le problème
- [x] Tester la correction
## Identifiant de connexion et modification du mot de passe
- [ ] Ajouter le champ username (identifiant de connexion) dans le schéma de la base de données
- [ ] Générer et appliquer la migration de la base de données
- [x] Mettre à jour les procédures tRPC pour gérer username et password
- [ ] Afficher l'identifiant de connexion dans la liste des utilisateurs
- [ ] Permettre la modification de l'identifiant et du mot de passe dans la fenêtre d'édition
- [x] Tester les modifications
## Utilisateur administrateur spécial
- [x] Créer l'utilisateur "adminServFormation" avec mot de passe "Itinova69!" dans la base de données
- [x] Modifier l'interface pour désactiver le bouton de suppression pour cet utilisateur
- [x] Modifier le formulaire d'édition pour rendre les champs nom, email et identifiant en lecture seule pour cet utilisateur
- [x] Tester les modifications
## Email modifiable pour administrateur
- [x] Modifier l'interface pour rendre le champ email modifiable pour l'utilisateur adminServFormation
- [x] Tester la modification
## Authentification locale avec username/password
- [x] Créer la route d'authentification locale dans le backend (POST /api/auth/local/login)
- [x] Créer la page de connexion locale avec formulaire username/password
- [x] Ajouter la route /login dans App.tsx
- [x] Créer un lien vers la page de login depuis la page d'accueil
- [x] Écrire des tests pour l'authentification locale
- [x] Tester la connexion avec adminServFormation/Itinova69!
## Ajouter un lien visible vers la connexion locale
- [x] Modifier la page d'accueil pour afficher un bouton "Connexion locale"
- [x] Tester l'accès à la page de connexion locale depuis la page d'accueil
## Corriger la redirection de /login vers OAuth
- [x] Identifier pourquoi /login redirige vers OAuth au lieu d'afficher le formulaire local
- [x] Corriger la page Login.tsx pour empêcher la redirection automatique
- [x] Tester que /login affiche bien le formulaire username/password
## Désactiver la redirection OAuth pour /login
- [ ] Identifier le middleware qui force la redirection vers OAuth
- [ ] Exclure la route /login de la redirection automatique
- [ ] Tester que /login affiche bien le formulaire local même après publication
## Créer une page de choix de connexion
- [ ] Créer une page LoginChoice avec boutons "Connexion Manus" et "Connexion locale"
- [ ] Modifier les routes pour afficher cette page en premier
- [ ] Tester le choix et les redirections
## Créer une page de choix de connexion
- [x] Créer une page LoginChoice avec boutons "Connexion Manus" et "Connexion locale"
- [x] Modifier les routes pour afficher cette page en premier
- [x] Tester le choix et les redirections
## Correction redirection après déconnexion
- [x] Modifier la procédure de déconnexion pour rediriger vers la page de choix (/)
- [x] Tester la déconnexion et vérifier la redirection
## Correction page de choix au lancement
- [x] Analyser pourquoi la page de choix ne s'affiche pas au lancement
- [x] Corriger la redirection automatique
- [x] Tester l'affichage de la page de choix
## Sauvegarde complète avec corrections authentification
- [x] Appliquer toutes les corrections d'authentification locale
- [x] Créer un checkpoint final
- [ ] Créer un package de déploiement complet