الخطة الشاملة — منظومة الصلاحيات

تحليل موحّد + خارطة طريق: تدّي صلاحيات كويس، وكل أبشن تحت السيطرة — مع البناء على الموجود لا إعادة اختراعه. يجمع تحليلَي الباك-أوفيس والمعمل.

moonui2 · hazemdev2١٠٠٠ صلاحية · ١٥ موديولفحص Opus (BE+FE)Phase 1 — بانتظار المالك

١. المطلوب

التحليلان التفصيليان (جزء من الخطة دي): تحليل الباك-أوفيس العام · تحليل المعمل المخصّص.

٢. الوضع الحالي — الصورة الكاملة

1000
صلاحية مسجّلة (كتالوج غني)
الباك بيفرض الصلاحية (403)
~0%
أزرار الباك-أوفيس متقيّدة في الواجهة

الأساس قوي (نبني عليه)

الطبقةالحالةالتفصيل
كتالوج الصلاحياتغني + على مستوى الحركة١٠٠٠ صلاحية module.resource.action. المبيعات ٥١ · المشتريات ٥١ — كل حركة (view/create/update/delete/approve/post/cancel/duplicate/confirm/ship...) ليها صلاحية. يعني «كل أبشن يتحكم فيه» متحقّق على مستوى الكتالوج.
فرض الباك (Spatie)سليم ومتّسقكل endpoint مقيّد بيرجّع 403 للي مالوش صلاحية؛ المعمل يحجب حتى حقول التكلفة/السعر في الـAPI.
أداة منح متقدّمة — المعملموجودة ومكتملةمحرّر «حسب الشاشة» + كتالوج ٤٦ شاشة + اعتماديات تلقائية + ٨ presets + Authority Limits (حدود رقمية) + إخفاء منيو per-role. ده النموذج المثالي للمنح — موجود بالفعل.
شاشة أدوار الباك-أوفيس /core/rolesكويسة بس بسيطةبتعرض الكتالوج الكامل مجمّع بالموديول + ترجمة + فلترة للموديولات المفعّلة. لكن مفيش «حسب الشاشة» ولا presets ولا حدود زي المعمل.

الطبقات اللي بتقيّد في الواجهة

٣. الفجوة الموحّدة (موجود ↔ مطلوب)

البُعدموجودمطلوباللي لازم يتعمل
صلاحية لكل حركة (كتالوج)مكتمل (مبيعات/مشتريات ٥١ لكل)نفسهلا شيء — الأساس موجود
فرض الباكسليمسدّ ٥ endpoints معمل مكشوفة (هيستوباث)إضافة صلاحية + middleware
إخفاء الأزرار في الواجهة~0% في الباك-أوفيسكل زرار حركة يتخفى بلا صلاحيتهإضافة *appCan على كل زر (الفجوة الكبرى — شكوتك)
UX المنح للباك-أوفيسكتالوج مسطّحسهل زي المعمل(اختياري) مدّ نمط «حسب الشاشة»/presets للباك-أوفيس
تقييد الراوت لمستوى الحركةخشناختياريتشديد الراوت لو محتاج منع الصفحة نفسها
تنظيف/توحيد٣ محرّرات · seeder ميت · دور مُفرَط (بيانات)واضح ونظيفتوحيد المحرّرات · حذف الميت · تظبيط الدور
الخلاصة: «كل أبشن تحت السيطرة» — الصلاحيات موجودة والباك بيفرضها، الناقص الأساسي إن الواجهة مش بتخفي الأزرار (شكوتك «كله بيظهر»). ده الشغل الأكبر، وهو فرونت بحت فوق أساس جاهز.

٤. الملفات المتأثرة

فرونت (الأساسي)

  • أزرار كل شاشات: sales/*, purchases/*, hr/*, pos/*, inventory/*, accounting, core-admin — إضافة *appCan
  • shared/directives/can.directive.ts — إصلاح مطابقة النقطة الأخيرة
  • assets/i18n/{ar,en}.json — مفاتيح ROLES.RESOURCES.*/ACTIONS.* الناقصة
  • (اختياري) features/roles — تبويب «حسب الشاشة»/presets للباك-أوفيس

باك

  • LIS/routes/api.php + الـ٥ كونترولرات المكشوفة — صلاحيات + middleware
  • (اختياري) كتالوج شاشات للباك-أوفيس على نمط LisScreenCatalog
  • حذف Core/.../PermissionSeeder.php الميت

٥. الحالات الحدّية

٦. الخطة الشاملة (Work Packages بالترتيب)

