---
suivi: 1509
date: 2026-09-10
sujet: Multiparcelle — état foncier obligatoire, cinq colonnes sans chevauchement
chantier: foncier / parcelles / saisie multi
type: fix
statut: poussé
hash: a15cc73f
fichiers:
  - app/Services/Foncier/ParcelleCreationService.php
  - resources/js/Components/Foncier/Prospection/ProspectionSaisieDialog.vue
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - tests/Unit/Parcelle1509SourceTest.php
  - tests/Feature/Foncier/FoncierMultiparcelle1509Test.php
  - tests/Feature/Foncier/FoncierProspectionSourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1509_multiparcelle_etat_foncier.md
---

# SUIVI #1509 — Ajouter multiparcelle + état foncier

## PROMPT ENVOYÉ

Retour d’usage Robin sur `/foncier/parcelles` (redirige vers Prospection) :
colonnes qui se chevauchent dans la modale multi-lignes ; ajouter État
foncier obligatoire (vide par défaut, pas de repli MySQL `reperee`) ;
retirer Société détentrice ; élargir la modale sans `overflow-x-hidden` ;
renommer le bouton et le titre en « Ajouter multiparcelle ». Cinq
colonnes sur une ligne. Push direct `origin/main`.

## BASE GIT

HEAD de départ `e1c45252` (fiche #1508). Prompt citait `d36d3bb8` (#1506) :
#1507 et #1508 déjà sur `origin/main` au rebase. Bundles #1507 non
écrasés. Zone disjointe (Foncier / parcelles). Hash feature `a15cc73f`.
Bundle Prospection : `Index-CWzMwMKP.js` (+ CSS `Index-BuZXodIk.css`).

## FICHES LUES

- **#1463 LEÇON** — paliers 860 / 1280 ; ne pas toucher Show.vue société
  détentrice (affichage si `source === 'acte'`, `:editable="false"`).
  Impact : correctif confiné à la modale ; fiche inchangée.
- **#1428** — **absente du disque** (confirmé #1508). Mémoire : ne pas
  ajouter une surface sans filtre de visibilité. Impact : aucune route
  nouvelle ; `storeBatch` existant.
- **#1242 LEÇON** — validation batch par ligne, jamais tout-ou-rien.
  `ROW_COUNT_INITIAL = 10` intentionnel ; conservé, à trancher plus tard.
- **#1246** — colonne société ajoutée dans la grille ; retirée ici
  (option A Robin : incompatible avec l’ajout multiple).
- **#1271 / #1444 / #1483** — `overflow-x-hidden` interdit ; test source
  durable.

## SYNTHÈSE

Cause du chevauchement : `ProspectionSaisieDialog.vue` — Dialog
`max-w-5xl` (1024 px) + tableau `min-w-full` + `th min-w-[14rem]`
(Société détentrice) et `th min-w-[11rem]` (Commune) + `overflow-x-auto`.
Les en-têtes Surface cad. / Société détentrice s’empiétaient ; le
contenu débordait.

Correctif : cinq colonnes en grille `minmax(0, …fr)` dans une modale
`width: min(96vw, 80rem)`. Pas d’`overflow-x-hidden`, pas de scroll
horizontal imbriqué. < 860 px : deux rangées (3 + 2) avec labels locaux.

Liste des états : `FoncierReferentiels::ETATS_FONCIERS` (13 valeurs
varchar, pas ENUM). Le 14ᵉ item observé à l’écran est le placeholder
« Choisir… » (aucune valeur postée). Absence d’état → refus
`required` + `Rule::in`, **pas** de repli `reperee`.

Point d’entrée unique confirmé : menu Parcelles → `/foncier/prospection` ;
`ParcelleController::index` redirige. Un seul bouton, renommé.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Pas de migration. JAMAIS npm/composer/optimize/config:cache sur OVH.

Contrôle visuel Robin (agent sans navigateur) : 1440 / 1100 / 800 px ;
ligne sans état refusée ; société détentrice absente de la modale,
présente sur la fiche (non-régression #1463).

## LEÇON

`parcelles.etat_foncier` NOT NULL DEFAULT `reperee` n’autorise pas un
repli silencieux : `applyServerDefaults` unitaire reste `reperee` ;
le batch exige la valeur saisie. Trop de `min-w-*` dans un tableau
étroit (`max-w-5xl`) = chevauchement d’en-têtes — élargir et répartir
(`minmax(0, fr)`), ne jamais masquer. Dix lignes vides à l’ouverture
sont un choix #1242, pas un bug : signaler, ne pas changer sans
arbitrage.
