AttestwireRule referencePEPPOL-EN16931-R002

PEPPOL-EN16931-R002 Peppol's CII binding allows no subject code on the document note

noun · Peppol BIS · warning · BT-21

For a sample invoice, the library reports: The document note subject code (BT-21) is "AAI", and Peppol's CII binding forbids it.

Business term
BT-21
Severity
warning

The fix

Remove noteSubjectCode if you intend to send CII over Peppol, and fold whatever it qualified into the note text itself — the code is a UNTDID 4451 subject qualifier, and Peppol takes the view that a free-text note on a Peppol invoice needs no machine-readable subject. Keep it if you are generating UBL, which is Peppol's mandatory syntax and where the code is carried losslessly.

A passing value

the shape this field expects
"note": "Delivery in two parts, the second on 2026-09-01."

What the library returns

The full error returned by @attestwire/en16931. It includes the rule ID, affected field and suggested correction. Developers can use this object in their application:

TeachingError
{
  "rule": "PEPPOL-EN16931-R002",
  "field": "BT-21",
  "severity": "warning",
  "message": "The document note subject code (BT-21) is \"AAI\", and Peppol's CII binding forbids it. The rule is titled \"No more than one note is allowed on document level\", which is not what its second half does: the test is count(ram:IncludedNote) <= 1 and not(ram:IncludedNote/ram:SubjectCode), so a document carrying exactly one note still fails if that note has a subject code. This is a warning rather than an error because it depends on the syntax you emit, which \"peppol-bis-3\" does not state. generateXRechnungUBL is unaffected — UBL has no element for BT-21, so its binding folds the code into the note text as \"#AAI#…\" and Peppol's UBL R002 tests only the note count. generateCii omits the element under this profile, so BT-21 will be absent from the CII document you get back. This is a Peppol BIS Billing 3.0 profile rule: it applies because profile is \"peppol-bis-3\". It does not apply to the en16931, xrechnung-ubl or xrechnung-cii profiles, whose validators will accept the same document.",
  "fix": "Remove noteSubjectCode if you intend to send CII over Peppol, and fold whatever it qualified into the note text itself — the code is a UNTDID 4451 subject qualifier, and Peppol takes the view that a free-text note on a Peppol invoice needs no machine-readable subject. Keep it if you are generating UBL, which is Peppol's mandatory syntax and where the code is carried losslessly.",
  "example": "\"note\": \"Delivery in two parts, the second on 2026-09-01.\"",
  "xpath": "/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote/ram:SubjectCode",
  "docsUrl": "https://attestwire.com/rules/PEPPOL-EN16931-R002"
}

xpath is always a UBL path. On a CII invoice, look for the matching CII field instead.