تحليل شامل مبني على فحص كود moonui2 (BE + FE على Opus). الخلاصة الصادمة: المحرّك اللي الشاشة بتظبطه مبني بالكامل لكن ميّت — صفر استدعاء في الكود. تحليل فقط، بدون كود.
المالك فتح /app/sales/approval-workflows وسأل: إيه دي؟ بتشتغل إزاي؟ موجودة في كل الموديولز ولا المبيعات بس؟ إزاي نفعّلها؟ وأهم حاجة: إيه المربوط بالكود فعليًا وإيه اللي واجهة/إعداد بس مش شغّال؟
/sales/approval-workflows بتظبطه (مستويات متعدّدة + معتمِدون + حدود مبالغ) — مبني بالكامل وشغّال داخليًّا، لكن مفيش أي مستند بيستدعيه. صفر callers (مثبت بالبحث الشامل). يعني تقدر تعمل ورك-فلو وتحفظه… ومحصلش حاجة.مسودة ← معلّق ← معتمَد ← مرحّل) — دي اللي شغّالة فعلًا في المبيعات والمشتريات، بس بدائية: خطوة واحدة، بصلاحية بس، مش بتقرأ الحدود ولا الإعدادات ولا الورك-فلو المُعرَّف.approval_workflow (none/simple/multi_level) وapproval_thresholds محفوظين ومش بيتقرأوا أبدًا.ApprovalWorkflowService فيها منطق الحدود + المستويات + السجلّات + الإشعارات + tab «قيد الاعتماد») — مجرد مش موصّل. التوصيل شغل محدود، مش إعادة بناء.approval_workflows (ورك-فلو واحد لكل نوع مستند/شركة) · approval_workflow_levels (المستويات: ترتيب + min/max مبلغ + نوع المعتمِد role/user) · approval_logs (سجلّ الاعتماد لكل مستند).Modules/Core/app/Services/ApprovalWorkflowService.php: submitForApproval() (بيلاقي ورك-فلو نشط، يفلتر المستويات بالحدود، auto-approve لو مفيش/كله تلقائي، وإلا ينشئ سجلّات ويبلّغ أول مستوى) + approve/reject/canUserApprove/getPendingForUser/notify. منطق الحدود موجود وصحيح — بس مفيش حد بينده الخدمة.approval-logs/{id}/approve|reject. مفيش أي endpoint «submit» بيغذّي المحرّك من مستند حقيقي.approval_logs). الحقول: مستويات + معتمِد (user؛ فرع الـrole مش مرسوم في الـHTML) + حدود مبلغ.post) بيشترط فعلًا حالة «معتمَد» (PostSalesInvoice.php:38 canPost()===Approved) — فمستحيل ترحّل بدون اعتماد. لكن «الاعتماد» ده مجرد انتقال واحد محكوم بصلاحية sales.invoices.approve: مش متعدّد المستويات، مش بيقرأ مبلغ، مش مربوط بورك-فلو مُعرَّف، وممكن يعتمد من المسودة على طول (خطوة «معلّق» اختيارية).PurchaseBillStatus canApprove/canPost).| المكوّن | الحالة | الدليل |
|---|---|---|
| سلسلة الحالة المبرمَجة (اعتماد قبل الترحيل) | ✅ شغّال | المبيعات + المشتريات؛ الترحيل يشترط معتمَد. بس خطوة واحدة بصلاحية، بلا حدود/مستويات. |
| المحرّك العام (الشاشة كلها: ورك-فلوز/مستويات/سجلّات) | ❌ ميّت | 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_approveApprovalWorkflowService::submitForApproval(module,docType,id,amount)؛ لو رجع pending احجب الترحيل لحد ما كل سجلّات المستند تبقى معتمَدة. ده بيحيي المستويات + الحدود + المعتمِد المخصّص. [FIN — يمسّ ترحيل المستندات].core مقابل sales.approval-workflows).| القرار | الخيارات | التوصية |
|---|---|---|
| هل نوصّل المحرّك أصلًا؟ | (أ) نوصّله ليشتغل بجد (مستويات+حدود) · (ب) نكتفي بالسلسلة البسيطة الحالية · (ج) نخفي الشاشة لحد ما نوصّل | لو محتاج اعتماد بحدود/مستويات فعليًا → (أ). لو خطوة واحدة تكفي → (ب) + (ج) نخفي الشاشة المضلِّلة لحد التوصيل. |
| نطاق التوصيل | مبيعات+مشتريات أولًا · ولا كل الموديولات | مبيعات+مشتريات أولًا (نقاط التوصيل جاهزة)؛ الباقي لاحقًا. |
| مصير السلسلة البدائية | تُدمج في المحرّك · تُلغى · تتعايش | تُدمج (مستوى واحد داخل المحرّك) لتفادي محرّكين متوازيين. |
تحليل قراءة-فقط · فحص Opus لـ BE+FE + KB (production.md «ApprovalWorkflow غير موصّل») · لم تُعدَّل أي بيانات أو كود. بانتظار قرار المالك قبل أي تنفيذ.