---
suivi: 1184
date: 2026-08-04
sujet: Résumé programme — cartes #1177 invisibles (enseigne partielle)
chantier: commercialisation
type: bugfix
statut: poussé
hash: 8eb5a612
fichiers:
  - app/Http/Controllers/ProgrammeDashboardController.php
  - app/Support/ProgrammeDashboardPresenter.php
  - app/Models/Programme.php
  - tests/Unit/ProgrammeEnseignePartialLoad1184Test.php
  - docs/suivi/SUIVI_1184_resume_cartes_enseigne_partielle.md
---

## PROMPT ENVOYÉ

SUIVI #1184 — cartes « Commercial · recette » et « Alertes du programme » (#1177)
absentes sur RÉSUMÉ programme 2 malgré builder OK, props déclarées, bundle OK.
Prouver composant monté + props réelles ; ne pas retoucher le front à l’aveugle ;
ne pas casser les 5 cartes préexistantes.

## SYNTHÈSE

### Fiches lues
- `SUIVI_1177` — LEÇON : recette TTC à côté de la dépense HT. Approche : le front
  et le builder sont sains ; le gap est entre tinker (enseigne complète) et la
  requête HTTP (eager load partiel).

### Cause exacte (prouvée)
`ProgrammeDashboardController::show` faisait `load(['enseigne:id,nom', …])`.
`modules_actifs` n’est **pas** sélectionné. `Programme::enseigneAModule` appelle
`loadMissing('enseigne')` : la relation est déjà présente → **pas de reload**.
`Enseigne::aModule` voit `modules_actifs` absent → `false` →
`peutVoirCommercial` → `visible: false` → `v-if` front masque les deux cartes.

Le tinker `Programme::find(2)` charge l’enseigne **complète** → `visible: true`.
D’où l’apparente contradiction « back OK / UI vide ».

### Composant monté
`GET /programmes/{id}` → Inertia `Programmes/Dashboard` (route
`programmes.dashboard`). Rangée 3 (#1177) est bien **dans** le template résumé
(sibling des rangées 1–2). Aucun second composant. Aucun défaut de bundle.
Les 5 cartes préexistantes n’utilisent pas `enseigneAModule` pour leur `v-if`
→ non affectées par le bug ni par le correctif.

### Correctif
1. Eager load : `enseigne:id,nom,modules_actifs` (contrôleur + presenter).
2. Garde-fou `Programme::enseigneAModule` : `refresh()` si `modules_actifs`
   absent des attributes (autres loads partiels futurs).
3. Pas de changement front / `public/build/` (cause 100 % back).

## DÉPLOIEMENT-TEST

1. `git pull origin main` ; `optimize:clear` ; `view:clear` (pas de migrate)
2. `/programmes/2` : cartes Recette (CA 8 749 574 € TTC) + 3 alertes
3. Clic alerte → grille Acquéreurs filtrée
4. Cinq cartes préexistantes inchangées
5. Programme 0 alerte → pas de bloc Alertes vide ; ARBOREA (id 1) OK

## LEÇON

Un eager load Eloquent à colonnes restreintes (`relation:id,nom`) + `loadMissing`
ultérieur = piège silencieux. Toute colonne lue ensuite (`modules_actifs`, etc.)
doit être dans le select — ou le helper doit détecter l’absence et recharger.
Ne jamais valider un builder « à la main » sans rejouer le **même** `load()` que
le contrôleur.
