# 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 ## Bug à corriger - [x] Corriger l'affichage du menu latéral pour les formateurs (menu invisible actuellement) ## Erreurs TypeScript à corriger pour publication - [x] Corriger l'erreur dans AdminSequences.tsx (propriété formateur manquante) - [x] Corriger les erreurs dans QuestionnaireReponse.tsx (questionnaire possibly null) ## Émargement numérique et attestations automatiques ### Schéma de base de données - [x] Créer la table presences (inscription, date, heurePresence, modeValidation) - [ ] Créer la table attestations (inscription, sequence, dateGeneration, pdfUrl) - [x] Ajouter le champ qrCodeToken dans la table sequences ### Backend - [x] 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) - [x] 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 - [x] Créer la page FormateurEmargement avec affichage QR code - [x] Ajouter la liste des apprenants avec statut de présence - [x] Permettre la validation manuelle de présence - [ ] Afficher l'historique des présences par date ### Interface publique - [x] Créer la page publique de scan QR code (/emargement/:token) - [x] Implémenter le scan avec la caméra du téléphone - [x] Afficher la confirmation de présence validée - [x] Gérer les erreurs (token invalide, déjà émargé, etc.) ### Génération d'attestations - [x] Créer le template PDF d'attestation personnalisable - [x] Générer automatiquement après validation de toutes les présences - [x] Envoyer par email aux apprenants - [x] Permettre le téléchargement depuis l'espace formateur ## Corrections techniques - [x] Corriger le problème d'aperçu de l'application (erreurs TypeScript) - [x] Corriger les références à heureDebut/heureFin dans AdminRappels.tsx - [x] Corriger l'accès à la propriété dates dans EmargementScan.tsx - [x] Corriger l'import manquant de QrCode dans DashboardLayout.tsx - [x] Corriger les erreurs TypeScript dans DashboardLayout.tsx (subItems) - [x] Ajouter downlevelIteration dans tsconfig.json - [x] Corriger l'utilisation de Set dans DateFormationMultiSelect.tsx - [x] Corriger l'appel à createAttestation (utiliser enregistrerAttestation) - [x] Corriger le lien QR code pour utiliser l'URL publique au lieu de localhost ## Page de paramètres de l'application - [x] Créer la table parametres dans la base de données - [x] Créer les procédures tRPC pour gérer les paramètres - [x] Créer la page AdminParametres - [x] Ajouter le lien dans le menu après "Configuration SMTP" - [x] Modifier qrCodeGenerator pour utiliser l'URL de la BDD - [x] Définir l'URL par défaut : https://formations.itinova.org - [x] Ajouter DashboardLayout à la page AdminParametres - [x] Ajouter DashboardLayout à la page FormateurEmargement ## Améliorations page Paramètres - [x] Ajouter les champs dans la table parametres : delaiExpirationQR, dureeValiditeToken, notificationsActives - [x] Créer la table historiqueParametres pour tracer les modifications - [x] Créer les fonctions backend pour gérer les nouveaux paramètres - [x] Créer la procédure tRPC pour tester l'accessibilité d'une URL - [x] Créer la procédure tRPC pour récupérer l'historique des modifications - [x] Mettre à jour l'interface AdminParametres avec les nouveaux champs - [x] Ajouter le bouton "Tester l'URL" avec indicateur de statut - [x] Ajouter une section "Historique des modifications" dans la page - [x] Tester toutes les fonctionnalités ## Correction menu de navigation formateur - [x] Identifier les pages formateur sans DashboardLayout - [x] Ajouter DashboardLayout à toutes les pages formateur - [x] Vérifier que le menu s'affiche correctement pour le rôle formateur - [x] Tester la navigation dans l'espace formateur ## Correction colonnes manquantes dans les tables - [x] Vérifier les colonnes manquantes dans la table apprenants - [x] Vérifier les colonnes manquantes dans la table sequences - [x] Ajouter les colonnes manquantes via SQL - [x] Tester les requêtes sur le dashboard admin ## Correction table rappels - [x] Vérifier les noms de colonnes dans la table rappels - [x] Corriger le schéma Drizzle pour correspondre à la base de données - [x] Tester les requêtes sur la page Rappels ## Améliorations attestations de formation ### Base de données - [x] Ajouter le paramètre envoiAutomatiqueAttestations dans la table parametres - [x] Créer la table historiqueAttestations pour tracer les envois ### Backend - [x] Créer les fonctions de gestion du paramètre d'envoi automatique - [x] Créer les procédures tRPC pour l'historique des attestations - [x] Créer la procédure de prévisualisation du PDF ### Frontend - [x] Ajouter le toggle d'envoi automatique dans AdminParametres - [x] Ajouter la prévisualisation PDF dans AdminAttestations - [x] Créer la page HistoriqueAttestations dans Traçabilité - [x] Ajouter le lien dans le menu de navigation ### Tes### Tests - [x] Tester le paramètre d'envoi automatique - [x] Tester la prévisualisation du modèle - [x] Tester la page d'historique ## Gestion des attestations de formation (Nouvelle page dans Gestion) ### Phase 1 : Schéma de base de données - [x] Ajouter les colonnes dans la table formations : modeAttestation (ENUM: 'auto', 'manuel'), modeEnvoi (ENUM: 'auto', 'manuel') - [x] Modifier la table attestations pour supporter les documents uploadés manuellement - [x] Ajouter les colonnes : documentUrl, documentS3Key, uploadedBy, uploadedAt ### Phase 2 : Backend - [x] Créer les procédures tRPC pour configurer le mode par formation - [x] Créer les procédures pour uploader des documents par apprenant - [x] Créer la procédure pour envoyer manuellement une attestation - [x] Créer la procédure pour lister les attestations par formation avec filtres ### Phase 3 : Interface utilisateur - [x] Créer la page AdminGestionAttestations dans le menu Gestion - [x] Ajouter la sélection de formation avec configuration des modes - [x] Créer l'interface d'upload de documents par apprenant - [x] Ajouter les boutons de prévisualisation et d'envoi manuel - [x] Créer le tableau des apprenants avec statut des attestations ### Phase 4 : Tests - [x] Tester la configuration par formation - [x] Tester l'upload de documents - [x] Tester la prévisualisation - [x] Tester l'envoi manuel ## Retrait du paramètre d'envoi automatique de la page Paramètres - [x] 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 - [x] Vérifier la cohérence des paramètres dans la page de gestion des attestations - [x] Retirer le champ envoiAutomatiqueAttestations de la table parametres dans le schéma - [x] Mettre à jour les procédures tRPC liées aux paramètres - [x] Tester le workflow complet de configuration et d'envoi automatique des attestations ## Améliorations techniques et documentation - [x] Corriger les erreurs TypeScript liées aux types templateType dans les rappels - [x] Nettoyer les fichiers de migration Drizzle pour éviter les conflits - [x] Créer un guide utilisateur pour la configuration des attestations ## Bug : Erreur replaceVariables - [x] 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 - [x] Corriger le bug de mise à jour du type de template lors du changement de sélection dans AdminEmailTemplates.tsx - [x] Corriger le bug nécessitant deux clics pour mettre à jour le template (ajout de key pour forcer remontage) - [x] Corriger l'erreur SQL dans la modification de configuration SMTP (correction du schéma emailConfig) - [x] Corriger l'erreur de type dans la modification des séquences (formateurId string au lieu de number) - [x] Corriger la conservation de la date de blocage lors de la modification des séquences (ajout du champ dans le schéma Drizzle) - [x] 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 - [x] 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 - [x] Corriger l'erreur de validation du type de rappel dans la procédure testerRappel (typeRappel invalide) - [x] Corriger l'erreur "Cannot read properties of undefined (reading 'replace')" lors de l'envoi de test de rappel - [x] 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) - [x] Modifier la procédure testerRappel pour envoyer le rappel à tous les inscrits confirmés (au lieu du premier uniquement) - [x] 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" - [x] Créer la page /forgot-password pour demander la réinitialisation de mot de passe - [x] Créer la page /reset-password/:token pour définir le nouveau mot de passe - [x] 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) - [x] Modifier la page AdminSequences pour ouvrir en vue réduite par défaut - [x] Modifier le DashboardLayout pour réduire tous les menus sauf "Gestion" à la connexion - [x] 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 - [x] Corriger le bouton "Tester le rappel" pour enregistrer les envois dans l'historique des rappels (table logsRappels) - [x] 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)