تحليل تاني بعد فهم أعمق — يصحّح ما ورد في التحليل العام عن المعمل. تحقّق فعلي من كود moonui2 مقابل تصميم الـKB، بحث فقط بدون كود.
الفحص أثبت إن كل قدرة بيوثّقها الـ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 |
LabRoleController, محكوم lis.settings مش core.roles): بيعرض الأدوار المحصورة بالمعمل بس، بيزامن صلاحيات lis.* فقط (بيحافظ على منح الدور غير-المعمل)، ويوسّع الاعتماديات تلقائيًا عند الحفظ.LabUserController) — تعيين دور + فرع داخل المعمل.lis-nav.config.ts) والسايدبار مقيّد بالصلاحية — بيعرض بالظبط اللي الدور بيسمح بيه (مع بوابات حركة دقيقة: التجميع=samples.collect، الاستقبال=samples.receive…).reception مزروع أصلًا؛ ودور cashier المزروع صفر lis.*.requests.create/cancel · visits.create · patients.update · dashboard.view — مفيش delete/void.payments.create/void · requests.view · dashboard.view — مفيش حذف فواتير/مرضى/أطباء.invoices.delete/cancel · requests.delete · patients.delete · payments.void اتعدّل بإيد في قاعدة بيانات 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. (بوابات المرضى/المعامل الخارجية على حارس منفصل صحيح — مش فجوة.)Modules/LIS/routes/api.php + الـ٥ كونترولرات — إضافة permission: middlewareRolePermissionSeeder.php — لو صلاحية جديدة لازمة (مثل lis.results.enter للهيستوباث)app.routes.ts (راوتس /core/lis/* المدمجة) — إضافة data.permissions لكل طفل (نسخ نمط lis-standalone.routes.ts المقفول)الفجوة #1 (الدور المُفرَط) مالهاش ملف — تظبيط بيانات من محرّر أدوار المعمل مباشرةً.
lab_confined) مبيقدرش يوصل /core/lis/* أصلًا (confinementGuard بيرجّعه لـ/lab) — فالفجوة #2 بتخصّ باك-أوفيس غير-محصور فقط.lis.* فقط ويحافظ على المنح غير-المعمل — أي تعديل لازم يحافظ على ده.RolePermissionSeeder عشان تتزرع عند التحديث وتظهر في الكتالوج.LabNewTypesController (كتابة نتائج هيستوباثولوجي بلا حارس = خطر سريري)، ثم القوالب/الأجهزة/الباقات/معامل خارجية. إضافة صلاحيات للكتالوج + permission: middleware. [أمني حقيقي].invoices.cancel/delete · requests.delete · patients.delete · doctors.delete من الاستقبال (وحسم payments.void للكاشير حسب رغبتك). ممكن أعمله معاك تفاعليًا أو أوثّق الخطوات./core/lis/* — إضافة data.permissions لكل طفل (نسخ نمط الشجرة المستقلة). (شجرة /lab/* مش محتاجة حاجة.)| القرار | الخيارات | التوصية |
|---|---|---|
| صلاحيات الهيستوباث المكشوفة | (أ) صلاحية جديدة lis.results.enter/correct · (ب) ربطها بصلاحية نتائج موجودة | (أ) لو الحوكمة السريرية تفصل مدخِل النتائج؛ وإلا (ب). |
payments.void للكاشير | (أ) يفضل (إلغاء دفعة بالغلط) · (ب) يتشال لدور مشرف | حسب سياستك — (أ) شائع مع سجل تدقيق. |
الفجوة الشكلية /core/lis/* | (أ) أقفلها (توحيد مع /lab/*) · (ب) اتركها (الداتا آمنة 403) | (أ) — رخيصة وبتشيل المنظر المزعج. |
| تظبيط الدور المُفرَط | (أ) أعمله معاك دلوقتي · (ب) توثيق خطوات وتعمله إنت | حسب راحتك — ده بيانات، بدون ريليس. |
الأداة موجودة وكاملة — مفيش شاشة جديدة. المعاينة توضّح محرّر أدوار المعمل وتظبيط الدور المُفرَط (WP2):
الإزالة من نفس المحرّر (وضع «كل الصلاحيات» أو «حسب الشاشة»)، والحفظ عبر RoleSaveService بدون تغيير. الـP0 (تأمين الكونترولرات) هو الكود الوحيد الجوهري.
تحليل قراءة-فقط · فحص Opus لكود moonui2 مقابل KB المعمل الكنسي (overhaul + granularity + audit) · لم تُعدَّل أي بيانات أو كود. بانتظار موافقة المالك قبل أي تنفيذ.