diff --git a/server/rappelScheduler.ts b/server/rappelScheduler.ts index 9fb2c5f..563a07b 100644 --- a/server/rappelScheduler.ts +++ b/server/rappelScheduler.ts @@ -1,5 +1,5 @@ import { getDb } from "./db"; -import { rappels, sequences, inscriptions, apprenants, formations, datesFormation, formateurs } from "../drizzle/schema"; +import { rappels, sequences, inscriptions, apprenants, formations, datesFormation, formateurs, rappelDates } from "../drizzle/schema"; import { eq, and, gte, lte, sql, inArray } from "drizzle-orm"; import { sendRappelJ7Email, sendRappelJ1Email } from "./emailService"; import { logRappelEnvoye, rappelDejaEnvoye } from "./rappelDb"; @@ -51,16 +51,16 @@ async function processRappel(rappel: any) { const minuteActuelle = maintenant.getMinutes(); // Parser l'heure configurée (format "HH:MM") - const [heureRappel, minuteRappel] = (rappel.heure || "09:00").split(":").map(Number); + const [heureRappel, minuteRappel] = (rappel.heureEnvoi || "09:00").split(":").map(Number); // Vérifier si on est dans la bonne heure (avec une tolérance de 20 minutes) const diffMinutes = Math.abs((heureActuelle * 60 + minuteActuelle) - (heureRappel * 60 + minuteRappel)); if (diffMinutes > 20) { - console.log(`[Rappels] Heure actuelle ${heureActuelle}:${minuteActuelle.toString().padStart(2, '0')} ne correspond pas à l'heure configurée ${rappel.heure} (différence: ${diffMinutes} minutes) - rappel ignoré`); + console.log(`[Rappels] Heure actuelle ${heureActuelle}:${minuteActuelle.toString().padStart(2, '0')} ne correspond pas à l'heure configurée ${rappel.heureEnvoi} (différence: ${diffMinutes} minutes) - rappel ignoré`); return; } - console.log(`[Rappels] Heure actuelle ${heureActuelle}:${minuteActuelle.toString().padStart(2, '0')} correspond à l'heure configurée ${rappel.heure} - traitement du rappel`); + console.log(`[Rappels] Heure actuelle ${heureActuelle}:${minuteActuelle.toString().padStart(2, '0')} correspond à l'heure configurée ${rappel.heureEnvoi} - traitement du rappel`); // Calculer la date cible selon le timing (pré ou post-formation) const dateCible = new Date(); @@ -76,8 +76,13 @@ async function processRappel(rappel: any) { console.log(`[Rappels] Recherche des dates de formation le ${dateCible.toLocaleDateString()}`); - // Vérifier si ce rappel est associé à des dates spécifiques - const datesAssociees = rappel.dateFormationIds || []; + // Vérifier si ce rappel est associé à des dates spécifiques via la table rappelDates + const rappelDatesAssociees = await db + .select({ dateFormationId: rappelDates.dateFormationId }) + .from(rappelDates) + .where(eq(rappelDates.rappelId, rappel.id)); + + const datesAssociees = rappelDatesAssociees.map(rd => rd.dateFormationId); const filtreDates = datesAssociees.length > 0; console.log(`[Rappels] ${filtreDates ? `Filtré sur ${datesAssociees.length} date(s) spécifique(s)` : 'Toutes les dates'}`); diff --git a/todo.md b/todo.md index 81a22a4..b5514e3 100644 --- a/todo.md +++ b/todo.md @@ -866,3 +866,4 @@ - [x] Corriger le bouton Renvoyer inactif dans la gestion des attestations (correction selectedSequenceId -> apprenant.sequence.id) - [x] Corriger le problème d'envoi automatique des rappels qui ne se déclenchent pas à l'heure programmée (ajout vérification heure + intervalle 15 min au lieu de 1h) - [x] Ajouter un bouton "Tout renvoyer" pour envoyer en masse toutes les attestations chargées manuellement sur une séquence +- [x] Corriger le scheduler de rappels qui ne trouve aucune date de formation (utilisation table rappelDates + correction heureEnvoi)