---
suivi: 1410
date: 2026-09-02
sujet: facture_verrou_consultation
chantier: factures
type: feature
statut: poussé
hash: 39799926
fichiers:
  - database/migrations/2026_09_02_140000_add_verrouille_to_factures_and_depot_factures.php
  - app/Support/FactureVerrou.php
  - app/Support/FactureVisibility.php
  - app/Models/Facture.php
  - app/Models/DepotFacture.php
  - app/Http/Controllers/DepotFactureController.php
  - app/Services/DepotFactureEngagerWorkflowService.php
  - app/Services/DepotFactureValiderDejaValideService.php
  - routes/web.php
  - resources/js/Pages/DepotFactures/Show.vue
  - resources/js/Pages/DepotFactures/Index.vue
  - tests/Feature/FactureVerrou1410Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1410 — verrou consultation nominative facture sensible (FactureVisibility + porte factures.lecture), pose canEditDepot / retrait COMPTA+DG, hors panel programme/marché/CIE/foncier.

## FICHES LUES

- #1409 (diagnostic) — stockage facture+miroir dépôt, fuites hors FV, compteurs parallèles.
- #1402 — FactureVisibility / socle (acquis, non remesuré).

## SYNTHÈSE

### Stockage
- Colonnes `verrouille` (bool défaut false), `verrouille_par_user_id`, `verrouille_at` sur `factures` et `depot_factures`.
- Lecture : facture.verrouille si liée ; sinon depot.verrouille.
- Recopie à la création Facture depuis dépôt (engager, valider, historique, deja_valide).
- SHOW COLUMNS : base locale inaccessible — à confirmer en prod avant migrate (requête dans livrable).

### Visibilité
- `canView` / `canViewFacture` / `applyScope` : cran enseigne neutralisé si verrouillé ; socle early-return inchangé ; contrainte SQL `applyNonVerrouilleConstraint` (pas de post-filtre).
- `userCanViewFacturePage` : `factures.lecture` ne contourne plus un verrou.

### UI
- Show + tiroir Index : « Restreindre l'accès à cette facture » / retrait, confirmation.
- Historique : actions `verrouillage` / `deverrouillage` via Historisable.

### LIMITES CONNUES (hors périmètre assumé)
1. Panel factures d’un programme (`FactureController::indexProps`) — pas de FV.
2. Liste factures d’un marché (`MarcheController::facturesDepotPourMarche`).
3. Sélecteur CIE (`CieController::depotFacturesOptions`).
4. Recherche foncier dépôts (`ChargePortageController::searchDepotFactures`).
5. Notifications / e-mails (`NotificationFactureService`) : corps peut encore citer fournisseur + montant pour destinataires déjà notifiés — non modifié.
6. Compteurs parallèles signalés non corrigés : badge `factures_en_attente_count` ; `non_visibles` marché (#1409).

## DÉPLOIEMENT-TEST

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

Tests manuels : compte GS_HECTARE hors socle (pas le compte Robin admin).

## LEÇON

Un verrou dans FactureVisibility ne couvre pas les listes programme/marché/CIE/foncier : les documenter comme limite tant que la restriction d’accès programmes n’est pas livrée. Ne jamais brancher le verrou dans les agrégats.
