تطبيق فرعي مستقل داخل النظام (مجلد pharmacy/) يدير كتالوج الأدوية الموحّد للعيادة (نحو 2,000 صنف دوائي مع التصنيف والشكل الصيدلي والجرعة بالعربية)، ومخزون الصيدلية بنظام دفتر حركات (Ledger) يسجل كل عملية إدخال وصرف، وفواتير الشراء من الموردين، وصرف الروشتات (Receipts) القادمة آليًا من الشيتات الإكلينيكية (متابعة الحمل، النساء، العمليات) — أي أنه حلقة الوصل بين الوصف الطبي داخل العيادة وصرف الدواء الفعلي من المخزن.
drugs.php): إضافة/تعديل/حذف صنف دوائي بحقول التصنيف العلاجي (drugcat) والاسم التجاري والشكل الصيدلي (Tab/Syrup/Amp...) ونص الجرعة بالعربية، مع جدول عرض DataTables وبحث تكميلي (Autocomplete) لكل حقل على حدة.buys.php): رقم الفاتورة، التاريخ، اسم المورد (نص حر)، المستخدم المستلم، وبنود الفاتورة (دواء + كمية) — مع زيادة رصيد المخزون آليًا داخل معاملة (Transaction).store.php): تقرير زمني لكل حركة دواء (الرصيد قبل/بعد/الفرق) مع نوع العملية: 0 = توريد، 1 = صرف، 2 = تعديل فاتورة، 3 = حذف/تصحيح.receipt.php): عرض الروشتات المعلّقة القادمة من الشيتات الإكلينيكية باسم الطبيب والمريضة، وعرض تفاصيل الأدوية مع تحذير إذا كان الرصيد الحالي أقل من المطلوب، ثم تأكيد الصرف بخصم الكميات من المخزون وتغيير حالة الروشتة.followupcard.php وoperativedetails.php في النواة تُنشئ سجل recepittmp وبنوده في receiptdrugs عند حفظ الوصفة الطبية، فتظهر فورًا في طابور الصيدلية.stuff.php): وظيفة جانبية تدير جدول councilstaff، مع نسخة مكررة بالكامل من دوال تعديل وحذف الفواتير الموجودة في buys.php.| الجدول | الغرض | أهم الحقول | العلاقات |
|---|---|---|---|
drugs | كتالوج الأدوية الرئيسي (~2,000 صنف مزروع مسبقًا) مع رصيد المخزون الجاري لكل صنف | id, drugcat, drugname, drugtype, drugdos, initialbalance, currentbalance | يُشار إليه من importdetails.drug_id، pharmacystore.drug_id، receiptdrugs.drugs_id، وجداول الوصفات الإكلينيكية عبر drugid |
drugdos | جدول مرجعي للجرعات — فارغ وغير مستخدم في أي كود؛ حقل name معرّف خطأً كرقم (int) بدل نص، والجرعات تُخزَّن فعليًا كنص حر في drugs.drugdos | id, name, deleted | لا توجد (جدول ميت) |
pharmacystore | دفتر حركات المخزون: سجل لكل عملية على رصيد دواء (قبل/بعد/الفرق) بطابع زمني ونوع عملية | drug_id, amountbefore, amountafter, amountvary, opdate, optype | drugs عبر drug_id |
recepittmp | رأس الروشتة (Receipt header) المُنشأ آليًا من الشيتات الإكلينيكية وينتظر الصرف في الصيدلية؛ status: 0 = معلّقة، 1 = تم الصرف | doctor_id, patient_id, rect_date, drugstablename, status | awusers عبر doctor_id، patients عبر patient_id، ارتباط متعدد الأشكال (Polymorphic) بجدول الوصفة المصدر عبر drugstablename |
receiptdrugs | بنود الروشتة: دواء وكمية لكل سطر في الروشتة المعلّقة | receipt_id, drugs_id, amount | recepittmp عبر receipt_id، drugs عبر drugs_id، وتُشير إليه جداول الوصفات الإكلينيكية عبر recepitdrugid |
importbill | رأس فاتورة الشراء من المورد (اسم المورد نص حر بلا جدول موردين) | invoicenum, invoicedate, suppliers, receiveuser | awusers عبر receiveuser |
importdetails | بنود فاتورة الشراء (دواء + كمية)؛ الجدول الوحيد في الموديول الذي يملك فهرسًا على المفتاح الأجنبي | bill_id, drug_id, amount | importbill عبر bill_id، drugs عبر drug_id |
importtdetails | نسخة مكررة من importdetails (نفس الأعمدة بترميز utf8mb4) — فارغة وغير مستخدمة في أي كنترولر (جدول ميت/مهجور) | bill_id, drug_id, amount | نفس علاقات importdetails نظريًا (استنتاج) |
currentbalance.buys.php → addnew) داخل معاملة واحدة: سجل في importbill، ثم لكل بند سجل في importdetails + حركة توريد (optype=0) في pharmacystore + تحديث drugs.currentbalance.followupcard.php / operativedetails.php) يُنشأ آليًا رأس روشتة في recepittmp بحالة 0 مع اسم جدول الوصفة المصدر، وتُنسخ الأدوية إلى receiptdrugs بكمية افتراضية 1، ويُحفظ رقما الروشتة والبند (recepittmpid / recepitdrugid) داخل سجل الوصفة الإكلينيكية نفسه.receipt.php) فيرى الطابور باسم الطبيب والمريضة، ويدخل على التفاصيل حيث يُحذَّر تلقائيًا إن كان رصيد أي صنف أقل من الكمية المطلوبة.updatereceipt) تُسجَّل لكل صنف حركة صرف (optype=1) في pharmacystore ويُخصم من drugs.currentbalance — مع تخطّي الأصناف التي لا يكفي رصيدها — ثم تتحول حالة الروشتة إلى 1 (تم الصرف).update) يعكس الكميات القديمة ويسجل حركات تصحيح (optype=2)؛ وحذف الفاتورة (del) يخصم الكميات ويسجل حركات (optype=3).store.php → show) يعرض دفتر الحركات كاملًا باسم الدواء ونوع العملية والتاريخ كسجل تدقيق للمخزون.recepittmp.patient_id → patients.id (اسم المريضة من wifename).recepittmp.doctor_id → awusers.user_id وimportbill.receiveuser → awusers.user_id، مع نظام صلاحيات autho المشترك مع تطبيق النواة.followupcarddrugs, operativedetailsdrugs, ancsheetdrugs, gynadrugs, gynasheetdrugs, mainantenentaldrugs, infertilitydrugs وغيرها تحمل أعمدة drugid → drugs.id وrecepittmpid → recepittmp.id وrecepitdrugid → receiptdrugs.id.recepittmp.drugstablename يخزن اسم جدول الوصفة المصدر كنص (مثل followupcarddrugs أو operativedetailsdrugs).visits وdetections (استخدام غير مباشر).stuff.php يكتب في جدول councilstaff (خارج جداول هذا الموديول).drugdos (فارغ، حقل name من نوع int خطأً، لا يُستخدم في أي كود) وimporttdetails (نسخة مكررة فارغة من importdetails بلا أي مرجع في الكود).drugs.php → show(): قيمة البحث sSearch تُدمج في الاستعلام مباشرة بلا Prepared Statement.receipt.php → update(): نقطة نهاية عامة تستقبل اسم الجدول والعمود والقيمة من المستخدم وتكتب في أي جدول بقاعدة البيانات.update/del/delup منسوخة حرفيًا بين buys.php وstuff.php، وكنترولر receipt.php يكرر نفس المنطق في index() وshow().optype "0 للحذف و1 للتعديل" بينما الاستخدام الفعلي: 0 توريد، 1 صرف، 2 تعديل، 3 حذف — قيم مُدمجة في الكود (Hardcoded) بلا جدول مرجعي.buys.php → update() هشّ وبه شروط يصعب تتبعها (مقارنة billIDn بـ drug_id).importbill.suppliers نص حر، ولا أسعار شراء أو بيع ولا تواريخ صلاحية أو أرقام تشغيلات (Batches) في المخزون.drugs نصوص حرة غير منضبطة (تكرارات مثل Anti-viruis\r\n).Drug (مع فصل التصنيف إلى DrugCategory والشكل الصيدلي إلى DosageForm كجداول مرجعية بدل النص الحر)، وStockMovement بدل pharmacystore مع Enum لنوع الحركة، وPurchaseInvoice + PurchaseInvoiceItem بدل importbill/importdetails، وPrescription + PrescriptionItem بدل recepittmp/receiptdrugs.drugdos وimporttdetails نهائيًا من خطة الترحيل.suppliers مستقل وربط فواتير الشراء به بمفتاح أجنبي بدل النص الحر، وإضافة حقول الأسعار وتواريخ الصلاحية وأرقام التشغيلات إن أرادت الإدارة إدارة مخزون حقيقية.currentbalance كحقل يُحدَّث يدويًا، وجعله محسوبًا من دفتر الحركات (أو تحديثه عبر Observers/Events داخل معاملات قاعدة بيانات) مع قيد يمنع الرصيد السالب.drugstablename + أعمدة recepittmpid/recepitdrugid المبعثرة في 8+ جداول وصفات) بعلاقة Polymorphic قياسية في Laravel (prescribable_type/prescribable_id) أو بتوحيد جداول الوصفات الإكلينيكية كلها في جدول prescription_items واحد مرتبط بنوع الشيت.\r\n والمسافات الزائدة، وفرض Unique على (الاسم + الشكل الصيدلي).receipt.php → update()، مع نقل صلاحيات الصيدلية إلى Policies/Gates.