Files
formation-manager-itinova/todo.md

38 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)

Correction incohérence statistiques

  • Identifier la source de l'incohérence entre tableau de bord principal et analytique
  • Uniformiser les calculs de répartition par fonction
  • Vérifier la cohérence des données affichées

Ajout graphique répartition par établissement

  • Ajouter le graphique de répartition par établissement sur le tableau de bord principal
  • Placer le graphique à côté du graphique par fonction

Amélioration affichage gestion des séquences

  • Afficher le taux de remplissage avec couleur conditionnelle (vert <70%, orange 70-90%, rouge >90%)
  • Changer la couleur de l'icône corbeille en rouge

Amélioration visuelle fenêtre des séquences

  • Changer la couleur de l'icône œil en bleu
  • Coloriser le texte des formations avec une couleur unique par formation (éviter vert, orange, rouge)

Correction algorithme de couleur des formations

  • Corriger la fonction getFormationColor pour que chaque formation ait une couleur unique

Amélioration visuelle page des apprenants

  • Afficher l'icône corbeille en rouge
  • Afficher l'icône œil en bleu
  • Coloriser la fonction (Directeurs, Chefs de service) comme dans les séquences

Badges de statut apprenants et vue établissements

  • Ajouter des badges "Actif" (vert) / "Inactif" (gris) dans la liste des apprenants
  • Créer les requêtes backend pour récupérer les statistiques par établissement
  • Créer une page "Établissements" avec liste et statistiques
  • Ajouter le lien dans le menu de navigation

Corrections bugs interface

  • Corriger l'erreur d'affichage au clic sur un événement du calendrier (ajout import useState)
  • Corriger le problème de menu invisible sur la page Établissements (ajout DashboardLayout)

Correction erreur React #31 dans le calendrier

  • Corriger l'erreur d'objet passé comme enfant React dans le modal de détails du calendrier

