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:
Manus
2026-01-18 08:55:38 -05:00
parent 2c0f379c52
commit a3fd588fb8
2 changed files with 12 additions and 6 deletions

View File

@@ -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'}`);

View File

@@ -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)