Checkpoint: Historique, statistiques et réessai automatique des rappels
**Nouvelles fonctionnalités** : 1. **Page d'historique des rappels** (`/admin/rappels/historique`) - Tableau complet de tous les rappels envoyés - Filtres avancés : date début/fin, séquence, statut (succès/échec), email - Recherche par email avec mise en surbrillance - Pagination (50 résultats par page) - Affichage du nombre de tentatives pour chaque rappel - Code couleur : vert pour succès, rouge pour échec 2. **Tableau de bord statistiques** (`/admin/rappels/statistiques`) - 4 cartes de statistiques globales : total envoyés, succès, échecs, taux de succès - Graphique d'évolution : nombre de rappels envoyés par jour (succès vs échecs) - Graphique du taux de succès par jour (barres) - Top 10 des emails problématiques avec nombre d'échecs - Visualisation interactive avec Recharts 3. **Système de réessai automatique** - Détection automatique des rappels échoués - Délai exponentiel : 1h après 1er échec, 4h après 2ème, 24h après 3ème - Limite de 3 tentatives maximum - Notification automatique à l'admin en cas d'abandon (3 échecs) - Mise à jour automatique du statut dans les logs - Vérification toutes les heures **Nouveaux champs dans logsRappels** : - `nbTentatives` : nombre de tentatives d'envoi (1 à 3) - `prochainEssai` : date du prochain essai en cas d'échec **Nouveaux fichiers** : - `client/src/pages/admin/AdminRappelsHistorique.tsx` : Page d'historique - `client/src/pages/admin/AdminRappelsStats.tsx` : Page de statistiques - `server/rappelRetry.ts` : Système de réessai automatique - `server/rappelDb.ts` : Fonctions étendues (filtres, stats, évolution) **Fichiers modifiés** : - `drizzle/schema.ts` : Ajout de nbTentatives et prochainEssai - `server/routers.ts` : Nouvelles procédures tRPC (historique, statistiques, évolution) - `client/src/App.tsx` : Routes pour historique et statistiques - `client/src/components/DashboardLayout.tsx` : Sous-menu Rappels - `server/_core/index.ts` : Initialisation du scheduler de retry **Bénéfices** : - ✅ Traçabilité complète de tous les rappels - ✅ Analyse des performances avec graphiques - ✅ Identification rapide des emails problématiques - ✅ Réessai automatique des échecs sans intervention manuelle - ✅ Notification en cas d'échec persistant - ✅ Optimisation de la délivrabilité des emails
This commit is contained in:
@@ -974,6 +974,39 @@ export const appRouter = router({
|
||||
});
|
||||
}
|
||||
}),
|
||||
|
||||
historique: adminProcedure
|
||||
.input(z.object({
|
||||
dateDebut: z.string().optional(),
|
||||
dateFin: z.string().optional(),
|
||||
sequenceId: z.number().optional(),
|
||||
statut: z.enum(['success', 'failed']).optional(),
|
||||
email: z.string().optional(),
|
||||
limit: z.number().default(100),
|
||||
offset: z.number().default(0),
|
||||
}))
|
||||
.query(async ({ input }) => {
|
||||
const { getLogsRappelsWithFilters } = await import('./rappelDb');
|
||||
return getLogsRappelsWithFilters({
|
||||
dateDebut: input.dateDebut ? new Date(input.dateDebut) : undefined,
|
||||
dateFin: input.dateFin ? new Date(input.dateFin) : undefined,
|
||||
sequenceId: input.sequenceId,
|
||||
statut: input.statut,
|
||||
email: input.email,
|
||||
limit: input.limit,
|
||||
offset: input.offset,
|
||||
});
|
||||
}),
|
||||
|
||||
statistiques: adminProcedure.query(async () => {
|
||||
const { getStatsRappels } = await import('./rappelDb');
|
||||
return getStatsRappels();
|
||||
}),
|
||||
|
||||
evolution: adminProcedure.query(async () => {
|
||||
const { getEvolutionEnvois } = await import('./rappelDb');
|
||||
return getEvolutionEnvois();
|
||||
}),
|
||||
}),
|
||||
|
||||
emailConfig: router({
|
||||
|
||||
Reference in New Issue
Block a user