---
suivi: 1305
date: 2026-08-12
sujet: foncier_dossier_offre_reference
chantier: module-foncier
type: fix
statut: poussé
hash: cd521ad4
fichiers:
  - app/Services/Foncier/DossierFoncierPerimetreService.php
  - tools/diag/verif_retrait_parcelle_dossier_1286.php
  - tools/diag/verif_offres_reference_1305.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1305_foncier_dossier_offre_reference.md
---

## PROMPT ENVOYÉ

Correction 500 fiche dossier foncier : colonne inventée `offres_foncieres.reference`
dans `engagementsBloquants` (#1289). Inventaire colonnes inventées module foncier.
Identifier 404 associée. Garde-fous : règle engagements, périmètre #1289, ACL #1288,
pas de migration, ne pas toucher Marches/#1303/#1304.

## SYNTHÈSE

### Cause
`DossierFoncierPerimetreService::engagementsBloquants` sélectionnait `o.reference`
sur `offres_foncieres`. Cette colonne **n’existe pas** (prod 12/08 + dump local 1113).
L’écran Show charge `retrait_bloque_par` pour chaque parcelle → 500 à l’ouverture
dès qu’une parcelle du dossier porte une offre (cas dossier 2 / parcelles 6 et 425).

### Correction OBJET 1
Select `o.id`, `o.rang`, `o.date_offre`, `o.statut`. Libellé utilisateur :
`Offre {rang} du {date_offre}` (aligné `OffreFonciere::libelleOffre()` + date).
Règle métier inchangée : retrait refusé si engagement.

### Inventaire OBJET 2
Sous le seuil d’arrêt (15). Défauts réels corrigés :
1. Service prod `o.reference` — corrigé.
2. Diag `#1286` même défaut + table inventée `promesses_foncieres` + `pr.reference` — corrigé.
Autres suspects (alias `pr`/`o` dans diags non foncier) = faux positifs.

### OBJET 3 — 404
Sans Network tab prod ni serveur local : URL exacte **non confirmée**.
Candidat distinct trivial non retenu : `public/favicon.ico` fait 0 octet (mais
`app.blade` pointe `/images/logo.png` qui existe). La 500 du document principal
peut aussi entraîner des 404 collatéraux (assets/erreur). **Lot séparé** si
l’URL exacte est fournie après retest.

### Vérification
**PAS d’écran réel** : `localhost:81` refusé ; DB `erp_immo` locale sans tables
foncier (sauf CS) ; dump `erp_immo_migrate_1113` sans `rang` (pré-#1137) et sans
données dossier 2. Preuves : Schema listing + Reflection + `php -l` + absence
`o.reference` dans le source. Script prod :
`tools/diag/verif_offres_reference_1305.php`.

Fiches lues : #1288 (LEÇON `record_type` fantôme), #1289 (périmètre + engagements).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
php -d display_errors=1 tools/diag/verif_offres_reference_1305.php
```

Pas de migration. Tests écran : `/foncier/dossiers/2` ; retrait parcelle avec/sans
engagement ; cloisonnement #1288 ; `grep "Unknown column" storage/logs/laravel.log`.

## LEÇON

Un garde-fou qui plante en 500 ne protège rien. Pour une colonne « lisible »
(référence, libellé, nom), `SHOW COLUMNS` / `getColumnListing` **avant** le select —
surtout module peu exercé. Ne pas confondre table métier proche
(`promesses` ≠ `promesses_foncieres`, `offres_foncieres` ≠ `offres_commerciales`).
