هذا الموديول هو البنية التحتية للنظام بالكامل (إطار العمل المخصص "aw framework"): تسجيل دخول المستخدمين عبر مكتبة Login مدمجة، ومنظومة صلاحيات على أربعة مستويات (الدور ← الكنترولر ← الإجراء ← زر الواجهة، إضافةً إلى إظهار/إخفاء عناصر القائمة الجانبية لكل دور)، وسجل إعدادات البرنامج المركزي الذي يتحكم في معظم خصائص الشاشات الطبية والطباعة والترقيم، إلى جانب بنية الفروع والطوابق والأجهزة (غير مفعّلة عملياً)، وشاشة الانتظار للعرض في الاستقبال، وواجهة برمجية (API) لتطبيق موبايل للمريضات، وصفحات المساعدة، وعدد من الجداول التجريبية المهملة.
_library/login_system).autho::checkauthoize() التي تطابق الدور مع الكنترولر والإجراء (awcontroll ← awcontrollprop ← awrolecontrollprop)._role.php) بمصفوفة صلاحيات تفاعلية: إظهار/إخفاء عناصر القائمة لكل دور، ومنح/منع كل إجراء لكل كنترولر، وأربعة أزرار سريرية مثبّتة بالكود (إضافة مريضة، إضافة زيارة، تعديل زيارة، حذف زيارة)._member.php) مع ربط كل مستخدم بدور ووظيفة (awroleposition) وتخصص (awrolespecialize) يُحمَّلان ديناميكياً حسب الدور._menu.php) بالسحب والإفلات، مع وضعَي عرض (مبسّط/كامل) يتحكم بهما إعداد simpleview، وخاصية ربط الرابط بالمريضة الحالية (withpatient).programesetting) بنحو 75 عموداً: بيانات المركز والطبيب، هوامش وخطوط الطباعة، تفعيل/تعطيل أقسام التاريخ المرضي والسونار والعقم، عدّادات أرقام الإيصالات الشهرية، وربط قاعدة بيانات ERP خارجية.setup.php) المحمية بكلمة مرور ثابتة: ربط قاعدة ERP واختيار الخزينة الافتراضية، وروتين خطير لتفريغ جداول قاعدة البيانات مع قائمة استثناء مثبّتة بالكود.screen/): يعرض صوراً دعائية من screen_slider مع اسم المريضة المُنادى عليها وقائمة الخمس التاليات من زيارات اليوم، بتحديث دوري عبر AJAX.mobileservices.php): تسجيل مريضة جديدة بكلمة مرور، تسجيل دخول بالموبايل، حجز وتعديل وإلغاء الزيارات، عرض الروشتات، وقراءة محادثات الدردشة، مع مزامنة بيانات العميلة مع نظام ERP خارجي عبر curl.help.php) بإضافة وتعديل وحذف ناعم.branches, floors, devices, device_tracking) ورسائل داخلية بين المستخدمين (messages).| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
awcontroll | سجل الكنترولرات الخاضعة لنظام الصلاحيات (81 صفاً مزروعاً يغطي كل شاشات النظام) | id, label, name | أب لـ awcontrollprop عبر awcontroll_id |
awcontrollprop | الإجراءات (actions) المتاحة لكل كنترولر مع قيمة سماح افتراضية (index, addit, show, edit, updateit, del...) | id, proplabel, checkval, awcontroll_id | awcontroll عبر awcontroll_id |
awmenu | شجرة القائمة الجانبية (102 عنصر) بمستويين مع الترتيب والأيقونات ووضع العرض المبسّط/الكامل | label, link, parent, sort, icon, form, withpatient | ذاتية عبر parent؛ awrolemenu عبر menu_id |
awrole | الأدوار الوظيفية (Management, pharmacist, reception, doctors, rays, assistants...) | id, name | أب لجداول الصلاحيات والمستخدمين عبر role_id |
awrolebtn | صلاحيات أزرار الواجهة لكل دور؛ أربعة أزرار مثبّتة بالكود (1 إضافة مريضة، 2 إضافة زيارة، 3 تعديل زيارة، 4 حذف زيارة) | role_id, btn_id, checkval | awrole عبر role_id |
awrolecontrollprop | مصفوفة منح/منع كل إجراء لكل دور (نحو 3000 صف) | role_id, controllprop_id, checkval | awrole عبر role_id، awcontrollprop عبر controllprop_id |
awrolemenu | إظهار/إخفاء عناصر القائمة الجانبية لكل دور | role_id, menu_id, checkval | awrole عبر role_id، awmenu عبر menu_id |
awroleposition | الوظائف داخل الدور (مثل: Council Head, Sonographer, Supervisor) | id, roleid, name | awrole عبر roleid؛ awusers عبر positionid |
awrolespecialize | التخصصات داخل الدور (Anasthests, operation للأطباء والمساعدين) | id, roleid, name | awrole عبر roleid؛ awusers عبر specialid |
awusers | حسابات الموظفين: بيانات الدخول والتفعيل واستعادة كلمة المرور ومحاولات الدخول الفاشلة والدور والفرع | user_id, user_name, user_password_hash, role_id, specialid, positionid, branch_id, attend | awrole عبر role_id؛ branches عبر branch_id (استنتاج، القيمة "-1" تعني كل الفروع) |
programesetting | سجل الإعدادات المركزي الوحيد (~75 عموداً): هوية المركز، الطباعة، مفاتيح تفعيل الخصائص، أقسام التاريخ المرضي، عدّادات الإيصالات، ربط ERP، بيانات بريد بنص صريح | centername, simpleview, erpdb, erpdbsave, serial_month, last_serial, last_refund_serial, branches, email, password | قاعدة ERP خارجية عبر erpdb/erpdbsave |
branches | فروع المركز — جدول فارغ وملف الكنترولر Branches.php غير موجود رغم تسجيله في القائمة والصلاحيات | id, name, created_at, updated_at | awusers عبر branch_id (استنتاج) |
floors | طوابق المبنى — فارغ وغير مستخدم في الكود | id, name, deleted, default_value | devices عبر floor_no (استنتاج) |
devices | الأجهزة/الغرف داخل الطوابق — فارغ، الكنترولر adddevices مسجّل في awcontroll لكن الملف غير موجود | device_name, location, floor_no, deleted | floors عبر floor_no |
device_tracking | تتبّع حركة المريضة بين الأجهزة بإشارة متعددة الأشكال (polymorphic) لأي سجل سريري — ميزة مخطَّطة غير منفَّذة (استنتاج) | patient_id, device_id, target_id, target_table, visit_date, visit_time, user_id | patients عبر patient_id، devices عبر device_id، awusers عبر user_id |
messages | رسائل داخلية بين المستخدمين — فارغ ولا يوجد كود يستخدمه (دردشة المريضات تتم عبر جدول chat في موديول آخر) | message, sender_id, receiver_id, created_at | awusers عبر sender_id وreceiver_id |
screen_slider | صور العرض الدوّار على شاشة الانتظار في الاستقبال | id, image, create_date | تُقرأ في تطبيق screen/ مع جدولي visits وpatients |
help | مقالات المساعدة داخل النظام مع حذف ناعم | name, content, tempdelete | لا علاقات |
table2 | جدول تجريبي مهمل — فارغ بلا أي استخدام | id, name2 | لا علاقات |
table3 | جدول تجريبي مهمل — فارغ بلا أي استخدام | id, name | لا علاقات |
tablename | بقايا قالب إنشاء جداول — فارغ ومهمل | id, del | لا علاقات |
testtbl1 | جدول اختبار مهمل — فارغ | id, name2 | لا علاقات |
testtbl2 | جدول اختبار مهمل — فارغ | id, name | لا علاقات |
login.php فتتحقق مكتبة Login من اسم المستخدم وكلمة المرور في awusers (bcrypt) وتكتب في الجلسة user_id وrole_id، مع إيقاف مؤقت بعد ثلاث محاولات فاشلة وخيار "تذكرني" بكوكي مؤمَّن.autho::checkautho() للتأكد من تسجيل الدخول ثم autho::checkauthoize() التي تبحث عن الكنترولر في awcontroll والإجراء في awcontrollprop ثم قرار الدور في awrolecontrollprop، وعند الرفض يُحوَّل المستخدم إلى صفحة خطأ الصلاحية.awmenu تكرارياً حسب parent وsort، مع تصفية حسب وضع العرض (programesetting.simpleview مقابل awmenu.form) وصلاحية الدور في awrolemenu، وإلحاق رقم المريضة الحالية بالروابط الموسومة withpatient._role.php ثم يضبط مصفوفته: عناصر القائمة (إظهار/إخفاء)، وكل إجراء لكل كنترولر (سماح/منع)، والأزرار السريرية الأربعة في awrolebtn التي تُنشأ تلقائياً عند أول فتح._member.php: فحص فوري لتفرّد اسم المستخدم، ثم إدراج مباشر في awusers مع الدور والوظيفة والتخصص المحمّلَين حسب الدور المختار.programesetting.php (شعار وخلفية وهوامش طباعة ومفاتيح تفعيل أقسام الملف الطبي...) فتُحدَّث الصف الوحيد رقم 1 الذي تقرأه كل الشاشات السريرية.setup.php (كلمة مرور ثابتة 123456) يُربط النظام بقاعدة بيانات ERP خارجية وتُختار الخزينة الافتراضية من جدول save فيها، وتوجد أيضاً أداة تفريغ شامل للجداول للبدء من جديد.screen/controllers/index.php دون تسجيل دخول: تعرض صور screen_slider واسم المريضة المُنادى عليها (زيارة اليوم ذات view=1 وend_visit=0) وقائمة الخمس التاليات، وتُحدَّث عبر AJAX من loadInfo.mobileservices.php مباشرة (دون مصادقة): تسجيل مريضة، دخول بالموبايل وكلمة المرور، حجز زيارة (كشف/سونار/إعادة)، عرض الروشتات من gynadrugs وdrugs، وقراءة الدردشة، مع مزامنة بيانات العميلة مع نظام ERP عبر curl ومفتاح API مثبّت بالكود.device_tracking.patient_id وكل دوال mobileservices.php تكتب وتقرأ في جدول patients، وشاشة الانتظار تقرأ patients.wifename.visits عبر patientid وحقلَي view وend_visit.gynadrugs.drugid المرتبط بكتالوج drugs.mobileservices.php::selectChatting يقرأ جدول chat المرتبط بـ patients.id.awusers.user_id (المستخدم المنفّذ) وعلى مفاتيح programesetting وعلى التحقق المركزي في _autho.php.programesetting.erpdb وerpdbsave يربطان بقاعدة بيانات ERP منفصلة (جدول save للخزائن) مع مزامنة العملاء عبر curl في mobileservices.php.excelinfo، وإعدادات النسخ الاحتياطي (backupdest, backupdriver) في programesetting.awusers.branch_id نص (varchar) بقيم سحرية ("-1" تعني كل الفروع).branches وfloors وdevices وdevice_tracking فارغة، وملفا الكنترولر Branches.php وadddevices.php غير موجودين رغم تسجيلهما في القائمة والصلاحيات.mobileservices.php بلا مصادقة ومع Access-Control-Allow-Origin: *، وحقن SQL في patientLogin وgetErpSave (تجميع نصي مباشر)، وكلمة مرور شاشة الإعداد ثابتة (123456)، وبيانات اتصال قاعدة البيانات ومفاتيح ERP API مكتوبة نصاً صريحاً في _public/aw_config.php وapi_config.php، وبريد وكلمة مرور بنص صريح في programesetting._library/php-jwt-master) مرفقة لكن لا يوجد أي استدعاء لها في الكود — تبعية ميتة.ALTER TABLE visits أثناء التشغيل لإضافة عمود end_visit إن لم يوجد — تعديل مخطط بيانات وقت التشغيل وهو نمط خطير.awusers بمحرك MyISAM (لا معاملات)، وعدّادات أرقام الإيصالات (last_serial) في صف الإعدادات معرّضة لتعارض التزامن.awrolebtn مثبّتة بالكود داخل _role.php وليست جدول مرجعي قابل للتوسعة.table2, table3, tablename, testtbl1, testtbl2 — كلها فارغة وبلا أي استخدام.settingdatabase() في setup.php قادر على تفريغ معظم جداول قاعدة البيانات بقائمة استثناء مثبّتة بالكود — مخاطرة تشغيلية عالية.awusers إلى جدول users قياسي (مع حذف أعمدة التفعيل والتذكّر لأن الإطار يتولاها).awcontroll, awcontrollprop, awrolecontrollprop, awrolemenu, awrolebtn) بحزمة spatie/laravel-permission بصيغة صلاحية لكل إجراء (مثل visits.delete)، وتحويل أزرار الواجهة الأربعة إلى صلاحيات مسماة، وبناء القائمة في Angular بحراسة المسارات حسب الصلاحيات بدل جدول قائمة في قاعدة البيانات.awroleposition وawrolespecialize إلى جدولَي positions وspecializations مرجعيين مرتبطين بالمستخدم.programesetting (75 عموداً) إلى جدول إعدادات مفتاح/قيمة مجمّع (هوية المركز، الطباعة، الخصائص، أقسام الملف الطبي)، ونقل بيانات البريد إلى .env، وتحويل عدّادات الإيصالات إلى آلية تسلسل معاملاتية (sequences) آمنة من التزامن.branches كنموذج أساسي بمفتاح branch_id رقمي على المستخدمين والزيارات والماليات، واستبدال القيمة السحرية "-1" بجدول ربط branch_user.Room/Device/PatientFlowEvent بعلاقة polymorphic؛ وإلا حذف floors وdevices وdevice_tracking وmessages لأنها فارغة وغير مستخدمة.ScreenSlide مع صفحة عرض عامة في Angular تستهلك نقطة "طابور اليوم" عبر polling أو WebSocket، ونقل عمود visits.end_visit إلى migration رسمي في موديول الزيارات.mobileservices.php كـ REST API موثّق ومصادَق عليه (Sanctum)، مع معالجة إلزامية لثغرات الحقن وفتح CORS قبل أي إطلاق، ونقل مفاتيح ERP إلى إعدادات مشفّرة.setup.php (تُستبدل بأوامر artisan محمية).User, Role/Permission (spatie), Position, Specialization, Branch, Setting, ScreenSlide, HelpArticle, واختيارياً MenuItem وRoom/Device/PatientFlowEvent.