Files
formation-manager-itinova/todo.md

71 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

Synchronisation entre table users (rôle formateur) et table formateurs

  • Analyser la structure des deux tables
  • Comprendre la relation entre users.role='formateur' et la table formateurs
  • Proposer une solution pour synchroniser ou clarifier l'usage
  • Implémenter la solution (auto-création dans createUser et updateUser)
  • Créer un script de migration pour les formateurs existants
  • Déployer sur le VPS et exécuter la migration

Corriger la désactivation des rappels lors du changement de formateur

  • Identifier le code de modification de séquence qui désactive les rappels
  • Corriger pour ne désactiver que lors de changement de dates
  • Tester la modification
  • Déployer sur le VPS

Créer un tableau de bord spécifique pour les formateurs

  • Analyser le tableau de bord actuel (Admin.tsx)
  • Vérifier les procédures backend existantes (déjà présentes)
  • Réécrire FormateurDashboard.tsx avec le même design moderne
  • Vérifier la route dans App.tsx (déjà présente)
  • Ajouter la redirection automatique des formateurs vers /formateur
  • Déployer sur le VPS

Coloriser les boutons d'actions de la fenêtre "Inscrits à la séquence"

  • Identifier le fichier AdminSequenceInscrits.tsx
  • Appliquer des couleurs pastel aux boutons d'actions
  • Déployer sur le VPS

Permettre deux signatures par jour pour l'émargement (matin et après-midi)

  • Analyser le système d'émargement actuel (schéma DB, backend, frontend)
  • Modifier le schéma de base de données pour ajouter un champ "periode" (matin/apres-midi)
  • Adapter les procédures backend pour gérer les deux périodes
  • Modifier l'interface d'émargement pour proposer le choix matin/après-midi (EmargementScan + FormateurEmargement)
  • Vérifier l'export de feuille de présence (déjà configuré avec deux colonnes)
  • Déployer sur le VPS

Corriger l'affichage vide de la liste des apprenants dans la gestion des attestations pour les formateurs

  • Identifier le fichier de gestion des attestations
  • Analyser les procédures backend concernées
  • Corriger les restrictions d'accès pour les formateurs (getApprenantsWithStatus)
  • Déployer sur le VPS

Regrouper les apprenants par séquence dans la gestion des attestations

  • Analyser l'affichage actuel (regroupement par formation)
  • Vérifier le backend (données de séquence déjà présentes)
  • Adapter l'interface pour afficher les apprenants regroupés par séquence
  • Déployer sur le VPS

Trier les séquences par ordre chronologique dans la gestion des attestations

  • Modifier le backend pour inclure la première date de chaque séquence
  • Adapter le frontend pour trier les séquences par date
  • Déployer sur le VPS

