---
suivi: 1654
date: 2026-09-22
sujet: Seuils de couleur étude Fi + barre KPI à cinq indicateurs
chantier: Foncier / Faisabilité
type: feature
statut: poussé
hash: f1607ee1
fichiers:
  - resources/js/utils/seuilsIndicateursEtudeFi.js
  - resources/js/Pages/Foncier/Scenarios/Show.vue
  - resources/js/Components/Foncier/ScenarioKpiBar.vue
  - tests/Unit/ScenarioSeuilsCouleurBarreKpi1654SourceTest.php
  - tests/Unit/ScenarioBarreKpiEtUnites1640SourceTest.php
  - tests/Unit/ScenarioKpiBar1634SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1654_seuils_couleur_et_barre_kpi.md
---

# SUIVI #1654 — seuils de couleur et barre KPI

## PROMPT ENVOYÉ

Lot PUREMENT VISUEL. Trois lignes de l'étude Fi (consolide_par_lot,
benefice_pct_ca_ht, consolide_pct_prix_revient) reçoivent un fond selon
les seuils de Robin. Barre KPI réduite à cinq indicateurs, une rangée,
mêmes couleurs. Aucun calcul.

## FICHES LUES

- **#1640** — barre téléportée, fond blue-50, deux rangées, Teleport
  AppShell. Conservé : hôte, fond, repli sessionStorage, bouton #1648.
  Abandonné : la seconde rangée (arbitrage Robin).
- **#1641** — hauteurs zone collante 85 px après ancres. Recalculée.
- **#1652** — overlay etudeLive.totaux : les couleurs suivent eTot.
- **#1653** — Show.vue en série. Rebase origin/main avant Vite.

Anti-collision : 1653 est le dernier numéro. **1654 est libre.**
AppShell.vue NON touché.

## SYNTHÈSE

### Source unique des seuils

`resources/js/utils/seuilsIndicateursEtudeFi.js` —
`SEUILS_INDICATEURS_ETUDE_FI` + `palierSeuilIndicateur` +
`classeSeuilIndicateur`. Show.vue appelle `classeSeuilAffiche(code)` qui
délègue à `classeSeuilIndicateur(code, eTot(code))` si `peut_prix`.
Barre et tableau : même fonction, même source.

Valeur 0 ou absente → pas de palier (fond neutre). Un scénario vide
n'alarme pas.

Sans `peut_prix` : `classeSeuilAffiche` retourne null, la barre n'émet
aucun KPI.

### Mapping des barèmes

| Libellé | Code | Bornes (incl. bas / excl. haut) | Palier | Classes |
|---|---|---|---|---|
| Consolidé par lot Hectare | `consolide_par_lot` | < 10 000 / ≥ 10k < 20k / ≥ 20k < 30k / ≥ 30k | rouge / orange / vert / vert foncé | `bg-red-100 text-red-900` / `bg-amber-100 text-amber-900` / `bg-emerald-100 text-emerald-900` / `bg-emerald-600 text-white` |
| % bénéfice / CA HT | `benefice_pct_ca_ht` | < 10 % / ≥ 10 < 12 / ≥ 12 < 15 / ≥ 15 | rouge / vert-jaune / vert / vert foncé | rouge idem / `bg-green-100 text-green-800` / vert / vert foncé |
| % consolidé / prix de revient | `consolide_pct_prix_revient` | < 20 % / ≥ 20 < 23 / ≥ 23 < 25 / ≥ 25 | idem A2 | idem A2 |

Bornes `%` stockées en points (10, 12, 15) ; comparaison sur le ratio
moteur (`b / 100`). Preuve palette : red-100 FournisseursAudit, amber-100
HF/Gelé, green-100 SuiviDev, emerald-100 AcquereursGrille, emerald-600
Factures/Show.

Contraste : texte teinté sur fonds clairs, `text-white` sur vert foncé ;
montants `font-bold` sur les trois lignes.

V1 DF-2026-0012 : 25 145,83 € → vert ; 18,01 % → vert foncé ; 37,33 % →
vert foncé.

### Barre

Cinq blocs, une rangée `flex-wrap`, valeur `text-[18px] font-bold
tabular-nums`, libellé `text-[10px] uppercase`. Résultat consolidé :
`bg-emerald-50` (tone success). Bénéfice brut : `bg-blue-100` (tone
accent). Les trois autres : `seuilClass`. Repli sessionStorage et bouton
Enregistrer inchangés. Fond `bg-blue-50` conservé. Teleport inchangé.

Hauteur zone collante (somme paddings / lignes, méthode #1641) :
- Avant (#1641) : **85 px** (deux rangées KPI + ancres)
- Après : `py-1.5` 12 + bloc KPI (`py-1.5` 12 + label 12 + valeur 22) 46
  + `border-b-2` 2 + `mt-1` 4 + ancre 24 − `-mb-[2px]` 2 = **86 px**

### Garde-fous

Aucun PHP applicatif. Moteur, ScenarioEtudeFiService, recalcul #1651
intacts. Grille #1653, haut de page #1641, AppShell non touchés.
`overflow-x-hidden` absent.

## DÉPLOIEMENT-TEST

```
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Aucune migration. Pas de route.

1. V1 : VERT / VERT FONCÉ / VERT FONCÉ.
2. Bornes exactes : pile sur la borne → palier supérieur.
3. Même couleur barre et étude Fi.
4. Scénario vide : fond neutre.
5. Sans `peut_prix` : pas de montant, pas de couleur.
6. Cinq indicateurs, une rangée, 1366 / 1920 sans ascenseur.
7. Treize KPI retirés absents de la barre, présents dans l'étude / bandes.
8. Repli Indicateurs mémorisé.
9. Bouton Enregistrer à sa place.
10. Recalcul live : palier qui change sans enregistrer.
11. Gelé : couleurs visibles, rien de saisissable.

## LEÇON

Un barème recopié dans la barre ET dans le tableau diverge dès le premier
ajustement de borne. Une fonction unique + une source `eTot` unique. 0
n'est pas un rouge : c'est l'état d'un scénario qu'on vient de créer.
Une couleur sans le droit prix trahit l'ordre de grandeur.
