{
  "source": "zip",
  "verdict": "FAIL",
  "rule_pack_version": "2.2.0",
  "reference_date": "2026-09-28",
  "zatca_sdk": "3.4.8",
  "run_id": null,
  "label": null,
  "coverage": {
    "checked_codes": 96,
    "total_codes": 242,
    "zatca_sdk": "3.4.8"
  },
  "summary": {
    "entry_count": 5,
    "passed": 2,
    "failed": 2,
    "skipped": 1
  },
  "entries": [
    {
      "position": 0,
      "name": "good-01-standard-388.xml",
      "verdict": "PASS",
      "document_identity": {
        "invoice_number": "MTB-G01",
        "issue_date": "2026-09-01",
        "invoice_type_code": "388",
        "invoice_type_name": "0100000",
        "seller_vat_number": "300000000000003",
        "icv": "1"
      },
      "qr_consistent": null,
      "findings": [
        {
          "rule_id": "MTB-BATCH-02",
          "zatca_codes": [],
          "severity": "WARNING",
          "xpath": "//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']",
          "observed_value_class": "icv_repeated_in_archive",
          "explanation_key": "batch.counter.icv_repeated_in_archive",
          "explanation": {
            "ar": {
              "title": "قيمة عدّاد الفواتير مكرَّرة داخل أرشيف ZIP نفسه",
              "what_is_wrong": "يحمل ملفان أو أكثر من ملفات الأرشيف المرفوع قيمة عدّاد الفواتير KSA-16 نفسها تحت رقم التسجيل في ضريبة القيمة المضافة نفسه للبائع، وتُذكر هذه الملاحظة على كل منها. ويصف الدليل الإرشادي التفصيلي للفوترة الإلكترونية الصادر عن هيئة الزكاة والضريبة والجمارك (الملحق 2 من قرار الفوترة الإلكترونية) العدّاد بأنه تسلسل مقاوم للعبث لا يمكن تصفيره ويزيد مع كل فاتورة أو إشعار يصدر؛ أما معيار تطبيق XML نفسه فلا يشترط إلا وجود العدّاد وكتابته بالأرقام. وفي قراءة مطابق، يخصّ العدّاد حل الفوترة الإلكترونية الذي يُصدر المستندات، فحلّان من حلول الفوترة الإلكترونية لبائع واحد قد يحملان الأرقام نفسها، أما الحل الواحد فلا يمكن أن يكرّر رقماً. وإن كانت هذه الملفات صادرة عن أجهزة مختلفة فهذا أمر متوقَّع. وتُرصد هذه الحالة بوصفها مخاطرة لا سبب رفض: فقواعد الهيئة المنشورة تقرأ مستنداً واحداً في كل مرة ولا تفحص إلا وجود العدّاد، فلا يرى التكرارَ أي فحص منها. وما دامت القيمة مكرَّرة فلا يفحص مطابق صلة بصمة الفاتورة السابقة الداخلة إليها ولا الخارجة منها، إذ ليس ثمة مستند واحد قبلها ولا بعدها.",
              "what_to_check_in_your_erp": "إن كانت الملفات صادرة عن جهاز واحد فالعدّاد إما لا يتقدّم وإما يُصفَّر: ابحث عن عدّاد يُحفظ لكل جلسة مستخدم أو لكل عملية لا مرة واحدة للجهاز، وعن قيمة تُصفَّر عند إعادة التشغيل أو إعادة الإصدار أو نهاية السنة، وعن مستند صُدِّر مرتين في ملفين مختلفين، وعن نسخة من ملف واحد وُضعت في الأرشيف مرتين. وإن كانت صادرة عن أجهزة مختلفة فلا خلل، وأوضح طريقة لقراءة التقرير أن ترفع مستندات كل جهاز في أرشيف خاص به.",
              "review": "approved"
            }
          }
        }
      ]
    },
    {
      "position": 1,
      "name": "bad-31-tax-exclusive-mismatch.xml",
      "verdict": "FAIL",
      "document_identity": {
        "invoice_number": "MTB-G01",
        "issue_date": "2026-09-01",
        "invoice_type_code": "388",
        "invoice_type_name": "0100000",
        "seller_vat_number": "300000000000003",
        "icv": "1"
      },
      "qr_consistent": null,
      "findings": [
        {
          "rule_id": "MTB-BR-CO-13",
          "zatca_codes": [
            "BR-CO-13"
          ],
          "severity": "WARNING",
          "xpath": "//*[local-name()='LegalMonetaryTotal']/*[local-name()='TaxExclusiveAmount']",
          "observed_value_class": "not_lines_plus_charges_less_allowances",
          "explanation_key": "br_co_13.not_lines_plus_charges_less_allowances",
          "explanation": {
            "ar": {
              "title": "الإجمالي قبل الضريبة لا يطابق البنود والرسوم والخصومات",
              "what_is_wrong": "العنصر cbc:TaxExclusiveAmount في كتلة cac:LegalMonetaryTotal ليس إجمالي البنود مضافاً إليه إجمالي الرسوم ومطروحاً منه إجمالي الخصومات. وتفحص القاعدة BR-CO-13 من معيار EN 16931، التي تنفّذها هيئة الزكاة والضريبة والجمارك، أيّاً من هذين الإجماليين الاختياريين يحمله مستندك، ثم تقرّب الناتج إلى منزلتين عشريتين وتشترط تطابقاً تاماً. وثمة حالة أشدّ من غيرها كثيراً ما تُغفل: فحين لا يحمل المستند إجمالي رسوم ولا إجمالي خصومات تشترط الهيئة أن يساوي المبلغ قبل الضريبة إجمالي البنود دون أي تقريب، فإجمالي بنود مكتوب 100.001 مقابل مبلغ قبل الضريبة 100.00 يخفق، بينما كان سيُقرَّب أولاً في كل حالة أخرى.",
              "what_to_check_in_your_erp": "ابدأ بالتحقّق من أن المبالغ الداخلة في هذا الجمع هي التي تتوقعها الهيئة: cbc:LineExtensionAmount للبنود، وcbc:ChargeTotalAmount لرسوم المستند، وcbc:AllowanceTotalAmount لخصوماته. ثم راجع عدد المنازل العشرية التي يكتبها نظامك. فإن حمل أي مبلغ ثلاث منازل أو أكثر فاكتبه بمنزلتين؛ فالحالة الأشدّ أعلاه تقارن تلك الأرقام مقارنة صارمة، والمنزلة الثالثة التي تختفي بالتقريب في تقاريرك لا تختفي هنا.",
              "review": "approved"
            }
          }
        },
        {
          "rule_id": "MTB-BR-CO-15",
          "zatca_codes": [
            "BR-CO-15"
          ],
          "severity": "ERROR",
          "xpath": "//*[local-name()='LegalMonetaryTotal']/*[local-name()='TaxInclusiveAmount']",
          "observed_value_class": "not_exclusive_plus_subtotals",
          "explanation_key": "br_co_15.not_exclusive_plus_subtotals",
          "explanation": {
            "ar": {
              "title": "الإجمالي شاملاً الضريبة لا يساوي الإجمالي قبل الضريبة مضافاً إليه الضريبة",
              "what_is_wrong": "العنصر cbc:TaxInclusiveAmount في كتلة cac:LegalMonetaryTotal ليس العنصر cbc:TaxExclusiveAmount مضافاً إليه مجموع مبالغ التفصيل الضريبي. وتجمع القاعدة BR-CO-15 من معيار EN 16931، التي تنفّذها هيئة الزكاة والضريبة والجمارك، الإجمالي قبل الضريبة إلى مبلغ cbc:TaxAmount في كل عنصر cac:TaxSubtotal، ثم تقرّب الناتج إلى منزلتين عشريتين وتشترط تطابقاً تاماً.",
              "what_to_check_in_your_erp": "تأتي الأرقام الثلاثة عادةً من مواضع مختلفة، فابحث عن أيّها الخارج عن الصواب بدل تعديل الإجمالي ليوافق. والسبب المتكرّر أن تُحسب الضريبة لكل بند وتُقرَّب هناك بينما يُحسب التفصيل لكل فئة ضريبية: فالهيئة تجمع أولاً وتقرّب مرة واحدة، فقد يفترق التقريب على مستوى البند بهللة أو هللتين. وسبب آخر خصم على مستوى المستند طُبِّق بعد حساب الضريبة. ولاحظ أن هذه القاعدة تقرأ بنود التفصيل الضريبي، فالمستند الصحيحة إجمالياته والناقص تفصيله يخفق هنا أيضاً.",
              "review": "approved"
            }
          }
        },
        {
          "rule_id": "MTB-BATCH-02",
          "zatca_codes": [],
          "severity": "WARNING",
          "xpath": "//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']",
          "observed_value_class": "icv_repeated_in_archive",
          "explanation_key": "batch.counter.icv_repeated_in_archive",
          "explanation": {
            "ar": {
              "title": "قيمة عدّاد الفواتير مكرَّرة داخل أرشيف ZIP نفسه",
              "what_is_wrong": "يحمل ملفان أو أكثر من ملفات الأرشيف المرفوع قيمة عدّاد الفواتير KSA-16 نفسها تحت رقم التسجيل في ضريبة القيمة المضافة نفسه للبائع، وتُذكر هذه الملاحظة على كل منها. ويصف الدليل الإرشادي التفصيلي للفوترة الإلكترونية الصادر عن هيئة الزكاة والضريبة والجمارك (الملحق 2 من قرار الفوترة الإلكترونية) العدّاد بأنه تسلسل مقاوم للعبث لا يمكن تصفيره ويزيد مع كل فاتورة أو إشعار يصدر؛ أما معيار تطبيق XML نفسه فلا يشترط إلا وجود العدّاد وكتابته بالأرقام. وفي قراءة مطابق، يخصّ العدّاد حل الفوترة الإلكترونية الذي يُصدر المستندات، فحلّان من حلول الفوترة الإلكترونية لبائع واحد قد يحملان الأرقام نفسها، أما الحل الواحد فلا يمكن أن يكرّر رقماً. وإن كانت هذه الملفات صادرة عن أجهزة مختلفة فهذا أمر متوقَّع. وتُرصد هذه الحالة بوصفها مخاطرة لا سبب رفض: فقواعد الهيئة المنشورة تقرأ مستنداً واحداً في كل مرة ولا تفحص إلا وجود العدّاد، فلا يرى التكرارَ أي فحص منها. وما دامت القيمة مكرَّرة فلا يفحص مطابق صلة بصمة الفاتورة السابقة الداخلة إليها ولا الخارجة منها، إذ ليس ثمة مستند واحد قبلها ولا بعدها.",
              "what_to_check_in_your_erp": "إن كانت الملفات صادرة عن جهاز واحد فالعدّاد إما لا يتقدّم وإما يُصفَّر: ابحث عن عدّاد يُحفظ لكل جلسة مستخدم أو لكل عملية لا مرة واحدة للجهاز، وعن قيمة تُصفَّر عند إعادة التشغيل أو إعادة الإصدار أو نهاية السنة، وعن مستند صُدِّر مرتين في ملفين مختلفين، وعن نسخة من ملف واحد وُضعت في الأرشيف مرتين. وإن كانت صادرة عن أجهزة مختلفة فلا خلل، وأوضح طريقة لقراءة التقرير أن ترفع مستندات كل جهاز في أرشيف خاص به.",
              "review": "approved"
            }
          }
        }
      ]
    },
    {
      "position": 3,
      "name": "good-23-seller-address-incomplete.xml",
      "verdict": "PASS",
      "document_identity": {
        "invoice_number": "MTB-G01",
        "issue_date": "2026-09-01",
        "invoice_type_code": "388",
        "invoice_type_name": "0100000",
        "seller_vat_number": "300000000000003",
        "icv": "1"
      },
      "qr_consistent": null,
      "findings": [
        {
          "rule_id": "MTB-BR-KSA-09",
          "zatca_codes": [
            "BR-KSA-09"
          ],
          "severity": "WARNING",
          "xpath": "//*[local-name()='AccountingSupplierParty']/*[local-name()='Party']/*[local-name()='PostalAddress']",
          "observed_value_class": "city_subdivision_missing",
          "explanation_key": "br_ksa_09.city_subdivision_missing",
          "explanation": {
            "ar": {
              "title": "عنوان البائع لا يحمل الحي",
              "what_is_wrong": "العنوان البريدي للبائع لا يحمل العنصر cbc:CitySubdivisionName، وهو ما تسمّيه رسالة هيئة الزكاة والضريبة والجمارك الحي KSA-3. وتشترط القاعدة BR-KSA-09 ستة حقول في العنوان البريدي للبائع تحت cac:AccountingSupplierParty/cac:Party/cac:PostalAddress: اسم الشارع BT-35 في العنصر cbc:StreetName، ورقم المبنى KSA-17 في cbc:BuildingNumber، واسم المدينة BT-37 في cbc:CityName، والرمز البريدي BT-38 في cbc:PostalZone، والحي KSA-3 في cbc:CitySubdivisionName، ورمز الدولة BT-40 في cac:Country/cbc:IdentificationCode. وتُرصد هذه الحالة بوصفها مخاطرة لا سبب رفض. وكانت هذه القاعدة، في إصدار حزمة أدوات التطوير SDK الذي قرأته الحزمة قبل الإصدار 2.0.0 (أي 3.0.8)، الفحصَ الوحيد الذي صنّفته الهيئة تحذيراً لا خطأً؛ أما الإصدار 3.4.8 الذي تقرؤه الحزمة الآن فيصنّف أكثر فحوصه تحذيرات، والقاعدة BR-KSA-09 باقية بينها: تسجّل الهيئة النقص ولا ترفض المستند من أجله، ولا تقلب هذه الملاحظة نتيجة التقرير إلى إخفاق. وكان الإصدار 3.0.8 يطلب كذلك الرقم الإضافي KSA-23 في cbc:PlotIdentification، ولا يطلبه الإصدار 3.4.8. ويصف قاموس البيانات حقول العنوان بالإلزامية، وهذا لا يغيّر تصنيف الفحص نفسه. والفحص فحص وجود لا غير، فالعنصر الموجود الفارغ يجتازه؛ ويتوقف عند أول حقل غائب بترتيب الهيئة نفسه، وهو اسم الشارع ثم رقم المبنى ثم اسم المدينة ثم الرمز البريدي ثم الحي ثم رمز الدولة، فقد يغيب أكثر من حقل من الستة ولا يُسمّى هنا إلا أولها. ويسري هذا على الفاتورة الضريبية والفاتورة المبسطة سواء.",
              "what_to_check_in_your_erp": "الحي جزء من العنوان الوطني السعودي لا نظير له في صيغ العناوين التي تأتي بها معظم الأنظمة، فهو إما غير مُلتقط أصلاً وإما مدموج في سطر الشارع. ابحث في سجل المنشأة أو الفرع عن حقل للحي؛ فإن لم يوجد فإن إضافة حقل مخصّص وربطه بالعنصر cbc:CitySubdivisionName هي المعالجة الصحيحة، أما تفكيكه من نص الشارع فليس كذلك.",
              "review": "approved"
            }
          }
        },
        {
          "rule_id": "MTB-BATCH-02",
          "zatca_codes": [],
          "severity": "WARNING",
          "xpath": "//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']",
          "observed_value_class": "icv_repeated_in_archive",
          "explanation_key": "batch.counter.icv_repeated_in_archive",
          "explanation": {
            "ar": {
              "title": "قيمة عدّاد الفواتير مكرَّرة داخل أرشيف ZIP نفسه",
              "what_is_wrong": "يحمل ملفان أو أكثر من ملفات الأرشيف المرفوع قيمة عدّاد الفواتير KSA-16 نفسها تحت رقم التسجيل في ضريبة القيمة المضافة نفسه للبائع، وتُذكر هذه الملاحظة على كل منها. ويصف الدليل الإرشادي التفصيلي للفوترة الإلكترونية الصادر عن هيئة الزكاة والضريبة والجمارك (الملحق 2 من قرار الفوترة الإلكترونية) العدّاد بأنه تسلسل مقاوم للعبث لا يمكن تصفيره ويزيد مع كل فاتورة أو إشعار يصدر؛ أما معيار تطبيق XML نفسه فلا يشترط إلا وجود العدّاد وكتابته بالأرقام. وفي قراءة مطابق، يخصّ العدّاد حل الفوترة الإلكترونية الذي يُصدر المستندات، فحلّان من حلول الفوترة الإلكترونية لبائع واحد قد يحملان الأرقام نفسها، أما الحل الواحد فلا يمكن أن يكرّر رقماً. وإن كانت هذه الملفات صادرة عن أجهزة مختلفة فهذا أمر متوقَّع. وتُرصد هذه الحالة بوصفها مخاطرة لا سبب رفض: فقواعد الهيئة المنشورة تقرأ مستنداً واحداً في كل مرة ولا تفحص إلا وجود العدّاد، فلا يرى التكرارَ أي فحص منها. وما دامت القيمة مكرَّرة فلا يفحص مطابق صلة بصمة الفاتورة السابقة الداخلة إليها ولا الخارجة منها، إذ ليس ثمة مستند واحد قبلها ولا بعدها.",
              "what_to_check_in_your_erp": "إن كانت الملفات صادرة عن جهاز واحد فالعدّاد إما لا يتقدّم وإما يُصفَّر: ابحث عن عدّاد يُحفظ لكل جلسة مستخدم أو لكل عملية لا مرة واحدة للجهاز، وعن قيمة تُصفَّر عند إعادة التشغيل أو إعادة الإصدار أو نهاية السنة، وعن مستند صُدِّر مرتين في ملفين مختلفين، وعن نسخة من ملف واحد وُضعت في الأرشيف مرتين. وإن كانت صادرة عن أجهزة مختلفة فلا خلل، وأوضح طريقة لقراءة التقرير أن ترفع مستندات كل جهاز في أرشيف خاص به.",
              "review": "approved"
            }
          }
        }
      ]
    },
    {
      "position": 4,
      "name": "bad-04-vat-number-14-digits.xml",
      "verdict": "FAIL",
      "document_identity": {
        "invoice_number": "MTB-G01",
        "issue_date": "2026-09-01",
        "invoice_type_code": "388",
        "invoice_type_name": "0100000",
        "seller_vat_number": "30000000000003",
        "icv": "1"
      },
      "qr_consistent": null,
      "findings": [
        {
          "rule_id": "MTB-BR-KSA-40",
          "zatca_codes": [
            "BR-KSA-40"
          ],
          "severity": "ERROR",
          "xpath": "//*[local-name()='AccountingSupplierParty']//*[local-name()='PartyTaxScheme']/*[local-name()='CompanyID']",
          "observed_value_class": "not_15_digits",
          "explanation_key": "br_ksa_40.not_15_digits",
          "explanation": {
            "ar": {
              "title": "رقم التسجيل في ضريبة القيمة المضافة للبائع ليس خمسة عشر رقماً",
              "what_is_wrong": "رقم تسجيل البائع في ضريبة القيمة المضافة BT-31، الوارد في العنصر cbc:CompanyID تحت النظام الضريبي VAT للبائع، ليس خمسة عشر رقماً بالضبط. وترفضه هيئة الزكاة والضريبة والجمارك بموجب القاعدة BR-KSA-40 التي تشترط خمسة عشر رقماً لا غير؛ فالأقصر والأطول وأي محرف ليس رقماً كلها تخفق في الفحص نفسه.",
              "what_to_check_in_your_erp": "أرسل الأرقام الخمسة عشر وحدها: بلا مسافات ولا شرطات ولا بادئة VAT أو SA ولا فواصل تجميع. والأسباب الشائعة: رقم محفوظ بتنسيق للعرض ويُصدَّر كما هو محفوظ، وقيمة حُشيت أو بُترت إلى عرض عمود ثابت، وربط رقم السجل التجاري في هذا الحقل خطأً وهو رقم آخر من عشرة أرقام عادةً. صحّح ذلك في سجل المنشأة أو في الربط لا في الملف المصدَّر.",
              "review": "approved"
            }
          }
        }
      ]
    }
  ],
  "upload": {
    "file_names": [
      "mutabiq-sample-batch.zip"
    ]
  }
}