BT-20Payment termsBT-115Amount due for payment
Texte officiel de la règle
[BR-DE-18] Cash discount (Skonto) lines in … must match this regular expression: … . The information on the granting of a cash discount must be transmitted in the element "Payment terms" (BT-20) as follows: the first segment must state "SKONTO", the second "TAGE=n", the third "PROZENT=n". Percentages must be given without a sign and with two decimal places separated by a point. If the amount to be calculated is not based on BT-115, "Amount due for payment", but only on a part of the amount due of the invoice, the base value for calculating the cash discount must be given as a fourth segment "BASISBETRAG=n" in accordance with the semantic data type Amount. Each entry begins with a #, the segments are separated by a # and a line ends with a #. A complete cash discount statement must be followed by an XML-conformant line break. All information on the granting of a cash discount must be given in upper case. Additional whitespace (spaces, tabs or line breaks) is not permitted. Characters or text other than those specified above are not permitted.
Le texte normatif est en anglais ; il est cité tel quel.
Pourquoi cette erreur apparaît
XRechnung définit un format lisible par machine pour les conditions d'escompte dans le texte des conditions de paiement (BT-20) : chaque escompte occupe une ligne de la forme #SKONTO#TAGE=n#PROZENT=n.nn#, avec un quatrième segment facultatif #BASISBETRAG=n.nn#, terminée par un saut de ligne. La règle découpe cac:PaymentTerms/cbc:Note (UBL) ou ram:SpecifiedTradePaymentTerms/ram:Description (CII) ligne par ligne, contrôle chaque ligne commençant par # au moyen de l'expression régulière officielle et exige un saut de ligne après la dernière entrée Skonto complète. Elle se déclenche en cas de minuscules, de décimales manquantes (PROZENT=2), de virgule décimale, d'espaces autour du signe = ou d'absence de saut de ligne final ; elle provient souvent de conditions saisies à la main ou de modèles qui rédigent l'escompte en texte libre commençant par #.
Comment corriger
Écrivez chaque escompte sur sa propre ligne, exactement sous la forme #SKONTO#TAGE=14#PROZENT=2.00# suivie d'un saut de ligne (CRLF est accepté) ; ajoutez #BASISBETRAG=1000.00# comme quatrième segment uniquement si l'escompte ne porte que sur une partie du montant à payer. Utilisez des majuscules, un point avec exactement deux décimales pour le pourcentage, aucun espace ni tabulation, et rien d'autre sur ces lignes. Des conditions en texte libre sont autorisées dans la même note sur des lignes ne commençant pas par #. Veillez à ce que la note se termine par un saut de ligne après la dernière ligne Skonto, et non directement par la balise fermante.
Exemple (valide)
<cac:PaymentTerms>
<cbc:Note>Zahlbar innerhalb von 30 Tagen.
#SKONTO#TAGE=14#PROZENT=2.00#
#SKONTO#TAGE=7#PROZENT=3.00#
</cbc:Note>
</cac:PaymentTerms>
Ce que le validateur vérifie
Élément vérifié (contexte):
UBL
/ubl:Invoice | /cn:CreditNoteTest (XPath):
every $line in cac:PaymentTerms/cbc:Note[1]/tokenize(. , '(\r?\n)')[starts-with( normalize-space(.) , '#')] satisfies matches ( normalize-space ($line), $XR-SKONTO-REGEX) and matches( cac:PaymentTerms/cbc:Note[1]/tokenize(. , '#.+#')[last()], '^\s*\n' )CII
/rsm:CrossIndustryInvoiceTest (XPath):
every $line in rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description[1]/tokenize(. , '(\r?\n)')[starts-with( normalize-space(.) , '#')] satisfies matches ( normalize-space ($line), $XR-SKONTO-REGEX ) and matches( rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradePaymentTerms/ram:Description[1]/tokenize(. , '#.+#')[last()], '^\s*\n' )
Vérifier votre facture
Déposez votre XML ou PDF dans le validateur : chaque règle en échec renvoie vers sa page ici. Gratuit, sans compte, le fichier n'est pas conservé.
La même vérification par API:
curl -F file=@invoice.xml https://einvoicechecker.com/v1/validateRègles liées
BR-DEX-09Montant à payer = Montant total TTC - Montant payé + Montant d'arrondi…BR-DE-1Les instructions de paiement (BG-16) sont absentesBR-DE-2Le contact du vendeur (BG-6) est absentBR-DE-3La ville du vendeur (BT-37) est absenteBR-DE-4L'élément « Code postal du vendeur » doit être transmisBR-DE-5Le point de contact du vendeur (BT-41) est absentBR-DE-6Le téléphone du contact vendeur (BT-42) est absentBR-DE-7L'adresse e-mail du contact vendeur (BT-43) est absente
Questions fréquentes
Que signifie BR-DE-18 ?
BR-DE-18 est une règle xrechnung : Cash discount (Skonto) lines in … must match this regular expression: … . The information on the granting of a cash discount must be transmitted in the element "Payment terms" (BT-20) as follows: the first segment must state "SKONTO", the second "TAGE=n", the third "PROZENT=n". Percentages must be given without a sign and with two decimal places separated by a point. If the amount to be calculated is not based on BT-115, "Amount due for payment", but only on a part of the amount due of the invoice, the base value for calculating the cash discount must be given as a fourth segment "BASISBETRAG=n" in accordance with the semantic data type Amount. Each entry begins with a #, the segments are separated by a # and a line ends with a #. A complete cash discount statement must be followed by an XML-conformant line break. All information on the granting of a cash discount must be given in upper case. Additional whitespace (spaces, tabs or line breaks) is not permitted. Characters or text other than those specified above are not permitted.
Ma facture sera-t-elle rejetée à cause de BR-DE-18 ?
Oui. BR-DE-18 est classée « bloquante » ; les validateurs (plateformes agréées, points d'accès Peppol, KoSIT, KSeF) rejettent la facture tant qu'elle n'est pas corrigée.
À quels formats s'applique BR-DE-18 ?
XRechnung en syntaxe UBL ou CII, y compris les PDF Factur-X / ZUGFeRD au profil XRECHNUNG. Obligatoire pour facturer les administrations publiques allemandes. Syntaxe : UBL et CII.
Source: XRechnung 3.0.2, schematron 2.6.0 (KoSIT, September 2026). Catalogue généré à partir des jeux de règles officiels le 2026-10-15.