Le problème
- →Cohérence buyer/seller impossible à maintenir — un avoir doit reprendre exactement les informations acheteur et vendeur de la facture source. Si modifiées entre-temps (changement d'adresse, SIRET corrigé), l'avoir diverge et peut être rejeté par le client ou l'administration.
- →Chaîne ISCA et compliance fiscale — un avoir doit entrer dans le ledger fiscal avec un numéro séquentiel distinct (AVO-YYYY-NNNN), un hash SHA-256 lié à la chaîne de la facture source. Un avoir émis hors-séquence crée un trou d'audit.
- →Validation EN16931 stricte — l'avoir Factur-X (code 381) a ses propres règles BR. Le buyer_is_individual hérité de la facture doit être propagé. Un avoir B2C avec balises SIRET crée une non-conformité Schematron.
Notre solution
- →POST /credit-notes avec invoice_id — Scell snapshot automatiquement buyer et seller depuis la facture source au moment de l'émission. Les colonnes buyer_* et seller_* sur l'avoir sont figées indépendamment de toute modification ultérieure du buyer ou de la company.
- →Héritage B2C automatique — si la facture source est buyer_is_individual: true, l'avoir hérite automatiquement de ce flag. Les balises SIRET/TVA/L441-10 sont supprimées sans configuration, conformément EN16931 BR-CO-26.
- →Partiel ou total, lignes sélectives — le tableau lines[] avec invoice_line_id permet un avoir partiel ligne par ligne. Sans le tableau lines[], l'avoir couvre la totalité de la facture. La règle InvoiceCreditable valide que la facture n'est pas déjà totalement avoinée.
6 garanties avoir
Liaison stricte à invoice_id
Le champ invoice_id lie l'avoir à une facture existante et vérifiée. Anti-IDOR complet : la facture doit appartenir au même tenant/sub_tenant. Impossible de créer un avoir orphelin ou cross-tenant.
Héritage buyer/seller figé
Les colonnes buyer_* (name, siret, address) et seller_* (company) sont snapshotées depuis la facture source à l'émission. Aucune modification ultérieure du buyer ou de la company n'impacte l'avoir déjà émis.
Partiel par lignes (invoice_line_id)
Le tableau lines[] accepte N lignes avec invoice_line_id + quantity optionnelle. Un avoir partiel avoire sélectivement. Sans lines[], l'avoir est total. La rule InvoiceCreditable vérifie l'absence de sur-avoinement.
B2C hérité automatiquement
Si la facture source est buyer_is_individual: true, CreditNoteService propage automatiquement le flag. Les balises BT-46/47/48 et les mentions L441-10 sont supprimées sans configuration — conformité BR-CO-26 garantie.
Download PDF/A-3b + XML CII
Avoir disponible via GET /credit-notes/{id}/download/{format}. Format pdf (PDF/A-3b), xml (CII seul), facturx (complet). Fichier stocké en S3 WORM avec hash ISCA. Accessible par API, signed URL ou webhook.
Validation stricte 422 explicite
La rule InvoiceCreditable vérifie statut creditable (validated, transmitted, accepted, paid), absence de sur-avoinement, appartenance des lignes. Chaque violation retourne 422 avec le code d'erreur exact — pas de corruption silencieuse.
Questions fréquentes
Prêt à émettre votre premier avoir Factur-X ?
Sandbox gratuit. Aucune carte de crédit. Avoir EN16931 conforme en 1 appel.