fix(email-ingest): extraction testable et pinnée au golden set + adc-008
L'extraction de champs vivait dans un heredoc à l'intérieur d'email-inspect.sh : impossible à exécuter isolément, donc jamais mesurée, donc fausse sans que personne puisse le voir. Sur la facture Darnis F1048 elle renvoyait le numéro de TVA d'Arcodange comme référence de facture, et aucune date. - extract_fields.py : l'extraction sort du shell et devient un module. - test_extract.py : régression contre les 16 factures hand-vérifiées de fleet/golden/invoice-extract/. Score par champ, et une valeur FAUSSE pèse plus qu'une valeur absente — un humain recopie ce qui s'affiche. Valeurs fausses : 4 → 0. Exactitude ref 62,5 → 75 %, date 62,5 → 75 %, HT 68,8 → 75 %, TTC 81,2 → 93,8 %. Cinq bugs réels, dont trois invisibles sans test : - « Nº » sur les factures françaises est U+00BA (ordinal masculin), pas le signe degré. La classe [°o] le rate, le motif principal échoue, et le repli attrape le premier jeton ref-shaped du document — très souvent un numéro de TVA. - Le filtre anti-TVA rejetait « FR73261832 », qui est la vraie référence OVH : un numéro FR fait exactement 11 caractères après le préfixe. - « Montant total (HT) » était lu comme un TTC. - Une référence coupée par la colonne (« 06-01-26- » / « payment-366753 ») était renvoyée amputée : le recollage doit précéder le scan, sinon la queue seule est trouvée en premier. - Un `\b` après `€` ne peut jamais matcher en fin de ligne (€ n'est pas un caractère de mot) — la TVA n'était jamais extraite. adc-008 : une facture fournisseur s'enregistre à SA date, même future, tant que l'exercice (année civile) ne bascule pas. Le document fait foi ; altérer sa date ferait diverger l'écriture de sa pièce justificative (CGI art. 289 VII). Registre validé : 8 règles, 8 ADC, 0 erreur. scopes.ts : 1232 (factures fournisseur) ajouté à prod-write — oubli initial, révélé par un 403 en production sur F1048. Le pipeline s'est arrêté sans écrire. Appliqué en production via le pipeline gated : FAF2026014 (Darnis F1048), 218,50 HT + 43,70 TVA = 262,20 TTC, validée, non réglée. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VRShc4QhLLU73FLHx9vskh
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
---
|
||||
id: adc-008
|
||||
title: "Facture fournisseur enregistrée à SA date, y compris future, tant que l'exercice ne change pas"
|
||||
status: Accepted
|
||||
decided: 2026-08-13
|
||||
effective_from: 2026-08-13
|
||||
effective_until: null
|
||||
supersedes: null
|
||||
superseded_by: null
|
||||
---
|
||||
|
||||
# adc-008 — Date d'enregistrement d'une facture fournisseur
|
||||
|
||||
## Context
|
||||
|
||||
Un fournisseur peut émettre une facture datée **postérieurement** à son envoi.
|
||||
Cas déclencheur : Darnis Operations envoie le 13/08/2026 la facture **F1048**
|
||||
datée du **31/08/2026** (pratique de facturation en fin de mois).
|
||||
|
||||
Question posée : enregistrer le document à sa date, attendre cette date, ou
|
||||
demander une réémission ?
|
||||
|
||||
## Decision
|
||||
|
||||
**La facture est enregistrée à la date portée sur le document**, même si cette
|
||||
date est dans le futur, **dès lors qu'elle tombe dans le même exercice
|
||||
comptable** — l'exercice Arcodange étant l'année civile (clôture au 31/12,
|
||||
cf. `fiscal.yaml`).
|
||||
|
||||
**Limite qui inverse la décision :** si la date portée fait basculer l'écriture
|
||||
dans l'exercice **suivant** (facture reçue en décembre, datée de janvier), la
|
||||
présente décision ne s'applique pas — l'enregistrement attend, ou la question
|
||||
est arbitrée avec l'expert-comptable. Le rattachement à l'exercice prime sur la
|
||||
commodité de saisie.
|
||||
|
||||
## Base légale & doctrine
|
||||
|
||||
Le rattachement d'une charge à un exercice suit le principe d'indépendance des
|
||||
exercices (art. 38 et 39 CGI ; PCG art. 513-4) : c'est la date de la facture,
|
||||
et non celle de sa saisie, qui détermine l'exercice. Altérer la date d'une
|
||||
facture fournisseur reviendrait à substituer une donnée à celle du document —
|
||||
contraire à la piste d'audit fiable (CGI art. 289 VII), qui exige que l'écriture
|
||||
reflète la pièce justificative.
|
||||
|
||||
Côté TVA déductible, le droit à déduction sur une prestation de services naît à
|
||||
l'encaissement par le prestataire (CGI art. 271), non à la saisie : la date
|
||||
d'enregistrement est donc sans effet.
|
||||
|
||||
## Alternatives rejected
|
||||
|
||||
- **Attendre la date de la facture pour l'enregistrer.** Sans risque, mais crée
|
||||
une file d'attente de pièces reçues non saisies — précisément ce que la
|
||||
régularisation de juillet 2026 avait mis au jour.
|
||||
- **Demander la réémission à la date d'envoi.** Le plus propre sur le fond, mais
|
||||
impose un geste au fournisseur pour un enjeu nul dans le même exercice.
|
||||
- **Enregistrer à la date de réception plutôt qu'à celle du document.** Rejeté :
|
||||
fait diverger l'écriture de sa pièce justificative.
|
||||
|
||||
## Consequences
|
||||
|
||||
- Aucun paiement n'est enregistré tant que le règlement n'a pas eu lieu : la
|
||||
facture reste `paye=0` jusqu'à l'encaissement effectif côté fournisseur.
|
||||
- Le libellé du fournisseur peut désigner une autre période que le fait
|
||||
générateur (F1048 indique « août 2026 » pour une commission sur l'encaissement
|
||||
de **juillet**). Le libellé n'est pas corrigé ; la note interne documente le
|
||||
rattachement réel.
|
||||
- Le juge pré-gate signale toute date future comme anomalie. C'est le
|
||||
comportement voulu : la présente décision est ce qui autorise l'opérateur à
|
||||
passer outre, et ce passage outre reste tracé dans le dossier de preuve.
|
||||
|
||||
## QA & validation
|
||||
|
||||
- Contrôle arithmétique du document avant saisie (HT + TVA = TTC) — sur F1048 :
|
||||
218,50 + 43,70 = 262,20, vérifié par `extract_fields.py`.
|
||||
- Répétition sandbox puis gate humain via `fleet/harness/promote/` : le verdict
|
||||
BLOCK du juge sur la date future doit être explicitement outrepassé, jamais
|
||||
contourné silencieusement.
|
||||
- Au 31/12, vérifier qu'aucune facture enregistrée ne porte une date de
|
||||
l'exercice suivant — c'est le seul cas que cette décision n'autorise pas.
|
||||
|
||||
## References
|
||||
|
||||
- Première application : facture fournisseur `FAF2026014` (Darnis F1048),
|
||||
enregistrée le 13/08/2026 en production, datée du 31/08/2026.
|
||||
- Exercice comptable : `fleet/profile/fiscal.yaml`, `entity.fiscal_year_end`.
|
||||
- Contrat d'apport d'affaires : `CT2601-0001` (adc-005 pour la lane CCA).
|
||||
Reference in New Issue
Block a user