- Modification du backend pour inclure la première date de chaque séquence
- Tri des séquences par ordre chronologique (première date en premier)
- Les séquences sont maintenant affichées dans l'ordre temporel pour une meilleure organisation
- Ajout d'en-têtes visuels pour chaque séquence avec nom et compteur d'apprenants
- Badge affichant le nombre d'attestations envoyées par séquence
- Amélioration de l'organisation et de la lisibilité pour les formateurs
- Suppression de la colonne "Séquence" devenue redondante
- Remplacement de adminProcedure par protectedProcedure pour getApprenantsWithStatus
- Les formateurs peuvent maintenant voir la liste des apprenants et gérer les attestations
- Ajout du champ 'periode' dans la table presences
- Modification des procédures backend pour gérer les deux périodes
- Mise à jour de l'interface EmargementScan avec choix de période
- Mise à jour de l'interface FormateurEmargement avec validation séparée matin/après-midi
- La feuille de présence PDF était déjà configurée avec deux colonnes
- Ajout d'un badge de compteur indiquant le nombre de rappels actifs (ex: "1")
- Désactivation visuelle du bouton pour les séquences sans rappels actifs (icône grisée)
- Tooltip informatif adapté selon le contexte (nombre de rappels ou message d'erreur)
- Amélioration de l'expérience utilisateur avec feedback visuel clair
- Retrait de la validation frontend complexe qui ne fonctionnait pas correctement
- Le backend gère maintenant l'erreur et affiche un message clair via toast
- L'utilisateur reçoit un message d'erreur explicite au lieu d'une erreur technique
- Amélioration de l'expérience utilisateur lors du test de rappels
- Indicateur visuel moderne avec animation (spinner + effet ping)
- Message "Envoi en cours..." pendant le traitement
- Toast final affichant le nombre exact d'emails envoyés
- Approche simple et efficace sans complexité de streaming temps réel
- Modification du backend pour envoyer un email par inscrit confirmé (tous à l'adresse de test)
- Ajout d'un indicateur de progression moderne avec animation (spinner + effet ping)
- Message de succès affichant le nombre d'emails envoyés
- Validation avec séquence "test 3" : 3 emails envoyés correctement (4ème inscrit sans email ignoré)
- Synchronisation complète de la structure de la table logsrappels avec le VPS
- Ajout d'un champ de saisie pour l'email du destinataire
- Modification du texte : "Tous les rappels configurés pour cette séquence seront envoyés à l'adresse email que vous indiquez ci-dessous"
- Validation de l'email avant envoi
- Backend modifié pour envoyer à l'email saisi au lieu de tous les inscrits
- Les logs enregistrent correctement l'email de test utilisé
✅ Correction de la structure de la table logsrappels pour correspondre au VPS
- Modification de la colonne statut: ENUM('succes','echec') au lieu de ENUM('success','failed')
- Modification de la colonne typeEnvoi: ENUM('automatique','test')
- Suppression des colonnes en trop (emailDestinataire, typeRappel, dateSequence, createdAt)
✅ Les logs de rappels s'enregistrent maintenant correctement dans la base de données
**Pages modifiées :**
1. **Tableau de bord des Notifications** (`client/src/pages/admin/AdminNotifications.tsx`)
- Ajout du style `text-[#60a5fa] drop-shadow-md` au titre h1
- Le titre est maintenant en bleu clair (#60a5fa) avec une ombre portée
2. **Gestion des Formateurs** (`client/src/pages/admin/AdminFormateurs.tsx`)
- Ajout du style `text-[#60a5fa] drop-shadow-md` au titre h1
- Le titre est maintenant en bleu clair (#60a5fa) avec une ombre portée
**Résultat :**
✅ Les titres des deux pages sont maintenant harmonisés avec le reste de l'application
✅ Le style CSS est cohérent avec les autres pages (Analytics, Rapport Public Cible, etc.)
✅ L'interface utilisateur est plus moderne et visuellement cohérente
**Problème identifié :**
- Incohérence entre le schéma Drizzle (`drizzle/schema.ts`) et le code (`notificationLogsDb.ts`)
- Le schéma utilisait des noms de colonnes et des types d'enum différents de ceux utilisés dans le code
- Cela causait l'erreur "Cannot convert undefined or null to object" lors de la récupération des données
**Corrections appliquées :**
1. **Mise à jour du schéma Drizzle (drizzle/schema.ts) :**
- Renommé `destinataire` en `emailDestinataire` pour correspondre au code
- Ajouté la colonne `sujet` (VARCHAR 500)
- Ajouté la colonne `formateurId` (INT NULL)
- Ajouté la colonne `metadata` (TEXT NULL)
- Mis à jour l'enum `type` avec les bonnes valeurs : `remerciement`, `notification_formateur_inscription`, `notification_formateur_annulation`, `alerte_capacite`, `notification_liste_attente`
- Mis à jour l'enum `statut` avec les bonnes valeurs : `success`, `failed`
2. **Amélioration de la gestion des valeurs null (notificationLogsDb.ts) :**
- Ajout de vérifications null-safe dans `getNotificationStats()` pour éviter les erreurs lors du calcul du taux de succès
- Ajout de valeurs par défaut pour `parType` et `evolutionParJour` (tableaux vides si undefined)
- Ajout d'un mapping des logs pour s'assurer que tous les champs sont bien définis (null au lieu d'undefined)
**Tests réussis :**
- ✅ Onglet "Statistiques" : affiche correctement 24 envois, 100% de succès, répartition par type et évolution par jour
- ✅ Onglet "Historique" : affiche correctement les 24 notifications avec toutes les colonnes (Date, Type, Destinataire, Sujet, Formation/Séquence, Statut)
- ✅ Pagination fonctionnelle (Page 1 sur 2)
- ✅ Filtres disponibles (Type, Statut, Email, Date début, Date fin)
**Résultat :**
✅ L'erreur "Cannot convert undefined or null to object" est complètement résolue
✅ La page notifications fonctionne correctement avec toutes ses fonctionnalités
**1. Correction erreur Fail2Ban (fail2banDb.ts) :**
- Ajout de vérifications pour détecter si Fail2Ban est installé (commande `which fail2ban-client`)
- Retour de valeurs par défaut (0, tableaux vides) au lieu de throw d'erreur dans l'environnement sandbox
- Corrections appliquées aux 3 fonctions : getFail2BanStatus(), getBanHistory(), countRecentBans()
- La page /admin/fail2ban s'affiche maintenant correctement sans erreur dans la sandbox
**2. Correction erreur SQL DATE_FORMAT (analyticsDb.ts) :**
- Ajout d'un filtre `IS NOT NULL` sur la colonne dateInscription dans getInscriptionsByMonth()
- Exclusion des inscriptions avec dateInscription NULL qui causaient des erreurs SQL
- Le graphique "Évolution des inscriptions par mois" affiche maintenant "Aucune donnée disponible" au lieu d'une erreur
**Tests réussis :**
- ✅ Page Fail2Ban : affiche correctement les statistiques à 0 et les messages appropriés
- ✅ Tableau de bord analytique : tous les graphiques fonctionnent sans erreur SQL
- ✅ Les autres pages (rapport-public-cible, suivi questionnaires) continuent de fonctionner correctement
**Résultat :**
✅ Toutes les erreurs signalées sont corrigées
✅ L'application fonctionne correctement dans l'environnement sandbox
✅ Sur le VPS de production, Fail2Ban affichera les vraies valeurs
**Corrections d'erreurs :**
1. **Erreurs SQL DATE_FORMAT corrigées** (analyticsDb.ts) :
- Remplacement des sous-requêtes corrélées par des JOIN dans getTauxRemplissageByMonth()
- Utilisation de COUNT(CASE WHEN...) au lieu de SUM(SELECT COUNT(*))
- Ajout de leftJoin pour éviter les erreurs de sous-requêtes
2. **Erreur React "Cannot read properties of null" corrigée** (AdminRapportPublicCible.tsx) :
- Ajout de l'opérateur null-safe `?.` pour accéder à `insc.apprenant?.fonction`
- Vérification explicite si la fonction est null/undefined
- Gestion du cas "public cible = tous" qui correspond toujours
3. **Tests réussis** :
- Page rapport-public-cible : affiche correctement les statistiques et recommandations
- Tableau de bord analytique : graphiques et statistiques fonctionnels
- Page suivi questionnaires : affiche correctement les données
**Harmonisation charte graphique :**
- Application du style bleu clair (#6B9FE8) avec ombre portée à tous les titres des 32 pages
- Création de la classe CSS `.page-title` réutilisable dans index.css
- Cohérence visuelle sur toute l'application
**Résultat :**
✅ Toutes les erreurs SQL et React sont corrigées
✅ Les pages fonctionnent correctement sans erreur
✅ Charte graphique harmonisée sur toutes les pages
**Améliorations visuelles :**
1. **Icônes modernes et colorées** :
- Icônes plus grandes (6x6) avec fond gradient coloré
- Effet de rotation au survol des icônes (rotate-12)
- 4 palettes de couleurs distinctes : bleu (formations), vert (séquences ouvertes), violet (apprenants), orange (séquences terminées)
2. **Liserés et bordures colorés** :
- Bordure gauche épaisse (4px) sur chaque carte de statistique
- Bordures colorées (2px) sur les cartes de graphiques
- Fond légèrement teinté coordonné aux couleurs (bg-blue-50/50, bg-green-50/50, etc.)
3. **Palette de couleurs enrichie** :
- Titre principal avec gradient bleu-violet (bg-gradient-to-r from-blue-600 to-purple-600)
- Valeurs des statistiques avec gradients colorés
- En-têtes de graphiques avec fond gradient subtil (from-blue-50 to-purple-50)
4. **Animations fluides** :
- Fade-in au chargement de la page (animate-in fade-in duration-500)
- Slide-in séquentiel des cartes avec délai progressif (100ms entre chaque carte)
- Effet hover : scale-105 + translate-y-1 + shadow-xl
- Effet de brillance au survol des cartes (gradient animé)
- Zoom léger des graphiques au survol (scale-105)
- Animation des graphiques recharts (800ms)
5. **Détails supplémentaires** :
- Badge "Données en temps réel" avec icône TrendingUp en haut à droite
- Indicateur "Actif" avec flèche verte sur chaque carte
- Ombres portées dynamiques au survol (hover:shadow-xl)
- Titres avec text-xl et font-bold pour plus d'impact
**Résultat :**
✅ Interface moderne et dynamique
✅ Expérience utilisateur améliorée avec animations fluides
✅ Meilleure hiérarchie visuelle grâce aux couleurs et liserés
✅ Design professionnel et engageant
✅ Testé et validé sur la sandbox
**Modifications apportées :**
1. **Renommage du bouton d'ajout d'apprenant** :
- Bouton renommé de "Ajouter un inscrit" à "Ajouter un apprenant"
- Titre de la boîte de dialogue mis à jour
- Description améliorée : "Sélectionnez un apprenant dans la liste ci-dessous pour l'inscrire à cette séquence. La liste affichée correspond à l'ensemble des apprenants enregistrés dans le système."
2. **Alternance de couleurs blanc/bleu clair (bg-blue-50/70)** appliquée sur tous les tableaux :
- Liste des formations (AdminFormations.tsx)
- Liste des séquences (AdminSequences.tsx)
- Liste des apprenants (AdminApprenants.tsx)
- Liste des inscrits dans la fenêtre de gestion des attestations (AdminGestionAttestations.tsx)
- Liste des utilisateurs (AdminUsers.tsx)
- Liste des formateurs (AdminFormateurs.tsx)
**Résultat :**
✅ Meilleure cohérence terminologique dans l'interface
✅ Amélioration significative de la lisibilité de tous les tableaux grâce à l'alternance de couleurs
✅ Expérience utilisateur plus fluide et professionnelle
✅ Déployé et testé avec succès sur le VPS de production (https://formations.itinova.org)
**Problème identifié :**
Les boutons d'ajout de balises (variables dynamiques) avaient été supprimés lors d'une modification précédente du fichier AdminEmailTemplates.tsx.
**Correction apportée :**
- Restauration de 10 boutons de variables dynamiques : {{nom}}, {{prenom}}, {{nomFormation}}, {{nomSequence}}, {{dateDebut}}, {{dateFin}}, {{lieu}}, {{formateur}}, {{datesHTML}}, {{lienReinitialisation}}
- Les boutons sont placés au-dessus de l'éditeur TipTap pour faciliter l'insertion rapide de variables
- Chaque bouton insère la balise correspondante à la position du curseur dans l'éditeur
- Message d'aide mis à jour pour encourager l'utilisation des boutons
**Résultat :**
✅ Les boutons sont de nouveau visibles et fonctionnels dans l'interface
✅ Déployé et testé avec succès sur le VPS de production (https://formations.itinova.org)
✅ L'expérience utilisateur est améliorée pour la création et modification des templates d'emails
**Fonctionnalité ajoutée :**
- Bouton "Ajouter un inscrit" avec icône UserPlus dans le header de la liste des inscrits
- Dialogue de sélection avec liste déroulante des apprenants disponibles (filtrés pour exclure ceux déjà inscrits)
- Sélection du statut (Confirmé / Liste d'attente)
- Mutation backend `inscriptions.create` pour l'ajout manuel par l'admin (sans vérifications de blocage/capacité)
**Fichiers modifiés :**
- client/src/pages/AdminSequenceInscrits.tsx : Ajout du bouton et du dialogue
- client/src/components/AddInscritForm.tsx : Nouveau composant de formulaire
- server/routers.ts : Ajout de la mutation inscriptions.create
**Résultat :**
Les administrateurs peuvent maintenant ajouter manuellement des apprenants à une séquence depuis l'interface des inscrits.
**Problème résolu :**
Erreur "Invalid option: expected one of 'rappel1', 'rappel2', 'rappel3', 'rappel4', 'rappel5', 'rappel6'" lors de la création d'un rappel.
**Modifications apportées :**
- Correction des enums dans `sendGroupEmail` et `emailPreview` (lignes 926 et 986)
- Remplacement de ['teaser', 'rappel', 'rappel_j1'] par ['teaser', 'rappel1', 'rappel2', 'rappel3', 'rappel4', 'rappel5', 'rappel6']
- Harmonisation complète avec le renommage précédent des types de rappels
**Résultat :**
La création de rappels fonctionne maintenant correctement sans erreur de validation.
**Modification apportée :**
- Alternance de fond entre lignes paires (blanc) et impaires (bleu clair bg-blue-50/70)
- Bleu légèrement soutenu pour un meilleur contraste visuel que le gris
- Opacité à 70% pour un effet subtil et élégant
**Résultat :**
Tableau plus lisible avec une identité visuelle cohérente (thème bleu), améliore le suivi des lignes et la navigation visuelle.
**Modification apportée :**
- Alternance de fond entre lignes paires (blanc) et impaires (gris très clair bg-gray-50/50)
- Améliore la lisibilité et facilite le suivi visuel des lignes
- Effet subtil et élégant grâce à l'opacité réduite
**Résultat :**
Tableau plus lisible et professionnel, conforme aux standards modernes d'interface utilisateur.
**Modifications apportées :**
1. Badge "Non" en rouge (bg-red-50, text-red-700, border-red-200) pour un meilleur contraste visuel avec le vert
2. Tooltip informatif au survol du badge "Oui" affichant le nom du fichier et sa taille en Ko
3. Badge "Oui" cliquable pour télécharger directement la pièce jointe sans ouvrir la fenêtre de modification
4. Effet hover vert clair (hover:bg-green-100) pour indiquer l'interactivité
**Résultat :**
Interface plus intuitive et fonctionnelle avec code couleur cohérent (vert = présent/actif, rouge = absent/inactif) et actions directes pour améliorer l'expérience utilisateur.