Version 1.1.4

Maintained by PoAC

Release Date

2026-Q4

Status

Review

What’s new in this release?

The changes of this release are numbered Change 1 to Change 20. Each number links to the detailed description of the change; the change tables and the action items for implementers carry the same numbers, so that every change can be followed from this summary to its full explanation and back.

  • Change 1 – Decimal places in invoice amounts now follow the official ISO 4217 precision of the invoice currency, which fulfils the request for 3 decimal support in OMR and covers the 3 and 4 decimal currencies generally. Validation is unchanged for every 2 decimal currency.

  • Change 2IBR-079, the rule stating that a document must not contain empty elements, is now linked to every business group that carries child entries, so that it is visible under the Rules tab. Individual business terms are not linked.

  • Change 3 – Correction to IBR-044, the reason requirement for Invoice line charges, so that it is evaluated at Invoice line level only, removing the overlap with IBR-038, which covers document level charges.

  • Change 4 – Removal of IBR-056 and restriction of IBR-SR-57 to align the Seller tax representative tax identifier (ibt-063) with the Syntax Binding, which makes that identifier optional.

  • Change 5 – Correction to the position of IBR-079, the empty element check, in the UBL-model pattern so that empty elements are always reported, including elements that are also checked by another rule.

  • Change 6 – Extension of IBR-073, the date format rule, to cover cbc:ReceivedDate (ibt-181) and cbc:InstallmentDueDate (ibt-177).

  • Change 7 – Extension of IBR-126 and IBR-CL-03, the document currency checks, to cover cbc:PaidAmount (ibt-180) and cbc:PerUnitAmount (ibt-166).

  • Change 8 – Decimal counting now follows XML Schema Part 2, 3.2.3: insignificant trailing zeros and surrounding whitespace no longer cause a false rejection of an amount.

  • Change 9 – Rework of IBR-017, which requires the Payee to be different from the Seller, to compare the Payee (ibg-10) and the Seller (ibg-04) on identifiers before falling back to their names.

  • Change 10 – Seven new IBR-SR rules, IBR-SR-64 to IBR-SR-70, enforcing Syntax Binding cardinalities that the UBL 2.1 schema leaves unbounded, each linked to the business term it constrains so that it appears on the Rules page.

  • Corrected business term reference in the message of IBR-081 (Change 11) and corrected XPath in IBR-SR-23, which could never fail before (Change 12).

  • Change 13 – Syntax Binding corrections to the Credit Note namespace, to several element selectors, and to the Seller tax representative name cardinality.

  • Regeneration of the Schematron XSLT validation artefact, which was missing nine rules entirely (Change 14), and removal of the Saxon warnings raised by the helper functions (Change 15).

  • Change 16 – Correction to IBR-087, the Base quantity check, which was declared at document level where it could never fire.

  • Change 17 – Alignment of IBR-CO-15, the totals calculation check, with PINT General.

  • Change 18 – Five corrections to the BIS documentation.

  • Change 19 – Correction to the rule context of IBR-124 and IBR-CO-14 so that both rules are evaluated for Credit Notes, as intended for Shared rules.

  • Two references to undefined business terms in the semantic models have been corrected (Change 20).

Overview

This release introduces corrections to the PINT Self-Billing Specification, covering the Data Model, Syntax Binding, BIS documentation, Code Lists, Schematron rules and validation artefacts. It applies the same corrections as PINT General v1.1.4. The objective is to align the Schematron rules with the Syntax Binding, to close cardinality gaps left open by the UBL 2.1 schema, and to improve validation accuracy.

Every change of this release carries a number, Change 1 to Change 20. The numbers connect the summary above, the change tables below, the detailed descriptions at the end of the Changes section and the Action Items for Implementers, and each rule and business term is linked to its page in the PINT Self-Billing documentation, so that every change can be read in context.

Version Information

Version 1.1.4

Applies to

PINT Self-Billing (Self-billed Invoice and Self-billed Credit Note)

Reviewed

-

Changes

Data Model

  • (Change 10) The seven rules added by this release have been linked to their business terms, so that each appears under the Rules page and on the page of the term it constrains: IBR-SR-64 under ibt-063, IBR-SR-65 under ibt-110, IBR-SR-66 under ibt-111, IBR-SR-67 under ibt-184, IBR-SR-68 under ibg-36, IBR-SR-69 under ibt-090, and IBR-SR-70 under ibt-031 and ibt-032.

  • (Change 10) IBR-SR-42 has been linked to ibt-031 and ibt-032 as well. The rule already existed in the Schematron but was never referenced from the semantic model, so it did not appear on the Rules page. It constrains the same element as IBR-SR-70.

  • Every assertion in the Schematron is now referenced from the semantic model of both the Invoice and the Credit Note.

  • (Change 2) IBR-079 has been linked to every business group of the Invoice and Credit Note semantic models that carries child entries: 37 groups in the Invoice and 36 in the Credit Note. The rule applies to every element of the document but was not attached to any business group, so it did not appear under the Rules tab. Individual business terms are not linked.

  • (Change 4) The reference to the removed rule IBR-056 has been deleted from the Invoice and Credit Note semantic models.

  • (Change 20) Two references to business terms that are not defined have been corrected. Under ibt-115, IBR-CO-16 related to iibt-112; corrected to ibt-112. Under ibt-113 in the Credit Note semantic model, IBR-093 related to ibt-180, which is not defined for Credit Notes and has no cac:PrepaidPayment in the Credit Note Syntax Binding; the reference has been removed.

Syntax Binding

