---
suivi: 1563
date: 2026-09-15
sujet: Occup. — Pas d’occupation vs non vérifié
chantier: foncier / parcelles / occupation
type: feature
statut: poussé
hash: f70db9d8
fichiers:
  - database/migrations/2026_09_15_161000_add_occupation_absente_to_parcelles.php
  - app/Models/Parcelle.php
  - app/Http/Controllers/Foncier/ParcelleOccupationController.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Http/Controllers/Foncier/ProspectionController.php
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - resources/js/Pages/Foncier/Parcelles/Show.vue
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - resources/js/Components/Foncier/Prospection/ProspectionParcellesSublist.vue
  - routes/web.php
  - tests/Unit/Parcelle1563SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1563_marqueur_pas_occupation.md
---

# SUIVI #1563 — Occup. : Pas d’occupation vs non vérifié

## PROMPT ENVOYÉ

Distinguer une parcelle vérifiée libre d’une parcelle non regardée.
Colonne Occup. : Oui / Non / —. Marqueur date+auteur sur parcelles.
Levée auto à l’ajout d’occupation. Même droit que l’ajout. Pas de
reprise. Rebase Vite. Push HECTAREG main.

## FICHES LUES

- **#1119 LEÇON** — occupations dans `parcelle_occupations` ; filtre
  `occupee` sur les courantes ; colonne Occup. = `occupations_presentes`
  (toute occupation). Impact : le marqueur n’est PAS une ligne
  d’occupation ; le filtre suit désormais les 3 états de la colonne.
- **#1533 LEÇON** — Occup. dans Prospection/Index ; `ParcellePanel`
  non importé. Impact : filtre et colonne là, pas dans le panel.
- **#1107** — whitelist inline ; ne pas y mettre occupation_absente_*.
- **#1562** — zone commune Prospection : rebase avant Vite.

## SYNTHÈSE

Stockage : `parcelles.occupation_absente_at` + `occupation_absente_par_id`
(FK users, nullOnDelete). Pas de booléen nu. Pas de table. Migration
minimale, sans reprise (NULL = non vérifié). Hors fillable et hors
whitelist inline. Droit = `foncier.gestion` via PermissionService
(`m365GroupNames()` en brut dans ce service) + middleware route, comme
l’ajout d’occupation. Pas de Gate.

## DÉPLOIEMENT-TEST

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

Cas : bouton si aucune occupation ; auteur/date ; Occup. Non ; ajout
bail → Oui et marqueur levé ; AB 0571 sans bouton ; retirer → — ;
trois états liste ; sans droit → bouton absent et 403.

## LEÇON

Une colonne Occup. à deux valeurs (Oui / —) mélange « pas regardé »
et « constaté libre ». Un booléen sans auteur n’est pas un constat
de terrain. Ne pas créer une fausse occupation « vide » : ça fausserait
les décomptes de baux. Lever le marqueur dans `store()` occupation,
pas au front.
