---
suivi: 1540
date: 2026-09-14
sujet: Constructibilité parcelle — valeur Potentiel
chantier: foncier / parcelles / urbanisme
type: feature
statut: poussé
hash: 3a1c2209
fichiers:
  - app/Support/Foncier/FoncierReferentiels.php
  - app/Services/Foncier/ParcelleCreationService.php
  - resources/js/Components/Foncier/Prospection/ProspectionParcellesSublist.vue
  - tests/Unit/Parcelle1510SourceTest.php
  - tests/Unit/Parcelle1540SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1540_constructible_potentiel.md
---

# SUIVI #1540 — Constructibilité « Potentiel »

## PROMPT ENVOYÉ

Ajouter la valeur « Potentiel » à la constructibilité d’une parcelle,
entre Oui et À devenir. Clé snake_case dans CONSTRUCTIBILITES.
Couvrir fiche, création unitaire, liste, filtre, validation serveur.
Pas de migration si varchar. Rebase Vite. Push HECTAREG main.

## BASE GIT

HEAD = origin/main `ab3698b7` au départ. Rebase Vite : déjà à jour
(pull --rebase refusé pour working tree dirty, `origin/main` identique).

## FICHES LUES

- **#1242 LEÇON** — constructible bool → varchar aligné `etat_foncier`.
  Source unique `FoncierReferentiels::CONSTRUCTIBILITES`. Faisabilité
  ne lit pas cette colonne.
- **#1247** — colonne `parcelles.constructible` = `VARCHAR(32) NULL`.
  Pas d’enum SQL → aucune migration.
- **#1533 LEÇON** — `ParcellePanel.vue` n’est importé nulle part.
  Liste / filtre vivent dans `Prospection/Index.vue`.
  `ProspectionParcellesSublist.vue` avait encore trois libellés en dur.

## SYNTHÈSE

Clé technique `potentiel` / constante `CONSTRUCTIBLE_POTENTIEL`,
insérée entre `oui` et `a_devenir`. Clés existantes inchangées.
`optionsConstructibilites()` et `libelleConstructible()` suivent le
tableau. Validation unitaire = `Rule::in(array_keys(CONSTRUCTIBILITES))`.
`normalizeConstructible()` accepte toute clé du référentiel.
Sous-liste commune : libellé via `constructible_libelle` + fallback
`potentiel`. Modale multiparcelle : pas de champ constructible
(colonnes #1532) — rien à ajouter.

### Mapping UI ↔ back

| Libellé affiché | Valeur postée | Colonne DB | Libellé back |
| --- | --- | --- | --- |
| Non renseigné | null | parcelles.constructible NULL | non renseigné |
| Oui | oui | oui | Oui |
| Potentiel | potentiel | potentiel | Potentiel |
| À devenir | a_devenir | a_devenir | À devenir |
| Jamais | jamais | jamais | Jamais |

Placeholder « Non renseigné » ajouté au front, pas dans le référentiel.

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan optimize:clear` + `view:clear` + `journal:sync`
3. Fiche parcelle → select Oui / Potentiel / À devenir / Jamais
4. Enregistrer Potentiel → persiste
5. Liste Constr. + filtre Constructible
6. Création unitaire
7. Parcelles Oui / À devenir / Jamais inchangées

Pas de migration. JAMAIS npm/composer/optimize/config:cache sur OVH.

## LEÇON

La liste des constructibilités n’est unique que si **tous** les libellés
passent par `CONSTRUCTIBILITES` / `constructible_libelle`. La sous-liste
commune (#1217 / #1533) recopiait trois `if` — une 4e valeur y
s’affichait en clé brute. `nb_constructibles` (mode propriétaire) compte
seulement `oui` (et legacy true/1) : Potentiel n’est pas « Oui ».
Colonne varchar(32) : pas d’ALTER pour une valeur de plus.
Modale multiparcelle ≠ création unitaire : pas de champ Urbanisme.
