---
suivi: 1486
date: 2026-09-08
sujet: NV2 source programmes.enseigne_id (infirmation #1386)
chantier: factures
type: fix
statut: poussé
hash: aea94556
fichiers:
  - app/Support/FacturePasseParValidationNv2.php
  - tests/Unit/FacturePasseParValidationNv2SourceTest.php
  - tests/Unit/FactureWorkflowApresNv1ServiceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1486_nv2_source_enseigne_programme.md
---

# SUIVI #1486 — NV2 : source unique `programmes.enseigne_id`

## PROMPT ENVOYÉ

Fix helper NV2 : lire `programmes.enseigne_id` (plus `entites.enseigne_id`).
Décision Robin. #1386 infirmée. Pas de reprise des 2 dépôts RACINE.
Pas de touche DepotFactureController / FactureGlobale* / ComptaTableauBord /
ComptabilisationController / Vue.

## BASE GIT

HEAD attendu : `54e1dec4` (fiche #1484). Confirmé. origin/main identique.
Pas de rebase. #1485 non présent sur origin/main au moment du lot ;
fichiers FactureGlobale* / Pages/Factures non touchés.

## FICHES LUES

- **#1484** (LEÇON) — deux colonnes d’enseigne ; le circuit lisait l’entité ;
  défaut NULL → NV2 = cause RACINE. Impact : ne plus « ajouter un test
  d’enseigne », changer **laquelle**.
- **#1386** (LEÇON, **infirmée**) — source `entite.enseigne`, cas prudent
  NULL → NV2. Impact : helper réécrit ; tests #1386 qui posaient l’enseigne
  sur l’entité sont faux.
- **#1385** — avant tout test d’enseigne, NV2 = tout programme. Conservé :
  FG = `programme_id` null.

## SYNTHÈSE

### Helper

`checkEntiteEnseigne(?Entite)` remplacé par `checkProgrammeEnseigne(Programme)`.
Lecture : `programme.enseigne` (`programmes.enseigne_id` → `enseignes.code`).
Défaut prudent NULL entité **supprimé**. Colonne programme NOT NULL ;
code vide / enseigne non chargée → pas ENVOL → skip NV2 (`return false`).
Programme introuvable : `check()` / `checkPourProgrammeId()` restent
`return true` (défensif inchangé).
`CODE_ENSEIGNE_NV2 = 'ENVOL'` + `strtoupper`. Hook seuil HT L83 inchangé,
non activé.

Appelants inchangés (DepotFactureController non modifié).

### Alignement ValidateurNv2Resolver

`isEnseigneEnvol()` lisait déjà `programme.enseigne` — non modifié.
Helper et resolver lisent désormais la **même** source
(`programmes.enseigne_id` / `enseignes.code`).

### Conservé

- FG : skip NV2.
- WV nv2 déjà ouvert : `FactureWorkflowRealignementService` non modifié.
  Dépôts 1634 (FAC-2026-1294) et 1735 (FAC-2026-1349) restent en NV2 ;
  Robin valide à la main. Pas d’écriture `entites.enseigne_id`.
- Cible skip : `a_comptabiliser` + WV `mise_paiement` en_attente.

### Tests #1386 repris

`FactureWorkflowApresNv1ServiceTest` : enseigne posée sur
`programmes.enseigne_id` (plus seulement sur l’entité).
`test_passe_par_nv2_uniquement_si_entite_enseigne_envol` renommé
`…_programme_enseigne_envol`.
`FacturePasseParValidationNv2SourceTest` : assertions inversées
(programme.enseigne, plus entite.enseigne).

Nouveaux cas Eloquent a→f (RefreshDatabase) : voir synthèse livrable.
pdo_sqlite absent sur ce CLI → tests Eloquent **skipped** (même contrainte
que #1386). Source tests : 7 passed.

### Libellé front — PROPOSITION (non codée)

`DepotFactureSaisieForm.vue` L3640–3661. Payload déjà porteur de
`enseigne_code` via `ProgrammeSaisieSelectPresenter` (`findProgramme().enseigne_code`).

| Libellé affiché | Condition | Valeur postée | Comportement back |
|---|---|---|---|
| Valider et comptabiliser | destination = FRAIS_GENERAUX **ou** enseigne_code programme ≠ ENVOL | inchangé (déjà_valide) | helper skip NV2 → a_comptabiliser |
| Valider N1 et envoyer en NV2 | destination PROGRAMMES **et** enseigne_code = ENVOL | inchangé | helper NV2 |
| (dialogue) …prête pour comptabilisation | même que skip | — | a_comptabiliser |
| (dialogue) …passera en validation NV2 | enseigne ENVOL | — | en_validation_nv2 |

Libellé proposé skip non-ENVOL : « Valider N1 et envoyer en comptabilisation ».
À valider par Robin ; ne pas coder dans ce lot.

### Journal

Entrée `factures-hectare-sans-nv2-1386-2026-09-01` **mise à jour** (#1406,
même sujet), pas de seconde entrée.

## DÉPLOIEMENT-TEST

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

- Nouvelle facture programme HECTARE (id 16 SAS RACINE) après NV1 →
  `a_comptabiliser`, pas de WV nv2.
- Non-régression ENVOL : NV1 → `en_validation_nv2`.
- Dépôts 1634 et 1735 : **ne pas** les déplacer par script ; valider NV2 à la main.
- Ne pas renseigner `entites.enseigne_id` sur RACINE « pour corriger ».

## LEÇON

L’enseigne de circuit facture est `programmes.enseigne_id`, déclarée à la
création du programme et stable. `entites.enseigne_id` peut rester NULL
(2 cas prod) : ce n’est plus un signal NV2. #1386 a choisi l’entité ; #1486
l’infirme. Un défaut « prudent » NULL → NV2 a envoyé SAS RACINE en NV2.
Ne pas réintroduire `entite.enseigne` dans le helper. Ne pas écrire
l’enseigne d’entité pour « réparer » un programme.
