---
suivi: 1104
date: 2026-07-30
sujet: Programmes — ordre des onglets et du rail d'accès rapide
chantier: programmes
type: feature
statut: poussé
hash: 8069ec90
fichiers:
  - resources/js/Layouts/AppShell.vue
  - resources/js/Pages/Programmes/Index.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1104_programmes_ordre_onglets_rail.md
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1104 — Réordonner les onglets programme et le rail liste (#1093) selon
l’ordre métier ; masquer provisoirement SAV / TRÉSORERIE / SYNTHÈSE via drapeaux
réversibles ; conserver BILAN avant BUDGET ; non-régression Acquéreurs
(`rail.tma` + `canSeeServiceClientNav`). Un seul commit + push.

## SYNTHÈSE

### Audit préalable

- **Onglets programme** : `resources/js/Layouts/AppShell.vue`, `<nav aria-label="Navigation programme">` (~1525–1618). Liens inline (`Link` / `span`), pas de composant dédié. `ProgrammeHeader.vue` = bandeau fiche page, **pas** le sous-menu.
- **État actif** : classe underline or selon `$page.component` / `isSuiviChantierNavActive` (SuiviChantier, Marches/, AppelsOffres/, Cie/, Factures Index/Show).
- **Acquéreurs** : `v-if="canSeeServiceClientNav"` = `userCanAny(['tma.lecture', 'programmes.appels_de_fonds.lecture'])`.
- **SAV / TRÉSORERIE / SYNTHÈSE** : étaient des `<span class="… text-gray-400" title="Fonctionnalité à venir">` — **aucun** drapeau d’activation existant (grisage = placeholders inertes). Trésorerie a des routes (`programmes.tresorerie.*`) ; SAV / Synthèse n’ont pas d’onglet route dédié dans la barre.
- **Rail** : définition **séparée** dans `resources/js/Pages/Programmes/Index.vue` (~490–565). `showTmaRail` = `programme.rail.tma && canSeeServiceClientNav`. Track **220px fixe**.

### Changements

- Ordre cible appliqué aux deux endroits : RÉSUMÉ · COMMERCIALISATION · ACQUÉREURS · CHANTIER · BILAN · BUDGET · DOCUMENTS · (cog).
- Masquage provisoire : objet `programmeNavPlaceholdersVisible = { sav: false, tresorerie: false, synthese: false }` + commentaire #1104. Réafficher = passer un drapeau à `true`.
- Hypothèse BILAN : conservé avant BUDGET (seul point métier à revalider si besoin).
- Rail : même ordre ; titres Chantier alignés ; 220px inchangé (même nombre d’icônes).
- Aucun PHP applicatif, aucune route retirée, aucun foncier / menu global touché.

## DÉPLOIEMENT / TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan journal:sync
php artisan view:clear
# pas de migrate ; pas de route:clear ; pas de npm/composer sur OVH
```

## LEÇON

Deux définitions séparées de l’ordre de navigation (onglets `AppShell.vue` et rail
`Programmes/Index.vue`) divergeront tôt ou tard. Recommandation : extraire une source
unique (constante / module partagé) sans refonte dans ce lot — à planifier quand un
prochain lot touche à nouveau la nav programme.
