Versions et notes de version
Vous trouverez ici les changements les plus importants des versions actuelles et à venir de FactoorSharp.
Version 20.0.0
ActuelleLa version 20.0 est une version majeure : elle rend les décimales configurables, ajoute des numéros de série et des lots par ligne, restitue les factures en allemand, en anglais et en français et nettoie l’API. Certaines modifications touchent le code existant ; elles sont signalées ci-dessous par « Changement incompatible » et accompagnées chacune d’un exemple de migration.
Les nouveautés en détail :
-
Le taux de TVA par ligne devient facultatif (BT-152) Changement incompatible EssentielLa propriété
TradeLineItem.TaxPercentest désormais de typedecimal?. Si la facture n’indique aucun taux, elle renvoienullau lieu de 0, et l’élément est omis à l’écriture – ce qui est obligatoire pour la catégorie de TVA O (hors champ). À la lecture,?? 0msuffit pour conserver le comportement précédent. DansAddTradeLineItem(),taxPercentvaut désormaisnullpar défaut : les lignes à 0 % de TVA (par exemple les catégories E, AE et Z) doivent indiquer le taux explicitement avec0m.
// Lire le taux de TVA d'une ligne : s'il manque dans la facture, TaxPercent vaut désormais null decimal taxPercent = tradeLineItem.TaxPercent ?? 0m; // Lignes à 0 % de TVA : indiquer le taux explicitement, il n'est plus prérempli à 0 invoice.AddTradeLineItem( name: "Conseil", netUnitPrice: 100m, unitCode: QuantityCodes.C62, billedQuantity: 1m, taxType: TaxTypes.VAT, categoryCode: TaxCategoryCodes.E, taxPercent: 0m); ' Lire le taux de TVA d'une ligne : s'il manque dans la facture, TaxPercent vaut désormais null Dim taxPercent As Decimal = If(tradeLineItem.TaxPercent, 0D) ' Lignes à 0 % de TVA : indiquer le taux explicitement, il n'est plus prérempli à 0 invoice.AddTradeLineItem( name:="Conseil", netUnitPrice:=100D, unitCode:=QuantityCodes.C62, billedQuantity:=1D, taxType:=TaxTypes.VAT, categoryCode:=TaxCategoryCodes.E, taxPercent:=0D) -
L’enregistrement en PDF renvoie un résultat et produit du PDF/A-3B Changement incompatible PDF
SaveToPdf()etSaveToPdfAsync()renvoient désormais unPdfSaveResultqui énumère ce qui a été réparé dans le PDF source ou est resté en suspens. Le PDF généré se déclare en PDF/A-3B au lieu de PDF/A-3A. Le code source se compile sans modification ; les applications déjà compilées doivent toutefois être recompilées, car la signature a changé. Toutes les surcharges acceptent en outre un paramètre facultatifInvoiceFormatOptions, qui s’applique aussi au XML intégré. Pour plus de détails, consultez la documentation « Travailler avec des fichiers PDF ».
// SaveToPdfAsync() renvoie désormais un PdfSaveResult PdfSaveResult result = await FacturXInvoicePdfProcessor.SaveToPdfAsync( "rechnung-zugferd.pdf", ZUGFeRDVersion.Version25, Profile.Comfort, ZUGFeRDFormats.CII, "rechnung.pdf", invoice); // Ce qui a été réparé dans le PDF source ou est resté en suspens foreach (PdfSourceIssue issue in result.Issues) { Console.WriteLine(issue); } ' SaveToPdfAsync() renvoie désormais un PdfSaveResult Dim result As PdfSaveResult = Await FacturXInvoicePdfProcessor.SaveToPdfAsync( "rechnung-zugferd.pdf", ZUGFeRDVersion.Version25, Profile.Comfort, ZUGFeRDFormats.CII, "rechnung.pdf", invoice) ' Ce qui a été réparé dans le PDF source ou est resté en suspens For Each issue As PdfSourceIssue In result.Issues Console.WriteLine(issue) Next -
Fonctions obsolètes supprimées Changement incompatible EssentielLes fonctions précédemment marquées
[Obsolete]ont été supprimées. L’exemple montre chaque fois le remplacement ; la migration est un simple renommage, sans changement de résultat. Les classesInvoiceValidatoretValidationResultdu paquet principal sont également supprimées – la validation est disponible dans le paquetFactoorSharp.FacturX.Validator.
// AddTradeeCharge() (avec la faute de frappe) -> AddTradeCharge() invoice.AddTradeCharge(null, CurrencyCodes.EUR, 25m, null, "Verpackung", TaxTypes.VAT, TaxCategoryCodes.S, 19m); // SetTaxTotalInAccountingCurrency() -> SetTaxCurrencyExchange() invoice.SetTaxCurrencyExchange(175.08m, CurrencyCodes.EUR, 0.9215m, new DateTime(2026, 9, 1)); // SellerElectronicAddress / BuyerElectronicAddress -> Seller.ElectronicAddress / Buyer.ElectronicAddress invoice.Seller.ElectronicAddress = new ElectronicAddress { Address = "rechnung@verkaeufer.de", ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp }; // TradeLineItem.SetOrderReferencedDocument() -> SetBuyerOrderReferencedDocument() lineItem.SetBuyerOrderReferencedDocument("PO-2026-00417", new DateTime(2026, 2, 1), "10"); // InvoiceVisualizer.Render() / RenderToBytes() -> RenderPdf() byte[] pdf = InvoiceVisualizer.RenderPdf(invoice); // InvoiceValidator / FactoorSharp.FacturX.ValidationResult -> package FactoorSharp.FacturX.Validator ValidationResult result = FacturXValidator.Validate("invoice.pdf", extendedValidation: false); ' AddTradeeCharge() (avec la faute de frappe) -> AddTradeCharge() invoice.AddTradeCharge(Nothing, CurrencyCodes.EUR, 25D, Nothing, "Verpackung", TaxTypes.VAT, TaxCategoryCodes.S, 19D) ' SetTaxTotalInAccountingCurrency() -> SetTaxCurrencyExchange() invoice.SetTaxCurrencyExchange(175.08D, CurrencyCodes.EUR, 0.9215D, New DateTime(2026, 9, 1)) ' SellerElectronicAddress / BuyerElectronicAddress -> Seller.ElectronicAddress / Buyer.ElectronicAddress invoice.Seller.ElectronicAddress = New ElectronicAddress With { .Address = "rechnung@verkaeufer.de", .ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp } ' TradeLineItem.SetOrderReferencedDocument() -> SetBuyerOrderReferencedDocument() lineItem.SetBuyerOrderReferencedDocument("PO-2026-00417", New DateTime(2026, 2, 1), "10") ' InvoiceVisualizer.Render() / RenderToBytes() -> RenderPdf() Dim pdf As Byte() = InvoiceVisualizer.RenderPdf(invoice) ' InvoiceValidator / FactoorSharp.FacturX.ValidationResult -> package FactoorSharp.FacturX.Validator Dim result As ValidationResult = FacturXValidator.Validate("invoice.pdf", extendedValidation:=False) -
Décimales configurables EssentielLes prix, quantités, pourcentages et taux de change peuvent désormais être écrits avec davantage de décimales – séparément pour chaque type de données. Les montants restent à deux décimales ; seuls les montants de ligne disposent d’une option explicite, non conforme à la norme EN 16931. Sans options, la sortie ne change pas. Tous les détails dans la documentation « Configuration ».
InvoiceFormatOptions options = InvoiceOptionsBuilder .Create() .SetUnitPricePrecision(6) // Prix : 1.1234567 -> 1.123457, 20 -> 20.00 .SetQuantityPrecision(6) // Quantités : 3.5 -> 3.5, 3 -> 3 .SetPercentPrecision(4) // Taux de TVA, pourcentages de remises/majorations et d'escompte .SetExchangeRatePrecision(6) // Taux de change de la devise fiscale .Build(); invoice.Save("factur-x.xml", ZUGFeRDVersion.Version25, Profile.Comfort, ZUGFeRDFormats.CII, options); Dim options As InvoiceFormatOptions = InvoiceOptionsBuilder _ .Create() _ .SetUnitPricePrecision(6) _ .SetQuantityPrecision(6) _ .SetPercentPrecision(4) _ .SetExchangeRatePrecision(6) _ .Build() invoice.Save("factur-x.xml", ZUGFeRDVersion.Version25, Profile.Comfort, ZUGFeRDFormats.CII, options) -
Numéros de série et lots par ligne (BG-X-84) EssentielLes appareils livrés individuellement peuvent être indiqués sur la ligne de facture avec leur numéro de série (BT-X-307) et leur numéro de lot (BT-X-306), par exemple une entrée par machine. Les données sont conservées à la lecture (profil EXTENDED, ZUGFeRD 2.4 et 2.5). Voir « Numéros de série et lots ».
// Appareils livrés individuellement avec numéro de série (BT-X-307) et lot (BT-X-306), profil EXTENDED uniquement item.AddIndividualTradeProductInstance(supplierAssignedSerialId: "KS40-2026-000117", batchId: "L2607-A"); item.AddIndividualTradeProductInstance(supplierAssignedSerialId: "KS40-2026-000118", batchId: "L2607-A"); ' Appareils livrés individuellement avec numéro de série (BT-X-307) et lot (BT-X-306), profil EXTENDED uniquement item.AddIndividualTradeProductInstance(supplierAssignedSerialId:="KS40-2026-000117", batchId:="L2607-A") item.AddIndividualTradeProductInstance(supplierAssignedSerialId:="KS40-2026-000118", batchId:="L2607-A") -
Les PDF sources sont nettoyés pour PDF/A PDFLes PDF sources issus de générateurs de rapports contiennent souvent des violations PDF/A qui étaient auparavant reprises telles quelles. FactoorSharp définit désormais les indicateurs d’annotation manquants (règle 6.3.2), intègre les polices manquantes et répare l’encodage des polices TrueType symboliques, comme en produisent les générateurs de codes-barres (règle 6.2.11.6). Chaque réparation apparaît dans le
PdfSaveResult. -
Rendu des factures en allemand, en anglais et en français VisualisationLa sortie PDF et HTML peut être produite en allemand, en anglais ou en français via la
Culturedes options de rendu. Les libellés, les titres de document, les unités ainsi que les formats des nombres et des dates suivent la langue choisie. Sans indication, la sortie reste en allemand. Voir « Représentation visuelle des factures ».
// Restituer la facture en anglais ou en français – langue, formats des nombres et des dates suivent la culture InvoiceVisualizer.RenderPdf(invoice, "invoice-en.pdf", options: new PdfRenderOptions { Culture = CultureInfo.GetCultureInfo("en-GB") }); string html = InvoiceVisualizer.RenderHtml(invoice, options: new HtmlRenderOptions { Culture = CultureInfo.GetCultureInfo("fr-FR") }); ' Restituer la facture en anglais ou en français – langue, formats des nombres et des dates suivent la culture InvoiceVisualizer.RenderPdf(invoice, "invoice-en.pdf", options:=New PdfRenderOptions With {.Culture = CultureInfo.GetCultureInfo("en-GB")}) Dim html As String = InvoiceVisualizer.RenderHtml(invoice, options:=New HtmlRenderOptions With {.Culture = CultureInfo.GetCultureInfo("fr-FR")}) -
Davantage d’informations dans le rendu de la facture VisualisationLe rendu affiche désormais l’avis d’expédition (BT-16), la référence de l’acheteur et les textes libres de la ligne, présente les références de documents (BT-17, BT-18, BT-122, BT-128) sous une forme lisible et choisit un titre de document adapté à chaque type de facture. Les prix, quantités et pourcentages s’affichent avec toutes leurs décimales significatives, afin que le rendu ne diffère pas du XML intégré.
-
Rapport de validation dans votre langue ValidationPour la validation étendue via le service en ligne, vous pouvez définir la langue du rapport de validation : allemand, anglais ou français. Sans indication, il reste en allemand ; pour la validation purement locale, ce paramètre est sans effet. Les réponses d’erreur du service sont en outre traduites de manière plus fiable en exceptions compréhensibles.
// Définir la langue du rapport de validation : "de", "en" ou "fr" ValidationResult result = await FacturXValidator.ValidateAsync("invoice.pdf", language: "en"); ' Définir la langue du rapport de validation : "de", "en" ou "fr" Dim result As ValidationResult = Await FacturXValidator.ValidateAsync("invoice.pdf", language:="en") -
Les données facultatives manquantes restent vides EssentielLes codes facultatifs absents d’une facture étaient auparavant remplacés par une valeur par défaut à la lecture, puis réécrits lors d’un nouvel enregistrement – par exemple le type de compte (BT-X-290), la devise fiscale (BT-6) ou les motifs de remises et de majorations. Ils restent désormais vides (
null). Veuillez noter : le code qui s’appuyait sur les anciennes valeurs par défaut doit testernull. -
Autres corrections EssentielLe format 616 (semaine civile, CCYYWW) rejette les semaines que l’année ne contient pas. Le code de sujet AAG pour les instructions de la partie a également été ajouté.
Version 19.1.1
La version 19.1.1 corrige plusieurs erreurs dans l'écriture des factures ZUGFeRD 2.0/2.5 et UBL et étend la validation des factures espagnoles et italiennes.
Les nouveautés en détail :
-
Montant total de ligne correctement calculé pour ZUGFeRD 2.5 (BT-131) EssentielLorsque le montant total de ligne n'était pas défini explicitement, ZUGFeRD 2.5 écrivait 0 au lieu de le calculer à partir du prix unitaire et de la quantité, contrairement à 2.0, 2.4 et UBL. Les factures avec un montant défini explicitement ont toujours été correctes.
-
TVA en devise de comptabilisation désormais correcte aussi en UBL (BT-111, BT-6) EssentielLe montant de TVA en devise de comptabilisation n'était jamais écrit en UBL et n'était pas reconnu de manière fiable à la lecture. Les deux fonctionnent désormais correctement, y compris pour XRechnung au format UBL.
-
Plus de motifs d'exonération non autorisés dans la ventilation de TVA (BT-120, BT-121) EssentielLa norme EN 16931 interdit un motif d'exonération dans la ventilation de TVA pour les catégories taux normal, taux zéro, IGIC et IPSI. Jusqu'à présent, seule la catégorie taux zéro était respectée, et pas du tout en UBL.
-
ZUGFeRD 2.0 rattrapé sur l'adresse électronique et l'exonération de ligne (BT-34, BT-49, BT-X-96, BT-X-97) EssentielL'adresse électronique n'était écrite pour aucune partie en ZUGFeRD 2.0, et le motif d'exonération au niveau de la ligne manquait également. Les deux sont désormais écrits et lus, comme en 2.4 et 2.5.
-
Espagne : contrôle des calculs et mode FACe pour Facturae ValidationLa validation locale contrôle désormais les factures Facturae quant à l'exactitude des totaux de ligne, de lot et de facture, à la clé de contrôle du NIF et à la politique de signature. La nouvelle option
CheckFACeRequirementspermet en plus de contrôler les exigences de réception plus strictes du point d'entrée FACe de l'administration espagnole.
// Contrôler en plus une facture Facturae selon les exigences de réception de FACe // (le point d'entrée des factures destinées aux administrations publiques espagnoles) ValidationResult result = await Validator.ValidateAsync("facture.xsig", new ValidationOptions { CheckFACeRequirements = true }); ' Contrôler en plus une facture Facturae selon les exigences de réception de FACe ' (le point d'entrée des factures destinées aux administrations publiques espagnoles) Dim result As ValidationResult = Await Validator.ValidateAsync("facture.xsig", New ValidationOptions With { .CheckFACeRequirements = True }) -
Italie : schéma FatturaPA mis à jour ValidationLe schéma de la « fattura ordinaria » a été mis à jour vers la version 1.2.3 ; la facture simplifiée « fattura semplificata » est désormais également validée.
-
Plantage après une mise à jour de QuestPDF corrigé VisualisationAprès une mise à jour de QuestPDF, d'anciennes bibliothèques natives restées dans le répertoire de build pouvaient provoquer un plantage lors du rendu. Elles sont désormais supprimées automatiquement.
Version 19.1.0
La version 19.1.0 affiche les factures au format HTML, prend en charge les acomptes et la TVA en devise étrangère, extrait le texte des PDF avec sa position et détecte le format de facture de manière encore plus fiable.
Les nouveautés en détail :
-
Afficher les factures en HTML VisualisationLes factures peuvent désormais être affichées en HTML en plus du PDF – sous forme de page autonome ou de module à intégrer directement dans votre application web ou de bureau. Le bon de livraison, la référence de commande et les caractéristiques des produits apparaissent également.
// Facture sous forme de page HTML autonome string html = InvoiceVisualizer.RenderHtml(invoice); // Ou sous forme de fragment à intégrer dans une page existante string fragment = InvoiceVisualizer.RenderHtml(invoice, options: new HtmlRenderOptions { Standalone = false }); // La sortie PDF s'appelle désormais RenderPdf() InvoiceVisualizer.RenderPdf(invoice, "invoice.pdf"); ' Facture sous forme de page HTML autonome Dim html As String = InvoiceVisualizer.RenderHtml(invoice) ' Ou sous forme de fragment à intégrer dans une page existante Dim fragment As String = InvoiceVisualizer.RenderHtml(invoice, options:=New HtmlRenderOptions With {.Standalone = False}) ' La sortie PDF s'appelle désormais RenderPdf() InvoiceVisualizer.RenderPdf(invoice, "invoice.pdf") -
Détailler les acomptes (BG-X-45) EssentielLes acomptes déjà reçus peuvent être listés individuellement dans le profil EXTENDED – avec montant, date de paiement, TVA incluse et référence à la facture d'acompte correspondante.
// Acompte avec TVA incluse et référence à la facture d'acompte invoice.AddAdvancePayment(2975m, new DateTime(2026, 6, 7)) .SetInvoiceReferencedDocument("FA-2026-0601", new DateTime(2026, 6, 1), InvoiceType.PartialInvoice) .AddIncludedTradeTax(475m, 19m, TaxTypes.VAT, TaxCategoryCodes.S); ' Acompte avec TVA incluse et référence à la facture d'acompte invoice.AddAdvancePayment(2975D, New DateTime(2026, 6, 7)) _ .SetInvoiceReferencedDocument("FA-2026-0601", New DateTime(2026, 6, 1), InvoiceType.PartialInvoice) _ .AddIncludedTradeTax(475D, 19D, TaxTypes.VAT, TaxCategoryCodes.S) -
TVA en devise étrangère avec taux de change (BG-X-41) EssentielPour les factures en devise étrangère, vous indiquez désormais en une seule étape la devise de comptabilisation de la TVA (BT-6), le montant de TVA dans cette devise (BT-111) et le taux de change – comme l'exige la norme EN 16931.
// Facture en USD, TVA indiquée en plus en euros invoice.SetTaxCurrencyExchange(taxTotalInAccountingCurrency: 175.08m, accountingCurrency: CurrencyCodes.EUR, conversionRate: 0.9215m, conversionRateTimestamp: new DateTime(2026, 9, 1)); ' Facture en USD, TVA indiquée en plus en euros invoice.SetTaxCurrencyExchange(taxTotalInAccountingCurrency:=175.08D, accountingCurrency:=CurrencyCodes.EUR, conversionRate:=0.9215D, conversionRateTimestamp:=New DateTime(2026, 9, 1)) -
Adresse électronique pour toutes les parties (BT-34, BT-49, BT-X-160) EssentielOutre le vendeur et l'acheteur, le destinataire de la livraison et les autres parties peuvent désormais recevoir une adresse électronique, par exemple une adresse e-mail. Ces informations sont intégralement conservées lors de la lecture.
// Adresse électronique du destinataire de la livraison invoice.ShipTo.ElectronicAddress = new ElectronicAddress { Address = "reception@client.fr", ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp }; ' Adresse électronique du destinataire de la livraison invoice.ShipTo.ElectronicAddress = New ElectronicAddress With { .Address = "reception@client.fr", .ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.ElectronicMailSmtp } -
Extraire le texte des PDF avec sa position PDFVous pouvez désormais extraire du contenu visible d'un PDF des fragments de texte avec leur page, leur position et leur taille de police, par exemple pour reprendre une valeur d'une colonne précise d'un tableau. L'extraction de texte classique restitue en outre bien plus fidèlement la mise en page.
foreach (PdfTextFragment fragment in PdfUtils.ExtractTextFragments("invoice.pdf")) { // Page, position en points et texte Console.WriteLine($"Page {fragment.PageNumber}, x={fragment.X:0}, y={fragment.Y:0}: {fragment.Text}"); } For Each fragment As PdfTextFragment In PdfUtils.ExtractTextFragments("invoice.pdf") ' Page, position en points et texte Console.WriteLine($"Page {fragment.PageNumber}, x={fragment.X:0}, y={fragment.Y:0}: {fragment.Text}") Next -
Plus d'informations sur les lignes de facture (BT-158-1, BT-X-98) EssentielLes articles peuvent désormais être classés selon tous les systèmes de classification de la norme EN 16931, par exemple UNSPSC ou eCl@ss. Dans le profil EXTENDED, vous pouvez également indiquer le total des remises et charges par ligne.
// Classer l'article selon UNSPSC item.AddDesignatedProductClassification(DesignatedProductClassificationClassCodes.TST, classCode: "43211503"); // Total des remises et charges de cette ligne (EXTENDED uniquement) item.TotalAllowanceChargeAmount = 12.50m; ' Classer l'article selon UNSPSC item.AddDesignatedProductClassification(DesignatedProductClassificationClassCodes.TST, classCode:="43211503") ' Total des remises et charges de cette ligne (EXTENDED uniquement) item.TotalAllowanceChargeAmount = 12.5D -
Détection plus fiable du format de facture EssentielLe type de fichier – facture ZUGFeRD/Factur-X ou UBL – est désormais identifié sans ambiguïté à partir de la structure du document. Les factures d'expéditeurs qui n'indiquent aucun identifiant de spécification (BT-24) ou un identifiant encore inconnu peuvent ainsi être lues également.
-
Règles de validation XRechnung 2.6.0 à jour ValidationLa validation locale utilise désormais les règles KoSIT 2.6.0 actuelles pour XRechnung 3.0.2. Attention : une violation de la règle BR-TMP-2 est désormais signalée comme une erreur et non plus comme un avertissement. Par ailleurs, les factures dont le XML est intégré au PDF sans compression sont validées, et les pièces jointes illisibles apparaissent sous forme de constat de validation explicite.
-
Contrôle plus approfondi des montants et totaux ValidationLe contrôle de facture intégré vérifie désormais bien plus précisément les montants de ligne, les remises et charges, les montants de TVA et le montant à payer selon les règles de la norme EN 16931 – y compris les acomptes, les arrondis et les quantités de base du prix (BT-149).
-
Corrections pour des factures valides EssentielPlusieurs erreurs pouvant conduire à des factures invalides ou incomplètes ont été corrigées : aucun motif d'exonération n'est plus écrit pour les opérations à taux zéro (catégorie Z) (BR-Z-10), les factures MINIMUM ne contiennent plus d'adresse électronique non autorisée, les IBAN vides sont omis, les prix UBL conservent toutes leurs décimales et la référence à l'avis de réception (BT-15) est correctement lue et écrite en UBL.
Version 19.0
La version 19.0 introduit une validation de factures locale et gratuite, améliore le traitement des informations de prix XRechnung et des pièces jointes PDF, et renforce FactoorSharp contre les documents malveillants.
Points forts
Version 18.5
La version 18.5 introduit la prise en charge des périodes de facturation, améliore le traitement des conditions de paiement et corrige plusieurs bugs liés à ZUGFeRD 2.0 et 2.5.
Points forts
Version 18.4
La version 18.4 introduit un nouveau composant de visualisation et corrige plusieurs bugs liés à ZUGFeRD 2.5.
Points forts
Version 18.3
La version 18.3 prend en charge ZUGFeRD 2.5 et étend la validation aux factures italiennes et espagnoles.
Points forts
Version 18.2
La version 18.2 développe encore le traitement des PDF et améliore la gestion des quotas de validation.
Points forts
Version 18.1
La version 18.1 développe encore le traitement des PDF dans FactoorSharp et étend la prise en charge de la signature à toutes les plateformes cibles .NET.
Points forts
Version 18.0
La version 18.0 est la première version publiée de FactoorSharp. Elle constitue la base stable pour travailler avec ZUGFeRD, Factur‑X et XRechnung dans des applications .NET modernes.