Corriger l'affichage vide de la liste des apprenants après le tri chronologique

  • Identifier la cause du problème (structure imbriquée Drizzle ORM)
  • Corriger le code backend (aplatir la structure de la requête)
  • Corriger le code frontend (utiliser l'ID de séquence pour le tri)
  • Déployer sur le VPS
  • Corriger le bouton "œil" dans la page apprenants (formateur) qui n'affiche pas le détail
  • Corriger la page vide lors de l'émargement via QR code sur smartphone
  • Ajouter confirmation visuelle après émargement réussi (animation + heure)
  • Implémenter signature manuscrite sur smartphone pour attestations (annulé - changement de besoin)
  • Implémenter signature manuscrite tactile pour émargement via QR code

Signature tactile pour émargement via QR code

  • Créer le composant SignaturePad avec signature_pad
  • Ajouter les champs de signature dans la table presences (signatureUrl, signatureS3Key, dateSigned)
  • Intégrer SignaturePad dans EmargementScan.tsx
  • Modifier presences.valider pour accepter signatureDataUrl
  • Uploader la signature en stockage local lors de la validation (S3 abandonné pour DNS)
  • Stocker l'URL dans la base de données
  • Afficher les informations de signature dans l'émargement formateur
  • Ajouter une modale pour visualiser les signatures en grand format
  • Corriger le problème Drizzle ORM avec sql.raw pour les colonnes de signature
  • Déployer sur le VPS (formations.itinova.org)
  • Retirer les logs de debug
  • Intégrer les signatures dans la feuille de présence PDF (optionnel)
  • Tester le flux complet sur smartphone
  • Déployer sur le VPS

Stockage local des signatures d'émargement

  • Modifier routers.ts pour stocker les signatures localement au lieu de S3
  • Créer la structure de dossiers uploads/signatures/[formation-id]-[sequence-id]/
  • Générer des noms de fichiers uniques pour chaque signature
  • Configurer Nginx pour servir les fichiers de signatures
  • Tester le flux complet sur le VPS

Affichage des signatures dans l'émargement numérique

  • Modifier l'API pour récupérer les présences avec signatures
  • Afficher nom du signataire, date/heure et icône à côté de chaque puce matin/après-midi
  • Ajouter une modale pour visualiser la signature en grand format
  • Tester l'affichage sur smartphone
  • Déployer sur le VPS

BUG: Signatures non enregistrées lors de la validation

  • Vérifier les logs serveur lors de la validation avec signature
  • Vérifier le code d'upload de signature dans routers.ts
  • Vérifier que signatureUrl et signatureS3Key sont bien enregistrés en base
  • Corriger le problème (ajouter les champs dans getPresencesBySequence)
  • Déployer sur VPS
  • Tester l'affichage des icônes

BUG CRITIQUE: Informations de validation disparues à nouveau

  • Vérifier les logs navigateur pour erreurs JavaScript
  • Vérifier si l'API retourne bien les données
  • Comparer le code actuel avec la version qui fonctionnait
  • Corriger de manière définitive et robuste
  • Tester localement avant déploiement (fonctionne en local)
  • Déployer sur VPS (rebuild complet effectué)
  • Tester sur VPS après rebuild

Intégration des signatures dans les feuilles de présence PDF

  • Analyser le code actuel de génération des feuilles de présence PDF
  • Modifier exportService.ts pour charger les images de signatures
  • Intégrer les signatures dans le layout du PDF (colonnes Matin/Après-midi)
  • Gérer les cas où la signature n'existe pas (affichage vide)
  • Modifier routers.ts pour récupérer les présences avec signatures
  • Tester la génération avec et sans signatures (code implémenté, test utilisateur requis)
  • Vérifier la qualité et la taille des signatures dans le PDF (test utilisateur requis)
  • Créer un checkpoint

Déploiement VPS - Intégration signatures PDF

  • Se connecter au VPS en SSH
  • Copier server/exportService.ts vers le VPS
  • Copier server/routers.ts vers le VPS
  • Redémarrer l'application avec PM2
  • Vérifier que l'application fonctionne correctement
  • Tester l'export PDF avec signatures sur production (test utilisateur requis)

Bug - Signatures manquantes dans PDF

  • Analyser pourquoi les signatures n'apparaissent pas dans le PDF généré
  • Vérifier la logique de correspondance entre présences et dates
  • Problème identifié : utilisation de dateInfo.ordre au lieu de dateInfo.id
  • Corriger le code (exportService.ts et routers.ts)
  • Ajouter l'ID de la date dans l'interface FeuillePresenceInfo
  • Corriger la logique de recherche des présences
  • Déployer sur VPS
  • Tester la génération PDF avec signatures (test utilisateur requis)

Bug VPS - Signatures toujours manquantes dans PDF

  • Vérifier l'existence des fichiers de signatures sur le VPS
  • Vérifier les chemins d'accès aux fichiers
  • Ajouter des logs de debug dans exportService.ts
  • Identifier le problème exact (fichiers manquants, chemin incorrect, erreur de lecture)
  • Corriger le problème
  • Redéployer et tester

Ajout signatures après-midi dans PDF

  • Modifier exportService.ts pour chercher les présences après-midi
  • Afficher les signatures après-midi dans la colonne correspondante
  • Corriger le bug apres-midi vs apres_midi (underscore vs tiret)
  • Déployer sur VPS
  • Tester avec une séquence ayant des signatures matin et après-midi
  • Retirer les logs de debug
  • Déployer la version finale sur VPS
  • Créer un checkpoint final

Évolution rappels - 2 pièces jointes

  • Analyser le schéma actuel de la table rappels
  • Planifier la migration pour passer de 1 à 2 pièces jointes
  • Modifier le schéma Drizzle (drizzle/schema.ts)
  • Créer et appliquer la migration SQL en local
  • Adapter le backend (emailService.ts, rappelScheduler.ts, routers.ts, db.ts)
  • Adapter le frontend (AdminRappels.tsx)
  • Tester localement avec rappels existants
  • Déployer sur VPS avec migration
  • Vérifier que les rappels existants sont préservés (migration additive)
  • Créer un checkpoint

Bug - Labels pièces jointes dupliqués

  • Identifier pourquoi les labels apparaissent en double (FileUpload affiche déjà un label)
  • Ajouter un prop label au composant FileUpload
  • Corriger l'affichage dans AdminRappels.tsx
  • Déployer sur VPS
  • Créer un checkpoint

Bug - Deuxième pièce jointe non envoyée

  • Vérifier le code d'envoi des emails de rappel
  • Identifier pourquoi seule la première pièce jointe est envoyée (paramètres manquants dans routers.ts)
  • Corriger le code pour envoyer les 2 pièces jointes
  • Déployer sur VPS
  • Tester l'envoi avec 2 pièces jointes (test utilisateur validé)
  • Créer un checkpoint

Nouveau rôle - Super formateur

  • Modifier le schéma de base de données pour ajouter le rôle "super_formateur"
  • Créer et appliquer la migration SQL
  • Adapter les requêtes backend pour donner accès à toutes les formations au super formateur
  • Modifier le frontend pour afficher toutes les formations au super formateur
  • Ajouter une interface admin pour promouvoir un formateur en super formateur
  • Tester localement
  • Déployer sur VPS
  • Créer un checkpoint

Nouveau rôle - Super formateur

  • Modifier le schéma de base de données pour ajouter le rôle super_formateur
  • Créer et appliquer la migration SQL en local
  • Adapter le backend (routers.ts) pour gérer les permissions
  • Adapter le frontend (DashboardLayout, Home, AdminUsers)
  • Tester localement
  • Déployer sur VPS avec migration
  • Créer un checkpoint

Correction - Super formateur ne doit pas avoir accès à Configuration

  • Modifier DashboardLayout pour masquer Configuration aux super formateurs
  • Déployer sur VPS
  • Créer un checkpoint

Template email attestations

  • Analyser le système actuel d'envoi des attestations

  • Ajouter le template "attestation" dans la table emailTemplates

  • Créer le template par défaut avec variables dynamiques

  • Intégrer le template dans le code d'envoi des attestations

  • Déployer sur VPS (migration SQL + fichiers)

  • Créer un checkpoint

  • Moderniser l'interface de chargement des attestations (design coloré et ergonomique)

  • Corriger le bug où le statut reste "envoyé" après la suppression d'une attestation