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:
@@ -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(),
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
6
todo.md
6
todo.md
@@ -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
|
||||||
Reference in New Issue
Block a user