---
suivi: 1197
date: 2026-08-05
sujet: Foncier — édition inline synthèse dossier
chantier: module-foncier
type: feature
statut: poussé
hash: aafa3a59
fichiers:
  - app/Models/DossierFoncier.php
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - routes/web.php
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - resources/js/Pages/Foncier/Dossiers/Form.vue
  - resources/js/Components/Foncier/DossierFoncierTab.vue
  - resources/js/Components/Foncier/InlineEditableField.vue
  - tests/Feature/Foncier/FoncierDossierInline1197SourceTest.php
  - tests/Feature/Foncier/FoncierDossierPorteProprietairesSourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1197_foncier_dossier_edition_inline.md
---

## PROMPT ENVOYÉ

SUIVI #1197 — édition inline synthèse (plus d’écran /edit), retrait champs
sous réserve étape 0, commune non restrictive, après #1194/#1195/#1196.

## SYNTHÈSE

### Étape 0 — volumes (DB locale)
Bases locales `erp_immo_migrate_1113` / `erp_immo_1099` : **0 dossier**.
Colonnes présentes : `adresse`, `prix_demande`, `prix_cible`, `commentaire`.
Remplissage local : 0/0 pour les quatre. Prod non mesurable depuis ce poste —
vérifier à l’écran / SQL OVH au déploiement.

### D67 — prix_demande
L’indicateur **existe déjà** : `serializeIndicateurPrix` + bloc « Écart de prix »
sur la synthèse (Demandé → négociation → promesse). Lecteurs :
`DossierFoncierController` (show/list), payload JSON. **prix_demande conservé**
éditable en ligne (point de départ). **prix_cible** retiré de l’UI (pas dans D67).
Question ouverte pour Robin : confirmer si le prix demandé doit rester sur la
synthèse ou migrer ailleurs (ex. uniquement dans le bloc écart).

### Mode d’édition
**Champ par champ** (position du prompt) via `InlineEditableField.vue` réutilisé
(#1107). Commune / responsables : mini-éditeurs dédiés (CommuneSelect / MultiSelect)
avec PATCH whitelist + erreur visible. Pas de formulaire global « Enregistrer ».

### Objet 2 — champs retirés
Retirés de l’UI + whitelist : `adresse`, `prix_cible`, `commentaire`.
Colonnes DB **conservées**. Résiduels encore renseignés : affichés en lecture
seule « (historique) » (anti-#1178). POST de ces clés sur PUT → 422 visible.

### Objet 3 — commune
`searchParcelles` ne filtrait **déjà pas** par `code_insee` du dossier.
Création parcelle : préremplissage confort, désormais libellé « librement
surchargeable ». Filtre UI « Toutes les communes » dans l’onglet FONCIER =
filtre d’affichage local, pas une contrainte serveur.

### Audit
`DossierFoncier` n’avait **pas** `AuditsFieldChanges` — **ajouté** (#1197) pour
les champs inline + `recordChange` manuel sur responsables.

### Droits
`updateChamp` / anciens champs : `authorize('update')` = même policy que l’ancien
`/edit`. `peut_update` gouverne l’UI. `/edit` → redirect `?onglet=synthese`
(`authorize('view')` pour éviter 404/403 sur favoris lecture).

## DÉPLOIEMENT-TEST

1. git pull ; view:clear ; journal:sync
2. Synthèse : éditer libellé / statut / commune / responsables ; F5
3. Champ refusé → erreur rouge visible
4. Référence non éditable ; /edit redirige
5. Recherche parcelle autre commune OK ; création autre INSEE OK
6. Non habilité : pas d’✎ / 403 PATCH
7. Ancre #synthese / ?onglet=synthese OK
8. SQL prod (optionnel) : taux remplissage adresse/prix_*/commentaire

## LEÇON

Ne pas retirer un champ lu par un indicateur déjà en prod (D67 / prix_demande)
sans arbitrage métier — la mesure locale vide ne dispense pas de lire les
consommateurs code. InlineEditableField existe : le réutiliser avant d’en
réécrire un.
