---
suivi: 1849
date: 2026-10-12
sujet: Détenteurs déduits du périmètre, partout à la place du pivot propriétaire
chantier: foncier
type: evolution
statut: poussé
hash: d68e02140
fichiers:
  - app/Models/DossierFoncier.php
  - app/Models/Scopes/FoncierParcelleVisibiliteScope.php
  - app/Services/Foncier/DossierPerimetreSaisieService.php
  - app/Services/Foncier/FoncierParcelleVisibiliteService.php
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - app/Services/Foncier/ScenarioFicheFonciereService.php
  - app/Services/Depot/DepotProjetDossierService.php
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - app/Http/Controllers/Foncier/PromesseFonciereController.php
  - app/Http/Controllers/Foncier/ProspectionController.php
  - routes/web.php
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Feature/Foncier/FoncierDetenteursDeduits1849Test.php
  - public/build/manifest.json
  - docs/suivi/SUIVI_1849_detenteurs_deduits_dossier.md
---

# SUIVI #1849 — détenteurs déduits du dossier

## PROMPT ENVOYÉ

Phase 2, lot 2/3. Les propriétaires d’un dossier sont les détenteurs courants des parcelles du périmètre, société détentrice comprise. Une méthode centrale. Le pivot n’est plus lu ni écrit. Négociation, promesses, visibilité, prospection, journal du dépôt projet. Routes d’attache et de détache supprimées.

## Fiches lues

- #1837 : pas de fiche dans `docs/suivi/`. Le diagnostic (conversation) disait que l’ajout d’un propriétaire recopiait toutes ses détentions, et que la visibilité ainsi que les négociations liraient encore le pivot jusqu’au lot 2.
- #1838 LEÇON : ne pas resynchroniser les détentions d’un propriétaire vers le périmètre. Le pivot alimentait encore la visibilité et les négociations. Ce lot coupe cette lecture. Le retrait d’une parcelle ne clôt toujours pas la détention.
- #1289 : le périmètre est `dossier_foncier_parcelle`. La branche de visibilité conservée est celle-là.
- #1514 : la visibilité parcelle est créateur ou dossier habilité. La branche « toutes les détentions du propriétaire du pivot » est retirée.

## SYNTHÈSE

`DossierFoncier::detenteursDeduits()` est la seule source. Personne : détention courante sur une parcelle du périmètre. Groupe : société détentrice. Le bouton Nouvelle négociation s’active dès qu’il existe au moins un détenteur déduit. Les destinataires d’offre et de promesse sont les personnes de cette liste. Une offre ou une promesse vers quelqu’un qui ne détient pas le périmètre est refusée. Les promesses déjà enregistrées ne sont pas réécrites.

La visibilité ne passe plus par le pivot. Un habilité du dossier voit les parcelles du périmètre. Les autres détentions du même propriétaire restent hors de ce dossier.

La prospection compte un dossier dans les communes de son périmètre. Le filtre « mon secteur » pour un responsable de dossier fait de même.

Le journal du dépôt projet écrit une ligne par personne détentrice, aucune pour une entité du groupe.

Les routes POST et DELETE d’attache et de détache d’un propriétaire de dossier sont supprimées. La table du pivot est conservée, non vidée. Les relations Eloquent restent déclarées et ne sont plus appelées par le métier.

## Mapping

| Écran / contrôle | Ancienne source | Nouvelle source |
| --- | --- | --- |
| Bouton Nouvelle négociation | pivot dossier propriétaire | détenteurs déduits du périmètre |
| Sélecteur destinataires offre | pivot | personnes détentrices |
| Contrôle offre | pivot | `idsProprietairesDetenteurs` |
| Sélecteur et contrôle promesse | `proprietairesDerives` sur le pivot | mêmes personnes |
| Promesse déjà enregistrée | `promesses.proprietaire_id` | inchangé |
| Visibilité parcelle | pivot puis périmètre | périmètre seul |
| Compteur dossiers par commune | pivot vers toutes les détentions | périmètre |
| Responsable dossier en prospection | pivot puis périmètre | périmètre |
| Journal sélection dépôt projet | pivot | personnes détentrices |
| Attache / détache propriétaire | routes d’écriture du pivot | routes absentes |

## DÉPLOIEMENT-TEST

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

Pas de migration. Bundle dossier : `public/build/assets/Show-CvE5oLQ7.js`.

1. Dossier créé par parcelles, sans propriétaire saisi : Nouvelle négociation est actif, les destinataires sont les détenteurs.
2. Offre ou promesse vers quelqu’un qui ne détient pas ces parcelles : refus.
3. Dossier de deux parcelles d’un propriétaire qui en détient beaucoup : un habilité voit ces deux parcelles.
4. Prospection : le dossier est compté dans les communes de son périmètre.
5. Sélection du dossier au dépôt projet : une ligne de journal par personne, aucune pour la société du groupe.
6. Les adresses d’attache et de détache d’un propriétaire de dossier répondent 404.

## LEÇON

Ne plus lire `dossier_foncier_proprietaire` pour décider qui appartient au dossier ou quelles parcelles un dossier ouvre. Un propriétaire qui détient des centaines de parcelles ne doit ouvrir que le périmètre. `parcellesCandidats()` ne recopie plus ces détentions. Le comptage sqlite local ne passe pas les migrations MySQL historiques : les tests métier de ce lot sont écrits, les tests source (sans base) sont verts.