The corrections of this section together form Change 13.

  • In the Credit Note Syntax Binding, the ubl namespace in the metadata block was declared as urn:oasis:names:specification:ubl:schema:xsd:Invoice-2. This has been corrected to urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2.

  • In the Invoice Syntax Binding, the cardinality of cac:TaxRepresentativeParty/cac:PartyName has been changed from 0..1 to 1..1, aligning it with IBR-018 and with the Credit Note Syntax Binding, which already stated 1..1.

  • Several element selectors were incorrect and have been corrected in the Invoice, Credit Note and Billing transaction pages.

Selector Corrections
Previous selector Corrected selector Element

cac:ID/@schemeID = "SEPA"

cbc:ID/@schemeID = "SEPA"

cac:PartyIdentification (ibt-090)

cac:TaxScheme = "VAT"

cac:TaxScheme/cbc:ID = "VAT"

cac:PartyTaxScheme (ibt-031)

cac:TaxScheme != "VAT"

cac:TaxScheme/cbc:ID != "VAT"

cac:PartyTaxScheme (ibt-032)

cac:TaxTotal/TaxAmount/@currency = cbc:DocumentCurrencyCode

cac:TaxTotal/cbc:TaxAmount/@currencyID = cbc:DocumentCurrencyCode

cac:TaxTotal (ibt-110)

cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode

cac:TaxTotal/cbc:TaxAmount/@currencyID = cbc:TaxCurrencyCode

cac:TaxTotal (ibt-111)

Code Lists

No Change.

Documentation

The five corrections of this section together form Change 18. They align the BIS documentation with PINT General.

  • Despatch and receipt advice references — the Line Level subsection has been removed from the BIS. Line level despatch advice is aligned content and is not supported by every specialisation, so it belongs with the specialisations that support it. The alignment point aligned-dispatchref.adoc remains, and PINT General already has this shape.

  • Tax information — the introductory sentence has been removed. The whole section is aligned content, so the introduction belongs to the specialisations. It has already been removed in PINT General.

  • Calculation of totals, Invoice line net amount and Shared rounding rules — references to semantic terms no longer carry the word self-billed, so that the formulas and lists name the business terms exactly as the semantic model does: ibt-106, ibt-109, ibt-110, ibt-112, ibt-131, ibt-136 and ibt-141. Prose describing the self-billed invoice as a document is unchanged.

Schematron Rules

Rule Correction and Documentation Improvements
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-081
(Change 11)

cac:AccountingSupplierParty/cac:Party

Fixed

[ibr-081] – The Seller electronic address (ibt-034) MUST be provided.

The message referenced ibt-049, which is the Buyer electronic address. Corrected to ibt-034. No change to validation logic.

IBR-SR-23
(Change 12)

cac:TaxRepresentativeParty

Fixed

[ibr-sr-23] – Seller tax representative tax identifier (ibt-063) MUST occur maximum once, if the Seller has a tax representative.

The test used cac:Party/cac:PartyTaxScheme/cbc:CompanyID. cac:TaxRepresentativeParty has no cac:Party child element in the UBL 2.1 schema, so the rule could never fail. Corrected to cac:PartyTaxScheme/cbc:CompanyID.

IBR-124, IBR-CO-14
(Change 19)

/ubl:Invoice/cac:TaxTotal, /cn:CreditNote/cac:TaxTotal

Fixed

[ibr-124] – Invoice total TAX amount (ibt-110) MUST have no more than 2 decimals. [ibr-co-14] – Invoice total Tax amount (ibt-110) = Σ Tax category tax amount (ibt-117).

The rule context contained /cn:CreditNote/cac:Taxtotal with a lower-case t. Neither rule was therefore evaluated for Credit Notes. No change to validation logic.

IBR-087
(Change 16)

cac:InvoiceLine, cac:CreditNoteLine

Fixed

[ibr-087] – Base quantity (ibt-149) MUST be a positive number above zero.

The rule was declared in the document level rule, where cac:Price/cbc:BaseQuantity never resolves, so the test was always true and the rule could never fire. Moved to the Invoice line rule, which is where PINT General declares it.

IBR-CO-15
(Change 17)

/ubl:Invoice, /cn:CreditNote

Updated

No change to the business rule text.

The Self-Billing expression guarded against more than one tax total by skipping the check entirely. It now uses the same cac:TaxTotal[1] form as PINT General, and the new IBR-SR-65 reports the multiple tax totals directly instead of the check being silently skipped.

IBR-079
(Change 5)

//[not() and not(normalize-space())]

Moved

[ibr-079] – Document MUST not contain empty elements.

The rule was declared near the end of the UBL-model pattern and was therefore shadowed by earlier rules. It is now the first rule of the pattern.


Business Rule Logic Updates
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-044
(Change 3)

cac:AllowanceCharge[cbc:ChargeIndicator = true()]

Updated

[ibr-044] – Each Invoice line charge (ibg-28) MUST have an Invoice line charge reason (ibt-144) or an invoice line charge reason code (ibt-145).

The rule was evaluated at document level as well as at line level and therefore duplicated IBR-038. A line level condition has been added, aligning the rule with the existing IBR-042 and IBR-043.

IBR-SR-57
(Change 4)

//cac:PartyTaxScheme[not(ancestor::cac:TaxRepresentativeParty)]

Updated

[ibr-sr-57] – Company identifier MUST exist in the party tax scheme class.

The Syntax Binding gives cac:TaxRepresentativeParty/cac:PartyTaxScheme/cbc:CompanyID a cardinality of 0..1, while the rule enforced 1..1. The rule context has been restricted so that the Seller tax representative is excluded.

IBR-073
(Change 6)

cbc:IssueDate, cbc:DueDate, cbc:TaxPointDate, cbc:StartDate, cbc:EndDate, cbc:ActualDeliveryDate, cbc:ReceivedDate, cbc:InstallmentDueDate

Updated

[ibr-073] – A date MUST be formatted YYYY-MM-DD in (ibt-002), (ibt-007), (ibt-009), (ibt-026), (ibt-072), (ibt-073), (ibt-074), (ibt-134), (ibt-135), (ibt-177), (ibt-181).

