---
suivi: 1189
date: 2026-08-04
sujet: Saisie facture — Bloquer depuis Index + envoi 3 issues
chantier: depot-factures
type: feature
statut: poussé
hash: 25e0c027
fichiers:
  - resources/js/Components/DepotFactures/DepotFactureWorkflowBloquerControls.vue
  - resources/js/Components/DepotFactures/DepotFactureEnvoiValidationDialog.vue
  - resources/js/Pages/DepotFactures/Show.vue
  - resources/js/Pages/DepotFactures/Index.vue
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - app/Http/Controllers/DepotFactureController.php
  - app/Services/FactureWorkflowApresNv1Service.php
  - app/Support/WorkflowValidationStepPresenter.php
  - app/Support/FactureHistoriquePresenter.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/WorkflowValidationStepPresenterTest.php
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1189 — lot 1/4 saisie facture. Bloquer accessible depuis Index (même
endpoint/motif que Show). Flux d’envoi : une boîte, trois issues si attributaire.
Audit distinct. Mécanique de blocage NON modifiée. Pas de filtre enseigne /
logique A / SoD.

## FICHES LUES

- `SUIVI_1188_diag_saisie_facture.md` — cause Index sans barre ; auto-NV1 =
  champ Valideur ; reco 3 issues + Bloquer permanent.
- Approche : extraire Bloquer dans composant partagé ; `envoi_intention` serveur ;
  ne pas toucher `processBloquer` / `processDebloquer`.

## SYNTHÈSE

### Objet 1 — Bloquer depuis Index
- `workflow_modification` passé depuis Index → SaisieForm.
- Composant `DepotFactureWorkflowBloquerControls` (boutons + dialogs) utilisé par
  **Show** et **SaisieForm** (quand `can_block` et pas `externalWorkflowActions`).
- Même endpoint `/factures/fiche/{id}/bloquer|debloquer`, motif obligatoire.

### Objet 2 — Une boîte, trois issues
- Si émetteur = attributaire (Valideur) : dialog avant POST valider.
- Issues : `valider_nv1` · `envoyer_sans_valider` · `bloquer` (+ motif inline).
- Échap / fermeture → `envoyer_sans_valider` (jamais bloquer / valider).
- Non-attributaire : aucune boîte.

### Objet 3 — Audit
| Issue | WV commentaire | Historique dépôt |
|-------|----------------|------------------|
| Valider NV1 (choix) | `validation_deliberee_deposant` | `valide_nv1_a_l_envoi` (+ envoye_nv2 / compta) |
| Envoyer sans valider | — (NV1 en_attente) | `envoye_nv1_sans_validation` |
| Bloquer à l’envoi | colonnes `bloque*` (inchangé) | `envoye_nv1_sans_validation` + motif en colonnes |
| Legacy (sans intention) | `validation_automatique_deposant` | comportement antérieur |

Les 86 auto existantes ne sont pas reprises.

### Actions Show absentes d’Index (rapport, non ajoutées)
Avec `workflow_modification` : Valider workflow + Enregistrer + **Bloquer** OK
sur Index. Toujours absents sur Index : **Rejeter**, **Réattribuer**,
**Supprimer**, « Facture suivante à valider ».

### SoD (rappel compta)
Aucun contrôle n’empêche dépôt + NV1 + NV2 par la même personne (#1188 : 6
factures). Point à porter à Sabrina BARTOLI / Rudy BENOR — hors lot.

## DÉPLOIEMENT-TEST

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

Pas de migrate. Tests manuels Index + attributaire (liste #1189).

## LEÇON

Un bouton « sur la saisie » dans le journal peut vivre sur le shell Show alors
que Index monte le form nu — passer `workflow_modification` et factoriser
l’action, ne pas recopier processBloquer.
