---
suivi: 1755
date: 2026-09-30
sujet: Commune et nom du projet sur un programme hors ERP
chantier: programmes
type: evolution
statut: poussé
hash:
fichiers:
  - app/Models/Programme.php
  - app/Http/Controllers/ProgrammeController.php
  - routes/web.php
  - database/migrations/2026_09_30_131500_add_code_insee_commune_to_programmes_table.php
  - resources/js/Pages/Programmes/CreateHorsErp.vue
  - resources/js/Pages/Programmes/Edit.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/ProgrammeHorsErpCommune1755SourceTest.php
  - tests/Feature/ProgrammeHorsErpCommune1755Test.php
  - public/build/
  - docs/suivi/SUIVI_1755_programme_hors_erp_commune.md
---

# SUIVI #1755 — Nom du projet et commune INSEE

## PROMPT ENVOYÉ

Sur Programme hors ERP : renommer Libellé en Nom du projet (même colonne). Ajouter la commune obligatoire à la création, choisie comme au foncier, code INSEE stocké. Les programmes hors ERP déjà créés sans commune restent modifiables. La commune apparaît dans la liste et sur la fiche. Programmes ERP inchangés.

## FICHES LUES

- #1391 LEÇON : ne pas toucher les filtres actif/inactif ni les garde-fous par statut. Entité obligatoire et contrôle d’enseigne conservés.
- #1395 : après enregistrement, retour vers la liste Hors ERP. Non modifié.
- #1555 : `programmes.commune` est un libellé libre, pas un code.

## CONSTAT

- Création : `GET /programmes/create-hors-erp` → `ProgrammeController::createHorsErp` (routes/web.php) → `resources/js/Pages/Programmes/CreateHorsErp.vue`. Validation `storeHorsErp` : `libelle`, `entite_id`, `enseigne_id` (`ProgrammeController.php`, méthode `storeHorsErp`). Le libellé visible était « Libellé », la colonne reste `programmes.libelle`.
- Modification : `ProgrammeController::update` délègue à `updateHorsErp` si `isHorsErp()`. Formulaire dans `Edit.vue` (champ posté `nom`, écrit dans `libelle`). Le libellé visible était « Libellé ».
- `programmes.commune` : `string` nullable, libellé libre (`database/migrations/2026_04_23_100000_add_fields_to_programmes_table.php` ligne 13). Pas de `programmes.code_insee_commune` avant ce lot.
- Composant : `resources/js/Components/Foncier/CommuneSelect.vue`. Recherche : `CommuneSearchController` + `CommuneSearchService` sur la table `communes` (`code_insee` clé primaire, `database/migrations/2026_07_30_120000_create_communes_table.php` ligne 16). L’URL foncière est `GET /foncier/communes/search` (`routes/web.php`), derrière `foncier.lecture` et `foncier.module`. Le formulaire hors ERP appelle le même contrôleur via `GET /programmes/communes/search`, sans ces deux gardes, pour que la recherche reste possible sans droit foncier. Une seule liste : la table `communes`.
- Homonymes : le libellé de chaque ligne contient « dép. » + département (`CommuneSearchService.php`, construction de `label`).

## MAPPING

| Libellé affiché | Valeur postée | Colonne | Libellé back |
| --- | --- | --- | --- |
| Nom du projet | `libelle` (création) / `nom` (modification) | `programmes.libelle` | Nom du projet |
| Commune | `code_insee_commune` (5 caractères) | `programmes.code_insee_commune` | Commune |

`programmes.commune` n’est pas écrite par ce formulaire.

## DÉPLOIEMENT-TEST

- `git pull origin main`
- `php artisan migrate --force`
- `php artisan route:clear`
- `php artisan view:clear`
- `php artisan journal:sync`

1. Création hors ERP sans commune → 422. Avec une commune → le code INSEE est enregistré.
2. « Nom du projet » à la création et à la modification. Le formulaire ERP dit toujours « Nom du programme ».
3. Programme hors ERP déjà créé sans commune : changer le nom sans commune → OK.
4. Recherche « Sainte-Livrade » → les deux communes, avec leur département.
5. Liste Hors ERP, colonne Localisation : nom de la commune et département. Fiche : le sélecteur affiche la commune enregistrée.

## LEÇON

Ne pas ranger un code INSEE dans `programmes.commune` : cette colonne est le nom libre des programmes ERP (SharePoint, liste, tri). La recherche `/foncier/communes/search` refuse qui n’a pas le droit foncier ; le même contrôleur est exposé sur `/programmes/communes/search`.