cac:PrepaidPayment/cbc:ReceivedDate (ibt-181) and cac:PaymentTerms/cbc:InstallmentDueDate (ibt-177) are of datatype Date but were not covered by the format check.

IBR-126
(Change 7)

cbc:Amount, cbc:BaseAmount, cbc:PriceAmount, cbc:PaidAmount, cbc:PerUnitAmount and other amount elements

Updated

[ibr-126] – All currencyID attributes must have the same value as the Invoice currency code (ibt-005), except for amounts expected to be in Tax accounting currency (ibt-006).

cac:PrepaidPayment/cbc:PaidAmount (ibt-180) and cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:PerUnitAmount (ibt-166) are always expressed in the document currency but were not part of the rule context.

IBR-CL-03
(Change 7)

cbc:Amount, cbc:BaseAmount, cbc:PriceAmount, cbc:PaidAmount, cbc:PerUnitAmount and other amount elements

Updated

[ibr-cl-03] – currencyID MUST be coded using ISO code list 4217 alpha-3.

Added for consistency with IBR-126. The currencyID attribute of ibt-180 and ibt-166 was not validated against ISO 4217.

IBR-017
(Change 9)

cac:PayeeParty

Updated

[ibr-017] – If a Payee (ibg-10) is provided in the Invoice, then the Payee name (ibt-059) MUST be provided and the Payee MUST be different from the Seller (ibg-04). The Payee and the Seller are compared, in order of precedence, on their legal registration identifier (ibt-061), their party identifier (ibt-060) and, as a last resort, their name (ibt-059).

The rule compared the Payee name with the Seller trading name (ibt-028) instead of the Seller name (ibt-027), and compared identifiers without their scheme identifier. Names alone are unreliable for comparison because of spelling, case and abbreviation variants.

IBR-105, IBR-106, IBR-SR-19
(Change 9)

cac:PayeeParty

Updated

[ibr-105] – The Payee identifier (ibt-060) MUST occur maximum once in the Invoice. [ibr-106] – The Payee legal identifier (ibt-061) MUST occur maximum once in the Invoice. [ibr-sr-19] – Payee name (ibt-059) MUST occur maximum once in the Invoice.

Each rule contained an alternative condition that disabled the cardinality check whenever the Payee name matched the Seller name. The condition has been removed, as IBR-017 now requires the Payee to be different from the Seller.

IBR-091, IBR-121, IBR-122, IBR-123, IBR-124, IBR-125
(Change 1)

cbc:PayableAmount, cbc:AllowanceTotalAmount, cbc:ChargeTotalAmount, cbc:TaxExclusiveAmount, cbc:TaxInclusiveAmount, cbc:TaxAmount

Updated

[ibr-091], [ibr-121], [ibr-122], [ibr-123], [ibr-124], [ibr-125] – The amount MUST have no more decimals than the official precision of the Self-billed invoice currency (ibt-005).

The fixed limit of 2 decimals prevented amounts that are legally correct in a 3 decimal currency. The limit is now the official ISO 4217 precision of the currency. Unchanged for the 2 decimal currencies.

IBR-091, IBR-121, IBR-122, IBR-123, IBR-124, IBR-125
(Change 8)

cac:LegalMonetaryTotal, cac:TaxTotal

Updated

No change to the business rule text.

The number of decimals was counted from the characters following the decimal point. XML Schema Part 2, 3.2.3 makes trailing zeros insignificant, so 1.00 and 1.000000 are the same value, and the whiteSpace facet of xs:decimal is collapse, so a padded value is legal. Both were rejected. The value is now normalised and insignificant trailing zeros are removed before counting, so the rule tests the precision the amount actually carries. An amount that is genuinely over-precise, such as 10.001 in a 2 decimal currency, still fails.

IBR-CO-10, IBR-CO-11, IBR-CO-12, IBR-CO-13, IBR-CO-14, IBR-CO-15, IBR-CO-16
(Change 1)

cac:LegalMonetaryTotal, cac:TaxTotal, /ubl:Invoice, /cn:CreditNote

Updated

No change to the business rule text.

The totals arithmetic rounded to 2 decimals with a hard coded round(x * 10 * 10) div 100. It now rounds to the precision of the currency. Without this, an amount stated with 3 decimals would pass the decimal rules above and then fail the calculation rules. The result is identical to the previous expression for every 2 decimal currency.


Removed Rules
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-056
(Change 4)

cac:TaxRepresentativeParty

Removed

[ibr-056] – The Seller tax representative party (ibg-11) MUST have a Seller tax representative Tax identifier (ibt-063).

The Syntax Binding gives cac:TaxRepresentativeParty/cac:PartyTaxScheme and its cbc:CompanyID child a cardinality of 0..1. The rule enforced 1..1 and contradicted the specification.


New Rules
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-SR-64
(Change 10)

cac:TaxRepresentativeParty

Added

[ibr-sr-64] – The Seller tax representative party tax scheme (ibt-063) MUST occur maximum once, if the Seller has a tax representative.

cac:TaxRepresentativeParty/cac:PartyTaxScheme is 0..1 in the Syntax Binding and unbounded in the UBL 2.1 schema.

IBR-SR-65
(Change 10)

/ubl:Invoice, /cn:CreditNote

Added

[ibr-sr-65] – Invoice total TAX amount (ibt-110) MUST occur maximum once.

cac:TaxTotal in document currency is 1..1 in the Syntax Binding and unbounded in the UBL 2.1 schema.

IBR-SR-66
(Change 10)

/ubl:Invoice, /cn:CreditNote

Added

[ibr-sr-66] – Invoice total TAX amount in accounting currency (ibt-111) MUST occur maximum once.

