كل المشاريع/DDF — DOCTOR DIET FAMILY

نظرة عامة

DDF (Doctor Diet Family) منصّة SaaS صحية متكاملة تربط العائلات بأطباء تغذية مؤهّلين لرعاية غذائية مستمرة قائمة على الاشتراك. يدير ربّ الأسرة حسابًا واحدًا لكامل أفراد المنزل — لنفسه وللأفراد التابعين — فيكتشف الأطباء، ويشترك في الخطط، ويمنح كل فرد خططه الغذائية الخاصة ومحادثته واستشاراته المرئية. ويُقدَّم المنتج بثلاث واجهات عميل تستند إلى واجهة برمجة واحدة: تطبيق ويب مبني على React (يستضيف كذلك لوحة الإدارة) وتطبيقَي Flutter للجوال، أحدهما للمرضى والآخر للأطباء، منشورَين على iOS وAndroid.

جولة توضيحية

جولة قصيرة في DDF — Doctor Diet Family.

التحدي

الرعاية الغذائية المستمرة عملية متعدّدة الأطراف وذات حالة متغيّرة بطبيعتها: فالطبيب يُعِدّ قوالب وجبات قابلة لإعادة الاستخدام، ويُسنِدها إلى مرضى بعينهم، ويتابع مدى الالتزام عبر الوقت؛ والمرضى يسجّلون وجباتهم وترطيبهم وحالتهم الصحية يوميًا؛ والطرفان يتراسلان ويجريان مكالمات فيديو؛ والأموال تتدفّق داخلًا من العائلات وخارجًا إلى الأطباء — كل ذلك ضمن حصص صارمة وخصوصية للبيانات الطبية. وكانت المشكلة الهندسية هي نمذجة دورة الحياة هذه بدقّة على الويب والجوال، مع إبقاء المدفوعات آمنة عند التكرار، والمعلومات الصحية المحمية (PHI) خاصة، والمحادثة الفورية والمكالمات موثوقة، والنظام بأكمله قادرًا على خدمة بضعة آلاف من المستخدمين على بنية تحتية مُدارة متواضعة. كما كان عليه أن يحاسب العملاء بعملتهم دون وضع استدعاءات بطيئة لأطراف خارجية على مسار إتمام الدفع.

تصميم النظام

كيف يعمل

01/04
01

الاشتراك والدفع

يشترك ربّ الأسرة في خطة طبيب عبر Stripe Checkout، بتأكيد دفع متلاقٍ وآمن عند التكرار، ويبقى التفعيل رهن موافقة الطبيب.

  1. 1يستدعي ربّ الأسرة POST /subscriptions/create/؛ وتتحقّق سلسلة من الحُرّاس من الخطة واكتمال الملف الشخصي وحدّ الأطباء الثلاثة، ثم تُسعَّر الخطة على الخادم بالعملة المكتشفة للمستخدم
  2. 2يفتح النظام الخلفي جلسة Stripe Checkout مع ربط معرّف الاشتراك بوصفه client_reference_id وبيانات وصفية على مستوى الجلسة وعلى مستوى payment-intent، ويعيد رابط الدفع
  3. 3يتأكّد الدفع عبر ثلاثة مسارات متلاقية — webhook موقّع، واستطلاع حالة مُوثَّق، وتأكيد غير مُوثَّق — تصبّ جميعها في مُفعِّل واحد آمن عند التكرار يحرسه سجلّ ProcessedStripeEvent العام
  4. 4يبدأ الاشتراك الجديد بحالة PENDING (المبلغ محجوز وقابل للاسترداد) ويُخطر الطبيب ليقبل أو يرفض
  5. 5عند القبول تُنشأ متتبّعات حصص الرسائل ومكالمات الفيديو لكل فرد ويصبح الاشتراك ACTIVE؛ وعند الرفض يُصدر Stripe استردادًا تلقائيًا
02

الاستشارات المرئية

تجري المكالمات الفورية والمجدولة في غرفة Jitsi/WebRTC مشتركة، مع إشارات عبر WebSocket وتطبيق صارم للحصص.

  1. 1يبدأ المتصل مكالمة «رنين» فورية (POST /start-now/) أو يحجز موعدًا مجدولًا (POST /book/)، فيُتحقَّق من حصة المكالمات وتُخصم تحت قفل على مستوى الصف
  2. 2تُنشأ غرفة Jitsi جديدة ويُرسَل إشعار INCOMING_CALL أو CALL_BOOKED؛ ويستطلع الطرف المستقبِل مسار /incoming/ ثم يردّ أو يرفض
  3. 3يفتح الطرفان غرفة Jitsi المشتركة؛ ويتحقّق مستهلك WebSocket باسم VideoCallConsumer من المشاركين وينقل رسائل offer/answer/ICE الخاصة بـ WebRTC
  4. 4تنتهي المكالمة إلى حالة COMPLETED بشكل آمن عند التكرار، بينما ينتهي الرنين دون ردّ بعد 60 ثانية تلقائيًا إلى MISSED مع إعادة الحصة
  5. 5ويمكن للأطباء كذلك إجراء مكالمات تقييم سريري معفاة من الحصص، مع تسجيل نتائج مُهيكلة لكل منطقة من الجسم ضمن الجلسة
03

دورة حياة الخطة الغذائية

