هذا الموديول هو قلب النظام بأكمله؛ فجدول patients هو المحور الذي ترتبط به جميع الموديولات الأخرى تقريبًا (الزيارات، الفحوصات، التاريخ المرضي، الشيتات الإكلينيكية، الفواتير) عبر العمود patientid. يتولى الموديول تسجيل بيانات المريضة الديموغرافية الكاملة (الزوجة) وبيانات الزوج في نفس السجل، مع رقم ملف تسلسلي للعيادة، وإدارة قوائم الترميز المساعدة (الوظائف، التعليم، فصائل الدم، الحالة الاجتماعية، الألقاب)، والبحث متعدد المعايير، والسجل الطبي السريع، وملفات المريضة المرفوعة، مع مزامنة فورية لبيانات المريضة كعميل في نظام ERP خارجي عبر cURL.
done=0 لكل مستخدم ويُستكمل تدريجيًا ثم يُعتمد عبر addfinish بحالة done=1.statusno (أكبر رقم موجود + 1) مع إمكانية الإدخال اليدوي حسب إعداد programesetting.patientnoaut.risk/risktype.husband_habbits وملاحظاته.previous_marriage وhus_previous_marriage).visits داخل نفس المعاملة.visits.detectionid، مع توجيه المستخدم لآخر شاشة إكلينيكية من جدول lastvisit._patientdata.php الذي يظهر أعلى كل شاشة إكلينيكية: البيانات الديموغرافية + الصيغة التوليدية (P / CS / AB / Ectopic / VM / SVD) محسوبة من جدول phobstetric مضافًا إليها أعمدة الرصيد الافتتاحي في patients، وملخص التاريخ المرضي والجراحي والنسائي والعائلي.record.php): صفوف تشخيص/علاج بالتاريخ مع روشتات للزوجة أو الزوج من كتالوج الأدوية وطباعتها.upload/patientfiles/{id} وعرض وتحميل الملفات (قراءة من نظام الملفات مباشرة).endvisitreports).patient_password_hash (مشفرة بـ password_hash) لاستخدامها في خدمات الموبايل.clientControllerAjax.php، مع زر ترحيل جميع المرضى دفعة واحدة addAllPatientsToERP.| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
patients | الجدول المحوري للنظام: سجل واحد لكل مريضة يضم بيانات الزوجة والزوج معًا، مع أرصدة افتتاحية للصيغة التوليدية وأعلام الحذف والاعتماد | id, statusno, wifename, wiftypeid, dateofbirth, wifeage, wifeeducation, wifejob, wifebl, wifenationalid, statuesid, mirragefrom, mirragefromdate, boyson, girlson, husdandname, husbandtypeid, husbanddateofbirth, husbandjob, husbandbl, husbandnationalid, husband_habbits, address, phone, mobile, risk, risktype, pno, ab, ectopic, vmodel, svd, cs, done, deleted, userid, doctorid, patient_password_hash | wifetypes عبر wiftypeid، wifestatus عبر statuesid، education عبر wifeeducation/husbandeducation، wifejobs عبر wifejob، husbandjobs عبر husbandjob، bloodtypes عبر wifebl/husbandbl، husbandtypes عبر husbandtypeid، risktype عبر risktype، awusers عبر userid/doctorid |
patients_updates | نسخة كاملة من بنية patients مضافًا إليها أعمدة تدقيق (userid_edit, date_edit, patientid_edit) — يبدو أنها سجل تاريخي لتعديلات بيانات المرضى، ولا يوجد كود فعّال يكتب فيها حاليًا (استنتاج) | نفس أعمدة patients + userid_edit, date_edit, patientid_edit | patients عبر patientid_edit (استنتاج)، awusers عبر userid_edit |
patients_tmp | جدول مؤقت مهجور (اسم فقط) لا يُستخدم في أي كنترولر — مخلفات تطوير | pit_id, pit_name | لا توجد |
patientfiles | مُعدّ لفهرسة ملفات المريضة المرفوعة، لكن الكود الحالي يقرأ الملفات من مجلد upload/patientfiles/{patientid} مباشرة دون استخدام الجدول (جدول غير مفعّل) | id, patientid, file | patients عبر patientid |
registeration | صفوف "حجز/تسجيل الولادة" المرتبطة بشيت متابعة الحمل: مكان الولادة، المنشأ، النوع، التكلفة — تُنشأ من شاشة ANC Sheet وتُقرأ في تقارير الولادات | id, ancsheetid, place2, origin, type, awifep, coast, rplace | ancsheet عبر ancsheetid، origin عبر origin |
records | السجل الطبي السريع: سطر تشخيص وعلاج نصي لكل تاريخ لكل مريضة (شاشة Record) مع حذف منطقي | id, patientid, date, diagnosis, ttt, del | patients عبر patientid، وترتبط وظيفيًا بـ recorddrugs عبر patientid + date |
origin | قائمة ترميز "منشأ/جهة الولادة" المستخدمة في صفوف registeration وتقارير الولادات | id, title, del | تُقرأ من registeration عبر origin |
education | قائمة ترميز المستوى التعليمي (تستخدم للزوجة والزوج معًا) وتُدار من شاشة المريض | id, title, del | patients عبر wifeeducation وhusbandeducation |
bloodtypes | قائمة ترميز فصائل الدم (للزوجة والزوج) | id, title, del | patients عبر wifebl وhusbandbl |
wifejobs | قائمة ترميز وظائف الزوجة، وتدخل في البحث المتقدم | id, title, del | patients عبر wifejob |
husbandjobs | قائمة ترميز وظائف الزوج، وتدخل في البحث المتقدم | id, title, del | patients عبر husbandjob |
wifestatus | قائمة الحالة الاجتماعية للزوجة — القيم المزروعة: آنسة، متزوجة، مطلقة، متزوجة للمرة الثانية، أرملة | id, title, del | patients عبر statuesid |
wifetypes | قائمة ألقاب/تصنيفات الزوجة، وتُطبع كلقب قبل الاسم في الروشتة | id, title, del | patients عبر wiftypeid |
husbandtypes | قائمة ألقاب/تصنيفات الزوج، وتُطبع كلقب قبل الاسم في روشتة الزوج | id, title, del | patients عبر husbandtypeid |
complaint | قائمة الشكاوى الرئيسية المستخدمة في شيتات أمراض النساء والعقم (gyna / gynasheet / infertilitysheet / ancsheet00) | id, name, conditions (علم حذف منطقي) | تُقرأ من شيتات gyna وinfertility (ربط بالقيمة المختارة) |
complaintant | قائمة الشكاوى الخاصة بزيارات متابعة الحمل (antenatal) — نسخة موازية لجدول complaint | id, name, conditions | تُقرأ من antenalvisit وcompletereport |
locations | قائمة أماكن (اسم + حذف منطقي) لا يوجد لها أي استخدام في الكنترولرات الحالية — جدول مهجور (استنتاج) | id, name, deleted | لا توجد علاقات مستخدمة |
patients.php?ac=index؛ يبحث النظام عن مسودة غير معتمدة (done=0) لنفس المستخدم فيستكملها، أو ينشئ سجلًا جديدًا فورًا في قاعدة البيانات برقم ملف تلقائي statusno.updateajax) أثناء الإدخال، وتُملأ القوائم المنسدلة من جداول الترميز (الألقاب، التعليم، الوظائف، الحالة، فصائل الدم) مع إمكانية إضافة قيم جديدة لهذه القوائم من نفس الشاشة.addfinish) يُعتمد السجل (done=1) وتُسجَّل بيانات الزوجة والزوج كاملة وتُشفَّر كلمة مرور المريضة، وإذا طُلبت زيارة تُنشأ في جدول visits (نوع الكشف، نقدي/فيزا، خصم، ترتيب الدخول) داخل معاملة واحدة، ثم يُحوَّل المستخدم لشاشة تاريخ المريضة أو شاشة الاستقبال حسب صلاحيته.curlAddClient/curlUpdateClient) إذا كانت قاعدة ERP معرّفة في الإعدادات.lastvisit، وفي وضع المستشفى يُبحث بالقسم عبر visits.detectionid مع استبعاد من انتهت متابعتهم في endvisitreports._patientdata.php) الذي يفك ترميز القوائم ويحسب الأعمار ومدة الزواج والصيغة التوليدية (P/CS/AB/Ectopic/VM/SVD) من phobstetric + الأرصدة الافتتاحية، ويعرض ملخصات التاريخ الطبي والجراحي والنسائي والعائلي — وينشئ تلقائيًا سجل فحص examination فارغًا إن لم يوجد.record.php) يضيف الطبيب صفوف تشخيص/علاج بالتاريخ، ويكتب روشتات للزوجة أو الزوج من كتالوج الأدوية (recorddrugs/drugs) ويطبعها بلقب واسم المريض من جداول الألقاب.upload/patientfiles/{id} عبر إضافة الرفع المتعدد، وتُعرض وتُحمَّل من نظام الملفات مباشرة.registeration المرتبطة بشيت ancsheet (المكان، المنشأ، النوع، التكلفة) وتُقرأ لاحقًا في تقارير الولادات.endvisitreports، ويمكن حذف المريضة حذفًا منطقيًا (deleted=1) مع حذف العميل المقابل في ERP.visits.patientid → patients.id؛ كما يُنشئ هذا الموديول زيارة الكشف الأولى بقيمها المالية، ويستخدم lastvisit.patientid وendvisitreports.patientid.phmenstrual / phcontraception / phobstetric / phpastmedical / phpastsurgical / phpastgynecological / phpastart / phfamily كلها عبر patientid وتُعرض ملخصاتها في شريط بيانات المريضة.examination.patientid → patients.id — يُنشأ سجل فحص تلقائيًا من _patientdata.php.ancsheet / gynasheet / infertilitysheet / ivfsheet عبر patientid، وجدول registeration.ancsheetid → ancsheet.id يربط التسجيل بمتابعة الحمل، وتقارير الولادات (Deliveries.php) تقرأ registeration + origin.complaint (gyna/infertility) وcomplaintant (antenatal) تُستهلك في antenalvisit.php وgyna.php وتقارير completereport.php.recorddrugs.drugid → drugs.id وrecorddrugs.patientid → patients.id.patients.risktype → risktype.id (كنترولر risktype.php).patients.userid / patients.doctorid → awusers.user_id، والأطباء هم المستخدمون ذوو role_id = 4.gtimage.patientid → patients.id مع تفاصيل التعليقات في gtdetail.gtid.client.obygyPatientId → patients.id في قاعدة بيانات ERP منفصلة، بمزامنة عبر cURL (إضافة/تحديث/حذف عميل + فاتورة كشف).patients هو statusno — أداء البحث بـLIKE '%..%' سيتدهور مع نمو البيانات.patients.php?ac=search يبني الشروط بدمج نصوص مباشرة، و_patientdata.php يُمرر patientid من الـGET مباشرة في الاستعلام.husdandname، wiftypeid، mirragefrom، spacialnotes، registeration، coast (المقصود cost).varchar (مثل wifeeducation، husbandjob، husbandbl) بينما نظيرتها للزوجة int — عدم اتساق في الأنواع، وخلط ترميزات latin1 / utf8mb4 بين الجداول أدى لتلف عرض القيم العربية المزروعة.wifeage) وتاريخ الميلاد يُخزنان معًا، ومدة الزواج تُخزن كنص mirragefrom وكتاريخ محسوب عكسيًا mirragefromdate.MAX(statusno)+1 بدون قفل — احتمال تضارب أرقام عند التسجيل المتزامن.examination عند مجرد العرض (كتابة أثناء القراءة) — مصدر سجلات يتيمة.patients_tmp وlocations بلا أي استخدام، وpatientfiles موجود لكن الملفات تُدار من نظام الملفات مباشرة بمسح المجلد، وpatients_updates (سجل التدقيق) لا يكتب فيه الكود الحالي.complaint وcomplaintant متطابقان بنيويًا (تكرار لنفس المفهوم بسياقين).password_hash (جيد)، لكنها مخزنة داخل جدول البيانات الديموغرافية نفسه.Patient رئيسي (جدول patients) يقتصر على بيانات المريضة، وفصل بيانات الزوج في جدول/موديل Spouse (علاقة 1-1) بدلًا من 20+ عمودًا مزدوجًا في سجل واحد — مع الإبقاء على إمكانية الدمج في واجهة العرض.wifejobs + husbandjobs في جدول job_titles، وwifetypes + husbandtypes في person_titles، والإبقاء على education_levels، blood_types (يفضَّل Enum)، marital_statuses — كلها بمفاتيح أجنبية حقيقية وأعمدة deleted_at (SoftDeletes).complaint + complaintant في جدول واحد complaints بعمود سياق (context: gyna | antenatal | infertility).patients_tmp، locations، والاستغناء عن patientfiles لصالح إدارة مرفقات حقيقية (Spatie MediaLibrary أو جدول patient_attachments مع ترحيل الملفات الموجودة على القرص).patients_updates بحزمة تدقيق قياسية مثل owen-it/laravel-auditing لتسجيل كل تعديلات سجل المريض تلقائيًا.MedicalRecord (جدول records) مرتبطًا بـ Patient وPrescription، وموديل DeliveryRegistration (جدول registeration بعد تصحيح الاسم) بمفتاحين أجنبيين إلى anc_sheets وorigins وتحويل coast إلى cost decimal.foreignId، توحيد التواريخ (إلغاء 0000-00-00 لصالح NULL)، حذف عمود العمر المخزن والاكتفاء بـ Accessor محسوب من تاريخ الميلاد، وتحويل أعمدة الصيغة التوليدية الافتتاحية (pno/ab/ectopic/vmodel/svd/cs) إلى أعداد صحيحة في جدول obstetric_baselines.MAX+1، وجعل الرقم القومي فريدًا مع خدمة تحقق مستقلة لاستخراج تاريخ الميلاد.patient_id).LIKE على أعمدة غير مفهرسة، مع واجهة Angular بنفس معايير البحث الحالية للحفاظ على عادات المستخدمين.