Modifications apportées :
- Ajout des colonnes nomFichier, urlFichier, s3Key, typeFichier, tailleFichier dans la table rappels
- Création du composant FileUpload pour l'upload de fichiers vers S3 (max 10 Mo)
- Création de l'endpoint API /api/upload-file pour gérer l'upload
- Intégration du composant FileUpload dans les formulaires de création et modification de rappels
- Mise à jour des procédures tRPC create et update pour gérer les informations de fichier
- Modification des fonctions sendRappelJ7Email et sendRappelJ1Email pour inclure les pièces jointes
- Mise à jour du scheduler de rappels pour passer les informations de fichier lors de l'envoi
- Les fichiers sont téléchargés depuis S3 et convertis en base64 pour être attachés aux emails
## Problème
La procédure `emailTemplates.getByType` retournait `undefined` quand un template n'existait pas, ce qui causait une erreur React Query : "Query data cannot be undefined".
Cette erreur se produisait notamment lors de la sélection des nouveaux templates (Rappel 3, 4, 5, 6) qui n'avaient pas encore été initialisés dans la base de données.
## Solution
Modification de la fonction `getEmailTemplateByType` dans `server/db.ts` pour retourner `null` au lieu de `undefined` :
- `if (!db) return null;` (au lieu de `return undefined;`)
- `return results.length > 0 ? results[0] : null;` (au lieu de `undefined`)
React Query accepte `null` comme valeur valide mais pas `undefined`.
## Résultat
Les templates non initialisés peuvent maintenant être sélectionnés sans erreur. L'interface affiche correctement un état vide au lieu de crasher.
## Modifications effectuées :
### AdminEmailTemplates.tsx
Ajout de 4 nouveaux types de templates dans la liste :
- "Rappel 3" (value: rappel3)
- "Rappel 4" (value: rappel4)
- "Rappel 5" (value: rappel5)
- "Rappel 6" (value: rappel6)
### AdminRappels.tsx
Ajout des mêmes templates dans TEMPLATE_TYPES avec des délais par défaut :
- Rappel 3 : 14 jours avant
- Rappel 4 : 21 jours avant
- Rappel 5 : 30 jours avant
- Rappel 6 : 60 jours avant
### server/db.ts (initializeDefaultEmailTemplates)
Ajout de 4 nouveaux templates par défaut basés sur le contenu du "Rappel 1" :
- Même structure HTML
- Même message de base
- Prêts à être personnalisés
## Note importante
Ces nouveaux templates ne seront créés que lors de l'initialisation des templates par défaut (bouton "Initialiser les templates par défaut" dans Configuration > Templates d'emails). Si vous avez déjà initialisé les templates, vous devrez créer manuellement ces 4 nouveaux templates ou réinitialiser la base de données.
- Modification de checkExistingInscription pour exclure les inscriptions avec statut "annulee"
- Permet maintenant de réinscrire un apprenant à une séquence après annulation de son inscription précédente
- Les inscriptions annulées ne sont plus considérées comme des inscriptions actives lors de la vérification de doublon
- Modification de getInscriptionsBySequence pour exclure les inscriptions avec statut "annulee"
- Modification de getInscriptionsByApprenant pour exclure les inscriptions avec statut "annulee"
- Ajout de l'import de la fonction ne depuis drizzle-orm
- Vérification que le scheduler de rappels filtre déjà correctement (envoie uniquement aux inscriptions confirmées)
- Ajout du support SMTP pour l'envoi d'emails (sans dépendre de Resend)
- Correction de l'affichage du statut pour montrer "SMTP Direct" au lieu de "Resend"
- Ajout d'alertes spécifiques pour la configuration SMTP
- Correction de la fonction upsertEmailConfig pour mettre à jour au lieu de créer une nouvelle configuration
- Correction du bug d'enregistrement des champs SMTP dans la base de données
- Mise à jour forcée du provider à "smtp" dans la base de données
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)
- 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
✅ **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.
- Authentification locale avec email/mot de passe
- OAuth Manus pour les utilisateurs de la plateforme
Le contexte tRPC gère automatiquement les deux types de tokens (JWT local et JWT OAuth).