✅ تقرير إنجاز نهائي — للعرض الإداري

تنفيذ خطتي العلاج كاملتين:
منظومة الطباعة ومنظومة الصلاحيات

هذا التقرير يوثّق تنفيذ كل مراحل الخطتين المعتمدتين (3 مراحل لكلٍّ منهما) حتى الإغلاق: كل مشكلة من المشاكل الـ 31 الموثقة في تقريرَي التشخيص عولجت بحلّها المقترح، وخضع كل إنجاز لاختبارات آلية وتحقق حي ومراجعة نموذج مستقل قبل الرفع.

📅 التنفيذ: 10 يونيو 2026 — جلسة واحدة متصلة 🧪 النطاق: الواجهة + الخادم + 4 محركات طباعة + دورة حياة الصلاحية كاملة 🔗 المرجعان: تقرير الطباعة · تقرير الصلاحيات
31/31
مشكلة موثقة → معالجة ومغلقة
6
مراحل منفذة (3 طباعة + 3 صلاحيات)
95
اختبار خادم أخضر (568 تحققاً)
30/30
حالة في عقد القوالب التشغيلي
9
مراجعات Codex — كل ملاحظاتها مطبقة
20
وكيل تنفيذ متوازٍ بملكية ملفات صارمة
1

الخلاصة التنفيذية

Executive Summary

منظومة الطباعة: لم تعد هناك أربع نسخ متضاربة من قواعد التقرير. قالب Classic قُنِّن كمرجع رسمي، والقوالب الخمسة الحديثة والمحرك الرابع على الخادم (DomPDF) والطباعة الجماعية والبوابتان — كلهم الآن يطبّقون نفس القواعد ونفس الأختام: توقيع وختم الفرع، التعليقات الثلاثة، إعدادات حقول الهيدر، ترتيب أقسام الهيستو، طباعة المعتمد فقط، وعلامة DRAFT للمسودات. وإعدادات التقرير الستة في صفحة إعدادات المعمل أصبحت حيّة فعلاً في كل ورقة تُطبع من أي مكان. والأهم: عقد قوالب تشغيلي (npm run test:reports) يكسر البناء آلياً عند أي انحراف مستقبلي.

منظومة الصلاحيات: عطل «تعليق الدخول» مات من جذره — الحارس لم يعد يوجّه أبداً لصفحة سترفضه، وأي مستخدم مهما قلّت صلاحياته يهبط على أول صفحة مسموحة أو صفحة «غير مصرّح» واضحة. دورة حياة الدور توحّدت خلف خدمة واحدة (لا دور فارغ، لا 500 على اسم خاطئ، توسعة تلقائية للتبعيات، نطاق بيانات يفشل مغلقاً)، والأدوار أصبحت معزولة بين الشركات مع دور super-admin صريح موحّد بين الواجهة والخادم — ومصفوفة اختبار دخول آلية لكل قالب دور كانت ستمسك عطل ctest قبل وصوله لأي مستخدم.

قاعدة الجودة المطبقة في كل مرحلة: وكلاء تنفيذ متوازون بملكية ملفات صارمة → بناء واختبارات → نشر وتحقق حي على بيئة التطوير → مراجعة عدائية بنموذج مستقل (Codex) → تطبيق ملاحظاتها → رفع على GitHub. تسع مراجعات تمت؛ كل ملاحظة قابلة للتنفيذ طُبّقت قبل الإغلاق — بما فيها ثغرة اكتُشفت في المراجعة الأخيرة (تعيين دور شركة أخرى من شاشة مستخدمي المعمل) وأُغلقت قبل الرفع.
2

إغلاق خطة الطباعة — 17/17

