BR-CO-16المبلغ المستحق غير مذكور في إجماليات المستند
يفحص مطابق ملف XML للفاتورة الإلكترونية في المرحلة الثانية قبل إرساله: تحقق مسبق وفق متطلبات هيئة الزكاة والضريبة والجمارك المنشورة، لا اعتماداً من الهيئة. وتشرح هذه الصفحة قاعدة واحدة هي BR-CO-16.
خمس عمليات فحص شهرياً في باقة المجان. يُفحص الملف في الذاكرة ولا يُحفظ.
الرسالة كما تنشرها هيئة الزكاة والضريبة والجمارك
[BR-CO-16]-Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Pre-Paid amount (BT-113) + Rounding amount (BT-114).
ما الذي يذكره مطابق
مدخل لكل حالة تُذكر فيها هذه القاعدة في التقرير.
صورة القيمة في التقرير
صورة القيمة التي وُجدت — empty وnot_15_digits وما شابههما — لا القيمة نفسها.
المبلغ المستحق غير مذكور في إجماليات المستند
صورة القيمة في التقريرtotal_missingالإجمالي غير موجود
ما الخلل
يحمل المستند مبلغاً مدفوعاً مقدَّماً لكن كتلة cac:LegalMonetaryTotal لا تحمل العنصر cbc:PayableAmount، أو لا تحمل العنصر cbc:TaxInclusiveAmount الذي يُحسب منه. وتشترط القاعدة BR-CO-16 من معيار EN 16931، التي تنفّذها هيئة الزكاة والضريبة والجمارك، أن يساوي المبلغ المستحق الإجماليَ شاملاً الضريبة مطروحاً منه المبلغ المدفوع مقدَّماً، ولا يمكن استيفاؤها وأحد الطرفين غائب. ولا تُفحص هذه القاعدة إلا على مستند يذكر مبلغاً مدفوعاً مقدَّماً أصلاً.
ما الذي تتحقق منه في وحدة الفوترة الإلكترونية
راجع قالب التصدير في وحدة الفوترة الإلكترونية: يجب أن تحمل كتلة الإجماليات العنصر cbc:PayableAmount، وهو الرقم الذي يدفعه العميل فعلاً. والعنصران مطلوبان في مخطط UBL أيضاً، فالمستند في هذه الحالة تُرصد عليه هذه الملاحظة وملاحظة فحص المخطط معاً.
المبلغ المستحق لا يساوي الإجمالي شاملاً الضريبة مطروحاً منه المدفوع مقدَّماً
صورة القيمة في التقريرnot_inclusive_less_prepaidلا يساوي الإجمالي شاملاً الضريبة مطروحاً منه المدفوع مقدَّماً
ما الخلل
العنصر cbc:PayableAmount في كتلة cac:LegalMonetaryTotal ليس العنصر cbc:TaxInclusiveAmount مطروحاً منه العنصر cbc:PrepaidAmount. وتشترط القاعدة BR-CO-16 من معيار EN 16931، التي تنفّذها هيئة الزكاة والضريبة والجمارك، ذلك تماماً مقرَّباً إلى منزلتين عشريتين. وحين يحمل المستند كذلك العنصر cbc:PayableRoundingAmount يُسمح لذلك المبلغ بتفسير الفارق. ولا تُنفَّذ هذه القاعدة إلا على مستند يذكر مبلغاً مدفوعاً مقدَّماً، فلن تظهر على فاتورة لم يُدفع فيها شيء مقدَّماً.
ما الذي تتحقق منه في وحدة الفوترة الإلكترونية
راجع ما في العنصر cbc:PrepaidAmount: فهو المبلغ المستلم فعلاً على هذه الفاتورة، والعربون والدفعة المقدَّمة والرصيد المطبَّق عند الفوترة كلها موضعها هذا العنصر. والسبب الأشيع أن يُنقل المبلغ المستحق من الإجمالي شاملاً الضريبة مباشرة بينما تُسجَّل الدفعة المقدَّمة في الدفاتر وحدها فلا يلتقيان في الملف المصدَّر. وإذا كان نظامك يقرّب المبلغ المستحق إلى ريال كامل للتحصيل النقدي فموضع ذلك الفارق العنصر cbc:PayableRoundingAmount لا استيعابه في صمت.
الفحص الذي يُنفَّذ
منقول حرفياً من ملفات قواعد التحقق التي تنشرها الهيئة، عند الملف والسطر المذكورين أدناه. والتعبير المُنفَّذ هو ما يُقيَّم على المستند، أما التعبير المذكور في التقرير فهو ما يظهر عند الإخفاق، وهما لا يتطابقان دائماً.
التعبير المُنفَّذ
not(( not(exists(cbc:PayableRoundingAmount)) and (xs:decimal(cbc:PayableAmount) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and not(exists(cbc:PayableRoundingAmount)) and xs:decimal(cbc:PayableAmount) = xs:decimal(cbc:TaxInclusiveAmount)) or (exists(cbc:PrepaidAmount) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = xs:decimal(cbc:TaxInclusiveAmount))))
التعبير المذكور في التقرير
(exists(cbc:PrepaidAmount) and not(exists(cbc:PayableRoundingAmount)) and (xs:decimal(cbc:PayableAmount) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and not(exists(cbc:PayableRoundingAmount)) and xs:decimal(cbc:PayableAmount) = xs:decimal(cbc:TaxInclusiveAmount)) or (exists(cbc:PrepaidAmount) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = xs:decimal(cbc:TaxInclusiveAmount)))
العناصر التي يُقيَّم عليها
cac:LegalMonetaryTotal
المصدر
vendor/zatca/schematron/CEN-EN16931-UBL.xsl:490
كما يرد في الإصدار 3.4.8 من حزمة أدوات التطوير SDK التي تنشرها الهيئة: النسخة المقتبسة هنا هي الملف الذي يتضمنه ذلك الإصدار بايتاً ببايت. والتاريخ في اسم الملف هو الاسم الذي تعطيه الهيئة للملف، أما القواعد فيه فهي قواعد الإصدار 3.4.8.
مثال عملي
مستند اصطناعي من مجموعة الاختبار المقيسة تُرصد عليه هذه القاعدة، تُعرض منه الأسطر التي يختلف فيها عن مستند اجتاز الفحص. ولا يذكر تقرير مطابق سوى صورة القيمة، لا القيمة نفسها.
المستند
bad-33-payable-amount-mismatch.xml
ما حكم به مطابق
اجتاز
صورة القيمة في التقرير
not_inclusive_less_prepaidلا يساوي الإجمالي شاملاً الضريبة مطروحاً منه المدفوع مقدَّماً