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