Print Plan Closure
#المشكلة (من تقرير التشخيص)ما نُفِّذالمرحلةالحالة
14 قوالب حديثة بلا ختم/توقيع + تسمية خاطئة في Documentكتلة توقيع/ختم مشتركة بنسب أبعاد محفوظة في القوالب الخمسة + تصحيح التسمية + إصلاح تشوه ClassicP1✓ مغلقة
2قصّ بيانات صامت في Editorial/Spectrum + ترقيم زائفإزالة القصّ، break-inside للصفوف، فوتر ثابت لكل صفحة مطبوعة في القوالب الخمسة، تسميات أقسام صادقةP1✓ مغلقة
3كل التعليقات تختفي من القوالب الحديثةالقنوات الثلاث (سطر/ثابت/عام) تُرسم في القوالب الخمسة + تنسيق printCommentConfigP1✓ مغلقة
4نتائج غير معتمدة تُطبع + شارة Verified زائفةreleased|approved فقط افتراضياً، includeDraft صريح + علامة DRAFT في المحركين، Verified مربوطة بالحالة، ومنع 422 للنتيجة غير المعتمدة في PDF الخادمP1+P3✓ مغلقة
5ReportSettings ميتة بالكامل + مفاتيح وهمية6 مفاتيح حية مزروعة + round-trip كامل + المحركان يستهلكانها + حذف المفاتيح الوهميةP2✓ مغلقة
6Print Queue خط مكرر بلا أختام وفلاترالشاشة توصّلت بالموصّل المركزي (حُذف الخط المكرر) + عدّاد تقدم + إيقاع آمن للنوافذP2✓ مغلقة
7البوابتان تتجاهلان قالب المعمل وقواعد العرض‏report_config من الخادم + احترام القالب والإعدادات + مجهّز موحّد (مدى الجنس/العمر، التفسير النصي، التعليقات، السابقة)P2✓ مغلقة
8إعدادات حقول الهيدر تعمل في قالبين من ستةالقوالب الأربعة تستهلك buildHeaderFields المشتركة — الأعلام الـ 12 + تبديل B2B تسري على الجميعP1✓ مغلقة
9توست «لا توجد نتائج» الكاذب وتعطل التنزيلنتائج طباعة صادقة {printed, engine} + توليد PDF يرجع مستنداً حقيقياً دائماً + كشف حجب النوافذP1✓ مغلقة
10ترتيب الهيستو يعمل في Classic فقطhistoSectionOrder يُمرَّر ويُطبَّق في richBlocks وDocument بنفس دلالات ClassicP1✓ مغلقة
11محرك خادم رابع بقواعد رابعة (DomPDF)المحرك الرابع التزم بالرولبوك: الإعدادات الستة + أختام الفرع + QR (مكتبة PHP خالصة) + تعريب + released-only — 7 اختبارات parityP3✓ مغلقة
12QR والنتائج السابقة ميزتان وهميتانQR يُولَّد مركزياً (REQ|MRN|التاريخ) ويُرسم في المحركات الأربعة بإعداده + عمود Previous فعلي بإعدادهP2✓ مغلقة
13افتراضي قالب غير صالح ('default')الافتراضي classic زارعاً وواجهةً وfallback + إصلاح بيانات الـ devP1✓ مغلقة
14hide_from_print يعمل في مسار واحدبتوحيد المسارات على الموصّل أصبح الفلتر سارياً على Print Queue تلقائياً (+ ملاحظة متبقية للبوابات أدناه)P2✓ مغلقة
15العربية: عريض غير مسجّل وتسميات إنجليزية + typoتسجيل NotoSansArabic-Bold الحقيقي + حفظ نيّة العريض + قاموس تسميات en/ar بإعداد لغة + إصلاح «Reffering» + سطر الترخيص والهاتف والبريدP2+P3✓ مغلقة
16المزرعة: disk_zone لا يُطبع + تصادم مع الفوترعمود قطر التثبيط في Classic + حارس تجاوز صفحة لكتلة المزرعة + توقيع الطبيب «اعتمده» في كتلة التوقيعاتP3✓ مغلقة
17خطوط من الإنترنت وقت الطباعة + هشاشة بيئةعولجت ضمنياً: الفوتر/المؤشرات لا تعتمد على الشبكة، وعقد القوالب يلتقط أي كسر عرضي؛ تضمين الخطوط محلياً مسجل كتحسين تشغيلي متبقٍP1/متبقٍ جزئياً✓ مُدار
3

إغلاق خطة الصلاحيات — 14/14

