---
suivi: 1829
date: 2026-10-09
sujet: Liste Parcelles, tableau groupé par commune
chantier: foncier
type: evolution
statut: poussé
hash: 91391d06d
fichiers:
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - app/Http/Controllers/Foncier/ProspectionController.php
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/FoncierProspectionListe1829SourceTest.php
  - public/build/manifest.json
  - docs/suivi/SUIVI_1829_parcelles_tableau_commune.md
---

# SUIVI #1829 — tableau des parcelles groupé par commune

## PROMPT ENVOYÉ

Refonte de la présentation de Foncier > Parcelles (`/foncier/prospection`). Maquette « A — Tableau groupé par commune ». Aucun calcul, droit, export ou filtre existant ne change. Étape 0 dans la synthèse.

## Fiches lues

- #1825 : la carte Achat est `achat_total` (montant ventilé du dernier acte non vente, vide = 0). Ne pas restaurer le pied SQL ni le bloc orphelin. Les euros de la carte ne sont pas touchés.
- #1787 : le sélecteur Utilisateur écrit `referents[]`, comme l'entonnoir Réf. Les colonnes passent par `User::setPreference`, pas par une migration.
- #1785 : un département entier écrit `departements[]`, une commune écrit `communes[]`. Les deux se lisent encore.
- #1770 / #1734 : Estimé et Cible restent prix au mètre carré × surface cadastrale, hors groupe exclu, sans valorisation = 0.

## SYNTHÈSE

### Étape 0 — constat

Colonnes du mode parcelle, avant :

| Colonne | Clé | Filtre | Tri | Menu Colonnes | Excel |
|---|---|---|---|---|---|
| Commune | toujours visible | entonnoir communes / départements | commune | non | Commune |
| Réf. | toujours visible | — | reference | non | Référence |
| Propriétaire | proprietaire | — | proprietaires | oui | Propriétaire(s) |
| Surface | surface | min / max | surface | oui | Surface |
| Statut | statut | entonnoir statuts | non | oui | Statut |
| Destination | destination | entonnoir | non | oui | Destination |
| Nature | nature | entonnoir | non | oui | Nature |
| Zone | zone | entonnoir + texte | zonage | oui | Zonage |
| Constr. | constr | entonnoir | non | oui | Constr. |
| Bâti | bati | — | non | oui | Bâti |
| Acte | acte | entonnoir | non | oui | Acte |
| Achat | achat (le serveur ne retenait que valo) | non | non | oui | Achat (€/m²) |
| Estimé | estime (idem, clé serveur valo) | non | non | oui | Estimé (€/m²), Motif estimé |
| Cible | cible | non | valorisation_cible | oui | Cible (€/m²), Motif cible |
| Réf. (personne) | referent | entonnoir, vue complète | referent | oui | Référent |
| Info | info | non | non | oui | Info |

Excel seul, hors grille : Occup., Motif estimé, Motif cible, Sans valorisation, Hors groupe.

Fonds :

- Ligne verte `#e8f2ea` (`.pp-row--groupe`) si `societe_detentrice_id` est posé (`detenue_par_le_groupe`). Ce n'est pas le statut.
- Ligne grise si la parcelle cadastrale est remplacée.
- Cellule rose : en réalité `bg-red-50`, et la valeur était masquée. Conditions : zonage vide sur parcelle active ; constructibilité vide sur parcelle active ; détention de groupe courante sans acte d'ouverture ; statut Détenue sans prix d'achat au m² ; statut Détenue sans prix estimé (sauf sans valorisation) ; statut Détenue sans prix cible (sauf sans valorisation). L'infobulle disait seulement « À compléter ».

Sélecteurs :

