تخطَّ إلى المحتوى
كل الأعمال

دراسة حالة 02منصة SaaS · المطاعم

Wasl

نظام تشغيل للمطاعم متعدد المستأجرين، مع تطبيق Flutter بعلامة تجارية خاصة لكل مطعم.

الدور
مؤسس ومهندس: المنتج والمعمارية والواجهة الخلفية وتطبيقات Flutter
التقنيات
  • Flutter
  • Dart
  • Laravel 12
  • PHP 8.3
  • PostgreSQL (RLS)
  • Livewire
  • Laravel Reverb
  • Firebase Cloud Messaging
  • Redis
  • Docker
  • GitHub Actions
KitchenLiveNewTableTableCookingTableTableTableReadyTableMenuTABLEOrderTABLE QR
رسم توضيحي

01

المنتج

وَصل (Wasl) نظام تشغيل للمطاعم صمّمته وبنيته، ويعمل في بيئة الإنتاج على wasl.abdelmo3ty.com. يشترك المطعم في المنصة فيدير قائمة طعامه وطلباته ومطبخه وطاولاته وفواتيره ومخزونه وبرنامج الولاء والحجوزات والتحليلات على منصة واحدة تضع العربية أولًا وتعمل من اليمين إلى اليسار.

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

الواجهة الخلفية (Backend) نظام أحادي معياري (modular monolith) من 25 وحدة مبني على Laravel 12 وPHP 8.3 وPostgreSQL 18، وتُعزل المطاعم بعضها عن بعض داخل قاعدة البيانات نفسها عبر Row-Level Security. وفوقها تطبيقان مبنيان بـFlutter: محرك واحد يتحول إلى تطبيق Android وiOS يحمل هوية كل مطعم، وتطبيق Windows للكاشير وشاشة المطبخ.

02

النظام أثناء العمل

طلبٌ حقيقي على مطعم العرض في «وصل»، مسجَّل من النظام أثناء تشغيله. ضيف على الطاولة ٩ يطلب من هاتفه، وتستقبل شاشة المطبخ في محطة المشويات التذكرة، فيؤكّد الطاهي اطلاعه على حساسية الضيوف ثم يبدأ التحضير ويعلّمها جاهزة، ويتابع هاتف الضيف كل خطوة. جزء الطلب معروض بسرعة 1.35×، والباقي بسرعته الحقيقية.

03

الشاشات

لقطات من المنتج.

  • Wasl، الشاشة 1
  • Wasl، الشاشة 2
  • Wasl، الشاشة 3
  • Wasl، الشاشة 4

04

التحدي

  1. 01

    عزل تفرضه قاعدة البيانات، لا الاصطلاحات

    تُفعِّل جداول المستأجرين خاصية Row-Level Security في PostgreSQL وتفرضها، عبر سياسة مبنية على إعداد للمستأجر يُضبط لكل معاملة ويبقى آمنًا خلف PgBouncer. ويرفض التطبيق الإقلاع إذا كان دوره في قاعدة البيانات قادرًا على تجاوز RLS، وتُشغَّل اختبارات تعدد المستأجرين في CI بدور لا يملك صلاحيات مميزة.

  2. 02

    حسابات مالية تتطابق دائمًا

    تُخزَّن المبالغ أعدادًا صحيحة بأصغر وحدة للعملة، ويمر كل سعر عبر نقطة تسعير واحدة. ويعتمد تقسيم الفاتورة على خوارزمية توزيع بطريقة الباقي الأكبر (largest remainder)، فيساوي مجموع الحصص الإجمالي دائمًا؛ وتختبرها CI باختبارات الخصائص (property tests) على 50,000 حالة مولَّدة. ولا يحسب تطبيق الموبايل أي إجمالي بنفسه.

  3. 03

    تشغيل الصالة لحظيًا على شبكات غير موثوقة

    تستخدم شاشات المطبخ والتجهيز (expo) والاستقبال والتتبع قنوات WebSocket خاصة، وتلجأ إلى الاستطلاع الدوري (polling) كبديل. وتخرج أحداث النطاق (domain events) عبر صندوق صادر معاملاتي (transactional outbox). وفي وضع العمل بدون اتصال، يضع المطبخ والكاشير إجراءاتهم في طابور، ولكل إجراء مفتاح منع تكرار (idempotency key) يُنشأ لحظة النقر، فلا يمكن أن تُنتج المزامنة لاحقًا أي تكرار.

  4. 04

    محرك Flutter واحد وتطبيقات كثيرة بعلامات خاصة

    تُثبَّت هوية كل مطعم وقت البناء، أي اسم التطبيق ومعرّفات الحزمة (bundle IDs) ومضيف الروابط العميقة والألوان، بينما تُحمَّل القائمة والعروض وبرنامج الولاء والسمة وقت التشغيل. وتختار سمة Material 3 ألوان النصوص وفق معادلة التباين في WCAG، وتفتح روابط QR على الطاولات التطبيقَ المثبَّت عبر App Links وUniversal Links.

