BR-DEX-04Dependency changed
ISO 6523 ICD code list gains four entries; test expression unchanged
The rule's test expression is byte-identical between published 2.4.0 and 2.5.0. The changed dependency is the variable $ISO-6523-ICD-CODES; its value in 2.4.0 ends with "0240", and in 2.5.0 it ends with "0240 0241 0242 0243 0244". The test expression shown calls $ISO-6523-ICD-EXT-CODES, not $ISO-6523-ICD-CODES, and the evidence does not show a change to $ISO-6523-ICD-EXT-CODES.
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.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'After · 2.5.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 0241 0242 0243 0244'BR-DEX-06Dependency changed
Scheme identifier list gains four ISO 6523 ICD codes: "0241", "0242", "0243", "0244".
The rule's test expression is byte-identical between published "2.4.0" and published "2.5.0". The changed dependency is the variable $ISO-6523-ICD-CODES: in "2.4.0" the list ends with "0240", and in "2.5.0" it ends with "0244". The entries "0241", "0242", "0243", and "0244" are appended. The rule message still states that any scheme identifier must be coded using one of the ISO 6523 ICD 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.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'After · 2.5.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 0241 0242 0243 0244'BR-DEX-07Dependency changed
The permitted CEF EAS code list now includes "0244"
The rule's test expression is byte-identical between the two releases. The only change shown is in the variable "$CEF-EAS-CODES", whose updated value adds "0244" to the space-delimited list of permitted CEF EAS codes and moves the existing code "0235" ahead of "0240". No other differences are shown.
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.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 'After · 2.5.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 0235 0240 0244 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
ISO 6523 ICD list adds codes "0241", "0242", "0243", "0244"
The rule's text is unchanged: its test expression is byte-identical between releases. The dependency $ISO-6523-ICD-CODES changed: the before list ended at "0240", and the after list appends "0241", "0242", "0243", and "0244". This widens the set of scheme identifiers the rule accepts.
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.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'After · 2.5.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 0241 0242 0243 0244'BR-DEX-08Dependency changed
Four codes "0241" to "0244" added to scheme list
The test expression is byte-identical in both releases and still calls $ISO-6523-ICD-EXT-CODES. The changed dependency shown is $ISO-6523-ICD-CODES, whose list previously ended at "0240" and now also contains "0241", "0242", "0243", and "0244". Because the expression names the other variable, this evidence does not show that the rule's behavior changed.
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.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'After · 2.5.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 0241 0242 0243 0244'BR-CL-25Test expression rewritten
Allowed CEF EAS endpoint scheme identifiers now include "0244"
The rule checks the endpoint scheme identifier against a space-padded list of allowed CEF EAS scheme identifiers. In published 2.5.0, that list includes "0244"; the published 2.4.0 list did not contain that value. The rest of the check, including the requirement that the scheme identifier contains no spaces, is unchanged.
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.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), ' '))))After · 2.5.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 0244 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-G-08Test expression rewritten
The rule now casts the line total amount and actual amounts to decimal before summing and rounding
The previous expression summed and rounded the raw line total amount and actual amount values. The new expression converts the line total amount and both actual amount sums, one for charges and one for allowances, to decimal before summing and rounding. No other part of the expression changed.
fatalbusiness
Original rule text: [BR-G-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Export outside the EU" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Export outside the EU".
Explanation and fix
What this rule requires
Rule BR-G-08 requires that a VAT breakdown with VAT category code G ("Export outside the EU") has a taxable amount equal to the sum of line net amounts for lines with VAT category G, plus document-level charges with category G, minus document-level allowances with category G. In UBL the test requires exact equality between cbc:TaxableAmount and the computed value from cbc:LineExtensionAmount, cbc:Amount with cbc:ChargeIndicator. In CII the test requires ram:BasisAmount to be within +/-1 currency unit of the same computed sum (rounded to two decimals). Fatal, so an invoice failing this is rejected.
How to fix
Make the taxable amount match the computed value, or correct the line net amounts, document charges or allowances for category G so they sum correctly. In UBL adjust ../cbc:TaxableAmount of the cac:TaxSubtotal so it equals the sum of cbc:LineExtensionAmount of lines whose cac:Item/cac:ClassifiedTaxCategory/cbc:ID is G, plus cbc:Amount from cac:AllowanceCharge where cbc:ChargeIndicator is true and cac:TaxCategory/cbc:ID is G, minus cbc:Amount where cbc:ChargeIndicator is false. In CII adjust ram:BasisAmount to be within +/-1 of the rounded sum of ram:LineTotalAmount of lines with ram:ApplicableTradeTax/ram:CategoryCode = 'G', plus header ram:ActualAmount from ram:SpecifiedTradeAllowanceCharge where ram:ChargeIndicator is true and ram:CategoryTradeTax/ram:CategoryCode is G, minus those where false. If the amounts are correct, check which elements are missing or aggregated in the wrong category.
BR-G-08 rule detailsBefore · 2.4.0
(../ram:BasisAmount -1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'G']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='G']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='G']/ram:ActualAmount)*10*10)div 100)) and (../ram:BasisAmount +1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'G']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='G']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='G']/ram:ActualAmount)*10*10)div 100))After · 2.5.0
(../ram:BasisAmount -1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'G']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='G']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='G']/xs:decimal(ram:ActualAmount))*10*10)div 100)) and (../ram:BasisAmount +1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'G']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='G']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='G']/xs:decimal(ram:ActualAmount))*10*10)div 100))BR-AE-08Test expression rewritten
The rule now casts amounts to decimal before summing and rounding
The test changed by wrapping the line total amount and the charge and allowance actual amounts in a cast to the decimal type before summing. Previously those amounts were summed directly, with rounding applied to the sums. The cast appears in three places: line total amounts, charge amounts, and allowance amounts, and in both the lower and upper tolerance comparisons. No other part of the test expression changed.
fatalbusiness
Original rule text: [BR-AE-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Reverse charge".
Explanation and fix
What this rule requires
The rule requires that for a VAT breakdown where the VAT category code (BT-118) is AE ("Reverse charge") under VAT, the VAT category taxable amount (BT-116) must equal the sum of invoice line net amounts (BT-131) for lines with the same AE category, plus document level charge amounts (BT-99) with category AE, minus document level allowance amounts (BT-92) with category AE. In UBL the test requires exact equality for invoice lines or credit note lines. In CII the test allows a tolerance of ±1 after rounding each sum to two decimals, so the basis amount may differ slightly and still pass.
How to fix
In UBL, set cac:TaxSubtotal/cac:TaxCategory/cbc:ID to AE and set its cbc:TaxableAmount to exactly: sum of cac:InvoiceLine/cbc:LineExtensionAmount for lines whose cac:Item/cac:ClassifiedTaxCategory/cbc:ID is AE; plus cac:AllowanceCharge/cbc:Amount for document level charges with cbc:ChargeIndicator=true() and cac:TaxCategory/cbc:ID='AE'; minus cac:AllowanceCharge/cbc:Amount for document level allowances with cbc:ChargeIndicator=false() and cac:TaxCategory/cbc:ID='AE'. For credit notes use cac:CreditNoteLine elements analogously. In CII, ensure ram:BasisAmount for the AE category is within 1 of the sum of line ram:LineTotalAmount for lines with ram:ApplicableTradeTax/ram:CategoryCode='AE', plus document level ram:ActualAmount from ram:SpecifiedTradeAllowanceCharge with ram:CategoryTradeTax/ram:CategoryCode='AE' and ram:ChargeIndicator true, minus the same with false, all rounded to two decimals. If the invoice is rejected, check whether line totals, document charges, or allowances with category AE are missing or incorrect, and correct either the taxable amount or those component amounts.
BR-AE-08 rule detailsBefore · 2.4.0
(../ram:BasisAmount -1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'AE']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='AE']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='AE']/ram:ActualAmount)*10*10)div 100)) and (../ram:BasisAmount +1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'AE']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='AE']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='AE']/ram:ActualAmount)*10*10)div 100))After · 2.5.0
(../ram:BasisAmount -1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'AE']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='AE']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='AE']/xs:decimal(ram:ActualAmount))*10*10)div 100)) and (../ram:BasisAmount +1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'AE']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='AE']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='AE']/xs:decimal(ram:ActualAmount))*10*10)div 100))BR-TMP-3Test expression rewritten
Unit-code equality now only applies when both unit codes are present
The rule changed the condition attached to unit-of-measure codes. Previously, when both price base quantities were present, the expression required their unit codes to be equal directly. The new expression inserts a clause that the unit codes must be equal only if both are present; if either is absent, the equality requirement does not apply. The rule message still says a unit code on the NetPrice path, when present, must also be present and identical on the GrossPrice path, but the changed expression no longer states that presence requirement.
fatalbusiness
Original rule text: [BR-TMP-3] Wenn BT-149 (Item price base quantity) sowohl in GrossPriceProductTradePrice als auch in NetPriceProductTradePrice vorhanden ist, müssen die Werte identisch sein. Wenn BT-150 (unit of measure code) auf dem NetPrice-Pfad vorhanden ist, muss es auch auf dem GrossPrice-Pfad vorhanden und identisch sein.
Explanation and fix
What this rule requires
The CII rule applies to each line item. If both ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity and ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity are present, their values must be equal. If both of those BasisQuantity elements carry an @unitCode attribute, the unit codes must also be equal. The message additionally states that a unit code on the NetPrice path must also be present and identical on the GrossPrice path, but the CII test does not enforce that presence requirement; it only checks equality when both unit codes are present.
How to fix
Set the two BasisQuantity elements to the same value when both are present. If both BasisQuantity elements have an @unitCode, make the unit codes identical. To also satisfy the stated message, when ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity/@unitCode is present, add the same @unitCode to ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity.
BR-TMP-3 rule detailsBefore · 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)After · 2.5.0
not(ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity and ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity) or (ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity = ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity and (not(ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity/@unitCode and ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity/@unitCode) or ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisQuantity/@unitCode = ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity/@unitCode))BR-CL-22Test expression rewritten
VATEX exemption code list adds "VATEX-EU-135-1"
The rule's allowed list for the tax exemption reason code identifier scheme identifier now includes "VATEX-EU-135-1", inserted after "VATEX-EU-132-1Q". The remainder of the enumerated list is unchanged; no codes were removed. The rule message still states that the identifier scheme must belong to the CEF VATEX code list.
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.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(.)), ' '))))After · 2.5.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-135-1 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-DE-25-bTest expression rewritten
Direct-debit rule now also requires the creditor financial institution and the debtor financial institution to be absent
Previously the test required the absence of the creditor financial account and the payment card. In published 2.5.0 it adds two more required absences: the creditor financial institution and the debtor financial institution. The rule applies when BT-81 "Payment means type code" contains the direct-debit key "59".
fatalcountry
Original rule text: [BR-DE-25-b] Wenn BT-81 "Payment means type code" einen Schlüssel für Lastschriften enthält (59), dürfen BG-17 und BG-18 nicht übermittelt werden.
Explanation and fix
What this rule requires
The rule applies when the payment means type code (BT-81) is 59, meaning direct debit ("Lastschriften"). In that case, the payment means must not contain the child elements for BG-17 and BG-18. In UBL these are cac:PayeeFinancialAccount and cac:CardAccount; in CII the test requires absence of ram:PayeePartyCreditorFinancialAccount, ram:PayeeSpecifiedCreditorFinancialInstitution, ram:PayerSpecifiedDebtorFinancialInstitution, and ram:ApplicableTradeSettlementFinancialCard. The document fails validation if any of these are present together with code 59.
How to fix
Remove the forbidden child elements from the payment means that has code 59. In UBL, delete cac:PayeeFinancialAccount and cac:CardAccount from cac:PaymentMeans where cbc:PaymentMeansCode is '59'. In CII, delete ram:PayeePartyCreditorFinancialAccount, ram:PayeeSpecifiedCreditorFinancialInstitution, ram:PayerSpecifiedDebtorFinancialInstitution, and ram:ApplicableTradeSettlementFinancialCard from ram:SpecifiedTradeSettlementPaymentMeans where ram:TypeCode is '59'.
BR-DE-25-b rule detailsBefore · 2.4.0
not(ram:PayeePartyCreditorFinancialAccount) and not(ram:ApplicableTradeSettlementFinancialCard)After · 2.5.0
not(ram:PayeePartyCreditorFinancialAccount) and not(ram:PayeeSpecifiedCreditorFinancialInstitution) and not(ram:PayerSpecifiedDebtorFinancialInstitution) and not(ram:ApplicableTradeSettlementFinancialCard)BR-CL-05Test expression rewritten
Tax currency code list drops "MRO", adds "CNH", "MRU", "UYW"
The test expression contains a list of allowed ISO 4217 alpha-3 currency codes. The before list includes "MRO"; the after list does not. The after list includes "CNH", "MRU", and "UYW"; the before list does not. No other list entries changed.
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.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(.), ' '))))After · 2.5.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 CNH CNY COP COU CRC 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 MRU 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 UYW 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-E-08Test expression rewritten
Monetary sums are now cast to "xs:decimal" before comparison.
The test that compares the VAT category taxable amount to the total of line amounts and header allowances and charges has been changed in one way. In each of the three sum expressions, the value read from "LineTotalAmount" or "ActualAmount" was previously summed directly; it is now wrapped in an "xs:decimal" cast before the sum and rounding. The formula being evaluated and the tolerance of ±1 are otherwise unchanged.
fatalbusiness
Original rule text: [BR-E-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT".
Explanation and fix
What this rule requires
For each VAT breakdown with VAT category code "E" (Exempt from VAT), the rule verifies that the VAT category taxable amount (BT-116, UBL cac:TaxSubtotal/cbc:TaxableAmount, CII ram:BasisAmount) equals the sum of line net amounts minus document level allowances plus document level charges, where those lines, allowances and charges have VAT category "E". In UBL the comparison is exact; in CII the test allows a difference of up to 1 (including rounding tolerance), so the basis amount must be within ±1 of the computed total.
How to fix
Recalculate the taxable amount for the exempt VAT breakdown: sum the net amounts of all lines whose VAT category is "E", subtract document level allowances with VAT category "E" (UBL cac:AllowanceCharge[cbc:ChargeIndicator=false()], CII ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false()]), and add document level charges with VAT category "E" (UBL cac:AllowanceCharge[cbc:ChargeIndicator=true()], CII ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true()]). Set UBL ../cbc:TaxableAmount or CII ../ram:BasisAmount to that result (in CII within ±1). Also check that the VAT category on the relevant lines and document level charges/allowances is correctly set to "E".
BR-E-08 rule detailsBefore · 2.4.0
(../ram:BasisAmount - 1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'E']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='E']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='E']/ram:ActualAmount)*10*10)div 100)) and (../ram:BasisAmount + 1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'E']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='E']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='E']/ram:ActualAmount)*10*10)div 100))After · 2.5.0
(../ram:BasisAmount - 1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'E']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='E']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='E']/xs:decimal(ram:ActualAmount))*10*10)div 100)) and (../ram:BasisAmount + 1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'E']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='E']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='E']/xs:decimal(ram:ActualAmount))*10*10)div 100))BR-CL-10Test expression rewritten
The fixed list of ISO 6523 scheme identifiers is extended by four codes.
The test condition checks a scheme identifier against a fixed list of ISO 6523 codes. That list previously ended at "0240". It now continues with "0241", "0242", "0243", and "0244". No other part of the expression 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.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), ' '))))After · 2.5.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 0241 0242 0243 0244', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-11Test expression rewritten
The rule adds "0241", "0242", "0243", "0244" to the ISO 6523 ICD list.
The test expression uses a space-padded contains string to check the scheme identifier attribute against ISO 6523 ICD codes, while also requiring no internal spaces. The version before ended the list with "0240". The version after extends that list with "0241", "0242", "0243", and "0244" immediately following "0240". No other entries changed.
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.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), ' '))))After · 2.5.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 0241 0242 0243 0244', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-04Test expression rewritten
Currency code list adds CNH and UYW, replaces MRO with MRU
The rule tests whether the currency code is a single token contained in a whitespace-delimited list of ISO 4217 alpha-3 codes. In that list, "MRO" is replaced by "MRU", and "CNH" and "UYW" are added in their alphabetical positions. The shape of the test is otherwise unchanged.
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.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(.), ' '))))After · 2.5.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 CNH CNY COP COU CRC 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 MRU 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 UYW 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 identifier scheme identifiers now include "0241", "0242", "0243" and "0244"
The rule requires the delivery location identifier scheme identifier to belong to the ISO 6523 ICD code list. The check is a membership test against a fixed list of codes. The published 2.5.0 condition adds "0241", "0242", "0243" and "0244" to that list; before this change the list ended at "0240". No other part of the condition changed.
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.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), ' '))))After · 2.5.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 0241 0242 0243 0244', concat(' ', normalize-space(@schemeID), ' '))))BR-CL-21Test expression rewritten
ISO 6523 scheme identifiers now include "0241", "0242", "0243", and "0244"
The list of allowed ISO 6523 scheme identifiers previously ended at "0240"; it now also includes "0241", "0242", "0243", and "0244". These are four additional allowed values. The condition that the scheme identifier contain no spaces is unchanged.
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.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), ' '))))After · 2.5.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 0241 0242 0243 0244', concat(' ', normalize-space(@schemeID), ' '))))BR-IC-08Test expression rewritten
The rule now casts monetary totals to decimal before summing them
The test expression previously summed the values of the line total amount and the actual amount elements directly. It now casts each of those three summed monetary amounts to decimal before summing them. The casts apply to the line total amount where the category code is "K", and to the actual amounts for charges and allowances where the category code is "K". The surrounding plus-or-minus-one tolerance and the rounding to two decimal places are unchanged.
fatalbusiness
Original rule text: [BR-IC-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Intra-community supply".
Explanation and fix
What this rule requires
For intra-community supply (K), the taxable amount in the VAT breakdown must equal the net amounts of lines with category K minus document-level allowances plus document-level charges with category K. In UBL, for cac:TaxCategory with cbc:ID K, cac:TaxSubtotal/cbc:TaxableAmount must exactly equal the sum of cac:InvoiceLine/cbc:LineExtensionAmount (or cac:CreditNoteLine if credit note lines are used) where the line's classified tax category ID is K, plus allowance charges with cbc:ChargeIndicator true and tax category K, minus those with false. In CII, for ram:ApplicableTradeTax with ram:CategoryCode K and ram:TypeCode VAT, ram:BasisAmount must be within 1 (after rounding the sum to two decimals) of line ram:LineTotalAmount where line tax category is K, plus header charges with ram:ChargeIndicator true and ram:CategoryTradeTax/ram:CategoryCode K, minus allowances with false. This is fatal.
How to fix
- UBL: Set
cac:TaxSubtotal/cbc:TaxableAmount for the K category to the exact calculated sum, or correct the individual line extension amounts, document-level allowance/charge amounts, or their VAT category codes so the equation holds. If both cac:InvoiceLine and cac:CreditNoteLine are present, each must satisfy its own sum.
- CII: Set
ram:BasisAmount for that ram:ApplicableTradeTax to the calculated sum (within a tolerance of less than 1), or correct the corresponding line total amounts, allowance/charge actual amounts, or their category codes.
BR-IC-08 rule detailsBefore · 2.4.0
(../ram:BasisAmount - 1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'K']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='K']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='K']/ram:ActualAmount)*10*10)div 100)) and (../ram:BasisAmount + 1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'K']/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='K']/ram:ActualAmount)*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='K']/ram:ActualAmount)*10*10)div 100))After · 2.5.0
(../ram:BasisAmount - 1 < (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'K']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='K']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='K']/xs:decimal(ram:ActualAmount))*10*10)div 100)) and (../ram:BasisAmount + 1 > (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'K']/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount))*10*10)div 100) + (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='K']/xs:decimal(ram:ActualAmount))*10*10)div 100) - (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='K']/xs:decimal(ram:ActualAmount))*10*10)div 100))BR-CL-03Test expression rewritten
ISO 4217 list updated: "CNH" and "UYW" added, "MRO" replaced by "MRU".
The test expression contains a space-delimited list of three-letter currency codes. Between the two versions, the list replaced "MRO" with "MRU", and added "CNH" and "UYW". The surrounding condition is otherwise unchanged.
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.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), ' '))))After · 2.5.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 CNH CNY COP COU CRC 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 MRU 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 UYW 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), ' '))))CII-SR-466New rule
New rule forbids buyer trade contacts with both person and department names
A new rule was added. Its message states that only one "BT-56" element is allowed. The test expression now requires that a buyer trade party's defined trade contact does not carry both a person name and a department name. If both are present, the rule fails. The added condition takes the form of a test expression using the negation of the conjunction of the two elements.
warningschema
Original rule text: [CII-SR-466] - Only one BT-56 element is allowed on an invoice.
Explanation and fix
What this rule requires
The rule is advisory (warning). The message says only one BT-56 element is allowed, but the CII test does not count BT-56 or ram:DefinedTradeContact elements. It checks not(ram:BuyerTradeParty/ram:DefinedTradeContact/ram:PersonName and ram:BuyerTradeParty/ram:DefinedTradeContact/ram:DepartmentName): the rule is not satisfied if both a ram:PersonName and a ram:DepartmentName are present anywhere under ram:BuyerTradeParty/ram:DefinedTradeContact. The test does not prevent multiple ram:DefinedTradeContact elements. Because severity is warning, the validator reports this but does not reject the invoice.
How to fix
Ensure that within the buyer trade contact information (ram:BuyerTradeParty/ram:DefinedTradeContact) you do not provide both a ram:PersonName and a ram:DepartmentName. Remove either all ram:DepartmentName elements or all ram:PersonName elements under that path, so that only one of the two element types is used. If the message about 'only one BT-56 element' reflects your system emitting multiple contact groups, check that separately; the test as written only restricts the combination of PersonName and DepartmentName.
CII-SR-466 rule detailsAdded · 2.5.0
not(ram:BuyerTradeParty/ram:DefinedTradeContact/ram:PersonName and ram:BuyerTradeParty/ram:DefinedTradeContact/ram:DepartmentName)CII-DT-102New rule
New rule requires "schemeAgencyName" attribute to be absent
The rule is added in published 2.5.0; it did not exist in 2.4.0. Its message is "[CII-DT-102] - schemeAgencyName should not be present". It requires the attribute "schemeAgencyName" to be absent.
fatalschema
Original rule text: [CII-DT-102] - schemeAgencyName should not be present
Explanation and fix
What this rule requires
This rule forbids the attribute @schemeAgencyName in a CII document. The test is not(@schemeAgencyName), evaluated for //ram:*[ends-with(name(), 'ID')], so the rule reports every place where that attribute is present.
How to fix
Remove @schemeAgencyName from the document. If your system always writes it, change the export so that it leaves this attribute out.
CII-DT-102 rule detailsAdded · 2.5.0
not(@schemeAgencyName)CII-DT-103New rule
New rule forbids the "schemeDataURI" attribute
The rule is new in published 2.5.0. It fails when an element carries the "schemeDataURI" attribute, which the rule message says should not be present. No version of this check existed in published 2.4.0.
fatalschema
Original rule text: [CII-DT-103] - schemeDataURI should not be present
Explanation and fix
What this rule requires
This rule forbids the attribute @schemeDataURI in a CII document. The test is not(@schemeDataURI), evaluated for //ram:*[ends-with(name(), 'ID')], so the rule reports every place where that attribute is present.
How to fix
Remove @schemeDataURI from the document. If your system always writes it, change the export so that it leaves this attribute out.
CII-DT-103 rule detailsAdded · 2.5.0
not(@schemeDataURI)CII-DT-101New rule
New rule forbids "schemeName" attribute
A new rule was added in version "2.5.0". Its test expression is "not(@schemeName)", requiring that the attribute "schemeName" be absent. The rule's message is "schemeName should not be present". This check did not exist in version "2.4.0".
fatalschema
Original rule text: [CII-DT-101] - schemeName should not be present
Explanation and fix
What this rule requires
This rule forbids the attribute @schemeName in a CII document. The test is not(@schemeName), evaluated for //ram:*[ends-with(name(), 'ID')], so the rule reports every place where that attribute is present.
How to fix
Remove @schemeName from the document. If your system always writes it, change the export so that it leaves this attribute out.
CII-DT-101 rule detailsAdded · 2.5.0
not(@schemeName)CII-SR-464New rule
New "BT-86" rule uses a tautological test expression
The rule is introduced in "2.5.0" with the message "Only one BT-86 element is allowed on an invoice." Its test expression is the logical OR of "at least one of the two elements is present" and "neither is present", which is true for every possible combination of the two elements. Because the expression is always true, it cannot distinguish configurations with one element from configurations with both or neither, so it does not enforce the stated one-element limit.
warningschema
Original rule text: [CII-SR-464] - Only one BT-86 element is allowed on an invoice.
CII-SR-464 rule detailsAdded · 2.5.0
(ram:PayeeSpecifiedCreditorFinancialInstitution or ram:PayerSpecifiedDebtorFinancialInstitution) or (not(ram:PayeeSpecifiedCreditorFinancialInstitution) and not(ram:PayerSpecifiedDebtorFinancialInstitution))PEPPOL-EN16931-R120New rule
New rule checks net amount equals quantity times price plus charges minus allowances
Why this matters
A new rule was added in version 2.5.0 that was not present in version 2.4.0. The rule message states that the invoice line net amount must equal the invoiced quantity multiplied by (item net price divided by item price base quantity), plus the sum of invoice line charge amounts, minus the sum of invoice line allowance amounts. The test expression after is "u:slack($lineExtensionAmount, ($quantity * ($priceAmount div $baseQuantity)) + $chargesTotal - $allowancesTotal, $slackValue)". The variables used are "$lineExtensionAmount", "$quantity", "$priceAmount", "$baseQuantity", "$chargesTotal", "$allowancesTotal", and "$slackValue", and the function is "u:slack".
warningformat
Original rule text: Invoice line net amount MUST equal (Invoiced quantity * (Item net price/item price base quantity) + Sum of invoice line charge amount - sum of invoice line allowance amount
PEPPOL-EN16931-R120 rule detailsAdded · 2.5.0
u:slack($lineExtensionAmount, ($quantity * ($priceAmount div $baseQuantity)) + $chargesTotal - $allowancesTotal, $slackValue)CII-DT-104New rule
A new rule forbids the "schemeURI" attribute.
A new rule was added in published version 2.5.0. Its test expression is "not(@schemeURI)", requiring that the attribute "schemeURI" be absent. The rule message states that "schemeURI" should not be present. No corresponding rule existed in published version 2.4.0.
fatalschema
Original rule text: [CII-DT-104] - schemeURI should not be present
Explanation and fix
What this rule requires
This rule forbids the attribute @schemeURI in a CII document. The test is not(@schemeURI), evaluated for //ram:*[ends-with(name(), 'ID')], so the rule reports every place where that attribute is present.
How to fix
Remove @schemeURI from the document. If your system always writes it, change the export so that it leaves this attribute out.
CII-DT-104 rule detailsAdded · 2.5.0
not(@schemeURI)CII-SR-465New rule
New rule: a seller trade contact cannot have both person and department names
A rule was added between published 2.4.0 and published 2.5.0. Its message says that only one "BT-41" element is allowed. The test expression asserts that a seller trade party's defined trade contact does not have both a person name and a department name. There was no corresponding rule in the earlier published set.
warningschema
Original rule text: [CII-SR-465] - Only one BT-41 element is allowed on an invoice.
Explanation and fix
What this rule requires
The rule checks the ram:ApplicableHeaderTradeAgreement element. Under ram:SellerTradeParty/ram:DefinedTradeContact, it must not be the case that both a ram:PersonName and a ram:DepartmentName are present. The message states that only one BT-41 element is allowed on an invoice. This is a warning, so a document with both elements is not rejected, but the validator reports it.
How to fix
In the ram:DefinedTradeContact of the seller trade party, use only one of ram:PersonName or ram:DepartmentName, not both. Decide which value should carry the BT-41 contact information and remove the other element, or configure the producing system to emit only one of them.
CII-SR-465 rule detailsAdded · 2.5.0
not(ram:SellerTradeParty/ram:DefinedTradeContact/ram:PersonName and ram:SellerTradeParty/ram:DefinedTradeContact/ram:DepartmentName)CII-SR-463New rule
New rule requires a "Charge Indicator" in each trade allowance charge.
The rule is new in published 2.5.0: its message states that each specified trade allowance charge (BG-20)(BG-21) shall contain a "Charge Indicator". The validation now requires that element, expressed as "(ram:ChargeIndicator)", to be present. No corresponding rule is present in published 2.4.0.
fatalschema
Original rule text: [CII-SR-463]-Each Specified Trade Allowance Charge (BG-20)(BG-21) shall contain a Charge Indicator.
Explanation and fix
What this rule requires
Each ram:SpecifiedTradeAllowanceCharge element must contain a child ram:ChargeIndicator. This is a fatal rule for XRechnung: a document that has a ram:SpecifiedTradeAllowanceCharge without that child fails validation. The test checks only for the presence of ram:ChargeIndicator.
How to fix
Add a ram:ChargeIndicator element inside every ram:SpecifiedTradeAllowanceCharge in the CII invoice. The rule does not specify a required value, so provide the indicator value as required by the business content; this rule only enforces that the element is present.
CII-SR-463 rule detailsAdded · 2.5.0
(ram:ChargeIndicator)BR-CO-27Rule removed
A rule requiring exactly one payee account identifier has been removed.
The rule required the payee financial account to carry either an IBAN identifier or a proprietary identifier, but not both. It rejected cases where neither was present or both were present. Removing the rule means documents are no longer rejected for that check.
fatalbusiness
Original rule text (before removal): [BR-CO-27]- Either the IBAN or a Proprietary ID (BT-84) shall be used.
BR-CO-27 rule detailsRemoved · 2.4.0
(ram:PayeePartyCreditorFinancialAccount/ram:IBANID or ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID) and not(ram:PayeePartyCreditorFinancialAccount/ram:IBANID and ram:PayeePartyCreditorFinancialAccount/ram:ProprietaryID)CII-DT-0040Rule removed
The rule is removed, so documents are no longer checked for a missing scheme identifier.
The rule has been removed. It previously tested for the absence of a scheme identifier attribute. With the rule removed, documents are no longer checked for this condition.
Removed · 2.4.0
not(@schemeURI)CII-DT-0030Rule removed
The check for absence of "schemeDataURI" has been removed.
The rule has been removed. It previously tested that the attribute "schemeDataURI" was not present. Documents are no longer checked for that condition.
fatalschema
Original rule text (before removal): [CII-DT-003] - schemeDataURI should not be present
CII-DT-0030 rule detailsRemoved · 2.4.0
not(@schemeDataURI)CII-DT-0020Rule removed
The rule checking that the "schemeAgencyName" attribute is absent has been removed
The rule has been removed. It previously checked that the "schemeAgencyName" attribute was absent. Documents are no longer checked for this condition.
fatalschema
Original rule text (before removal): [CII-DT-002] - schemeAgencyName should not be present
CII-DT-0020 rule detailsRemoved · 2.4.0
not(@schemeAgencyName)BR-66Rule removed
Rule checking "ram:ChargeIndicator" removed.
The rule no longer exists in published 2.5.0. Its previous test expression was "ram:ChargeIndicator". Documents are no longer rejected for the check that expression performed.
fatalbusiness
Original rule text (before removal): [BR-66]-Each Specified Trade Allowance Charge (BG-20)(BG-21) shall contain a Charge Indicator.
BR-66 rule detailsRemoved · 2.4.0
(ram:ChargeIndicator)CII-DT-0010Rule removed
The rule that flagged a missing "schemeName" attribute has been removed.
The rule has been removed. Its previous check looked for documents where the "schemeName" attribute was absent. Since it is no longer in the set, documents without that attribute are no longer checked by this rule.
Removed · 2.4.0
not(@schemeName)