## Modifications effectuées : ### Backend (server/routers.ts) - Ajout de la procédure `users.listWithFormateurs` qui retourne : * Tous les utilisateurs * Tous les formateurs avec leur statut de compte (hasAccount, user) - Cette procédure combine les données des tables `users` et `formateurs` ### Frontend (client/src/pages/AdminUsers.tsx) - Remplacement de `users.list` par `users.listWithFormateurs` - Ajout d'une section dédiée "Formateurs sans compte utilisateur" affichée en haut de la page - Cette section liste tous les formateurs qui n'ont pas encore de compte utilisateur - Bouton "Créer un compte" pour chaque formateur qui : * Pré-remplit le formulaire avec les données du formateur (nom, email) * Lie automatiquement le `formateurId` * Définit le rôle sur "formateur" ## Résultat Les formateurs existants dans la table `formateurs` sont maintenant visibles dans la page Utilisateurs. L'administrateur peut facilement créer un compte pour chaque formateur en un clic, ce qui lie automatiquement le compte au formateur existant.
23 KiB
23 KiB
Gestion des Formations Manager Itinova - TODO
Fonctionnalités principales
- Gestion des formations (CRUD)
- Gestion des séquences avec jusqu'à 4 dates par séquence
- Gestion des apprenants (CRUD)
- Système d'inscription avec validation de capacité
- Génération d'invitations Outlook (.ics)
- Envoi d'emails automatiques (confirmation, teaser, rappels)
- Exports PDF et Excel
- Filtres et recherche sur toutes les pages
- Champ "Fonction" dans la fiche apprenant
- Filtres par fonction sur les pages apprenants et inscrits
- Graphique de répartition par fonction sur le tableau de bord
- Personnalisation des templates d'emails
- Gestion des utilisateurs avec rôles (admin/user)
- Configuration SMTP pour l'envoi d'emails
- Authentification locale avec email/mot de passe
- Cohabitation OAuth Manus + authentification locale
Champ "Public cible" dans les séquences
- Ajouter le champ "Public cible" dans la table sequences
- Ajouter le champ dans le formulaire de création de séquence
- Ajouter le champ dans le formulaire de modification de séquence
- Afficher le public cible sur la page d'inscription publique
- Ajouter "Tous" dans la liste des publics cible
- Ajouter le badge de public cible dans le tableau des séquences
- Ajouter le filtre par public cible sur la page de gestion des séquences
- Ajouter le public cible dans tous les exports (Excel, PDF)
Alerte d'incohérence public cible / fonction
- Ajouter une alerte d'information lors de l'inscription
- Afficher l'alerte si le public cible ne correspond pas à la fonction
- Laisser l'inscription se faire (alerte non bloquante)
- Pas d'alerte si le public cible est "Tous"
Rapport d'analyse public cible
- Créer une page de rapport comparant public cible et fonction des inscrits
- Afficher les écarts entre public cible et fonction réelle
- Ajouter des statistiques et graphiques pour visualiser les écarts
- Ajouter le lien dans le menu de navigation
Gestion des formateurs
- Créer la table formateurs dans la base de données
- Créer les procédures tRPC (list, create, delete)
- Créer le composant FormateurCombobox avec autocomplétion
- Ajouter le champ formateur dans le formulaire de création de séquence
- Ajouter le champ formateur dans le formulaire de modification de séquence
- Afficher le formateur dans le tableau des séquences
- Afficher le formateur dans les emails d'invitation
- Corriger le stockage pour utiliser formateurId au lieu du nom
Barre de progression colorée pour les séquences
- Créer le composant CapacityProgressBar
- Afficher "nbInscrits / capacité" avec pourcentage
- Code couleur automatique : vert (<70%), orange (70-90%), rouge (>90%)
- Intégrer dans le tableau des séquences
- Corriger le composant Progress pour supporter indicatorClassName
Vue calendrier mensuel
- Créer la page AdminCalendrier
- Afficher un calendrier mensuel avec navigation
- Afficher les séquences sur leurs dates respectives
- Ajouter un dialog de détails au clic sur une séquence
- Ajouter le lien "Calendrier" dans le menu de navigation
- Afficher le nom de la formation + nom de la séquence
- Afficher le lieu, le formateur et le nombre d'inscrits
- Corriger le bug de dates (parseISO vs Date)
- Corriger le bug React #31 (clés stables pour les jours)
Système de rappels automatiques
- Créer la table rappels dans la base de données
- Créer les procédures tRPC (list, create, update, delete)
- Créer la page AdminRappels pour configurer les rappels
- Permettre de configurer des rappels multiples (J-15, J-7, J-1)
- Templates d'emails personnalisables avec variables dynamiques
- Activation/désactivation des rappels
- Infrastructure pour l'envoi automatique (scheduler)
- Ajouter le lien "Rappels" dans le menu de navigation
- Créer les templates J-7 et J-1 avec style Itinova
- Implémenter le scheduler automatique (vérification toutes les heures)
- Corriger le bug d'envois multiples (un seul email par séquence)
Améliorations diverses
- Réorganisation du menu de navigation en 4 zones (Tableau de bord, Gestion, Configuration, Analyses)
- Couleur bleue pour les titres des zones du menu
- Icône œil en bleu pour la visualisation
- Icône corbeille en rouge pour la suppression
- Badges de couleur pour les fonctions des apprenants
- Badges de couleur pour le public cible des séquences
- Couleurs uniques pour chaque formation dans le tableau des séquences
- Badges Actif/Inactif pour les apprenants
- Page dédiée aux établissements avec statistiques
Améliorations du calendrier
- Ajout de filtres (formation, lieu, public cible)
- Vues alternatives (semaine, jour) en plus de la vue mensuelle
- Export PDF du calendrier
- Export iCal (.ics) pour import dans Outlook/Google Calendar
Import Excel pour créer formations et séquences en masse
- Créer le template Excel avec colonnes prédéfinies
- Créer la procédure backend de parsing et validation
- Créer l'interface frontend avec upload et prévisualisation
- Ajouter la documentation utilisateur
- Corriger le bug de conflit de noms (formations vs table formations)
- Corriger le bug de colonne lienInscription → lienUnique
- Corriger le bug de récupération des IDs après insertion
- Ajouter le menu de navigation sur la page Import Excel
- Déplacer le menu Import Excel vers le bloc Configuration
Corrections décalage horaire
- Correction du décalage horaire dans le formulaire de création de séquence
- Correction du décalage horaire dans le formulaire d'édition de séquence
- Correction du décalage horaire dans l'affichage des séquences
- Correction du décalage horaire dans la page d'inscription publique
- Utilisation des méthodes locales (getHours, getMinutes) au lieu des méthodes UTC
Scripts de déploiement VPS
- Créer backup-before-update.sh (sauvegarde automatique)
- Créer update-app.sh (mise à jour automatique)
- Créer create-deployment-package.sh (création de package)
- Créer GUIDE_MISE_A_JOUR.md (documentation complète)
- Corriger les chemins pour utiliser formation-manager-itinova
- Corriger le bug "drizzle-kit: not found" (pnpm install sans --prod)
- Créer DEPLOIEMENT-MANUEL.md (guide déploiement sans Git)
- Créer deploy-update-manual.sh (script sans git pull)
- Créer DEPLOIEMENT-TARGZ.md (guide avec archive tar.gz)
- Créer deploy-update-targz.sh (script pour archive)
Support SMTP Direct (sans Resend)
- Ajouter les champs SMTP dans la table emailConfig
- Créer server/_core/smtpSender.ts avec Nodemailer
- Modifier emailSender.ts pour supporter SMTP et Resend
- Ajouter l'interface de configuration SMTP dans AdminEmailConfig
- Corriger le bug d'enregistrement des champs SMTP
- Corriger la fonction upsertEmailConfig pour éviter les doublons
- Corriger l'affichage du statut (SMTP Direct au lieu de Resend)
Améliorations emails groupés (teaser et rappel)
- Ajouter des logs serveur détaillés pour l'envoi groupé
- Afficher le nombre d'emails envoyés avec succès et échoués
- Avertir si aucun email n'est envoyé (aucun apprenant confirmé)
- Corriger le remplacement des tags {{nomFormation}}, {{nomSequence}}, etc.
- Ajouter le formateur et le lieu dans l'email de teaser
- Ajouter toutes les variables disponibles dans les templates
Améliorations templates d'emails
- Ajouter la possibilité de personnaliser le corps du message
- Ajouter un éditeur de texte riche (TipTap) pour formater le contenu
- Ajouter 7 boutons pour insérer rapidement des variables dynamiques
- Afficher la prévisualisation HTML en temps réel
- Implémenter le remplacement automatique des variables lors de l'envoi
- Ajouter un bouton d'aperçu avec données réelles d'un apprenant
- Ajouter le template de rappel J-1 dans la liste
- Corriger les templates J-7 et J-1 pour afficher toutes les dates
- Ajouter la variable {{datesHTML}} pour afficher toutes les dates formatées
- Ajouter le bouton {{datesHTML}} dans l'interface
- Corriger la variable {{datesHTML}} dans l'email de confirmation
Tableau de bord analytique
- Créer la page AdminTableauBordAnalytique
- Afficher les statistiques globales (cartes)
- Graphique d'évolution des inscriptions par mois
- Graphique du taux de remplissage des séquences
- Top 10 des établissements participants
- Répartition par fonction
- Ajouter des filtres de période (mois, trimestre, année)
- Implémenter l'export Excel des rapports analytiques
- Corriger l'incohérence des statistiques de répartition par fonction
- Ajouter le graphique de répartition par établissement sur le tableau de bord principal
Améliorations visuelles
- Afficher le taux de remplissage en couleur conditionnelle
- Icône corbeille en rouge pour la suppression
- Icône œil en bleu pour la visualisation
- Couleurs uniques pour chaque formation dans le tableau des séquences
- Badges de couleur pour les fonctions des apprenants
- Badges Actif/Inactif pour les apprenants
Feuilles de présence améliorées
- Ajouter le logo Itinova en haut à droite (40x15mm)
- Afficher le nom du formateur dans l'en-tête
- Ajouter deux colonnes de signature par apprenant (Matin / Après-midi)
- Générer une page par date de formation
- Ajouter la signature du formateur en bas de page avec date
Détail par apprenant
- Créer la procédure tRPC apprenants.getInscriptions
- Créer la page AdminApprenantDetail
- Afficher les informations personnelles de l'apprenant
- Afficher le tableau de toutes ses inscriptions
- Ajouter le bouton "Détail" dans la page AdminApprenants
- Ajouter la route /admin/apprenants/:id dans App.tsx
Correction problème création excessive d'utilisateurs
- Analyser la base de données pour identifier les doublons
- Nettoyer les utilisateurs en double
- Ajouter la contrainte UNIQUE sur la colonne openId
- Vérifier que onDuplicateKeyUpdate fonctionne correctement
Ajout identifiant de connexion et modification mot de passe
- Ajouter le champ username dans le schéma de la base de données
- Mettre à jour les procédures tRPC create et update
- Implémenter le hashage du mot de passe avec bcryptjs
- Ajouter la colonne "Identifiant" dans le tableau des utilisateurs
- Ajouter les champs dans le formulaire de création
- Ajouter les champs dans le formulaire d'édition
Utilisateur administrateur spécial
- Créer l'utilisateur "Administrateur" avec identifiant "adminServFormation"
- Désactiver le bouton de suppression pour cet utilisateur
- Rendre les champs nom et identifiant en lecture seule
- Permettre la modification de l'email et du mot de passe uniquement
- Garantir un accès administrateur permanent au système
Page de connexion locale
- Créer la route d'authentification backend avec hashage bcrypt
- Créer la page Login.tsx avec formulaire username/password
- Implémenter la session JWT
- Tester avec l'utilisateur adminServFormation
- Ajouter la route /login dans App.tsx
- Créer une page de choix de connexion à la racine (/)
- Corriger la redirection après déconnexion vers la page de choix
- Ajouter la détection automatique de l'état de connexion
- Corriger l'authentification locale pour compatibilité avec OAuth
Guide de configuration HTTPS
- Créer le guide complet de configuration HTTPS avec Let's Encrypt
- Créer le script d'installation automatique
- Créer le template nginx optimisé
Questionnaires de satisfaction et évaluation des acquis
- Créer le schéma de base de données (tables questionnaires, questions, réponses)
- Développer les procédures backend tRPC pour la gestion des questionnaires
- Créer l'interface d'administration des questionnaires
- Créer l'interface publique de réponse aux questionnaires
- Implémenter l'envoi automatique post-formation
- Créer les tableaux de bord d'analyse avec graphiques (satisfaction par formation/formateur)
- Implémenter les exports Excel/PDF des feedbacks
- Tester le système complet (création, envoi, réponse, analyse)
- Déployer sur le serveur VPS
Amélioration : Prévisualisation des questionnaires
- Ajouter un bouton "Prévisualiser" dans la page d'édition de questionnaire
- Créer un modal de prévisualisation avec le rendu exact du questionnaire
Exports et notifications pour les questionnaires
- Créer les fonctions backend d'export Excel des résultats
- Créer les fonctions backend d'export PDF des résultats
- Ajouter les boutons d'export dans la page d'analyse
- Implémenter le système de notifications pour les administrateurs
- Envoyer une notification lors de chaque nouvelle réponse à un questionnaire
Tableau de bord de suivi des questionnaires
- Créer les fonctions backend pour les statistiques par formation
- Créer les fonctions backend pour l'évolution temporelle
- Créer les fonctions backend pour la comparaison par formateur
- Créer les procédures tRPC pour le tableau de bord
- Créer la page AdminQuestionnaireSuivi avec graphiques
- Ajouter le lien dans le menu de navigation
- Tester toutes les fonctionnalités
Correction des erreurs SQL du tableau de bord de suivi
- Corriger la requête getEvolutionTemporelle (DATE_FORMAT)
- Corriger la requête getStatsByFormateur (sous-requête AVG)
- Simplifier les requêtes pour compatibilité MySQL
- Tester toutes les requêtes corrigées
Espace Formateur
Schéma de base de données
- Créer la table supportsFormation pour stocker les documents
- Ajouter les relations avec sequences
- Migrer le schéma avec pnpm db:push
Backend
- Créer formateurDb.ts avec les fonctions de requête
- Ajouter les procédures tRPC pour le calendrier du formateur
- Ajouter les procédures tRPC pour la liste des apprenants
- Ajouter les procédures tRPC pour l'upload de supports
- Ajouter les procédures tRPC pour la validation des présences
- Ajouter les procédures tRPC pour l'historique
Frontend
- Créer la page FormateurDashboard (calendrier)
- Créer la page FormateurSequence (détail séquence avec apprenants)
- Créer la page FormateurSupports (gestion des supports)
- Créer la page FormateurPresences (validation présences)
- Créer la page FormateurHistorique (historique formations)
- Ajouter les routes dans App.tsx
- Ajouter le menu de navigation formateur
Tests
- Tester toutes les fonctionnalités de l'espace formateur
Correction bug rappels multiples
- Analyser le code du scheduler de rappels
- Identifier pourquoi plusieurs emails sont envoyés
- Corriger la logique pour envoyer un seul email par séquence
- Tester avec la formation JetSki du 15/12/2025
Améliorations système de rappels
Historique des rappels
- Créer la table logsRappels dans le schéma
- Migrer le schéma avec pnpm db:push
- Créer les fonctions de log dans rappelDb.ts
- Intégrer le logging dans rappelScheduler.ts
- Ajouter la vérification des doublons avant envoi
Test manuel des rappels
- Créer la procédure tRPC pour tester un rappel
- Ajouter le bouton de test dans AdminRappels.tsx (optionnel)
- Implémenter la logique de test sans modifier les logs (optionnel)
Notifications d'échec
- Créer la fonction de notification admin
- Intégrer les notifications dans le catch des erreurs d'envoi
- Ajouter un résumé des échecs dans les logs
Historique et statistiques des rappels
Backend
- Créer les fonctions de récupération des logs avec filtres
- Créer les fonctions de statistiques (taux succès, emails problématiques)
- Ajouter les procédures tRPC pour l'historique
- Ajouter les procédures tRPC pour les statistiques
Page d'historique
- Créer AdminRappelsHistorique.tsx avec tableau des logs
- Ajouter les filtres (date, séquence, statut, email)
- Ajouter la recherche par email
- Ajouter la pagination
- Ajouter la route dans App.tsx
Tableau de bord statistiques
- Créer AdminRappelsStats.tsx avec cartes de statistiques
- Ajouter le graphique d'évolution des envois
- Ajouter le graphique du taux de succès
- Ajouter la liste des emails problématiques
- Ajouter la route dans App.tsx
Système de réessai automatique
- Ajouter le champ nbTentatives dans logsRappels
- Ajouter le champ prochainEssai dans logsRappels
- Créer la fonction de retry avec délai exponentiel
- Intégrer le retry dans rappelScheduler
- Limiter à 3 tentatives maximum
Correction erreurs tRPC (HTML au lieu de JSON)
- Analyser les logs du serveur pour identifier les requêtes qui échouent
- Identifier les procédures tRPC qui causent les erreurs
- Corriger les erreurs côté serveur (emailBody, reduce)
- Tester la page admin pour vérifier que les erreurs sont résolues
Rendre accessibles les pages d'historique et statistiques des rappels
- Vérifier que les routes sont bien définies dans App.tsx
- Vérifier que les liens sont bien dans le menu DashboardLayout
- Ajouter la gestion des sous-menus dans DashboardLayout
- Tester l'accès aux pages /admin/rappels/historique et /admin/rappels/statistiques
Système plier/déplier pour le menu de navigation
- Ajouter un état pour gérer les sections ouvertes/fermées
- Ajouter des icônes chevron pour indiquer l'état
- Implémenter la logique de toggle pour chaque section
- Garder la section active automatiquement ouverte
- Tester le comportement sur toutes les sections
Correction bug accordéons qui s'ouvrent tous
- Corriger le useEffect pour n'ouvrir que la section contenant l'item actif
- Supprimer le useEffect problématique (toutes sections ouvertes par défaut)
- Utiliser localStorage pour persister l'état des sections
- Tester le comportement en cliquant sur différents items
Modification comportement par défaut accordéon menu
- Modifier l'initialisation pour ouvrir uniquement TABLEAU DE BORD par défaut
- Fermer GESTION, CONFIGURATION, ANALYSES par défaut
- Tester le comportement à l'ouverture
Bug compteur d'inscrits après suppression
- Analyser le code de suppression d'inscription
- Identifier pourquoi le compteur ne se met pas à jour
- Corriger le bug de rafraîchissement du compteur
- Tester la suppression d'un apprenant et vérifier le compteur
Bug nom formateur dans email rappel J-7
- Analyser le code d'envoi des emails de rappel
- Comparer avec le code de prévisualisation
- Identifier pourquoi le nom du formateur n'est pas remplacé
- Corriger le bug de remplacement du nom du formateur
- Bug persistant : J-1 fonctionne mais J-7 ne fonctionne toujours pas
- Analyser la différence entre le template J-7 et J-1
- Corriger le template J-7 définitivement
🔔 Système de notifications enrichi
- Email de remerciement post-formation
- Notification aux formateurs (nouvelle inscription)
- Notification aux formateurs (annulation)
- Alerte capacité atteinte (pour les admins)
- Notification d'annulation aux apprenants en liste d'attente
- Ajout du champ email pour les formateurs
- Scheduler automatique pour les remerciements post-formation
- Procédure tRPC pour envoi manuel des remerciements
Améliorations notifications (15/12/2025)
- Interface de gestion des emails formateurs dans Configuration
- Tableau de bord des notifications avec historique des emails envoyés
- Lien vers questionnaire de satisfaction dans l'email de remerciement
Réimplémentation attestations (16/12/2025)
- Recréer les tables en base de données
- Recréer le service de génération PDF
- Recréer les procédures tRPC
- Créer la page de configuration
- Intégrer le bouton dans la page de validation des présences
- Tester la génération complète
Authentification et accès formateurs
- Analyser le système d'authentification actuel (users, roles)
- Créer le rôle "formateur" dans la base de données
- Lier les comptes utilisateurs aux formateurs existants (champ formateurId)
- Utiliser la page de connexion locale existante
- Implémenter la redirection selon le rôle (admin → /admin, formateur → /formateur)
- Tester la connexion et l'accès aux fonctionnalités formateur
Upload logo et signature pour attestations
- Ajouter les champs logoUrl et signatureUrl dans configAttestation (déjà existants)
- Créer le composant d'upload d'images vers S3 (ImageUpload.tsx)
- Créer l'endpoint d'upload serveur (/api/upload-image)
- Intégrer l'upload dans la page de configuration des attestations
- Modifier le service PDF pour inclure le logo et la signature
- Tester la génération d'attestations avec logo et signature personnalisés
Réorganisation du menu de navigation
- Déplacer le menu "Notifications" de CONFIGURATION vers ANALYSES
Nouvelles modifications du menu
- Renommer "Attestations" en "Attestations de formation"
- Déplacer "Statistiques" de Rappels vers ANALYSES et le renommer "Rappels"
Création de la section TRAÇABILITÉ
- Renommer "Rappels" (ANALYSES) en "Statistiques des rappels"
- Créer une nouvelle section "TRAÇABILITÉ"
- Déplacer "Notifications" vers TRAÇABILITÉ
- Déplacer "Suivi Questionnaires" vers TRAÇABILITÉ
- Déplacer "Établissements" vers TRAÇABILITÉ
- Déplacer "Historique" (sous-menu de Rappels) vers TRAÇABILITÉ avec le nom "Rappels"
Centralisation de la création des formateurs
- Retirer le bouton de création de formateur de la page Formateurs
- Supprimer le dialogue de création et les mutations associées
- Ajouter un message explicatif indiquant que la création se fait via la page Utilisateurs
Liaison formateurs existants avec utilisateurs
- Analyser les formateurs existants dans la table formateurs
- Créer une procédure listWithFormateurs pour afficher tous les formateurs
- Afficher les formateurs sans compte dans une section dédiée
- Ajouter un bouton "Créer un compte" qui pré-remplit le formulaire
- Lier automatiquement le formateurId lors de la création