موديول مستقل (تطبيق فرعي board) لإدارة مجلس الأطباء داخل العيادة: يتيح للأطباء رفع طلبات استشارة/مناقشة حالات سريرية إلى المجلس، ثم تنظيم جلسات دورية يحضرها أعضاء المجلس لمناقشة الطلبات المعلّقة، وتسجيل رأي كل عضو (قبول/رفض) على كل طلب، وتدوين القرار النهائي للمجلس، مع إمكانية تأجيل الطلبات لجلسة لاحقة وأرشفة الجلسات والطلبات المنتهية، إضافة إلى نظام تعليقات متداخل (تعليق ورد على تعليق) على كل طلب، وشاشة لتشكيل هيئة المجلس (رئيس، أمين، أعضاء).
status=0) عند فتح الشاشة، مع حفظ تلقائي للعنوان والتفاصيل أثناء الكتابة (AJAX auto-save)، ثم إرساله للمجلس (status=1) بتاريخ اليوم.status=2).status=0) وتُسجّل تلقائيًا قائمة أعضاء المجلس (المستخدمون أصحاب positionid ١ و٢ و٣) كأعضاء للجلسة.bsessionmembers.1) أو رفض (2) في جدول bmemberopenion.decision في brequests).delay=1) أو إلغاء التأجيل.status=1) وتُؤرشف كل الطلبات المناقشة (status=2) مع ربطها برقم الجلسة sessionid، وتُعاد الطلبات المؤجلة إلى قائمة الانتظار — كل ذلك داخل معاملة (Transaction) واحدة.relatedcommentid)، مع إضافة وحذف (حذف التعليق الرئيسي يحذف ردوده).stuff): تعيين رئيس المجلس (status=0) وأمين المجلس (status=1) والأعضاء (status=2) من بين مستخدمي النظام، مع تعديل وحذف.| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
brequests | طلبات عرض الحالات على المجلس؛ دورة الحياة: مسودة (0) ← مُرسل (1) ← مناقَش ومؤرشف (2)، مع علامة تأجيل وقرار نهائي نصي | id, memberid, title, details, status, date, delay, decision, sessionid | awusers عبر memberid، bsession عبر sessionid |
bsession | جلسات المجلس؛ الحالة: مفتوحة (0) أو مغلقة/مؤرشفة (1)، مع تاريخ الإغلاق ومنشئ الجلسة | id, date, status, memberid | awusers عبر memberid (منشئ الجلسة) |
bsessionmembers | سجل حضور أعضاء المجلس في كل جلسة (جدول ربط جلسة × عضو)؛ وجود السجل يعني الحضور وحذفه يعني الغياب | id, sessionid, memberid | bsession عبر sessionid، awusers عبر memberid |
bmemberopenion | رأي كل عضو حاضر على كل طلب داخل الجلسة: قبول (1) أو رفض (2)؛ سجل واحد لكل (طلب × عضو جلسة) يُحدَّث عند تغيير الرأي | id, requestid, sessionmemberid, openion | brequests عبر requestid، bsessionmembers عبر sessionmemberid |
bcomments | تعليقات متداخلة على الطلبات: التعليق الرئيسي له relatedcommentid=0 والردود تشير إلى التعليق الأب | id, memberid, requestid, comment, relatedcommentid | awusers عبر memberid، brequests عبر requestid، bcomments (ذاتية) عبر relatedcommentid |
councilstaff | تشكيل هيئة المجلس: رئيس (0)، أمين (1)، عضو (2) — كل سجل يربط مستخدمًا بدوره في المجلس | id, userid, status | awusers عبر userid |
requests.php)؛ إن وُجدت مسودة طلب سابقة غير مرسلة تُحمَّل، وإلا يُنشأ سجل طلب جديد فارغ باسمه تلقائيًا.update() (AJAX).sendrequest) يتحول الطلب إلى status=1 ويُختم بتاريخ اليوم ويظهر في قائمة الطلبات المعلّقة.addcomment / deletecomment).sessions.php)؛ إن لم توجد جلسة مفتوحة تُنشأ جلسة جديدة ويُسجَّل تلقائيًا كل أعضاء المجلس (مستخدمو positionid 1–3) في bsessionmembers.addsessionmember / removesessionmember).requestDetails)؛ يسجل كل عضو حاضر رأيه قبول/رفض (saveopinion)، ويُدوَّن قرار المجلس النهائي نصيًا (savedecision)، أو يُؤجَّل الطلب لجلسة قادمة (delay).savesession): تُغلق الجلسة بتاريخ اليوم، وتُؤرشف الطلبات المناقشة (status=2) مع ربطها بالجلسة، وتُعاد الطلبات المؤجلة إلى قائمة الانتظار (داخل معاملة واحدة).archiveshowall / sessiondetails / requestDetailsArchive).stuff.php: تعيين الرئيس والأمين والأعضاء في جدول councilstaff.memberid وuserid في الجداول الستة تشير إلى awusers.user_id، وتُجلب أسماء الأطباء منه في كل الشاشات.awusers.positionid بقيم مثبّتة في الكود (1، 2، 3) — ولا يوجد جدول positions في نسخة قاعدة البيانات المفحوصة (استنتاج: قيم وظائف الأطباء الاستشاريين والأخصائيين).patients إطلاقًا؛ بيانات المريض والحالة تُكتب نصًا حرًا في title وdetails فقط — فجوة بيانات جوهرية.stuff.php يحتوي دوال كاملة منسوخة من موديول الصيدلية (updategg، del، delup) تتعامل مع جداول importbill وimportdetails وdrugs وpharmacystore — كود ميت منسوخ بالخطأ ولا علاقة له بالمجلس.councilstaff شبه مهجور وظيفيًا: كنترولر الجلسات علّق الاستعلام عنه واستبدله باستعلام مباشر على awusers.positionid IN (1,2,3) بقيم مثبّتة في الكود، فأصبح تشكيل المجلس المُدار من شاشة stuff غير مؤثر فعليًا في الجلسات.requests.php::update(): تستقبل اسم الجدول واسم العمود والقيمة من POST مباشرة وتكتبها في أي جدول بقاعدة البيانات (Arbitrary table/column write).stuff.php بلا أي تحقق من تسجيل الدخول أو الصلاحيات (فحوصات autho معلّقة)، ويستخدم استعلامات SQL مبنية بدمج النصوص (مثل '... user_id = ' . $userid) — قابلة لحقن SQL.bcomments وbsession وcouncilstaff بترميز latin1 بينما البقية utf8mb4 — خطر تلف للنصوص العربية في التعليقات.created_at في التعليقات والآراء، وتاريخ الطلب/الجلسة يُسجَّل فقط عند الإرسال/الإغلاق.title وdetails في brequests محدودان بـ varchar(191) — التفاصيل السريرية تُبتر عند هذا الحد رغم أن الواجهة تعرضها كمساحة نص كبيرة.try/catch فارغة تبتلع الاستثناءات بصمت في معظم الدوال.BoardRequest وBoardSession وBoardSessionMember وBoardMemberOpinion وBoardComment، مع مفاتيح أجنبية صريحة وقيود ON DELETE مناسبة.patient_id إلزامي في board_requests مرتبط بجدول المرضى الموحد، وربط اختياري بالزيارة/الملف السريري — لمعالجة أكبر فجوة في التصميم الحالي (الحالة نص حر بلا مريض).Enum في Laravel: RequestStatus (draft/submitted/discussed)، SessionStatus (open/closed)، Opinion (accept/refuse)، CouncilRole (head/secretary/member).councilstaff في نظام الأدوار/الصلاحيات بالـ ERP (مثل Spatie Permissions أو جدول board_members بحقل role)، وإلغاء الاعتماد المثبّت على positionid IN (1,2,3) بجعل عضوية المجلس قابلة للإدارة فعليًا.user_id وsession_id بدل المرور عبر sessionmemberid (أو الإبقاء عليه مع قيد فريد على request_id + session_member_id)، مع إضافة طوابع زمنية لكل رأي وتعليق.TEXT، وإضافة created_at/updated_at وsoft deletes لكل الجداول لأغراض التدقيق الطبي.PATCH /board-requests/{id}) مع Validation وFormRequest.stuff.php نهائيًا وعدم ترحيله — وظائفه مكررة في موديول الصيدلية الأصلي.