Checkpoint: Correction de l'erreur "Cannot convert undefined or null to object" sur la page /admin/notifications :
**Problème identifié :** - Incohérence entre le schéma Drizzle (`drizzle/schema.ts`) et le code (`notificationLogsDb.ts`) - Le schéma utilisait des noms de colonnes et des types d'enum différents de ceux utilisés dans le code - Cela causait l'erreur "Cannot convert undefined or null to object" lors de la récupération des données **Corrections appliquées :** 1. **Mise à jour du schéma Drizzle (drizzle/schema.ts) :** - Renommé `destinataire` en `emailDestinataire` pour correspondre au code - Ajouté la colonne `sujet` (VARCHAR 500) - Ajouté la colonne `formateurId` (INT NULL) - Ajouté la colonne `metadata` (TEXT NULL) - Mis à jour l'enum `type` avec les bonnes valeurs : `remerciement`, `notification_formateur_inscription`, `notification_formateur_annulation`, `alerte_capacite`, `notification_liste_attente` - Mis à jour l'enum `statut` avec les bonnes valeurs : `success`, `failed` 2. **Amélioration de la gestion des valeurs null (notificationLogsDb.ts) :** - Ajout de vérifications null-safe dans `getNotificationStats()` pour éviter les erreurs lors du calcul du taux de succès - Ajout de valeurs par défaut pour `parType` et `evolutionParJour` (tableaux vides si undefined) - Ajout d'un mapping des logs pour s'assurer que tous les champs sont bien définis (null au lieu d'undefined) **Tests réussis :** - ✅ Onglet "Statistiques" : affiche correctement 24 envois, 100% de succès, répartition par type et évolution par jour - ✅ Onglet "Historique" : affiche correctement les 24 notifications avec toutes les colonnes (Date, Type, Destinataire, Sujet, Formation/Séquence, Statut) - ✅ Pagination fonctionnelle (Page 1 sur 2) - ✅ Filtres disponibles (Type, Statut, Email, Date début, Date fin) **Résultat :** ✅ L'erreur "Cannot convert undefined or null to object" est complètement résolue ✅ La page notifications fonctionne correctement avec toutes ses fonctionnalités
This commit is contained in:
@@ -124,8 +124,20 @@ export async function getNotificationLogs(filters?: {
|
||||
.from(logsNotifications)
|
||||
.where(whereClause);
|
||||
|
||||
// S'assurer que les logs sont bien définis et que tous les champs sont valides
|
||||
const safeLogs = (logs || []).map(log => ({
|
||||
...log,
|
||||
sequenceNom: log.sequenceNom || null,
|
||||
formationNom: log.formationNom || null,
|
||||
apprenantNom: log.apprenantNom || null,
|
||||
apprenantPrenom: log.apprenantPrenom || null,
|
||||
formateurNom: log.formateurNom || null,
|
||||
messageErreur: log.messageErreur || null,
|
||||
metadata: log.metadata || null,
|
||||
}));
|
||||
|
||||
return {
|
||||
logs,
|
||||
logs: safeLogs,
|
||||
total: countResult?.count || 0,
|
||||
};
|
||||
}
|
||||
@@ -186,15 +198,21 @@ export async function getNotificationStats(filters?: {
|
||||
.orderBy(sql`DATE(dateEnvoi)`)
|
||||
.limit(30);
|
||||
|
||||
// Vérifier que globalStats existe et a des valeurs valides
|
||||
const total = globalStats?.total || 0;
|
||||
const success = globalStats?.success || 0;
|
||||
const failed = globalStats?.failed || 0;
|
||||
const tauxSucces = total > 0 ? Math.round((success / total) * 100) : 0;
|
||||
|
||||
return {
|
||||
global: {
|
||||
total: globalStats?.total || 0,
|
||||
success: globalStats?.success || 0,
|
||||
failed: globalStats?.failed || 0,
|
||||
tauxSucces: globalStats?.total ? Math.round((globalStats.success / globalStats.total) * 100) : 0,
|
||||
total,
|
||||
success,
|
||||
failed,
|
||||
tauxSucces,
|
||||
},
|
||||
parType: statsByType,
|
||||
evolutionParJour,
|
||||
parType: statsByType || [],
|
||||
evolutionParJour: evolutionParJour || [],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user