From a3fd588fb8efc64c6fb31fa38765a47707f34718 Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 18 Jan 2026 08:55:38 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Correction=20critique=20du=20sche?= =?UTF-8?q?duler=20de=20rappels=20automatiques=20qui=20ne=20trouvait=20auc?= =?UTF-8?q?une=20date=20de=20formation.=20Le=20probl=C3=A8me=20venait=20de?= =?UTF-8?q?=20l'utilisation=20de=20rappel.dateFormationIds=20(colonne=20in?= =?UTF-8?q?existante)=20au=20lieu=20de=20la=20table=20de=20liaison=20rappe?= =?UTF-8?q?lDates,=20et=20de=20l'utilisation=20de=20rappel.heure=20au=20li?= =?UTF-8?q?eu=20de=20rappel.heureEnvoi.=20Le=20scheduler=20utilise=20maint?= =?UTF-8?q?enant=20correctement=20la=20table=20rappelDates=20pour=20r?= =?UTF-8?q?=C3=A9cup=C3=A9rer=20les=20dates=20de=20formation=20associ?= =?UTF-8?q?=C3=A9es=20=C3=A0=20chaque=20rappel=20et=20v=C3=A9rifie=20l'heu?= =?UTF-8?q?re=20configur=C3=A9e=20avec=20une=20tol=C3=A9rance=20de=2020=20?= =?UTF-8?q?minutes=20toutes=20les=2015=20minutes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/rappelScheduler.ts | 17 +++++++++++------ todo.md | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) 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)