🏗️

المعمارية التقنية للنظام (Technical Architecture)

النظام مبني على إطار عمل PHP مخصص يُسمى "aw framework" (تطوير داخلي يعود لحوالي عام 2015)، بدون أي إطار عمل قياسي معروف. يتكون من أربعة تطبيقات فرعية تتشارك قاعدة بيانات MySQL واحدة (312 جدولًا) ومكتبات مشتركة في مجلد _library. طبقة العرض تعتمد على قوالب Smarty، وطبقة البيانات على RedBeanPHP، والتوجيه يتم بالوصول المباشر لملفات الكنترولر دون نقطة دخول موحدة. هذا القسم يشرح البنية وطريقة العمل والوضع الأمني والديون التقنية بصراحة مهنية لدعم قرار الترحيل إلى منظومة Laravel + Angular.

4تطبيقات فرعية
81ملف كنترولر
312جدول قاعدة بيانات
~38ألف سطر كود (كنترولرات core فقط)
PHP 5.6إصدار منتهي الدعم منذ 2018

نظرة عامة على البنية

مكونات النظام الأربعة

التطبيقالمسارالغرضالحجم التقريبي
العيادة الرئيسية (core)obgy/core/قلب النظام: المرضى، الزيارات، الشيتات الإكلينيكية (حمل/نساء/عقم/حقن مجهري)، التقارير المالية، الإعدادات، النسخ الاحتياطي، وخدمات الموبايل mobileservices.php70 كنترولر / ~37,900 سطر
الصيدلية (pharmacy)obgy/pharmacy/الأدوية، المشتريات، المخزن، الفواتير (receipt)، الموظفون6 كنترولرات
البورد التعليمي (board)obgy/board/جلسات وطلبات البورد والموظفون4 كنترولرات
شاشة الانتظار (screen)obgy/screen/شاشة عرض دور المرضى في الاستقبال — يعيد استخدام ملفات core مباشرة (require core/controllers/imp/)كنترولر واحد

الـ Framework المخصص (aw framework) وطريقة عمله

طبقة البيانات

العنصرالتفاصيلالملاحظات
المكتبة (ORM)RedBeanPHP إصدار 4.3 — ملف واحد _library/db_main/rb.php (12,380 سطرًا)إصدار قديم (~2016)؛ الإصدار الحالي 5.x
قاعدة البياناتMySQL — قاعدة amrtechogate_obgy بـ312 جدولًا (307 InnoDB، 5 MyISAM منها جدول المستخدمين awusers)جدول المستخدمين MyISAM لا يدعم المعاملات
الترميز (Charset)الاتصال يفرض SET NAMES latin1 بينما الجداول utf8 وتحوي بيانات عربيةاعتماد على "ازدواج ترميز" هش — أي ترحيل بيانات يتطلب معالجة ترميز دقيقة
وضع التشغيلR::freeze(FALSE) — الوضع "السائل" (Fluid Mode) مفعّل في الإنتاجالمكتبة قادرة على تعديل بنية الجداول تلقائيًا أثناء التشغيل — مخاطرة على سلامة المخطط
أسلوب الاستعلامخليط: ORM (R::find/load/store/trash) باستعلامات مُعاملة آمنة، بجانب SQL خام عبر R::getAll/getRow/exec كثير منه مبني بدمج نصوص مباشرالجزء الخام هو مصدر ثغرات حقن SQL (انظر الأمان)
المعاملات (Transactions)R::begin/commit/rollback تُستخدم في عمليات الإدخال المركبةممارسة جيدة، لكنها بلا أثر على الجداول الـMyISAM

المصادقة وواجهات الـ API

الأمان — نقاط القوة

الأمان — نقاط الضعف (بصراحة مهنية)