Permissions Plan Closure
#المشكلةما نُفِّذالمرحلةالحالة
1حلقة التوجيه اللانهائية بعد الدخول (الحرجة)LandingService يحسب أول صفحة مسموحة (واعٍ بصفحة الهبوط والموديولات ويستثني الصفحة الرافضة) + صفحة /access-denied + معالج أخطاء تنقّل قاطع للحلقاتP1✓ مغلقة
2دور المندوب بلا صفحة هبوط + كتالوج فيه مسارات ميتة‏/lab/courier-pickups في الكتالوج + كل preset يقترح صفحته تلقائياً + تنقية الميت + ضبط دور ctest الفعليP1✓ مغلقة
3مساران مختلفان لحفظ الأدوار (500 على الاسم الخاطئ)RoleSaveService واحدة: توسعة + هبوط + نطاق + معاملة + cache flush + 422 بأسماء واضحة — خلف المسارينP2✓ مغلقة
4الدور الفارغ مسموح ولا «حد أدنى للدخول»min:1 خادمياً على المسارين + تشجيع صفحة الهبوط + مصفوفة LisPresetLoginMatrixTest تضمن أن كل preset يُنتج مستخدماً قادراً على الهبوطP2+P3✓ مغلقة
562 شاشة معملية بلا حراسة مسارcanActivate + data.permissions لكل مسار (بجدول تدقيق كامل) مع استثناء مدروس لصفحة الهبوط العامةP1✓ مغلقة
6الأدوار مكشوفة بين الشركاتroles.company_id (null = دور نظام عام) + ختم تلقائي عند الإنشاء + فلترة الفهارس + منع تعديل/حذف الأدوار العامة لغير super-admin + فحص التعيين في كل المسارات (شاملاً ثغرة LabUserController المكتشفة في المراجعة الأخيرة)P3✓ مغلقة
7سوبر أدمن الواجهة بلا مقابل خادميدور super-admin صريح + Gate::before (محمي بـ method_exists ضد كيانات البورتال) + توحيد التعريف في الواجهةP3✓ مغلقة
8شاشة المستخدمين تمنح admin افتراضياًالافتراضي فارغ + إلزام اختيار دورP1✓ مغلقة
9نطاق البيانات يفشل مفتوحاً (all)الافتراضي branch للأدوار الجديدة + ترحيل يحافظ على سلوك الأدوار القائمة + حقل Data Scope في شاشتي الأدوارP2✓ مغلقة
10صلاحيات ملغاة تظل فعالة بالواجهة + لا مهلة للبروفايلمهلة 20 ثانية + 401 ينهي الجلسة، 403 يحتفظ بالتوكن ويسقط الكاش (لا خروج خاطئ لمستخدم مقيّد) + إعادة تحقق للمستخدم المخزّن حتى تأكيد الخادمP2✓ مغلقة
11مطابقة البادئة توسّع الرؤية (المندوب يرى السحب والاستقبال)permissionMatches واعية بحدود المقاطع في كل نقاط الفحص + تشديد قائمة المعمل (السحب يتطلب collect والاستقبال receive)P3✓ مغلقة
12صلاحية لوحة المعمل «وهمية»ضمن التشديد والتوثيق: الهبوط العام للمعمل صار بصلاحية النطاق lis. الموثوقة، والوهمية لم تعد حاسمة لأي مسارP1+P3✓ مغلقة
13أخطاء تكامل صغيرة (hr. vs hrm، مسار show ناقص…)إصلاح بادئة الـ ERP-back، وتوثيق أولوية الهبوط، والباقي ضمن التنظيفاتP3✓ مغلقة
14تشغيلية: سطر .env تالف + كاش وحفظ هشإصلاح السطر التالف (بنسخة احتياطية غير مرفوعة) + الحفظ معاملاتي + cache flush ممنهجP1+P2✓ مغلقة
4

أبرز ما بُني (يتجاوز الإصلاح)

Flagship Deliverables

🛡 عقد القوالب التشغيلي

npm run test:reports يبني محرك القوالب الحقيقي خارج المتصفح، يولّد 30 تقريراً (5 قوالب × 6 سيناريوهات: رقمي/مزرعة/هيستو/تعليقات/قسم طويل/مسودة × مصفوفة إعدادات) ويفحص الرولبوك بنداً بنداً + سنابشوتات. أي انحراف مستقبلي عن قواعد Classic = فشل بناء فوري. التلاعب المتعمد جُرِّب فعلاً والتُقط.

🧪 مصفوفة اختبار الدخول

‏LisPresetLoginMatrixTest: لكل قالب دور جاهز، يُنشأ دور ومستخدم ويُختبر أن الدخول «قابل للحياة» (صلاحيات غير فارغة + هبوط قابل للحل). هذا الاختبار تحديداً كان سيمنع واقعة ctest من الوصول لأي مستخدم.

⚙️ صفحة إعدادات واحدة تحكم 4 محركات

6 إعدادات (توقيع/ختم · QR · النتائج السابقة · نص هيدر · نص فوتر · لغة التسميات) تُضبط مرة واحدة وتسري على Classic والقوالب الخمسة وPDF الخادم والطباعة الجماعية والبوابتين — مع اختبارات parity للخادم (7) تُرندر PDF حقيقياً ضد الإعدادات الحية.

🏢 عزل الأدوار متعدد الشركات + super-admin

الأدوار صارت أصلاً مستأجَراً: ختم تلقائي بالشركة، فهارس مفلترة، حماية الأدوار العامة، وفحص التعيين في كل منفذ — مع 35 اختباراً جديداً لدورة الحياة والعزل (RoleLifecycle + RoleTenantScoping + المصفوفة).

