تحليل الفجوة — منظومة الصلاحيات (Permissions)

مراجعة شاملة لتطبيق الصلاحيات في الواجهة والباك — بحث فقط، بدون أي كود. الفحص اتعمل على أعلى موديل (Opus) لكل من Angular وLaravel/Spatie.

moonui2 · hazemdev2FE: Angular 21 + PrimeNGBE: Laravel + Spatie (1000 صلاحية)Phase 1 — بانتظار موافقة المالك

١. المشكلة (كما وصفها المالك)

الهدف من التحليل: نفهم بالظبط ليه «كله بيظهر»، ونتأكد فين الصلاحيات فعلًا ناقصة، ونطلّع خطة إصلاح مرتّبة قبل أي كود.

٢. الوضع الحالي (ما هو موجود — بمراجع دقيقة)

البنية سليمة أساسًا

٣ طبقات تقييد موجودة في الفرونت

الطبقةالملفالتغطيةالدقة
فلترة المنيو/الشريطsidebar.component.ts:138 · module-nav.component.ts:240شبه كاملة (١١٩ عنصر)بادئة module.resource (خشنة)
حارس الراوت permissionGuardauth.guard.ts:125٢٧٥ راوت مقيّدبادئة (خشنة)
توجيه الزر *appCancan.directive.ts٦٧ ملف بس (مركّزة)مطابقة تامّة (action)

الباك — التطبيق قوي ومتّسق

٣. المطلوب

  1. الواجهة تقيّد المزايا فعليًا حسب صلاحيات المستخدم — يوزر «عرض» ميشوفش أزرار الإضافة/التعديل/الحذف/الاعتماد.
  2. مراجعة اكتمال الكتالوج (خصوصًا الإنتاج) وسدّ أي مزايا مكشوفة بلا صلاحية.
  3. ترتيب إدارة الأدوار (الوضوح والتكرار) عشان المالك يقدر يضبط «مين يشوف إيه» بسهولة.

٤. الفجوة (GAP) — الأدلة

أ) «الواجهة بتعرض كل حاجة» — مؤكَّدة ✅ (فرونت)

السبب المركّب: المنيو والراوتس بيقيّدوا على مستوى البادئة الخشنة (purchases.requests)، فيوزر معاه purchases.requests.view بيعدّي ويدخل الشاشة — وبعدين الأزرار مش متقيّدة بـ*appCan فبيشوف كل الحركات. + الاختبار بحساب سوبر-أدمن/أدمن بيتجاوز كل الفحوصات فبيخلّي المشكلة تبان «كلية».
الموديولملفات فيها *appCan / الإجماليالحالة
clinic34 / 51مقيّدة
production14 / 49جزئي
lis17 / 101جزئي
purchases1 / 14 (مش requests)شبه صفر
sales0 / 16صفر
hr0 / 31صفر
pos0 / 17صفر
inventory / accounting / core-admin (users, roles, products, partners, warehouses, journal-entries, accounts…)0صفر

دليل مباشر على شكوى المالك: purchases/requests/requests.component.html:6 — زرار «طلب جديد» <p-button (onClick)="openNew()"> من غير أي *appCan. نفس النمط في المبيعات/HR/POS/المخزون/المحاسبة.

ب) «الإنتاج ناقص صلاحيات» — الواقع مختلف (باك)

الإنتاج فعليًا أكثر موديول مقيّد في النظام: 44/44 Controller بيفرضوا صلاحيات، ٦٩ صلاحية مسجّلة، صفر endpoint مكشوف. فمش «ناقص تطبيق». لكن فيه ٣ أسباب ممكن تخلّي المالك يحسّها ناقصة 👇

ج) الفجوة الحقيقية المكشوفة أمنيًا = LIS (مش الإنتاج) 🔴

مجموعة endpoints في LIS بلا أي صلاحية ولا middleware — أي مستخدم مسجّل يقدر يستدعيها: المضادات الحيوية (antibiotics CRUD)، الهيستوباثولوجي (النتائج + القوالب)، شركاء الباقات، تعيين باقات المعامل الخارجية — LIS/routes/api.php:489,605,785–810. ومفيش صلاحية lis.antibiotics.*/lis.histopath-templates.* أصلًا، فمش بتظهر في الشاشة وبتفضل مفتوحة.

د) عيوب وتناقضات

#العيبالأثرمرجع
1*appCan بنقطة أخيرة ('clinic.payments.') — التوجيه بيستخدم can() مطابقة تامّةالشاشة تختفي لكل غير-سوبر-أدمن (شغّالة بالغلط لأن الاختبار سوبر-أدمن)cashier-queue…html:1
2حارس الراوت يطابق بالبادئة → منح resource.* يفتح الشاشة كاملةيهزم التقييد على مستوى الحركةauth.guard.ts:143
3٣ محرّرات أدوار (core / lis / clinic) + محرّري مستخدمين (core / lis) بـendpoints وكتالوجات مختلفةتكرار وإرباك: «أضبط الصلاحية منين؟»features/{roles,lis/roles,clinic/roles}
4seeder ميت خطر PermissionSeeder.php بأسماء مفرد قديمة (core.user.view) وأدوار مكرّرةلو اتشغّل بالغلط يلوّث الكتالوج (غير مُشار له حاليًا)PermissionSeeder.php:13
5٢ صلاحية إنتاج مُعرّفة وغير مفحوصة (production.quality.inspect/disposition) + ~٢٦ صلاحية يُحتمل ميتة + inventory.products.* تكرّر core.products.*تنظيف كتالوجتقرير الباك §4,§6

٥. الملفات المتأثرة والاعتماديات

