---
suivi: 1517
date: 2026-09-10
sujet: Retrait du cran enseigne FactureVisibility
chantier: factures / visibilite
type: feature
statut: poussé
hash: 88545431
fichiers:
  - app/Support/FactureVisibility.php
  - tests/Feature/FactureVisibilityMatrixTest.php
  - tests/Feature/FactureHistoriqueFournisseurScopeTest.php
  - tests/Feature/FactureVerrou1410Test.php
  - tests/Unit/FactureVerrou1410SourceTest.php
  - tests/Unit/FactureVisibility1517SourceTest.php
  - tests/Feature/FactureVisibility1517Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1517_retrait_cran_enseigne_visibilite.md
---

# SUIVI #1517 — retrait cran enseigne (visibilité factures)

## PROMPT ENVOYÉ

Phase 2. Cause #1516 mesurée (Eric 433 dépôts via GS_ENVOL+GS_HECTARE).
Retirer le 4ᵉ cran enseigne. Socle inchangé. Valideur inchangé.
Push `origin/main`. Pas de Vue. Pas ChargePortage.

## BASE GIT

HEAD = `origin/main` = `973a0287` (chore fiche #1516). Aucun rebase.
Aucun lot concurrent sur `FactureVisibility`.

## FICHES LUES

- **#1516 LEÇON** — FV « protège » n’est pas déposant ∪ valideur ∪ socle ;
  cran enseigne = 4e OR. UUID / impersonation écartés. Impact : retirer
  uniquement ce cran.
- **#1508 LEÇON** — trois familles (FV, listes #1410, porte groupe compta).
  ChargePortage / factures.lecture / CIE hors ce lot.
- **#1410 LEÇON** — verrou ne couvre pas programme/marché/CIE. Le cran
  enseigne + `applyNonVerrouilleConstraint` étaient le couple verrou×enseigne.
  Impact : retirer les deux ensemble ; FactureVerrou reste pour poser/retirer
  et pour `userCanViewFacturePage` (lecture + allowlist).
- **#1461 / #1483 / #1485 / #1503 / #1515** — hors cran. Non retouchés.

## FIX

`FactureVisibility` :

- `applyScope` : user_id OU `applyDesignatedValidatorScope`. Plus de
  blocs GS_ENVOL / GS_HECTARE.
- `canView` : socle ∪ déposant ∪ valideur. Plus de verrou+enseigne.
- `canViewFacture` : même chose (le cran y figurait aussi, retiré).

Nettoyage (plus aucun consommateur hors ce cran) :

- `applyResolvedEnseigneCodeScope` — **retiré**
- `resolveEnseigneCode` — **retiré** (aucun badge/export)
- `applyNonVerrouilleConstraint` — **retiré**. Il ne servait qu’au cran
  enseigne. **Signalé** : `applyScope` / `canView` / `canViewFacture` ne
  testent plus le verrou. Socle / déposant / valideur voyaient déjà les
  verrouillées. `FactureVerrou` reste (poser, retirer, allowlist fiche
  `factures.lecture`). `foncier.deverrouillage` n’appelle pas ces
  méthodes. Pas d’arrêt.
- `userHasGroup` — **retiré** (plus d’appel)

Socle L25-30 et `hasSocleTotalAccess` (`m365GroupNames()` brut) :
**inchangés**. `applyDesignatedValidatorScope` **inchangé**.

Cases boîte : non modifiées. Deux décochées = tout FV = désormais
déposant ∪ valideur. Confirmé par test (i).

## TESTS INVERSÉS

- `FactureVisibilityMatrixTest::test_gs_envol_ne_voit_plus_les_depots_d_autrui`
  (ex. 1 dépôt ENVOL) → 0 + canView false
- `::test_gs_hectare_ne_voit_plus_les_depots_d_autrui` (ex. 1 HECT-2) → 0
- `::test_compteurs_onglets_scopes_par_utilisateur` programmes 1 → 0
  pour GS_ENVOL ; compta inchangé
- `FactureHistoriqueFournisseurScopeTest::test_gs_hectare_et_gs_envol_sans_cran_enseigne`
  (ex. assertContains enseigne)
- `FactureVerrou1410Test::test_sans_verrou_gs_hectare_ne_voit_pas_depot_d_autrui`
  (ex. assertTrue vue enseigne)
- `FactureVerrou1410SourceTest` : plus `applyNonVerrouilleConstraint` ;
  verrou fiche `userCanViewFacturePage` conservé

## DÉPLOIEMENT-TEST

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

Pas de migrate. Pas de route:clear. Pas de npm.

Recoupement : tinker Eric 35 (433 → ses dépôts/validations), Sabrina 24
ou Rudy (total inchangé). Pas le compte Robin.

## LEÇON

Un droit « enseigne » dans FV est un OR, pas un filtre d’affichage.
Le retirer aligne liste, fiche et PDF (`canView`). Le verrou #1410
ne s’appliquait qu’à ce cran : sans lui, plus de contrainte SQL
non-verrouillé dans applyScope. Ne pas fusionner ChargePortage ni
`factures.lecture` dans le même lot.
