★ الفلسفة: 3 طبقات حماية
- الباك-إند يفرض (Enforce): كل endpoint محمي بصلاحيته — الطبقة الأمنية الحقيقية. لو يوزر نادى API من غير صلاحية ⟶ 403.
- الفرونت-إند يُخفي (Hide): توجيه
*appCanبيخفي الأزرار اللي المستخدم مالوش صلاحيتها (تجربة استخدام نظيفة — مش بس تعطيل). - الاعتماديات تتوسّع (Expand): لما تدي صلاحية، النظام بيجرّ معاها متطلباتها تلقائياً (في الواجهة بعلامة 🔒، وعند الحفظ في الباك-إند كمصدر موثوق). فمحتاجش تحفظ القايمة بنفسك.
أساسية (base)
مُطبّقة في الكود حالياً
مقترحة (نضيفها)
0 القاعدة العامة + كيف تُقرأ الجداول
القاعدة العامة (مُطبّقة): أي صلاحية
«ماينفعش تعدّل/تحذف/تضيف من غير ما تقدر تشوف». فمثلاً
lis.<مورد>.<فعل> غير view ⟵ بتتطلّب تلقائياً lis.<مورد>.view.
«ماينفعش تعدّل/تحذف/تضيف من غير ما تقدر تشوف». فمثلاً
patients.update ⟵ patients.view — مش محتاج نكتبها صراحة.
الجداول تحت بتعرض الاعتماديات بين الموارد المختلفة (cross-resource) — اللي القاعدة العامة ماتغطيهاش، ومنظّمة حسب سلسلة العمل.
A الاستقبال + الفوترة + التحصيل (Order-to-Cash)
منطق: إنشاء الطلب = اختيار/إضافة مريض + اختيار تحاليل + طبيب + تسعير + فاتورة + تحصيل. صلاحية الطلب لوحدها بتكسر — لازم تجرّ السلسلة كلها.
| الصلاحية | تتطلّب (cross-resource) | السبب | الحالة |
|---|---|---|---|
requests.view | — | أساس كل شغل الطلبات | base |
requests.create |
patients.view patients.create investigations.view doctors.view price-lists.view packages.view invoices.view invoices.create payments.view payments.create |
الويزارد بيضيف مريض، يختار تحاليل/باقات وطبيب، يسعّر من قائمة، يعمل فاتورة ويحصّل | مُطبّقة |
requests.update | patients.view investigations.view | تعديل الطلب يلمس المريض والتحاليل | مُطبّقة |
requests.cancel / delete / invalidate / force_delete | — | requests.view (القاعدة العامة) | عامة |
invoices.create | requests.view | الفاتورة بتتبني على طلب | مُطبّقة |
invoices.post / cancel | — | invoices.view (عامة) — الترحيل للحسابات | عامة |
payments.create | invoices.view | التحصيل على فاتورة (وبيفتح وردية الكاشير) | مُطبّقة |
payments.void | — | payments.view (عامة) | عامة |
B سحب العينات (Collection / Phlebotomy)
| الصلاحية | تتطلّب | السبب | الحالة |
|---|---|---|---|
samples.view | — | أساس شاشة التجميع | base |
samples.collect | requests.view | التجميع يبدأ من طلبات اليوم | مُطبّقة |
samples.create / reject | requests.view | مرتبطة بطلب | مُطبّقة |
samples.receive / accept / process / ready-for-result | — | samples.view (عامة) | عامة |
samples.send-external | referrals.view referrals.create external-labs.view | إرسال عينة لمعمل خارجي = إنشاء إحالة | مقترحة |
samples.receive-external | referrals.view | استلام عينة واردة من إحالة | مقترحة |
C المعالجة + النتائج (Kanban → Results)
| الصلاحية | تتطلّب | السبب | الحالة |
|---|---|---|---|
results.view · kanban.view | — | أساس عمل الفني | base |
kanban.manage | kanban.view samples.view results.view | تحريك الكروت + إدخال نتيجة من الكانبان | مقترحة |
results.enter | requests.view samples.view | إدخال نتيجة على طلب/عينة | جزئياً (نضيف samples.view) |
results.validate / approve / retract / correct / retest / return / invalidate | — | results.view (عامة) | عامة |
results.release / release_unpaid | requests.view invoices.view | الإفراج يربط بحالة الطلب والدفع | مقترحة |
result-reports.generate | results.view requests.view | توليد تقرير نتيجة لطلب | مقترحة |
machine-results.match / approve / reject | results.view machines.view | مطابقة نتيجة جهاز بنتيجة تحليل | مقترحة |
D الإحالات + المعامل الخارجية (Outsourcing)
| الصلاحية | تتطلّب | السبب | الحالة |
|---|---|---|---|
referrals.view | — | أساس شاشة الإحالات | base |
referrals.create | requests.view external-labs.view | إنشاء إحالة لمعمل خارجي | جزئياً (نضيف external-labs.view) |
referrals.receive-results | results.view | استلام نتيجة من المعمل الخارجي تتزامن مع النتائج | مقترحة |
referrals.generate-invoice | invoices.view invoices.create | توليد فاتورة الإحالة | مقترحة |
external-lab-pricing.* · external-lab-normal-ranges.* | external-labs.view investigations.view | تسعير/مديات المعمل الخارجي لكل تحليل | مقترحة |
E البيانات الأساسية / الكتالوج (Master Data)
| الصلاحية | تتطلّب | السبب | الحالة |
|---|---|---|---|
investigations.create | sections.view specimen-types.view investigation-categories.view | التحليل بيختار قسم + نوع عينة + تصنيف | مقترحة |
investigations.approve / publish / transition | — | investigations.view (عامة) | عامة |
packages.create | investigations.view price-lists.view | الباقة = تحاليل + تسعير | مقترحة |
price-lists.create | investigations.view | قائمة الأسعار = أسعار لكل تحليل | مقترحة |
insurance-contracts.create | price-lists.view investigations.view | العقد = تسعير معتمد لكل تحليل | مقترحة |
doctors.create | commission-rules.view | الطبيب له قواعد عمولة | اختياري |
sections / specimen-types / categories / visits / machines .create | — | <own>.view (عامة) | عامة |
F الجودة + المخزون + التأمين (QC / Inventory / Insurance)
| الصلاحية | تتطلّب | السبب | الحالة |
|---|---|---|---|
qc-results.create / delete | qc-lots.view | نتيجة الجودة مرتبطة بـ Lot | مقترحة |
reagents.consume / manage | — | reagents.view (عامة) | عامة |
machine-results.create / approve | machines.view | نتائج الأجهزة | مقترحة |
insurance-invoices.generate / monthly.generate | insurance-contracts.view invoices.view | فواتير التأمين الشهرية تتجمّع من المطالبات | مقترحة |
ملاحظة بنية: مجموعتا
compliance وinsurance-invoices بتستخدموا أسماء بأربع نقاط (مثل lis.compliance.checklists.create)، فالقاعدة العامة (اللي بتشتغل على 3 نقاط) ماتغطّيهاش — محتاجة معالجة خاصة في الكود لو هنطبّق عليها deps.★ أدوار جاهزة (Presets) — باقات صلاحيات بضغطة
بدل ما تبني كل دور من الصفر، دي 7 باقات منطقية. كل باقة لما تتفعّل بتجرّ اعتمادياتها تلقائياً (فالمكتوب هنا هو «نقطة البداية» اللي تختارها).
1) موظف استقبال / إدخال طلبات
يفتح طلبات، يضيف مرضى، يحصّل.
requests.createrequests.cancelvisits.createpatients.updatedashboard.view
2) كاشير
تحصيل وإدارة المدفوعات + وردية الكاشير.
payments.createpayments.voidrequests.viewdashboard.view
3) فني سحب عينات (Phlebotomist)
تجميع واستلام ورفض العينات.
samples.collectsamples.receivesamples.acceptsamples.rejectdashboard.view
4) فني مختبر (إدخال نتائج)
يدخّل النتائج ويشتغل على الكانبان.
results.enterkanban.managesamples.processmachine-results.match
5) أخصائي / مُعتمِد (Validator)
يراجع ويعتمد النتائج.
results.validateresults.approveresults.correctresults.retest
6) استشاري / إصدار التقارير (Pathologist)
يفرج عن النتائج ويصدر التقارير.
results.releaseresults.release_unpaidresult-reports.generateresult-reports.publish
7) مدير معمل / أدمن
بيانات أساسية + تقارير + إعدادات + خزن + أدوار.
investigations.createpackages.createprice-lists.createsections.createsettings.managereports.view
★ الحالة الحالية vs المقترح (خطة التنفيذ)
المُطبّق فعلاً في الكود (LisPermissionDependencies.php)
- القاعدة العامة (أي فعل ⟵
viewلنفس المورد). - السلسلة A كاملة:
requests.create⟵ المرضى + التحاليل + الأطباء + الفواتير + المدفوعات + الأسعار + الباقات. invoices.create,payments.create,requests.update,samples.collect/create/reject,results.enter,referrals.create(جزئياً).
المقترح إضافته (الصفوف مقترحة فوق)
- المعالجة:
kanban.manage,results.enter(+samples.view),results.release,result-reports.generate,machine-results.*. - الإحالات:
referrals.create(+external-labs.view),receive-results,generate-invoice, تسعير المعامل الخارجية. - الكتالوج:
investigations.create⟵ sections/specimen-types/categories،packages.create,price-lists.create,insurance-contracts.create. - الجودة/التأمين:
qc-results.create⟵ qc-lots.view،insurance-invoices.generate.
الترتيب المنطقي للعرض في شاشة الأدوار: نرتّب المجموعات حسب سلسلة العمل (استقبال ← تجميع ← معالجة ← اعتماد ← إصدار ← إحالات ← كتالوج ← جودة ← تقارير ← إعدادات) بدل الترتيب الأبجدي — أوضح للأدمن.
★ إزاي بتظهر في الواجهة (شغّالة دلوقتي)
- لما تحدّد صلاحية ⟵ متطلباتها بتتحدّد تلقائياً، وبتظهر بعلامة 🔒 + تولتيب «مطلوبة لصلاحية أخرى مفعّلة».
- عند الحفظ ⟵ الباك-إند بيوسّع المجموعة (closure) فالدور المحفوظ دايماً متماسك حتى لو اتبعت ناقص من API.
- الأزرار في كل الشاشات بتختفي حسب صلاحية المستخدم (
*appCan). - عند إعطاء صلاحية لمستخدم شغّال ⟵ التغيير بيظهر له أول ما يدخل
/lab(إعادة تحميل/auth/meتلقائياً) — من غير logout/login.