يبني الطبيب قوالب قابلة لإعادة الاستخدام، ويُسنِدها كنسخ ثابتة، ويتابع التزام المريض عبر الوقت.

  1. 1يبني الطبيب قالب DietPlanTemplate قابلًا لإعادة الاستخدام من قاعدة بيانات الأغذية التي تديرها الإدارة، بشرط عنصر واحد على الأقل
  2. 2يؤدّي إسناد القالب إلى أخذ نسخة ثابتة من عناصره في خطة جديدة، فلا تتسرّب تعديلات القالب اللاحقة إلى الخطط المُسنَدة، وتُعطَّل أي خطة نشطة سابقة أولًا
  3. 3يسجّل المريض يوميًا تتبّع الوجبات والترطيب والحالة الصحية — وتتطلّب الوجبات المتروكة أو الجزئية ذكر السبب — ويُحدَّث السجلّ أو يُنشأ لكل يوم
  4. 4يحسب النظام الخلفي مدى الالتزام (نسبة الإنجاز، وأهداف الترطيب، وآخر نشاط) ويرفع رايات استثناء مثل LOW_MEAL_ADHERENCE أو MEAL_LOG_STALE
  5. 5ترسل مهمة Celery beat إشعار FCM يوميًا للتذكير بالخطة الغذائية إلى كل مريض لديه خطة نشطة
04

أرباح الأطباء والتسويات

تُقيَّد الاشتراكات المقبولة في سجلّ محفظة الطبيب، وتُحجز الأموال، ثم تُسوَّى إلى حسابه المصرفي عبر تسويات تُنفَّذ بإشراف الإدارة.

  1. 1عند قبول الاشتراك أو التفعيل التلقائي للتجديد، تُقيَّد في DoctorWallet حصة الطبيب القابلة للضبط (75% افتراضيًا) من إجمالي المبلغ عبر كتابة آمنة عند التكرار في السجلّ، بعد توحيدها إلى PKR
  2. 2يُحجز كل مبلغ مُكتسَب (72 ساعة افتراضيًا) بحالة PENDING؛ وتنقل مهمة Celery المبالغ المحجوزة عند استحقاقها إلى AVAILABLE
  3. 3يحجز المشرف الرصيد المتاح للطبيب ضمن Payout، مع أخذ نسخة ثابتة من بياناته المصرفية
  4. 4ويؤشّر المشرف على التسوية بأنها مدفوعة مع مرجع مصرفي، أو يلغيها فتعود الأموال إلى المحفظة، عبر مزوّد قابل للاستبدال (Stripe يدويًا حاليًا، وواجهة برمجة بنك محلي مُهيّأة كهيكل للمستقبل)

أبرز الميزات

  • اكتشاف الأطباء وتسجيلهم الذاتي، وموافقة الإدارة أو رفضها أو تعليق الحساب مع سجلّ تدقيق
  • خطط اشتراك بحصص رسائل ومكالمات فيديو لكل فرد، وحدّ أقصى بثلاثة أطباء لكل عائلة، وتذكيرات بقرب انتهاء الاشتراك
  • Stripe Checkout بتسعير متعدّد العملات على الخادم، وتفعيل آمن عند التكرار، واسترداد تلقائي للمبلغ عند رفض الطبيب
  • قوالب خطط غذائية قابلة لإعادة الاستخدام تُسنَد كنسخ ثابتة لكل مريض، مع تتبّع يومي للوجبات والترطيب والحالة الصحية
  • ملخّصات التزام وسجلّ تاريخي يراهما الطبيب، مع رايات استثناء تلقائية (التزام منخفض، سجلّات قديمة)
  • مكالمات فيديو Jitsi/WebRTC فورية بنمط «الرنين» ومكالمات مجدولة، إضافة إلى تقييمات سريرية مُهيكلة معفاة من الحصص
  • محادثة فورية داخل التطبيق مع تنبيه SLA للرسائل التي تبقى دون ردّ 24 ساعة، ورفع تقارير طبية خاصة تُقدَّم عبر روابط موقّعة
  • محفظة أرباح للطبيب بسجلّ يحجز المبالغ ثم يتيحها، وتسويات تُنفَّذ بإشراف الإدارة، إضافة إلى إشعارات FCM وإشعارات داخل التطبيق

Outcomes

  • تقوية النظام لخدمة نحو 3,000 مستخدم: فهارس مركّبة على المسارات كثيفة الاستخدام، وإزالة استعلامات N+1 مُثبَتة باختبارات عدّ الاستعلامات، وتخزين مؤقت للقراءات العامة، ونقل استعلامات أسعار الصرف خارج مسار طلب إتمام الدفع
  • بقاء المعلومات الصحية المحمية (PHI) خاصة من الطرف إلى الطرف — إذ تُخزَّن التقارير الطبية ووثائق الهوية ككائنات خاصة على DigitalOcean Spaces لا تُقدَّم إلا عبر روابط موقّعة قصيرة العمر، والرموز في كوكيز HttpOnly، وتوثيق واجهة البرمجة مقصور على الطاقم
  • تأمين المدفوعات عند إعادة المحاولة وفقدان الجلسات عبر سجلّ ProcessedStripeEvent العام مع حُرّاس على مستوى الصف، بما يجعل التفعيل والاسترداد آمنَين عند التكرار في مسار الـ webhook ومسار التأكيد من العميل
  • قابلية التشغيل بحكم التصميم: نشر بالحاويات مشروط بفحوص السلامة عبر أربع بيئات باستخدام GitLab CI/CD، مع تتبّع الأخطاء بـ Sentry/GlitchTip، وتتبّع موزّع بـ OpenTelemetry، وسجلّات مُهيكلة لكل طلب

أعمال أخرى

AirAds preview
منصّة تقنيات إعلانية

AirAds

اكتشاف قائم على الخريطة — النشاط التجاري القريب المناسب، الآن

عرض المشروع
Riquid Platform preview
منظومة تجارة إلكترونية

Riquid Platform

منظومة متعدّدة الوحدات للتجارة بين الشركات والمتجر الإلكتروني والخدمات اللوجستية

عرض المشروع