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:
2026-01-16 14:11:15 +01:00
parent 7b78037175
commit 232940b1eb
196 changed files with 8483 additions and 7966 deletions

View File

@@ -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