---
suivi: 1622
date: 2026-09-21
sujet: Onglet FINANCIER (Bilan + Budget)
chantier: programmes / navigation
type: feature
statut: poussé
hash: 9e0dcf6e
fichiers:
  - resources/js/Layouts/AppShell.vue
  - resources/js/Components/Programmes/FinancierSubNav.vue
  - resources/js/Pages/Bilan/Index.vue
  - resources/js/Pages/Budget/Index.vue
  - resources/js/Pages/Programmes/Index.vue
  - resources/js/Pages/Programmes/Dashboard.vue
  - resources/js/Components/ProgrammeNav.vue
  - app/Http/Controllers/ProgrammeBudgetController.php
  - tests/Unit/OngletFinancier1622SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1622_onglet_financier.md
---

# SUIVI #1622 — onglet FINANCIER

## PROMPT ENVOYÉ

Regrouper BILAN et BUDGET sous un onglet FINANCIER (sous-onglets
BILAN défaut + BUDGET). BUDGET visible seulement GS_ADMIN_ERP
(contrôle serveur 403, m365GroupNames brut). Ancre URL #bilan /
#budget. Anciennes URLs conservées. Navigation uniquement, contenu
inchangé. TVA sur marge = lot suivant.

## FICHES LUES

- **#1611** — AppShell L277-282 lien Budget ; ne pas toucher le
  contenu Budget. Impact : on change la NAV, pas Index.vue métier.
- **#1617 LEÇON** — inventaire exhaustif des liens avant de
  changer les href. Impact : même travail ici (liste dans la
  synthèse).
- **#1351** — CHANTIER : Teleport `#chantier-subnav-host` +
  ObjectSubNavBar + hash. Impact : patron recopié.
- **#1188 / zones communes** — AppShell + Programmes/Index.vue.
  Impact : un seul build, rebase origin/main avant Vite.
- **#1624** — dernier numéro consommé sur origin/main. #1621
  acompte : zone différente, push série à cause du manifest.

## AVANT MODIFICATION (constat)

Menu : `AppShell.vue` `programmeNavItems` L217-307. BILAN L270-276
`/programmes/${id}/bilan` ; BUDGET L277-282 `/budget`.

Routes : `GET programmes/{programme}/bilan` `bilan.index`
(`BilanFinancierController::index`). `GET …/budget`
`programmes.budget.index` (`ProgrammeBudgetController::index`).
Écriture budget déjà `m365.groups:GS_DIRECTION_GENERALE,GS_ADMIN_ERP`.

CHANTIER : `SuiviChantier/Index.vue` + `ObjectSubNavBar` téléporté
vers `#chantier-subnav-host`. Hash `#marches`, `#factures`, etc.
**Oui, l’ancre URL existe déjà.** Repris (même barre, mêmes hashes).

Écart volontaire : Bilan et Budget restent deux pages Inertia
(payloads distincts). Le sous-onglet change de chemin
(`/bilan` ↔ `/budget`) **et** pose l’ancre. Justification : ne pas
fusionner les contrôleurs ni charger le budget pour tout le monde.

## DÉPLOIEMENT

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

Pas de migrate. `route:clear` non requis (routes inchangées).

## LEÇON

CHANTIER = une page + hash. Deux pages lourdes (Bilan / Budget)
se regroupent au menu avec la même barre, mais l’ancre ne peut pas
à elle seule servir le Budget : le hash n’est pas envoyé au
serveur. Conserver les deux URLs, 403 serveur sur Budget,
m365GroupNames brut. Le compte Robin (GS_ADMIN_ERP) ne prouve
pas le refus.
