سير الاعتماد (Approval Workflows) — إيه هو، شغّال إزاي، وإيه اللي مش شغّال

تحليل شامل مبني على فحص كود moonui2 (BE + FE على Opus). الخلاصة الصادمة: المحرّك اللي الشاشة بتظبطه مبني بالكامل لكن ميّت — صفر استدعاء في الكود. تحليل فقط، بدون كود.

moonui2 · hazemdev2فحص Opus (BE+FE)Phase 1 — بانتظار المالك

١. السؤال (المطلوب)

المالك فتح /app/sales/approval-workflows وسأل: إيه دي؟ بتشتغل إزاي؟ موجودة في كل الموديولز ولا المبيعات بس؟ إزاي نفعّلها؟ وأهم حاجة: إيه المربوط بالكود فعليًا وإيه اللي واجهة/إعداد بس مش شغّال؟

٢. الخلاصة في ٤ نقاط

① فيه محرّكين اعتماد منفصلين تمامًا، مش متوصّلين ببعض:
  • (أ) المحرّك العام اللي الشاشة /sales/approval-workflows بتظبطه (مستويات متعدّدة + معتمِدون + حدود مبالغ) — مبني بالكامل وشغّال داخليًّا، لكن مفيش أي مستند بيستدعيه. صفر callers (مثبت بالبحث الشامل). يعني تقدر تعمل ورك-فلو وتحفظه… ومحصلش حاجة.
  • (ب) سلسلة الحالة المبرمَجة على المستند نفسه (مسودة ← معلّق ← معتمَد ← مرحّل) — دي اللي شغّالة فعلًا في المبيعات والمشتريات، بس بدائية: خطوة واحدة، بصلاحية بس، مش بتقرأ الحدود ولا الإعدادات ولا الورك-فلو المُعرَّف.
② الحدود (thresholds) ميتة في الحالتين: فاتورة بمبلغ كبير مش بتطلب اعتماد بالمبلغ في أي مكان. الإعدادين approval_workflow (none/simple/multi_level) وapproval_thresholds محفوظين ومش بيتقرأوا أبدًا.
③ التغطية: بس المبيعات + المشتريات عندهم سلوك اعتماد (السلسلة المبرمَجة). الإنتاج enum-case يتيم بلا أنواع مستندات. HRM/المخزون عندهم اعتماد خاص بيهم (إجازات/صرف جزئي) منفصل تمامًا عن المحرّك ده.
④ الحاجة الحلوة: المحرّك العام مكتوب صح ومكتمل (خدمة ApprovalWorkflowService فيها منطق الحدود + المستويات + السجلّات + الإشعارات + tab «قيد الاعتماد») — مجرد مش موصّل. التوصيل شغل محدود، مش إعادة بناء.

٣. إيه هو بالظبط + بيشتغل إزاي

المحرّك العام (أ) — البنية موجودة

السلسلة المبرمَجة (ب) — دي اللي شغّالة

مسودة Draft──submitApproval──▶معلّق Pending──approve──▶معتمَد Approved──post──▶مرحّل Posted

٤. إيه اللي شغّال وإيه اللي مش شغّال (المهم)

المكوّنالحالةالدليل
سلسلة الحالة المبرمَجة (اعتماد قبل الترحيل)✅ شغّالالمبيعات + المشتريات؛ الترحيل يشترط معتمَد. بس خطوة واحدة بصلاحية، بلا حدود/مستويات.
المحرّك العام (الشاشة كلها: ورك-فلوز/مستويات/سجلّات)❌ ميّتCRUD شغّال، بس submitForApproval صفر استدعاء — مفيش مستند بينشئ سجلّ. إعداد بلا تنفيذ.
الحدود بالمبلغ (thresholds)❌ ميتةالإعداد approval_thresholds صفر قُرّاء؛ حدود المستويات بتتقيّم جوّه خدمة مش بتتنده. فاتورة كبيرة مش بتطلب اعتماد.
إعداد approval_workflow (none/simple/multi_level)❌ مش بيتقرأ في الباكالفرونت بس بيفرّق «none» عن «مش-none»؛ الباك مبيقراهوش خالص. القيمة multi_level مالهاش أثر.
tab «قيد الاعتماد» + الموافقة/الرفض على السجلّات⚠️ يعمل لكن فاضيبيقرأ سجلّات مفيش حد بينشئها → القائمة دايمًا فاضية. معزول جوّه شاشة المبيعات.
الإنتاج في المحرّك❌ يتيمenum فيه Production بس مفيش أنواع مستندات ليه → ورك-فلو غير قابل للإنشاء.
باختصار: شاشة «سير الاعتماد» = واجهة إعداد لمحرّك متكامل لكن مفصول عن دورة حياة أي مستند. اللي بيحمي مستنداتك فعلًا حاجة تانية بدائية (سلسلة حالة بصلاحية واحدة). فأنت بتظبط حاجة… مالهاش تأثير.

٥. هل موجودة في كل الموديولز؟ — لأ

