feat: Version 3.6.2 - Correctifs tâches #17-20
- #17: Amélioration gestion des secteurs et statistiques - #18: Optimisation services API et logs - #19: Corrections Flutter widgets et repositories - #20: Fix création passage - détection automatique ope_users.id vs users.id Suppression dossier web/ (migration vers app Flutter) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1225,6 +1225,86 @@ php scripts/php/migrate_from_backup.php \
|
||||
|
||||
---
|
||||
|
||||
#### 7. Statistiques Events pour Admin Flutter
|
||||
|
||||
**Demandé le :** 22/12/2025
|
||||
**Objectif :** Permettre aux admins Flutter de consulter les logs Events avec des stats quotidiennes, hebdomadaires et mensuelles, et drill-down vers le détail.
|
||||
|
||||
**Architecture choisie :** Stats pré-agrégées en SQL + détail JSONL à la demande
|
||||
|
||||
**Pourquoi cette approche :**
|
||||
|
||||
- Évite de parser les fichiers JSONL à chaque requête Flutter
|
||||
- Transfert minimal (~1-10 KB par requête)
|
||||
- Calculs hebdo/mensuel à la volée depuis `daily` (pas de tables supplémentaires)
|
||||
- Détail paginé uniquement sur demande
|
||||
|
||||
**Phase 1 : Base de données** ✅ (22/12/2025)
|
||||
|
||||
- [x] Créer la table `event_stats_daily`
|
||||
- Colonnes : `stat_date`, `entity_id`, `event_type`, `count`, `sum_amount`, `unique_users`, `metadata`
|
||||
- Index : `(entity_id, stat_date)`, unique `(stat_date, entity_id, event_type)`
|
||||
- [x] Script SQL de création : `scripts/sql/create_event_stats_daily.sql`
|
||||
|
||||
**Phase 2 : CRON d'agrégation** ✅ (22/12/2025)
|
||||
|
||||
- [x] Créer `scripts/cron/aggregate_event_stats.php`
|
||||
- Parse le fichier JSONL de J-1 (ou date passée en paramètre)
|
||||
- Agrège par entity_id et event_type
|
||||
- INSERT/UPDATE dans `event_stats_daily`
|
||||
- Calcule `unique_users` (COUNT DISTINCT sur user_id)
|
||||
- Calcule `sum_amount` pour les passages
|
||||
- Stocke metadata JSON (top 5 secteurs, erreurs fréquentes, etc.)
|
||||
- [x] Ajouter au crontab : exécution à 01h00 chaque nuit (via deploy-api.sh)
|
||||
- [x] Script de rattrapage : `php aggregate_event_stats.php --from=2025-01-01 --to=2025-12-21`
|
||||
|
||||
**Phase 3 : Service EventStatsService** ✅ (22/12/2025)
|
||||
|
||||
- [x] Créer `src/Services/EventStatsService.php`
|
||||
- `getSummary(?int $entityId, ?string $date)` : Stats du jour
|
||||
- `getDaily(?int $entityId, string $from, string $to, array $eventTypes)` : Stats journalières
|
||||
- `getWeekly(?int $entityId, string $from, string $to, array $eventTypes)` : Calculé depuis daily
|
||||
- `getMonthly(?int $entityId, int $year, array $eventTypes)` : Calculé depuis daily
|
||||
- `getDetails(?int $entityId, string $date, ?string $eventType, int $limit, int $offset)` : Lecture JSONL paginée
|
||||
- `getEventTypes()` : Liste des types d'événements disponibles
|
||||
- `hasStatsForDate(string $date)` : Vérifie si stats existent
|
||||
|
||||
**Phase 4 : Controller et Routes** ✅ (22/12/2025)
|
||||
|
||||
- [x] Créer `src/Controllers/EventStatsController.php`
|
||||
- `summary()` : GET /api/events/stats/summary?date=
|
||||
- `daily()` : GET /api/events/stats/daily?from=&to=&events=
|
||||
- `weekly()` : GET /api/events/stats/weekly?from=&to=&events=
|
||||
- `monthly()` : GET /api/events/stats/monthly?year=&events=
|
||||
- `details()` : GET /api/events/stats/details?date=&event=&limit=&offset=
|
||||
- `types()` : GET /api/events/stats/types
|
||||
- [x] Ajouter les routes dans `Router.php`
|
||||
- [x] Vérification des droits : Admin entité (role_id = 2) ou Super-admin (role_id = 1)
|
||||
- [x] Super-admin : peut voir toutes les entités (entity_id = NULL ou ?entity_id=X)
|
||||
|
||||
**Phase 5 : Optimisations** ✅ (22/12/2025)
|
||||
|
||||
- [x] Compression gzip sur les réponses JSON (si >1KB et client supporte)
|
||||
- [x] Header `ETag` sur /summary et /daily (cache 5 min, 304 Not Modified)
|
||||
- [x] Filtrage des champs sensibles dans /details (IP tronquée, user_agent supprimé)
|
||||
- [x] Limite max 100 events par requête /details
|
||||
|
||||
**Phase 6 : Tests et documentation**
|
||||
|
||||
- [ ] Tests unitaires EventStatsService
|
||||
- [ ] Tests endpoints avec différents rôles
|
||||
- [ ] Documentation Postman/Swagger des endpoints
|
||||
- [ ] Mise à jour TECHBOOK.md avec exemples de réponses JSON
|
||||
|
||||
**Estimation :** 2-3 jours de développement
|
||||
|
||||
**Dépendances :**
|
||||
|
||||
- EventLogService déjà en place ✅
|
||||
- Fichiers JSONL générés quotidiennement ✅
|
||||
|
||||
---
|
||||
|
||||
### 🟢 PRIORITÉ BASSE
|
||||
|
||||
#### 7. Amélioration de la suppression des utilisateurs
|
||||
|
||||
Reference in New Issue
Block a user