This commit is contained in:
Manus Sandbox
2025-11-19 08:36:23 -05:00
parent 1313a45879
commit 5085159cf7
75 changed files with 127 additions and 15617 deletions

292
todo.md
View File

@@ -1,292 +0,0 @@
# 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
## Remplacement OAuth Manus par authentification locale
- [x] Modifier le schéma de la table users (ajouter password, emailVerified, supprimer openId)
- [x] Installer bcrypt pour le hashage des mots de passe
- [x] Créer les helpers d'authentification (hashPassword, verifyPassword)
- [x] Modifier les procédures auth (login, register, logout)
- [x] Modifier le système de context pour utiliser JWT
- [x] Créer la page de connexion
- [x] Créer la page d'inscription
- [x] Modifier la page de gestion des utilisateurs (ajouter mot de passe)
- [x] Mettre à jour useAuth pour utiliser la nouvelle authentification
- [x] Tester le flux de déconnexion et reconnexion
- [x] Mettre à jour AdminUsers pour permettre la création d'utilisateurs avec mot de passe
- [x] Tester l'inscription de nouveaux utilisateurs
- [x] Vérifier que toutes les routes protégées nécessitent une authentification
- [x] Nettoyer le code (supprimer les références à openId si nécessaire)
- [ ] Créer un guide de déploiement sans OAuth
## Correction des erreurs de compilation
- [x] Corriger les doublons de fonctions dans server/db.ts
- [x] Installer jsonwebtoken et corriger les imports
- [x] Vérifier que le serveur démarre sans erreur
## Correction boucle de connexion
- [x] Diagnostiquer pourquoi l'utilisateur est redirigé vers la page de connexion en boucle
- [x] Vérifier que le cookie de session est correctement défini après connexion
- [x] Vérifier que le contexte tRPC récupère correctement l'utilisateur depuis le cookie
- [x] Corriger le problème de redirection (redirection directe vers /admin au lieu de /)
- [x] Tester la connexion complète
## Correction vérification de session après connexion
- [ ] Diagnostiquer pourquoi la session n'est pas reconnue après connexion
- [ ] Vérifier que le cookie est correctement défini et lu
- [ ] Vérifier la logique de vérification JWT dans le contexte tRPC
- [ ] Corriger la vérification de session
- [ ] Tester la connexion complète avec vérification de session
## Implémentation authentification hybride (cookies + Authorization header)
- [x] Modifier le contexte tRPC pour lire le token depuis le header Authorization en plus des cookies
- [x] Modifier les procédures login/register pour retourner le token au client
- [x] Stocker le token dans localStorage côté client
- [x] Modifier le client tRPC pour envoyer le token dans le header Authorization
- [x] Tester la connexion dans l'environnement de preview Manus
- [x] Vérifier que la solution fonctionne aussi en production