From e5bfb195584e04f21d4031619f0e21e0d6291836 Mon Sep 17 00:00:00 2001 From: Manus Date: Fri, 16 Jan 2026 06:41:58 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Checkpoint=20saved:=20Ajout=20de?= =?UTF-8?q?=20la=20colonne=20"Type=20d'envoi"=20dans=20l'historique=20des?= =?UTF-8?q?=20rappels=20et=20nettoyage=20des=20anciens=20logs=20erron?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Améliorations apportées :** 1. **Colonne "Type d'envoi" avec badge coloré** : - Ajout d'une nouvelle colonne dans l'interface d'historique des rappels - Badge bleu pour les tests ("Test") - Badge vert pour les envois automatiques ("Automatique") - Permet de distinguer visuellement les envois de test des envois réels 2. **Correction des filtres** : - Correction de l'enum du statut : "succes"/"echec" au lieu de "success"/"failed" - Correction des noms de colonnes : "email" au lieu de "emailDestinataire", "type" au lieu de "typeRappel" 3. **Nettoyage des anciens logs** : - Ajout d'une procédure tRPC `nettoyerLogsErrones` pour supprimer les logs sans email - Exécution de la requête SQL sur le VPS pour nettoyer les données erronées - Tous les logs créés avant la correction du schéma ont été supprimés **Fichiers modifiés :** - client/src/pages/admin/AdminRappelsHistorique.tsx : Ajout de la colonne Type d'envoi avec badges colorés - server/routers.ts : Ajout de la procédure nettoyerLogsErrones + correction des enums **Résultat :** - L'historique des rappels affiche maintenant clairement si un envoi est un test ou automatique - Les anciens logs erronés ont été supprimés de la base de données - Les statistiques sont maintenant plus fiables et précises Déployé sur le VPS de production (https://formations.itinova.org) --- .../pages/admin/AdminRappelsHistorique.tsx | 26 ++++++++++++++----- server/routers.ts | 22 ++++++++++++++++ todo.md | 2 ++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/client/src/pages/admin/AdminRappelsHistorique.tsx b/client/src/pages/admin/AdminRappelsHistorique.tsx index d8e69a5..b22e11b 100644 --- a/client/src/pages/admin/AdminRappelsHistorique.tsx +++ b/client/src/pages/admin/AdminRappelsHistorique.tsx @@ -23,7 +23,7 @@ export default function AdminRappelsHistorique() { dateDebut: "", dateFin: "", sequenceId: undefined as number | undefined, - statut: undefined as "success" | "failed" | undefined, + statut: undefined as "succes" | "echec" | undefined, email: "", limit: 50, offset: 0, @@ -134,8 +134,8 @@ export default function AdminRappelsHistorique() { Tous les statuts - Succès - Échec + Succès + Échec @@ -190,6 +190,7 @@ export default function AdminRappelsHistorique() { Date envoi Email Type + Type d'envoi Statut Tentatives Erreur @@ -201,15 +202,26 @@ export default function AdminRappelsHistorique() { {format(new Date(log.dateEnvoi), "dd/MM/yyyy HH:mm", { locale: fr })} - {log.emailDestinataire} + {log.email} - {log.typeRappel === "rappel" ? "J-7" : "J-1"} + {log.type} - - {log.statut === "success" ? "Succès" : "Échec"} + + {log.typeEnvoi === "test" ? "Test" : "Automatique"} + + + + + {log.statut === "succes" ? "Succès" : "Échec"} diff --git a/server/routers.ts b/server/routers.ts index 524c6de..aff78ca 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -14,6 +14,7 @@ import { generateExcelExport, generatePDFExport, generateFeuillePresence } from import { parseExcelFile, validateImportData, importToDatabase } from "./importExcel"; import crypto from "crypto"; import bcrypt from "bcryptjs"; +import { sql } from "drizzle-orm"; // Procédure admin uniquement const adminProcedure = protectedProcedure.use(({ ctx, next }) => { @@ -1546,6 +1547,27 @@ export const appRouter = router({ const { getEvolutionEnvois } = await import('./rappelDb'); return getEvolutionEnvois(); }), + + // Nettoyer les anciens logs erronés (avant la correction du schéma) + nettoyerLogsErrones: adminProcedure + .mutation(async () => { + const database = await db.getDb(); + if (!database) throw new Error("Database not available"); + + // Supprimer tous les logs qui n'ont pas d'email (champ obligatoire manquant) + const result = await database.execute(sql` + DELETE FROM logsRappels + WHERE email IS NULL OR email = '' + `); + + const nbSupprimes = Array.isArray(result) ? 0 : (result as any).affectedRows || 0; + + return { + success: true, + nbSupprimes, + message: `${nbSupprimes} log(s) erroné(s) supprimé(s)`, + }; + }), }), emailConfig: router({ diff --git a/todo.md b/todo.md index 4bc4651..26c1b31 100644 --- a/todo.md +++ b/todo.md @@ -833,3 +833,5 @@ - [x] Supprimer les boutons "Aperçu rappel J-7", "Envoyer rappel J-7", "Aperçu rappel J-1", "Envoyer rappel J-1" de la fenêtre de détails des séquences - [x] Corriger le bouton "Tester le rappel" pour enregistrer les envois dans l'historique des rappels (table logsRappels) - [x] Corriger l'enregistrement des logs de rappels : type erroné (J-1 au lieu de J+2), statut erroné (success/failed au lieu de succes/echec), email erroné (emailDestinataire au lieu de email) +- [x] Ajouter une colonne "Type d'envoi" avec badge coloré dans l'interface d'historique des rappels +- [x] Nettoyer les anciens logs erronés de la base de données