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:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user