cac:TaxTotal in Tax accounting currency is 0..1 in the Syntax Binding and unbounded in the UBL 2.1 schema.

IBR-SR-67
(Change 10)

cac:InvoiceLine, cac:CreditNoteLine

Added

[ibr-sr-67] – Despatch advice reference (ibt-184) MUST occur maximum once per Invoice line.

cac:DespatchLineReference is 0..1 in the Syntax Binding and unbounded in the UBL 2.1 schema. IBR-SR-62 only restricted its cac:DocumentReference child element.

IBR-SR-68
(Change 10)

cac:InvoiceLine, cac:CreditNoteLine

Added

[ibr-sr-68] – Line document reference (ibg-36) MUST occur maximum once per Invoice line.

cac:DocumentReference[cbc:DocumentTypeCode != 130] is 0..1 in the Syntax Binding and unbounded in the UBL 2.1 schema. IBR-089 only covered the invoiced object identifier (ibt-128).

IBR-SR-69
(Change 10)

cac:AccountingSupplierParty/cac:Party

Added

[ibr-sr-69] – Bank assigned creditor identifier (ibt-090) MUST occur maximum once.

cac:PartyIdentification/cbc:ID[@schemeID = 'SEPA'] is 0..1 in the Syntax Binding and unbounded in the UBL 2.1 schema. No Schematron rule covered this business term.

IBR-SR-70
(Change 10)

cac:AccountingSupplierParty/cac:Party

Added

[ibr-sr-70] – Seller Tax identifier (ibt-031) and Seller tax registration identifier (ibt-032) MUST each occur maximum once.

IBR-SR-42 only limits the total number of cac:PartyTaxScheme elements to two, so two VAT schemes and no other scheme passed validation.


Validation Artefact
Artefact Syntax (XML location) Change Description Reason

PINT-UBL-validation-shared.xslt
(Change 14)

Complete artefact

Regenerated

The XSLT validation artefact has been regenerated from PINT-UBL-validation-preprocessed.sch.

The distributed XSLT was generated from an older Schematron and did not contain nine of the rules published in the specification.

PINT-UBL-validation-preprocessed.sch, PINT-UBL-validation-shared.xslt
(Change 15)

u:gln, u:mod11, u:slack, u:mod97-0208, u:abn

Updated

xsl:value-of has been replaced with xsl:sequence in the helper functions.

The helper functions are declared as="xs:boolean". xsl:value-of constructs a text node that is then converted, which Saxon reports as a warning.

PINT-UBL-validation-preprocessed.sch, PINT-UBL-validation-shared.xslt
(Change 1)

u:currencyDecimals, u:currencyScale, u:round

Added

Three helper functions returning the official ISO 4217 precision of a currency, the matching scale factor, and an amount rounded to that precision.

Required by the decimal places change. Keeping the currency precision in one place means a future ISO 4217 change is a single edit rather than an edit to thirteen rules.


Detailed Change Descriptions

Change 3 – IBR-044:

Previous Behavior: The rule was declared in the cac:AllowanceCharge[cbc:ChargeIndicator = true()] rule without a level condition and was therefore evaluated for document level charges as well as for Invoice line charges. A document level charge without a reason triggered both IBR-038 and IBR-044, reporting the same defect twice with different business terms.

New Behavior: The condition or not(exists(ancestor::cac:InvoiceLine|ancestor::cac:CreditNoteLine)) has been added, so that the rule is only evaluated for charges nested in cac:InvoiceLine or cac:CreditNoteLine.

Justification: Document level charges are covered by IBR-038 and line level charges by IBR-044. The corrected rule now uses the same construction as IBR-042 and IBR-043, which restrict the corresponding line level allowance rules in the same way.

Change 4 – IBR-056 and IBR-SR-57:

Previous Behavior: The Syntax Binding gives cac:TaxRepresentativeParty/cac:PartyTaxScheme and its cbc:CompanyID child a cardinality of 0..1, following an approved change that made the Seller tax representative tax identifier (ibt-063) optional. IBR-056 required cac:PartyTaxScheme/cbc:CompanyID to be present, and IBR-SR-57 applied to every cac:PartyTaxScheme in the document, including the one under cac:TaxRepresentativeParty. An instance that specified a cac:TaxRepresentativeParty/cac:PartyTaxScheme without a cbc:CompanyID child therefore triggered two fatal errors, even though the Syntax Binding permitted it.

New Behavior: IBR-056 has been removed. The context of IBR-SR-57 has been changed from //cac:PartyTaxScheme to //cac:PartyTaxScheme[not(ancestor::cac:TaxRepresentativeParty)]. The rule continues to apply unchanged to the Seller, the Buyer and any other party.

Justification: Restricting the rule context is preferred over adding an exception to the test expression, because any assertion added to this rule in a future release is then automatically scoped correctly. The uniqueness of ibt-063 remains enforced by IBR-SR-23, and the number of cac:PartyTaxScheme elements under the tax representative is now enforced by the new IBR-SR-64.

Related action item: IBR-056 has been removed.

Change 5 – IBR-079 evaluated first in the UBL-model pattern:

Previous Behavior: The rule was declared near the end of the UBL-model pattern. In Schematron, only the first rule of a pattern whose context matches an element is evaluated for that element. Any empty element that was already matched by an earlier rule therefore escaped the empty element check. As an example, an Item standard identifier (ibt-157) consisting only of blank spaces passed validation, because cac:InvoiceLine/cac:Item/cac:StandardItemIdentification/cbc:ID is matched by the IBR-064 rule, which is declared earlier in the pattern.

New Behavior: IBR-079 is now the first rule of the UBL-model pattern and is therefore evaluated for every empty element in the document. A comment has been added to the Schematron source recording that the position of this rule is significant and must be preserved.

