The test compares ram:BasisAmount with the sum of the included ram:LineTotalAmount and ram:ActualAmount values, less charges and logistics fees. The permitted difference is 0.01 multiplied by the number of included entries. The XPath condition accepts a calculation matching exemption reason text and codes or a calculation without that matching.
Where the rule applies
The rule applies to a document-level VAT breakdown ram:ApplicableTradeTax with ram:CategoryCode equal to E and ram:TypeCode equal to VAT.
Context (rule/@context)
//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax[ram:CategoryCode='E'][upper-case(ram:TypeCode) = 'VAT']
Test expression (assert/@test)
(
for $rate in xs:decimal(ram:RateApplicablePercent),
$exempReasonText in normalize-space(ram:ExemptionReason),
$exempReasonCode in normalize-space(ram:ExemptionReasonCode),
$basisAmount in xs:decimal(ram:BasisAmount),
$calculatedAmountBT131 in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem[
not(ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode)
or ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode = 'DETAIL'
]/ram:SpecifiedLineTradeSettlement[
ram:ApplicableTradeTax/ram:CategoryCode = 'E'
and ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate
and normalize-space(ram:ApplicableTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:ApplicableTradeTax/ram:ExemptionReason) = $exempReasonText
]/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount)) * 100) div 100),
$calculatedAmountBT131ini in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem[
not(ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode)
or ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode = 'DETAIL'
]/ram:SpecifiedLineTradeSettlement[
ram:ApplicableTradeTax/ram:CategoryCode = 'E'
and ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate
]/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount)) * 100) div 100),
$allowancesAmountBT92 in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:ChargeIndicator/udt:Indicator=false()
and ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReason) = $exempReasonText
]/xs:decimal(ram:ActualAmount)) * 100) div 100),
$allowancesAmountBT92ini in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:ChargeIndicator/udt:Indicator=false()
and ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
]/xs:decimal(ram:ActualAmount)) * 100) div 100),
$chargesAmountBT99 in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:ChargeIndicator/udt:Indicator=true()
and ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReason) = $exempReasonText
]/xs:decimal(ram:ActualAmount)) * 100) div 100),
$chargesAmountBT99ini in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:ChargeIndicator/udt:Indicator=true()
and ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
]/xs:decimal(ram:ActualAmount)) * 100) div 100),
$nbLineItems in xs:decimal(count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/
ram:IncludedSupplyChainTradeLineItem[
(
not(ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode)
or ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode = 'DETAIL'
)
and ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode = 'E'
and ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate
and normalize-space(ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/
ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/
ram:ExemptionReason) = $exempReasonText
])),
$nbLineItemsini in xs:decimal(count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/
ram:IncludedSupplyChainTradeLineItem[
(
not(ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode)
or ram:AssociatedDocumentLineDocument/ram:LineStatusReasonCode = 'DETAIL'
)
and ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode = 'E'
and ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate
])),
$nbAllowancesOrCharges in xs:decimal(count(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:CategoryTradeTax/ram:ExemptionReason) = $exempReasonText
])),
$nbAllowancesOrChargesini in xs:decimal(count(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedTradeAllowanceCharge[
ram:CategoryTradeTax/ram:CategoryCode='E'
and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
])),
$logisticChargeAmount in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedLogisticsServiceCharge[
ram:AppliedTradeTax/ram:CategoryCode='E'
and ram:AppliedTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
and normalize-space(ram:AppliedTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:AppliedTradeTax/ram:ExemptionReason) = $exempReasonText
]/xs:decimal(ram:AppliedAmount)) * 100) div 100),
$logisticChargeAmountini in xs:decimal(round(sum(/rsm:CrossIndustryInvoice/
rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/
ram:SpecifiedLogisticsServiceCharge[
ram:AppliedTradeTax/ram:CategoryCode='E'
and ram:AppliedTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
]/xs:decimal(ram:AppliedAmount)) * 100) div 100),
$nblogisticCharge in xs:decimal(count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/
ram:ApplicableHeaderTradeSettlement/ram:SpecifiedLogisticsServiceCharge[
ram:AppliedTradeTax/ram:CategoryCode='E'
and ram:AppliedTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
and normalize-space(ram:AppliedTradeTax/ram:ExemptionReasonCode) = $exempReasonCode
and normalize-space(ram:AppliedTradeTax/ram:ExemptionReason) = $exempReasonText
])),
$nblogisticChargeini in xs:decimal(count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/
ram:ApplicableHeaderTradeSettlement/ram:SpecifiedLogisticsServiceCharge[
ram:AppliedTradeTax/ram:CategoryCode='E'
and ram:AppliedTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate
]))
return (abs($basisAmount - $calculatedAmountBT131 + $allowancesAmountBT92 - $chargesAmountBT99 - $logisticChargeAmount) le 0.01 * ($nbLineItems + $nbAllowancesOrCharges + $nblogisticCharge))
or (abs($basisAmount - $calculatedAmountBT131ini + $allowancesAmountBT92ini - $chargesAmountBT99ini - $logisticChargeAmountini) le 0.01 * ($nbLineItemsini + $nbAllowancesOrChargesini + $nblogisticChargeini))
)