1
P0 تقييد أزرار الواجهة عبر الباك-أوفيس — إضافة *appCan على كل حركة (إضافة/تعديل/حذف/اعتماد/ترحيل/إلغاء) في المبيعات والمشتريات والمخزون والمحاسبة وHR وPOS وإدارة-Core، بسلاسل مطابقة للكتالوج (المتوفّر كامل). إصلاح النقطة الأخيرة. = شكوتك «كل أبشن تحت السيطرة».
2
P0 سدّ endpoints المعمل المكشوفة — أخطرها LabNewTypesController (كتابة نتائج هيستوباثولوجي بلا حارس). [أمني].
3
P1 ترجمة/وضوح شاشة الأدوار — استكمال مفاتيح ROLES.RESOURCES/ACTIONS فالصلاحيات تظهر بأسماء عربية واضحة (بدل النص الخام) — أساس «تدّي صلاحيات كويس».
4
P1 تظبيط الدور المُفرَط + تنظيف — إزالة الصلاحيات المدمّرة من دور الاستقبال (بيانات، من المحرّر) · حذف الـseeder الميت.
5
P2 (البناء على الموجود) مدّ نموذج المعمل للباك-أوفيس — كتالوج شاشات + محرّر «حسب الشاشة» + presets للمبيعات/المشتريات (يعيد استخدام تصميم LisScreenCatalog المُثبَت) → منح أسهل بكتير للمالك. (قرار مالك — قسم ٨.)
6
P2 توحيد المحرّرات + (اختياري) تشديد الراوت لمستوى الحركة لو محتاج منع الوصول للصفحة نفسها.

٧. «تدّي صلاحيات كويس» دلوقتي — بالأدوات الموجودة

حتى قبل تنفيذ الخطة، تقدر تمنح صح على مستوى الحركة لأن الكتالوج والباك جاهزين:
  1. الباك-أوفيس: من /core/roles → اختَر الدور → الصلاحيات مجمّعة بالموديول → فعّل بالظبط الحركات المطلوبة (مثلًا محاسب المبيعات = sales.invoices.view/post + sales.reports.view، من غير delete/cancel). (الباك هيمنع الممنوع بـ403 حتى قبل ما نخفي الأزرار.)
  2. المعمل: من محرّر أدوار المعمل → وضع «حسب الشاشة» → فعّل الشاشات المطلوبة (الاعتماديات تتحط تلقائيًا) أو استخدم preset جاهز، واضبط الحدود الرقمية (أقصى خصم) والقوائم المخفية.
  3. القاعدة الذهبية: ابدأ من أقل صلاحية (view) وزوّد الحركات بالتدريج؛ وابعد عن الحركات المدمّرة (delete/cancel/void) إلا للأدوار الإشرافية.

بعد تنفيذ P0، الواجهة كمان هتخفي الأزرار الممنوعة — فالمنح هيبان أثره بصريًا مباشرة.

٨. قرارات تحتاج المالك

القرارالخياراتالتوصية
نموذج المنح للباك-أوفيس(أ) /core/roles الحالي + إخفاء أزرار [الأساسي] · (ب) + مدّ «حسب الشاشة»/presets زي المعملابدأ (أ) — بيحقّق «كل أبشن تحت السيطرة» بأقل خطر؛ (ب) لاحقًا لتجربة منح أسهل.
تشديد الراوت(أ) خشن + إخفاء أزرار · (ب) + تشديد لمستوى الحركة(أ) الآن؛ (ب) لو محتاج منع فتح الصفحة أصلًا.
توحيد المحرّرات (٣)(أ) توحيد · (ب) إبقاء قشرة المعمل/العيادة(أ) الأنظف — مدخل واحد.
الدور المُفرَط + الميتتظبيط من المحرّر + حذف الميتنعم — بيانات + تنظيف، بدون مخاطرة.

٩. معاينة الواجهة (P0 — يمسّ الـUI)

التغيير الأساسي: نفس الشاشات، أزرار الحركة تختفي لمن مالوش صلاحيتها. مثال — فاتورة مبيعات ليوزر معاه sales.invoices.view فقط:

قبل — كل الأزرار ظاهرة ❌
فواتير المبيعات + فاتورة
تعديلحذفترحيلإلغاءتكرار
بعد — أزرار الحركة مخفية ✅
فواتير المبيعات + فاتورة
تعديلحذفترحيلإلغاءتكرارعرض فقط

التطبيق: *appCan="'sales.invoices.create'" على «فاتورة»، و.update/.delete/.post/.cancel/.duplicate على الباقي — والصلاحيات دي كلها موجودة في الكتالوج. نفس النمط لكل شاشات الباك-أوفيس. شاشة /core/roles مش محتاجة إعادة تصميم — بس ترجمة أوضح (P1).

خطة شاملة موحّدة · فحص Opus لـ BE+FE + KB المعمل الكنسي · تبني على الموجود · لم تُعدَّل بيانات أو كود. بانتظار موافقة المالك قبل أي تنفيذ.