تحليل مخصّص — منظومة صلاحيات المعمل (LIS)

تحليل تاني بعد فهم أعمق — يصحّح ما ورد في التحليل العام عن المعمل. تحقّق فعلي من كود moonui2 مقابل تصميم الـKB، بحث فقط بدون كود.

moonui2 · hazemdev2فحص Opus (BE+FE)مرجعية: lis-permissions-overhaul + granularity + auditPhase 1 — بانتظار المالك

تصحيح للتحليل العام

في التحليل العام وصفت شاشات أدوار المعمل بإنها «تكرار/مربكة» وحطّيت المعمل مع باقي الموديولات. ده كان تسطيح. بعد قراءة الـKB الكنسي وفحص كود moonui2 فعليًا: المعمل عنده منظومة صلاحيات متقدّمة مقصودة ومكتملة — محرّر أدوار محصور بالمعمل + كتالوج شاشات + اعتماديات تلقائية + حدود رقمية (Authority Limits) + إخفاء منيو لكل دور. المعمل حالة مختلفة عن باقي الـERP، ومحتاج تحليل خاص — وده هو.

١. ما هي منظومة المعمل فعلًا (كلها موجودة على moonui2 ✅)

الفحص أثبت إن كل قدرة بيوثّقها الـKB موجودة فعلًا في كود moonui2 (مش على moonui بس):

القدرةالحالةالدليل
Authority Limits (حدود رقمية per-role/user — مثل أقصى خصم%)موجودةAuthorityLimitService.php · UserResource.php:63
LisScreenCatalog (٤٦ شاشة/٨ مجموعات، كل شاشة بصلاحياتها + اعتمادها الخفي)موجودةSupport/LisScreenCatalog.php · endpoint LabRoleController:194
محرّر «حسب الشاشة» (الوضع الافتراضي في محرّر أدوار المعمل)موجود + افتراضيlis-roles.component.ts:63 (permMode='screen')
LisPermissionDependencies (اعتماديات تلقائية + «الحركة تجرّ العرض»)موجودةSupport/LisPermissionDependencies.php
إخفاء منيو لكل دور عبر بروفايل /auth/me (تقاطع الأدوار)موجودUserResource.php:82 · lis-layout…ts:135
٨ presets بقوائم إخفاء افتراضيةموجودةLisPermissionDependencies.php:176 · lis-roles…ts:452
فصل التكلفة/التسعير + صلاحيات المعامل الخارجية الدقيقة (بحجب الحقول في الـAPI مش الواجهة بس)موجودRolePermissionSeeder:754,864 · LabInvestigationController:34

نموذج المعمل باختصار

٢. تشخيص شكوى «الكاشير يرى أكثر مما مُنح» (مُصحّح)

الباك آمن ١٠٠٪: كل endpoint مقيّد بيرجّع 403 للي مالوش صلاحية، وحقول التكلفة/السعر محجوبة في الـAPI Resource نفسه (مش الواجهة بس). مفيش تسريب بيانات.
«بيشوف كتير» = الدور نفسه واسع، مش خلل فلترة. السايدبار بيعرض بالظبط ما يمنحه الدور. فلو الدور فيه ٤٦ صلاحية → بيشوف ٤٦ حاجة.
الأخطر: الدور المُفرَط فيه = بيانات مُعدّلة يدويًا، مش كود. الفحص أثبت إن لا الـseeder ولا أي preset بيمنح صلاحيات مدمّرة للاستقبال/الكاشير:
  • مفيش دور reception مزروع أصلًا؛ ودور cashier المزروع صفر lis.*.
  • preset الاستقبال = requests.create/cancel · visits.create · patients.update · dashboard.viewمفيش delete/void.
  • preset الكاشير = payments.create/void · requests.view · dashboard.viewمفيش حذف فواتير/مرضى/أطباء.
يعني الدور اللي فيه invoices.delete/cancel · requests.delete · patients.delete · payments.void اتعدّل بإيد في قاعدة بيانات moonui2 — العلاج تظبيط الدور من محرّر أدوار المعمل (البيانات)، مش تعديل كود.

٣. الفجوات الحقيقية على moonui2

