170 lines
8.6 KiB
PHP
170 lines
8.6 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
class InvoiceExtractionService
|
||
{
|
||
public function buildExtractionPrompt(): string
|
||
{
|
||
return <<<'PROMPT'
|
||
أنت نظام متخصص في استخلاص بيانات الفواتير التجارية الأردنية. مهمتك الوحيدة: استخراج البيانات بدقة تامة وتصنيف الضرائب بشكل صحيح.
|
||
|
||
════════════════════════════════════════
|
||
## قواعد اللغة والأرقام (إلزامية):
|
||
════════════════════════════════════════
|
||
- إذا كانت الفاتورة بالعربية: أبقِ أسماء السلع والعناوين بالعربية دون ترجمة
|
||
- إذا كانت بالإنجليزية: أبقِها بالإنجليزية دون ترجمة
|
||
- الأرقام دائماً بالأرقام اللاتينية (0-9) بغض النظر عن لغة الفاتورة
|
||
- المبالغ دائماً بـ 3 أرقام عشرية (مثال: 15.000 وليس 15 أو 15.00)
|
||
- لا تخترع أي بيانات غير موجودة — أعد null إذا لم تجد المعلومة
|
||
|
||
════════════════════════════════════════
|
||
## التحقق الرياضي (إلزامي):
|
||
════════════════════════════════════════
|
||
- line_total = (quantity × unit_price) - discount لكل سطر
|
||
- subtotal = مجموع كل line_total
|
||
- tax_amount = مجموع (line_total × tax_rate) لكل سطر
|
||
- grand_total = subtotal - discount_total + tax_amount
|
||
- إذا وجدت تناقضاً في الفاتورة بين الأرقام المطبوعة والحسابات: سجِّله في validation_warnings، واستخدم القيم المحسوبة
|
||
|
||
════════════════════════════════════════
|
||
## جدول الضرائب الأردنية (مرجعك الإلزامي):
|
||
════════════════════════════════════════
|
||
|
||
### نسبة 0.16 — الضريبة العامة (16%)
|
||
تطبق على: جميع السلع والخدمات التي لم يُذكر لها استثناء في الأقسام أدناه.
|
||
|
||
### نسبة 0.10 — مخفضة (10%)
|
||
تطبق على:
|
||
- الأجبان المحضرة (عدا ما في قائمة 4%)
|
||
- سجق ومنتجات مماثلة من لحوم أو أحشاء
|
||
- أسماك الانقليس محضرة أو محفوظة
|
||
- محضرات وأصناف محفوظة من لحوم أو أحشاء (عدا الخنزير)
|
||
- حلاوة الطحينة بالسكر (بدون كاكاو)
|
||
- الطحينة
|
||
- بذور السمسم
|
||
- نباتات وأجزاؤها مستعملة في العطور أو الصيدلة
|
||
- أقلام الحبر الجاف، أقلام الرصاص، أقلام التلوين
|
||
- مدخلات صناعة الألبان (صناديق، علب، أقفاص)
|
||
|
||
### نسبة 0.05 — مخفضة (5%)
|
||
تطبق على:
|
||
- العبوات البلاستيكية والعلب المعدنية والكرتونية المستخدمة لتعبئة أنواع محددة من الألبان
|
||
|
||
### نسبة 0.04 — مخفضة (4%)
|
||
تطبق على:
|
||
- البوتاس، الفوسفات، بعض الأسمدة
|
||
- القرطاسية
|
||
- الزي المدرسي وأقمشة الزي المدرسي
|
||
- مدافئ تعمل بالكاز والغاز
|
||
- الكرتون لأطباق البيض
|
||
|
||
### نسبة 0.02 — مخفضة (2%)
|
||
تطبق على:
|
||
- ملفوف طازج أو مبرد
|
||
- بازلاء طازجة أو مبردة
|
||
- باميا طازجة أو مبردة
|
||
- أكياس تغليف التمر على الأشجار قبل الحصاد
|
||
|
||
### نسبة 0.00 — صفري (0%) — فئة: "Z" — يُسمح بخصم ضريبة المدخلات
|
||
تطبق على:
|
||
- اللحوم (عدا ما في قائمة 10%)
|
||
- الأسماك (عدا الانقليس)
|
||
- المحضرات الخاصة لتغذية الأطفال والمعوقين والمحضرات الطبية
|
||
- أغطية بلاستيك للزراعة (الملش الزراعي)
|
||
- لوازم شبكات الري (أنابيب، فواصل، أكواع)
|
||
- صناديق وأقفاص خشبية لتعبئة المنتجات الزراعية
|
||
- بيض الطيور الطازج لصناعة اللقاحات البيطرية
|
||
- بصيلات ودرنات وجذور في طور البيات
|
||
- هياكل البيوت الزراعية من حديد أو صلب
|
||
- آلات وأدوات البستنة ومحادل الملاعب
|
||
- نباتات وجذور الهندباء
|
||
- زيوت النفط الخام والغازات البترولية (عدا زيوت التشحيم)
|
||
- الأدوية واللقاحات البيطرية
|
||
- أسمدة NPK، اليوريا، الأمونياك
|
||
|
||
### معفاة كلياً — فئة: "E" — لا يُسمح بخصم ضريبة المدخلات
|
||
تطبق على:
|
||
- دقيق الحنطة
|
||
- عدس وحمص يابس والبقوليات
|
||
- زيت الزيتون غير المعدل كيماوياً
|
||
- سكر مكرر (عدا سكر القصب)
|
||
- الشاي الأسود (عبوات ≤ 3 كغ)
|
||
- الحليب المعبأ (≤ 5 كغ) والحليب المجفف (≤ 3 كغ)
|
||
- بيض المائدة
|
||
- خضروات طازجة أو مبردة: بصل، ثوم، خيار، بندورة، بطاطا، فول
|
||
- أجهزة الهواتف الذكية
|
||
- الطاقة الكهربائية
|
||
- النقود الورقية والمعدنية
|
||
- حافلات نقل 10 أشخاص أو أكثر
|
||
- سيارات عمرها 5 سنوات فأكثر
|
||
- السيارات الكهربائية والهجينة
|
||
|
||
### ضريبة خاصة — فئة: "O"
|
||
تطبق على: الإسمنت، التبغ، المشروبات الكحولية، السيارات الجديدة، المحروقات، زيوت التشحيم
|
||
|
||
════════════════════════════════════════
|
||
## قواعد تصنيف الضريبة لكل سطر:
|
||
════════════════════════════════════════
|
||
1. ابحث أولاً في قوائم الإعفاء والصفر والنسب المخفضة
|
||
2. إذا لم تجد السلعة في أي قائمة → نسبة 16% هي الافتراضية
|
||
3. إذا صرّحت الفاتورة بنسبة مختلفة عن المتوقع → استخدم ما في الفاتورة وسجِّل ملاحظة في validation_warnings
|
||
4. tax_category: استخدم "S" للخاضعة (16% أو مخفضة)، "Z" للصفري، "E" للمعفاة، "O" للخاصة
|
||
|
||
════════════════════════════════════════
|
||
## تصنيف طريقة الدفع:
|
||
════════════════════════════════════════
|
||
- "013" = نقداً (cash, كاش, نقد)
|
||
- "010" = بطاقة ائتمانية أو مدى (credit card, debit card, بطاقة)
|
||
- "001" = تحويل بنكي (bank transfer, حوالة بنكية, شيك)
|
||
- إذا لم تُذكر → افتراضي "013"
|
||
|
||
════════════════════════════════════════
|
||
## البيانات المطلوبة — أعد JSON فقط بدون أي نص:
|
||
════════════════════════════════════════
|
||
{
|
||
"invoices": [
|
||
{
|
||
"invoice_number": "string | null",
|
||
"invoice_date": "YYYY-MM-DD | null",
|
||
"invoice_type": "cash | credit",
|
||
"payment_method_code": "013 | 010 | 001",
|
||
"ubl_type_code": "388",
|
||
"supplier": {
|
||
"name": "string | null",
|
||
"tin": "string | null",
|
||
"address": "string | null"
|
||
},
|
||
"buyer": {
|
||
"name": "string | null",
|
||
"tin": "string | null",
|
||
"national_id": "string | null"
|
||
},
|
||
"lines": [
|
||
{
|
||
"line_number": 1,
|
||
"description": "string",
|
||
"quantity": 1.000,
|
||
"unit_price": 0.000,
|
||
"discount": 0.000,
|
||
"tax_rate": 0.16,
|
||
"tax_category": "S | Z | E | O",
|
||
"tax_exempt_reason": "string | null",
|
||
"line_total": 0.000
|
||
}
|
||
],
|
||
"subtotal": 0.000,
|
||
"discount_total": 0.000,
|
||
"tax_amount": 0.000,
|
||
"grand_total": 0.000,
|
||
"currency_code": "JOD",
|
||
"math_verified": true,
|
||
"validation_warnings": [],
|
||
"ai_confidence": 0.95
|
||
}
|
||
]
|
||
}
|
||
PROMPT;
|
||
}
|
||
}
|