---
suivi: 1649
date: 2026-09-22
sujet: Scénario — correctif détection sections modifiées (régression #1648)
chantier: Foncier / Faisabilité
type: fix
statut: poussé
hash: 57033acf
fichiers:
  - resources/js/Pages/Foncier/Scenarios/Show.vue
  - tests/Unit/ScenarioDetectionSectionsModifiees1649SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1649_fix_detection_sections_modifiees.md
---

# SUIVI #1649 — détection dirty au modèle

## PROMPT ENVOYÉ

Régression bloquante #1648 : saisie InputNumber (ex. SURF. TOT. fiche) ne
passe jamais le bouton hors de « Aucune modification ». PHASE 1 diagnostic
obligatoire ; PHASE 2 détection fiable + filet de sécurité. Conserver
enchaînement série / dirty-only / droits / gelé / tableur.

## FICHES LUES

- **#1648** LEÇON — dirty avant onSuccess ; n’envoyer que l’ensemble dirty.
- **#1647** — InputNumber CELL_INPUT_NUM partout fiche/étude (cause directe).
- **#1642/#1643/#1641** — réorga balisage ; capture encore sur les cinq `<section>`.

## PHASE 1 — constats bruts

### `sectionsModifiees` / `onSectionInput` / capture
Présents sur les cinq sections (`identite`, `assiette`, `fiche`, `grille`,
`etude`) avec `@input.capture` / `@change.capture`. Clés alignées sur
`SECTIONS_ENREGISTRABLES`. `editable` ne filtre qu’à l’envoi, pas à l’entrée
dirty.

### Cause (preuve code PrimeVue)
`InputNumber` : `keypress` → `preventDefault` + valeur programmée ; émet
`update:modelValue` Vue, pas un `input`/`change` DOM natif qui remonte en
capture. `Select` : idem (événement Vue `change`, pas DOM natif bubble).
Checkbox / InputText natifs pouvaient encore passer — d’où l’asymétrie.

### Sections touchées
Les cinq : fiche / grille / étude (InputNumber+Select dominants) ; assiette
(surfaces InputNumber) ; identité (Select mode/statut + InputText — partiel
via capture, désormais couvert par watch form).

## PHASE 2 — correctif

- Watch profond sur `form` (identité), `assietteRows`, `ficheRows`, `lotRows`,
  `etudeSaisies` → `onSectionInput(cle)`.
- Verrou `detectionSuspendue` + `detectionPret` : ignore hydratation props /
  post-save / setup (watch immédiat étude).
- Filet : bouton cliquable dès qu’une section est éditable ; clic sans dirty
  → message, zéro PUT (jamais d’écran non enregistrable).
- Capture DOM conservée en filet secondaire.

## LEÇON

Après passage tableur PrimeVue, ne jamais s’appuyer sur `@input.capture` /
`@change.capture` pour dirty-check : brancher le modèle (`watch` / v-model).
Un bouton « désactivé tant que non dirty » est un piège productif si la
détection peut rater — garder un chemin cliquable + message.