فرونت (Angular)

  • shared/directives/can.directive.ts — إصلاح can()/البادئة
  • core/services/permission.service.ts — دالة فحص بادئة للأزرار لو لزم
  • أزرار كل شاشات: purchases/*, sales/*, hr/*, pos/*, inventory/*, accounting, core-admin (users/roles/branches/products/partners/warehouses/journal-entries/accounts)
  • features/roles/roles.component.ts — تحسين الترجمة/العرض
  • assets/i18n/{ar,en}.json — مفاتيح ROLES.RESOURCES.*/ACTIONS.* الناقصة (إنتاج وغيره)
  • app.routes.ts / lis-standalone.routes.ts — تكرار تسجيل lis/roles

باك (Laravel/Spatie)

  • LIS/routes/api.php + LabNewTypesController, LabHistopathTemplateController, LabPackagePartnerController, LabExternalLabPackageController — إضافة صلاحيات + middleware
  • Core/database/seeders/RolePermissionSeeder.php — صلاحيات LIS الجديدة + (اختياري) تقسيم umbrellas الإنتاج
  • config/moonstack.php — تسجيل ProductionRoleSeeder في seeders التحديث
  • Core/database/seeders/PermissionSeeder.php — حذف (ميت)

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

٧. خطة التنفيذ (Work Packages بالترتيب)

1
P0 تقييد الأزرار في الواجهة (شكوى المالك #1). إضافة *appCan على كل أزرار الإضافة/التعديل/الحذف/الاعتماد في الموديولات غير المغطّاة (المشتريات، المبيعات، HR، POS، المخزون، المحاسبة، إدارة-Core)، بسلاسل مطابقة لكتالوج الباك بالحرف. + إصلاح مشكلة النقطة الأخيرة (استخدام فحص بادئة للأزرار prefix بدل can() التامّة، أو تصحيح السلاسل). ملفات: أعلاه · اختبار: build أخضر + فحص يدوي بيوزر «عرض».
2
P0 سدّ endpoints المكشوفة في LIS. إضافة صلاحيات (lis.antibiotics.*, lis.histopath.*, lis.histopath-templates.*, lis.packages.partners.*, lis.external-labs.packages.*) لكتالوج الباك + permission: middleware على الكونترولرات الأربعة. [أمني — أولوية].
3
P1 وضوح شاشة الأدوار + الترجمة. استكمال مفاتيح ROLES.RESOURCES.*/ACTIONS.* لكل الموديولات (الإنتاج أولًا) عشان الصلاحيات تظهر بأسماء عربية واضحة بدل النص الخام.
4
P1 إيصال أدوار الإنتاج للعملاء. تسجيل ProductionRoleSeeder في seeders تحديث MoonStack (إضافي، غير هدّام) — فالـ١٢ دور توصل التثبيتات.
5
P2 توحيد محرّرات الأدوار/المستخدمين (قرار مالك — قسم ٨): دمج core/lis/clinic في مدخل واحد، أو الإبقاء على «قشرة» لكل موديول مع توضيح.
6
P2 تنظيف الكتالوج. حذف PermissionSeeder.php الميت · مراجعة الـ٢٦ صلاحية المشكوك فيها · حسم inventory.products.* المكرّرة · حسم/ربط صلاحيتَي الجودة المعطّلتين.
7
P3 (اختياري) تشديد حُرّاس الراوت أو تقسيم umbrellas الإنتاج لفصل مهام أدقّ — حسب قرار المالك.

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

القرارالخياراتالتوصية
مستوى تقييد الواجهة(أ) إخفاء أزرار الحركة ليوزر العرض [الأساسي] · (ب) + تشديد الراوت لمستوى الحركة كمانابدأ بـ(أ) — بتحلّ الشكوى بأقل خطر؛ (ب) لاحقًا لو محتاج منع الوصول للصفحة نفسها.
محرّرات الأدوار (٣)(أ) توحيد في /core/roles واحد · (ب) إبقاء قشرة lis/clinic مع توضيح النطاق(أ) الأنظف للمالك — مدخل واحد لكل الصلاحيات.
خشونة صلاحيات الإنتاج(أ) سيبها umbrellas · (ب) قسّم (variances/standard-costs/consume منفصلة)(أ) الآن — التقسيم مشروع منفصل لو الحوكمة طلبته.
أدوار الإنتاج للعملاء(أ) شحنها للأسطول · (ب) سيبها يدوية(أ) — قيمة مباشرة، إضافية وآمنة.

٩. معاينة الواجهة المتوقّعة (WP1 — بيمسّ الـUI)

التغيير الأساسي «غير مرئي»: نفس الشاشات، لكن أزرار الحركة تختفي لمن مالوش صلاحيتها. مثال — شاشة طلبات الشراء ليوزر معاه purchases.requests.view فقط:

قبل (الحالي) — كل الأزرار ظاهرة ❌
طلبات الشراء+ طلب جديد
الرقمالمورّدالحالةإجراءات
PR-0007مورّد أمسودةتعديلحذفاعتماد
بعد (المتوقّع) — أزرار الحركة مخفية ✅
طلبات الشراء+ طلب جديد
الرقمالمورّدالحالةإجراءات
PR-0007مورّد أمسودةتعديلحذفاعتمادعرض فقط

التطبيق: *appCan="'purchases.requests.create'" على «طلب جديد»، و.update/.delete/.approve على أزرار الصف. نفس النمط يتكرّر على كل الشاشات غير المغطّاة. شاشة /core/roles نفسها كويسة ومش محتاجة إعادة تصميم — بس ترجمة أوضح (WP3).

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