feat(comptable): parseur CII + formats PA - #40
Conversation
|
Merci pour cette contribution, elle comble un vrai manque : on savait générer du CII via Factuel :
Code : Sur la neutralité : la section "PA pour éditeurs/OD" apporte de la valeur, mais garder iopole comme seule entrée nommée (avec adresse et URL) penche vers le placement. Idéalement lister 2-3 PA API-first, ou garder iopole avec statut corrigé et sans l'adresse commerciale. Point positif : le choix regex sans dépendance élimine tout risque XXE, c'est le bon arbitrage côté sécurité. |
…de réception des trois formats
…und-trip et fixture remise
Merci pour la relecture détaillée, tout est traité :
|
romainsimon
left a comment
There was a problem hiding this comment.
Merci pour le travail sur le parseur et les tests. J’ai exécuté node scripts/test-parse-einvoice.js : ils passent. Cela ne suffit toutefois pas à présenter ce code comme un parseur/validateur CII EN16931 utilisable en comptabilité.
Blocages techniques :
- aucune validation XSD, Schematron ou profil EN16931 n’est effectuée ; la présence de
CrossIndustryInvoicesuffit ; - les champs obligatoires absents deviennent silencieusement
nullou0; parseDate102vérifie surtout la longueur et accepte des dates calendaires invalides ;parseFloataccepte des valeurs malformées comme12abcet les transforme en 12 ;- aucun contrôle ne rapproche les totaux, taxes, lignes et montant à payer.
En l’état, une facture invalide peut donc produire une écriture plausible mais fausse. Il faut soit ajouter une validation normative et des erreurs bloquantes, soit renommer explicitement la fonction en aperçu « best effort » interdit pour l’import comptable automatique.
Blocage éditorial/commercial : la même PR ajoute une section uniquement favorable à Iopole, avec un argumentaire « Intérêt », alors que le compte contributeur est yabs-iopole. Le statut de plateforme agréée et la date sont vérifiables sur la liste officielle DGFiP : https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees. Cela ne valide pas les claims Peppol/API/couverture ni le numéro avancé. La phrase « Peppol obligatoire pour l’intra-UE » est trop générale et doit être retirée.
Merci de scinder la PR :
- parseur CII neutre, strict et testé ;
- éventuellement mise à jour neutre du registre des plateformes, fondée uniquement sur la source DGFiP.
La section promotionnelle Iopole doit être supprimée ou accompagnée d’une affiliation explicite et replacée dans un comparatif neutre aux critères identiques pour tous les fournisseurs.
Cette PR ne doit porter que le parseur CII. Le registre des plateformes agreees revient a l'etat de master.
Le parseur acceptait tout document contenant CrossIndustryInvoice et comblait les champs manquants ou illisibles par null ou 0 : une facture invalide pouvait produire une ecriture plausible mais fausse. Desormais toute anomalie est une erreur bloquante (sortie en code 1, aucune donnee emise) : - profil : BT-24 doit porter urn:cen.eu:en16931:2017, ce qui refuse les profils Factur-X MINIMUM et BASIC WL, depourvus de lignes de facture ; - champs obligatoires : BT-1, BT-2, BT-3, BT-5, BT-24, BT-27, BT-44, identite du vendeur, au moins une ligne et une ventilation TVA, et par ligne BT-129, BT-146, BT-131, BT-153 ; - types : dates au format 102 et existantes au calendrier, montants au format decimal EN 16931 (12abc, 1,5 ou 1e5 sont refuses) ; - rapprochement, tolerance 1 centime : BR-CO-10, BR-CO-13, BR-CO-14, BR-CO-15, BR-CO-16, montant de TVA par categorie (BR-S-09 pour S, TVA nulle imposee par BR-E-09, BR-Z-09, BR-AE-09, BR-IC-09, BR-G-09 et BR-O-09 pour les autres) et couverture de la base HT totale par les bases declarees ; - BT-3 restreint aux types classables (380, 381, 384, 386, 389) : un code inconnu est refuse au lieu d'etre range en facture ordinaire, et le code brut est expose dans la sortie ; - identifiants legaux (schemeID 0002) valides sur 9 ou 14 chiffres : un SIREN n'est plus restitue dans le champ siret. Corrections de lecture au passage : les entites XML etaient decodees deux fois (&lt; donnait < au lieu de <), le numero de TVA n'etait cherche que dans le premier bloc SpecifiedTaxRegistration alors qu'un tiers peut en porter plusieurs, et les prefixes de namespace etaient supposes presents alors qu'ils ne sont pas normatifs. Limites assumees et documentees en tete de fichier : pas de validation XSD ni Schematron, sous-lignes du profil EXTENDED non lues, UBL non supporte.
24 tests, sans framework (node:assert + execFileSync) : - les deux round-trips generate-facturx.js existants, enrichis du montant a payer (BT-115) ; - une fixture CII conforme dans l'ordre du schema reel (lignes avant l'accord et le reglement), avec prix brut puis prix net sur la ligne et deux blocs SpecifiedTaxRegistration cote vendeur ; - la meme fixture sans prefixe de namespace ; - un test de refus par controle : profil basicwl, date impossible, date tronquee, decimal malforme, BR-CO-10, BR-CO-15, TVA ne correspondant pas au taux, TVA non nulle sur categorie exoneree, bases ne couvrant pas la base HT totale, type de document inconnu ou herite d'Object, taux absent sur categorie S, identifiant legal malforme, BT-115 absent, nom du vendeur absent. Chaque test de refus asserte le code de sortie 1 et l'identifiant d'erreur precis. Les mutations de la fixture passent par un helper qui verifie que le fragment remplace existait, pour qu'un test ne puisse pas passer sans avoir rien mute.
Merci pour la relecture, les cinq points sont justes. La PR est refaite. Iopole et le registre : supprimés. Je bosse chez Iopole, j'aurais dû le dire dès le départ au lieu de laisser le nom du compte le faire. Pour le parseur, j'ai pris la première option : validation normative et erreurs bloquantes, pas de renommage en best effort. Toute anomalie sort en code 1 sans émettre la moindre donnée.
Ce que ça ne fait toujours pas, écrit en tête de fichier : pas de XSD, pas de Schematron. Les contrôles sont ceux listés ci-dessus, pas toutes les règles EN 16931, donc un document invalide au schéma peut passer. Embarquer les artefacts CEN et un moteur XSLT 2.0 dans un dépôt dont les dépendances sont Vérification. 24 tests, toujours sans framework : les deux round-trips avec Dis-moi si le découpage te va ou si tu veux que je reprenne autrement. |
Ce que fait cette PR
scripts/parse-einvoice.jsComplément de
generate-facturx.js: lit un XML CII (Factur-X inclus) et retourne les données structurées en JSON.Points d'attention à l'implémentation :
tax_breakdown[]) : les vraies factures ont souvent plusieurs taux et exemptions dans le même documentSpecifiedLegalOrganization(ICD 0002), conformément à EN 16931comptable/references/facturation/plateformes-agreees.mdSources : FNFE-MPE · Peppol BIS Billing 3.0 · DGFiP