ف فواترا

إنشاء فاتورة

POST /v1/invoices

ينشئ الفاتورة، يبني مستند UBL، ويُرسلها إلى بوابة الفوترة الوطنية في طلب واحد متزامن.

الترويسات

الترويسةإلزاميةالوصف
AuthorizationنعمBearer <API_KEY>
Content-Typeنعمapplication/json
Idempotency-Keyمستحسنة بشدّةمفتاح فريد لمنع التكرار عند إعادة الإرسال. التفاصيل.

حقول الجسم

الحقلالنوعإلزاميالوصف
invoice_numberstring(64)نعمرقم الفاتورة في نظامك. فريد لكل حساب داخل الوضع نفسه.
issue_datedateلاYYYY-MM-DD. الافتراضي: تاريخ اليوم.
payment_methodenumلاcash (نقدي) أو receivable (ذمم). الافتراضي cash.
currencystring(3)لاISO-4217. الافتراضي JOD.
notestring(500)لاملاحظة تُرسل في cbc:Note.
global_discountnumberلاخصم على مستوى الفاتورة. يُوزّع تناسبيًا على البنود (انظر أدناه).
metadataobjectلابيانات حرّة تُخزَّن معنا ولا تُرسل إلى البوابة.
customerobjectنعمبيانات المشتري.
linesarrayنعمبند واحد على الأقل، و 300 كحدٍّ أعلى.

كائن customer

الحقلالنوعإلزاميالوصف
namestring(191)نعماسم المشتري. استخدم «مستهلك نهائي» للبيع النقدي للأفراد.
identity_typeenumلاtax (رقم ضريبي، يُرسل كـ TN)، national (رقم وطني، NIN)، passport (جواز، PN). الافتراضي tax.
identity_numberstringلاقيمة الهوية حسب النوع. إن تركته نأخذ tin.
tinstringلاالرقم الضريبي للمشتري إن كان مكلّفًا.
phonestringلايُرسل في AccountingContact/Telephone.
citystringلاالمدينة.
addressstringلاالشارع / العنوان.
postal_codestringلاالرمز البريدي.
country_codestring(2)لاالافتراضي JO.
emailstringلايُخزَّن لديك فقط.

عناصر lines[]

الحقلالنوعإلزاميالوصف
namestring(191)نعماسم الصنف أو الخدمة.
quantitynumberلاأكبر من صفر. الافتراضي 1.
unit_pricenumberنعمسعر الوحدة قبل الضريبة.
discountnumberلاخصم مبلغي على السطر، لا يتجاوز quantity × unit_price.
tax_percentnumberلانسبة الضريبة. الافتراضي نسبة المنشأة. تُفرض صفرًا لمكلّف الدخل.
tax_categoryenumلاS خاضع · Z نسبة صفرية · E معفى · O خارج النطاق. تُستنتج تلقائيًا.
unit_codestringلاكود الوحدة UN/ECE. الافتراضي PCE.
description, skustringلاللتوثيق لديك.

مطابقة شاشة «تنظيم فاتورة» في المنصة بحقول الـAPI

إن كنت تصدر فواتيرك اليوم يدوياً من منصة الفوترة الوطني، فهذه الخريطة تختصر مرحلة التحليل: كل حقل في شاشة «تنظيم فاتورة» وما يقابله هنا. المصدر هو «دليل المستخدم الخاص بمنصة الـPortal» الصادر عن نظام الفوترة الوطني.

يتم تمييز الحقول الإجبارية بوجود علامة *.

دليل المستخدم — «تنظيم فاتورة»
شاشة تنظيم فاتورة في منصة الفوترة الوطني: بيانات الفاتورة وبيانات البائع والمشتري وبنود السلع والمجاميع
شاشة «تنظيم فاتورة» في المنصة — المرجع الذي بُنيت عليه حقول نداء الإنشاء لدينا.
حقل الشاشةما يقابله هناملاحظة من الدليل
رقم فاتورة البائعinvoice_numberالرقم التسلسلي للفاتورة الخاص بالبائع.
تاريخ إصدار الفاتورة *issue_dateيُضبط بتاريخ اليوم مع إمكانية تغييره لتاريخ سابق — لا لتاريخ لاحق.
نوع العملة *currencyفي المنصة لا يمكن تغييره بعد إضافة أول سلعة.
فاتورة نقدية / فاتورة ذممpayment_methodcash أو receivable.
نوع الفاتورة: محلية / تصدير / مناطق تنموية *lines[].tax_percent + customer.tin«محلية» مختارة تلقائياً. «تصدير» و«مناطق تنموية/تشجيع استثمار» بنسبة 0%، والثانية يجب فيها إدخال الرقم الضريبي للمشتري.
بيانات البائعالإعداداتفي المنصة تُدخل تلقائياً من بيانات التسجيل. لدينا تُقرأ من إعدادات المنشأة.
اسم المشتريcustomer.nameإجباري لفواتير الذمم وللفواتير بقيمة 10,000 وأكثر.
نوع المعرفات الإضافيةcustomer.identity_typeالرقم الوطني أو الرقم الضريبي أو الرقم الشخصي.
رقم المشتريcustomer.identity_numberقيمة الهوية حسب النوع المختار.
رقم الهاتف / المدينة / الرمز البريديcustomer.phone · customer.city · customer.postal_codeاختيارية في الشاشة وعندنا.
وصف السلعة أو الخدمة *lines[].nameتفاصيل السلعة أو الخدمة.
الكمية * / سعر الوحدة *lines[].quantity · lines[].unit_priceلا ترسل مجاميع — تُحتسب كما تحتسبها المنصة.
قيمة الخصمlines[].discountخصم على مستوى البند، يُطرح قبل احتساب الضريبة.
نسبة الضريبة العامة *lines[].tax_percentلا تظهر لفواتير الدخل. يمكن أن تختلف من بند لآخر.
النوع (سلعة/خدمة أو بدل خدمة) *lines[].unit_codeلا تظهر لفواتير الدخل.
التصنيف الوطني للأنشطةالإعداداتاختياري في الشاشة. يُرسل من بيانات المنشأة عند ضبطه.
قيمة الضريبة الخاصة *مكلّف الضريبة الخاصةتخصّ فواتير الضريبة الخاصة وحدها.

