يدير هذا الموديول متابعة الحمل للمريضة عبر "ملف متابعة" واحد نشط لكل حمل (تاريخ آخر دورة LMP، تاريخ الولادة المتوقع EDD، تاريخ IVF، عدد مرات الحمل والولادة G/P)، مع سجلات زمنية للزيارات والتشخيصات والفحوصات والتحاليل، إضافة إلى "كروت متابعة" قابلة للطباعة لكل زيارة عيادة تتضمن التشخيص والأدوية الموصوفة وترتبط بالصيدلية، وأخيراً مكتبة تعليمات نصية للمريضات تُطبع عند الطلب مع خطابات تحويل للمستشفيات.
followup بحالة 0 = جارٍ) مع حساب EDD تلقائياً (LMP + 9 أشهر + 7 أيام) وتاريخ IVF (LMP + 9 أشهر − 7 أيام).del = 1).followupdrugs يُنشأ وقت التشغيل) مع تمييز روشتة الزوجة عن الزوج (forhusband)، وعرض أرشيف الروشتات حسب التاريخ وطباعتها.status = 1) وعرض تفاصيل أي حمل سابق كاملاً (زيارات/تشخيصات/فحوصات/تحاليل) من شاشة الأرشيف.followupcard) يلتقط تاريخ الدخول من آخر زيارة في جدول visits وقسم الكشف من detections واسم الطبيب من المستخدم الحالي.followupcarddrugs) من كتالوج الأدوية مع النوع والجرعة، وعند اعتماد الكارت تُنشأ روشتة صيدلية تلقائياً (recepittmp + receiptdrugs) لتسعيرها وتحصيلها في الصيدلية.instruction: عنوان + محتوى نصي منسق) مع إضافة وتعديل وحذف منطقي، واختيار عدة تعليمات وطباعتها باسم المريضة وتاريخ اليوم.mainantenental والتاريخ الولادي والمرضي والجراحي، مع اختيار المستشفى وتعليمات العمليات وطباعة الخطاب.| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
followup | ملف متابعة الحمل الرئيسي (ملف واحد نشط لكل مريضة، ويؤرشف عند انتهاء الحمل) | patientid, history, lmp, eed, ivf, g, p, status | patients عبر patientid |
followupvisit | زيارة متابعة دورية (وزن، ضغط، عمر الحمل، سونار، ملاحظات) | followid, date, wt, bp, ga, us, notes, del | followup عبر followid |
followupdiagnosis | سطر تشخيص مؤرخ داخل ملف المتابعة | followid, date, diagnosis, del | followup عبر followid |
followupexam | سطر فحص إكلينيكي مؤرخ داخل ملف المتابعة | followid, date, exam, del | followup عبر followid |
followupinvest | سطر تحاليل/أشعات مطلوبة مؤرخ داخل ملف المتابعة (نص حر) | followid, date, invest, del | followup عبر followid |
followupcard | كارت متابعة الزيارة القابل للطباعة (تشخيص + فترة الزيارة + الطبيب + القسم) | patientid, doctorid, enterdate, exitdate, date, diagnosis, status, deleted, deptid | patients عبر patientid، awusers عبر doctorid، detections عبر deptid (مأخوذ من visits.detectionid) |
followupcarddrugs | أدوية كارت المتابعة (الدواء، النوع، الجرعة) وربطها بروشتة الصيدلية | cardid, drugid, drugtype, drugdos, recepittmpid | followupcard عبر cardid، drugs عبر drugid، recepittmp عبر recepittmpid |
instruction | مكتبة تعليمات نصية للمريضات قابلة للطباعة | patientid, name, content, tempdelete | patients عبر patientid (نظرياً فقط — القيمة ثابتة بـ 1 في الكود، فهي عملياً مكتبة عامة) |
followup.php?patientid=N)؛ إن لم يوجد ملف متابعة نشط (status = 0) يُنشأ تلقائياً بسجل followup جديد بقيمة LMP = اليوم، وتُحسب EDD وIVF، وتُضاف أول زيارة فارغة في followupvisit.newvisit/newdiag/newexam/newinv) ثم يحرر القيم خلية بخلية عبر دالة update العامة (اسم الجدول والعمود والقيمة تُرسل من المتصفح)، وتعديل LMP يعيد حساب EDD وIVF فوراً.followupdrugs غير الموجود بالـ dump — يُنشأ وقت التشغيل)، ويمكن عرض أرشيف الروشتات بالتواريخ منفصلة للزوجة والزوج وطباعة أي منها بقالب gyna/print.html.status = 1) ويظهر في شاشة الأرشيف (archive)، ومن هناك تُفتح تفاصيل أي حمل سابق للقراءة عبر pregdetail.followupcard.php?ac=addit)؛ يُنشأ كارت جديد (status = 0) يلتقط تاريخ آخر زيارة من visits وقسمها (detectionid)، ويُسجل التشخيص ويضاف الدواء سطراً سطراً من كتالوج drugs.printit) يُعتمد الكارت (status = 1)، وتُحفظ الأدوية في followupcarddrugs، وتُنشأ روشتة مؤقتة في الصيدلية (recepittmp بمصدر drugstablename = followupcarddrugs) مع سطور receiptdrugs ليتم تحصيلها وصرفها من موديول الصيدلية، ثم يُطبع الكارت.index) تُظهر كل الكروت المعتمدة للمريضة مع اسم الطبيب وقائمة الأدوية مجمعة، مع إمكانية إعادة الطباعة فقط (yesOnly) أو الحذف المنطقي.tempdelete)، ويختار المستخدم مجموعة تعليمات لطباعتها باسم المريضة ولقبها (من wifetypes) وتاريخ اليوم.mainantenental وآخر سونار من mainantenentalus والتاريخ المرضي/الجراحي/النسائي من جداول ph*، ويُختار المستشفى من hospitalnames وتعليمات العمليات من operationinstructions ثم يُطبع الخطاب.followup.patientid وfollowupcard.patientid، مع قراءة ألقاب الزوجة/الزوج من wifetypes وhusbandtypes عند الطباعة.followupcard.enterdate يُلتقط من آخر visits.visitdate، وfollowupcard.deptid من visits.detectionid (جدول أقسام الكشف detections).followupcarddrugs.drugid وfollowupdrugs.drugid، مع قراءة التصنيفات والأنواع والجرعات المميزة من نفس الجدول لملء القوائم.followupcarddrugs.recepittmpid وrecepittmp.drugstablename = 'followupcarddrugs' لتحصيلها لاحقاً.followupcard.doctorid يشير إلى awusers.user_id، وكل دالة محمية بفحص الدخول والصلاحية حسب role_id.followupdrugs (روشتات شاشة المتابعة) مستخدم بكثافة في الكود لكنه غير موجود في ملف الـ SQL dump إطلاقاً — يُنشأ تلقائياً وقت التشغيل بواسطة RedBeanPHP في الوضع المرن (fluid)، وهذه فجوة خطيرة في توثيق المخطط يجب حصرها قبل الترحيل.update وdel تستقبل اسم الجدول واسم العمود من المتصفح مباشرة وتكتب بهما عبر R::load — ثغرة Mass Assignment تتيح تعديل أي جدول في قاعدة البيانات من أي مستخدم مصرح له بالموديول.instruction.php يُحذف السجل بسلسلة SQL مُركّبة نصياً: UPDATE instruction SET tempdelete = 1 WHERE id = ' . $id — ثغرة SQL Injection محتملة، وعدة دوال (مثل addopinst وgetinstdetail) فحوصات الصلاحية فيها معطلة بالتعليق.followupcard.php سطر 270: استخدام = (إسناد) بدلاً من == داخل شرط if، فالشرط صحيح دائماً.instruction.patientid مكتوب ثابتاً بقيمة 1 عند الإضافة والتعديل — العمود بلا معنى فعلي والجدول عملياً مكتبة عامة غير مرتبطة بمريضة.del وdeleted وtempdelete وstatus).followup تكاد تطابق موديول ANC الرئيسي (mainantenental وملحقاته) — نفس مفاهيم LMP/EDD/زيارات/روشتات، وكنترولر التعليمات يحتوي منطق تحويل مستشفيات لا علاقة له بالتعليمات.strtotime نصية (LMP + 9 أشهر ± 7 أيام) بدلاً من قاعدة Naegele القياسية (LMP + 280 يوماً)، وعمر الحمل يُعاد حسابه في الكود ولا يُخزن إلا نصياً في followupvisit.ga.followupcard وfollowupcarddrugs بترميز latin1 بينما البقية utf8mb4 — خطر تلف النصوص العربية في حقل التشخيص.catch فارغ) في معظم الدوال، ولا يوجد أي تسجيل (logging) أو تحقق من المدخلات.Pregnancy (يدمج followup مع mainantenental في كيان واحد للحمل — استنتاج مدعوم بتطابق الحقول) بحقول: patient_id, lmp, edd, ivf_date, gravida, para, status (enum: active/closed) مع حساب EDD كـ Accessor بقاعدة Naegele.AntenatalVisit (يستوعب followupvisit) بحقول رقمية مُهيكلة: weight (decimal)، bp_systolic/bp_diastolic، gestational_age_weeks محسوب، ultrasound_notes، مع pregnancy_id كمفتاح أجنبي حقيقي.followupdiagnosis وfollowupexam وfollowupinvest في موديل واحد ClinicalNote بعمود type (enum: diagnosis/examination/investigation) لأن بنيتها متطابقة تماماً (followid + date + text + del)، أو ربط التشخيص بقاموس ICD-10 مستقبلاً.Encounter أو VisitCard (يحل محل followupcard) مرتبط بـ Visit وDepartment وUser بمفاتيح أجنبية معلنة، مع موديل Prescription + PrescriptionItem موحد يستبدل followupcarddrugs وfollowupdrugs وجداول الروشتات المتناثرة في باقي الموديولات (نمط مصدر واحد للروشتة يغذي الصيدلية عبر Event/Job بدلاً من الكتابة المباشرة في recepittmp).instruction إلى موديل InstructionTemplate كمكتبة قوالب عامة (إسقاط عمود patientid العديم الفائدة)، وفصل منطق خطاب التحويل إلى خدمة مستقلة ReferralLetterService مع موديل Referral يؤرشف الخطابات الصادرة بدلاً من الطباعة دون أثر.SoftDeletes القياسية في Laravel (deleted_at)، وترحيل البيانات مع تحويل ترميز جدولي latin1 إلى utf8mb4 والتحقق من سلامة النصوص العربية.followupdrugs الفعلي وأي جداول أخرى أنشأها RedBeanPHP وقت التشغيل وغير موجودة في النسخة الاحتياطية المرجعية.