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'}`);
|
||||
|
||||
1
todo.md
1
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)
|
||||
|
||||
Reference in New Issue
Block a user