Réorganisation du menu du tableau de bord

  • Réorganiser le menu en 4 zones distinctes avec séparateurs visuels
    • Zone 1 : Tableau de bord
    • Zone 2 : Gestion (Formations, Séquences, Calendrier, Apprenants)
    • Zone 3 : Configuration (Utilisateurs, Rappels, Templates d'emails, Configuration SMTP)
    • Zone 4 : Analyses (Établissements, Tableau de bord analytique, Rapport public cible)

Modification couleur titres menu

  • Changer la couleur des titres des zones du menu en bleu

Génération documents de déploiement

  • Créer le guide de déploiement complet (GUIDE_DEPLOIEMENT.md)
  • Générer les scripts de déploiement automatisés (deploy.sh, update.sh)
  • Créer la documentation de configuration (CONFIGURATION.md)
  • Créer le fichier de notes de version (RELEASE_NOTES.md)

Bug calendrier - Erreur React #31 au survol des vignettes

  • Analyser l'erreur React #31 dans le calendrier
  • Identifier la cause de l'erreur lors du survol des vignettes
  • Corriger le code pour résoudre l'erreur
  • Tester le calendrier après correction

Améliorations du calendrier

Filtres du calendrier

  • Ajouter un filtre par formation
  • Ajouter un filtre par lieu
  • Ajouter un filtre par public cible
  • Implémenter la logique de filtrage dans la vue calendrier
  • Tester les filtres avec différentes combinaisons

Vues alternatives du calendrier

  • Créer la vue hebdomadaire
  • Créer la vue journalière
  • Ajouter un sélecteur de vue (mois/semaine/jour)
  • Adapter l'affichage des séquences pour chaque vue
  • Tester la navigation entre les vues

Export du calendrier

  • Implémenter l'export PDF du calendrier mensuel
  • Implémenter l'export iCal pour partage avec les formateurs
  • Ajouter les boutons d'export dans l'interface
  • Tester les exports avec différents mois

Bug création de séquence avec public cible "Tous"

  • Reproduire le bug avec le public cible "Tous"
  • Identifier la cause du problème dans le code
  • Corriger le bug
  • Tester la création/modification avec public cible "Tous"

Problème de démarrage du service sur VPS

  • Diagnostiquer la cause de l'erreur (code exit 1)
  • Vérifier les logs du service
  • Identifier les problèmes de configuration (absence de build)
  • Fournir les solutions de correction
  • Créer une documentation de dépannage

Import Excel - Formations et Séquences

  • Créer le template Excel avec colonnes définies
  • Développer la procédure backend pour parser le fichier Excel
  • Implémenter la validation des données importées
  • Créer la logique d'insertion en base de données
  • Développer l'interface frontend d'upload
  • Ajouter la prévisualisation des données avant import
  • Gérer les erreurs et retours utilisateur
  • Créer la documentation utilisateur avec exemple
  • Tester l'import avec différents fichiers Excel

Bug import Excel - Erreur lors de la création des formations

  • Identifier la cause de l'erreur "Cannot read properties of undefined (reading 'nom')" (conflit de nom)
  • Corriger la logique d'insertion des formations (renommage des imports)
  • Tester l'import avec le fichier Excel d'exemple
  • Vérifier que les formations et séquences sont bien créées

Bug import Excel - Erreur de nom de colonne lienInscription vs lienUnique

  • Vérifier le schéma de la table formations
  • Corriger le nom de colonne dans importExcel.ts (lienInscription → lienUnique)
  • Tester l'import après correction

Bug import Excel - Formation non trouvée après création

  • Analyser le fichier Excel de test fourni
  • Identifier pourquoi la formation n'est pas trouvée dans la map
  • Corriger la logique d'import
  • Tester avec le fichier Excel fourni

Bug import Excel - Erreur nom de colonne publicCible

  • Vérifier le schéma de la table formations en base de données (publicCible n'existe pas dans formations)
  • Corriger le code d'import (retiré publicCible de l'insertion formations)
  • Tester l'import après correction

Bug import Excel - Problème persistant "Formation non trouvée"

  • Analyser les logs serveur pour voir si la formation est réellement créée (ID = NaN)
  • Vérifier si l'erreur vient de la création ou de la recherche dans la map (problème de récupération ID)
  • Corriger le problème identifié (utilisation de $returningId() pour formations et séquences, ajout ordre pour dates)
  • Tester l'import et valider que tout fonctionne

Bug décalage horaire - Heures de séquences

  • Identifier où se produit le décalage horaire (+1h) (conversion locale vs UTC)
  • Vérifier la gestion des fuseaux horaires dans le formulaire
  • Corriger la conversion des dates/heures (UTC pour affichage et envoi)
  • Tester la saisie et l'affichage des heures

Bug décalage horaire dans formulaire d'édition

  • Identifier pourquoi le formulaire affiche -2h (ex: 9h00 → 7h00) (utilisation de méthodes UTC au lieu de locales)
  • Corriger la fonction safeFormatDate (utiliser getHours() au lieu de getUTCHours())
  • Tester l'édition de séquences

Bug page d'import Excel sans menu

  • Ajouter le DashboardLayout wrapper à la page d'import Excel
  • Vérifier que le menu de navigation s'affiche correctement

Déplacement menu Import Excel

  • Déplacer "Import Excel" du bloc GESTION vers le bloc CONFIGURATION
  • Vérifier l'affichage dans le menu de navigation

Scripts de mise à jour VPS

  • Créer le script de mise à jour automatique (update-app.sh)
  • Créer le script de sauvegarde avant mise à jour (backup-before-update.sh)
  • Créer la documentation de mise à jour (GUIDE_MISE_A_JOUR.md)
  • Créer le package de déploiement complet (formation-manager-update-*.tar.gz)

Correction nom répertoire dans scripts

  • Corriger APP_DIR dans backup-before-update.sh
  • Corriger APP_DIR dans update-app.sh
  • Corriger SERVICE_NAME dans tous les fichiers
  • Corriger la documentation (GUIDE_MISE_A_JOUR.md et README.md)
  • Recréer le package de déploiement (formation-manager-update-20251127_095935.tar.gz)

Bug drizzle-kit not found

  • Corriger update-app.sh pour installer toutes les dépendances (pas seulement --prod)
  • Corriger GUIDE_MISE_A_JOUR.md
  • Recréer le package de déploiement (formation-manager-update-20251127_114306.tar.gz)

Envoi emails via SMTP (sans Resend)

  • Analyser le code d'envoi d'emails actuel
  • Ajouter les champs SMTP dans le schéma de base de données
  • Installer nodemailer
  • Créer une fonction d'envoi SMTP avec nodemailer (smtpSender.ts)
  • Modifier emailSender.ts pour supporter SMTP
  • Ajouter l'interface SMTP dans AdminEmailConfig.tsx
  • Tester l'envoi d'emails via SMTP (interface visible dans Configuration SMTP)

Bug enregistrement configuration SMTP

  • Vérifier les procédures tRPC emailConfig
  • Corriger la mutation upsert pour supporter les champs SMTP
  • Tester l'enregistrement de la configuration SMTP (champs ajoutés dans l'input tRPC)

