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:
2186
drizzle/meta/0004_snapshot.json
Normal file
2186
drizzle/meta/0004_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,13 @@
|
||||
"when": 1768924576044,
|
||||
"tag": "0003_calm_frog_thor",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 4,
|
||||
"version": "5",
|
||||
"when": 1768928661188,
|
||||
"tag": "0004_absent_wallow",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -477,24 +477,28 @@ export const logsNotifications = mysqlTable("logsNotifications", {
|
||||
id: int("id").autoincrement().primaryKey(),
|
||||
/** Type de notification */
|
||||
type: mysqlEnum("type", [
|
||||
"inscription",
|
||||
"annulation",
|
||||
"capacite_atteinte",
|
||||
"place_disponible",
|
||||
"remerciement",
|
||||
"formateur_inscription",
|
||||
"formateur_annulation"
|
||||
"notification_formateur_inscription",
|
||||
"notification_formateur_annulation",
|
||||
"alerte_capacite",
|
||||
"notification_liste_attente"
|
||||
]).notNull(),
|
||||
/** Email du destinataire */
|
||||
destinataire: varchar("destinataire", { length: 320 }).notNull(),
|
||||
emailDestinataire: varchar("emailDestinataire", { length: 320 }).notNull(),
|
||||
/** Sujet de l'email */
|
||||
sujet: varchar("sujet", { length: 500 }).notNull(),
|
||||
/** ID de la séquence concernée */
|
||||
sequenceId: int("sequenceId"),
|
||||
/** ID de l'apprenant concerné */
|
||||
apprenantId: int("apprenantId"),
|
||||
/** ID du formateur concerné */
|
||||
formateurId: int("formateurId"),
|
||||
/** Statut de l'envoi */
|
||||
statut: mysqlEnum("statut", ["succes", "echec"]).notNull(),
|
||||
statut: mysqlEnum("statut", ["success", "failed"]).notNull(),
|
||||
/** Message d'erreur en cas d'échec */
|
||||
messageErreur: text("messageErreur"),
|
||||
/** Métadonnées supplémentaires (JSON) */
|
||||
metadata: text("metadata"),
|
||||
dateEnvoi: timestamp("dateEnvoi").defaultNow().notNull(),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user