60 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
Renommage des templates de rappels
- Renommer "Rappel J-7" en "Rappel 1" dans AdminEmailTemplates.tsx
- Renommer "Rappel J-1" en "Rappel 2" dans AdminEmailTemplates.tsx
- Renommer "Rappel J-7" en "Rappel 1" dans AdminRappels.tsx
- Renommer "Rappel J-1" en "Rappel 2" dans AdminRappels.tsx
Remise du menu Rappels dans CONFIGURATION
- Ajouter le menu "Rappels" dans la section CONFIGURATION
- Pointer vers /admin/rappels pour la gestion des rappels
Renommage du label dans la gestion des rappels
- Renommer "Type de rappel" en "Template d'email utilisé" dans les dialogues de création/modification
- Renommer "Type" en "Template" dans le header du tableau
Ajout de 4 nouveaux templates de rappels
- Ajouter "Rappel 3", "Rappel 4", "Rappel 5", "Rappel 6" dans AdminEmailTemplates.tsx
- Ajouter les mêmes templates dans AdminRappels.tsx avec délais (14, 21, 30, 60 jours)
- Modifier initializeDefaultEmailTemplates dans db.ts pour créer ces templates basés sur Rappel 1
Correction erreur emailTemplates.getByType
- Modifier getEmailTemplateByType dans db.ts pour retourner null au lieu de undefined
Modification de la fenêtre de création des rappels
- Analyser le schéma actuel de la table rappels
- Ajouter un champ "timing" (pre_formation / post_formation) dans le schéma
- Appliquer la modification en base de données (ALTER TABLE)
- Modifier AdminRappels.tsx pour ajouter les radio buttons pré/post-formation
- Ajouter un champ de saisie du nombre de jours avec label dynamique
- Mettre à jour les procédures tRPC (create et update) pour gérer timing
Ajout de pièces jointes dans les rappels par email
- Modifier le schéma de la table rappels pour ajouter les champs de fichier (nomFichier, urlFichier, s3Key, typeFichier, tailleFichier)
- Appliquer la migration en base de données
- Créer un composant FileUpload pour l'upload de fichiers vers S3
- Modifier AdminRappels.tsx pour intégrer le composant d'upload
- Créer un endpoint API pour l.upload de fichiers vers S3
- Mettre à jour les procédures tRPC create et update pour gérer les fichiers
- Modifier le service d.envoi d.emails pour inclure les pièces jointes
- Tester l.upload et l.envoi d.emails avec pièce jointe
Correction affichage délai rappels post-formation
- Corriger l.affichage de la colonne "Délai" pour afficher J+X pour les rappels post-formation
- Tester l.affichage avec un rappel pré-formation et un rappel post-formation
Refonte système de rappels - Gestion par séquence
- Créer la table rappelSequences (relation many-to-many entre rappels et séquences)
- Appliquer la migration en base de données
- Créer un composant de sélection multi-séquences
- Modifier le formulaire AdminRappels pour intégrer le sélecteur de séquences
- Créer les fonctions DB pour gérer les associations rappel-séquence
- Mettre à jour les procédures tRPC create et update pour gérer les associations
- Modifier le scheduler pour ne traiter que les séquences associées à chaque rappel
- Adapter l'affichage du tableau pour montrer les séquences associées
- Tester la création d'un rappel avec sélection de séquences spécifiques
- Tester l'envoi automatique avec le nouveau système
Refonte granulaire : sélection par date de formation
- Modifier rappelSequences pour pointer vers dateFormationId au lieu de sequenceId
- Créer le composant DateFormationMultiSelect hiérarchique
- Intégrer le nouveau sélecteur dans AdminRappels
- Adapter les fonctions DB pour gérer dateFormationId
- Mettre à jour les procédures tRPC pour dateFormationId
- Modifier le scheduler pour filtrer par dateFormationId
- Tester la création avec dates spécifiques
- Vérifier l'affichage et l'édition
Améliorations tableau des rappels
- Renommer la colonne "Template" en "Template d'email"
- Ajouter une colonne "Dates concernées" avec formations, séquences et dates
- Modifier la procédure tRPC pour inclure les informations de dates
- Tester l'affichage avec plusieurs rappels
Améliorations avancées du tableau des rappels
- Ajouter des badges visuels Global/Ciblé dans la colonne Nom
- Implémenter les filtres par formation et séquence
- Créer la fonction d'export CSV des rappels
- Tester toutes les fonctionnalités
Cohérence visuelle des icônes
- Vérifier et corriger la couleur de l'icône corbeille (rouge) sur toutes les pages
- Vérifier et corriger la couleur de l'icône œil (bleu) sur toutes les pages
Colorisation des icônes du menu latéral
- Appliquer des couleurs par catégorie aux icônes du menu (Tableau de bord: bleu, Gestion: vert, Configuration: orange, Traçabilité: violet, Analyses: rose)
- Vérifier l'affichage visuel du menu colorisé
Amélioration visuelle de la colonne Dates concernées dans les rappels
- Ajouter des badges colorés pour distinguer formations, séquences et dates
- Utiliser des icônes pour identifier chaque type d'élément
- Améliorer la hiérarchie typographique pour faciliter la lecture
Colonne Rappels configurés dans la gestion des séquences
- Modifier le backend pour récupérer les rappels associés à chaque date
- Ajouter la colonne "Rappels configurés" dans le tableau des séquences
- Afficher les rappels avec badges visuels similaires à la page des rappels
Vues complète et réduite pour la gestion des séquences
- Ajouter un bouton de basculement entre vue complète et vue réduite
- Masquer les colonnes Lieu, Public cible, Formateur en vue réduite
- Simplifier l'affichage des rappels (supprimer "Date 1:", afficher sur une ligne)
Séparation des rappels pré et post-formation
- Séparer l'affichage des rappels en deux catégories (pré-formation et post-formation)
- Ajouter des labels visuels pour distinguer les deux types de rappels
Amélioration affichage des rappels dans les séquences
- Remplacer la colonne "Rappels configurés" par deux colonnes distinctes
- Créer colonne "Rappels pré-formation" avec badges bleus
- Créer colonne "Rappels post-formation" avec badges verts
- Tester l'affichage dans les vues complète et réduite
Restriction d'accès pour les formateurs
- Ajouter le rôle "formateur" dans la table users
- Modifier le menu DashboardLayout pour masquer Configuration et Traçabilité aux formateurs
- Filtrer les formations pour ne montrer que celles du formateur connecté
- Filtrer les séquences pour ne montrer que celles du formateur connecté
- Filtrer les apprenants pour ne montrer que ceux inscrits aux séquences du formateur
- Créer une procédure backend pour vérifier si un utilisateur est formateur
- Tester avec un compte formateur
Tableau de bord personnalisé pour formateurs
- Créer les procédures backend pour récupérer les prochaines séquences du formateur
- Créer les procédures backend pour calculer les statistiques du formateur
- Créer la page FormateurDashboard avec cartes de statistiques
- Afficher la liste des prochaines séquences avec nombre d'inscrits
- Afficher les rappels à venir pour chaque séquence
- Modifier DashboardLayout pour rediriger les formateurs vers /formateur/dashboard
Notifications automatiques pour formateurs
- Envoyer une notification au formateur lors d'une nouvelle inscription
- Envoyer une notification au formateur lors d'une annulation
- Envoyer une notification au formateur quand la capacité maximale est atteinte
- Envoyer une notification au formateur quand une place se libère
- Intégrer les notifications dans les mutations d'inscription existantes
Bug à corriger
- Corriger l'affichage du menu latéral pour les formateurs (menu invisible actuellement)
Erreurs TypeScript à corriger pour publication
- Corriger l'erreur dans AdminSequences.tsx (propriété formateur manquante)
- Corriger les erreurs dans QuestionnaireReponse.tsx (questionnaire possibly null)
Émargement numérique et attestations automatiques
Schéma de base de données
- Créer la table presences (inscription, date, heurePresence, modeValidation)
- Créer la table attestations (inscription, sequence, dateGeneration, pdfUrl)
- Ajouter le champ qrCodeToken dans la table sequences
Backend
- Créer les procédures tRPC pour les présences (valider, lister, exporter)
- Créer les procédures tRPC pour les attestations (générer, télécharger, lister)
- Implémenter la génération de QR code unique par séquence
- Implémenter la génération de PDF d'attestation avec logo Itinova
- Créer la fonction d'envoi automatique d'attestation par email
Interface formateur
- Créer la page FormateurEmargement avec affichage QR code
- Ajouter la liste des apprenants avec statut de présence
- Permettre la validation manuelle de présence
- Afficher l'historique des présences par date
Interface publique
- Créer la page publique de scan QR code (/emargement/:token)
- Implémenter le scan avec la caméra du téléphone
- Afficher la confirmation de présence validée
- Gérer les erreurs (token invalide, déjà émargé, etc.)
Génération d'attestations
- Créer le template PDF d'attestation personnalisable
- Générer automatiquement après validation de toutes les présences
- Envoyer par email aux apprenants
- Permettre le téléchargement depuis l'espace formateur
Corrections techniques
-
Corriger le problème d'aperçu de l'application (erreurs TypeScript)
-
Corriger les références à heureDebut/heureFin dans AdminRappels.tsx
-
Corriger l'accès à la propriété dates dans EmargementScan.tsx
-
Corriger l'import manquant de QrCode dans DashboardLayout.tsx
-
Corriger les erreurs TypeScript dans DashboardLayout.tsx (subItems)
-
Ajouter downlevelIteration dans tsconfig.json
-
Corriger l'utilisation de Set dans DateFormationMultiSelect.tsx
-
Corriger l'appel à createAttestation (utiliser enregistrerAttestation)
-
Corriger le lien QR code pour utiliser l'URL publique au lieu de localhost
Page de paramètres de l'application
-
Créer la table parametres dans la base de données
-
Créer les procédures tRPC pour gérer les paramètres
-
Créer la page AdminParametres
-
Ajouter le lien dans le menu après "Configuration SMTP"
-
Modifier qrCodeGenerator pour utiliser l'URL de la BDD
-
Définir l'URL par défaut : https://formations.itinova.org
-
Ajouter DashboardLayout à la page AdminParametres
-
Ajouter DashboardLayout à la page FormateurEmargement
Améliorations page Paramètres
- Ajouter les champs dans la table parametres : delaiExpirationQR, dureeValiditeToken, notificationsActives
- Créer la table historiqueParametres pour tracer les modifications
- Créer les fonctions backend pour gérer les nouveaux paramètres
- Créer la procédure tRPC pour tester l'accessibilité d'une URL
- Créer la procédure tRPC pour récupérer l'historique des modifications
- Mettre à jour l'interface AdminParametres avec les nouveaux champs
- Ajouter le bouton "Tester l'URL" avec indicateur de statut
- Ajouter une section "Historique des modifications" dans la page
- Tester toutes les fonctionnalités
Correction menu de navigation formateur
- Identifier les pages formateur sans DashboardLayout
- Ajouter DashboardLayout à toutes les pages formateur
- Vérifier que le menu s'affiche correctement pour le rôle formateur
- Tester la navigation dans l'espace formateur
Correction colonnes manquantes dans les tables
- Vérifier les colonnes manquantes dans la table apprenants
- Vérifier les colonnes manquantes dans la table sequences
- Ajouter les colonnes manquantes via SQL
- Tester les requêtes sur le dashboard admin
Correction table rappels
- Vérifier les noms de colonnes dans la table rappels
- Corriger le schéma Drizzle pour correspondre à la base de données
- Tester les requêtes sur la page Rappels
Améliorations attestations de formation
Base de données
- Ajouter le paramètre envoiAutomatiqueAttestations dans la table parametres
- Créer la table historiqueAttestations pour tracer les envois
Backend
- Créer les fonctions de gestion du paramètre d'envoi automatique
- Créer les procédures tRPC pour l'historique des attestations
- Créer la procédure de prévisualisation du PDF
Frontend
- Ajouter le toggle d'envoi automatique dans AdminParametres
- Ajouter la prévisualisation PDF dans AdminAttestations
- Créer la page HistoriqueAttestations dans Traçabilité
- Ajouter le lien dans le menu de navigation
Tes### Tests
- Tester le paramètre d'envoi automatique
- Tester la prévisualisation du modèle
- Tester la page d'historique
Gestion des attestations de formation (Nouvelle page dans Gestion)
Phase 1 : Schéma de base de données
- Ajouter les colonnes dans la table formations : modeAttestation (ENUM: 'auto', 'manuel'), modeEnvoi (ENUM: 'auto', 'manuel')
- Modifier la table attestations pour supporter les documents uploadés manuellement
- Ajouter les colonnes : documentUrl, documentS3Key, uploadedBy, uploadedAt
Phase 2 : Backend
- Créer les procédures tRPC pour configurer le mode par formation
- Créer les procédures pour uploader des documents par apprenant
- Créer la procédure pour envoyer manuellement une attestation
- Créer la procédure pour lister les attestations par formation avec filtres
Phase 3 : Interface utilisateur
- Créer la page AdminGestionAttestations dans le menu Gestion
- Ajouter la sélection de formation avec configuration des modes
- Créer l'interface d'upload de documents par apprenant
- Ajouter les boutons de prévisualisation et d'envoi manuel
- Créer le tableau des apprenants avec statut des attestations
Phase 4 : Tests
- Tester la configuration par formation
- Tester l'upload de documents
- Tester la prévisualisation
- Tester l'envoi manuel
Retrait du paramètre d'envoi automatique de la page Paramètres
- Retirer le paramètre d'envoi automatique des attestations de la fenêtre des paramètres (maintenant géré dans la gestion des attestations)
Finalisation du retrait du paramètre d'envoi automatique
- Vérifier la cohérence des paramètres dans la page de gestion des attestations
- Retirer le champ envoiAutomatiqueAttestations de la table parametres dans le schéma
- Mettre à jour les procédures tRPC liées aux paramètres
- Tester le workflow complet de configuration et d'envoi automatique des attestations
Améliorations techniques et documentation
- Corriger les erreurs TypeScript liées aux types templateType dans les rappels
- Nettoyer les fichiers de migration Drizzle pour éviter les conflits
- Créer un guide utilisateur pour la configuration des attestations
Bug : Erreur replaceVariables
- Corriger l'erreur "Cannot read properties of undefined (reading 'replace')" dans AdminEmailTemplates.tsx
Ajout template Réinitialisation mot de passe
- Ajouter le type reset_password au schéma Drizzle
- Modifier l'enum dans la base de données
- Mettre à jour le code frontend
- Créer le template par défaut
- Corriger le bug de mise à jour du type de template lors du changement de sélection dans AdminEmailTemplates.tsx
- Corriger le bug nécessitant deux clics pour mettre à jour le template (ajout de key pour forcer remontage)
- Corriger l'erreur SQL dans la modification de configuration SMTP (correction du schéma emailConfig)
- Corriger l'erreur de type dans la modification des séquences (formateurId string au lieu de number)
- Corriger la conservation de la date de blocage lors de la modification des séquences (ajout du champ dans le schéma Drizzle)
- Corriger les rappels envoyés plusieurs fois et l'historique vide (nettoyage de la table logsRappels)
Nouvelles fonctionnalités à implémenter
- Créer la table passwordResetTokens dans le schéma Drizzle
- Implémenter la route backend pour demander une réinitialisation de mot de passe
- Implémenter la route backend pour valider le token et réinitialiser le mot de passe
- Créer la page frontend de demande de réinitialisation
- Créer la page frontend de réinitialisation avec token
- Ajouter le bouton "Tester le rappel" dans AdminSequences.tsx
- Corriger les erreurs TypeScript dans les fonctions de gestion des présences
- Corriger les erreurs TypeScript dans les fonctions de gestion des logs
- Corriger l'erreur de validation du type de rappel dans la procédure testerRappel (typeRappel invalide)
- Corriger l'erreur "Cannot read properties of undefined (reading 'replace')" lors de l'envoi de test de rappel
- Améliorer le bouton "Tester le rappel" pour utiliser automatiquement le bon template configuré pour la séquence (au lieu de toujours envoyer rappel J-7)
- Modifier la procédure testerRappel pour envoyer le rappel à tous les inscrits confirmés (au lieu du premier uniquement)
- Corriger le problème "undefined" au début du texte dans le template de rappel 3
- Ajouter un headerTitle par défaut au template "rappel 3"
- Créer la page /forgot-password pour demander la réinitialisation de mot de passe
- Créer la page /reset-password/:token pour définir le nouveau mot de passe
- Installer le module bcrypt sur le VPS pour activer la réinitialisation de mot de passe (temporairement désactivé en attendant la résolution du problème de store pnpm)
- Corriger l'erreur "(void 0) is not a function" sur la page de réinitialisation de mot de passe
- Corriger le problème des rappels envoyés en boucle (non enregistrés dans l'historique)
- Modifier la page AdminSequences pour ouvrir en vue réduite par défaut
- Modifier le DashboardLayout pour réduire tous les menus sauf "Gestion" à la connexion
- Supprimer les boutons "Aperçu rappel J-7", "Envoyer rappel J-7", "Aperçu rappel J-1", "Envoyer rappel J-1" de la fenêtre de détails des séquences
- Corriger le bouton "Tester le rappel" pour enregistrer les envois dans l'historique des rappels (table logsRappels)
- Corriger l'enregistrement des logs de rappels : type erroné (J-1 au lieu de J+2), statut erroné (success/failed au lieu de succes/echec), email erroné (emailDestinataire au lieu de email)
- Ajouter une colonne "Type d'envoi" avec badge coloré dans l'interface d'historique des rappels
- Nettoyer les anciens logs erronés de la base de données
- Corriger les erreurs TypeScript critiques liées aux types null/undefined (réduction de 115 à 88 erreurs)
- Diagnostiquer pourquoi le rappel J+2 pour la séquence Test3 n'a pas été envoyé à opareige@gmail.com (déjà envoyé automatiquement)
- Corriger l'erreur de connexion à la base de données qui empêche adminServFormation de se connecter (PM2 ne chargeait pas le fichier .env)
- Ajouter un bouton pour vider la table des logs d'historique des rappels avec une boîte de dialogue de confirmation
- Diagnostiquer et corriger pourquoi le rappel J+2 automatique pour la séquence TEST 3 n'est toujours pas envoyé à opareige@gmail.com (problème de casse MySQL)
- Diagnostiquer et corriger pourquoi les emails de rappel automatiques ne sont pas reçus (code du scheduler ne gérait pas rappel3, rappel4, etc.)
- Diagnostiquer et corriger pourquoi le rappel J+2 automatique pour la séquence TEST 3 n'est toujours pas envoyé à opareige@gmail.com (problème de casse MySQL)
- Simplifier le code du scheduler pour utiliser uniquement sendRappelEmail de manière générique pour tous les types de rappels
- Corriger le schéma Drizzle pour utiliser des noms de tables en minuscules (logsrappels au lieu de logsRappels)
- Tester que tous les types de rappels fonctionnent correctement
- Corriger le problème du bouton de vidage de l'historique des rappels qui ne fonctionne plus (nom de table incorrect)
- Déployer l'intégralité du projet mis à jour sur le VPS (bouton de suppression des rappels et toutes les fonctionnalités manquantes)
- Configurer l'upload de fichiers pour utiliser le stockage local sur le VPS au lieu du service S3
- Corriger l'erreur d'upload de fichier depuis le navigateur sur le VPS (augmentation de la limite Nginx à 10 Mo)
- Ajouter une colonne dans le tableau de gestion des rappels pour indiquer la présence d'une pièce jointe
- Corriger la détection de la pièce jointe dans le tableau des rappels (vérification de nomFichier et urlFichier au lieu de pieceJointe)
- Corriger l'envoi de la pièce jointe dans les emails de rappel (support des fichiers locaux et S3)
- Corriger la corruption de la pièce jointe lors de l'envoi par email (ajout de l'encoding base64 pour SMTP/Nodemailer)
- Modifier le comportement par défaut des menus de la sidebar : tous repliés à la connexion sauf le menu "Gestion" (MENU_VERSION incrémentée à 5)
- Modifier le comportement des menus de la sidebar en mode accordéon : lorsqu'un menu s'ouvre, les autres se replient automatiquement
- Implémenter la fonctionnalité du bouton "Charger" dans la gestion des attestations de formation (upload de PDF avec validation)
- Corriger l'erreur "No procedure found on path attestations.uploadDocument" lors de l'upload d'attestations (utilisation de gestionAttestations.uploadDocument)
- Corriger l'erreur SQL "Failed query: insert into attestations" lors de l'upload d'attestation manuelle (ajout de apprenantId et sequenceId)
- Corriger l'erreur "refetchInscrits is not defined" lors de l'upload d'attestation manuelle (remplacement par refetchApprenants)
- Corriger l'erreur "aucune attestation disponible pour cet apprenant" lors de l'envoi manuel d'une attestation uploadée (vérification de documentUrl ou urlPdf)
- Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement
- Permettre le renvoi d'une attestation même après qu'elle ait été envoyée (afficher bouton Renvoyer au lieu de masquer Envoyer)
- Corriger l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec un chemin local (gérer les chemins locaux et URLs complètes)
- Corriger le bouton Renvoyer inactif dans la gestion des attestations (correction selectedSequenceId -> apprenant.sequence.id)
- Corriger le problème d'envoi automatique des rappels qui ne se déclenchent pas à l'heure programmée (ajout vérification heure + intervalle 15 min au lieu de 1h)
- Ajouter un bouton "Tout renvoyer" pour envoyer en masse toutes les attestations chargées manuellement sur une séquence
- Corriger le scheduler de rappels qui ne trouve aucune date de formation (utilisation table rappelDates + correction heureEnvoi)
- Augmenter la tolérance du scheduler de rappels de 20 à 30 minutes pour couvrir 2 cycles de vérification
- Vérifier l'heure configurée en base de données pour le rappel J+2
- Diagnostiquer et résoudre le problème de connexion SSH au VPS depuis le sandbox (résolu après modifications config SSH)
- Identifier la cause de l'erreur "banner line contains invalid characters"
- Optimiser la sécurité SSH avec Fail2Ban renforcé (maxretry=3, bantime=3600)
- Créer une whitelist d'IPs de confiance pour éviter les blocages
- Créer les fonctions backend pour récupérer les données Fail2Ban (IPs bannies, statistiques)
- Créer l'interface admin du tableau de bord Fail2Ban avec possibilité de débannir
- Implémenter le système d'alertes email pour les attaques massives (>10 IPs/heure)
- Tester et déployer le monitoring Fail2Ban sur le VPS
- Créer une nouvelle section "Gestion technique" dans le menu de navigation
- Déplacer "Sécurité SSH (Fail2Ban)" de Configuration vers Gestion technique
- Intégrer la page AdminFail2Ban dans DashboardLayout pour afficher le menu latéral
- Déplacer la section "Gestion technique" en dernière position du menu
- Corriger le problème d'affichage vide du menu Gestion technique (rebuild forcé)
- Redéployer correctement DashboardLayout.tsx sur le VPS avec Gestion technique en dernier
- Corriger l'erreur qui cause l'affichage d'une page vide sur le VPS
- Identifier les 5 erreurs TypeScript les plus critiques
- Corriger les erreurs TypeScript critiques identifiées (89 → 78 erreurs)
- Déployer les corrections TypeScript sur le VPS
- Vérifier le schéma de la table logsrappels dans la base de données
- Exécuter la migration de base de données si nécessaire
- Analyser la correspondance entre types de rappels et templates d'emails
- Corriger l'enum de la colonne type dans logsrappels si nécessaire
Correction cohérence types de rappels
- Analyser la correspondance entre types de rappels et templates d'emails
- Renommer rappel → rappel1 et rappelJ1 → rappel2 dans le schéma Drizzle
- Mettre à jour tous les fichiers utilisant rappel et rappelJ1
- Modifier l'enum dans la base de données MySQL
- Déployer et tester les corrections
Correction colonne statut dans envoisQuestionnaires
- Analyser le schéma Drizzle de la table envoisQuestionnaires
- Vérifier la structure de la table dans la base de données MySQL
- Créer le script SQL pour ajouter la colonne statut
- Exécuter la migration sur le VPS
- Déployer et tester
Correction affichage nombre de dates sélectionnées
- Analyser le code de la boîte de dialogue de modification des rappels
- Identifier le bug de comptage des dates sélectionnées (références orphelines)
- Nettoyer les références orphelines dans rappelDates
- Ajouter les contraintes de clé étrangère pour éviter le problème
- Tester et déployer
Amélioration affichage pièce jointe dans configuration rappels
- Analyser l'affichage actuel de la pièce jointe dans AdminRappels
- Ajouter une icône colorée (vert pour OUI, gris pour NON)
- Tester l'affichage
- Déployer sur le VPS
Améliorations supplémentaires affichage pièces jointes
- Changer la couleur du badge "Non" en rouge (au lieu de gris)
- Ajouter un tooltip au survol du badge "Oui" avec nom et taille du fichier
- Rendre le badge "Oui" cliquable pour télécharger directement la pièce jointe
- Tester les fonctionnalités
- Déployer sur le VPS
Alternance de couleurs sur tableau des rappels
- Ajouter une classe CSS pour l'alternance de couleurs (zebra striping)
- Appliquer la classe aux lignes du tableau
- Tester le rendu visuel
- Déployer sur le VPS
Changement couleur alternance tableau rappels
- Remplacer le gris par un bleu légèrement soutenu (bg-blue-50/70)
- Déployer sur le VPS
Correction erreur validation création rappel
- Identifier la source de l'erreur de validation templateType
- Corriger la validation pour accepter rappel1-6 au lieu de rappel/rappelJ1
- Tester la création d'un rappel
- Déployer sur le VPS
Recherche exhaustive des enums de types de rappels
- Rechercher tous les enums dans le code (backend + frontend)
- Corriger tous les endroits manqués (TEMPLATE_TYPES dans AdminRappels.tsx)
- Déployer et tester
Ajout manuel d'apprenant dans la fenêtre "Inscrits à la séquence"
- Analyser la fenêtre des inscrits (AdminSequenceInscrits.tsx)
- Ajouter un bouton "Ajouter un inscrit" avec icône UserPlus dans le header
- Créer un dialogue de sélection d'apprenant (AddInscritForm.tsx)
- Implémenter la mutation backend inscriptions.create
- Tester l'ajout manuel
- Déployer sur le VPS
Correction erreur validation modification template "Rappel 1"
- Rechercher tous les enums de types de templates dans le code
- Corriger les enums manqués dans AdminEmailTemplates.tsx (types ET liste déroulante)
- Déployer
- Mettre à jour les données dans la table emailTemplates (déjà fait lors de la migration précédente)
- Tester
Restauration boutons d'ajout de balises dans templates
- Identifier pourquoi les boutons ont disparu
- Restaurer les boutons
- Déployer et tester
Renommage bouton ajout d'apprenant
- Renommer "Ajouter un inscrit" en "Ajouter un apprenant"
- Ajouter précision dans la boîte de dialogue
- Déployer et tester
Alternance de couleurs blanc/bleu sur tous les tableaux
- Liste des formations
- Liste des séquences
- Liste des apprenants
- Liste des inscrits (fenêtre gestion des attestations)
- Liste des utilisateurs
- Liste des formateurs
- Déployer et tester
Refonte ergonomie du tableau de bord
- Analyser le tableau de bord actuel (Admin.tsx)
- Créer nouvelle version avec icônes modernes et colorées
- Ajouter liserés colorés sur les cartes
- Implémenter animations au survol et au chargement
- Améliorer la palette de couleurs
- Tester sur sandbox
- Déployer après validation utilisateur
Refonte ergonomie du menu latéral accordéon
- Analyser le menu latéral actuel (DashboardLayout.tsx)
- Créer nouvelle version avec icônes colorées et animations
- Ajouter effets hover et transitions fluides
- Implémenter indicateur de page active
- Améliorer les couleurs et gradients
- Tester sur sandbox
- Déployer après validation utilisateur
Correction bug page émargement formateur
- Analyser l'erreur "Cannot convert undefined or null to object"
- Identifier la requête tRPC qui échoue
- Corriger le bug
- Tester la correction
Harmonisation tableau de bord avec palette pastel
- Adapter les couleurs des cartes statistiques en pastel
- Harmoniser les gradients avec le menu latéral
- Tester sur sandbox
Correction bug page suivi questionnaires
- Analyser l'erreur "Cannot convert undefined or null to object"
- Identifier la requête tRPC qui échoue
- Corriger le bug
- Tester la correction
Correction erreurs SQL suivi questionnaires
- Analyser les erreurs SQL (champs manquants dans WHERE)
- Identifier les requêtes concernées dans server/routers.ts
- Corriger les requêtes SQL
- Tester les corrections
Déploiement VPS de toutes les améliorations
- Identifier tous les fichiers modifiés
- Déployer les fichiers sur le VPS
- Rebuild et redémarrer l'application
- Vérifier le déploiement
Suppression mention rappel 7 jours dans message inscription
- Supprimer la ligne "Un email de rappel vous sera envoyé 7 jours avant la formation"
- Déployer sur le VPS
Correction erreur mutation formateurs
- Analyser l'erreur "Unexpected token '<', '<!doctype'..."
- Identifier la mutation concernée
- Corriger le bug côté serveur
- Tester la correction
Correction erreur insertion passwordResetTokens
- Analyser l'erreur SQL d'insertion
- Identifier le problème (email au lieu de userId ?)
- Corriger le bug
- Tester la correction
Harmonisation charte graphique des titres
- Identifier toutes les pages avec titres noirs
- Appliquer le style bleu clair avec ombre (comme "Tableau de bord")
- Tester sur sandbox
Correction erreurs page rapport-public-cible
- Analyser les erreurs SQL DATE_FORMAT
- Corriger l'erreur React "Cannot read properties of null (reading 'fonction')"
- Corriger l'erreur "Cannot convert undefined or null to object"
- Tester les corrections sur sandbox
Correction erreurs Fail2Ban et SQL DATE_FORMAT
- Analyser l'erreur "Impossible de récupérer le statut Fail2Ban"
- Corriger l'erreur SQL DATE_FORMAT dans getInscriptionsByMonth
- Tester les corrections sur sandbox
Correction erreur page notifications
- Analyser l'erreur "Cannot convert undefined or null to object"
- Corriger l'erreur dans le code
- Tester la correction sur sandbox
Harmonisation des titres de pages
- Appliquer le style CSS bleu clair avec ombre portée au titre "Tableau de bord des Notifications"
- Appliquer le style CSS bleu clair avec ombre portée au titre "Gestion des formateurs"
- Tester les modifications sur sandbox
Déploiement sur le serveur de production
- Se connecter au serveur de production via SSH
- Transférer les fichiers modifiés (AdminNotifications.tsx, AdminFormateurs.tsx)
- Redémarrer les services Node.js
- Vérifier que le déploiement fonctionne correctement
Déploiement sur le serveur de production
- Se connecter au serveur de production via SSH
- Transférer les fichiers modifiés (AdminNotifications.tsx, AdminFormateurs.tsx)
- Redémarrer les services Node.js
- Vérifier que le déploiement fonctionne correctement (PROBLÈME: modifications non visibles)
- Identifier la cause du problème (classes Tailwind arbitraires non compilées)
- Corriger et redéployer (utilisation de la classe .page-title dans index.css)
Modification affichage rappels automatiques
- Analyser la structure actuelle de la fenêtre des rappels automatiques
- Regrouper les informations de la même formation/séquence sur une seule ligne
- Resserrer les colonnes pour une meilleure lisibilité
- Tester les modifications sur sandbox
- Déployer sur le serveur de production
Amélioration visuelle rappels automatiques
- Ajouter les icônes colorées (badges) pour formation et séquence
- Conserver le format compact sur une seule ligne
- Tester les modifications sur sandbox
- Déployer sur le serveur de production
Ajout badges pour les dates
- Ajouter des badges colorés pour chaque date
- Tester les modifications sur sandbox
- Déployer sur le serveur de production
Coloration bouton Charger attestations
- Localiser le bouton "Charger" dans la gestion des attestations
- Modifier la couleur du bouton en bleu
- Tester la modification sur sandbox
- Déployer sur le serveur de production
Harmonisation boutons Prévisualiser et Envoyer
- Modifier le bouton "Prévisualiser" en bleu
- Modifier le bouton "Envoyer" en bleu
- Tester les modifications sur sandbox
Ajout indicateur de progression upload PDF
- Ajouter un état de progression dans le composant
- Afficher une barre de progression pendant l'upload
- Tester l'indicateur de progression (visible lors de l'upload)
Correction erreur logsRappels
- Analyser l'erreur "Unknown column 'type'" dans logsRappels
- Corriger le schéma de la table logsRappels (colonne déjà présente)
- Tester la correction (erreur devrait disparaître après redémarrage)
Déploiement final
- Déployer toutes les modifications sur le serveur de production
Coloration colonne Type historique rappels
- Localiser la colonne Type dans l'historique des rappels
- Ajouter un badge orange pâle pour les types de rappels
- Tester la modification sur sandbox (pas de données dans sandbox)
- Déployer sur le serveur de production
Correction historique rappels vide
- Vérifier les données dans la table logsRappels
- Analyser le code de requête de l'historique (erreur: colonne 'type' manquante)
- Identifier et corriger le problème (ajout de la colonne 'type')
- Tester la correction sur sandbox
Correction erreur insertion logsrappels
-
Analyser l'erreur d'insertion dans logsrappels
-
Identifier le problème (ENUM type incompatible)
-
Mettre à jour le schéma sandbox pour correspondre au VPS
-
Tester l'envoi de rappels
-
Corriger l'enregistrement des logs de rappels (table logsrappels reste vide après test)
-
Ajouter une boîte de dialogue de confirmation avant l'envoi de test des rappels
-
Modifier la boîte de dialogue de test de rappels pour permettre de saisir l'email du destinataire
-
Modifier le test de rappels pour envoyer un email par inscrit à l'adresse de test avec indicateur de progression
-
Ajouter un compteur de progression X/Y dans l'indicateur visuel du test de rappels
-
Corriger l'erreur 'Aucun rappel actif configuré' lors du test de rappels
-
Désactiver visuellement le bouton de test pour les séquences sans rappels actifs
-
Ajouter un badge de compteur sur le bouton de test indiquant le nombre de rappels actifs
-
Corriger l'erreur 'Unexpected token' lors de la mutation API sur /admin/sequences
-
Corriger l'erreur dans le fichier ICS qui empêche l'importation dans Outlook
-
Ajouter validation date fin > date début dans la boîte de dialogue de modification des séquences
-
Ajouter une validation frontend en temps réel dans les champs de date pour afficher un message d'erreur immédiat
-
Restreindre les droits des formateurs (pas de modification/suppression de formations et séquences)
-
Restreindre les droits des formateurs pour qu'ils ne puissent pas créer/modifier/supprimer des apprenants
Autoriser les formateurs à accéder aux exports et feuilles de présence
- Identifier les procédures backend concernées (exports PDF/Excel, feuille de présence)
- Modifier les restrictions pour autoriser les formateurs
- Tester les modifications
- Déployer sur le VPS
Corriger l'accès des formateurs à la liste des inscrits
- Identifier les procédures concernées (listBySequence, getWithDates)
- Remplacer adminProcedure par protectedProcedure
- Déployer sur le VPS
Masquer le menu "Gestion technique" pour les formateurs
- Identifier le composant DashboardLayout où le menu est défini
- Ajouter une condition isAdmin pour masquer la section Gestion technique
- Tester et déployer sur le VPS