الاسم: لإدخال اسم المشتري، ويكون إجبارياً لفواتير الذمم والفواتير بقيمة 10000 وأكثر.

دليل المستخدم — «تنظيم فاتورة» / بيانات المشتري

لهذا نجعل customer.name إلزامياً دائماً: هو أكثر سبب رفض شيوعاً في فواتير الذمم، وفرضه مسبقاً أرخص من رفض من البوابة.

الاقتباسات واللقطة أعلاه من «نظام الفوترة الوطني — دليل المستخدم الخاص بمنصة الـPortal»، وتعود ملكيتها لجهة إصداره. أُدرجت للتوضيح التقني، والدليل الرسمي هو المرجع عند أي اختلاف.

كيف تُحسب الإجماليات

لكل بند:

gross = quantity × unit_price
net   = gross − discount                  // = LineExtensionAmount في UBL
tax   = round(net × tax_percent / 100, 3)
total = net + tax

وعلى مستوى الفاتورة:

subtotal       = Σ gross
discount_total = Σ discount
taxable        = Σ net                    // = TaxExclusiveAmount
tax_total      = Σ tax
total          = taxable + tax_total      // = TaxInclusiveAmount = PayableAmount
global_discount: يُوزَّع على البنود بنسبة قيمة كل بند من الإجمالي، ويُضاف إلى خصم السطر، مع تسوية فرق التقريب في البند الأخير. هذا يضمن أن TaxExclusiveAmount يساوي دائمًا مجموع LineExtensionAmount كما تتوقّعه البوابة.

مثال كامل — مكلّف مبيعات بنسبة 16%

الطلب
{
  "invoice_number": "S-2026-0042",
  "issue_date": "2026-10-23",
  "payment_method": "receivable",
  "currency": "JOD",
  "note": "دفعة أولى من العقد رقم 17",
  "global_discount": 5.000,
  "customer": {
    "name": "مؤسسة الفجر التجارية",
    "identity_type": "tax",
    "identity_number": "98765432",
    "tin": "98765432",
    "phone": "0795555555",
    "city": "Irbid",
    "address": "شارع الجامعة",
    "country_code": "JO"
  },
  "lines": [
    {
      "name": "لابتوب Dell Latitude 5440",
      "sku": "DL-5440",
      "quantity": 2,
      "unit_code": "PCE",
      "unit_price": 450.000,
      "discount": 20.000,
      "tax_percent": 16
    },
    {
      "name": "حقيبة لابتوب",
      "quantity": 2,
      "unit_price": 12.500,
      "tax_percent": 16
    }
  ],
  "metadata": { "erp_order_id": "SO-99813" }
}
الردّ — 201 Created
{
  "data": {
    "id": "inv_5c8d1e9a2b7f3046",
    "object": "invoice",
    "mode": "live",
    "document_type": "invoice",
    "invoice_number": "S-2026-0042",
    "uuid": "9c2e4f1b-7a3d-4856-b0c9-1d2e3f4a5b6c",
    "icv": 42,
    "type_code": "388",
    "type_name": "022",
    "payment_method": "receivable",
    "status": "accepted",
    "totals": {
      "subtotal": 925.000,
      "discount_total": 25.000,
      "tax_total": 144.000,
      "total": 1044.000
    },
    "qr_content": "AQ3YtNix...",
    "qr_image_url": "https://fawtara.codexal.co/api/v1/invoices/inv_5c8d1e9a2b7f3046/qr.png",
    "ubl_url": "https://fawtara.codexal.co/api/v1/invoices/inv_5c8d1e9a2b7f3046/ubl",
    "jofotara": { "status": "SUBMITTED", "uuid": "…", "http_code": 200 },
    "error": null,
    "attempts": 1,
    "submitted_at": "2026-10-23 00:32:09"
  }
}

رموز الاستجابة

الرمزالمعنى
201أُنشئت وقُبلت من البوابة — status = accepted.
202أُنشئت لدينا ولم تُقبل بعد (rejected أو error). راجع error ثم استخدم retry.
200إعادة تشغيل لطلب سابق بنفس Idempotency-Key (مع idempotent_replay: true).
402تجاوز الحصة الشهرية أو اشتراك غير نشط.
409رقم فاتورة مكرّر، أو بيانات اعتماد البوابة غير مضبوطة.
422خطأ تحقّق — error.fields يحدّد الحقل بدقّة.
429تجاوز حد الطلبات في الدقيقة.

معاينة بدون إرسال

POST /v1/invoices/preview

نفس جسم الطلب، لكن لا يُنشأ سجل ولا يُرسل شيء ولا يُستهلك من حصّتك. يُعيد الإجماليات المحسوبة ومستند UBL المُنسَّق وubl_base64 — مثالي للتحقّق أثناء التطوير.

curl -X POST https://fawtara.codexal.co/api/v1/invoices/preview \
  -H "Authorization: Bearer fwt_test_xxx" \
  -H "Content-Type: application/json" \
  -d @invoice.json