---
suivi: 1108
date: 2026-07-30
sujet: Foncier — erreurs de validation visibles + surface de référence auto
chantier: module-foncier
type: bugfix+feature
statut: poussé
hash: 718f8edc
fichiers:
  - resources/js/Components/FormErrorsSummary.vue
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - resources/js/Pages/Foncier/Parcelles/Form.vue
  - resources/js/Pages/Foncier/Parcelles/Index.vue
  - resources/js/Pages/Foncier/Proprietaires/Form.vue
  - resources/js/Pages/Foncier/Dossiers/Form.vue
  - resources/js/Pages/Foncier/Promesses/Show.vue
  - resources/js/Pages/Foncier/ActesFonciers/Create.vue
  - resources/js/Pages/Foncier/Secteurs/Index.vue
  - tests/Feature/Foncier/FoncierValidationVisibleSourceTest.php
  - tests/Feature/Foncier/FoncierOffrePerimetreTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1108_foncier_validation_visible_surface_auto.md
---

## PROMPT ENVOYÉ

SUIVI #1108 — formulaire offre silencieux à l’échec de validation ; surface de
référence pré-remplie (corrigé #1102) ; audit élargi tous formulaires foncier.

## PHASE 1 — AUDIT PATTERN ERREURS ERP

Pas de composant `InputError.vue`. Patterns existants :
- **Marchés** : `:invalid` PrimeVue + `<small class="text-red-600">` sous le champ ;
  parfois bandeau rouge en tête.
- **Juridique/Create** : résumé d’erreurs + `scrollIntoView`.

Décision : composant unique `FormErrorsSummary.vue` (résumé + scroll) + même
pattern sous-champ déjà utiliséé hors foncier. Pas de second système.

### État avant (#1108) — affichage erreurs

| Formulaire | Avant |
|---|---|
| Offre (Dossiers/Show) | Partiel (surtout `parcelle_ids`) — bug d’origine |
| Réponse offre | Non |
| Promesse create (dossier) | Partiel |
| Parcelle Form | Non |
| Parcelle saisie rapide | Partiel |
| Propriétaire Form | Non |
| Dossier Form | Partiel |
| Promesse Show + CS | Non |
| Acte Create | Oui (sous-champ, sans résumé) |
| Secteur | Non |

## LIVRÉ

### Erreurs visibles
- `FormErrorsSummary` : résumé en tête, scroll auto, labels métier.
- Tous les formulaires foncier ci-dessus : résumé + bordure `:invalid` + message
  sous champ + astérisques alignés sur la validation **serveur**.
- Offre : feedback bouton (loading/disabled) ; flash succès existant conservé ;
  saisie Inertia préservée (`preserveScroll`, pas de reset onError).

### Surface de référence (#1108 corrige #1102)
- Pré-remplissage auto = somme des surfaces souhaitées.
- Flag `surfaceRefManuelle` (+ garde `surfaceRefApplying` pour ne pas confondre
  update programmatique et saisie utilisateur — leçon #1070).
- Bouton « Recalculer depuis les parcelles » (remplace « Reporter la somme… »).
- Badge « Calculée » / « Saisie manuelle ».

### Totalité si surface souhaitée vide
**Arpentée si connue, sinon cadastrale** (`surfaceRefParcelle`) — surface réelle
la plus fiable pour un prix ; cohérent avec l’indicateur de dépassement #1102.

### Non modifié
Pivot `offre_parcelle`, 3 périmètres, ACL #1075, alertes #1077, audit #1107.

## TABLEAU CHAMPS REQUIS (offre)

| Champ | Requis serveur | Marqué UI | Erreur affichée |
|---|---|---|---|
| proprietaire_id | oui | * | oui |
| mode_prix | oui | (toujours rempli) | oui |
| montant | forfaitaire (create) / toujours (edit) | * si forfaitaire | oui |
| prix_m2 | non (nullable) | * si au_m² (confort) | oui |
| surface_reference_m2 | non (nullable) | * si au_m² (confort) | oui |
| date_offre | oui | * | oui |
| parcelle_ids | oui min:1 | * | oui |
| date_validite, statut, document_url, commentaire | non | — | oui si erreur |

## LEÇON

Un formulaire qui échoue en silence est pire qu’un formulaire qui refuse —
l’utilisateur conclut que l’application est cassée.
