Files
formation-manager-itinova/todo.md
Manus f56c1d554e Checkpoint: Ajout de 4 nouveaux templates de rappels
## Modifications effectuées :

### AdminEmailTemplates.tsx
Ajout de 4 nouveaux types de templates dans la liste :
- "Rappel 3" (value: rappel3)
- "Rappel 4" (value: rappel4)
- "Rappel 5" (value: rappel5)
- "Rappel 6" (value: rappel6)

### AdminRappels.tsx
Ajout des mêmes templates dans TEMPLATE_TYPES avec des délais par défaut :
- Rappel 3 : 14 jours avant
- Rappel 4 : 21 jours avant
- Rappel 5 : 30 jours avant
- Rappel 6 : 60 jours avant

### server/db.ts (initializeDefaultEmailTemplates)
Ajout de 4 nouveaux templates par défaut basés sur le contenu du "Rappel 1" :
- Même structure HTML
- Même message de base
- Prêts à être personnalisés

## Note importante
Ces nouveaux templates ne seront créés que lors de l'initialisation des templates par défaut (bouton "Initialiser les templates par défaut" dans Configuration > Templates d'emails). Si vous avez déjà initialisé les templates, vous devrez créer manuellement ces 4 nouveaux templates ou réinitialiser la base de données.
2026-01-08 05:15:03 -05:00

24 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