BR-DEX-04Dependency changed
ISO 6523 ICD code list adds "0239" and "0240"
The validation check is byte-identical across releases and references "$ISO-6523-ICD-EXT-CODES". The reported dependency change is "$ISO-6523-ICD-CODES", whose before value ends at "0238" and whose after value adds "0239" and "0240" immediately after it; the before value contains neither "0239" nor "0240". The unchanged check references "$ISO-6523-ICD-EXT-CODES", not "$ISO-6523-ICD-CODES", so only the reported dependency change is visible for this rule.
fatalcountry
Original rule text: [BR-DEX-04] Any scheme identifier in MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
The rule requires that a party identification element (cac:PartyIdentification/cbc:ID in UBL or ram:GlobalID in CII) with a schemeID attribute and an XRechnung extension context uses a scheme identifier from the ISO 6523 ICD code list supplied by the rule. In UBL, SEPA is also allowed if the element is inside an AccountingSupplierParty or PayeeParty; in CII only the ISO 6523 ICD codes are accepted. The document fails when the schemeID is not one of those allowed codes or contains internal spaces.
How to fix
Set the schemeID attribute to a code from the rule's ISO-6523-ICD-EXT-CODES list (e.g., 0002, 0060, or 0088) with no internal spaces. In UBL, if the party is the accounting supplier or payee, SEPA is also accepted; in CII only an ISO 6523 ICD code is allowed. If the scheme identifier is not needed for this party identification, remove the schemeID attribute.
BR-DEX-04 rule detailsChanged variable $ISO-6523-ICD-CODES
Before · 2.3.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238'After · 2.4.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240'BR-DEX-06Dependency changed
The variable $ISO-6523-ICD-CODES now includes "0239" and "0240".
The test expression is byte-identical between the two releases; the change is entirely in the variable $ISO-6523-ICD-CODES. That variable is a space-delimited list of ISO 6523 ICD codes, and the published value ends with "0238" in the earlier release. The later release appends "0239" and "0240" to the end of the list.
fatalcountry
Original rule text: [BR-DEX-06] Any scheme identifier in MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
This rule applies to item standard identification identifiers that carry a schemeID and occur in a document using the XRechnung extension. It requires the schemeID attribute, after trimming surrounding whitespace, to contain no internal spaces and to be exactly one of the codes listed in the rule's $ISO-6523-ICD-EXT-CODES (for example 0002, 0088, XR01). It fails if the attribute is empty or whitespace-only, contains spaces inside the value, or is not one of those codes.
How to fix
On the relevant element (cac:StandardItemIdentification/cbc:ID in UBL, ram:SpecifiedTradeProduct/ram:GlobalID in CII), set the schemeID attribute to a single valid ISO 6523 ICD code from the allowed list, without any spaces inside the code. For example, use 0002 or XR01 as appropriate. Ensure only one code is provided; if you currently have multiple codes separated by spaces, keep only the applicable one. If the code you used is not in the list, look up the correct ISO 6523 ICD code for the item identification scheme.
BR-DEX-06 rule detailsChanged variable $ISO-6523-ICD-CODES
Before · 2.3.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238'After · 2.4.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240'BR-DEX-07Dependency changed
Rule expression unchanged; changed variable is not the one referenced
The test expression is byte-identical in both releases; it checks the scheme identifier against the variable $CEF-EAS-EXT-CODES. The only changed dependency shown is $CEF-EAS-CODES, whose value list adds "0154", "0158", and "0240", and removes "9901". Because the expression does not reference the changed variable, the evidence does not show that the rule's evaluation changed.
fatalcountry
Original rule text: [BR-DEX-07] Any scheme identifier for an Endpoint Identifier in MUST belong to the CEF EAS code list.
Explanation and fix
What this rule requires
For an endpoint identifier (cbc:EndpointID or ram:URIID) that has a schemeID and the invoice declares itself as an XRechnung extension, the schemeID must be exactly one of the codes from the CEF EAS code list accepted by the rule, with no spaces inside the value. The test fails if the schemeID is empty or whitespace-only, contains an internal space, or is not in the allowed code list.
How to fix
Set the schemeID attribute to a valid CEF EAS code from the rule's list, such as "0088" or "0208". Ensure the value is not empty and does not contain spaces. If the current scheme identifier is not in the list, map it to the appropriate CEF EAS code.
BR-DEX-07 rule detailsChanged variable $CEF-EAS-CODES
Before · 2.3.0
' 0002 0007 0009 0037 0060 0088 0096 0097 0106 0130 0135 0142 0147 0151 0170 0177 0183 0184 0188 0190 0191 0192 0193 0194 0195 0196 0198 0199 0200 0201 0202 0203 0204 0205 0208 0209 0210 0211 0212 0213 0215 0216 0217 0218 0219 0220 0221 0225 0230 0235 9901 9910 9913 9914 9915 9918 9919 9920 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9957 9959 AN AQ AS AU EM 'After · 2.4.0
' 0002 0007 0009 0037 0060 0088 0096 0097 0106 0130 0135 0142 0147 0151 0154 0158 0170 0177 0183 0184 0188 0190 0191 0192 0193 0194 0195 0196 0198 0199 0200 0201 0202 0203 0204 0205 0208 0209 0210 0211 0212 0213 0215 0216 0217 0218 0219 0220 0221 0225 0230 0240 0235 9910 9913 9914 9915 9918 9919 9920 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9957 9959 AN AQ AS AU EM 'BR-DEX-05Dependency changed
The allowed scheme identifier codes now include "0239" and "0240".
The rule's test expression is byte-identical between the two releases; the change is in the variable $ISO-6523-ICD-CODES that the expression depends on. Before, the list of codes ended with "0238". After, it also includes "0239" and "0240".
fatalcountry
Original rule text: [BR-DEX-05] Any scheme identifier in MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
The rule applies when the document is identified as an XRechnung extension (the $isExtension condition is true). For such documents, the @schemeID attribute on cac:PartyLegalEntity/cbc:CompanyID (UBL) or on ram:ID outside ram:SpecifiedTaxRegistration (CII) must be a code from the ISO 6523 ICD list, and it must not contain any whitespace. If the value is empty, contains a space, or is not exactly one of the listed codes, the document fails validation. This is a fatal rule, so the invoice is rejected.
How to fix
Set @schemeID to one of the allowed ISO 6523 ICD codes from the rule's list, for example XR01 or 0002, and ensure there are no spaces. If the current value is not in the list or contains whitespace, replace it with the correct code for your identification scheme.
BR-DEX-05 rule detailsChanged variable $ISO-6523-ICD-CODES
Before · 2.3.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238'After · 2.4.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240'BR-DEX-08Dependency changed
The changed variable is not the one the unchanged test expression uses.
The listed variable change appends "0239" and "0240" to "$ISO-6523-ICD-CODES" after "0238". The test expression is byte-identical and refers to "$ISO-6523-ICD-EXT-CODES", not "$ISO-6523-ICD-CODES". The evidence does not show whether "$ISO-6523-ICD-EXT-CODES" changed, so the effect on the rule is unclear.
fatalcountry
Original rule text: [BR-DEX-08] Any scheme identifier for a Delivery location identifier in MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
The rule checks the schemeID attribute of the delivery location identifier (UBL: cac:DeliveryLocation/cbc:ID; CII: ram:ApplicableHeaderTradeDelivery/ram:ShipToTradeParty/ram:GlobalID) when the document is declared as an XRechnung extension. The value must not contain internal spaces and must be one of the codes in the rule's ISO 6523 ICD extension list (for example, 0002, 0088, or XR01). The document fails when this attribute contains an internal space or is not one of those listed codes.
How to fix
Change the schemeID value to a code from the ISO 6523 ICD list, such as 0002, 0088, or XR01. Ensure the value has no spaces; if spaces come from data entry, correct the field or mapping to output only the code. Check the source system's configuration for delivery location identifier schemes and align it with the allowed ISO 6523 ICD codes.
BR-DEX-08 rule detailsChanged variable $ISO-6523-ICD-CODES
Before · 2.3.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238'After · 2.4.0
' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240'BR-CO-27Test expression rewritten
The payment account check now requires exactly one of IBAN or proprietary ID
The test before was an OR of the IBAN element, the proprietary ID element, and a clause that was true when both were absent, so it passed every case. The test after is the disjunction of IBAN and proprietary ID, conjoined with the negation of their conjunction: exactly one must be present, not zero and not both. The rule message still says either the IBAN or a proprietary ID shall be used.
fatalbusiness
Original rule text: [BR-CO-27]- Either the IBAN or a Proprietary ID (BT-84) shall be used.
BR-CO-27 rule detailsBefore · 2.3.0
(ram:PayeePartyCreditorFinancialAccount/ram:IBANID) or (ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID) or (not(ram:PayeePartyCreditorFinancialAccount/ram:IBANID) and not(ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID))After · 2.4.0
(ram:PayeePartyCreditorFinancialAccount/ram:IBANID or ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID) and not(ram:PayeePartyCreditorFinancialAccount/ram:IBANID and ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID)BR-CL-25Test expression rewritten
Allowed endpoint scheme identifier list gains "0154", "0158", "0240" and loses "9901"
The test still compares the endpoint identifier scheme identifier against an exact list of allowed CEF EAS codes after normalizing spaces. The list gains "0154", "0158", and "0240", and loses "9901". All other listed codes are unchanged. The comparison does not show why the list was updated.
fatalbusiness
Original rule text: [BR-CL-25]-Endpoint identifier scheme identifier MUST belong to the CEF EAS code list
Explanation and fix
What this rule requires
The rule requires that the endpoint identifier's schemeID attribute (cbc:EndpointID/@schemeID in UBL, ram:URIID/@schemeID in CII) is a value from the CEF EAS code list, and that the value contains no spaces (after surrounding whitespace is removed). The test checks both conditions: it fails if the normalized schemeID contains any space or if it is not one of the listed codes. Because severity is fatal, an invoice with a schemeID that does not satisfy this is rejected.
How to fix
Set the endpoint identifier scheme identifier to a valid CEF EAS code. In UBL, change cbc:EndpointID/@schemeID to one of the allowed codes, e.g. 0088, 9930, or EM. In CII, set ram:URIID/@schemeID similarly. Ensure the value has no spaces within it and matches exactly one code from the list. If you believe the current value is already a scheme identifier, verify it is listed in the rule; only codes in the list are accepted.
BR-CL-25 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0007 0009 0037 0060 0088 0096 0097 0106 0130 0135 0142 0147 0151 0170 0177 0183 0184 0188 0190 0191 0192 0193 0194 0195 0196 0198 0199 0200 0201 0202 0203 0204 0205 0208 0209 0210 0211 0212 0213 0215 0216 0217 0218 0219 0220 0221 0225 0230 0235 9901 9910 9913 9914 9915 9918 9919 9920 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9957 9959 AN AQ AS AU EM ', concat(' ', normalize-space(@schemeID), ' '))))After · 2.4.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0007 0009 0037 0060 0088 0096 0097 0106 0130 0135 0142 0147 0151 0154 0158 0170 0177 0183 0184 0188 0190 0191 0192 0193 0194 0195 0196 0198 0199 0200 0201 0202 0203 0204 0205 0208 0209 0210 0211 0212 0213 0215 0216 0217 0218 0219 0220 0221 0225 0230 0235 0240 9910 9913 9914 9915 9918 9919 9920 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9957 9959 AN AQ AS AU EM ', concat(' ', normalize-space(@schemeID), ' '))))BR-O-04Test expression rewritten
Buyer VAT check now searches any BuyerTradeParty element in the tree
The third condition in "BR-O-04" changed from "/ram:BuyerTradeParty" to "//ram:BuyerTradeParty". The former selected a BuyerTradeParty element only if it was the root element of the tree, while the latter selects any BuyerTradeParty element anywhere in the tree. Within that element, the rule still checks for an "ID" element under "ram:SpecifiedTaxRegistration" whose "schemeID" attribute is "VA". The first two clauses are unchanged, and the rule message is unchanged.
fatalbusiness
Original rule text: [BR-O-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
Explanation and fix
What this rule requires
BR-O-04 is a fatal rule: if an invoice or credit note has a document level charge with VAT category code 'O' ("Not subject to VAT") in the VAT tax scheme, then the document must not include a seller VAT identifier, seller tax representative VAT identifier, or buyer VAT identifier. In UBL, the rule checks cac:AllowanceCharge/cac:TaxCategory[cbc:ID='O'] with cac:TaxScheme/cbc:ID='VAT' and then requires that there is no cbc:CompanyID in the relevant cac:PartyTaxScheme under cac:AccountingSupplierParty, cac:TaxRepresentativeParty, or cac:AccountingCustomerParty. In CII, the rule fires for a ram:SpecifiedTradeAllowanceCharge with charge indicator true and a ram:CategoryTradeTax having ram:CategoryCode='O' and ram:TypeCode='VAT', then requires that ram:SellerTradeParty, ram:SellerTaxRepresentativeTradeParty, and //ram:BuyerTradeParty have no ram:SpecifiedTaxRegistration/ram:ID[@schemeID='VA']. The document fails validation if such a charge exists and any of those VAT identifiers is present.
How to fix
In UBL, remove the cbc:CompanyID element from each cac:PartyTaxScheme where cac:TaxScheme/cbc:ID is VAT under cac:AccountingSupplierParty/cac:Party, cac:TaxRepresentativeParty, and cac:AccountingCustomerParty/cac:Party; alternatively, change or remove the document level charge's cac:TaxCategory/cbc:ID value O, or remove the charge. In CII, remove the ram:SpecifiedTaxRegistration/ram:ID element with @schemeID='VA' from ram:SellerTradeParty, ram:SellerTaxRepresentativeTradeParty, and //ram:BuyerTradeParty; alternatively, change or remove the ram:CategoryTradeTax with ram:CategoryCode='O' and ram:TypeCode='VAT' under the relevant ram:SpecifiedTradeAllowanceCharge. Do not only blank the identifier; the elements must not exist.
BR-O-04 rule detailsBefore · 2.3.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])After · 2.4.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (//ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])BR-O-02Test expression rewritten
Buyer VAT identifier check now searches all descendants instead of root only
The test expression changed in its third condition: the absolute path "/ram:BuyerTradeParty" became the descendant search "//ram:BuyerTradeParty". The other two conditions, for the seller and seller tax representative VAT identifiers, are unchanged. This means the rule now checks for any buyer party VAT identifier at any depth, not only at the root.
fatalbusiness
Original rule text: [BR-O-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
Explanation and fix
What this rule requires
The rule is fatal. In UBL, if an Invoice or CreditNote contains any cac:ClassifiedTaxCategory with cbc:ID normalized to 'O' and cac:TaxScheme/cbc:ID uppercased to 'VAT', then the document must not contain a cbc:CompanyID in any of these VAT party tax schemes: cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme, cac:TaxRepresentativeParty/cac:Party/cac:PartyTaxScheme, or cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme. If no such category exists, the rule passes. In CII, if a line has ram:ApplicableTradeTax with ram:CategoryCode 'O' and ram:TypeCode uppercased to 'VAT', then the document must not contain ram:SpecifiedTaxRegistration/ram:ID with @schemeID 'VA' under ram:SellerTradeParty, ram:SellerTaxRepresentativeTradeParty, or ram:BuyerTradeParty.
How to fix
If the invoice contains any line item with VAT category code 'O' ('Not subject to VAT'), remove all Seller VAT identifier, Seller tax representative VAT identifier, and Buyer VAT identifier. In UBL, remove the cbc:CompanyID from cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID = 'VAT'], from cac:TaxRepresentativeParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID = 'VAT'], and from cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID = 'VAT']. In CII, remove ram:SpecifiedTaxRegistration/ram:ID[@schemeID='VA'] from ram:SellerTradeParty, ram:SellerTaxRepresentativeTradeParty, and ram:BuyerTradeParty. Alternatively, change the line's category code 'O' to another VAT category code so the restriction does not apply; if the identifiers are required, the line must not be coded as Not subject to VAT.
BR-O-02 rule detailsBefore · 2.3.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])After · 2.4.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (//ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])BR-O-03Test expression rewritten
Buyer VAT identifier check now searches the whole document, not just the document root.
The change is confined to the third condition, which checks for a buyer VAT identifier with scheme "VA". Previously that condition used an absolute path from the document root, so it could only match a buyer trade party that was the document root element. The new version uses a descendant search from the document root, so it can match a buyer trade party anywhere in the document. The two seller-related conditions are unchanged.
fatalbusiness
Original rule text: [BR-O-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
Explanation and fix
What this rule requires
The rule is fatal. In UBL, a document fails when it contains a document-level allowance (cac:AllowanceCharge[cbc:ChargeIndicator=false()]) whose cac:TaxCategory/cbc:ID is O and tax scheme is VAT, and at least one of the seller VAT identifier (cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID), seller tax representative VAT identifier (cac:TaxRepresentativeParty/cac:PartyTaxScheme/cbc:CompanyID), or buyer VAT identifier (cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID) is present. In CII, for each SpecifiedTradeAllowanceCharge[ram:ChargeIndicator=false()] with a CategoryTradeTax[ram:CategoryCode = 'O'][upper-case(ram:TypeCode) = 'VAT'], the seller, seller tax representative, and buyer trade party must not have a ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']; if any such VAT registration ID exists, the rule fails.
How to fix
Either remove the conflicting VAT identifiers, or change the document-level allowance's VAT category code to a value other than O. In UBL, remove the cbc:CompanyID element from the respective cac:PartyTaxScheme for seller, tax representative, or buyer. In CII, remove the ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'] from SellerTradeParty, SellerTaxRepresentativeTradeParty, or BuyerTradeParty.
BR-O-03 rule detailsBefore · 2.3.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])After · 2.4.0
not(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTaxRepresentativeTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA']) and not (//ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID = 'VA'])BR-CL-22Test expression rewritten
Twenty-five additional VATEX codes are now accepted
Why this matters
The allowed-value list gained 25 entries, all after "VATEX-FR-CNWVAT": "VATEX-EU-153"; "VATEX-FR-CGI261-1", "VATEX-FR-CGI261-2", "VATEX-FR-CGI261-3", "VATEX-FR-CGI261-4", "VATEX-FR-CGI261-5", "VATEX-FR-CGI261-7", "VATEX-FR-CGI261-8", "VATEX-FR-CGI261A", and "VATEX-FR-CGI261B"; "VATEX-FR-CGI261C-1", "VATEX-FR-CGI261C-2", and "VATEX-FR-CGI261C-3"; "VATEX-FR-CGI261D-1", "VATEX-FR-CGI261D-1BIS", "VATEX-FR-CGI261D-2", "VATEX-FR-CGI261D-3", and "VATEX-FR-CGI261D-4"; "VATEX-FR-CGI261E-1" and "VATEX-FR-CGI261E-2"; and "VATEX-FR-CGI277A", "VATEX-FR-CGI275", "VATEX-FR-298SEXDECIESA", "VATEX-FR-CGI295", and "VATEX-FR-AE". No other part of the rule changed.
fatalbusiness
Original rule text: [BR-CL-22]-Tax exemption reason code identifier scheme identifier MUST belong to the CEF VATEX code list
Explanation and fix
What this rule requires
The rule requires the cbc:TaxExemptionReasonCode element (in CII: ram:ExemptionReasonCode) to contain a value that appears in the CEF VATEX code list. The test first checks that the normalized value contains no space, then checks that the uppercase form of the value is present in the list provided by the rule. A document fails if the value contains a space or is not in that list.
How to fix
Set the cbc:TaxExemptionReasonCode (or ram:ExemptionReasonCode) value to one of the codes listed in the rule's CEF VATEX code list, for example VATEX-EU-79-C or VATEX-FR-FRANCHISE. Ensure the value has no spaces; case is ignored by the test, but using the exact uppercase form is safest. If the current value is not in the list, replace it with the correct VAT exemption reason code.
BR-CL-22 rule detailsBefore · 2.3.0
((not(contains(normalize-space(.), ' ')) and contains(' VATEX-EU-79-C VATEX-EU-132 VATEX-EU-132-1A VATEX-EU-132-1B VATEX-EU-132-1C VATEX-EU-132-1D VATEX-EU-132-1E VATEX-EU-132-1F VATEX-EU-132-1G VATEX-EU-132-1H VATEX-EU-132-1I VATEX-EU-132-1J VATEX-EU-132-1K VATEX-EU-132-1L VATEX-EU-132-1M VATEX-EU-132-1N VATEX-EU-132-1O VATEX-EU-132-1P VATEX-EU-132-1Q VATEX-EU-143 VATEX-EU-143-1A VATEX-EU-143-1B VATEX-EU-143-1C VATEX-EU-143-1D VATEX-EU-143-1E VATEX-EU-143-1F VATEX-EU-143-1FA VATEX-EU-143-1G VATEX-EU-143-1H VATEX-EU-143-1I VATEX-EU-143-1J VATEX-EU-143-1K VATEX-EU-143-1L VATEX-EU-144 VATEX-EU-146-1E VATEX-EU-159 VATEX-EU-309 VATEX-EU-148 VATEX-EU-148-A VATEX-EU-148-B VATEX-EU-148-C VATEX-EU-148-D VATEX-EU-148-E VATEX-EU-148-F VATEX-EU-148-G VATEX-EU-151 VATEX-EU-151-1A VATEX-EU-151-1AA VATEX-EU-151-1B VATEX-EU-151-1C VATEX-EU-151-1D VATEX-EU-151-1E VATEX-EU-G VATEX-EU-O VATEX-EU-IC VATEX-EU-AE VATEX-EU-D VATEX-EU-F VATEX-EU-I VATEX-EU-J VATEX-FR-FRANCHISE VATEX-FR-CNWVAT ', concat(' ', normalize-space(upper-case(.)), ' '))))After · 2.4.0
((not(contains(normalize-space(.), ' ')) and contains(' VATEX-EU-79-C VATEX-EU-132 VATEX-EU-132-1A VATEX-EU-132-1B VATEX-EU-132-1C VATEX-EU-132-1D VATEX-EU-132-1E VATEX-EU-132-1F VATEX-EU-132-1G VATEX-EU-132-1H VATEX-EU-132-1I VATEX-EU-132-1J VATEX-EU-132-1K VATEX-EU-132-1L VATEX-EU-132-1M VATEX-EU-132-1N VATEX-EU-132-1O VATEX-EU-132-1P VATEX-EU-132-1Q VATEX-EU-143 VATEX-EU-143-1A VATEX-EU-143-1B VATEX-EU-143-1C VATEX-EU-143-1D VATEX-EU-143-1E VATEX-EU-143-1F VATEX-EU-143-1FA VATEX-EU-143-1G VATEX-EU-143-1H VATEX-EU-143-1I VATEX-EU-143-1J VATEX-EU-143-1K VATEX-EU-143-1L VATEX-EU-144 VATEX-EU-146-1E VATEX-EU-159 VATEX-EU-309 VATEX-EU-148 VATEX-EU-148-A VATEX-EU-148-B VATEX-EU-148-C VATEX-EU-148-D VATEX-EU-148-E VATEX-EU-148-F VATEX-EU-148-G VATEX-EU-151 VATEX-EU-151-1A VATEX-EU-151-1AA VATEX-EU-151-1B VATEX-EU-151-1C VATEX-EU-151-1D VATEX-EU-151-1E VATEX-EU-G VATEX-EU-O VATEX-EU-IC VATEX-EU-AE VATEX-EU-D VATEX-EU-F VATEX-EU-I VATEX-EU-J VATEX-FR-FRANCHISE VATEX-FR-CNWVAT VATEX-EU-153 VATEX-FR-CGI261-1 VATEX-FR-CGI261-2 VATEX-FR-CGI261-3 VATEX-FR-CGI261-4 VATEX-FR-CGI261-5 VATEX-FR-CGI261-7 VATEX-FR-CGI261-8 VATEX-FR-CGI261A VATEX-FR-CGI261B VATEX-FR-CGI261C-1 VATEX-FR-CGI261C-2 VATEX-FR-CGI261C-3 VATEX-FR-CGI261D-1 VATEX-FR-CGI261D-1BIS VATEX-FR-CGI261D-2 VATEX-FR-CGI261D-3 VATEX-FR-CGI261D-4 VATEX-FR-CGI261E-1 VATEX-FR-CGI261E-2 VATEX-FR-CGI277A VATEX-FR-CGI275 VATEX-FR-298SEXDECIESA VATEX-FR-CGI295 VATEX-FR-AE ', concat(' ', normalize-space(upper-case(.)), ' '))))BR-CL-05Test expression rewritten
"ZWL" is no longer an accepted tax currency code.
The check requires a tax currency code to have no spaces and to appear in the ISO 4217 alpha-3 list. In published 2.3.0 the accepted list ended with "ZMW", "ZWG", and "ZWL"; in 2.4.0 it ends with "ZMW" and "ZWG". "ZWL" was removed from the accepted list, and no other values were added.
fatalbusiness
Original rule text: [BR-CL-05]-Tax currency code MUST be coded using ISO code list 4217 alpha-3
Explanation and fix
What this rule requires
The rule requires cbc:TaxCurrencyCode (UBL) or ram:TaxCurrencyCode (CII) to hold an ISO 4217 alpha-3 currency code from the list accepted by BR-CL-05. It passes only when the normalized value is exactly one of the 178 listed codes, for example EUR, USD, or GBP. A document fails if the element is empty, contains only whitespace, has an internal space, or uses a code not on that list.
How to fix
Put a valid ISO 4217 alpha-3 currency code in the tax currency field, such as EUR, USD, or GBP. Ensure the value has no internal spaces (surrounding whitespace is ignored by the rule) and is not empty or only whitespace. Check that the code is present in the BR-CL-05 list; if the current code is something else, replace it with the correct three-letter ISO 4217 code.
BR-CL-05 rule detailsBefore · 2.3.0
((not(contains(normalize-space(.), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ZWL ', concat(' ', normalize-space(.), ' '))))After · 2.4.0
((not(contains(normalize-space(.), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ', concat(' ', normalize-space(.), ' '))))BR-AG-06Test expression rewritten
Allowance VAT rate test widened to include "0"
The comparison operator in the test expression changed from greater-than to greater-than-or-equal-to. Previously the condition required a value greater than zero; it now also includes zero. This matches the rule message, which states the rate shall be 0 or greater than zero.
fatalbusiness
Original rule text: [BR-AG-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IPSI" the Document level allowance VAT rate (BT-96) shall be 0 (zero) or greater than zero.
Explanation and fix
What this rule requires
This is a fatal rule for a document-level allowance (BG-20). In UBL it applies to cac:AllowanceCharge[cbc:ChargeIndicator=false()]/cac:TaxCategory where cbc:ID is 'M' and the VAT scheme is 'VAT'; the VAT rate element cbc:Percent must be present and greater than or equal to 0. In CII it applies to ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()]/ram:CategoryTradeTax where ram:CategoryCode is 'M' and ram:TypeCode is 'VAT'; ram:RateApplicablePercent must be present and greater than or equal to 0. The rule message says the VAT category code is 'IPSI' (BT-95), but the test actually selects code 'M', so the test does not check 'IPSI'.
How to fix
For the allowance with VAT category code 'M' (the code selected by the test), make sure the rate element is present and non-negative. In UBL set cbc:Percent to 0 or a positive number inside the cac:TaxCategory with cbc:ID='M'. In CII set ram:RateApplicablePercent to 0 or a positive number inside ram:CategoryTradeTax with ram:CategoryCode='M'. If your invoice uses category 'IPSI', verify whether your system maps it to 'M'; the rule as implemented only checks 'M'.
BR-AG-06 rule detailsBefore · 2.3.0
ram:RateApplicablePercent > 0After · 2.4.0
ram:RateApplicablePercent >= 0BR-AG-07Test expression rewritten
VAT rate comparison now includes "0"
The rule requires the VAT rate to be "0" or greater. The comparison changed from greater than "0" to greater than or equal to "0", so the lower bound now includes "0". No other part of the condition changed.
fatalbusiness
Original rule text: [BR-AG-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IPSI" the Document level charge VAT rate (BT-103) shall be 0 (zero) or greater than zero.
Explanation and fix
What this rule requires
In UBL, for a cac:AllowanceCharge with cbc:ChargeIndicator=true(), the rule checks each cac:TaxCategory that has cbc:ID equal to M and a VAT tax scheme; its cbc:Percent must be 0 or greater (>= 0). In CII, for a ram:SpecifiedTradeAllowanceCharge with ram:ChargeIndicator/udt:Indicator=true(), it checks ram:CategoryTradeTax with ram:CategoryCode = 'M' and ram:TypeCode VAT (case-insensitive); its ram:RateApplicablePercent must be >= 0. The rule's message says the category code is IPSI, but the test in both syntaxes selects code M. The test only enforces a non-negative numeric rate; a missing rate or a negative value causes a fatal validation error.
How to fix
Set the cbc:Percent (UBL) or ram:RateApplicablePercent (CII) on the charge's tax category to a numeric value 0 or greater, e.g. 0, 5, 19. Remove any negative value or ensure the element exists. If your invoice uses a category code IPSI that is not mapped to M, the rule as written will not apply; check the code mapping used by the sender to match the test's expectation (M).
BR-AG-07 rule detailsBefore · 2.3.0
ram:RateApplicablePercent > 0After · 2.4.0
ram:RateApplicablePercent >= 0BR-CL-07Test expression rewritten
The rule's allowed scheme identifiers gained "AXU".
The test expression contains a fixed list of allowed scheme identifier codes, and the value must have no spaces and appear in that list. Between the published 2.3.0 and 2.4.0 expressions, the only change is the addition of the code "AXU" immediately after "AXS". No listed code was removed, and the surrounding no-space condition is unchanged.
fatalbusiness
Original rule text: [BR-CL-07]-Object identifier identification scheme identifier MUST be coded using a restriction of UNTDID 1153.
Explanation and fix
What this rule requires
The rule requires that for an object identifier (in UBL, cac:AdditionalDocumentReference[cbc:DocumentTypeCode = '130']/cbc:ID[@schemeID] or cac:DocumentReference[cbc:DocumentTypeCode = '130']/cbc:ID[@schemeID]; in CII, ram:ReferenceTypeCode), the identification scheme identifier must be a code from a restricted list of UNTDID 1153 values and must not contain any spaces. The test normalizes whitespace and checks that the value contains no space and is one of the allowed codes. Because the rule is fatal, a document that does not satisfy these conditions fails validation.
How to fix
Set the scheme identifier to an allowed code from the UNTDID 1153 list. In UBL, change the schemeID attribute on cbc:ID; in CII, change the ram:ReferenceTypeCode element. The value must be one of the codes accepted by the test (e.g., AAA, AAB, AC, ZZZ) and must not contain spaces. Leading/trailing whitespace is ignored, but internal spaces are not allowed. If the current value is not in the list or has spaces, replace it with a correct code for the identifier scheme; check the UNTDID 1153 code list if unsure.
BR-CL-07 rule detailsBefore · 2.3.0
((not(contains(normalize-space(.), ' ')) and contains(' AAA AAB AAC AAD AAE AAF AAG AAH AAI AAJ AAK AAL AAM AAN AAO AAP AAQ AAR AAS AAT AAU AAV AAW AAX AAY AAZ ABA ABB ABC ABD ABE ABF ABG ABH ABI ABJ ABK ABL ABM ABN ABO ABP ABQ ABR ABS ABT ABU ABV ABW ABX ABY ABZ AC ACA ACB ACC ACD ACE ACF ACG ACH ACI ACJ ACK ACL ACN ACO ACP ACQ ACR ACT ACU ACV ACW ACX ACY ACZ ADA ADB ADC ADD ADE ADF ADG ADI ADJ ADK ADL ADM ADN ADO ADP ADQ ADT ADU ADV ADW ADX ADY ADZ AE AEA AEB AEC AED AEE AEF AEG AEH AEI AEJ AEK AEL AEM AEN AEO AEP AEQ AER AES AET AEU AEV AEW AEX AEY AEZ AF AFA AFB AFC AFD AFE AFF AFG AFH AFI AFJ AFK AFL AFM AFN AFO AFP AFQ AFR AFS AFT AFU AFV AFW AFX AFY AFZ AGA AGB AGC AGD AGE AGF AGG AGH AGI AGJ AGK AGL AGM AGN AGO AGP AGQ AGR AGS AGT AGU AGV AGW AGX AGY AGZ AHA AHB AHC AHD AHE AHF AHG AHH AHI AHJ AHK AHL AHM AHN AHO AHP AHQ AHR AHS AHT AHU AHV AHX AHY AHZ AIA AIB AIC AID AIE AIF AIG AIH AII AIJ AIK AIL AIM AIN AIO AIP AIQ AIR AIS AIT AIU AIV AIW AIX AIY AIZ AJA AJB AJC AJD AJE AJF AJG AJH AJI AJJ AJK AJL AJM AJN AJO AJP AJQ AJR AJS AJT AJU AJV AJW AJX AJY AJZ AKA AKB AKC AKD AKE AKF AKG AKH AKI AKJ AKK AKL AKM AKN AKO AKP AKQ AKR AKS AKT AKU AKV AKW AKX AKY AKZ ALA ALB ALC ALD ALE ALF ALG ALH ALI ALJ ALK ALL ALM ALN ALO ALP ALQ ALR ALS ALT ALU ALV ALW ALX ALY ALZ AMA AMB AMC AMD AME AMF AMG AMH AMI AMJ AMK AML AMM AMN AMO AMP AMQ AMR AMS AMT AMU AMV AMW AMX AMY AMZ ANA ANB ANC AND ANE ANF ANG ANH ANI ANJ ANK ANL ANM ANN ANO ANP ANQ ANR ANS ANT ANU ANV ANW ANX ANY AOA AOD AOE AOF AOG AOH AOI AOJ AOK AOL AOM AON AOO AOP AOQ AOR AOS AOT AOU AOV AOW AOX AOY AOZ AP APA APB APC APD APE APF APG APH API APJ APK APL APM APN APO APP APQ APR APS APT APU APV APW APX APY APZ AQA AQB AQC AQD AQE AQF AQG AQH AQI AQJ AQK AQL AQM AQN AQO AQP AQQ AQR AQS AQT AQU AQV AQW AQX AQY AQZ ARA ARB ARC ARD ARE ARF ARG ARH ARI ARJ ARK ARL ARM ARN ARO ARP ARQ ARR ARS ART ARU ARV ARW ARX ARY ARZ ASA ASB ASC ASD ASE ASF ASG ASH ASI ASJ ASK ASL ASM ASN ASO ASP ASQ ASR ASS AST ASU ASV ASW ASX ASY ASZ ATA ATB ATC ATD ATE ATF ATG ATH ATI ATJ ATK ATL ATM ATN ATO ATP ATQ ATR ATS ATT ATU ATV ATW ATX ATY ATZ AU AUA AUB AUC AUD AUE AUF AUG AUH AUI AUJ AUK AUL AUM AUN AUO AUP AUQ AUR AUS AUT AUU AUV AUW AUX AUY AUZ AV AVA AVB AVC AVD AVE AVF AVG AVH AVI AVJ AVK AVL AVM AVN AVO AVP AVQ AVR AVS AVT AVU AVV AVW AVX AVY AVZ AWA AWB AWC AWD AWE AWF AWG AWH AWI AWJ AWK AWL AWM AWN AWO AWP AWQ AWR AWS AWT AWU AWV AWW AWX AWY AWZ AXA AXB AXC AXD AXE AXF AXG AXH AXI AXJ AXK AXL AXM AXN AXO AXP AXQ AXR AXS BA BC BD BE BH BM BN BO BR BT BTP BW CAS CAT CAU CAV CAW CAX CAY CAZ CBA CBB CD CEC CED CFE CFF CFO CG CH CK CKN CM CMR CN CNO COF CP CR CRN CS CST CT CU CV CW CZ DA DAN DB DI DL DM DQ DR EA EB ED EE EEP EI EN EQ ER ERN ET EX FC FF FI FLW FN FO FS FT FV FX GA GC GD GDN GN HS HWB IA IB ICA ICE ICO II IL INB INN INO IP IS IT IV JB JE LA LAN LAR LB LC LI LO LRC LS MA MB MF MG MH MR MRN MS MSS MWB NA NF OH OI ON OP OR PB PC PD PE PF PI PK PL POR PP PQ PR PS PW PY RA RC RCN RE REN RF RR RT SA SB SD SE SEA SF SH SI SM SN SP SQ SRN SS STA SW SZ TB TCR TE TF TI TIN TL TN TP UAR UC UCN UN UO URI VA VC VGR VM VN VON VOR VP VR VS VT VV WE WM WN WR WS WY XA XC XP ZZZ ', concat(' ', normalize-space(.), ' '))))After · 2.4.0
((not(contains(normalize-space(.), ' ')) and contains(' AAA AAB AAC AAD AAE AAF AAG AAH AAI AAJ AAK AAL AAM AAN AAO AAP AAQ AAR AAS AAT AAU AAV AAW AAX AAY AAZ ABA ABB ABC ABD ABE ABF ABG ABH ABI ABJ ABK ABL ABM ABN ABO ABP ABQ ABR ABS ABT ABU ABV ABW ABX ABY ABZ AC ACA ACB ACC ACD ACE ACF ACG ACH ACI ACJ ACK ACL ACN ACO ACP ACQ ACR ACT ACU ACV ACW ACX ACY ACZ ADA ADB ADC ADD ADE ADF ADG ADI ADJ ADK ADL ADM ADN ADO ADP ADQ ADT ADU ADV ADW ADX ADY ADZ AE AEA AEB AEC AED AEE AEF AEG AEH AEI AEJ AEK AEL AEM AEN AEO AEP AEQ AER AES AET AEU AEV AEW AEX AEY AEZ AF AFA AFB AFC AFD AFE AFF AFG AFH AFI AFJ AFK AFL AFM AFN AFO AFP AFQ AFR AFS AFT AFU AFV AFW AFX AFY AFZ AGA AGB AGC AGD AGE AGF AGG AGH AGI AGJ AGK AGL AGM AGN AGO AGP AGQ AGR AGS AGT AGU AGV AGW AGX AGY AGZ AHA AHB AHC AHD AHE AHF AHG AHH AHI AHJ AHK AHL AHM AHN AHO AHP AHQ AHR AHS AHT AHU AHV AHX AHY AHZ AIA AIB AIC AID AIE AIF AIG AIH AII AIJ AIK AIL AIM AIN AIO AIP AIQ AIR AIS AIT AIU AIV AIW AIX AIY AIZ AJA AJB AJC AJD AJE AJF AJG AJH AJI AJJ AJK AJL AJM AJN AJO AJP AJQ AJR AJS AJT AJU AJV AJW AJX AJY AJZ AKA AKB AKC AKD AKE AKF AKG AKH AKI AKJ AKK AKL AKM AKN AKO AKP AKQ AKR AKS AKT AKU AKV AKW AKX AKY AKZ ALA ALB ALC ALD ALE ALF ALG ALH ALI ALJ ALK ALL ALM ALN ALO ALP ALQ ALR ALS ALT ALU ALV ALW ALX ALY ALZ AMA AMB AMC AMD AME AMF AMG AMH AMI AMJ AMK AML AMM AMN AMO AMP AMQ AMR AMS AMT AMU AMV AMW AMX AMY AMZ ANA ANB ANC AND ANE ANF ANG ANH ANI ANJ ANK ANL ANM ANN ANO ANP ANQ ANR ANS ANT ANU ANV ANW ANX ANY AOA AOD AOE AOF AOG AOH AOI AOJ AOK AOL AOM AON AOO AOP AOQ AOR AOS AOT AOU AOV AOW AOX AOY AOZ AP APA APB APC APD APE APF APG APH API APJ APK APL APM APN APO APP APQ APR APS APT APU APV APW APX APY APZ AQA AQB AQC AQD AQE AQF AQG AQH AQI AQJ AQK AQL AQM AQN AQO AQP AQQ AQR AQS AQT AQU AQV AQW AQX AQY AQZ ARA ARB ARC ARD ARE ARF ARG ARH ARI ARJ ARK ARL ARM ARN ARO ARP ARQ ARR ARS ART ARU ARV ARW ARX ARY ARZ ASA ASB ASC ASD ASE ASF ASG ASH ASI ASJ ASK ASL ASM ASN ASO ASP ASQ ASR ASS AST ASU ASV ASW ASX ASY ASZ ATA ATB ATC ATD ATE ATF ATG ATH ATI ATJ ATK ATL ATM ATN ATO ATP ATQ ATR ATS ATT ATU ATV ATW ATX ATY ATZ AU AUA AUB AUC AUD AUE AUF AUG AUH AUI AUJ AUK AUL AUM AUN AUO AUP AUQ AUR AUS AUT AUU AUV AUW AUX AUY AUZ AV AVA AVB AVC AVD AVE AVF AVG AVH AVI AVJ AVK AVL AVM AVN AVO AVP AVQ AVR AVS AVT AVU AVV AVW AVX AVY AVZ AWA AWB AWC AWD AWE AWF AWG AWH AWI AWJ AWK AWL AWM AWN AWO AWP AWQ AWR AWS AWT AWU AWV AWW AWX AWY AWZ AXA AXB AXC AXD AXE AXF AXG AXH AXI AXJ AXK AXL AXM AXN AXO AXP AXQ AXR AXS AXU BA BC BD BE BH BM BN BO BR BT BTP BW CAS CAT CAU CAV CAW CAX CAY CAZ CBA CBB CD CEC CED CFE CFF CFO CG CH CK CKN CM CMR CN CNO COF CP CR CRN CS CST CT CU CV CW CZ DA DAN DB DI DL DM DQ DR EA EB ED EE EEP EI EN EQ ER ERN ET EX FC FF FI FLW FN FO FS FT FV FX GA GC GD GDN GN HS HWB IA IB ICA ICE ICO II IL INB INN INO IP IS IT IV JB JE LA LAN LAR LB LC LI LO LRC LS MA MB MF MG MH MR MRN MS MSS MWB NA NF OH OI ON OP OR PB PC PD PE PF PI PK PL POR PP PQ PR PS PW PY RA RC RCN RE REN RF RR RT SA SB SD SE SEA SF SH SI SM SN SP SQ SRN SS STA SW SZ TB TCR TE TF TI TIN TL TN TP UAR UC UCN UN UO URI VA VC VGR VM VN VON VOR VP VR VS VT VV WE WM WN WR WS WY XA XC XP ZZZ ', concat(' ', normalize-space(.), ' '))))BR-CL-10Test expression rewritten
Allowed scheme identifiers now include "0239" and "0240".
The rule checks that the scheme identifier is one of the ISO 6523 ICD codes using a space-delimited list. The previous list ended at "0238". The updated list appends "0239" and "0240", so these two codes are now accepted. No other condition changed.
fatalbusiness
Original rule text: [BR-CL-10]-Any identifier identification scheme identifier MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
The rule requires the @schemeID attribute on the identifier in cac:PartyIdentification/cbc:ID (UBL) or ram:GlobalID (CII, excluding elements under ram:SpecifiedTradeProduct or ram:ShipToTradeParty) to be a code from the ISO 6523 ICD list. For UBL only, the value SEPA is also accepted if the element is within an cac:AccountingSupplierParty or cac:PayeeParty. If the attribute is present but empty or whitespace-only, contains a space, or is not one of the allowed values, the document fails validation.
How to fix
Set @schemeID to a valid ISO 6523 ICD code, for example 0002, 0003, 0088, or any other code from the rule's accepted list. In UBL, if the scheme must be SEPA, use exactly SEPA and ensure the identifier is inside an cac:AccountingSupplierParty or cac:PayeeParty. Check the current value for typos, extra spaces, or a code outside the allowed list.
BR-CL-10 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 ', concat(' ', normalize-space(@schemeID), ' '))))After · 2.4.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 ', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-11Test expression rewritten
Permitted ISO 6523 scheme identifier codes now include "0239" and "0240"
The registration identifier identification scheme identifier is checked against a space-delimited list of permitted ISO 6523 ICD codes. That list now includes "0239" and "0240" after "0238", where before the change it ended at "0238". The rule's stated requirement is unchanged: any registration identifier identification scheme identifier MUST be coded using one of the ISO 6523 ICD list.
fatalbusiness
Original rule text: [BR-CL-11]-Any registration identifier identification scheme identifier MUST be coded using one of the ISO 6523 ICD list.
Explanation and fix
What this rule requires
The rule requires that the @schemeID of cac:PartyLegalEntity/cbc:CompanyID (UBL) or ram:ID outside ram:SpecifiedTaxRegistration (CII) is coded using one of the ISO 6523 ICD identifiers. The test checks that the normalized value contains no spaces and matches one of the four-digit codes listed in the rule. A document fails when the @schemeID is missing, blank, contains spaces, or has a code not present in that list.
How to fix
Set the @schemeID attribute to a valid four-digit code from the ISO 6523 ICD list accepted by the rule, such as 0002 or 0003, without spaces. Check the exact code used against the codes listed in the rule.
BR-CL-11 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 ', concat(' ', normalize-space(@schemeID), ' '))))After · 2.4.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 ', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-04Test expression rewritten
Currency code test drops "ZWL" from allowed codes
The rule's test now omits "ZWL" from the embedded list of allowed currency codes. Before, the list ended with "ZWG ZWL"; after, it ends with "ZWG". The test otherwise still requires a single token with no internal spaces and still checks membership in the list.
fatalbusiness
Original rule text: [BR-CL-04]-Invoice currency code MUST be coded using ISO code list 4217 alpha-3
Explanation and fix
What this rule requires
The rule requires the invoice currency code to be a valid ISO 4217 alpha-3 currency code. It checks that the code contains no spaces and appears in the rule's list of accepted currency codes. A document fails if cbc:DocumentCurrencyCode (UBL) or ram:InvoiceCurrencyCode (CII) is empty, contains whitespace, or is not one of the listed codes.
How to fix
Set the currency code element to a three-letter ISO 4217 code from the list allowed by the rule, for example EUR, USD, or GBP. In UBL use cbc:DocumentCurrencyCode; in CII use ram:InvoiceCurrencyCode. Ensure the value contains no spaces.
BR-CL-04 rule detailsBefore · 2.3.0
((not(contains(normalize-space(.), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ZWL ', concat(' ', normalize-space(.), ' '))))After · 2.4.0
((not(contains(normalize-space(.), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ', concat(' ', normalize-space(.), ' '))))BR-CL-26Test expression rewritten
Delivery location scheme identifier list adds ISO 6523 codes "0239" and "0240"
The rule accepts a delivery location identifier only if its scheme identifier is one of the listed ISO 6523 ICD codes. The list changed from ending at "0238" to ending at "0240", adding "0239" and "0240" to the accepted values. The other listed codes are unchanged.
fatalbusiness
Original rule text: [BR-CL-26]-Delivery location identifier scheme identifier MUST belong to the ISO 6523 ICD code list
Explanation and fix
What this rule requires
The rule requires that the schemeID attribute on the delivery location identifier (cac:DeliveryLocation/cbc:ID[@schemeID]) be one of the ISO 6523 ICD codes listed in the rule, with no spaces inside the value. The test rejects any value whose normalized form contains a space or is not in the embedded list. Since this is a fatal rule, an invoice with any other schemeID fails validation.
How to fix
Set the schemeID attribute to a code from the ISO 6523 ICD list, for example 0088, and ensure it has no internal spaces or whitespace. If you are unsure which code applies, check the identifier scheme used for the delivery location.
BR-CL-26 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 ', concat(' ', normalize-space(@schemeID), ' '))))After · 2.4.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 ', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-13Test expression rewritten
The UNTDID 7143 list adds "PPI" to the allowed codes
The list of allowed UNTDID 7143 codes changed. The new list adds "PPI" between "PO" and "PV"; the previous list had "PO" followed directly by "PV". The rest of the condition is unchanged: the value being checked must contain no spaces and be present as a space-padded token in the allowed-code list.
fatalbusiness
Original rule text: [BR-CL-13]-Item classification identifier identification scheme identifier MUST be coded using one of the UNTDID 7143 list.
Explanation and fix
What this rule requires
The rule checks the item classification identifier scheme identifier in cac:CommodityClassification/cbc:ItemClassificationCode[@listID] (UBL) or ram:ClassCode[@listID] (CII). After surrounding whitespace is ignored, the value must not contain any internal space and must exactly match one of the 185 listed UNTDID 7143 codes, for example AA, AB, AC, EN, or ZZZ. A missing value, a value with internal spaces, or any value not in that list violates this fatal rule.
How to fix
Set the listID attribute to a valid UNTDID 7143 code from the rule's list, e.g. AA, AB, AC, EN, or ZZZ. The value may have leading or trailing whitespace, but after trimming it must be exactly one of those 185 codes and contain no internal spaces. If you do not know which code applies to the item classification, check the UNTDID 7143 list for the correct scheme identifier.
BR-CL-13 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@listID), ' ')) and contains(' AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT BU BV BW BX BY BZ CC CG CL CR CV DR DW EC EF EMD EN FS GB GN GMN GS HS IB IN IS IT IZ MA MF MN MP NB ON PD PL PO PV QS RC RN RU RY SA SG SK SN SRS SRT SRU SRV SRW SRX SRY SRZ SS SSA SSB SSC SSD SSE SSF SSG SSH SSI SSJ SSK SSL SSM SSN SSO SSP SSQ SSR SSS SST SSU SSV SSW SSX SSY SSZ ST STA STB STC STD STE STF STG STH STI STJ STK STL STM STN STO STP STQ STR STS STT STU STV STW STX STY STZ SUA SUB SUC SUD SUE SUF SUG SUH SUI SUJ SUK SUL SUM TG TSN TSO TSP TSQ TSR TSS TST TSU UA UP VN VP VS VX ZZZ ', concat(' ', normalize-space(@listID), ' '))))After · 2.4.0
((not(contains(normalize-space(@listID), ' ')) and contains(' AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT BU BV BW BX BY BZ CC CG CL CR CV DR DW EC EF EMD EN FS GB GN GMN GS HS IB IN IS IT IZ MA MF MN MP NB ON PD PL PO PPI PV QS RC RN RU RY SA SG SK SN SRS SRT SRU SRV SRW SRX SRY SRZ SS SSA SSB SSC SSD SSE SSF SSG SSH SSI SSJ SSK SSL SSM SSN SSO SSP SSQ SSR SSS SST SSU SSV SSW SSX SSY SSZ ST STA STB STC STD STE STF STG STH STI STJ STK STL STM STN STO STP STQ STR STS STT STU STV STW STX STY STZ SUA SUB SUC SUD SUE SUF SUG SUH SUI SUJ SUK SUL SUM TG TSN TSO TSP TSQ TSR TSS TST TSU UA UP VN VP VS VX ZZZ ', concat(' ', normalize-space(@listID), ' '))))BR-CL-21Test expression rewritten
Permitted scheme identifier list gains "0239" and "0240"
The updated expression adds "0239" and "0240" to the end of the ISO 6523 ICD code list, which previously ended at "0238". The rest of the condition is unchanged: the scheme identifier must contain no spaces and must match one of the listed codes. No other part of the expression changed.
fatalbusiness
Original rule text: [BR-CL-21]-Item standard identifier scheme identifier MUST belong to the ISO 6523 ICD code list
Explanation and fix
What this rule requires
The rule requires that the scheme identifier in the item standard identifier (cac:StandardItemIdentification/cbc:ID[@schemeID] in UBL, or ram:SpecifiedTradeProduct/ram:GlobalID[@schemeID] in CII) be exactly one code from the ISO 6523 ICD code list. The test checks that the value does not contain a space and matches one of the listed codes such as 0088, 0160, or 0248. Because the severity is fatal, a value that contains a space or is not among the listed codes causes the document to fail validation.
How to fix
Set the @schemeID attribute to a valid ISO 6523 ICD code from the rule's list, with no spaces inside the value. For example, use 0088 if that is the correct scheme for the item identifier. If the current value is not in the list, look up the correct ISO 6523 ICD code for the identifier scheme in use.
BR-CL-21 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 ', concat(' ', normalize-space(@schemeID), ' '))))After · 2.4.0
((not(contains(normalize-space(@schemeID), ' ')) and contains(' 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 ', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-03Test expression rewritten
Currency code "ZWL" removed from the allowed list
The test's condition is unchanged except for the set of accepted currency codes. Before, the space-padded list of ISO 4217 alpha-3 codes ended with "ZMW ZWG ZWL"; after, it ends with "ZMW ZWG", so the value "ZWL" is no longer accepted. The check still requires the currency identifier to have no spaces and to appear in that list.
fatalbusiness
Original rule text: [BR-CL-03]-currencyID MUST be coded using ISO code list 4217 alpha-3
Explanation and fix
What this rule requires
The rule requires that the @currencyID attribute on amount elements (UBL) or on ram:TaxTotalAmount (CII) contains an ISO 4217 alpha-3 currency code from the list accepted by the rule, and that the code contains no spaces. Because the severity is fatal, an invoice that does not satisfy this condition is rejected with message [BR-CL-03]-currencyID MUST be coded using ISO code list 4217 alpha-3.
How to fix
Set the currencyID attribute to a valid three-letter ISO 4217 alpha-3 code that appears in the rule's list, for example EUR or USD. Ensure the value is not empty and contains no spaces. In UBL this applies to amount elements such as cbc:TaxAmount; in CII it applies to ram:TaxTotalAmount[@currencyID]. If the current value is not a valid code, correct it in the source system.
BR-CL-03 rule detailsBefore · 2.3.0
((not(contains(normalize-space(@currencyID), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ZWL ', concat(' ', normalize-space(@currencyID), ' '))))After · 2.4.0
((not(contains(normalize-space(@currencyID), ' ')) and contains(' AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BOV BRL BSD BTN BWP BYN BZD CAD CDF CHE CHF CHW CLF CLP CNY COP COU CRC CUC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRO MUR MVR MWK MXN MXV MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STD SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD USN UYI UYU UZS VES VED VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XOF XPD XPF XPT XSU XTS XUA XXX YER ZAR ZMW ZWG ', concat(' ', normalize-space(@currencyID), ' '))))BR-CL-01Test expression rewritten
Seven additional UNTDID 1001 document type codes are now allowed
The set of allowed document type codes now includes seven additional exact codes: "471", "472", "473", "500", "501", "502", and "503". These codes were not present in the previous list. The value still must contain no internal spaces and must match one of the listed codes.
fatalbusiness
Original rule text: [BR-CL-01]-The document type code MUST be coded by the invoice and credit note related code lists of UNTDID 1001.
Explanation and fix
What this rule requires
BR-CL-01 requires the document type code to be exactly one of the UNTDID 1001 codes allowed by the rule. For UBL, cbc:InvoiceTypeCode must contain one of the invoice-related codes, and cbc:CreditNoteTypeCode must contain one of the credit-note-related codes. For CII, rsm:ExchangedDocument/ram:TypeCode must contain one of the combined list. The value must not contain any space; after trimming whitespace it must be a single token. A missing, empty, or non-listed value fails this fatal rule.
How to fix
Set the document type code element to an allowed code. For UBL cbc:InvoiceTypeCode, use an invoice-related code such as 380, 384, or 389. For UBL cbc:CreditNoteTypeCode, use a credit-note-related code such as 381, 396, or 420. For CII rsm:ExchangedDocument/ram:TypeCode, use any allowed code, for example 380 or 381. Ensure the value has no internal spaces; leading/trailing whitespace is ignored.
BR-CL-01 rule detailsBefore · 2.3.0
((not(contains(normalize-space(.), ' ')) and contains(' 71 80 81 82 83 84 102 130 202 203 204 211 218 219 261 262 295 296 308 325 326 331 380 381 382 383 384 385 386 387 388 389 390 393 394 395 396 420 456 457 458 527 532 553 575 623 633 751 780 817 870 875 876 877 935 ', concat(' ', normalize-space(.), ' '))))After · 2.4.0
((not(contains(normalize-space(.), ' ')) and contains(' 71 80 81 82 83 84 102 130 202 203 204 211 218 219 261 262 295 296 308 325 326 331 380 381 382 383 384 385 386 387 388 389 390 393 394 395 396 420 456 457 458 471 472 473 500 501 502 503 527 532 553 575 623 633 751 780 817 870 875 876 877 935 ', concat(' ', normalize-space(.), ' '))))BR-DE-21Test expression rewritten
The rule now also accepts specification identifier "$XR-CVD-ID"
The test expression previously compared the specification identifier to "$XR-CIUS-ID" or "$XR-EXTENSION-ID". It now also compares it to "$XR-CVD-ID", widening the accepted alternatives from two to three. The rule message still states that the "Specification identifier" should syntactically correspond to the identifier of the XRechnung standard.
warningcountry
Original rule text: [BR-DE-21] Das Element "Specification identifier" (BT-24) soll syntaktisch der Kennung des Standards XRechnung entsprechen.
Explanation and fix
What this rule requires
This warning checks that the specification identifier (BT-24) is one of the accepted XRechnung identifiers. In UBL this is cbc:CustomizationID; in CII it is ram:GuidelineSpecifiedDocumentContextParameter/ram:ID. The rule accepts one of three values: the XRechnung CIUS identifier, the XRechnung extension identifier, or the XRechnung CVD identifier. Because severity is warning, the document is not rejected, but the validator reports that the identifier does not syntactically match one of these expected XRechnung identifiers.
How to fix
Set the specification identifier field to the exact identifier that applies to the XRechnung version being used. It must be one of the rule's accepted patterns: urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_<version>, the same with #conformant#urn:xeinkauf.de:kosit:extension:xrechnung_<version>, or the CVD variant ...xrechnung_<version>#compliant#urn:xeinkauf.de:kosit:xrechnung:cvd_<cvd-version>. For UBL, change cbc:CustomizationID; for CII, change ram:GuidelineSpecifiedDocumentContextParameter/ram:ID.
BR-DE-21 rule detailsBefore · 2.3.0
ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = $XR-CIUS-ID or ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = $XR-EXTENSION-IDAfter · 2.4.0
ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = $XR-CIUS-ID or ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = $XR-EXTENSION-ID or ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = $XR-CVD-IDBR-DE-CVD-01New rule
New rule requires "Contract reference" (BT-12) to be transmitted.
The rule set gains a new check. Its message states that the element "Contract reference" (BT-12) must be transmitted. The test requires the contract reference to have a non-empty assigned identifier after whitespace removal. No corresponding check existed in published 2.3.0.
fatalcountry
Original rule text: [BR-DE-CVD-01] Das Element "Contract reference" (BT-12) muss übermittelt werden.
Explanation and fix
What this rule requires
The rule requires that a "Contract reference" (BT-12) is transmitted, with a non-empty identifier. In UBL this means cac:ContractDocumentReference/cbc:ID, and in CII it means ram:ContractReferencedDocument/ram:IssuerAssignedID, each with a value that is not empty or only whitespace. The document fails because no such element with a non-whitespace value is present.
How to fix
Add at least one cac:ContractDocumentReference containing a cbc:ID with the contract identifier (for UBL), or at least one ram:ContractReferencedDocument containing ram:IssuerAssignedID with the contract identifier (for CII). The value must not be empty or whitespace-only.
BR-DE-CVD-01 rule detailsAdded · 2.4.0
ram:ContractReferencedDocument/ram:IssuerAssignedID[boolean(normalize-space(.))]BR-TMP-CVD-01New rule
New rule requires the item classification identifier scheme to be from "UNTDID 7143".
The rule is new in this comparison and adds a check on the scheme used for the item classification identifier (BT-158). The check requires the declared list identifier to contain no spaces and to match a code in $UNTDID-7143-CVD-CODES after surrounding the normalized value with spaces. The rule message states that the scheme must be chosen from the "UNTDID 7143" code list.
fatalbusiness
Original rule text: [BR-TMP-CVD-01] Das Bildungsschema für "Item classification identifier" (BT-158) ist aus der Codeliste UNTDID 7143 zu wählen.
Explanation and fix
What this rule requires
The rule requires that the scheme identifier for the item classification identifier (BT-158) is specified using the listID attribute on cbc:ItemClassificationCode in UBL or ram:ClassCode in CII, and that its value is one of the codes from the UNTDID 7143 code list as defined in the rule. The test checks that after trimming whitespace, the listID contains no spaces and exactly matches one of the space-separated codes in $UNTDID-7143-CVD-CODES (for example CVD, AA, AB). A document fails if the attribute is missing, empty, contains spaces, or has a value not in that list.
How to fix
In UBL, set the listID attribute on cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode to one of the allowed UNTDID 7143 codes, e.g. CVD. In CII, set listID on ram:SpecifiedTradeProduct/ram:DesignatedProductClassification/ram:ClassCode similarly. Ensure the attribute contains exactly one code with no spaces around or inside it.
BR-TMP-CVD-01 rule detailsAdded · 2.4.0
((not(contains(normalize-space(@listID), ' ')) and contains($UNTDID-7143-CVD-CODES, concat(' ', normalize-space(@listID), ' '))))BR-DE-CVD-04New rule
New rule requires item classification identifiers with scheme identifier "CVD" to use allowed vehicle categories.
The rule is new in version 2.4.0. It applies to an "Item classification identifier" whose scheme identifier is "CVD": the identifier's value must belong to the list of permitted vehicle categories referenced by the variable "$CVD-VEHICLE-CATEGORY". The rule message states this requirement in German.
fatalcountry
Original rule text: [BR-DE-CVD-04] Ein "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' muss einen Wert aus der Liste der zulässigen Fahrzeugkategorien enthalten.
Explanation and fix
What this rule requires
The rule checks each invoice or credit note line item's ItemClassificationCode (BT-158). When the classification scheme identifier (@listID) is 'CVD', the code value must be one of the allowed vehicle categories: M1, M2, M3, N1, N2, N3. If the list identifier is not 'CVD', the rule does not restrict the value. A document is rejected when the list identifier is 'CVD' and the code is not one of those six values.
How to fix
Set the text of the item classification code to one of M1, M2, M3, N1, N2, N3 when the @listID attribute is 'CVD'. If the classification is not a CVD vehicle category, correct the @listID to the appropriate scheme identifier or remove the 'CVD' list identifier so the rule does not apply.
BR-DE-CVD-04 rule detailsAdded · 2.4.0
not(normalize-space(@listID) = 'CVD') or normalize-space(.) = $CVD-VEHICLE-CATEGORYBR-TMP-3New rule
New rule requires matching price basis quantities and unit codes
The rule has been added. It applies when both the net price basis quantity and the gross price basis quantity are present. In that case, the two quantity values must be equal and the two unit codes must be equal. If only one of the two is present, the check does not apply. No equivalent requirement existed in the previous version.
fatalbusiness
Original rule text: [BR-TMP-3] If both elements to which BT-149 and BT-150 can be mapped are present, both must be equal.
BR-TMP-3 rule detailsAdded · 2.4.0
not(./ram:NetPriceProductTradePrice/ram:BasisQuantity and ./ram:GrossPriceProductTradePrice/ram:BasisQuantity) or (./ram:NetPriceProductTradePrice/ram:BasisQuantity = ./ram:GrossPriceProductTradePrice/ram:BasisQuantity and ./ram:NetPriceProductTradePrice/ram:BasisQuantity/@unitCode = ./ram:GrossPriceProductTradePrice/ram:BasisQuantity/@unitCode)BR-DE-CVD-06-aNew rule
New rule requires exactly one "cva" Item attribute name for each "CVD" classification
Published 2.4.0 adds this rule. It requires that when the scheme identifier of "Item classification identifier" (BT-158) has the value "CVD", the same invoice line contains exactly one "Item attribute name" (BT-160) with the value "cva". The condition also passes when no Item classification identifier has the scheme identifier value "CVD".
fatalcountry
Original rule text: [BR-DE-CVD-06-a] Wenn der Scheme identifier von "Item classification identifier" (BT-158) mit dem Wert 'CVD' angegeben ist, muss in derselben Rechnungszeile genau ein "Item attribute name" (BT-160) mit dem Wert 'cva' vorhanden sein.
Explanation and fix
What this rule requires
For each invoice or credit note line in a CVD-type document, if the item classification identifier (BT-158) uses the scheme identifier 'CVD' (UBL: cac:CommodityClassification/cbc:ItemClassificationCode with @listID = 'CVD'), then the same item must contain exactly one item attribute name (BT-160) with the value 'cva' (UBL: cac:AdditionalItemProperty/cbc:Name = 'cva'). In CII syntax, a ram:DesignatedProductClassification/ram:ClassCode with @listID = 'CVD' requires exactly one ram:ApplicableProductCharacteristic with ram:Description = 'cva'. A line fails when it has such a CVD classification but the count of 'cva' item attributes is not exactly 1 (zero or more than one). Lines without a CVD item classification are not affected.
How to fix
Ensure that each line item containing a CVD item classification also contains exactly one item attribute named 'cva'. In UBL, set the count of cac:AdditionalItemProperty elements where cbc:Name = 'cva' to exactly 1; in CII, set the count of ram:ApplicableProductCharacteristic elements where ram:Description = 'cva' to exactly 1. In business terms, set "Item attribute name" (BT-160) to 'cva' exactly once for that line. If multiple such attributes exist, keep only one; if none exist, add one.
BR-DE-CVD-06-a rule detailsAdded · 2.4.0
not(ram:DesignatedProductClassification/ram:ClassCode/@listID = 'CVD') or count(ram:ApplicableProductCharacteristic[ram:Description = 'cva']) = 1BR-DE-CVD-02New rule
A new rule requires the tender or lot reference when the type code is "50".
The rule is new in published 2.4.0 and was not present in published 2.3.0. Its test selects additional referenced document elements whose type code is exactly "50" and requires that the issuer-assigned identifier be non-empty. The rule message states that the element "Tender or lot reference" (BT-17) must be transmitted. No earlier version of this check is described.
fatalcountry
Original rule text: [BR-DE-CVD-02] Das Element "Tender or lot reference" (BT-17) muss übermittelt werden.
Explanation and fix
What this rule requires
This fatal XRechnung rule requires that a CVD invoice or credit note includes the element "Tender or lot reference" (BT-17). In UBL, at least one cac:OriginatorDocumentReference/cbc:ID must exist with a value that is not empty or only whitespace. In CII, at least one ram:AdditionalReferencedDocument must have ram:TypeCode equal to '50' and a ram:IssuerAssignedID that is not empty or only whitespace. A document fails when no such reference or ID is present.
How to fix
Add the tender or lot reference (BT-17) to the document. In UBL, include cac:OriginatorDocumentReference/cbc:ID with a non-empty value. In CII, include ram:AdditionalReferencedDocument with ram:TypeCode set to '50' and ram:IssuerAssignedID containing the reference. If the field already exists, check that its ID is not empty or only whitespace.
BR-DE-CVD-02 rule detailsAdded · 2.4.0
ram:AdditionalReferencedDocument[normalize-space(ram:TypeCode) = '50' and normalize-space(ram:IssuerAssignedID)]BR-DE-CVD-05New rule
A new rule requires "cva" item attribute values to be an allowed code.
The rule set gains a new check between published "2.3.0" and "2.4.0". It applies when the item attribute name is "cva"; the item attribute value, after normalizing whitespace, must then match one of the codes in "$CVA-CODES". This is a new requirement, not a modification of an existing condition.
fatalcountry
Original rule text: [BR-DE-CVD-05] Wenn innerhalb von ITEM ATTRIBUTES (BG-32) der "Item attribute name" (BT-160) den Wert 'cva' hat, muss der "Item attribute value" (BT-161) einen der zulässigen Werte enthalten.
Explanation and fix
What this rule requires
In a document flagged as CVD, if an item attribute has the name cva (UBL: cac:AdditionalItemProperty/cbc:Name, CII: ram:ApplicableProductCharacteristic/ram:Description), the corresponding item attribute value (BT-161) must be one of clean, zero-emission, or other. The value is checked after ignoring surrounding whitespace. A document fails validation when the value is missing, only whitespace, or any other text.
How to fix
Set the item attribute value for the cva attribute to one of the allowed values: clean, zero-emission, or other (e.g. <cbc:Value>clean</cbc:Value> or <ram:Value>clean</ram:Value>). If the value is currently missing or different, correct it in the invoice data or in the system that produces it.
BR-DE-CVD-05 rule detailsAdded · 2.4.0
normalize-space(ram:Value) = $CVA-CODESBR-DE-CVD-06-bNew rule
New rule requires "CVD" classification when item attribute is "cva"
The rule set gains a new check. It requires that, when the item attribute name (BT-160) is exactly "cva", the same line contains exactly one item classification identifier (BT-158) whose scheme identifier is "CVD".
fatalcountry
Original rule text: [BR-DE-CVD-06-b] Wenn "Item attribute name" (BT-160) mit dem Wert 'cva' angegeben ist, muss in derselben Rechnungszeile genau ein "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' vorhanden sein.
Explanation and fix
What this rule requires
This fatal rule applies when an item has an "Item attribute name" (BT-160) equal to 'cva'. In that case, the same invoice line must contain exactly one "Item classification identifier" (BT-158) whose scheme identifier is 'CVD'. The document fails if the 'cva' property exists and the number of CVD classification identifiers is not exactly 1 (zero or more than one); if no 'cva' property exists, the rule passes.
How to fix
If the 'cva' item attribute is needed, ensure the item has exactly one cac:CommodityClassification/cbc:ItemClassificationCode with @listID = 'CVD' (UBL) or ram:DesignatedProductClassification/ram:ClassCode with @listID = 'CVD' (CII), and remove any duplicates. If the 'cva' property is not required, remove it from the item (the cac:AdditionalItemProperty with cbc:Name = 'cva' or the ram:ApplicableProductCharacteristic with ram:Description = 'cva').
BR-DE-CVD-06-b rule detailsAdded · 2.4.0
not(ram:ApplicableProductCharacteristic/ram:Description = 'cva') or count(ram:DesignatedProductClassification/ram:ClassCode[@listID = 'CVD']) = 1BR-DE-TMP-32New rule
A new rule requires "Actual delivery date", "Invoicing period", or "Invoice line period".
BR-DE-TMP-32 is new in published 2.4.0; published 2.3.0 had no such check. The rule requires either an actual delivery date in the header, a billing specified period in the header, or that every invoice line has its own billing specified period. The rule message names these as BT-72 "Actual delivery date", BG-14 "Invoicing period", and BG-26 "Invoice line period".
informationcountry
Original rule text: [BR-DE-TMP-32] Eine Rechnung sollte zur Angabe des Liefer-/Leistungsdatums entweder BT-72 "Actual delivery date", BG-14 "Invoicing period" oder in jeder Rechnungsposition BG-26 "Invoice line period" enthalten.
Explanation and fix
What this rule requires
This information rule recommends that an invoice indicate the delivery/service date. It is satisfied if at least one of the following is present: the header delivery date cbc:ActualDeliveryDate under cac:Delivery, the header invoicing period cac:InvoicePeriod, or an invoicing period in every invoice line or credit note line (cac:InvoicePeriod under each line). Because severity is information, a document that does not meet this is not rejected; the validator only reports it.
How to fix
To satisfy the recommendation, add at least one of these: cac:Delivery/cbc:ActualDeliveryDate, cac:InvoicePeriod, or ensure every cac:InvoiceLine/cac:CreditNoteLine contains cac:InvoicePeriod. If the invoice already has one of these, check that the element is in the expected location.
BR-DE-TMP-32 rule detailsAdded · 2.4.0
ram:ApplicableHeaderTradeDelivery/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime or ram:ApplicableHeaderTradeSettlement/ram:BillingSpecifiedPeriod or (every $line in ram:IncludedSupplyChainTradeLineItem satisfies $line/ram:SpecifiedLineTradeSettlement/ram:BillingSpecifiedPeriod)BR-DE-CVD-03New rule
New rule requires a "CVD"/"cva" invoice line
The rule is new in published "2.4.0". It requires each invoice to contain at least one invoice line whose item classification identifier scheme is "CVD" and whose item attribute name is "cva". The test expression matches an included supply chain trade line item where the classification code list ID is "CVD" and the applicable product characteristic description is "cva". Invoices without such a line are now rejected during validation.
fatalcountry
Original rule text: [BR-DE-CVD-03] In einer Rechnung muss mindestens eine INVOICE LINE (BG-25) enthalten sein, in der der Scheme identifier von "Item classification identifier" (BT-158) den Wert 'CVD' und der "Item attribute name" (BT-160) den Wert 'cva' enthält.
Explanation and fix
What this rule requires
The rule applies only when the document is identified as a CVD invoice or credit note via the guideline ID. In such documents, at least one invoice line or credit note line must contain an item that has both a commodity classification with @listID equal to 'CVD' and an additional item property with the name 'cva'. If no line satisfies both conditions, the document fails validation with a fatal error.
How to fix
Add the missing data to at least one line's item. In UBL, under cac:InvoiceLine/cac:Item or cac:CreditNoteLine/cac:Item, set cac:CommodityClassification/cbc:ItemClassificationCode with @listID='CVD' and add cac:AdditionalItemProperty/cbc:Name = 'cva'. In CII, in ram:SpecifiedTradeProduct of at least one ram:IncludedSupplyChainTradeLineItem, set ram:DesignatedProductClassification/ram:ClassCode with @listID='CVD' and add ram:ApplicableProductCharacteristic/ram:Description = 'cva'.
BR-DE-CVD-03 rule detailsAdded · 2.4.0
ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct[ram:DesignatedProductClassification/ram:ClassCode/@listID = 'CVD' and ram:ApplicableProductCharacteristic/ram:Description = 'cva']