عملت فاتورة بيع، اتعمل إذن تسليم مسودة، رحت صرفت جزء (4 من 5) — لكن النظام ما عملش إذن تاني بالباقي وما ظهرش أي تتبّع على الفاتورة. ده مش عطل — ده لأن «وضع التسليم» مش مفعَّل على شركتك. التفاصيل بالأدلة من قاعدة بياناتك تحت.
شركتك دلوقتي على «احتساب التكلفة عند الفاتورة» (الوضع الافتراضي) — والميزة الجديدة (التسليم الجزئي + الإذن المتبقّي + تتبّع المُسلَّم + COGS عند التسليم) opt-in، بتشتغل بس لما تفعّل «نقطة احتساب التكلفة = عند التسليم». عشان كده: الصرف الجزئي اتسجّل على مستوى المخزن صح (الإذن بقى «مصروف جزئيًا 4 من 5»)، لكن طرف المبيعات ما تحرّكش (مفيش إذن متبقّي، الفاتورة فضلت «قيد الانتظار»، مفيش قيد COGS عند التسليم). الحل: فعّل الإعداد وأعد التجربة.
استخرجت الحالة الفعلية من قاعدة بياناتك للفاتورة والإذن اللي عملتهم:
| الإعداد | القيمة الحالية | المعنى |
|---|---|---|
sales.cogs_recognition_point | NULL → "invoice" | 🔴 وضع الفاتورة — الميزة الجديدة مُطفأة |
sales.auto_create_stock_issue_on_invoice | 'true' | بيعمل إذن صرف مسودة تلقائيًا |
sales.auto_approve_stock_issue_on_invoice | 'false' | الإذن بيتعمل مسودة (مايتعتمدش آليًا) |
sales.auto_create_backorder | NULL → true | (بيشتغل بس في وضع التسليم) |
inventory.allow_partial_issue | NULL → true | الصرف الجزئي مسموح على مستوى المخزن |
delivery_processed_at=NULL وdelivered=0 وfulfillment_status=Pending — يعني
مستمع المبيعات (اللي بيعمل الإذن المتبقّي ويحدّث المُسلَّم ويسجّل COGS) ما اشتغلش إطلاقًا.
الميزة الجديدة كلها متحكّم فيها بوابة واحدة: sales.cogs_recognition_point.
invoice (الافتراضي — اللي إنت عليه): السلوك القديم بالظبط. المستمع
PostSaleCogsOnIssueApproved بيرجع فورًا (no-op) — فمفيش تتبّع مُسلَّم، مفيش إذن متبقّي، مفيش COGS عند التسليم.
ده مقصود: عشان أي شركة ماغيّرتش الإعداد ماتلاقيش سلوكها اتغيّر.delivery: الفاتورة تسجّل إيراد بس، واعتماد الإذن (المستمع) هو اللي يسجّل COGS بالكمية المنصرفة،
يحدّث «المُسلَّم»، يحسب حالة التسليم، ويعمل إذن متبقّي تلقائي.الصرف الجزئي على مستوى المخزن (إدخال «الكمية المنصرفة» وحالة «مصروف جزئيًا») شغّال في الوضعين — عشان كده الإذن سجّل 4 من 5 صح. لكن أوركسترا المبيعات (المتبقّي/المُسلَّم/الحالة/التكلفة) مربوطة بوضع التسليم فقط، وإنت لسه في وضع الفاتورة.
لو كان cogs_recognition_point = delivery، نفس خطواتك (صرف 4 من 5) كانت هتعمل:
delivered_quantity = 4، والحالة partially_delivered (مُسلَّم جزئيًا).Dr COGS / Cr Inventory لقيمة الـ4 المنصرفة فقط (مش الـ5)، وdelivery_processed_at يتسجّل.delivered=5، الحالة fully_delivered، وإجمالي COGS = تكلفة الـ5.
أو لو الباقي مش هيتسلّم → زر «إقفال على المُسلَّم».المخزن سمحلك تصرف 4 من 5 وحطّ الإذن «مصروف جزئيًا» — لكن لأننا في وضع الفاتورة، مفيش إذن متبقّي ولا تتبّع. ده مربك: المستخدم يفتكر إنه عمل تسليم جزئي والنظام «نسي» الباقي. التوصية: في وضع الفاتورة، يا إمّا نمنع الصرف الجزئي (نلزم بالكمية كاملة)، يا إمّا نعرض تنبيه واضح إن «التسليم الجزئي محتاج وضع التسليم».
source_item_idالإذن التلقائي بيتعمل ومعاه source_item_id (الرابط بسطر الفاتورة). لكن لما تعدّل المسودة (عشان تحط الكمية المنصرفة)،
المتحكّم بيمسح الأصناف ويعيد إنشاءها من الطلب — والطلب مش بيمرّر source_item_id → بيتحوّل لـ NULL (شوفناه في إذنك).
في وضع التسليم ده بيخلّي تتبّع المُسلَّم يرجع لمطابقة بالمنتج (تمام للفاتورة بسطر واحد، لكن ممكن يلخبط لو نفس المنتج في سطرين).
التوصية: نحافظ على source_item_id عند التعديل.
قلت إن الإذن «عرض الداتا كاملة كأن استلمها كلها» — بينما فعليًا issued_quantity=4 وquantity=5.
يبقى العرض محتاج يوضّح المطلوب 5 / المنصرف 4 / المتبقّي 1 بشكل أظهر في شاشة الإذن.
| اللي حصل (وضع الفاتورة) | اللي المفروض (وضع التسليم) | |
|---|---|---|
| الإذن (المخزن) | مصروف جزئيًا 4/5 ✓ | مصروف جزئيًا 4/5 ✓ |
| المُسلَّم على الفاتورة | 0 (ما اتحدّثش) | 4 |
| حالة تسليم الفاتورة | Pending | partially_delivered |
| قيد COGS | مفيش (عند التسليم) | للـ4 المنصرفة |
| إذن المتبقّي (1) | ما اتعملش | مسودة تلقائية |