# StockMaster Pro — Patch v2.3.6 — Pilotage intelligent
Date : 2026-02-28

## Problèmes corrigés

### Pourquoi la page affichait "—" et "OK" partout

Le backend calculait TOUT correctement depuis le début :
- `daysLeft` (jours avant rupture)
- `avgDaily` (consommation journalière)
- `projectedQty` (stock projeté à l'horizon)
- `dynamicSafety` (seuil de sécurité dynamique)
- `risk` : 'ok' / 'attention' / 'alerte' / 'critique'

Mais le frontend lisait les mauvaises clés :
- `r.daysToRupture` → n'existe pas, la vraie clé est `r.daysLeft`
- `r.riskLabel` → n'existe pas, la vraie clé est `r.risk`
- `r.inactiveDays` → n'existe pas, calculé depuis `r.lastMovementAt`
- Les risques "OK" s'affichaient tous (pas de filtre)
- L'API découpait les risques à 10 éléments (`array_slice`) → données incomplètes

---

## Ce qui est activé (v2.7.0)

### KPIs dashboard (4 tuiles)
- Valeur stock totale
- 🔴 Critiques : produits avec ≤ 7 jours de stock restant (en rouge si > 0)
- 🟠 En alerte : produits avec ≤ 60 jours (attention + alerte cumulés)
- 🕓 Dormants : produits sans mouvement depuis N jours

### Top consommés
- Consommation totale + moyenne journalière affichée
- Libellé de la période analysée

### Risques de rupture (corrigé + enrichi)
- Filtre : uniquement les produits avec consommation réelle (avgDaily > 0)
- Tri automatique : critiques → alertes → attention → OK
- Colonnes : stock actuel · jours restants colorés · **date estimée de rupture** · badge niveau
- Badges colorés : 🔴 Critique / 🟠 Alerte / 🟡 Attention / 🟢 OK

### Projections stock (NOUVEAU)
- Nouvelle section : stock projeté à l'horizon choisi
- Consommation prévue calculée (avgDaily × horizonDays)
- Barre de progression visuelle (vert → orange → rouge)
- Seuil de sécurité dynamique affiché

### Produits dormants (corrigé)
- Jours inactifs calculés depuis `lastMovementAt` (et non valeur fixe)
- Coloration : rouge si > 365j, orange si > 180j
- Date du dernier mouvement affichée

## Fichiers modifiés (2)
```
assets/js/pages/analytics.js   ← Réécriture complète (v2.7.0)
api/analytics.php               ← Retourne tous les risques + inactiveDays + windowDays dans topRows
```
