Files
formation-manager-itinova/todo.md

632 lines
30 KiB
Markdown

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