---
suivi: 1362
date: 2026-08-19
sujet: saisie_facture_sans_ocr
chantier: depot_factures
type: fix
statut: poussé
hash: ca91e9f7
fichiers:
  - resources/js/Pages/DepotFactures/Index.vue
  - docs/suivi/SUIVI_1362_saisie_facture_sans_ocr.md
  - database/data/journal_mises_a_jour_post_2026_06_12.php
---

## PROMPT ENVOYÉ

En production, Anthropic renvoie : « Erreur OCR — This organization has been disabled. »
Le dépôt fonctionne (PDF upload/conservation, `statut=depose`, `ocr_erreur` renseigné),
mais l'écran ne rend aucun champ : seul un message indique d'utiliser « Analyser avec Claude ».

Objectif : le formulaire doit TOUJOURS être disponible pour un dépôt `depose`,
analysé ou non, et l'OCR ne doit conditionner que le pré-remplissage de valeurs,
pas l'existence du formulaire.

## FICHES LUES

- `#1361` — OCR non bloquant côté upload + logs + seuil d'arrêt lot.

## SYNTHESE

### Objet 1 — Inventaire (ce qui décide formulaire vs message)

#### a) Condition de rendu (formulaire vs message)

Dans `resources/js/Pages/DepotFactures/Index.vue` :
- `const saisieFormVisible = computed(() => { ... })` décide si `DepotFactureSaisieForm` est rendu
  ou si le bandeau d'information remplace l'écran.
- `DepotFactureSaisieForm` est conditionné par `v-if="saisieFormVisible"`.
- Le message « Ce PDF n’a pas encore été analysé... Utilisez « Analyser avec Claude » » est
  dans le bloc `v-else`, donc affiché quand `saisieFormVisible === false`.

Le bloc bloquant (avant le fix) était :
- `if (s === 'depose' && !d.saisie_historique) return false;`

#### b) Sur quoi repose la décision

La décision reposait uniquement sur :
- `depot.statut` (`archive`, `rejete`, `depose`, etc.)
- `depot.saisie_historique`

Aucune donnée OCR n’était prise en compte pour rendre/disposer du formulaire.

#### c) Le formulaire dépend-il structurellement de la réponse OCR ?

Constat : `DepotFactureSaisieForm.vue` ne fait pas dépendre la structure du formulaire de `ocr_raw`.
Exemples (render-safe avec OCR indisponible) :
- `initialLignesTva()` :
  - utilise `props.depot?.ocr_raw?.saisie?.lignes_tva` si présent
  - sinon fallback sur une ligne basée sur `props.depot.montant_ht/montant_tva` (sinon 0)
- `initialLignesComptables()` :
  - utilise `props.depot?.ocr_raw?.saisie?.lignes_comptables` si présent
  - sinon crée une ligne par défaut avec `null`/valeurs vides

Conclusion : l'OCR sert au pré-remplissage (valeurs, ventilations, etc.), pas à l'existence structurelle du formulaire.

### Objet 2 — Rendre le formulaire toujours disponible

Fix minimal appliqué dans `DepotFactures/Index.vue` :
1. `saisieFormVisible` ne bloque plus le statut `depose` non-historique.
   Le formulaire est donc rendu même si OCR a échoué.
2. Le message existant est conservé mais déplacé en bandeau d'information AU-DESSUS du formulaire,
   plutôt qu’en remplacement via `v-else`.

Comportement attendu :
- Dépôt `depose` non analysé : champs vides, saisissables.
- Pré-remplissage : uniquement via « Options de masse » si renseignées (prioritaires sur OCR),
  et via valeurs disponibles dans le dépôt (montants existants, etc.).

### Objet 3 — Relance « Analyser avec Claude » plus tard

Aucun changement côté circuit d'analyse (hors UI).

Ce que fait le code aujourd’hui (pour éviter l’écrasement silencieux) :
- `DepotFactureController::analyser()` :
  - n’efface que `ocr_erreur` (et pas `ocr_raw`).
- `DepotFactureClaudeAnalysisService::analyzeAndPersist()` :
  - fusionne le patch OCR avec l’existant via `mergeSaisiePreservingManual()`.
  - la fusion ne remplit que les clés considérées « vides » dans la saisie existante.

Donc : « la machine propose, l’humain décide » et la relance déclenche déjà une confirmation dans
l’UI lorsque l’utilisateur relance après saisie (bouton « Réanalyser »).

## DÉPLOIEMENT-TEST

Avec l’API en échec (« organization has been disabled ») :
1. Déposer un PDF : le dépôt s’enregistre (`statut=depose`, `ocr_erreur` renseigné).
2. Vérifier que la colonne SAISIE affiche le formulaire complet et les champs saisissables.
3. Validation jusqu’au circuit NV1/NV2 puis comptabilisation : parcours identique à une saisie manuelle.

Cas nominal :
1. OCR disponible : NON-RÉGRESSION du pré-remplissage.

Cas relance :
1. Saisir à la main puis relancer « Analyser avec Claude » : la saisie n’est pas écrasée silencieusement.

## LEÇON

Un flux comptable ne doit jamais rendre un service d’assistance (OCR) comme condition d’existence de l’écran.
L’OCR doit être une aide à la saisie, pas un verrou UI.

