---
suivi: 1076
date: 2026-07-30
sujet: Module Foncier Lot 4 — secteurs d'intervention + détection de doublons
chantier: module-foncier
type: feature
statut: poussé
hash: 5688915f
fichiers:
  - database/migrations/2026_07_30_160000_create_secteurs_tables.php
  - database/migrations/2026_07_30_160100_add_foncier_secteurs_permission.php
  - app/Services/Foncier/SecteurResolutionService.php
  - app/Services/Foncier/FoncierDoublonDetectionService.php
  - app/Http/Controllers/Foncier/SecteurController.php
  - resources/js/Pages/Foncier/Secteurs/
  - tests/Feature/Foncier/FoncierSecteursDoublonsTest.php
  - docs/suivi/SUIVI_1076_foncier_secteurs_doublons.md
---

## PROMPT ENVOYÉ

SUIVI #1076 — MODULE FONCIER LOT 4 : SECTEURS + DOUBLONS.
Migrations secteurs / suppléants / périmètres, résolution R1, admin
foncier.secteurs, suggestion visible, filtre mon secteur (#1070), détection
doublons hors ACL message minimal. Un commit, push.

## SYNTHÈSE

### Résolution R1
1. Règle commune (secteur_perimetres.type=commune) → l'emporte toujours
2. Sinon règle EPCI via communes.code_epci
3. Sinon null (pas d'erreur)
Unicité SQL : `code_insee_commune` UNIQUE et `code_epci` UNIQUE (une commune
exception / un EPCI = un seul secteur). Contrôle « exactement un code selon
type » en validation applicative uniquement : un CHECK SQL MySQL/SQLite sur
XOR de colonnes nullables est fragile et peu portable ; les UNIQUE NULL-friendly
couvrent déjà les collisions métier.

### Doublons R5
`FoncierDoublonDetectionService::*HorsAcl` — hors RecordHabilitationScope.
Résultat exposé = `{signalement, message}` uniquement. Alerte DG séparée avec détail.

### Mapping

| UI | Valeur | Colonne |
|----|--------|---------|
| EPCI / Commune (exception) | epci / commune | secteur_perimetres.type |
| Titulaire | user id | secteurs.titulaire_id |
| Suppléants | user ids | secteur_suppleants |
| Chargé propriétaire | user id | proprietaires.responsable_id |
| Mon secteur | 1 / 0 (toujours posté) | préférence users |

## DÉPLOIEMENT / TEST

1. git pull && migrate --force && view:clear && route:clear && journal:sync
2. Admin secteurs (foncier.secteurs) : EPCI + exception commune
3. Créer proprio : suggestion visible, choisir autre → enregistré
4. Doublon : B rattache parcelle de A → message minimal, JSON sans id/nom A
5. Mon secteur off → toutes parcelles

## LEÇON

Suggestion visible ≠ pré-remplissage ; mon_secteur toujours envoyé (0/1) pour
ne pas re-verrouiller la vue complète (#1070).
