Skip to content

Commit f8b86e4

Browse files
committed
Rule update
1 parent a9883d2 commit f8b86e4

7 files changed

Lines changed: 36 additions & 33 deletions

File tree

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,11 @@ I hope that with the introduction of PINT, the versioning problem will be solved
231231

232232
# News and noteworthy
233233

234+
v4.2.5 - 2026-03-27
235+
* Updated to final AE PINT 1.0.3 rules
236+
234237
v4.2.4 - 2026-03-23
235-
* Updated to AE PINT 1.0.3 rules
238+
* Added preliminary AE PINT 1.0.3 rules
236239

237240
v4.2.3 - 2026-03-12
238241
* Requires phive 12.0.1 or later
7 Bytes
Binary file not shown.
Binary file not shown.

phive-rules-peppol/src/main/resources/external/schematron/pint-ae/2026.3/billing/PINT-jurisdiction-aligned-rules.xslt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,15 @@
243243

244244
<!--ASSERT -->
245245
<xsl:choose>
246-
<xsl:when test="cbc:EndpointID/@schemeID != &quot;0235&quot; or starts-with(normalize-space(cbc:EndpointID), &quot;1&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)" />
246+
<xsl:when test="cbc:EndpointID/@schemeID != &quot;0235&quot; or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)" />
247247
<xsl:otherwise>
248-
<svrl:failed-assert test="cbc:EndpointID/@schemeID != &quot;0235&quot; or starts-with(normalize-space(cbc:EndpointID), &quot;1&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)">
248+
<svrl:failed-assert test="cbc:EndpointID/@schemeID != &quot;0235&quot; or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)">
249249
<xsl:attribute name="id">ibr-149-ae</xsl:attribute>
250250
<xsl:attribute name="flag">fatal</xsl:attribute>
251251
<xsl:attribute name="location">
252252
<xsl:apply-templates mode="schematron-select-full-path" select="." />
253253
</xsl:attribute>
254-
<svrl:text>[ibr-149-ae]-The buyer legal registration identifier (IBT-047) MUST be provided when the scheme identifier (IBT-049-1) is '0235' and buyer electronic address (IBT-049) is not '1XXXXXXXXX'</svrl:text>
254+
<svrl:text>[ibr-149-ae]-The buyer legal registration identifier (IBT-047) MUST be provided when the scheme identifier (IBT-049-1) is '0235' and buyer electronic address (IBT-049) is not '1XXXXXXXXX' or '9XXXXXXXXX'</svrl:text>
255255
</svrl:failed-assert>
256256
</xsl:otherwise>
257257
</xsl:choose>
@@ -303,9 +303,9 @@
303303

304304
<!--ASSERT -->
305305
<xsl:choose>
306-
<xsl:when test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or starts-with(cbc:EndpointID, &quot;1&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)" />
306+
<xsl:when test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;TL&quot;,&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)" />
307307
<xsl:otherwise>
308-
<svrl:failed-assert test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or starts-with(cbc:EndpointID, &quot;1&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)">
308+
<svrl:failed-assert test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;TL&quot;,&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)">
309309
<xsl:attribute name="id">ibr-183-ae</xsl:attribute>
310310
<xsl:attribute name="flag">fatal</xsl:attribute>
311311
<xsl:attribute name="location">
@@ -612,9 +612,9 @@
612612

613613
<!--ASSERT -->
614614
<xsl:choose>
615-
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or (cbc:Amount = round(cbc:BaseAmount * cbc:MultiplierFactorNumeric) div 100)" />
615+
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
616616
<xsl:otherwise>
617-
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or (cbc:Amount = round(cbc:BaseAmount * cbc:MultiplierFactorNumeric) div 100)">
617+
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
618618
<xsl:attribute name="id">ibr-131-ae</xsl:attribute>
619619
<xsl:attribute name="flag">fatal</xsl:attribute>
620620
<xsl:attribute name="location">
@@ -693,9 +693,9 @@
693693

694694
<!--ASSERT -->
695695
<xsl:choose>
696-
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
696+
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
697697
<xsl:otherwise>
698-
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
698+
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
699699
<xsl:attribute name="id">ibr-146-ae</xsl:attribute>
700700
<xsl:attribute name="flag">fatal</xsl:attribute>
701701
<xsl:attribute name="location">
@@ -744,9 +744,9 @@
744744

745745
<!--ASSERT -->
746746
<xsl:choose>
747-
<xsl:when test="not(matches(., concat('^[0-9]+\.[0-9]', codepoints-to-string(123), '7,', codepoints-to-string(125), '$')))" />
747+
<xsl:when test="matches(., concat('^[0-9]+(\.[0-9]', codepoints-to-string(123), '1,6', codepoints-to-string(125), ')?$'))" />
748748
<xsl:otherwise>
749-
<svrl:failed-assert test="not(matches(., concat('^[0-9]+\.[0-9]', codepoints-to-string(123), '7,', codepoints-to-string(125), '$')))">
749+
<svrl:failed-assert test="matches(., concat('^[0-9]+(\.[0-9]', codepoints-to-string(123), '1,6', codepoints-to-string(125), ')?$'))">
750750
<xsl:attribute name="id">ibr-002-ae</xsl:attribute>
751751
<xsl:attribute name="flag">fatal</xsl:attribute>
752752
<xsl:attribute name="location">