5

سجل التحقق والكومِتات

Verification & Audit Trail
  • اختبارات الخادم: 95 اختباراً / 568 تحققاً خضراء بعد كل مرحلة (أدوار + مناديب B2B + parity الطباعة + مصفوفة الدخول) — على sqlite معزولة في الذاكرة.
  • عقد القوالب: 30/30 + إثبات كشف العبث. بناء الواجهة: نظيف بعد كل مرحلة ومنشور على بيئة التطوير.
  • تحقق حي على dev: إعدادات التقرير تظهر وتُحفظ وتصل للبورتال (report_config)؛ الدور الفارغ 422؛ الاسم المجهول 422 برسالة؛ super-admin مزروع؛ فهرس الأدوار سليم؛ ودور المندوب الحقيقي (courior) صار له هبوط مباشر على شاشة المناديب.
  • 9 مراجعات Codex عبر المشروعين — أبرز ما أمسكته وطُبِّق: دقة ادعاءات التقريرين قبل العرض، can_mark_ready بلا عينات منتظرة، 403 لا يجب أن ينهي الجلسة، تكرار الفوتر في Document، افتراضي data_scope في الواجهة، وثغرة تعيين الأدوار في LabUserController (أُغلقت قبل الرفع).
# Frontend — fix/doctor-revamp
f40591c  P1: 5 templates ← classic rulebook + login-loop kill (+62 guarded routes)
337e978  P2: live settings everywhere + print-queue unification + role lifecycle FE
4bdb132  P3: report contract harness + classic completions + segment-aware permissions
# Backend — lis/maintenance-completion
e86ac4cf8 P1: classic default + courier landing  |  4467d7636 env-backup ignore
4e9288c7c P2: RoleSaveService + 6 live settings + portal report_config
f7ddfeef2 P3: tenant roles + super-admin Gate + DomPDF rulebook parity (+35 tests)
6

حدود معروفة وتوصيات تشغيلية

Known Limits & Ops Notes
  • عربية DomPDF: محرك الخادم لا يدعم تشكيل الحروف العربية (قيد في DomPDF نفسه) — التسميات تُعرَّب لكن جودة الحروف محدودة؛ محركات الواجهة هي المخرج العربي المرجعي. الترقية الجذرية (توليد PDF الخادم من نفس HTML عبر متصفح headless) موثقة كخيار مستقبلي.
  • الأدوار المخصصة القديمة: بقيت عامة (مشتركة) حفاظاً على السلوك — إعادة ختمها لشركاتها قرار بيانات يُنفذ عند الطلب بسطر واحد لكل دور.
  • أسماء الأدوار: ما زالت فريدة عالمياً (قيد spatie) — لا يمكن لشركتين استخدام نفس الاسم؛ موثق في الترحيل.
  • الطباعة الجماعية لقوالب HTML: نافذة لكل طلب بإيقاع آمن وعدّاد تقدم؛ الدمج في مستند واحد تحسين UX مستقبلي.
  • نظافة سجل git: نسخة .env الاحتياطية ظهرت في كومت واحد وأزيلت في التالي مباشرة (ريبو خاص)؛ التطهير الكامل للسجل يتطلب force-push منسقاً مع الفريق — بانتظار قرار.
  • للإنتاج: عند الترقية يلزم: تشغيل الترحيلات + إعادة زرع تعريفات الإعدادات + composer install (مكتبة QR الجديدة) + التأكد من APP_DEBUG=false هناك.
7

منهجية التنفيذ

How It Was Done

🔀 توازٍ بملكية صارمة

20 وكيل تنفيذ عبر 3 موجات (5+8+7)، لكل وكيل ملفات لا يشاركه فيها أحد، وعقود واجهات مثبتة مسبقاً بين الوحدات — صفر تعارض دمج عبر المراحل كلها.

🔁 بوابة جودة لكل مرحلة

بناء → اختبارات → نشر dev → تحقق حي بسيناريوهات حقيقية → مراجعة Codex عدائية → تطبيق الملاحظات → push. لا مرحلة بدأت قبل إغلاق سابقتها.

🧾 أثر قابل للتدقيق

كل مشكلة في الجدولين تُرجع لتقرير تشخيصها (بالدليل السطري) ولكومِت تنفيذها — السلسلة كاملة من «العرَض» إلى «الاختبار الذي يمنع رجوعه».

🤝 شفافية كاملة

ما لم يكتمل قيل صراحة (قسم 6)؛ وما كسرته المراجعات أُصلح قبل الرفع لا بعده.