Justification: This is a rule precedence issue rather than a defect in the rule expression itself, which is unchanged. Placing the rule first also ensures that an empty element is reported once, with the empty element message, rather than with a format or scheme message that is not meaningful for an element that has no value.

This change affects validation behaviour and is independent from Change 2, which makes the same rule visible in the semantic model documentation without touching the Schematron.

Change 6 – IBR-073:

Previous Behavior: The rule validated the YYYY-MM-DD format of cbc:IssueDate, cbc:DueDate, cbc:TaxPointDate, cbc:StartDate, cbc:EndDate and cbc:ActualDeliveryDate. cac:PrepaidPayment/cbc:ReceivedDate (ibt-181) and cac:PaymentTerms/cbc:InstallmentDueDate (ibt-177) were not part of the rule context, so an incorrectly formatted value in either element passed validation.

New Behavior: cbc:ReceivedDate and cbc:InstallmentDueDate have been added to the rule context, and ibt-177 and ibt-181 have been added to the error message.

Justification: Both business terms are of datatype Date and must therefore follow the same format requirement as every other date in the specification.

Related action item: verify the newly validated elements.

Change 7 – IBR-126 and IBR-CL-03:

Previous Behavior: IBR-126 validated that all amount currencyID attributes equal the Invoice currency code (ibt-005). cac:PrepaidPayment/cbc:PaidAmount (ibt-180) and cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:PerUnitAmount (ibt-166) were not part of the rule context, so an amount stated in a currency other than the document currency passed validation. The same two elements were also absent from the context of IBR-CL-03, so their currencyID attribute was not validated against ISO 4217 either.

New Behavior: cbc:PaidAmount and cbc:PerUnitAmount have been added to the context of both rules.

Justification: Both business terms are always expressed in the document currency and must therefore be validated in the same way as every other amount in the specification. The extension of IBR-CL-03 keeps code list validation consistent with IBR-126.

Related action item: verify the newly validated elements.

Change 12 – IBR-SR-23:

Previous Behavior: The rule was declared in the cac:TaxRepresentativeParty rule with the test expression count(cac:Party/cac:PartyTaxScheme/cbc:CompanyID) ⇐ 1. The UBL 2.1 schema defines no cac:Party child element for cac:TaxRepresentativeParty, so the counted node set was always empty and the rule could never fail. An instance specifying more than one Seller tax representative tax identifier (ibt-063) therefore passed validation.

New Behavior: The test expression has been corrected to count(cac:PartyTaxScheme/cbc:CompanyID) ⇐ 1.

Justification: The corrected XPath matches the structure defined in the Syntax Binding, where cac:PartyTaxScheme is a direct child of cac:TaxRepresentativeParty.

Change 9 – IBR-017, IBR-105, IBR-106 and IBR-SR-19:

Previous Behavior: IBR-017 established that the Payee (ibg-10) must be different from the Seller (ibg-04) by comparing the Payee name with cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name, which is the Seller trading name (ibt-028) and not the Seller name (ibt-027) referred to in the rule text. Party identifiers were compared by value only, so identifiers issued under different schemes were treated as equal. IBR-105, IBR-106 and IBR-SR-19 each contained the alternative condition or cac:PartyName/cbc:Name = ../cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName, which disabled the cardinality check whenever the Payee name matched the Seller name. As a result, neither the difference between the Payee and the Seller nor the maximum occurrence of the Payee legal identifier (ibt-061) was correctly enforced.

New Behavior: IBR-017 now compares the Payee and the Seller in the following order of precedence:

  1. Legal registration identifier — cac:PartyLegalEntity/cbc:CompanyID (ibt-061 against ibt-030), compared on value and scheme identifier.

  2. Party identification — cac:PartyIdentification/cbc:ID (ibt-060 against ibt-029), compared on value and scheme identifier, excluding the SEPA scheme.

  3. Name — used only when neither party provides an identifier of the type above, compared against the Seller name (ibt-027).

Comparison is case insensitive and whitespace normalised. The alternative condition has been removed from IBR-105, IBR-106 and IBR-SR-19, and their messages have been simplified accordingly.

Justification: Names are unreliable for comparison because of spelling, case and abbreviation variants, so registered identifiers are used first and the name is retained only as a last resort. Once IBR-017 requires the Payee to be different from the Seller, the alternative condition in the three cardinality rules is no longer meaningful and was preventing those rules from reporting genuine violations.

Related action item: verify Payee implementations.

Change 19 – IBR-124 and IBR-CO-14:

Previous Behavior: Both rules were declared in a rule whose context was /ubl:Invoice/cac:TaxTotal | /cn:CreditNote/cac:Taxtotal. The Credit Note branch used cac:Taxtotal with a lower-case t, which does not match the UBL 2.1 element name cac:TaxTotal. Neither rule was therefore evaluated for any Credit Note.

New Behavior: The rule context has been corrected to /ubl:Invoice/cac:TaxTotal | /cn:CreditNote/cac:TaxTotal.

Justification: XML element names are case sensitive. Both rules are Shared rules and are intended to apply to Invoices and Credit Notes alike.

Related action item: verify Credit Note implementations.

Change 10 – New cardinality rules (IBR-SR-64 to IBR-SR-70):

Previous Behavior: Following the design decision of keeping the semantic model independent from the syntax used to implement it, cardinality is enforced by Schematron validation rather than by the XML schema. For a number of elements the Syntax Binding specified a maximum cardinality of one, while the UBL 2.1 schema declares them maxOccurs="unbounded" and no Schematron rule enforced the restriction. Instances repeating those elements passed validation.

New Behavior: The Syntax Binding of the Invoice and of the Credit Note has been compared element by element against the UBL 2.1 schema. Seven elements were found to be restricted by PINT and unbounded in UBL 2.1 without a corresponding Schematron rule, and seven rules have been added to cover them: IBR-SR-64 to IBR-SR-70. All other elements restricted by the Syntax Binding were found to be covered by an existing rule.

