---
suivi: 1767
date: 2026-10-01
sujet: Enregistrement multiparcelle bloqué
chantier: foncier / parcelles
type: fix
statut: poussé
hash:
fichiers:
  - app/Services/Foncier/ParcelleCreationService.php
  - docs/suivi/SUIVI_1767_fix_multiparcelle_visibilite.md
---

# SUIVI #1767 — multiparcelle : méthode de visibilité absente

L'enregistrement multiparcelle renvoyait une erreur serveur dès qu'une ligne reprenait une parcelle déjà en base. La règle de visibilité des parcelles n'est pas modifiée. Pas d'entrée au journal.

## PROMPT ENVOYÉ

FONCIER → Parcelles → « Ajouter multiparcelle » : Server Error à l'enregistrement (12 lignes, Boisseron). Log : `Call to undefined method App\Models\Parcelle::foncierVisibilitePerimetre()`. Constater, corriger au plus simple, ne pas changer la règle de visibilité ni les règles de création #1733 et #1735.

## FICHES LUES

- **#1288 LEÇON** — Parcelle est passée de `HasFoncierReferentielVisibilite` à `HasFoncierParcelleVisibilite`. Impact : ne pas remettre le périmètre #1116 ; appeler l'alias laissé pour les appelants #1116.
- **#1573 LEÇON** — une ligne invalide reste affichée, les autres sont enregistrées. Impact : ne pas envelopper le lot dans un tout-ou-rien.
- **#1733** — la société détentrice ne se poste plus à la création. Impact : `createPrepared` continue de retirer `societe_detentrice_id`.
- **#1735** — zonage et constructible ne bloquent pas la multiparcelle. Impact : non touché.

## CONSTAT

Appels de `foncierVisibilitePerimetre` :

- `app/Services/Foncier/ParcelleCreationService.php:513` — `Parcelle::foncierVisibilitePerimetre()` dans `resoudreDoublonPourUtilisateur`. C'est l'appel qui casse l'enregistrement : `createBatchPerLine` l'atteint dès qu'une ligne a le même triplet commune / section / numéro qu'une parcelle vivante.
- `app/Models/Proprietaire.php:23` — méthode réelle, périmètre propriétaires. Hors crash.
- `app/Models/Concerns/HasFoncierReferentielVisibilite.php:18` — méthode abstraite du trait que Parcelle n'utilise plus.
- `tests/Feature/Foncier/FoncierGroupeTravailReferentielSourceTest.php:26` — test source #1116, pas le chemin HTTP.

`git log -S foncierVisibilitePerimetre --oneline` :

- `45ab2265` feat(foncier): groupe de travail + cloisonnement referentiel (#1116) — introduit l'appel et la méthode sur Parcelle.
- `6567b8fa` Cloisonnement foncier: ACL R1 parcelles, dossiers liste blanche, historique habilitations (#1288) — retire `Parcelle::foncierVisibilitePerimetre()` en remplaçant le trait. L'appel dans `ParcelleCreationService` n'est pas mis à jour.

Équivalent laissé par #1288 : `Parcelle::userCanViewReferentiel()` (alias de `userCanViewParcelleAcl`), qui interroge `FoncierParcelleVisibiliteService` — créateur, dossier visible, ou contournement de groupes. Le scope SQL reste `FoncierParcelleVisibiliteScope`. L'appel voulait savoir si l'acteur voit déjà le doublon avant d'écrire une ligne de visibilité unitaire, sans changer le créateur.

Le même commit #1288 a conservé les alias `queryWithoutReferentielAcl` et `userCanViewReferentiel`. Aucun autre appel de méthode retirée dans les fichiers de ce commit. `RecordHabilitationService::revoke` existe toujours.

## SYNTHÈSE

`resoudreDoublonPourUtilisateur` appelle `$existante->userCanViewReferentiel($acteur)` au lieu de `Parcelle::foncierVisibilitePerimetre()`. Même question (« cet utilisateur voit-il déjà la parcelle ? »), règle courante R1, pas le périmètre #1116. Le rattachement unitaire et les messages restent ceux déjà écrits. Création, détention par acte et urbanisme multiparcelle inchangés.

## DÉPLOIEMENT-TEST

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

Pas de migration. Pas de `journal:sync`.

1. Ajouter multiparcelle, 12 lignes Boisseron (Réserve / Bouchon / Rétrocession) : enregistrées, sans erreur serveur.
2. Une ligne invalide reste affichée avec son motif ; les autres sont enregistrées.
3. Création unitaire et import fichier : inchangés.
4. `grep "production.ERROR" storage/logs/laravel.log | tail` : plus de `BadMethodCallException` sur `foncierVisibilitePerimetre`.

## LEÇON

Remplacer un trait ne suffit pas : le grep des appelants doit suivre la méthode retirée, pas seulement les fichiers du commit. #1288 a laissé deux alias et a supprimé `foncierVisibilitePerimetre` ; le doublon multiparcelle appelait encore la méthode statique. L'exception n'est pas attrapée dans la boucle : une seule ligne déjà en base faisait tomber toute la réponse, y compris les lignes déjà insérées avant elle.
