---
suivi: 1207
date: 2026-08-05
sujet: Patrimoine — entrée top-level + URL /patrimoine
chantier: foncier / navigation
type: feature
statut: poussé
hash: 57cdc9e3
fichiers:
  - routes/web.php
  - resources/js/Layouts/AppShell.vue
  - public/build/
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Feature/Foncier/FoncierPatrimoineVueSourceTest.php
  - tests/Feature/Foncier/FoncierSousMenuAppShellSourceTest.php
  - docs/suivi/SUIVI_1207_foncier_patrimoine_top_level.md
---

# SUIVI #1207 — Patrimoine top-level

## PROMPT ENVOYÉ

Patrimoine devient entrée top-level après GEMME ; URL `/patrimoine` ;
redirection permanente depuis `/foncier/patrimoine` (query préservée) ;
sortie du déroulant FONCIER ; même visibilité qu’aujourd’hui.

Décisions Robin : Q1=A, Q2=B, Q3=A, Q4=A, Q5=après GEMME.

## SYNTHÈSE

### Navigation
- Entrée **Patrimoine** ajoutée en dernier dans la barre (`envol-header__nav-link`),
  après GEMME, conditionnée par `peutVoirMenuFoncier` (`nav.foncier_visible`).
- Retirée du déroulant FONCIER (restent : Prospection · Dossiers · Actes · Secteurs · Groupe de travail).
- État actif : `patrimoineNavActif` sur `/patrimoine` ; `foncierNavActif` exclut
  explicitement la page Patrimoine (composant toujours `Foncier/Patrimoine/Index`).

### Routes
- `GET /patrimoine` → `PatrimoineFoncierController@index`, nom conservé
  **`foncier.patrimoine.index`** (option **a**).
- `Route::get('/foncier/patrimoine', …)` → redirect **301** vers `/patrimoine`
  avec **query string** (`$request->getQueryString()`). Note : `Route::permanentRedirect`
  Laravel 11 **ne conserve pas** la query — d’où la closure dédiée.
- Aucune route fille sous `/foncier/patrimoine/…`.

### Nom de route — option (a)
Peu d’appelants (`route('foncier.patrimoine.index')` uniquement dans les tests
Feature). Conserver le nom évite tout risque de lien oublié et reste cohérent
avec le middleware module Foncier.

Recensement appelants `foncier.patrimoine.index` / URL dure :
| Fichier:ligne | Nature |
|---|---|
| `tests/Feature/Foncier/FoncierPatrimoineVueTest.php:142` | `route('foncier.patrimoine.index')` |
| `tests/Feature/Foncier/FoncierPatrimoineVueTest.php:231` | idem |
| `resources/js/Layouts/AppShell.vue` | URL dure `/patrimoine` (ex-`/foncier/patrimoine`) |
| `routes/web.php` | définition + redirect |

Aucun appelant dans `app/`, `database/data/` (hors journal descriptif).

### Liens internes résiduels
Grep `foncier/patrimoine` dans `resources/js/`, `app/`, `routes/` (hors redirect),
`database/data/` : **aucun** lien interne en dur restant. Docs/suivi historiques
(#1120…) non modifiés.

## OBJET 4 — Visibilité (raisonnement)

1. **Menu FONCIER** : `page.props.nav.foncier_visible` ←
   `FoncierContext::menuVisible($user)` =
   `userPeutLire` (`foncier.lecture`) **ET** `moduleActif()`
   (au moins une enseigne active avec `modules_actifs.foncier`).
2. **Route Patrimoine** : middleware groupe
   `feature.permission:foncier.lecture` + `foncier.module` — **protégée
   indépendamment** du menu (pas seulement obscurité).
3. **Conséquence** : l’entrée top-level réutilise **`peutVoirMenuFoncier`**
   (même condition que le menu FONCIER). Pas d’accès libre.
4. **Pas de question bloquante** : la route n’était pas seulement « cachée »
   par le menu ; middleware + prop alignés. Documenté ici sans arbitrage
   silencieux contraire à Q4=A.

Fiches lues : #1201 (AppShell / ObjectSubNavBar — ne pas défaire), #1203
(ancre documents), #1120 (création vue Patrimoine).

## DÉPLOIEMENT-TEST

OVH :
1. `git pull origin main`
2. `php artisan optimize:clear` (ou `view:clear`)
3. `php artisan route:clear` (routes ajoutées/déplacées)
4. `php artisan journal:sync`

Tests manuels :
- Menu : ordre FONCIER · Programme · Comptabilité · Groupe · GEMME · Patrimoine
- Sans `foncier_visible` : pas d’entrée Patrimoine
- `/foncier/patrimoine?page=2` → `/patrimoine?page=2` (301)
- Actif : Patrimoine souligné, Foncier non

## LEÇON

Sortir une entrée d’un déroulant conditionné exige de reporter **explicitement**
la même condition sur le top-level, même si la route a déjà un middleware —
sinon divergence menu vs URL directe. Adapter aussi l’état actif quand le
composant Inertia reste sous le préfixe de dossier (`Foncier/…`).
