1467 lines
71 KiB
Markdown
1467 lines
71 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
|
|
|
|
## 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)
|
|
- [x] Ajouter une colonne "Type d'envoi" avec badge coloré dans l'interface d'historique des rappels
|
|
- [x] Nettoyer les anciens logs erronés de la base de données
|
|
- [x] Corriger les erreurs TypeScript critiques liées aux types null/undefined (réduction de 115 à 88 erreurs)
|
|
- [x] Diagnostiquer pourquoi le rappel J+2 pour la séquence Test3 n'a pas été envoyé à opareige@gmail.com (déjà envoyé automatiquement)
|
|
- [x] Corriger l'erreur de connexion à la base de données qui empêche adminServFormation de se connecter (PM2 ne chargeait pas le fichier .env)
|
|
- [x] Ajouter un bouton pour vider la table des logs d'historique des rappels avec une boîte de dialogue de confirmation
|
|
- [x] Diagnostiquer et corriger pourquoi le rappel J+2 automatique pour la séquence TEST 3 n'est toujours pas envoyé à opareige@gmail.com (problème de casse MySQL)
|
|
- [x] Diagnostiquer et corriger pourquoi les emails de rappel automatiques ne sont pas reçus (code du scheduler ne gérait pas rappel3, rappel4, etc.)
|
|
- [x] Diagnostiquer et corriger pourquoi le rappel J+2 automatique pour la séquence TEST 3 n'est toujours pas envoyé à opareige@gmail.com (problème de casse MySQL)
|
|
- [x] Simplifier le code du scheduler pour utiliser uniquement sendRappelEmail de manière générique pour tous les types de rappels
|
|
- [x] Corriger le schéma Drizzle pour utiliser des noms de tables en minuscules (logsrappels au lieu de logsRappels)
|
|
- [x] Tester que tous les types de rappels fonctionnent correctement
|
|
- [x] Corriger le problème du bouton de vidage de l'historique des rappels qui ne fonctionne plus (nom de table incorrect)
|
|
- [ ] Déployer l'intégralité du projet mis à jour sur le VPS (bouton de suppression des rappels et toutes les fonctionnalités manquantes)
|
|
- [x] Configurer l'upload de fichiers pour utiliser le stockage local sur le VPS au lieu du service S3
|
|
- [x] Corriger l'erreur d'upload de fichier depuis le navigateur sur le VPS (augmentation de la limite Nginx à 10 Mo)
|
|
- [x] Ajouter une colonne dans le tableau de gestion des rappels pour indiquer la présence d'une pièce jointe
|
|
- [x] Corriger la détection de la pièce jointe dans le tableau des rappels (vérification de nomFichier et urlFichier au lieu de pieceJointe)
|
|
- [x] Corriger l'envoi de la pièce jointe dans les emails de rappel (support des fichiers locaux et S3)
|
|
- [x] Corriger la corruption de la pièce jointe lors de l'envoi par email (ajout de l'encoding base64 pour SMTP/Nodemailer)
|
|
- [x] Modifier le comportement par défaut des menus de la sidebar : tous repliés à la connexion sauf le menu "Gestion" (MENU_VERSION incrémentée à 5)
|
|
- [x] Modifier le comportement des menus de la sidebar en mode accordéon : lorsqu'un menu s'ouvre, les autres se replient automatiquement
|
|
- [x] Implémenter la fonctionnalité du bouton "Charger" dans la gestion des attestations de formation (upload de PDF avec validation)
|
|
- [x] Corriger l'erreur "No procedure found on path attestations.uploadDocument" lors de l'upload d'attestations (utilisation de gestionAttestations.uploadDocument)
|
|
- [x] Corriger l'erreur SQL "Failed query: insert into attestations" lors de l'upload d'attestation manuelle (ajout de apprenantId et sequenceId)
|
|
- [x] Corriger l'erreur "refetchInscrits is not defined" lors de l'upload d'attestation manuelle (remplacement par refetchApprenants)
|
|
- [x] Corriger l'erreur "aucune attestation disponible pour cet apprenant" lors de l'envoi manuel d'une attestation uploadée (vérification de documentUrl ou urlPdf)
|
|
- [x] Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement
|
|
- [x] Permettre le renvoi d'une attestation même après qu'elle ait été envoyée (afficher bouton Renvoyer au lieu de masquer Envoyer)
|
|
- [x] Corriger l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec un chemin local (gérer les chemins locaux et URLs complètes)
|
|
- [x] Corriger le bouton Renvoyer inactif dans la gestion des attestations (correction selectedSequenceId -> apprenant.sequence.id)
|
|
- [x] Corriger le problème d'envoi automatique des rappels qui ne se déclenchent pas à l'heure programmée (ajout vérification heure + intervalle 15 min au lieu de 1h)
|
|
- [x] Ajouter un bouton "Tout renvoyer" pour envoyer en masse toutes les attestations chargées manuellement sur une séquence
|
|
- [x] Corriger le scheduler de rappels qui ne trouve aucune date de formation (utilisation table rappelDates + correction heureEnvoi)
|
|
- [x] Augmenter la tolérance du scheduler de rappels de 20 à 30 minutes pour couvrir 2 cycles de vérification
|
|
- [x] Vérifier l'heure configurée en base de données pour le rappel J+2
|
|
- [x] Diagnostiquer et résoudre le problème de connexion SSH au VPS depuis le sandbox (résolu après modifications config SSH)
|
|
- [x] Identifier la cause de l'erreur "banner line contains invalid characters"
|
|
- [x] Optimiser la sécurité SSH avec Fail2Ban renforcé (maxretry=3, bantime=3600)
|
|
- [x] Créer une whitelist d'IPs de confiance pour éviter les blocages
|
|
- [x] Créer les fonctions backend pour récupérer les données Fail2Ban (IPs bannies, statistiques)
|
|
- [x] Créer l'interface admin du tableau de bord Fail2Ban avec possibilité de débannir
|
|
- [x] Implémenter le système d'alertes email pour les attaques massives (>10 IPs/heure)
|
|
- [x] Tester et déployer le monitoring Fail2Ban sur le VPS
|
|
- [x] Créer une nouvelle section "Gestion technique" dans le menu de navigation
|
|
- [x] Déplacer "Sécurité SSH (Fail2Ban)" de Configuration vers Gestion technique
|
|
- [x] Intégrer la page AdminFail2Ban dans DashboardLayout pour afficher le menu latéral
|
|
- [x] Déplacer la section "Gestion technique" en dernière position du menu
|
|
- [x] Corriger le problème d'affichage vide du menu Gestion technique (rebuild forcé)
|
|
- [x] Redéployer correctement DashboardLayout.tsx sur le VPS avec Gestion technique en dernier
|
|
- [ ] Corriger l'erreur qui cause l'affichage d'une page vide sur le VPS
|
|
- [x] Identifier les 5 erreurs TypeScript les plus critiques
|
|
- [x] Corriger les erreurs TypeScript critiques identifiées (89 → 78 erreurs)
|
|
- [x] Déployer les corrections TypeScript sur le VPS
|
|
- [ ] Vérifier le schéma de la table logsrappels dans la base de données
|
|
- [ ] Exécuter la migration de base de données si nécessaire
|
|
- [ ] Analyser la correspondance entre types de rappels et templates d'emails
|
|
- [ ] Corriger l'enum de la colonne type dans logsrappels si nécessaire
|
|
|
|
## Correction cohérence types de rappels
|
|
|
|
- [x] Analyser la correspondance entre types de rappels et templates d'emails
|
|
- [x] Renommer rappel → rappel1 et rappelJ1 → rappel2 dans le schéma Drizzle
|
|
- [x] Mettre à jour tous les fichiers utilisant rappel et rappelJ1
|
|
- [x] Modifier l'enum dans la base de données MySQL
|
|
- [x] Déployer et tester les corrections
|
|
|
|
## Correction colonne statut dans envoisQuestionnaires
|
|
|
|
- [x] Analyser le schéma Drizzle de la table envoisQuestionnaires
|
|
- [x] Vérifier la structure de la table dans la base de données MySQL
|
|
- [x] Créer le script SQL pour ajouter la colonne statut
|
|
- [x] Exécuter la migration sur le VPS
|
|
- [x] Déployer et tester
|
|
|
|
## Correction affichage nombre de dates sélectionnées
|
|
|
|
- [x] Analyser le code de la boîte de dialogue de modification des rappels
|
|
- [x] Identifier le bug de comptage des dates sélectionnées (références orphelines)
|
|
- [x] Nettoyer les références orphelines dans rappelDates
|
|
- [x] Ajouter les contraintes de clé étrangère pour éviter le problème
|
|
- [x] Tester et déployer
|
|
|
|
## Amélioration affichage pièce jointe dans configuration rappels
|
|
|
|
- [x] Analyser l'affichage actuel de la pièce jointe dans AdminRappels
|
|
- [x] Ajouter une icône colorée (vert pour OUI, gris pour NON)
|
|
- [x] Tester l'affichage
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Améliorations supplémentaires affichage pièces jointes
|
|
|
|
- [x] Changer la couleur du badge "Non" en rouge (au lieu de gris)
|
|
- [x] Ajouter un tooltip au survol du badge "Oui" avec nom et taille du fichier
|
|
- [x] Rendre le badge "Oui" cliquable pour télécharger directement la pièce jointe
|
|
- [x] Tester les fonctionnalités
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Alternance de couleurs sur tableau des rappels
|
|
|
|
- [x] Ajouter une classe CSS pour l'alternance de couleurs (zebra striping)
|
|
- [x] Appliquer la classe aux lignes du tableau
|
|
- [x] Tester le rendu visuel
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Changement couleur alternance tableau rappels
|
|
|
|
- [x] Remplacer le gris par un bleu légèrement soutenu (bg-blue-50/70)
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Correction erreur validation création rappel
|
|
|
|
- [x] Identifier la source de l'erreur de validation templateType
|
|
- [x] Corriger la validation pour accepter rappel1-6 au lieu de rappel/rappelJ1
|
|
- [x] Tester la création d'un rappel
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Recherche exhaustive des enums de types de rappels
|
|
|
|
- [x] Rechercher tous les enums dans le code (backend + frontend)
|
|
- [x] Corriger tous les endroits manqués (TEMPLATE_TYPES dans AdminRappels.tsx)
|
|
- [x] Déployer et tester
|
|
|
|
## Ajout manuel d'apprenant dans la fenêtre "Inscrits à la séquence"
|
|
|
|
- [x] Analyser la fenêtre des inscrits (AdminSequenceInscrits.tsx)
|
|
- [x] Ajouter un bouton "Ajouter un inscrit" avec icône UserPlus dans le header
|
|
- [x] Créer un dialogue de sélection d'apprenant (AddInscritForm.tsx)
|
|
- [x] Implémenter la mutation backend inscriptions.create
|
|
- [x] Tester l'ajout manuel
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Correction erreur validation modification template "Rappel 1"
|
|
|
|
- [x] Rechercher tous les enums de types de templates dans le code
|
|
- [x] Corriger les enums manqués dans AdminEmailTemplates.tsx (types ET liste déroulante)
|
|
- [x] Déployer
|
|
- [x] Mettre à jour les données dans la table emailTemplates (déjà fait lors de la migration précédente)
|
|
- [x] Tester
|
|
|
|
## Restauration boutons d'ajout de balises dans templates
|
|
|
|
- [x] Identifier pourquoi les boutons ont disparu
|
|
- [x] Restaurer les boutons
|
|
- [x] Déployer et tester
|
|
|
|
## Renommage bouton ajout d'apprenant
|
|
|
|
- [x] Renommer "Ajouter un inscrit" en "Ajouter un apprenant"
|
|
- [x] Ajouter précision dans la boîte de dialogue
|
|
- [x] Déployer et tester
|
|
|
|
## Alternance de couleurs blanc/bleu sur tous les tableaux
|
|
|
|
- [x] Liste des formations
|
|
- [x] Liste des séquences
|
|
- [x] Liste des apprenants
|
|
- [x] Liste des inscrits (fenêtre gestion des attestations)
|
|
- [x] Liste des utilisateurs
|
|
- [x] Liste des formateurs
|
|
- [x] Déployer et tester
|
|
|
|
## Refonte ergonomie du tableau de bord
|
|
|
|
- [x] Analyser le tableau de bord actuel (Admin.tsx)
|
|
- [x] Créer nouvelle version avec icônes modernes et colorées
|
|
- [x] Ajouter liserés colorés sur les cartes
|
|
- [x] Implémenter animations au survol et au chargement
|
|
- [x] Améliorer la palette de couleurs
|
|
- [x] Tester sur sandbox
|
|
- [x] Déployer après validation utilisateur
|
|
|
|
## Refonte ergonomie du menu latéral accordéon
|
|
|
|
- [x] Analyser le menu latéral actuel (DashboardLayout.tsx)
|
|
- [x] Créer nouvelle version avec icônes colorées et animations
|
|
- [x] Ajouter effets hover et transitions fluides
|
|
- [x] Implémenter indicateur de page active
|
|
- [x] Améliorer les couleurs et gradients
|
|
- [x] Tester sur sandbox
|
|
- [x] Déployer après validation utilisateur
|
|
|
|
## Correction bug page émargement formateur
|
|
|
|
- [x] Analyser l'erreur "Cannot convert undefined or null to object"
|
|
- [x] Identifier la requête tRPC qui échoue
|
|
- [x] Corriger le bug
|
|
- [x] Tester la correction
|
|
|
|
## Harmonisation tableau de bord avec palette pastel
|
|
|
|
- [x] Adapter les couleurs des cartes statistiques en pastel
|
|
- [x] Harmoniser les gradients avec le menu latéral
|
|
- [x] Tester sur sandbox
|
|
|
|
## Correction bug page suivi questionnaires
|
|
|
|
- [x] Analyser l'erreur "Cannot convert undefined or null to object"
|
|
- [x] Identifier la requête tRPC qui échoue
|
|
- [x] Corriger le bug
|
|
- [x] Tester la correction
|
|
|
|
## Correction erreurs SQL suivi questionnaires
|
|
|
|
- [x] Analyser les erreurs SQL (champs manquants dans WHERE)
|
|
- [x] Identifier les requêtes concernées dans server/routers.ts
|
|
- [x] Corriger les requêtes SQL
|
|
- [x] Tester les corrections
|
|
|
|
## Déploiement VPS de toutes les améliorations
|
|
|
|
- [x] Identifier tous les fichiers modifiés
|
|
- [x] Déployer les fichiers sur le VPS
|
|
- [x] Rebuild et redémarrer l'application
|
|
- [x] Vérifier le déploiement
|
|
|
|
## Suppression mention rappel 7 jours dans message inscription
|
|
|
|
- [x] Supprimer la ligne "Un email de rappel vous sera envoyé 7 jours avant la formation"
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Correction erreur mutation formateurs
|
|
|
|
- [x] Analyser l'erreur "Unexpected token '<', '<!doctype'..."
|
|
- [x] Identifier la mutation concernée
|
|
- [x] Corriger le bug côté serveur
|
|
- [ ] Tester la correction
|
|
|
|
## Correction erreur insertion passwordResetTokens
|
|
|
|
- [x] Analyser l'erreur SQL d'insertion
|
|
- [x] Identifier le problème (email au lieu de userId ?)
|
|
- [x] Corriger le bug
|
|
- [x] Tester la correction
|
|
|
|
## Harmonisation charte graphique des titres
|
|
|
|
- [x] Identifier toutes les pages avec titres noirs
|
|
- [x] Appliquer le style bleu clair avec ombre (comme "Tableau de bord")
|
|
- [x] Tester sur sandbox
|
|
|
|
## Correction erreurs page rapport-public-cible
|
|
|
|
- [x] Analyser les erreurs SQL DATE_FORMAT
|
|
- [x] Corriger l'erreur React "Cannot read properties of null (reading 'fonction')"
|
|
- [x] Corriger l'erreur "Cannot convert undefined or null to object"
|
|
- [x] Tester les corrections sur sandbox
|
|
|
|
## Correction erreurs Fail2Ban et SQL DATE_FORMAT
|
|
|
|
- [x] Analyser l'erreur "Impossible de récupérer le statut Fail2Ban"
|
|
- [x] Corriger l'erreur SQL DATE_FORMAT dans getInscriptionsByMonth
|
|
- [x] Tester les corrections sur sandbox
|
|
|
|
## Correction erreur page notifications
|
|
|
|
- [x] Analyser l'erreur "Cannot convert undefined or null to object"
|
|
- [x] Corriger l'erreur dans le code
|
|
- [x] Tester la correction sur sandbox
|
|
|
|
## Harmonisation des titres de pages
|
|
|
|
- [x] Appliquer le style CSS bleu clair avec ombre portée au titre "Tableau de bord des Notifications"
|
|
- [x] Appliquer le style CSS bleu clair avec ombre portée au titre "Gestion des formateurs"
|
|
- [x] Tester les modifications sur sandbox
|
|
|
|
## Déploiement sur le serveur de production
|
|
|
|
- [ ] Se connecter au serveur de production via SSH
|
|
- [ ] Transférer les fichiers modifiés (AdminNotifications.tsx, AdminFormateurs.tsx)
|
|
- [ ] Redémarrer les services Node.js
|
|
- [ ] Vérifier que le déploiement fonctionne correctement
|
|
|
|
## Déploiement sur le serveur de production
|
|
|
|
- [x] Se connecter au serveur de production via SSH
|
|
- [x] Transférer les fichiers modifiés (AdminNotifications.tsx, AdminFormateurs.tsx)
|
|
- [x] Redémarrer les services Node.js
|
|
- [x] Vérifier que le déploiement fonctionne correctement (PROBLÈME: modifications non visibles)
|
|
- [x] Identifier la cause du problème (classes Tailwind arbitraires non compilées)
|
|
- [x] Corriger et redéployer (utilisation de la classe .page-title dans index.css)
|
|
|
|
## Modification affichage rappels automatiques
|
|
|
|
- [x] Analyser la structure actuelle de la fenêtre des rappels automatiques
|
|
- [x] Regrouper les informations de la même formation/séquence sur une seule ligne
|
|
- [x] Resserrer les colonnes pour une meilleure lisibilité
|
|
- [x] Tester les modifications sur sandbox
|
|
- [x] Déployer sur le serveur de production
|
|
|
|
## Amélioration visuelle rappels automatiques
|
|
|
|
- [x] Ajouter les icônes colorées (badges) pour formation et séquence
|
|
- [x] Conserver le format compact sur une seule ligne
|
|
- [x] Tester les modifications sur sandbox
|
|
- [x] Déployer sur le serveur de production
|
|
|
|
## Ajout badges pour les dates
|
|
|
|
- [x] Ajouter des badges colorés pour chaque date
|
|
- [x] Tester les modifications sur sandbox
|
|
- [x] Déployer sur le serveur de production
|
|
|
|
## Coloration bouton Charger attestations
|
|
|
|
- [x] Localiser le bouton "Charger" dans la gestion des attestations
|
|
- [x] Modifier la couleur du bouton en bleu
|
|
- [x] Tester la modification sur sandbox
|
|
- [x] Déployer sur le serveur de production
|
|
|
|
## Harmonisation boutons Prévisualiser et Envoyer
|
|
|
|
- [x] Modifier le bouton "Prévisualiser" en bleu
|
|
- [x] Modifier le bouton "Envoyer" en bleu
|
|
- [x] Tester les modifications sur sandbox
|
|
|
|
## Ajout indicateur de progression upload PDF
|
|
|
|
- [x] Ajouter un état de progression dans le composant
|
|
- [x] Afficher une barre de progression pendant l'upload
|
|
- [x] Tester l'indicateur de progression (visible lors de l'upload)
|
|
|
|
## Correction erreur logsRappels
|
|
|
|
- [x] Analyser l'erreur "Unknown column 'type'" dans logsRappels
|
|
- [x] Corriger le schéma de la table logsRappels (colonne déjà présente)
|
|
- [x] Tester la correction (erreur devrait disparaître après redémarrage)
|
|
|
|
## Déploiement final
|
|
|
|
- [x] Déployer toutes les modifications sur le serveur de production
|
|
|
|
## Coloration colonne Type historique rappels
|
|
|
|
- [x] Localiser la colonne Type dans l'historique des rappels
|
|
- [x] Ajouter un badge orange pâle pour les types de rappels
|
|
- [x] Tester la modification sur sandbox (pas de données dans sandbox)
|
|
- [x] Déployer sur le serveur de production
|
|
|
|
## Correction historique rappels vide
|
|
|
|
- [x] Vérifier les données dans la table logsRappels
|
|
- [x] Analyser le code de requête de l'historique (erreur: colonne 'type' manquante)
|
|
- [x] Identifier et corriger le problème (ajout de la colonne 'type')
|
|
- [ ] Tester la correction sur sandbox
|
|
|
|
## Correction erreur insertion logsrappels
|
|
|
|
- [x] Analyser l'erreur d'insertion dans logsrappels
|
|
- [x] Identifier le problème (ENUM type incompatible)
|
|
- [ ] Mettre à jour le schéma sandbox pour correspondre au VPS
|
|
- [ ] Tester l'envoi de rappels
|
|
|
|
- [x] Corriger l'enregistrement des logs de rappels (table logsrappels reste vide après test)
|
|
- [x] Ajouter une boîte de dialogue de confirmation avant l'envoi de test des rappels
|
|
- [x] Modifier la boîte de dialogue de test de rappels pour permettre de saisir l'email du destinataire
|
|
- [x] Modifier le test de rappels pour envoyer un email par inscrit à l'adresse de test avec indicateur de progression
|
|
- [x] Ajouter un compteur de progression X/Y dans l'indicateur visuel du test de rappels
|
|
- [x] Corriger l'erreur 'Aucun rappel actif configuré' lors du test de rappels
|
|
- [x] Désactiver visuellement le bouton de test pour les séquences sans rappels actifs
|
|
- [x] Ajouter un badge de compteur sur le bouton de test indiquant le nombre de rappels actifs
|
|
- [x] Corriger l'erreur 'Unexpected token' lors de la mutation API sur /admin/sequences
|
|
- [ ] Corriger l'erreur dans le fichier ICS qui empêche l'importation dans Outlook
|
|
- [ ] Ajouter validation date fin > date début dans la boîte de dialogue de modification des séquences
|
|
- [x] Ajouter une validation frontend en temps réel dans les champs de date pour afficher un message d'erreur immédiat
|
|
- [ ] Restreindre les droits des formateurs (pas de modification/suppression de formations et séquences)
|
|
- [ ] Restreindre les droits des formateurs pour qu'ils ne puissent pas créer/modifier/supprimer des apprenants
|
|
|
|
## Autoriser les formateurs à accéder aux exports et feuilles de présence
|
|
|
|
- [x] Identifier les procédures backend concernées (exports PDF/Excel, feuille de présence)
|
|
- [x] Modifier les restrictions pour autoriser les formateurs
|
|
- [x] Tester les modifications
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Corriger l'accès des formateurs à la liste des inscrits
|
|
|
|
- [x] Identifier les procédures concernées (listBySequence, getWithDates)
|
|
- [x] Remplacer adminProcedure par protectedProcedure
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Masquer le menu "Gestion technique" pour les formateurs
|
|
|
|
- [x] Identifier le composant DashboardLayout où le menu est défini
|
|
- [x] Ajouter une condition isAdmin pour masquer la section Gestion technique
|
|
- [x] Tester et déployer sur le VPS
|
|
|
|
## Synchronisation entre table users (rôle formateur) et table formateurs
|
|
|
|
- [x] Analyser la structure des deux tables
|
|
- [x] Comprendre la relation entre users.role='formateur' et la table formateurs
|
|
- [x] Proposer une solution pour synchroniser ou clarifier l'usage
|
|
- [x] Implémenter la solution (auto-création dans createUser et updateUser)
|
|
- [x] Créer un script de migration pour les formateurs existants
|
|
- [x] Déployer sur le VPS et exécuter la migration
|
|
|
|
## Corriger la désactivation des rappels lors du changement de formateur
|
|
|
|
- [x] Identifier le code de modification de séquence qui désactive les rappels
|
|
- [x] Corriger pour ne désactiver que lors de changement de dates
|
|
- [x] Tester la modification
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Créer un tableau de bord spécifique pour les formateurs
|
|
|
|
- [x] Analyser le tableau de bord actuel (Admin.tsx)
|
|
- [x] Vérifier les procédures backend existantes (déjà présentes)
|
|
- [x] Réécrire FormateurDashboard.tsx avec le même design moderne
|
|
- [x] Vérifier la route dans App.tsx (déjà présente)
|
|
- [x] Ajouter la redirection automatique des formateurs vers /formateur
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Coloriser les boutons d'actions de la fenêtre "Inscrits à la séquence"
|
|
|
|
- [x] Identifier le fichier AdminSequenceInscrits.tsx
|
|
- [x] Appliquer des couleurs pastel aux boutons d'actions
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Permettre deux signatures par jour pour l'émargement (matin et après-midi)
|
|
|
|
- [x] Analyser le système d'émargement actuel (schéma DB, backend, frontend)
|
|
- [x] Modifier le schéma de base de données pour ajouter un champ "periode" (matin/apres-midi)
|
|
- [x] Adapter les procédures backend pour gérer les deux périodes
|
|
- [x] Modifier l'interface d'émargement pour proposer le choix matin/après-midi (EmargementScan + FormateurEmargement)
|
|
- [x] Vérifier l'export de feuille de présence (déjà configuré avec deux colonnes)
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Corriger l'affichage vide de la liste des apprenants dans la gestion des attestations pour les formateurs
|
|
|
|
- [x] Identifier le fichier de gestion des attestations
|
|
- [x] Analyser les procédures backend concernées
|
|
- [x] Corriger les restrictions d'accès pour les formateurs (getApprenantsWithStatus)
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Regrouper les apprenants par séquence dans la gestion des attestations
|
|
|
|
- [x] Analyser l'affichage actuel (regroupement par formation)
|
|
- [x] Vérifier le backend (données de séquence déjà présentes)
|
|
- [x] Adapter l'interface pour afficher les apprenants regroupés par séquence
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Trier les séquences par ordre chronologique dans la gestion des attestations
|
|
|
|
- [x] Modifier le backend pour inclure la première date de chaque séquence
|
|
- [x] Adapter le frontend pour trier les séquences par date
|
|
- [x] Déployer sur le VPS
|
|
|
|
## Corriger l'affichage vide de la liste des apprenants après le tri chronologique
|
|
|
|
- [x] Identifier la cause du problème (structure imbriquée Drizzle ORM)
|
|
- [x] Corriger le code backend (aplatir la structure de la requête)
|
|
- [x] Corriger le code frontend (utiliser l'ID de séquence pour le tri)
|
|
- [ ] Déployer sur le VPS
|
|
- [x] Corriger le bouton "œil" dans la page apprenants (formateur) qui n'affiche pas le détail
|
|
- [x] Corriger la page vide lors de l'émargement via QR code sur smartphone
|
|
- [x] Ajouter confirmation visuelle après émargement réussi (animation + heure)
|
|
- [x] Implémenter signature manuscrite sur smartphone pour attestations (annulé - changement de besoin)
|
|
- [x] Implémenter signature manuscrite tactile pour émargement via QR code
|
|
|
|
## Signature tactile pour émargement via QR code
|
|
|
|
- [x] Créer le composant SignaturePad avec signature_pad
|
|
- [x] Ajouter les champs de signature dans la table presences (signatureUrl, signatureS3Key, dateSigned)
|
|
- [x] Intégrer SignaturePad dans EmargementScan.tsx
|
|
- [x] Modifier presences.valider pour accepter signatureDataUrl
|
|
- [x] Uploader la signature en stockage local lors de la validation (S3 abandonné pour DNS)
|
|
- [x] Stocker l'URL dans la base de données
|
|
- [x] Afficher les informations de signature dans l'émargement formateur
|
|
- [x] Ajouter une modale pour visualiser les signatures en grand format
|
|
- [x] Corriger le problème Drizzle ORM avec sql.raw pour les colonnes de signature
|
|
- [x] Déployer sur le VPS (formations.itinova.org)
|
|
- [x] Retirer les logs de debug
|
|
- [ ] Intégrer les signatures dans la feuille de présence PDF (optionnel)
|
|
- [ ] Tester le flux complet sur smartphone
|
|
- [ ] Déployer sur le VPS
|
|
|
|
## Stockage local des signatures d'émargement
|
|
|
|
- [x] Modifier routers.ts pour stocker les signatures localement au lieu de S3
|
|
- [x] Créer la structure de dossiers uploads/signatures/[formation-id]-[sequence-id]/
|
|
- [x] Générer des noms de fichiers uniques pour chaque signature
|
|
- [ ] Configurer Nginx pour servir les fichiers de signatures
|
|
- [ ] Tester le flux complet sur le VPS
|
|
|
|
## Affichage des signatures dans l'émargement numérique
|
|
|
|
- [ ] Modifier l'API pour récupérer les présences avec signatures
|
|
- [ ] Afficher nom du signataire, date/heure et icône à côté de chaque puce matin/après-midi
|
|
- [ ] Ajouter une modale pour visualiser la signature en grand format
|
|
- [ ] Tester l'affichage sur smartphone
|
|
- [ ] Déployer sur le VPS
|
|
|
|
## BUG: Signatures non enregistrées lors de la validation
|
|
|
|
- [x] Vérifier les logs serveur lors de la validation avec signature
|
|
- [x] Vérifier le code d'upload de signature dans routers.ts
|
|
- [x] Vérifier que signatureUrl et signatureS3Key sont bien enregistrés en base
|
|
- [x] Corriger le problème (ajouter les champs dans getPresencesBySequence)
|
|
- [x] Déployer sur VPS
|
|
- [ ] Tester l'affichage des icônes
|
|
|
|
## BUG CRITIQUE: Informations de validation disparues à nouveau
|
|
|
|
- [x] Vérifier les logs navigateur pour erreurs JavaScript
|
|
- [x] Vérifier si l'API retourne bien les données
|
|
- [x] Comparer le code actuel avec la version qui fonctionnait
|
|
- [x] Corriger de manière définitive et robuste
|
|
- [x] Tester localement avant déploiement (fonctionne en local)
|
|
- [x] Déployer sur VPS (rebuild complet effectué)
|
|
- [ ] Tester sur VPS après rebuild
|
|
|
|
## Intégration des signatures dans les feuilles de présence PDF
|
|
|
|
- [x] Analyser le code actuel de génération des feuilles de présence PDF
|
|
- [x] Modifier exportService.ts pour charger les images de signatures
|
|
- [x] Intégrer les signatures dans le layout du PDF (colonnes Matin/Après-midi)
|
|
- [x] Gérer les cas où la signature n'existe pas (affichage vide)
|
|
- [x] Modifier routers.ts pour récupérer les présences avec signatures
|
|
- [x] Tester la génération avec et sans signatures (code implémenté, test utilisateur requis)
|
|
- [x] Vérifier la qualité et la taille des signatures dans le PDF (test utilisateur requis)
|
|
- [x] Créer un checkpoint
|
|
|
|
## Déploiement VPS - Intégration signatures PDF
|
|
|
|
- [x] Se connecter au VPS en SSH
|
|
- [x] Copier server/exportService.ts vers le VPS
|
|
- [x] Copier server/routers.ts vers le VPS
|
|
- [x] Redémarrer l'application avec PM2
|
|
- [x] Vérifier que l'application fonctionne correctement
|
|
- [ ] Tester l'export PDF avec signatures sur production (test utilisateur requis)
|
|
|
|
## Bug - Signatures manquantes dans PDF
|
|
|
|
- [x] Analyser pourquoi les signatures n'apparaissent pas dans le PDF généré
|
|
- [x] Vérifier la logique de correspondance entre présences et dates
|
|
- [x] Problème identifié : utilisation de dateInfo.ordre au lieu de dateInfo.id
|
|
- [x] Corriger le code (exportService.ts et routers.ts)
|
|
- [x] Ajouter l'ID de la date dans l'interface FeuillePresenceInfo
|
|
- [x] Corriger la logique de recherche des présences
|
|
- [x] Déployer sur VPS
|
|
- [ ] Tester la génération PDF avec signatures (test utilisateur requis)
|
|
|
|
## Bug VPS - Signatures toujours manquantes dans PDF
|
|
|
|
- [ ] Vérifier l'existence des fichiers de signatures sur le VPS
|
|
- [ ] Vérifier les chemins d'accès aux fichiers
|
|
- [ ] Ajouter des logs de debug dans exportService.ts
|
|
- [ ] Identifier le problème exact (fichiers manquants, chemin incorrect, erreur de lecture)
|
|
- [ ] Corriger le problème
|
|
- [ ] Redéployer et tester
|
|
|
|
## Ajout signatures après-midi dans PDF
|
|
|
|
- [x] Modifier exportService.ts pour chercher les présences après-midi
|
|
- [x] Afficher les signatures après-midi dans la colonne correspondante
|
|
- [x] Corriger le bug apres-midi vs apres_midi (underscore vs tiret)
|
|
- [x] Déployer sur VPS
|
|
- [x] Tester avec une séquence ayant des signatures matin et après-midi
|
|
- [x] Retirer les logs de debug
|
|
- [x] Déployer la version finale sur VPS
|
|
- [x] Créer un checkpoint final
|
|
|
|
## Évolution rappels - 2 pièces jointes
|
|
|
|
- [x] Analyser le schéma actuel de la table rappels
|
|
- [x] Planifier la migration pour passer de 1 à 2 pièces jointes
|
|
- [x] Modifier le schéma Drizzle (drizzle/schema.ts)
|
|
- [x] Créer et appliquer la migration SQL en local
|
|
- [x] Adapter le backend (emailService.ts, rappelScheduler.ts, routers.ts, db.ts)
|
|
- [x] Adapter le frontend (AdminRappels.tsx)
|
|
- [x] Tester localement avec rappels existants
|
|
- [x] Déployer sur VPS avec migration
|
|
- [x] Vérifier que les rappels existants sont préservés (migration additive)
|
|
- [x] Créer un checkpoint
|
|
|
|
## Bug - Labels pièces jointes dupliqués
|
|
|
|
- [x] Identifier pourquoi les labels apparaissent en double (FileUpload affiche déjà un label)
|
|
- [x] Ajouter un prop label au composant FileUpload
|
|
- [x] Corriger l'affichage dans AdminRappels.tsx
|
|
- [x] Déployer sur VPS
|
|
- [x] Créer un checkpoint
|
|
|
|
## Bug - Deuxième pièce jointe non envoyée
|
|
|
|
- [x] Vérifier le code d'envoi des emails de rappel
|
|
- [x] Identifier pourquoi seule la première pièce jointe est envoyée (paramètres manquants dans routers.ts)
|
|
- [x] Corriger le code pour envoyer les 2 pièces jointes
|
|
- [x] Déployer sur VPS
|
|
- [x] Tester l'envoi avec 2 pièces jointes (test utilisateur validé)
|
|
- [x] Créer un checkpoint
|
|
|
|
## Nouveau rôle - Super formateur
|
|
|
|
- [ ] Modifier le schéma de base de données pour ajouter le rôle "super_formateur"
|
|
- [ ] Créer et appliquer la migration SQL
|
|
- [ ] Adapter les requêtes backend pour donner accès à toutes les formations au super formateur
|
|
- [ ] Modifier le frontend pour afficher toutes les formations au super formateur
|
|
- [ ] Ajouter une interface admin pour promouvoir un formateur en super formateur
|
|
- [ ] Tester localement
|
|
- [ ] Déployer sur VPS
|
|
- [ ] Créer un checkpoint
|
|
|
|
## Nouveau rôle - Super formateur
|
|
|
|
- [x] Modifier le schéma de base de données pour ajouter le rôle super_formateur
|
|
- [x] Créer et appliquer la migration SQL en local
|
|
- [x] Adapter le backend (routers.ts) pour gérer les permissions
|
|
- [x] Adapter le frontend (DashboardLayout, Home, AdminUsers)
|
|
- [x] Tester localement
|
|
- [x] Déployer sur VPS avec migration
|
|
- [x] Créer un checkpoint
|
|
|
|
## Correction - Super formateur ne doit pas avoir accès à Configuration
|
|
|
|
- [x] Modifier DashboardLayout pour masquer Configuration aux super formateurs
|
|
- [x] Déployer sur VPS
|
|
- [x] Créer un checkpoint
|
|
|
|
## Template email attestations
|
|
|
|
- [x] Analyser le système actuel d'envoi des attestations
|
|
- [x] Ajouter le template "attestation" dans la table emailTemplates
|
|
- [x] Créer le template par défaut avec variables dynamiques
|
|
- [x] Intégrer le template dans le code d'envoi des attestations
|
|
- [x] Déployer sur VPS (migration SQL + fichiers)
|
|
- [x] Créer un checkpoint
|
|
|
|
- [x] Moderniser l'interface de chargement des attestations (design coloré et ergonomique)
|
|
|
|
- [x] Corriger le bug où le statut reste "envoyé" après la suppression d'une attestation
|