phive-rules-peppol/src/main/resources/external/schematron/pint-ae/2026.3/selfbilling/PINT-jurisdiction-aligned-rules.xslt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,15 @@
243243

244244
<!--ASSERT -->
245245
<xsl:choose>
246-
<xsl:when test="cbc:EndpointID/@schemeID != &quot;0235&quot; or starts-with(normalize-space(cbc:EndpointID), &quot;1&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)" />
246+
<xsl:when test="cbc:EndpointID/@schemeID != &quot;0235&quot; or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)" />
247247
<xsl:otherwise>
248-
<svrl:failed-assert test="cbc:EndpointID/@schemeID != &quot;0235&quot; or starts-with(normalize-space(cbc:EndpointID), &quot;1&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)">
248+
<svrl:failed-assert test="cbc:EndpointID/@schemeID != &quot;0235&quot; or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or exists(cac:PartyTaxScheme/cbc:CompanyID)">
249249
<xsl:attribute name="id">ibr-149-ae</xsl:attribute>
250250
<xsl:attribute name="flag">fatal</xsl:attribute>
251251
<xsl:attribute name="location">
252252
<xsl:apply-templates mode="schematron-select-full-path" select="." />
253253
</xsl:attribute>
254-
<svrl:text>[ibr-149-ae]-The buyer legal registration identifier (IBT-047) MUST be provided when the scheme identifier (IBT-049-1) is '0235' and buyer electronic address (IBT-049) is not '1XXXXXXXXX'</svrl:text>
254+
<svrl:text>[ibr-149-ae]-The buyer legal registration identifier (IBT-047) MUST be provided when the scheme identifier (IBT-049-1) is '0235' and buyer electronic address (IBT-049) is not '1XXXXXXXXX' or '9XXXXXXXXX'</svrl:text>
255255
</svrl:failed-assert>
256256
</xsl:otherwise>
257257
</xsl:choose>
@@ -303,9 +303,9 @@
303303

304304
<!--ASSERT -->
305305
<xsl:choose>
306-
<xsl:when test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or starts-with(cbc:EndpointID, &quot;1&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)" />
306+
<xsl:when test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;TL&quot;,&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)" />
307307
<xsl:otherwise>
308-
<svrl:failed-assert test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or starts-with(cbc:EndpointID, &quot;1&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)">
308+
<svrl:failed-assert test="not(cac:PartyLegalEntity/cbc:CompanyID) or not(cbc:EndpointID[@schemeID = &quot;0235&quot;]) or matches(normalize-space(cbc:EndpointID), &quot;^[19]&quot;) or cac:PartyLegalEntity/cbc:CompanyID/@schemeAgencyID = (&quot;TL&quot;,&quot;CL&quot;, &quot;EID&quot;, &quot;PAS&quot;, &quot;CD&quot;)">
309309
<xsl:attribute name="id">ibr-183-ae</xsl:attribute>
310310
<xsl:attribute name="flag">fatal</xsl:attribute>
311311
<xsl:attribute name="location">
@@ -612,9 +612,9 @@
612612

613613
<!--ASSERT -->
614614
<xsl:choose>
615-
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or (cbc:Amount = round(cbc:BaseAmount * cbc:MultiplierFactorNumeric) div 100)" />
615+
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
616616
<xsl:otherwise>
617-
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or (cbc:Amount = round(cbc:BaseAmount * cbc:MultiplierFactorNumeric) div 100)">
617+
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
618618
<xsl:attribute name="id">ibr-131-ae</xsl:attribute>
619619
<xsl:attribute name="flag">fatal</xsl:attribute>
620620
<xsl:attribute name="location">
@@ -693,9 +693,9 @@
693693

694694
<!--ASSERT -->
695695
<xsl:choose>
696-
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
696+
<xsl:when test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100" />
697697
<xsl:otherwise>
698-
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
698+
<svrl:failed-assert test="not(exists(cbc:BaseAmount) and exists(cbc:MultiplierFactorNumeric)) or number(cbc:Amount) = (number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) or number(cbc:Amount) = round((number(cbc:BaseAmount) * number(cbc:MultiplierFactorNumeric) div 100) * 100) div 100">
699699
<xsl:attribute name="id">ibr-146-ae</xsl:attribute>
700700
<xsl:attribute name="flag">fatal</xsl:attribute>
701701
<xsl:attribute name="location">
@@ -744,9 +744,9 @@
744744

745745
<!--ASSERT -->
746746
<xsl:choose>
747-
<xsl:when test="not(matches(., concat('^[0-9]+\.[0-9]', codepoints-to-string(123), '7,', codepoints-to-string(125), '$')))" />
747+
<xsl:when test="matches(., concat('^[0-9]+(\.[0-9]', codepoints-to-string(123), '1,6', codepoints-to-string(125), ')?$'))" />
748748
<xsl:otherwise>
749-
<svrl:failed-assert test="not(matches(., concat('^[0-9]+\.[0-9]', codepoints-to-string(123), '7,', codepoints-to-string(125), '$')))">
749+
<svrl:failed-assert test="matches(., concat('^[0-9]+(\.[0-9]', codepoints-to-string(123), '1,6', codepoints-to-string(125), ')?$'))">
750750
<xsl:attribute name="id">ibr-002-ae</xsl:attribute>
751751
<xsl:attribute name="flag">fatal</xsl:attribute>
752752
<xsl:attribute name="location">

0 commit comments

Comments
 (0)