Justification: Schematron validation is the only place where these cardinalities can be enforced, so any gap allows a non conformant instance to pass validation.

Related action item: review the new rules.

Change 1 – Decimal places in invoice amounts (IBR-091, IBR-121, IBR-122, IBR-123, IBR-124, IBR-125, IBR-CO-10 to IBR-CO-16):

Previous Behavior: Document level amounts were limited to a fixed maximum of 2 decimals, the same for every currency, and the totals arithmetic in the calculation rules rounded to 2 decimals with a hard coded round(x * 10 * 10) div 100. ISO 4217 defines an official number of minor units for every currency, and for seven currencies that number is 3: BHD, IQD, JOD, KWD, LYD, OMR and TND. An Omani invoice total of 1245.575 (1 Rial = 1000 baisa) was therefore rejected, even though the identical precision was accepted on the Invoice lines, which carry no decimal limit at all. Two accounting units, CLF and UYW, officially use 4 decimals and were limited in the same way.

New Behavior: The maximum number of decimals allowed for a document level amount is the official ISO 4217 precision of the applicable currency, and the calculation rules round to that same precision. Three helper functions have been added to the Schematron:

  • u:currencyDecimals($currency) returns 3 for the seven 3 decimal currencies, 4 for CLF and UYW, and 2 for every other currency.

  • u:currencyScale($currency) returns the matching scale factor, 1000, 10000 or 100.

  • u:round($value, $currency) rounds an amount to the precision of its currency.

The currency of a document level total is taken from the Invoice currency code (ibt-005), and for cac:TaxTotal from the currencyID of the tax amount, so that a total stated in the Tax accounting currency (ibt-006) is judged against that currency.

Invoice line amounts are not affected. No rule constrains the number of decimals on an Invoice line amount today and none has been added. The six maximum-decimals rules apply to cac:LegalMonetaryTotal and cac:TaxTotal only. Aligning line item precision with the currency is not part of this release.

Justification: Currencies with 0 official decimals, and codes with no defined precision such as precious metals and IMF units, deliberately return 2 and are therefore treated exactly as they are today. For the 139 currencies that officially use 2 decimals, u:round returns the same value as the previous expression and u:currencyDecimals returns 2, so every invoice that is valid today remains valid. Deriving the limit from ISO 4217 rather than raising it to 3 for everyone means no currency is given more precision than it actually has, and the same request from Bahrain, Kuwait, Jordan, Iraq, Libya or Tunisia is already answered. Invoice line amounts continue to accept any number of decimals, unchanged from today.

Change 2 – IBR-079 in the semantic model:

Previous Behavior: IBR-079 applies to every element of the document, but it was not referenced by any entry of the semantic model. It therefore did not appear under the Rules tab of any business group, and an implementer reading the specification for a group had no indication that its elements must not be empty.

New Behavior: IBR-079 has been added to the rule: list of every business group (ibg-nn) that carries child entries: 37 groups in the Invoice semantic model and 36 in the Credit Note semantic model. Where a group had no rule: list, one was created. Individual business terms are deliberately not linked, so the rule is documented once per segment rather than on every element of the document.

The last of those groups additionally carries a relatesTo: list naming all the other groups. The Rules page renders a single Targeted Semantic Element per rule, taken from the last rule: entry found for that rule identifier, while Related Semantic Elements is rendered as a full list. Without the relatesTo: list the Rules page for IBR-079 would name one group out of 37. This is a documentation workaround only and can be removed once the Rules page aggregates the targeted elements of a rule; the same limitation applies to IBR-068, IBR-073, IBR-084, IBR-126 and every other rule that is referenced from more than one semantic element.

Justification: A rule that applies to the whole document is of little use to an implementer if it is not visible anywhere in the specification. Linking it to the segments makes the requirement discoverable at the point where an implementer looks for it, without repeating the same rule on every business term. No Schematron logic was changed by this: the rule itself is unchanged, only its documentation links. This change is independent from Change 5, which corrects the position of the same rule in the Schematron and does affect validation behaviour.

Change 15 – Saxon warnings in the helper functions:

Previous Behavior: The helper functions u:gln, u:mod11, u:slack, u:mod97-0208 and u:abn are declared as="xs:boolean" and returned their result using xsl:value-of. xsl:value-of constructs a text node, which then has to be atomised and converted to the declared return type. Saxon reports a warning for each of these functions when the validation artefact is compiled.

New Behavior: xsl:value-of has been replaced with xsl:sequence in all five functions, in the Schematron source and in the generated XSLT.

Justification: xsl:sequence returns the boolean value directly, which matches the declared return type and removes the warnings. The evaluated result of each function is unchanged.

Action Items for Implementers

