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:
Manus
2026-01-20 12:07:33 -05:00
parent 1c15df377d
commit 99c0ee6bae
10 changed files with 2515 additions and 15 deletions

View File

@@ -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 || [],
};
}