1. Personnalisation des templates d'emails avec variables {{lieu}} et {{formateur}} (déjà disponible)
2. Aperçu avant envoi avec données réelles d'un apprenant (modal avec iframe)
3. Email de rappel J-1 avec bouton d'envoi et d'aperçu
Les templates personnalisés supportent maintenant toutes les variables disponibles.
L'aperçu permet de vérifier le rendu final avant l'envoi groupé.
Le rappel J-1 complète le système de communication avec les apprenants.
Modifications apportées :
- Ajout des paramètres `lieu` et `formateur` à la fonction sendTeaserEmail
- Récupération du formateur depuis la base de données dans routers.ts via getFormateurById
- Affichage du lieu et du formateur dans le contenu HTML de l'email teaser
- Ajout de `lieu` et `formateur` dans les variables disponibles pour les templates personnalisés
Variables disponibles dans les templates d'emails :
- {{nomApprenant}} - Nom de l'apprenant
- {{prenomApprenant}} - Prénom de l'apprenant
- {{nomFormation}} - Nom de la formation
- {{nomSequence}} - Nom de la séquence
- {{dateDebut}} - Date de début formatée
- {{dateFin}} - Date de fin formatée
- {{lieu}} - Lieu de la formation
- {{formateur}} - Nom du formateur
L'email de teaser affiche maintenant toutes les informations importantes pour les apprenants.
Fonctionnalités ajoutées :
- Logs serveur détaillés pour l'envoi d'emails groupés (nombre de destinataires, adresses)
- Message de retour avec le nombre d'emails envoyés avec succès et échoués
- Avertissement si aucun email n'est envoyé (aucun apprenant confirmé)
Corrections apportées :
- Les emails de teaser et rappel utilisent maintenant correctement la configuration SMTP
- Affichage d'un message de succès clair après l'envoi d'emails groupés
Note technique :
- Le code utilise bien sendEmail() qui respecte la configuration SMTP
- Les emails ne sont envoyés qu'aux apprenants avec statut "confirmee"
- La configuration SMTP doit être faite séparément en production (base de données différente)
**Problème identifié** :
La mutation tRPC `emailConfig.upsert` n'acceptait pas les champs SMTP (smtpHost, smtpPort, smtpSecure, smtpUser, smtpPassword) dans son schéma de validation Zod, ce qui empêchait l'enregistrement de la configuration SMTP.
**Solution appliquée** :
- Ajout des 5 champs SMTP dans le schéma d'input de la mutation `upsert` dans `server/routers.ts`
- Tous les champs SMTP sont définis comme nullable et optional pour permettre la flexibilité
- Types corrects : smtpPort (number), smtpSecure (enum), autres (string)
**Résultat** :
La configuration SMTP peut maintenant être enregistrée correctement dans la base de données. Les champs sont transmis du frontend au backend et stockés via la fonction `upsertEmailConfig`.
- Ajout de la valeur "tous" dans l'enum publicCible du schéma drizzle/schema.ts
- Mise à jour des validations Zod dans server/routers.ts
- Modification directe de la colonne publicCible en base de données via SQL
- Test réussi : création d'une séquence avec public cible "Tous" fonctionne parfaitement
Modifications apportées :
- Ajout du champ username (identifiant de connexion) dans le schéma de la base de données avec contrainte UNIQUE
- Mise à jour des procédures tRPC create et update pour gérer username et password
- Implémentation du hashage du mot de passe avec bcryptjs dans createUser et updateUser
- Ajout de la colonne "Identifiant" dans le tableau de la page de gestion des utilisateurs
- Ajout des champs "Identifiant de connexion" et "Mot de passe" dans le formulaire de création
- Ajout des champs "Identifiant de connexion" et "Nouveau mot de passe" dans le formulaire d'édition avec notes explicatives
- Les mots de passe sont hashés avant d'être stockés en base de données pour la sécurité
- Dans le formulaire d'édition, les champs username et password sont optionnels (laissez vide pour ne pas modifier)
✅ Nouvelle procédure tRPC `apprenants.getInscriptions` pour récupérer toutes les inscriptions d'un apprenant avec les détails de formation et séquence
✅ Nouvelle page AdminApprenantDetail (/admin/apprenants/:id) affichant :
- Informations personnelles de l'apprenant (nom, prénom, email, code établissement, fonction)
- Tableau complet de toutes ses inscriptions avec :
* Nom de la formation
* Nom de la séquence
* Toutes les dates de la séquence
* Lieu
* Public cible
* Date d'inscription
* Statut (avec badge coloré : vert pour confirmée, gris pour en attente, rouge pour annulée)
✅ Bouton "Détail" (icône œil) ajouté dans la colonne Actions de la page AdminApprenants
✅ Route /admin/apprenants/:id configurée dans App.tsx
✅ Bouton "Retour aux apprenants" pour navigation facile
Correction appliquée : La procédure getInscriptions extrait maintenant correctement l'objet inscription du résultat retourné par getInscriptionsByApprenant.
Tests réussis : Affichage correct des inscriptions pour l'apprenant "Nouveau Apprenant" (1 inscription à la séquence "Groupe A" avec statut confirmée).
✅ Logo Itinova ajouté en haut à droite de chaque page (40x15mm)
✅ Nom du formateur affiché dans l'en-tête (récupéré automatiquement depuis la base de données)
✅ Deux colonnes de signature par apprenant et par journée (Signature Matin / Signature Après-midi)
✅ Une page générée pour chaque date de formation
✅ Toutes les informations complètes : Formation, Séquence, Lieu, Formateur, Public cible, Date de la journée
✅ Tableau avec 6 colonnes : Nom, Prénom, Code établissement, Fonction, Signature Matin, Signature Après-midi
Corrections techniques :
- Utilisation de path.resolve(process.cwd()) au lieu de __dirname pour éviter l'erreur "ReferenceError: __dirname is not defined"
- Ajout du champ formateur dans l'interface FeuillePresenceInfo
- Récupération automatique du nom du formateur via formateurId dans la procédure exportFeuillePresence
Tests réussis : Génération testée avec la séquence "Groupe A" (formateur George Clooney, 2 dates) - PDF généré avec succès avec toutes les modifications visibles.
- Création de getSequencesWithFormation() pour récupérer les informations de formation
- Mise à jour de la procédure sequences.list pour utiliser la nouvelle fonction
- Correction de AdminCalendrier.tsx pour utiliser formation.nom au lieu de formation.titre
- Le nom de la formation s'affiche maintenant correctement dans le calendrier et dans le dialog de détails
- Vérification que le placeholder du FormateurCombobox est correct
✅ **Bugs corrigés**
1. **Calendrier de novembre vide** : Correction du nom de propriété dans AdminCalendrier.tsx - utilisation de `seq.dates` au lieu de `seq.datesFormation` pour correspondre aux données retournées par l'API
2. **Taux de remplissage toujours à 0%** : Ajout du calcul du nombre d'inscrits dans la procédure `sequences.list` (routers.ts ligne 127) - appel de `db.countInscriptionsBySequence(seq.id, 'confirmee')` pour chaque séquence
Les séquences s'affichent maintenant correctement dans le calendrier et la barre de progression colorée reflète le véritable taux de remplissage avec le code couleur approprié (vert/orange/rouge).
✅ **Fonctionnalités vérifiées et opérationnelles**
1. **Barre de progression colorée** : CapacityProgressBar intégré dans AdminSequences avec affichage "inscrits/capacité" et code couleur (vert <70%, orange 70-90%, rouge >90%)
2. **Vue calendrier mensuel** : Page AdminCalendrier accessible via le menu avec navigation mois précédent/suivant, affichage des séquences sur leurs dates, et dialog de détails au clic
3. **Système de rappels personnalisables** : Page AdminRappels accessible via le menu avec procédures tRPC complètes (list, create, update, delete, toggleActif), configuration des rappels (J-15, J-7, J-1), templates d'emails personnalisables avec variables dynamiques
✅ **Corrections apportées**
- Procédures tRPC rappels ajoutées dans routers.ts
- Routes et liens de navigation vérifiés et fonctionnels
- Tous les composants créés et intégrés correctement
✅ **1. Indicateur visuel de remplissage**
- Composant CapacityProgressBar avec barre de progression colorée
- Affichage "X / Y" avec pourcentage
- Couleurs automatiques : vert (<70%), orange (70-90%), rouge (>90%)
- Intégré dans la colonne capacité du tableau des séquences
✅ **2. Vue calendrier mensuel**
- Nouvelle page AdminCalendrier accessible depuis le menu
- Calendrier mensuel avec navigation (mois précédent/suivant, aujourd'hui)
- Affichage des séquences sur leurs dates respectives
- Dialog de détails au clic sur une séquence
- Vue complète avec toutes les informations (lieu, formateur, capacité, dates)
✅ **3. Système de rappels automatiques personnalisables**
- Tables rappels et rappelsEnvoyes créées
- Procédures tRPC complètes (list, create, update, delete)
- Page AdminRappels avec interface de gestion
- Configuration de rappels multiples (J-15, J-7, J-1, etc.)
- Templates d'emails personnalisables avec variables dynamiques
- Activation/désactivation des rappels
- Infrastructure prête pour l'envoi automatique (nécessite service de planification externe)
Ces améliorations facilitent grandement la planification et le suivi des formations.
✅ **1. Affichage dans le tableau des séquences**
- Nouvelle colonne "Formateur" ajoutée au tableau de gestion
- Affiche le nom du formateur ou "-" si non renseigné
✅ **2. Liste prédéfinie avec autocomplétion**
- Nouvelle table `formateurs` dans la base de données
- Procédures tRPC (list, create, delete) pour gérer les formateurs
- Composant `FormateurCombobox` avec autocomplétion intelligente
- Possibilité d'ajouter rapidement un nouveau formateur depuis le formulaire
- Recherche en temps réel parmi les formateurs existants
✅ **3. Inclusion dans les emails d'invitation**
- Le nom du formateur est maintenant affiché dans les emails de confirmation d'inscription
- Affichage conditionnel (uniquement si un formateur est renseigné)
- Améliore la communication avec les apprenants
Ces améliorations standardisent la gestion des formateurs, évitent les doublons/fautes de frappe, et enrichissent l'information transmise aux apprenants.
✅ Base de données : colonne "formateur" ajoutée à la table sequences (VARCHAR 255, nullable)
✅ Backend : procédures tRPC mises à jour
- sequences.create : champ formateur ajouté (optionnel)
- sequences.update : champ formateur ajouté (optionnel)
✅ Frontend : formulaires mis à jour
- Formulaire de création : champ "Formateur" ajouté avec placeholder
- Formulaire de modification : champ "Formateur" ajouté avec placeholder
- Le champ est non obligatoire comme demandé
Le champ formateur permet maintenant de spécifier le nom du formateur pour chaque séquence de formation lors de la création ou de la modification.
✅ Ajout du champ "Public cible" dans le dialogue de modification des séquences
- Le champ est maintenant visible et modifiable lors de l'édition d'une séquence
- Support complet de l'option "Tous" ajoutée précédemment
✅ Affichage du nombre d'inscrits dans la colonne capacité
- Format : "nombre d'inscrits / capacité" (ex: "5 / 12")
- Mise à jour de la procédure sequences.list pour inclure le comptage des inscriptions confirmées
- Mise à jour du schéma de validation pour inclure "tous" dans publicCible
Les deux problèmes signalés sont maintenant corrigés et l'application est prête à l'emploi.
✅ Modifications apportées :
- Remplacement de l'authentification OAuth Manus par un système local
- Ajout des champs email, password, emailVerified dans la table users
- Implémentation du hashage des mots de passe avec bcrypt
- Création des procédures auth.login et auth.register
- Mise à jour du système de context pour utiliser JWT
- Création des pages de connexion et d'inscription
- Mise à jour de la page AdminUsers pour créer des utilisateurs avec mot de passe
- Ajout de la protection des routes d'administration (vérification du rôle admin)
✅ Tests effectués :
- Connexion avec email/mot de passe ✓
- Création d'utilisateurs via l'interface d'administration ✓
- Protection des routes (seuls les admins peuvent accéder au dashboard) ✓
- Redirection automatique après connexion ✓
Note : Les fichiers OAuth Manus originaux ont été conservés pour référence mais ne sont plus utilisés.