#الفجوةالنوعالأثرمرجع
1دور معمل مُفرَط فيه (صلاحيات مدمّرة ممنوحة)بياناتالكاشير يقدر يلغي/يحذف فعليًا (الباك ينفّذ لأنها ممنوحة)دور DB يدوي
2راوتس المعمل المدمجة /core/lis/* (~٣٥ راوت) بلا data.permissions على مستوى الراوتشكلييوزر باك-أوفيس بأي صلاحية lis.* يفتح هيكل أي شاشة (الداتا 403). شجرة /lab/* المستقلة مقفولة 62/65 ✅app.routes.ts:205-239
3٥ كونترولرات LIS بلا أي صلاحية (auth فقط) — أخطرها LabNewTypesController (كتابة نتائج هيستوباثولوجي + مضادات)أمني حقيقيأي مستخدم مسجّل (حتى بصفر صلاحيات معمل) يكتب نتائج سريرية/بيانات رئيسيةLIS/routes/api.php:489,605,785–812,863
القائمة الكاملة للـ٥ كونترولرات: LabNewTypesController (antibiotics + histopath results/finalize) · LabHistopathTemplateController · LabDeviceModelController · LabPackagePartnerController · LabExternalLabPackageController. (بوابات المرضى/المعامل الخارجية على حارس منفصل صحيح — مش فجوة.)
الأداة الجيدة موجودة أصلًا: كتالوج الشاشات + محرّر «حسب الشاشة» + الـ٨ presets + Authority Limits كلها متوفّرة وموصّلة — فالأدمن مش ناقصه أداة يظبط بيها نطاق الأدوار.

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

باك

  • Modules/LIS/routes/api.php + الـ٥ كونترولرات — إضافة permission: middleware
  • (احتمال) RolePermissionSeeder.php — لو صلاحية جديدة لازمة (مثل lis.results.enter للهيستوباث)

فرونت

  • app.routes.ts (راوتس /core/lis/* المدمجة) — إضافة data.permissions لكل طفل (نسخ نمط lis-standalone.routes.ts المقفول)
  • لا تعديل على محرّر الأدوار — شغّال وكامل

الفجوة #1 (الدور المُفرَط) مالهاش ملف — تظبيط بيانات من محرّر أدوار المعمل مباشرةً.

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

٦. خطة التنفيذ (WPs بالترتيب)

1
P0 تأمين الـ٥ كونترولرات المكشوفة — أولاً LabNewTypesController (كتابة نتائج هيستوباثولوجي بلا حارس = خطر سريري)، ثم القوالب/الأجهزة/الباقات/معامل خارجية. إضافة صلاحيات للكتالوج + permission: middleware. [أمني حقيقي].
2
P1 تظبيط الدور المُفرَط فيه (بيانات، مش كود) — من محرّر أدوار المعمل: شيل invoices.cancel/delete · requests.delete · patients.delete · doctors.delete من الاستقبال (وحسم payments.void للكاشير حسب رغبتك). ممكن أعمله معاك تفاعليًا أو أوثّق الخطوات.
3
P1 قفل الفجوة الشكلية للراوتس المدمجة /core/lis/* — إضافة data.permissions لكل طفل (نسخ نمط الشجرة المستقلة). (شجرة /lab/* مش محتاجة حاجة.)
4
P2 (اختياري) نظافة: توثيق أن الأداة (screen-catalog + presets) هي المدخل الصحيح لضبط النطاق، ومراجعة أي preset لو المالك حابّ يضيّقه أكتر.

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

القرارالخياراتالتوصية
صلاحيات الهيستوباث المكشوفة(أ) صلاحية جديدة lis.results.enter/correct · (ب) ربطها بصلاحية نتائج موجودة(أ) لو الحوكمة السريرية تفصل مدخِل النتائج؛ وإلا (ب).
payments.void للكاشير(أ) يفضل (إلغاء دفعة بالغلط) · (ب) يتشال لدور مشرفحسب سياستك — (أ) شائع مع سجل تدقيق.
الفجوة الشكلية /core/lis/*(أ) أقفلها (توحيد مع /lab/*) · (ب) اتركها (الداتا آمنة 403)(أ) — رخيصة وبتشيل المنظر المزعج.
تظبيط الدور المُفرَط(أ) أعمله معاك دلوقتي · (ب) توثيق خطوات وتعمله إنتحسب راحتك — ده بيانات، بدون ريليس.

٨. معاينة الواجهة

الأداة موجودة وكاملة — مفيش شاشة جديدة. المعاينة توضّح محرّر أدوار المعمل وتظبيط الدور المُفرَط (WP2):

محرّر أدوار المعمل (موجود) — وضع «حسب الشاشة» الافتراضي
دور: الاستقبال · تبويبات: [حسب الشاشة] [كل الصلاحيات] [القوائم] [الحدود]
شاشة «الطلبات» (مجموعة العمليات) — الصلاحيات تحتها:
عرض الطلبات (primary)إنشاء طلب (action)عرض الفواتير (required — لازمة)
تظبيط الدور المُفرَط (WP2) — شيل المدمّرة
دور: الاستقبال — صلاحيات مطلوب إزالتها
حذف الطلباتإلغاء الفواتيرحذف الفواتيرحذف المرضىحذف الأطباء
تفضل: إنشاء/إلغاء طلب · تحديث مريض · لوحة

الإزالة من نفس المحرّر (وضع «كل الصلاحيات» أو «حسب الشاشة»)، والحفظ عبر RoleSaveService بدون تغيير. الـP0 (تأمين الكونترولرات) هو الكود الوحيد الجوهري.

تحليل قراءة-فقط · فحص Opus لكود moonui2 مقابل KB المعمل الكنسي (overhaul + granularity + audit) · لم تُعدَّل أي بيانات أو كود. بانتظار موافقة المالك قبل أي تنفيذ.