05

دوري

مؤسس ومهندس: المنتج والمعمارية والواجهة الخلفية وتطبيقات Flutter

ما بنيته

  • منصة SaaS متعددة المستأجرين مع Row-Level Security في PostgreSQL
  • الطلب عبر رمز QR على الطاولة دون تسجيل دخول
  • شاشات لحظية للمطبخ والموظفين عبر WebSockets (Laravel Reverb)
  • تطبيق Flutter بعلامة تجارية خاصة لكل مطعم، على Android وiOS
  • تطبيق Flutter على Windows للكاشير وشاشة المطبخ، مع طابور عمليات يعمل بدون اتصال
  • فوترة آمنة ماليًا وتقسيم دقيق للفواتير
  • Transactional outbox وواجهات API آمنة من التكرار (idempotent)
  • تصميم يضع العربية أولًا ويعمل من اليمين إلى اليسار، مع توطين باللغة الإنجليزية
  • بوابات الجودة: PHPStan بالمستوى 9، وقواعد الطبقات في Deptrac، وGitHub Actions CI

06

البنية المعمارية

طبقات النظام، من الواجهات التي يستخدمها الناس إلى طريقة إطلاقه. كل عنصر هنا جزء من تقنيات المشروع.

  1. التطبيقات

    • تطبيق Flutter بعلامة تجارية خاصة · Android وiOS
    • تطبيق Flutter على Windows · الكاشير والمطبخ
    • Livewire
  2. الاتصال اللحظي

    • Laravel Reverb (WebSockets)
    • الاستطلاع الدوري (polling) كبديل
    • Firebase Cloud Messaging
  3. الواجهة الخلفية

    • Laravel 12
    • PHP 8.3
    • نظام أحادي معياري · 25 وحدة
    • Transactional outbox
  4. البيانات

    • PostgreSQL (RLS)
    • Redis
  5. التسليم

    • Docker
    • GitHub Actions
    • PHPStan بالمستوى 9
    • Deptrac

07

الهندسة

  • Row-Level Security

    تُعزل المطاعم بعضها عن بعض داخل PostgreSQL نفسه؛ ويرفض التطبيق الإقلاع إذا كان دوره قادرًا على تجاوز RLS.

  • فوترة آمنة ماليًا

    مبالغ بأعداد صحيحة بأصغر وحدة للعملة، ونقطة تسعير واحدة، وتقسيم للفاتورة بطريقة الباقي الأكبر، مع اختبارات خصائص في CI.

  • تشغيل الصالة لحظيًا

    قنوات WebSocket خاصة مع الاستطلاع الدوري (polling) كبديل؛ وتخرج أحداث النطاق عبر transactional outbox.

  • طابور العمل بدون اتصال

    يضع المطبخ والكاشير الإجراءات في طابور عند انقطاع الاتصال مع مفاتيح منع التكرار، فلا يمكن أن تُنتج المزامنة أي تكرار.

  • Flutter بعلامة تجارية خاصة

    محرك واحد يتحول إلى تطبيق يحمل هوية كل مطعم: الهوية وقت البناء، والقائمة والسمة وقت التشغيل.

  • بوابات الجودة

    PHPStan بالمستوى 9، وقواعد الطبقات في Deptrac، وGitHub Actions CI.

08

رحلة المنتج

  1. 01

    QR الطاولة

    يمسح الضيف رمز QR الخاص بالطاولة.

  2. 02

    الطلب

    يطلب من القائمة دون تسجيل دخول.

  3. 03

    المطبخ

    يصل الطلب إلى شاشة المطبخ في الوقت الفعلي.

  4. 04

    الموظفون

    يعمل كلٌّ من النُّدُل والكاشير وموظف الاستقبال من شاشته الخاصة.

  5. 05

    الفاتورة

    فوترة آمنة ماليًا مع تقسيم دقيق للفاتورة.

09

بالأرقام

وحدة في الواجهة الخلفية بحدود طبقات مفروضة
25
واجهات للمنتج، من طلب الضيف عبر QR إلى التطبيق بعلامة تجارية خاصة
5
ملف اختبار للواجهة الخلفية
685