**Nouvelles fonctionnalités** :
1. **Historique des rappels envoyés**
- Nouvelle table `logsRappels` pour tracer tous les emails de rappels
- Enregistrement automatique de chaque envoi (succès ou échec)
- Prévention des doublons : vérification avant envoi
- Informations stockées : rappelId, sequenceId, apprenantId, email, type, statut, message d'erreur
2. **Notifications automatiques à l'administrateur**
- Alerte par email en cas d'échec d'envoi de rappels
- Détail des échecs : liste des emails et messages d'erreur
- Résumé : nombre d'envois réussis vs échecs
3. **Procédure de test manuel** (backend uniquement)
- Nouvelle procédure tRPC `rappels.testerRappel`
- Permet de tester l'envoi d'un rappel J-7 ou J-1 pour une séquence
- Envoie au premier apprenant inscrit uniquement
**Fichiers créés** :
- `server/rappelDb.ts` : Fonctions de gestion des logs de rappels
- `drizzle/schema.ts` : Ajout de la table `logsRappels`
**Fichiers modifiés** :
- `server/rappelScheduler.ts` : Intégration du logging et des notifications
- `server/routers.ts` : Ajout de la procédure `testerRappel`
**Bénéfices** :
- ✅ Aucun doublon même en cas de redémarrage du serveur
- ✅ Traçabilité complète de tous les rappels envoyés
- ✅ Alertes automatiques en cas de problème d'envoi
- ✅ Possibilité de tester les rappels avant envoi automatique
**Problème identifié** :
Les apprenants recevaient plusieurs emails de rappel (J-7 ou J-1) pour une même séquence de formation. Par exemple, 5 emails pour la formation JetSki du 15/12/2025 au lieu d'un seul.
**Cause du bug** :
La requête SQL dans `rappelScheduler.ts` cherchait dans la table `datesFormation` et retournait une ligne par date de formation trouvée. Si une séquence avait 5 dates, la requête retournait 5 lignes, déclenchant l'envoi de 5 emails identiques au même apprenant.
**Solution implémentée** :
Modification de la logique dans `server/rappelScheduler.ts` (fonction `processRappel`) :
1. Récupération de toutes les séquences d'abord
2. Pour chaque séquence, vérification de sa **première date** uniquement (ordre = 1)
3. Si cette première date correspond à la date cible (J-7 ou J-1), envoi d'un seul email par apprenant inscrit
**Résultat** :
- ✅ Un seul email de rappel par séquence et par apprenant
- ✅ Toutes les dates de la séquence sont incluses dans l'email
- ✅ Pas de doublons même si la formation comporte plusieurs dates
**Fichiers modifiés** :
- `server/rappelScheduler.ts` : Réécriture complète de la fonction `processRappel`
**Test** :
La prochaine exécution automatique du scheduler (toutes les heures) n'enverra plus qu'un seul email par séquence.
- Correction du bug d'insertion SQL des rappels (champ derniereExecution)
- Création de la table rappels et des fonctions CRUD
- Implémentation du scheduler automatique (vérification toutes les heures)
- Personnalisation des templates J-7 et J-1 avec logo et couleurs Itinova (Bleu #283581, Bleu clair #0578BE, Orange #E94E1B, Vert #45ac34)
- Style sobre et professionnel appliqué
- Variable {{datesHTML}} pour afficher toutes les dates de chaque séquence