---
suivi: 1283
date: 2026-08-12
sujet: prospection_secteurs
chantier: foncier
type: fix+evolution
statut: poussé
hash: 3c5d4898
fichiers:
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - app/Http/Controllers/Foncier/ProspectionController.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Http/Controllers/Foncier/SecteurController.php
  - app/Models/User.php
  - routes/web.php
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - resources/js/Pages/Foncier/Secteurs/Index.vue
  - tools/diag/verif_secteurs_prospection_1283.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
---

## PROMPT ENVOYÉ

Suite #1281 — D2 accès total GS_ADMIN_ERP + GS_DIRECTION_GENERALE, D1 mon_secteur défaut ON + responsables, D3 colonne SECTEUR, D4 auto-gestion secteurs, D5 périmètres multiples.

## SYNTHÈSE

### OBJET 1 — Accès total (D2, avant D1)

- `ParcelleProspectionQuery::groupeAccesTotalProspection()` lit `m365GroupNames()` directement (pas `hasAnyM365Group` / `isAdminERP`).
- `hasAnyM365Group()` retourne toujours vrai pour admin ERP — GS_DIRECTION_GENERALE testé indépendamment via groupes bruts.
- Bypass appliqué dans `applyFilters`, mode commune (`payloadCommune`), dépliage JSON (via `applyFilters`).
- UI : bandeau « Vue complète » + `secteur_context.vue_complete` / `acces_total_groupe`.
- **Dette #34** : groupes `GS_ADMIN_ERP` et `GS_DIRECTION_GENERALE` en dur.

### OBJET 2 — mon_secteur défaut ON (D1)

- Défaut `true` si préférence absente (ProspectionController, ParcelleController, commentaire User).
- Préférences enregistrées respectées.
- Filtre étendu : créateur + communes périmètre + titulaire secteur couvrant + responsable dossier (miroir + détention).

### OBJET 3 — Colonne SECTEUR (D3)

- Donnée : `SecteurResolutionService::resolveParCodeInsee` + responsables dossier (cumul).
- « Non couvert » en gris si aucun secteur (Mudaison 34176 attendu).
- Chargé propriétaire → infobulle sur le nom (`charge_nom`).
- `grouper_par_charge` : param conservé ; libellé UI « Grouper par secteur » ; groupement sur `secteur_group_*`.

### Pré-analyse OBJET 3 (4 parcelles prod)

À confirmer en prod via diag §7 : rattachement `dossier_foncier_parcelle` et responsables dossier par parcelle. Mudaison hors périmètres → « Non couvert » sauf responsables dossier.

### OBJET 4 — Auto-gestion secteurs (D4)

- Création : tout utilisateur authentifié, titulaire forcé à soi si pas `foncier.secteurs`.
- Modification / suppression : titulaire OU `foncier.secteurs`.
- Garde-fou serveur `assertPeutModifierSecteur`.
- Recouvrements non bloqués ; `couverture-conflits` reste informatif ; `resolveParCodeInsee` = première règle (non déterministe si chevauchement).

### OBJET 5 — Périmètres multiples (D5)

- `POST secteurs/{secteur}/perimetres` → `appendPerimetres` (pas de sync destructif).
- `DELETE secteurs/{secteur}/perimetres/{perimetre}`.
- Doublons ignorés silencieusement.
- Aucune migration.

### Consommateurs `mon_secteur`

| Fichier | Rôle |
|---------|------|
| `ParcelleProspectionQuery::applyFilters` | Filtre SQL (+ bypass accès total) |
| `ProspectionController::resolveMonSecteurPreference` | Défaut ON + persistance |
| `ProspectionController::payloadCommune` | Agrégation communes |
| `ProspectionController::parcellesCommune` | Dépliage JSON |
| `ProspectionController::filtersFromRequest` | Query dépliage |
| `ParcelleController::resolveMonSecteurPreference` | Alignement redirect legacy |
| `Prospection/Index.vue` | Toggle, badge, message vide |
| `Parcelles/Index.vue`, panels | Héritage filtres (non modifiés sauf défaut serveur) |

## 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_secteurs_prospection_1283.php
```

## LEÇON

- D2 avant D1 impératif : sans bypass admin/DG, défaut ON replonge l'équipe dans le noir (#1281).
- Ne jamais utiliser `hasAnyM365Group` pour tester GS_DIRECTION_GENERALE seul sur un admin ERP.
