Checkpoint: Checkpoint saved: Ajout de la colonne "Type d'envoi" dans l'historique des rappels et nettoyage des anciens logs erronés

**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)
This commit is contained in:
Manus
2026-01-16 06:41:58 -05:00
parent 8f21fdd276
commit e5bfb19558
3 changed files with 43 additions and 7 deletions

View File

@@ -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({