- Utilisateur : seulement en vue complète. Écrit `referents[]` (un identifiant, vide = tous, « Plusieurs » si l'entonnoir en a plusieurs). Ce n'est pas un élargissement de la vue.
- Affichage : Par parcelle / Par propriétaire / Par commune. Change le jeu de lignes. Conservé.
- Options : périmètre Tous / Groupe / Hors groupe, et « Afficher les parcelles remplacées ». Le département et la nature ne sont pas dans ce bouton : ils passent par les entonnoirs (commune, nature) et les pastilles.

Statuts (`FoncierReferentiels::STATUTS`) : reperee Repérée, opportunite Opportunité, en_negociation En négociation, sous_compromis Sous compromis, detenue Détenue, cedee Vendue, remplacee Remplacée, exploree Explorée, sans_issue Sans issue. Il n'existe pas de clé « Prospect ».

### Présentation

Une carte à quatre zones reprend `nb_parcelles`, `achat_total`, `valorisation_actuelle_totale`, `valorisation_cible_totale`. La barre compte les statuts sur la même requête que ces totaux (hors groupe exclu) : Détenue, En négociation, Prospects = Repérée + Opportunité, gris = le reste. La somme des quatre parts égale `nb_parcelles`.

`regrouper=commune` par défaut, `aucun` sinon. Le tri met la commune d'abord, puis le tri demandé. Les totaux de groupe (nombre, surface cadastrale, achat, cible) sont calculés en SQL sur tout le filtre de la commune, pas sur la page. L'achat et la cible d'un groupe excluent le hors groupe, comme la carte. Une commune coupée par la page répète son en-tête avec « (suite) ». Le repli est en sessionStorage.

L'export force `regrouper=aucun` : mêmes colonnes, même ordre qu'avant. Le retour fiche reprend l'URL, donc le paramètre `regrouper`.

Préférences : clé absente = colonnes masquées par défaut de la maquette. Liste enregistrée reprise telle quelle, `valo` lu comme `estime`. « Rétablir » efface la clé et réapplique ce défaut. En « Regrouper : Aucun », la colonne Commune s'affiche même si elle est masquée.

## Mapping

Statut, pastille :

| Clé | Libellé | Pastille |
|---|---|---|
| detenue | Détenue | fond #E5F4EA, texte #166534 |
| en_negociation | En négociation | fond #FEF3C7, texte #92400E |
| reperee | Repérée | fond #DBEAFE, texte #1E3A8A (barre Prospects) |
| opportunite | Opportunité | fond #DBEAFE, texte #1E3A8A (barre Prospects) |
| sous_compromis | Sous compromis | fond #F3F4F6, texte #374151 |
| cedee | Vendue | fond #F3F4F6, texte #374151 |
| remplacee | Remplacée | fond #F3F4F6, texte #374151 |
| exploree | Explorée | fond #F3F4F6, texte #374151 |
| sans_issue | Sans issue | fond #F3F4F6, texte #374151 |

Colonnes :

| Avant | Après | Visible par défaut | Clé |
|---|---|---|---|
| Réf. | Parcelle (lien + étiquette nature) | oui, non masquable | — |
| Propriétaire | Propriétaire | oui | proprietaire |
| Surface | Surface | oui | surface |
| Statut | Statut (pastille) | oui | statut |
| Destination | Destination | oui | destination |
| Zone + Constr. | Zone · Constr. | oui | zone_constr |
| Achat + Estimé + Cible | Achat · Estimé · Cible | oui | prix |
| Réf. personne | Resp. (initiales) | oui | referent |
| Info | Note | oui | info |
| Commune | Commune | non, forcée si Regrouper Aucun | commune |
| Nature | Nature | non | nature |
| Zone | Zone | non | zone |
| Constr. | Constr. | non | constr |
| Bâti | Bâti | non | bati |
| Acte | Acte | non | acte |
| Achat | Achat | non | achat |
| Estimé | Estimé | non | estime (valo migré) |
| Cible | Cible | non | cible |

Signal :

| Ancien fond rose | Point orange | Infobulle |
|---|---|---|
| zonage vide, parcelle active | devant le zonage | Zonage manquant |
| constructibilité vide, parcelle active | devant Constr. | Constructibilité manquante |
| détention de groupe sans acte d'ouverture | devant Acte | Acte manquant |
| Détenue sans prix d'achat au m² | devant Achat | Prix d'achat manquant |
| Détenue sans prix estimé, valorisation exigée | devant Estimé | Valeur estimée manquante |
| Détenue sans prix cible, valorisation exigée | devant Cible | Valeur visée manquante |

Le filtre « À compléter » réunit ces six conditions en OU. Les filtres séparés déjà dans l'URL restent.

## DÉPLOIEMENT-TEST

`git pull origin main` puis `php artisan optimize:clear`, `view:clear`, `journal:sync`.

1. Vue complète, sans filtre : le nombre de la carte et Achat / Estimé / Cible sont ceux d'avant. Détenues + Négociation + Prospects + le gris = ce nombre.
2. Groupe Aubagne : nombre, surface, achat et cible = toutes les parcelles filtrées de la commune, y compris hors de la page.
3. Regrouper Aucun : colonne Commune visible, tri sans forcer la commune en premier.
4. Un compte qui avait masqué des colonnes les retrouve. Un compte sans préférence voit la maquette.
5. Export Excel : mêmes colonnes, toutes les pages.

La base locale était injoignable : les chiffres 524 et Aubagne n'ont pas été rejoués ici.

## LEÇON

`nb_detenues` des totaux compte une société détentrice, pas le statut Détenue. La barre lit `nb_statut_*` sur la même requête hors groupe. Ne pas additionner des €/m². Une préférence absente et une liste vide enregistrée ne sont pas la même chose : « Rétablir » retire la clé (`null`) et le défaut de la maquette s'applique. `valo` reste accepté à l'enregistrement et se lit `estime`.
