---
suivi: 1111
date: 2026-07-30
sujet: Foncier — inversion modèle dossier porte les propriétaires
chantier: module-foncier
type: feature
statut: poussé
hash: a8cd9769
fichiers:
  - database/migrations/2026_07_30_235000_create_dossier_foncier_proprietaire_table.php
  - app/Models/DossierFoncier.php
  - app/Models/Proprietaire.php
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - routes/web.php
  - resources/js/Pages/Foncier/Dossiers/Form.vue
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - tests/Feature/Foncier/FoncierDossierPorteProprietairesSourceTest.php
  - tests/Feature/Foncier/FoncierDossierPorteProprietairesTest.php
  - tests/Feature/Foncier/FoncierRattachementParcellesDossierSourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1111_foncier_dossier_porte_proprietaires.md
---

## PROMPT ENVOYÉ

SUIVI #1111 — inversion D51 : le dossier porte les propriétaires ; parcelles
dérivées (détention courante) ; offre source = propriétaires ; pivot parcelle
déprécié.

## PHASE 1 — DIAGNOSTIC (sortie brute)

### 1. Volumétrie `dossier_foncier_parcelle`
Local Cursor (`erp_immo`) : table ABSENTE (module foncier non migré en local).
Contexte phase de test → volumétrie attendue nulle / minime en prod.
Diag OVH à lancer après migrate : `SELECT COUNT(*) FROM dossier_foncier_parcelle;`
`SELECT COUNT(DISTINCT dossier_foncier_id) FROM dossier_foncier_parcelle;`

### 2. Usages `dossiers_fonciers.enseigne_id`
| Fichier:ligne | Usage |
|---|---|
| DossierFoncier.php:24 | fillable |
| DossierFoncierController create/store/edit/update/serialize | validation + affichage |
| migration 150200 | FK + index statut/enseigne |
| tests | fixtures |
Pas de filtre de liste par enseigne. Pas d’ACL. Pas de préfixe de référence
(`generateReference` = DF-YYYY-NNNN). `FoncierContext` : pas d’enseigne courante.
SIGNAL : `enseignesOptions()` peut renvoyer N enseignes foncier actives ; le choix
n’a **pas d’effet opérationnel** aujourd’hui → auto-renseignement serveur (1re
par nom) sans sélecteur à la création.

### 3. Usages `dossiers_fonciers.code_insee_commune`
| Fichier:ligne | Usage |
|---|---|
| DossierFoncier commune() | relation |
| Controller create/serialize/list | affichage + résolution create historique |
Alerte « réveil groupé PLUi » : **NON implémentée**. Registry #1077 =
`dossier_veille_revue`, `dossier_sans_echange`, `offre_expiration`,
`condition_suspensive_echeance` uniquement.
Solution future (décrite, partiellement simple à la création) : dériver la commune
si toutes les parcelles courantes des propriétaires partagent le même INSEE
(`resoudreCommuneDepuisProprietaires`) — déjà branché à la création.

### 4. Consommateurs `dossier_foncier_parcelle`
- DossierFoncierController : create sync (remplacé), attach/detach #1101 (retirés),
  show serialize, indicateur surfaces
- OffreFonciereController : assertParcelles (→ candidats #1111)
- PromesseFonciereController : liste parcelles dossier (#1089 — inchangé)
- Show.vue #1101 UI (retirée)
RISQUE : promesses liraient un pivot vide sur dossiers neufs.
MITIGATION : `syncParcellesMiroirDepuisProprietaires()` — miroir technique sans UI.

## LIVRÉ
- Pivot `dossier_foncier_proprietaire` + relations
- Création : libellé + propriétaires (+ origine, responsables) ; enseigne serveur
- Fiche : onglets Propriétaires / Parcelles dérivées + engagements
- Offre : candidats = détentions courantes des propriétaires (#1102 priorité conservée)
- `dossier_foncier_parcelle` DÉPRÉCIÉ (conservé, miroir auto)

## LEÇON

D51 inversée — l’ordre de travail réel part du propriétaire, pas de la parcelle.
L’exigence d’une vérité unique est préservée, son sens est retourné ; et
`dossier_foncier_parcelle` est déprécié plutôt que supprimé.
