---
suivi: 1591
date: 2026-09-17
sujet: Retouches entête fiche dossier foncier
chantier: foncier / dossiers
type: feature
statut: poussé
hash: 83d971c9
fichiers:
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - routes/web.php
  - resources/js/Components/Foncier/InlineEditableField.vue
  - resources/js/Components/Foncier/DossierSyntheseTab.vue
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - tests/Unit/DossierFoncier1591EnteteSourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1591_retouches_entete_dossier.md
---

# SUIVI #1591 — Retouches entête dossier foncier

## PROMPT ENVOYÉ

Quatre retouches fiche dossier : statut inline dans l’entête (patron
InlineEditableField) avec confirmation avant clôture et recalcul
parcelles (#1569) ; badge sans origine ; préfixe PROGRAMME : ; retrait
du prix demandé de la modale (colonne conservée). Pas de migration.
Sérialisé après #1589 / #1590.

## FICHES LUES

- **#1197 LEÇON** — réutiliser InlineEditableField ; ne pas retirer
  `prix_demande` de la whitelist (D67). Impact : confirmBefore ajouté
  au composant existant ; `prix_demande` reste dans
  `champsInlineAutorises()` et en base.
- **#1569 LEÇON** — `exploree` seulement s’il n’existe plus de dossier
  vivant ; `deduire()` inchangé. Impact : `statutImpact` mute les
  faits de CE dossier puis appelle `deduire()` ; un autre dossier
  encore ouvert empêche le passage en Explorée.
- **#1579 / #1583** — journal déjà alimenté par audit `statut` +
  agrégateur `statut_change`. Impact : aucun toucher à l’agrégateur.
- **#1447** — patron visuel parcelle, pas le composant dossier.
  Impact : composant réel = `Components/Foncier/InlineEditableField.vue`.
- **#1589 / #1590 LEÇON** — Show.vue / DossierSyntheseTab / AppShell
  en série. Impact : ce lot ne touche pas AppShell ni Index.vue.

## RÉFÉRENTIEL STATUTS DOSSIER (établi avant code)

Source unique : `FoncierReferentiels::STATUTS_DOSSIER`. Quatre valeurs,
alignées sur #1569. Aucune autre dans le référentiel.

| Libellé affiché | Valeur postée | Colonne DB | Libellé back |
|---|---|---|---|
| En cours | `en_cours` | `dossiers_fonciers.statut` | En cours |
| En veille | `en_veille` | `dossiers_fonciers.statut` | En veille |
| Terminée | `terminee` | `dossiers_fonciers.statut` | Terminée |
| Annulée | `annulee` | `dossiers_fonciers.statut` | Annulée |

Clôture (#1569) : `terminee` et `annulee` → dossier clos. `en_cours`
et `en_veille` → dossier vivant.

## POINT DE RECALCUL BRANCHÉ

- **Déjà présent** : `DossierFoncierController::updateChamp` si
  `$champ === 'statut'` → `ParcelleStatutService::recalculerIds`.
- **Ajouté** : `DossierFoncierController::update` si l’ancien statut
  ≠ le nouveau → même appel (la modale n’utilise plus PUT, mais le
  point reste cohérent).
- **Non modifié** : `ParcelleStatutService::deduire` / `chargerFaits`.
- **Aperçu avant clôture** : `GET .../statut-impact?valeur=`
  (`statutImpact`) appelle `chargerFaits` + `deduire` après avoir
  simulé `dossier_vivant` hors ce dossier et `dossier_clos = true`.

## PRIX DEMANDÉ — AUTRES SURFACES (signalées, non retirées)

Retrait UI uniquement dans la modale « Modifier le dossier ».
Colonne `dossiers_fonciers.prix_demande` conservée. Pas de migration.

Autres lecteurs **laissés en place** (arbitrage Robin : ne pas
effacer) :

- payload `serializeShow` / `serializeListItem` (`prix_demande`)
- `serializeIndicateurPrix` → `indicateur_prix.prix_demande` (D67,
  plus affiché sur la synthèse depuis #1557)
- PATCH whitelist `champsInlineAutorises()` + audit sensible
- alerte revue de veille `DossierVeilleRevueType` (ligne « Prix
  demandé : … € »)

Aucune autre occurrence Vue hors la modale (retirée).

## DROITS

Même droit que la modification du dossier : `authorize('update')` =
`userCanManageRecord` (créateur, droit GESTION, direction / admin).
`abort_unless($user instanceof User && $user->can('update', $dossierFoncier), 403)`
sur `updateChamp` et `statutImpact`. `Gate::before` renvoie `true`
pour `GS_ADMIN_ERP` : un test avec le compte Robin ne prouve pas le
refus.

## SYNTHÈSE

Statut éditable en place dans le badge d’entête ; confirmation
nommant les parcelles avant Terminée / Annulée ; badge = statut seul ;
ligne programme préfixée ; prix demandé retiré de la modale.

## DÉPLOIEMENT-TEST

OVH : `git pull origin main` ; `php artisan optimize:clear` ;
`route:clear` (route `dossiers.statut.impact` ajoutée) ;
`journal:sync`. Pas de `migrate`.

Requête de vérification des prix demandés existants (ne doit pas
vider la colonne) :

SELECT id, reference, prix_demande
FROM dossiers_fonciers
WHERE prix_demande IS NOT NULL
ORDER BY id;

(Ajouter `AND deleted_at IS NULL` pour exclure la corbeille #1589.)

## LEÇON

Le badge « En cours · Prospection » était `statut · origine` dans
`DossierSyntheseTab`, pas la ligne meta de Show.vue (qui dit déjà
« Origine … »). Confirmation de clôture : ne pas forcer
`dossier_vivant = false` sans regarder les autres dossiers encore
ouverts, sinon l’aperçu ment par rapport à `deduire()`. `prix_demande`
reste dans la whitelist PATCH : le retirer casserait D67 et un PATCH
légitime historique ; seule l’UI de la modale disparaît.