Each action item names the change it results from, so that the full background of an action is one link away.

  • (Change 1) Senders and receivers in Bahrain, Iraq, Jordan, Kuwait, Libya, Oman and Tunisia can state document level totals with the 3 decimals their currency defines. No action is required to keep sending 2 decimals.

  • (Change 1) Businesses invoicing in a 2 decimal currency, a 0 decimal currency, or under a code with no defined precision need to take no action: decimal validation is unchanged for them.

  • (Change 1) Note that Invoice line amounts continue to accept any number of decimals. Aligning line item precision with the currency is not part of this release.

  • (Change 1) Maintainers: the 3 decimal and 4 decimal currency sets in u:currencyDecimals are the ISO 4217 minor units and must be reviewed whenever the ISO 4217 code list is updated, in the same pass as IBR-CL-03, IBR-CL-04 and IBR-CL-05.

  • (Change 10) Review the new rules IBR-SR-64 to IBR-SR-70 and verify that outgoing documents respect the Syntax Binding cardinalities they enforce.

  • (Change 5) Verify that outgoing documents contain no empty elements. IBR-079 now reports every empty element, including elements that were previously matched by another rule.

  • (Change 9) Verify Payee (ibg-10) implementations. IBR-017 now compares the Payee and the Seller on their identifiers, and IBR-105, IBR-106 and IBR-SR-19 now always enforce their cardinality.

  • (Change 6, Change 7) Verify the format of cbc:ReceivedDate (ibt-181) and cbc:InstallmentDueDate (ibt-177), and the currency of cbc:PaidAmount (ibt-180) and cbc:PerUnitAmount (ibt-166). These elements are now validated by IBR-073, IBR-126 and IBR-CL-03.

  • (Change 19) Verify Credit Note implementations against IBR-124 and IBR-CO-14, which are now evaluated for Credit Notes.

  • (Change 4) Note that IBR-056 has been removed. A Seller tax representative without a tax identifier (ibt-063) is now accepted, in line with the Syntax Binding.

Support

For support and clarification:

Version 1.1.3

Maintained by PoAC

Release Date

2026-06-08 (8 June 2026)

Status

Review

What’s new in this release?

  • Code lists updates (EAS, ICD, ISO 4217), including new identifier schemes and currency code changes.

  • Schematron validation artefacts updated to align with the latest code lists.

  • Update to the PINT specialization guide.

  • Text corrections in the Credit Note Semantic and Syntax pages.

  • Various Schematron updates.

  • Improved error message for IBR-004 to clearly distinguish invoice and credit note type code validation scenarios.

  • Update to IBR-126 to exclude cac:ItemPriceExtension amounts from DocumentCurrencyCode validation.

Overview

This release introduces updates to the PINT Self-Billing General Specification, covering the Data Model, BIS documentation, Compliance, Specialisation, Code Lists, and Schematron rules. The objective is to improve semantic clarity, validation accuracy, and overall implementation guidance.

Version Information

Version 1.1.3

Applies to

PINT Self-Billing (Invoice and Credit Note)

Reviewed

-

Changes

Data Model

  • In the Credit Note Semantic and Syntax documentation, IBT-003 was previously described as Invoice type code. This has been corrected to Credit note type code.

  • Added missing element cac:TaxScheme/cbc:ID under cac:TaxTotal[cbc:TaxAmount/@currency = ../cbc:TaxCurrencyCode]/cac:TaxSubtotal/cac:TaxCategory. According to the UBL 2.1 schema, this is a mandatory element and was missing from our specification.

Documentation

  • PINT Specialisation Guide:

    • Updated the Shared Content section to clarify restrictive cardinality on optional elements when required by local implementations.

    • Improved the definition of Shared Content in the Glossary and terminology section.

    • Added clarification under Data Model → Specialisations → Allowed cardinality restrictions.

    • Removed references to GitHub issue links.

Code Lists Updates

Electronic Address Scheme (EAS)

New Additions

Code Description Justification

0242

OpenPeppol Service Provider Identification Scheme (SPIS)

Part of regular code list updates

0245

Tax identification number (DIČ, Slovakia)

New scheme introduced

0246

German Electronic Business Address

New scheme introduced

0248

Oman VAT Identification Number (VATIN)

New scheme introduced

ICD (ISO 6523 Identifier Schemes)

New Additions

Code Description Notes

0245

Tax identification number (DIČ, Slovakia)

Standard addition

0246

German Electronic Business Address

Standard addition

0247

Name unknown

No public documentation available

0248

Oman VAT Identification Number (VATIN)

Standard addition

ISO 4217 Currency Codes

Changes Overview

Code Status Description Notes

XCG

Added

East Caribbean Guilder

New currency introduced

ANG

Removed

Netherlands Antillean Guilder

Deprecated

BGN

Removed

Bulgarian Lev

Removed per update

Schematron Rules

Rule Visibility and Documentation Improvements
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-127

cbc:EndpointID[@schemeID = '0007'], cac:PartyIdentification/cbc:ID[@schemeID = '0007'], cbc:CompanyID[@schemeID = '0007']

Added (Rules tab)

[ibr-127] – Swedish organization number MUST be stated in the correct format for endpoints (ibt-034), (ibt-049), party identification (ibt-029), (ibt-046), (ibt-060), and legal entities (ibt-030), (ibt-047), (ibt-061).

The rule was previously not displayed under the Rules tab.

IBR-082

cbc:ChargeIndicator

Added (Rules tab)

[ibr-082] – Allowance/charge indicator value MUST be either 'true' or 'false'.

The rule was previously not visible under the Rules tab and is now correctly linked at both document and line level.

IBR-004

cbc:InvoiceTypeCode, cbc:CreditNoteTypeCode

Fixed

[ibr-004] – Invoice or Credit note type code (ibt-003) MUST be present.

Error message improved to explicitly distinguish invoice and credit note validation scenarios. No change to validation logic.

Business Rule Logic Updates
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-126

cbc:Amount, cbc:BaseAmount, cbc:PriceAmount and other amount elements

Updated

[ibr-126] – All currencyID attributes must have the same value as the Invoice currency code (ibt-005), except for amounts expected to be in Tax accounting currency (ibt-006).

Amounts inside cac:ItemPriceExtension are excluded from this check, as some country extensions use this segment to carry line-level amounts in the Tax Accounting Currency (ibt-006). Currency validation for these amounts remains the responsibility of the relevant country extension rules.


Removed Rules
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-SR-45

cbc:PaymentDueDate

Removed

[ibr-sr-45] – Due Date (ibt-009) MUST occur at most once.

The UBL 2.1 schema already restricts this to zero or one occurrence, making the Schematron rule redundant.


Code List Alignment
Rule ID Syntax (XML location) Change Business Rule Reason