الموديولفي enum المحرّك؟أنواع مستندات؟المحرّك مفروض؟سلسلة الحالة المبرمَجة؟
المبيعاتquotation/order/invoice/return/delivery✅ (بصلاحية، بلا حدود)
المشترياتrequest/order/bill/return/grn✅ (بصلاحية، بلا حدود)
الإنتاج✅ enum بس❌ ولا نوع❌ (إشعارات أدوار بس)
المخزوناعتماد صرف جزئي خاص به (منفصل)
الموارد البشريةLeaveApproval خاص به (منفصل)
المحاسبة / POS / المعمل / CRM

٦. إزاي «نفعّلها» فعليًا

النهارده: لو عايز اعتماد بسيط (خطوة واحدة قبل الترحيل) — هو شغّال أصلًا في المبيعات/المشتريات: امنح المستخدم صلاحية العرض/الإنشاء من غير *.approve، وامنح *.approve للمدير بس. فالموظف يعمل مسودة، والمدير يعتمد، وبعدها الترحيل. (ده يحقق «مش يرحّل غير بعد اعتماد».)

لكن ده لسه بدائي: خطوة واحدة، بلا حدود مبالغ، بلا مستويات، والشاشة اللي بتظبط الورك-فلو مالهاش أي أثر. عشان الشاشة تشتغل بجد (متعدّد المستويات + حدود + معتمِد مخصّص لكل مستوى) لازم توصيل الكود (الخطة تحت).

٧. الملفات المتأثرة (للتوصيل)

باك (التوصيل الأساسي)

  • Modules/Sales/app/Actions/PostSalesInvoice.php + SalesInvoiceController (submitApproval/approve) — ينادوا ApprovalWorkflowService::submitForApproval ويحجبوا الترحيل لحد ما السجلّ يبقى معتمَد
  • Modules/Purchases/…/PostPurchaseBill.php + كونترولرات المشتريات — نفس التوصيل
  • ApprovalWorkflowService.php (موجود، جاهز) · enums ApprovalModule/DocumentType (توسيع للإنتاج لو اتقرّر)
  • قراءة إعداد approval_workflow/approval_thresholds (أو الاعتماد على جداول المحرّك مباشرة)

فرونت

  • features/sales/approval-workflows/* — قائمة موديول/أنواع مستندات (مش مبيعات فقط) + إظهار فرع الـrole وauto_approve
  • شاشات المستندات — ربط زر «تقديم للاعتماد» بحالة المحرّك الحقيقية (سجلّ pending) بدل السلسلة المبرمَجة
  • inbox موحّد «اعتماداتي» (بدل الـtab المدفون)

٨. خطة التنفيذ المقترحة (WPs) — لو قرّرت التوصيل

1
P0 توصيل المحرّك بالمبيعات والمشتريات: عند submit/approve/post، نادِ ApprovalWorkflowService::submitForApproval(module,docType,id,amount)؛ لو رجع pending احجب الترحيل لحد ما كل سجلّات المستند تبقى معتمَدة. ده بيحيي المستويات + الحدود + المعتمِد المخصّص. [FIN — يمسّ ترحيل المستندات].
2
P1 الفرونت: شاشة الإعداد تدعم كل الموديولات (قائمة موديول + أنواع مستندات) + فرع الـrole + auto_approve؛ وربط زر «تقديم للاعتماد» بحالة المحرّك؛ inbox موحّد «اعتماداتي».
3
P2 توسيع للموديولات التانية (إنتاج/مخزون…) حسب الحاجة — إضافة أنواع مستنداتها للـenum + نقاط التوصيل.
4
P2 توحيد: إمّا نخلّي المحرّك العام هو المصدر الوحيد ونلغي السلسلة البدائية، أو نخلّي البدائية «مستوى ٠» داخله. + تصليح تضارب صلاحية الشاشة (core مقابل sales.approval-workflows).

٩. قرارات تحتاج المالك (مع توصية)

القرارالخياراتالتوصية
هل نوصّل المحرّك أصلًا؟(أ) نوصّله ليشتغل بجد (مستويات+حدود) · (ب) نكتفي بالسلسلة البسيطة الحالية · (ج) نخفي الشاشة لحد ما نوصّللو محتاج اعتماد بحدود/مستويات فعليًا → (أ). لو خطوة واحدة تكفي → (ب) + (ج) نخفي الشاشة المضلِّلة لحد التوصيل.
نطاق التوصيلمبيعات+مشتريات أولًا · ولا كل الموديولاتمبيعات+مشتريات أولًا (نقاط التوصيل جاهزة)؛ الباقي لاحقًا.
مصير السلسلة البدائيةتُدمج في المحرّك · تُلغى · تتعايشتُدمج (مستوى واحد داخل المحرّك) لتفادي محرّكين متوازيين.
مفيش «معاينة UI» تفصيلية هنا لأن ده تحليل فهم (مش WP UI معتمد). لو وافقت على التوصيل، الخطة التنفيذية هتتضمّن معاينات قبل/بعد لشاشة الإعداد والـinbox.

تحليل قراءة-فقط · فحص Opus لـ BE+FE + KB (production.md «ApprovalWorkflow غير موصّل») · لم تُعدَّل أي بيانات أو كود. بانتظار قرار المالك قبل أي تنفيذ.