BR-KSA-20: Each invoice line charge needs a reason code

Explained by Matheel from ZATCA's rule text and the condition SDK 3.4.8 executes · Updated

Warning: accepted with a warningConditional, see belowFields: BG-28, BT-145

Applies to each cac:InvoiceLine/cac:AllowanceCharge with cbc:ChargeIndicator = true: it must have a non-empty cbc:AllowanceChargeReasonCode (BT-145). A text cbc:AllowanceChargeReason alone does not satisfy the executed check; the listed test text expresses this differently.

How to fix it

Add a reason code to each line-level charge, e.g. <cbc:AllowanceChargeReasonCode>…</cbc:AllowanceChargeReasonCode>.

ZATCA's official text

[BR-KSA-20]-Each Invoice line charge (BG-28) shall have a code for the reason for invoice line charge (BT-145).
Source: ZATCA SDK 3.4.8 · ZATCA KSA rules

Fails when (the condition ZATCA's SDK runs)

not(exists(cbc:AllowanceChargeReasonCode) and normalize-space(cbc:AllowanceChargeReasonCode )!='' )

Related rules

Validate your invoice against ZATCA's rules

Paste the XML and see every error and warning. It runs in your browser; the invoice goes nowhere.

Validate an invoice or try Matheel