← العودة لبوابة الصيدلية

DEV PREVIEW — fm461

🧭 المفقود في المنظومة

قائمة عملية بما لم يكتمل بعد لكي ننتقل من "صيدلية واحدة" إلى منصّة متعددة الصيدليات. هذه الصفحة للتطوير فقط، وسيُعاد توزيع محتواها على لوحات المالك/المنصّة عند الإطلاق.

جاهز تم تنفيذه ويعمل جزئي موجود لكن يحتاج توسعة ناقص لم يبدأ بعد

1. الوضع الحالي (Single-Pharmacy)

2. الفجوات (Gaps to Multi-Pharmacy)

أ. لوحة مالك المنصّة ناقص

ب. لوحة مالك الصيدلية جزئي

ج. إدارة السائقين ناقص

د. توزيع الطلبات على السائق ناقص

هـ. بوابة السائق جزئي

و. نموذج الصلاحيات جزئي

ز. نموذج البيانات ناقص

ح. الأمان وعزل البيانات ناقص

3. مجموعات Firestore المقترحة

platform/
  pharmacies/{pharmacyId}                     ← السجل الرئيسي للصيدلية
    name, brandLogo, sfdaLicenseNumber, address,
    status: 'trial'|'active'|'suspended'|'cancelled',
    subscription: { plan, renewsAt, billingEmail },
    ownerUid, createdAt, createdBy, settings.{...}
  pharmacy_users/{uid}                        ← ربط مستخدم بصيدلية + دور
    pharmacyId, role, email, displayName, status,
    grantedAt, grantedBy
  pharmacy_invites/{inviteId}                 ← دعوات قيد القبول
    pharmacyId, email, role, token, expiresAt
  platform_admins/{uid}                       ← Platform Owner allowlist
    email, addedAt

per-pharmacy collections (every doc carries pharmacyId at top level):
  pharmacy_warehouse_products/{sku}           ← pharmacyId
  pharmacy_warehouse_batches/{batchId}        ← pharmacyId
  pharmacy_orders/{orderId}                   ← pharmacyId
  pharmacy_drivers/{driverId}                 ← pharmacyId
  pharmacy_delivery_zones/{zoneId}            ← pharmacyId
  pharmacy_payment_configs/{pharmacyId}       ← single doc per pharmacy
  pharmacy_storefront_settings/{pharmacyId}   ← single doc per pharmacy
  pharmacy_audit_log/{eventId}                ← pharmacyId

4. مصفوفة الأدوار

الدور إنشاء صيدلية إدارة موظفي صيدلية تعديل المنتجات/الدفعات اعتماد للسوق إسناد سائق عرض طلبات السائق نفسه الوصول لصيدليات أخرى
platform_owner✓ (دعم)✓ (دعم)✓ (دعم)✓ كل الصيدليات
pharmacy_owner✓ صيدليته فقط
pharmacy_managerقراءة فقط
pharmacist✓ (سعر/كمية)
warehouse✓ (دفعات)
cashier
driver✓ المسنَدة فقط

5. واجهات API المقترحة

Platform owner

Pharmacy owner

Driver

Order ↔ driver

6. صفحات الواجهة المقترحة

7. خطة الترحيل من النظام الحالي

  1. إنشاء أول صيدلية (PHM-MAKKAH-01) كمستند في platform/pharmacies بنفس البيانات الحالية.
  2. سكربت ترحيل: إضافة حقل pharmacyId='PHM-MAKKAH-01' لكل مستند موجود في:
    • pharmacy_warehouse_products, pharmacy_warehouse_batches, pharmacy_orders, pharmacy_audit_log.
    • كل سجلات Storage تحت مسار pharmacy/warehouse-images/... تظل كما هي (يضاف pharmacyId ضمن metadata).
  3. تفعيل middleware يضيف req.access.pharmacyId من pharmacy_users/{uid} أو من claim مخصّص.
  4. تعديل كل endpoint موجود: قبل الكتابة/القراءة يفلتر where('pharmacyId', '==', req.access.pharmacyId). Platform owner يتجاوز الفلتر.
  5. إضافة مجموعات جديدة: pharmacy_users, pharmacy_drivers, pharmacy_delivery_zones, pharmacy_payment_configs, pharmacy_storefront_settings, platform_admins.
  6. إطلاق Platform Dashboard ودعوة أول صيدليتين تجريبيتين.
  7. تنظيف: إزالة الإعدادات العامّة (مثل sales-frozen العامّ) وتحويلها لكل صيدلية.

8. مراحل التنفيذ

المرحلة A — Backbone (أسبوع 1-2)
  • إنشاء platform/pharmacies + pharmacy_users.
  • middleware requirePharmacyContext().
  • سكربت ترحيل البيانات الحالية إلى pharmacyId='PHM-MAKKAH-01'.
  • دور platform_owner.
المرحلة B — Owner Console (أسبوع 3-4)
  • صفحة /v2/platform/pharmacies.html.
  • صفحة /v2/pharmacy/staff.html ودعوات الموظفين بالإيميل.
  • إعدادات per-pharmacy: payment-config + storefront-settings.
المرحلة C — Drivers (أسبوع 5-6)
  • مجموعة pharmacy_drivers + صفحة إدارة.
  • زر "إسناد لسائق" في طلبات المخزن + قنوات (portal/whatsapp/copy).
  • تطوير driver.html: فلتر driverId + شاشة الحالة.
المرحلة D — Polish + Security (أسبوع 7)
  • قواعد Firestore تتحقق من pharmacyId على كل مستند.
  • اختبار الإختراق المتقاطع (cross-tenant isolation tests).
  • إعادة إخفاء أيقونة "المفقود في المنظومة" خلف صلاحية platform_owner فقط أو إزالتها.

9. ملاحظات تنفيذ مهمة

DEV PREVIEW · fm461 · سيتم تعديل/إزالة هذه الصفحة بعد اكتمال المرحلة D.