💊

الصيدلية والأدوية (Pharmacy & Drugs)

تطبيق فرعي مستقل داخل النظام (مجلد pharmacy/) يدير كتالوج الأدوية الموحّد للعيادة (نحو 2,000 صنف دوائي مع التصنيف والشكل الصيدلي والجرعة بالعربية)، ومخزون الصيدلية بنظام دفتر حركات (Ledger) يسجل كل عملية إدخال وصرف، وفواتير الشراء من الموردين، وصرف الروشتات (Receipts) القادمة آليًا من الشيتات الإكلينيكية (متابعة الحمل، النساء، العمليات) — أي أنه حلقة الوصل بين الوصف الطبي داخل العيادة وصرف الدواء الفعلي من المخزن.

8جدول
5كنترولر
9علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
drugsكتالوج الأدوية الرئيسي (~2,000 صنف مزروع مسبقًا) مع رصيد المخزون الجاري لكل صنفid, drugcat, drugname, drugtype, drugdos, initialbalance, currentbalanceيُشار إليه من importdetails.drug_id، pharmacystore.drug_id، receiptdrugs.drugs_id، وجداول الوصفات الإكلينيكية عبر drugid
drugdosجدول مرجعي للجرعات — فارغ وغير مستخدم في أي كود؛ حقل name معرّف خطأً كرقم (int) بدل نص، والجرعات تُخزَّن فعليًا كنص حر في drugs.drugdosid, name, deletedلا توجد (جدول ميت)
pharmacystoreدفتر حركات المخزون: سجل لكل عملية على رصيد دواء (قبل/بعد/الفرق) بطابع زمني ونوع عمليةdrug_id, amountbefore, amountafter, amountvary, opdate, optypedrugs عبر drug_id
recepittmpرأس الروشتة (Receipt header) المُنشأ آليًا من الشيتات الإكلينيكية وينتظر الصرف في الصيدلية؛ status: 0 = معلّقة، 1 = تم الصرفdoctor_id, patient_id, rect_date, drugstablename, statusawusers عبر doctor_id، patients عبر patient_id، ارتباط متعدد الأشكال (Polymorphic) بجدول الوصفة المصدر عبر drugstablename
receiptdrugsبنود الروشتة: دواء وكمية لكل سطر في الروشتة المعلّقةreceipt_id, drugs_id, amountrecepittmp عبر receipt_id، drugs عبر drugs_id، وتُشير إليه جداول الوصفات الإكلينيكية عبر recepitdrugid
importbillرأس فاتورة الشراء من المورد (اسم المورد نص حر بلا جدول موردين)invoicenum, invoicedate, suppliers, receiveuserawusers عبر receiveuser
importdetailsبنود فاتورة الشراء (دواء + كمية)؛ الجدول الوحيد في الموديول الذي يملك فهرسًا على المفتاح الأجنبيbill_id, drug_id, amountimportbill عبر bill_id، drugs عبر drug_id
importtdetailsنسخة مكررة من importdetails (نفس الأعمدة بترميز utf8mb4) — فارغة وغير مستخدمة في أي كنترولر (جدول ميت/مهجور)bill_id, drug_id, amountنفس علاقات importdetails نظريًا (استنتاج)

سير العمل (Workflow)

  1. يُجهَّز كتالوج الأدوية مرة واحدة (بيانات مزروعة ~2,000 صنف) ويُضاف عليه من شاشة الأدوية؛ عند إضافة صنف جديد يُسجَّل رصيد افتتاحي يُنسخ إلى currentbalance.
  2. عند وصول توريد من مورد، يُدخل أمين المخزن فاتورة شراء (buys.php → addnew) داخل معاملة واحدة: سجل في importbill، ثم لكل بند سجل في importdetails + حركة توريد (optype=0) في pharmacystore + تحديث drugs.currentbalance.
  3. في العيادة، عند حفظ وصفة في كارت المتابعة أو تفاصيل العمليات (كنترولرات النواة followupcard.php / operativedetails.php) يُنشأ آليًا رأس روشتة في recepittmp بحالة 0 مع اسم جدول الوصفة المصدر، وتُنسخ الأدوية إلى receiptdrugs بكمية افتراضية 1، ويُحفظ رقما الروشتة والبند (recepittmpid / recepitdrugid) داخل سجل الوصفة الإكلينيكية نفسه.
  4. يفتح موظف الصيدلية شاشة الروشتات (receipt.php) فيرى الطابور باسم الطبيب والمريضة، ويدخل على التفاصيل حيث يُحذَّر تلقائيًا إن كان رصيد أي صنف أقل من الكمية المطلوبة.
  5. عند تأكيد الصرف (updatereceipt) تُسجَّل لكل صنف حركة صرف (optype=1) في pharmacystore ويُخصم من drugs.currentbalance — مع تخطّي الأصناف التي لا يكفي رصيدها — ثم تتحول حالة الروشتة إلى 1 (تم الصرف).
  6. تعديل فاتورة شراء (update) يعكس الكميات القديمة ويسجل حركات تصحيح (optype=2)؛ وحذف الفاتورة (del) يخصم الكميات ويسجل حركات (optype=3).
  7. تقرير المخزن (store.php → show) يعرض دفتر الحركات كاملًا باسم الدواء ونوع العملية والتاريخ كسجل تدقيق للمخزون.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP