Checkpoint: Correction critique du scheduler de rappels automatiques qui ne trouvait aucune date de formation. Le problème venait de l'utilisation de rappel.dateFormationIds (colonne inexistante) au lieu de la table de liaison rappelDates, et de l'utilisation de rappel.heure au lieu de rappel.heureEnvoi. Le scheduler utilise maintenant correctement la table rappelDates pour récupérer les dates de formation associées à chaque rappel et vérifie l'heure configurée avec une tolérance de 20 minutes toutes les 15 minutes.
This commit is contained in:
@@ -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'}`);
|
||||
|
||||
Reference in New Issue
Block a user