Bug email de test envoyé à la mauvaise adresse

  • Vérifier la fonction sendEmail dans emailSender.ts
  • Vérifier la fonction sendEmailViaSMTP dans smtpSender.ts
  • Vérifier pourquoi le mode production ne peut pas être activé (le switch fonctionne)
  • Corriger l'affichage du statut pour montrer SMTP au lieu de Resend
  • Ajouter des alertes spécifiques pour SMTP
  • Corriger la fonction upsertEmailConfig pour mettre à jour au lieu de créer
  • Forcer la mise à jour du provider dans la base de données
  • Vérifier que la configuration SMTP est bien enregistrée (provider=smtp)
  • Tester l'envoi d'email de test en mode production (correction du cache appliquée)

Bug email de test SMTP non reçu

  • Vérifier les logs du serveur pour voir les erreurs SMTP
  • Vérifier que le mot de passe SMTP est correct
  • Identifier que le mail de simulation est envoyé au lieu de SMTP
  • Corriger le problème de cache React Query qui garde provider='resend'
  • Forcer l'invalidation du cache après enregistrement (utils.emailConfig.get.invalidate())

Erreur "Unexpected token '<'" sur /admin/email-config

  • Vérifier les logs du serveur pour voir l'erreur exacte (erreur temporaire liée au redémarrage)
  • Tester le chargement de la page (fonctionne correctement)

Bug envoi email fonctionne en dev mais pas en production

  • Vérifier si nodemailer est dans les dependencies (OK, ligne 75)
  • Vérifier que la configuration SMTP est bien enregistrée en production
  • Ajouter une page de diagnostic pour vérifier la config en production
  • Corriger le problème

Bug emails de rappel utilisent mail de test au lieu de SMTP

  • Trouver où les emails de rappel sont envoyés dans le code (sendGroupEmail)
  • Vérifier qu'ils utilisent bien sendEmail() (OK, ligne 249 emailService.ts)
  • Vérifier le filtre des inscriptions (statut='confirmee' ligne 517)
  • Confirmer qu'il y a des apprenants confirmés avec vraies adresses
  • Ajouter des logs pour diagnostiquer l'envoi (console.log dans routers.ts)
  • Ajouter un message de retour avec le nombre d'emails envoyés
  • Tester l'envoi de rappel et vérifier les logs (fonctionne correctement)

Bug tag {nom de la formation} non remplacé dans email teaser

  • Trouver où le template d'email est généré (emailTemplateGenerator.ts)
  • Vérifier le système de remplacement des tags ({{nomFormation}})
  • Corriger le remplacement du tag (ajout des variables dans sendTeaserEmail et sendRappelJ7Email)
  • Corriger et préparer pour test en production

Email teaser sans formateur ni lieu

  • Vérifier les données disponibles dans sendTeaserEmail
  • Ajouter le formateur et le lieu dans les paramètres de sendTeaserEmail
  • Récupérer le formateur depuis la base de données dans routers.ts
  • Modifier le template pour afficher lieu et formateur
  • Ajouter lieu et formateur dans les variables
  • Préparer pour test en production

Personnalisation templates d'emails avec variables

  • Vérifier que les templates personnalisés utilisent bien les variables (OK, replaceEmailVariables)
  • Documenter les variables disponibles dans l'interface (OK, boutons d'insertion présents)
  • Les variables {{lieu}} et {{formateur}} sont déjà disponibles

Aperçu avant envoi d'emails

  • Créer une procédure tRPC pour générer un aperçu d'email (emailPreview.ts)
  • Ajouter un bouton "Aperçu" dans l'interface d'envoi (AdminSequenceInscrits.tsx)
  • Afficher un modal avec le rendu de l'email (Dialog avec iframe)
  • Utiliser le premier apprenant confirmé pour l'aperçu

Email de rappel J-1

  • Créer la fonction sendRappelJ1Email dans emailService.ts
  • Ajouter un bouton "Envoyer rappel J-1" dans l'interface
  • Créer le template d'email de rappel J-1
  • Ajouter le bouton d'aperçu pour rappel J-1
  • Modifier la procédure tRPC pour supporter rappel_j1
  • Préparer pour test (serveur redémarré)

Correction template email rappel J-1

  • Ajouter le template de rappel J-1 dans la page de gestion des templates d'emails