Update: 2026-05-11 22:31:36

This commit is contained in:
Hamza-Ayed
2026-05-11 22:31:36 +03:00
parent 79f98a4afb
commit 8948397af9
2 changed files with 13 additions and 9 deletions

View File

@@ -19,13 +19,16 @@ class InvoiceExtractionService
- لا تخترع أي بيانات غير موجودة — أعد null إذا لم تجد المعلومة - لا تخترع أي بيانات غير موجودة — أعد null إذا لم تجد المعلومة
════════════════════════════════════════ ════════════════════════════════════════
## التحقق الرياضي (إلزامي): ## التحقق الرياضي والفواتير الشاملة للضريبة (إلزامي):
════════════════════════════════════════ ════════════════════════════════════════
- line_total = (quantity × unit_price) - discount لكل سطر - معظم فواتير التجزئة والسوبرماركت (POS) في الأردن تكون "شاملة للضريبة" (Tax Inclusive).
- هذا يعني أن السعر المطبوع على الفاتورة (unit_price) والمجموع الجزئي للسطر (line_total) يحتويان أصلاً على الضريبة إن وجدت.
- line_total = (quantity × unit_price) - discount لكل سطر (وهذا المبلغ شامل للضريبة).
- subtotal = مجموع كل line_total - subtotal = مجموع كل line_total
- tax_amount = مجموع (line_total × tax_rate) لكل سطر - grand_total = subtotal - discount_total (يجب أن يتطابق تماماً مع المبلغ الكلي المطلوب من العميل في الفاتورة).
- grand_total = subtotal - discount_total + tax_amount - tax_amount = مجموع الضرائب المحسوبة عكسياً من line_total (أو كما هي مذكورة صراحةً في أسفل الفاتورة). إياك أن تضيف tax_amount فوق subtotal إذا كانت الفاتورة شاملة للضريبة.
- إذا وجدت تناقضاً في الفاتورة بين الأرقام المطبوعة والحسابات: سجِّله في validation_warnings، واستخدم القيم المحسوبة - إذا كانت الفاتورة من النوع النادر غير الشامل للضريبة (Tax Exclusive): grand_total = subtotal - discount_total + tax_amount
- إذا وجدت تناقضاً في الفاتورة بين الأرقام المطبوعة والحسابات: يجب أن تعطي الأولوية القصوى لتطابق `grand_total` مع الرقم المطبوع الذي تم دفعه فعلياً، وسجِّل أي ملاحظات في validation_warnings.
════════════════════════════════════════ ════════════════════════════════════════
## جدول الضرائب الأردنية (مرجعك الإلزامي): ## جدول الضرائب الأردنية (مرجعك الإلزامي):
@@ -90,7 +93,8 @@ class InvoiceExtractionService
- زيت الزيتون غير المعدل كيماوياً - زيت الزيتون غير المعدل كيماوياً
- سكر مكرر (عدا سكر القصب) - سكر مكرر (عدا سكر القصب)
- الشاي الأسود (عبوات ≤ 3 كغ) - الشاي الأسود (عبوات ≤ 3 كغ)
- الحليب المعبأ (≤ 5 كغ) والحليب المجفف (≤ 3 كغ) - الحليب المعبأ (≤ 5 كغ) والحليب المجفف (مثل حليب نيدو)
- الألبان (اللبن الرائب، الشنينة، لبن حمودة، الخ) والأجبان البيضاء العادية.
- بيض المائدة - بيض المائدة
- خضروات طازجة أو مبردة: بصل، ثوم، خيار، بندورة، بطاطا، فول - خضروات طازجة أو مبردة: بصل، ثوم، خيار، بندورة، بطاطا، فول
- أجهزة الهواتف الذكية - أجهزة الهواتف الذكية
@@ -106,8 +110,8 @@ class InvoiceExtractionService
════════════════════════════════════════ ════════════════════════════════════════
## قواعد تصنيف الضريبة لكل سطر: ## قواعد تصنيف الضريبة لكل سطر:
════════════════════════════════════════ ════════════════════════════════════════
1. ابحث أولاً في قوائم الإعفاء والصفر والنسب المخفضة 1. ابحث أولاً في قوائم الإعفاء والصفر والنسب المخفضة. المواد الغذائية الأساسية في السوبرماركت (ألبان، أجبان، حليب، خبز) غالباً معفاة (0% أو 4%). لا تفرض 16% إلا على الكماليات (منظفات، حلويات، عصائر مصنعة، الخ).
2. إذا لم تجد السلعة في أي قائمة → نسبة 16% هي الافتراضية 2. إذا لم تجد السلعة في أي قائمة → نسبة 16% هي الافتراضية للسلع غير الغذائية والخدمات.
3. إذا صرّحت الفاتورة بنسبة مختلفة عن المتوقع → استخدم ما في الفاتورة وسجِّل ملاحظة في validation_warnings 3. إذا صرّحت الفاتورة بنسبة مختلفة عن المتوقع → استخدم ما في الفاتورة وسجِّل ملاحظة في validation_warnings
4. tax_category: استخدم "S" للخاضعة (16% أو مخفضة)، "Z" للصفري، "E" للمعفاة، "O" للخاصة 4. tax_category: استخدم "S" للخاضعة (16% أو مخفضة)، "Z" للصفري، "E" للمعفاة، "O" للخاصة

View File

@@ -2591,7 +2591,7 @@
<td style="padding:12px 16px; font-weight:600; color:var(--text-1);" x-text="item.description"></td> <td style="padding:12px 16px; font-weight:600; color:var(--text-1);" x-text="item.description"></td>
<td style="padding:12px 16px; text-align:center; font-family:'Outfit',sans-serif;" x-text="item.quantity"></td> <td style="padding:12px 16px; text-align:center; font-family:'Outfit',sans-serif;" x-text="item.quantity"></td>
<td style="padding:12px 16px; color:var(--green-mid); font-family:'Outfit',sans-serif;" x-text="item.unit_price"></td> <td style="padding:12px 16px; color:var(--green-mid); font-family:'Outfit',sans-serif;" x-text="item.unit_price"></td>
<td style="padding:12px 16px; color:var(--amber-mid); font-family:'Outfit',sans-serif;" x-text="(item.tax_rate || 0) + '%'"></td> <td style="padding:12px 16px; color:var(--amber-mid); font-family:'Outfit',sans-serif;" x-text="((parseFloat(item.tax_rate) || 0) * 100).toFixed(0) + '%'"></td>
<td style="padding:12px 16px; font-weight:700; color:var(--violet-mid); font-family:'Outfit',sans-serif;" x-text="item.line_total"></td> <td style="padding:12px 16px; font-weight:700; color:var(--violet-mid); font-family:'Outfit',sans-serif;" x-text="item.line_total"></td>
</tr> </tr>
</template> </template>