---
suivi: 1367
date: 2026-08-31
sujet: verrou_seuil_comptabilisation
chantier: comptabilisation
type: fix
statut: poussé
hash: f163bab4
fichiers:
  - app/Support/DepotRetenuesNv1Lock.php
  - app/Http/Controllers/DepotFactureController.php
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - resources/js/Pages/DepotFactures/Index.vue
  - resources/js/Pages/Factures/Comptabilisation/Index.vue
  - tests/Unit/DepotRetenuesNv1LockTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

## PROMPT ENVOYÉ

PHASE 2 — FIX suite #1366. Déplacer le seuil du verrou retenues/montants de NV1 à
**comptabilisée** (Option A). Aligner UI et serveur. Conserver bypass GS_ADMIN_ERP
(`m365GroupNames` brut). Pas de refonte `buildDraftPayload`.

## FICHES LUES

- **#1366** — cause (422 assert vs UI partielle, buildDraftPayload monolithique) ; décision Option A.
- **#1301** — origine verrou ; intention conservée post-comptabilisation.
- **#1364** — volet Comptabilité sibling ; non touché.

## SYNTHÈSE

### Changement métier

| Avant (#1301) | Après (#1367) |
|---------------|---------------|
| Verrou dès `estAuDelaDeNv1Inclus` | Verrou dès `estComptabiliseeOuAuDela` |
| Message « ce dépôt a franchi NV1 » | « cette facture est comptabilisée » |
| UI : `DEPOT_STATUTS_NV1_PLUS` pour fieldset | UI : `NORMALIZED_STATUTS_COMPTA_VERROUILLE` via `displayStatutNormalise` |

**CIE auto** (#1301) : inchangé — toujours bloquée dès NV1 (`depotFranchiNv1` / `peutProposerceCieAutomatique`).

### Tableau statuts ENUM `depot_factures.statut` (13 valeurs)

Normalisation via `FactureStatutService::normalize` ; **priorité `factures.statut`** si `facture_id`.

| Statut brut | Normalisé | Verrou AVANT | Verrou APRÈS |
|-------------|-----------|--------------|--------------|
| depose | analyse | Non | Non |
| attribue | analyse | Non | Non |
| en_analyse | analyse | Non | Non |
| analyse | analyse | Non | Non |
| en_cours_saisie | analyse | Non | Non |
| en_validation_nv1 | nv1_en_cours | **Oui** | **Non** |
| en_validation_nv2 | nv2_en_cours | **Oui** | **Non** |
| a_comptabiliser | a_comptabiliser | **Oui** | **Non** |
| comptabilisee | comptabilisee | Oui | Oui |
| valide | comptabilisee | Oui | Oui |
| paye | payee | Oui | Oui |
| rejete | rejetee | Non* | Non* |
| archive | archivee | Non* | Non* |

\* Hors pipeline retenues (`estExcluDesRetenues`).

Alias bruts supplémentaires mappés côté front (`RAW_STATUT_TO_NORMALIZED`) : `en_attente_nv1/nv2`,
`nv1_en_cours`, `nv2_en_cours`, `mise_en_paiement`, `en_paiement`, `payee`, `paiement_confirme`.

### Fichiers modifiés

- `DepotRetenuesNv1Lock` : seuil + message constante.
- `DepotFactureController::assertRetenuesEtMontantsVerrouillesPostNv1` : `estComptabiliseeOuAuDela` ;
  payload dépôt inclut `facture.statut` pour normalisation front.
- `DepotFactureSaisieForm.vue` : `depotComptabiliseOuAuDela`, `displayStatutNormalise`, bandeau ;
  `depotFranchiNv1` conservé pour CIE.
- `Index.vue` (dépôt + compta) : prop `display_statut`.
- Tests unitaires `DepotRetenuesNv1LockTest` (sans DB).

`ComptabilisationController::update` → inchangé (appelle `applyDepotSaisieFromValidated`).

### Filet complémentaire (hors lot)

Après comptabilisation, `buildDraftPayload` envoie toujours le brouillon complet ; une divergence
sur un champ verrouillé peut encore provoquer un 422 global. **Non traité** — arbitrage séparé.

### Tests manuels requis (GS_COMPTABILITE — pas Robin Admin ERP)

1. `en_validation_nv1` : modifier montants + service/analytics/mode règlement/compte bancaire → OK.
2. `a_comptabiliser` : idem → OK.
3. `comptabilisee` : montants/retenues refusés (422), message « comptabilisée » ; champs compta selon `canEditDepot`.
4. Cas #1366 : E-04 HECTARE, F3927 SCI TECNOVER, FG, retenues 0 € → enregistrer champs compta → OK.
5. Écran **dépôt** (Show/Index) : non-régression.
6. Bypass GS_ADMIN_ERP sur facture comptabilisée : montants modifiables.

⚠️ Tests sqlite Feature souvent SKIPPED — validation prod/compta manuelle obligatoire.

## DÉPLOIEMENT-TEST

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

## LEÇON

Désaccord UI (fieldset partiel) / serveur (assert sur payload complet) + seuil trop tôt (NV1) =
blocage total silencieux pour les comptables. Toute évolution du verrou doit utiliser **la même**
fonction de seuil normalisée des deux côtés.