IBR-CL-03, IBR-CL-04, IBR-CL-05

Currency code elements (ISO 4217)

Change

Currency code MUST belong to the ISO 4217 code list.

Updated to reflect latest ISO 4217 changes (addition of XCG, removal of ANG and BGN).

IBR-CL-10, IBR-CL-11, IBR-CL-21, IBR-CL-26

Identifier scheme (ICD)

Change

Scheme identifier MUST belong to the ISO 6523 ICD code list.

Updated to include new scheme identifiers (0245, 0246, 0247, 0248) and correct formatting for 0244.

IBR-CL-25

Electronic Address Scheme (EAS)

Change

Electronic address scheme identifier MUST belong to the EAS code list.

Updated to include new scheme identifiers (0242, 0245, 0246, 0248).

IBR-127:

Previous Behavior: The rule validating Swedish organization numbers existed but was not visible under the Rules tab and was not clearly linked to all applicable elements.

New Behavior: The rule is now correctly displayed under the Rules tab and linked to endpoints, party identification, and legal entity identifiers using schemeID 0007.

Justification: This change improves rule visibility and ensures consistent validation across all applicable business terms without altering the validation logic itself.

IBR-SR-45:

Previous Behavior: Schematron validation enforced that cbc:PaymentDueDate (ibt-009) MUST occur at most once in the document.

New Behavior: The Schematron rule enforcing the maximum occurrence of cbc:PaymentDueDate has been removed.

Justification: The UBL 2.1 schema already restricts cbc:PaymentDueDate to zero or one occurrence. Maintaining this rule in Schematron duplicated schema-level validation and added no additional implementation value.

IBR-082:

Previous Behavior: The allowance/charge indicator rule existed but was not visible under the Rules tab and was not consistently linked at document and line level.

New Behavior: The rule validating cbc:ChargeIndicator is now correctly displayed under the Rules tab and linked to Allowance/Charge Amount at both document and line level.

Justification: This ensures consistent validation of boolean values and improves transparency for implementers without changing the underlying business requirement.

IBR-004:

Previous Behavior: The rule validated presence of ibt-003, but the error message referenced only invoices:

An Invoice MUST have an Invoice type code (ibt-003).

This could be misleading when the same rule was triggered for credit notes.

New Behavior: The error message has been updated to explicitly cover both document types:

[ibr-004]-A Self-Billed Invoice MUST have an Self-Billed Invoice type code (ibt-003) / A Self-Billed Credit note MUST have a Self-Billed Credit note Type code (ibt-003).

Justification: This change improves diagnostic clarity by aligning the error message with the rule’s actual scope across both self-billed invoices and self-billed credit notes, without changing the validation logic itself.

IBR-CL-26:

Previous Behavior: The ISO 6523 ICD code list value 0244 was defined without a required trailing space in the validation artefact. As a result, instances containing the value `0244 ` (with the correct trailing space as defined in the maintained code list) could incorrectly fail validation.

New Behavior: A trailing space has been added to the ISO 6523 ICD code list value `0244 ` in the validation artefact. Validation now correctly aligns with the maintained ISO 6523 ICD code list representation.

Justification: The omission of the trailing space was a formatting inconsistency in the validation artefact. Adding the space ensures full consistency with the maintained ISO 6523 ICD code list and prevents unintended validation failures due to whitespace mismatches.

Code List Alignment (Schematron):

Previous Behavior: Schematron validation enforced code list values based on the previous versions of ISO 4217, ICD, and EAS code lists.

New Behavior: Validation artefacts have been updated to reflect the latest code list versions:

  • ISO 4217: Added XCG; removed ANG and BGN

  • ICD: Added 0245, 0246, 0247, 0248

  • EAS: Added 0242, 0245, 0246, 0248

Justification: Ensures full alignment between maintained code lists and Schematron validation artefacts, preventing validation inconsistencies and supporting newly introduced identifiers and currency codes.

IBR-126:

Previous Behavior: The rule enforced that all amount currencyID attributes must match the DocumentCurrencyCode, with no exceptions for amounts inside cac:ItemPriceExtension. As a result, invoices using cac:ItemPriceExtension to carry line-level amounts in the Tax Accounting Currency (ibt-006) would incorrectly trigger a fatal validation error.

New Behavior: Amounts that are descendants of cac:ItemPriceExtension are now excluded from the ibr-126 check. All other amount elements continue to be validated against the DocumentCurrencyCode as before.

Justification: Some country extensions use cac:ItemPriceExtension to report line-level amounts in the Tax Accounting Currency (ibt-006). Since this is a shared rule, no country-specific currency enforcement has been added. Currency validation within cac:ItemPriceExtension remains the responsibility of the relevant country extension rules.

Action Items for Implementers

  • Review the updated visibility and linkage of Schematron rules in your validation environment.

  • Schematron validation artefacts have been updated to align with the latest Code Lists (EAS, ICD, ISO 4217). Ensure your validation environment reflects these updates.

  • Verify support for newly added identifier schemes (EAS and ICD) and currency codes (ISO 4217), and ensure deprecated values are no longer used.

  • Verify Credit Note implementations reference IBT-003 as Credit note type code.

  • No new Schematron constraints have been introduced; validation updates reflect alignment with maintained code lists and removal of redundant rules.

  • If your implementation uses cac:ItemPriceExtension to carry amounts in the Tax Accounting Currency, note that IBR-126 will no longer fire for those amounts. Currency validation for cac:ItemPriceExtension is handled by your country extension rules.

Support

For support and clarification:

Version 1.1.2

Maintained by PoAC

Release Date

TBD

Status

Review

What’s new in this release?

  • This is an intital release.

Version Information

PINT Self-Billing 1.1.2

Applies to

PINT Self-Billing (Invoice and Credit note)

Reviewed

-