---
suivi: 1332
date: 2026-08-13
sujet: reprise_siwi_commune_referentiel
chantier: marches_reprise
type: feature
statut: poussé
hash: 98c21f9d
fichiers:
  - database/migrations/2026_08_13_180000_add_commune_code_insee_to_siwi_operations_table.php
  - app/Models/SiwiOperation.php
  - app/Services/SiwiImportPageService.php
  - app/Http/Controllers/SiwiImportController.php
  - routes/web.php
  - resources/js/Components/Foncier/CommuneSelect.vue
  - resources/js/Pages/SiwiImport/Index.vue
  - public/build/
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1332_reprise_siwi_commune_referentiel.md
---

## PROMPT ENVOYÉ

SUIVI #1332 — page `/siwi-import` : commune en sélection référentiel
(`CommuneSelect` + recherche), stockage `code_insee`, département auto,
accès recherche hors ACL foncière bloquante (#1288). O7 CDC (61 marchés
sans département faute de CP SIWI).

## SYNTHÈSE

### Fiches lues
- `#1325` : table `communes` 0 ligne en local → saisie libre signalée ;
  demandait déjà le référentiel si peuplé.
- `#1326` : liaison programme / SharePoint — non défait (`etat_liaison_*`,
  actions Créer/Rattacher/Ne pas reprendre).
- `#1288` (contexte) : ACL foncière bloquante ; annuaire non cloisonné
  mais route search sous `foncier.lecture`.

### Choix ACL (bloquant traité en premier)
`foncier.communes.search` = middleware `feature.permission:foncier.lecture`
+ `foncier.module` → inaccessible sans habilitation foncière.
**Nouvelle route** `GET /siwi-import/communes/search`
(`siwi-import.communes-search`) : `web`+`auth`, `assertGroupe` /
`SiwiImportPolicy` (`m365GroupNames()` brut, `GS_GROUPE`). Réutilise
`CommuneSearchService` (même table, pas de second référentiel).
Foncier / cloisonnement **non modifié**.

### Schéma
Colonne TRAVAIL `siwi_operations.commune_code_insee` VARCHAR(5) NULL
+ index `siwi_ops_commune_insee_idx`. Migration DDL seule, réversible,
aucun traitement de données. Table `communes` non touchée.

### Front
`CommuneSelect` : prop `searchUrl` (défaut route foncière) ; phases
idle/loading/ok/empty/error avec messages explicites. Page SIWI passe
`/siwi-import/communes/search`. Sélection → nom canonique + département
auto ; `code_insee` posté à `updateLocalisation`.

### O7 CDC
Avec sélection commune → département depuis `communes.departement` →
`Programme::prochainCode` et chemin SharePoint débloqués pour les
opérations sans CP SIWI (ex. ENTRE VIGNES / SAINTE LIVRADE / REDESSAN),
**sous réserve** que ces communes existent bien dans le référentiel prod
(34 875 lignes). Preuve locale : recherches peuplées après seed (env
locale initialement à 0 ligne). **Écran prod + compte non admin : non
faits dans Cursor** (pas de session M365).

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan migrate --force` (colonne `commune_code_insee`)
3. `php artisan optimize:clear` + `view:clear`
4. `php artisan journal:sync`
5. Navigation privée + compte **non admin** `GS_GROUPE` sans foncier :
   recherche « ponteilla », « entre vignes », « sainte livrade »,
   « redessan » ; vérifier `code_insee` en base ; créer programme TEST
   puis nettoyer.

## LEÇON

Une route sous préfixe `foncier` n’est **pas** un annuaire réutilisable
par défaut : l’ACL module bloque. Réutiliser le **service** et la
**table**, exposer une route lecture seule dans le module appelant.
Ne jamais valider l’accès avec un compte admin (`Gate::before` /
`isAdminERP`). `public_groupes` journal = **tableau** (`['tous']`).
