---
name: project-dashboard-kpis
description: "KPIs Dashboard — TrendBadge, logique M vs M-1, capital investi et en risque avec comparaison mensuelle"
metadata: 
  node_type: memory
  type: project
  originSessionId: 752b3578-1999-4431-9dd9-73297a9baaf4
---

6 KPIs dans l'ordre : Capital investi · Capital en risque · Performance annualisée · Intérêts bruts/nets · Capital remboursé · Cashback reçu.

**Composants dans Dashboard.jsx :**
- `TrendBadge({ current, prev, invert })` — badge ↗/↘ vert/rouge, `invert=true` pour Capital en risque (hausse = mauvais)
- `KpiCard({ title, value, badge, refValue })` — carte label uppercase, valeur large, badge inline, ref grise dessous
- `DashboardKpis({ portfolio, netMode, pfuRates, capitalMensuelData })` — enfant de `InteretsChartProvider`

**Logique comparaison selon sélecteur d'année :**
- Année courante (N) : valeur = mois en cours, badge = M vs M-1, ref = `X € en avr. 2026`
- Année passée (N-x) : valeur = total annuel, badge = N vs N-1, ref = `X € en 2024`
- modeGlobal : cumul sans badge

**Capital investi et Capital en risque — comparaison mensuelle (2026-05-31) :**
- Backend `dashboard.js` boucle `capitalMensuel` : chaque entrée contient maintenant `{ mois, capital, en_defaut }` — `en_defaut` = somme capital des prêts `en_retard`/`procédure`
- Frontend : `capitalCurrent/capitalPrev` et `enDefautCurrent/enDefautPrev` extraits de `capitalMensuelData` dans le `useMemo` de `thisMonthRow`
- Badge ne s'affiche que si `isCurrentYear` et `prev > 0`
- Approximation : statut non historisé → valeur mensuelle `en_defaut` reflète le statut actuel projeté rétrospectivement

**Données source :**
- `rawData.rembourses` (mensuel) — `{ mois, interets_bruts, interets_nets, capital, cashback }`
- `rawDataGlobal.rembourses` (annuel) — `{ annee, interets_bruts, interets_nets, capital, cashback }`
- `capitalMensuelData` — prop passée depuis Dashboard parent via `onCapitalMensuel` de `TableauInteretsPlateforme`
- `currentYear`, `currentMonth`, `rawData`, `rawDataGlobal` exposés depuis `InteretsChartContext`

**How to apply:** Respecter la distinction `isCurrentYear` pour choisir entre granularité mensuelle (N) et annuelle (N-x). Tout nouveau KPI affichant des intérêts doit utiliser `netMode` pour basculer brut/net.
