Checkpoint: Système de rappels complètement générique et correction du problème de casse MySQL

- Simplification du scheduler pour utiliser uniquement sendRappelEmail pour tous les types de rappels (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6)
- Correction du problème de casse MySQL (logsRappels vs logsrappels)
- Le système supporte maintenant tous les types de rappels actuels et futurs sans modification du code
- Les emails sont envoyés et les logs sont correctement enregistrés
This commit is contained in:
Manus
2026-01-16 11:15:07 -05:00
parent 512b989be7
commit 1fc4c89c0a
3 changed files with 30 additions and 45 deletions

View File

@@ -269,7 +269,7 @@ export type InsertRappelDate = typeof rappelDates.$inferInsert;
/** /**
* Table des logs de rappels envoyés * Table des logs de rappels envoyés
*/ */
export const logsRappels = mysqlTable("logsRappels", { export const logsRappels = mysqlTable("logsrappels", {
id: int("id").autoincrement().primaryKey(), id: int("id").autoincrement().primaryKey(),
rappelId: int("rappelId").notNull(), rappelId: int("rappelId").notNull(),
sequenceId: int("sequenceId").notNull(), sequenceId: int("sequenceId").notNull(),

View File

@@ -174,10 +174,9 @@ async function processRappel(rappel: any) {
} }
try { try {
// Choisir la fonction d'envoi selon le type de rappel // Utiliser la fonction générique pour tous les types de rappels
if (rappel.templateType === "rappel") { const { sendRappelEmail } = await import('./emailService');
// Rappel J-7 await sendRappelEmail({
await sendRappelJ7Email({
apprenantEmail: apprenant.email, apprenantEmail: apprenant.email,
apprenantPrenom: apprenant.prenom, apprenantPrenom: apprenant.prenom,
apprenantNom: apprenant.nom, apprenantNom: apprenant.nom,
@@ -191,33 +190,13 @@ async function processRappel(rappel: any) {
})), })),
lieu: sequence.lieu || "", lieu: sequence.lieu || "",
formateur: formateurNom, formateur: formateurNom,
templateType: rappel.templateType,
attachmentUrl: rappel.urlFichier || undefined, attachmentUrl: rappel.urlFichier || undefined,
attachmentFilename: rappel.nomFichier || undefined, attachmentFilename: rappel.nomFichier || undefined,
attachmentMimeType: rappel.typeFichier || undefined, attachmentMimeType: rappel.typeFichier || undefined,
}); });
console.log(`[Rappels] Email J-7 envoyé à ${apprenant.email} pour la séquence ${sequence.nom}`); console.log(`[Rappels] Email ${rappel.templateType} envoyé à ${apprenant.email} pour la séquence ${sequence.nom}`);
} else if (rappel.templateType === "rappelJ1") {
// Rappel J-1
await sendRappelJ1Email({
apprenantEmail: apprenant.email,
apprenantPrenom: apprenant.prenom,
apprenantNom: apprenant.nom,
apprenantFonction: apprenant.fonction,
formationNom: formation.nom,
sequenceNom: sequence.nom,
dates: toutesLesDates.map(d => ({
dateDebut: d.dateDebut,
dateFin: d.dateFin,
ordre: d.ordre
})),
lieu: sequence.lieu || "",
formateur: formateurNom,
attachmentUrl: rappel.urlFichier || undefined,
attachmentFilename: rappel.nomFichier || undefined,
attachmentMimeType: rappel.typeFichier || undefined,
});
console.log(`[Rappels] Email J-1 envoyé à ${apprenant.email} pour la séquence ${sequence.nom}`);
}
// Logger le succès // Logger le succès
await logRappelEnvoye({ await logRappelEnvoye({

View File

@@ -839,3 +839,9 @@
- [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] 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] 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] 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