الثغرةالدليل (مسار الملف)الخطورة
حقن SQL — مدخلات المستخدم تُدمج نصيًا في الاستعلامات (شاشة بحث المرضى: الاسم/العنوان/الهاتف...، التقارير المالية، الزيارات، السونار)core/controllers/patients.php (بناء $q1..$q8 بصيغة LIKE '%$input%'financialreport.php (executeSqlvisits.php، sonar.php (R::exec('... WHERE id = ' . $id))حرجة — قاعدة البيانات تحوي بيانات طبية حساسة
API الموبايل بلا أي مصادقة + CORS مفتوح للجميع، يتيح إنشاء/تعديل سجلات مرضى وقراءة بياناتهمcore/controllers/mobileservices.php (فحوصات autho معلّقة، Access-Control-Allow-Origin: *)حرجة
بيانات اعتماد مكتوبة نصًا داخل الكود: كلمة مرور قاعدة البيانات مكررة في 5 ملفات إعدادات، مفاتيح API خارجية، ومفتاح سري للكوكيز ثابت_public/aw_config.php، _public/api_config.php، ونسخ core/pharmacy/board/screen/public/aw_config.phpعالية
النسخ الاحتياطية لقاعدة البيانات (ببيانات المرضى كاملة) مخزنة داخل مجلد الويب العام، وتُنشأ بأمر نظام يمرر كلمة المرور في سطر الأوامرcore/db_backups/ (1.6 جيجابايت، 39 نسخة)، _db/*.sql، الكود في core/controllers/index.php (دالة takeackup عبر system())عالية
لا توجد حماية CSRF في أي نموذج، ولا قائمة سماح للأكشنات القابلة للاستدعاء من الرابطنمط imp/_imp.php العام في كل الكنترولراتعالية
أكشنات إدارية خطرة قابلة للاستدعاء بمجرد تسجيل الدخول دون فحص صلاحيات (مثل onesetup الذي يحذف قوائم وأدوارًا)core/controllers/index.php (دالة onesetup — فحص الدخول فقط دون فحص الدور)متوسطة إلى عالية
display_errors = on في إعدادات الـ API (تسريب تفاصيل تقنية)، واتصال خارجي بخدمة SMS عبر HTTP غير مشفر_public/api_config.php، $hosturlApi = 'http://api.gt4it.com' في aw_config.phpمتوسطة
وضع ORM "السائل" مفعّل في الإنتاج (يسمح بتعديل بنية الجداول تلقائيًا)R::freeze(FALSE) في _public/aw_config.phpمتوسطة

الديون التقنية (Tech Debt)

البندالوضع الحاليالأثر
إصدار PHPالخادم يعمل بـ PHP 5.6.40 — انتهى دعمه الأمني نهائيًا في ديسمبر 2018لا تصلح أمنية منذ 7+ سنوات؛ عائق أمام أي مكتبات حديثة
Smartyالإصدار 3.1.11 (صدر 2012)ثغرات معروفة في إصدارات Smarty القديمة، ولا هروب تلقائي للمخرجات افتراضيًا
RedBeanPHPالإصدار 4.3 (~2016) كملف وحيد منسوخ يدويًالا إدارة تبعيات (لا Composer إطلاقًا في المشروع)
تكرار الكود~60 سطرًا من كود التهيئة منسوخة في كل كنترولر من الـ81؛ ملفات إعدادات مكررة بنفس كلمة المرور في كل تطبيق فرعي؛ كنترولرات عملاقة (patients.php = 2,259 سطرًا، visits.php = 1,946)أي تعديل عرضي مكلف وعرضة للأخطاء؛ صعوبة الصيانة هي المحرك الأساسي لقرار الترحيل
ملفات الرفعمجلد upload/ بحجم ~3.2 جيجابايت (السونار وحده 3.1) داخل مجلد الويب، يُقرأ من نظام الملفات مباشرة دون فهرسة كاملة في قاعدة البياناتصعوبة النسخ الاحتياطي والترحيل؛ مخاطر وصول مباشر للملفات
استراتيجية النسخ الاحتياطيتُنفذ داخل طلب الصفحة الرئيسية: أول زيارة يومية للصفحة الرئيسية تشغّل mysqldump بشكل متزامن وتكتب في core/db_backups/ (39 نسخة متراكمة، 1.6 جيجابايت) دون تدوير أو نقل خارج الخادم؛ نسخ Excel في core/excel_backups/بطء عشوائي للمستخدم الأول صباحًا؛ النسخ على نفس القرص = لا حماية من فقد الخادم
اتساق البيئةتوقيتان مختلفان في الإعدادات (لوس أنجلوس في aw_config مقابل القاهرة في الكود والـ API)؛ ترميز latin1/utf8 مزدوج؛ كود ميت (php-jwt، جداول مهجورة، كتل معلّقة كثيرة)أخطاء تواريخ محتملة؛ تعقيد إضافي عند ترحيل البيانات
الاختبارات والتحكم بالإصداراتلا توجد أي اختبارات آلية، ولا مستودع Git، وملفات error_log وملفات تجريبية متناثرة داخل مجلدات الكنترولراتأي تعديل = مخاطرة غير مقيسة؛ يصعّب التطوير المتوازي

الخلاصة الإدارية