يُعد هذا الموديول العمود الفقري التشغيلي للعيادة؛ فهو يدير حجز الزيارات من الاستقبال ومن تطبيق الموبايل، وتنظيم طابور الانتظار اليومي للطبيب، وتقسيم اليوم إلى فترات زمنية بسعة محددة، كما يسجل في الجدول ذاته الحركة المالية للزيارة (قيمة الكشف نقدًا/فيزا، الخصم، المتبقي، سداد المتبقي، المرتجعات، الأقساط)، ويوجّه الطبيب تلقائيًا إلى آخر شيت إكلينيكي فتحه للمريضة، وينتهي بتقرير إنهاء العلاج.
detections) وتحديد القيمة نقدًا/فيزا والخصم والمتبقي كدين على المريضة.mobileservices.php مع حد أقصى مُثبّت بالكود (10 زيارات تطبيق يوميًا) ومنع تكرار حجز نفس المريضة في نفس اليوم.visit_periods) باسم الفترة وتوقيتها وحد أقصى لعدد المرضى لكل فترة، مع التحقق من السعة قبل الحجز (patPerPeriod).view=0) عن الداخلين (view=1)، ووضع "عيادة" يعرض زيارات اليوم مرتبة بترتيب الطابور والوقت التقريبي، مع إعادة ترتيب الطابور بالسحب (sortable).addshours في programesetting).urgent=1) مع إمكانية ترحيلها إلى اليوم أو إلغائها.detectionid=999)، مرتجع عملاء (detectionid=9999)، دفع قسط من رصيد المريضة (detectionid=-99) المرتبط بجدول totalbalance.lastvisit.newvisit) بتاريخ آخر دورة ووزن الجسم وحالة الرحم والمبايض والعلاج.endvisitreports) بالسبب والتاريخ والطبيب، مع إمكانية الإغلاق الجماعي لقسم كامل.statusno).| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
visits | الجدول المركزي: الزيارة/الموعد + الحركة المالية المرتبطة بها (كشف، سداد متبقٍ، مرتجع، قسط) | patientid, visitdate, visittime, detectionid, totaldetectionvalue, discount, detectionvalue_cash, detectionvalue_visa, restdetectionvalue, visitorder, enterordered, view, visit_period, urgent, payedflag, mobileappvisit, approx_time, visitid, user_id, end, enddate, branch_id | patients عبر patientid، detections عبر detectionid، visit_periods عبر visit_period، awusers عبر user_id وenddoctorid، الزيارة الأصلية ذاتيًا عبر visitid |
visits_updates | نسخة ظل من جدول الزيارات بحقول تدقيق إضافية لتتبع التعديلات (غير مستخدم في أي كود تم العثور عليه — مهجور أو محجوز) (استنتاج) | نفس حقول visits + userid_edit, date_edit, patientid_edit, clinic_id | patients عبر patientid، awusers عبر userid_edit (استنتاج) |
visit_periods | تعريف فترات اليوم (صباحية/مسائية...) بسعة قصوى لكل فترة | name, timing, max_no, deleted | visits عبر visit_period |
newvisit | زيارات المتابعة الإكلينيكية داخل شيت العقم (تاريخ، آخر دورة، وزن، رحم، مبايض، علاج) | infertilitysheetid, newvisitcycles, date, lmp, bw, ut, ov, ttt | infertilitysheet عبر infertilitysheetid، newvisitcycles عبر newvisitcycles |
newvisitcycles | قاموس أنواع الدورات/السيكلات لزيارات متابعة العقم (لا توجد بيانات مزروعة في النسخة الاحتياطية) | title, del | newvisit عبر newvisitcycles، وكذلك newvisitg في شيت النساء |
lastvisit | مؤشر لكل مريضة يخزن اسم آخر كنترولر شيت إكلينيكي فُتح لها، لتوجيه الطبيب من الطابور مباشرة إلى الشيت الصحيح | patientid, control | patients عبر patientid؛ قيمة control تشير إلى كنترولر (antenalvisit / ancsheet / gynasheet / iui / infertilitysheet) |
old_visits | أرشيف للبنية القديمة لجدول الزيارات (قيمة كشف واحدة قبل فصل النقدي/الفيزا)، استُخدم مرة واحدة في سكربت ترحيل fixOldVisits() | patientid, visitdate, detectionid, detectionvalue, visitorder, enterordered, end, enddate | patients عبر patientid، detections عبر detectionid، يطابق visits.id بنفس id (استنتاج من سكربت الترحيل) |
endvisitreports | تقرير إنهاء فترة العلاج للمريضة (السبب، التاريخ، الملاحظات، الطبيب) | patientid, reason, enddate, notes, doctorid, status | patients عبر patientid، awusers عبر doctorid |
vacations | أيام إجازات العيادة بتاريخ وسبب وحقول تدقيق بنمط Laravel (غير مستخدم في أي كود تم العثور عليه) (استنتاج) | vacation_date, vacation_reason, created_at, updated_at, created_by, updated_by | awusers عبر created_by وupdated_by (استنتاج) |
statusno) أو بالاسم (بحث تلقائي بالإكمال)، ثم يفتح شاشة إضافة زيارة (visits.php?ac=index).detections (الذي يحمل السعر)، ويحدد التاريخ والفترة الزمنية والقيمة المدفوعة نقدًا/فيزا والخصم والمتبقي والملاحظات والوقت التقريبي، ثم تُحفظ الزيارة بـ payedflag=1 ويُحتسب ترتيب الدخول enterordered تلقائيًا.programesetting.visit_period=1) يتحقق النظام من عدد المحجوزين في الفترة مقابل max_no قبل الحجز.mobileservices.php?ac=addVisit) فتُسجَّل الزيارة بـ mobileappvisit=1 وpayedflag=0، وعند الحضور والدفع يستدعي الاستقبال payvisit فيتحول العلم إلى مدفوع وتُنشأ فاتورة بيع في الـ ERP الخارجي.sellbillController.php?do=addObgyVisit) لإنشاء فاتورة بيع مرتبطة بالزيارة، ويُحدَّث/يُحذف معها عند تعديل أو حذف الزيارة.index.php) كطابور انتظار؛ في وضع المستشفى ينقسم الطابور إلى منتظرين وداخلين، ويضغط المستخدم "دخول" فتُعلَّم الزيارة view=1 وتنتقل لقائمة الداخلين، مع إمكانية إعادة الترتيب بالسحب.lastvisit لمعرفة آخر شيت فُتح للمريضة (متابعة حمل/نساء/عقم/حقن مجهري) فيوجهها مباشرة، ويُحدَّث هذا السجل تلقائيًا عند فتح أي شيت.newvisit) عبر حفظ خلوي فوري بالأجاكس، مع اختيار نوع السيكل من قاموس newvisitcycles.visits مرتبطة بالزيارة الأصلية عبر visitid: سداد متبقٍ (detectionid=999) أو مرتجع (detectionid=9999) بعد التحقق من أن المرتجع لا يتجاوز المدفوع، أو دفع قسط (detectionid=-99) يخصم من رصيد totalbalance.endvisitreports) بالسبب والتاريخ واسم الطبيب من شاشة المريضة، أو إغلاق جماعي لكل مرضى قسم معين عبر emptydeptvisit.urgent=1) تظهر في قائمة الانتظار (waitingList) ليُقرَّر ترحيلها إلى اليوم أو إلغاؤها.visits.patientid وlastvisit.patientid وendvisitreports.patientid → patients.id، والبحث برقم الملف patients.statusno.visits.detectionid → detections.id (الاسم والسعر detectionval)، وتُدار شاشات إضافته من نفس كنترولر الزيارات.newvisit.infertilitysheetid → infertilitysheet.id، وقيمة lastvisit.control تشير إلى كنترولرات الشيتات (antenalvisit، ancsheet، gynasheet، iui، infertilitysheet).newvisit.newvisitcycles وnewvisitg.newvisitcycles (شيت النساء) → newvisitcycles.id.visits.user_id وendvisitreports.doctorid → awusers.user_id، وأزرار التعديل/الحذف محكومة بجدول awrolebtn.detectionid=-99 تُخصم من جدول totalbalance عبر patientid.programesetting يتحكم في وضع العرض (visitsform مستشفى/عيادة)، وتفعيل الفترات (visit_period)، والساعات الإضافية (addshours)، واسم قاعدة الـ ERP (erpdb).sellbill.obygyVisitId → visits.id، وproduct.obygyDetectionId → detections.id، وclient.obygyPatientId → patients.id عبر استدعاءات cURL.mobileservices.php مع العلم mobileappvisit.visits يخلط بين مفهومين: الموعد/الزيارة والمعاملة المالية (إيصال)، باستخدام قيم سحرية في detectionid (-99 قسط، 999 سداد متبقٍ، 9999 مرتجع) وربط ذاتي عبر visitid — منطق مُثبّت بالكود يصعب صيانته.visits_updates وvacations غير مستخدمين في أي كنترولر أو واجهة تم فحصها (موجودان في المخطط فقط) — على الأرجح بقايا تطوير غير مكتمل (استنتاج).old_visits جدول ترحيل قديم، وسكربت fixOldVisits() الخاص بترحيله ما زال موجودًا في كود الإنتاج ويمكن استدعاؤه من المتصفح.search, getnames, emptydeptvisit) تبني الاستعلامات بدمج نصي مباشر لمدخلات المستخدم.updateAjax, addNewRow, editselect) تستقبل اسم الجدول والعمود من العميل مباشرة — مخاطرة أمنية وبنيوية كبيرة.newvisit كلها نصوص varchar(191) حتى التواريخ والأوزان؛ ولا توجد بيانات مزروعة لقواميس visit_periods وnewvisitcycles في النسخة الاحتياطية.deleted في الزيارات مقابل del في القواميس)، مع وجود حذف فعلي في دالة delv.visitorder, visit_order, enterordered) داخل نفس الجدول.visits إلى ثلاثة نماذج Laravel: Appointment (الحجز: المريضة، الخدمة، التاريخ، الفترة، الحالة، المصدر، عاجل)، وEncounter (الدخول الفعلي وترتيب الطابور)، وPaymentTransaction (نوع المعاملة كـ enum: كشف/سداد متبقٍ/مرتجع/قسط بدلًا من القيم السحرية، مع appointment_id بدل الربط الذاتي visitid).VisitPeriod (أو AppointmentSlot) من جدول visit_periods مع قيد سعة max_no يُفحص بمعاملة قاعدة بيانات، وربطه بنموذج ClinicClosure المبني على جدول vacations لمنع الحجز في الإجازات.lastvisit بمنطق اشتقاقي (آخر شيت إكلينيكي بحسب تاريخ الإنشاء) أو عمود last_sheet_type على المريضة — لا حاجة لجدول مستقل.newvisit وnewvisitcycles إلى موديول العقم الإكلينيكي كنموذجي InfertilityFollowUp وCycleType، مع تحويل الحقول النصية إلى أنواع صحيحة (تاريخ، رقم عشري) وتوحيد القاموس المشترك مع شيت النساء.endvisitreports إلى نموذج TreatmentClosure مرتبط بالمريضة والطبيب، أو دمجه كحالة (status) على مفهوم "حلقة علاجية" (Episode of Care) إن اعتُمد.old_visits وvisits_updates بعد أرشفة بياناتهما، والاستعاضة عن التدقيق بحزمة Laravel Auditing أو جدول activity_log موحد.SoftDeletes، ونقل الإعدادات المثبتة بالكود (حد الموبايل، الساعات الإضافية) إلى جدول إعدادات.mobileservices.php المفتوح بلا تحقق من الهوية.