العودة للأرشيف
دراسة حالةSaaS

PS Cafe Pro — منصة SaaS متكاملة لإدارة مراكز الألعاب والكافيهات

منصة واحدة تُشغّل عدة مراكز ألعاب: مساحة عمل معزولة لكل محل تدير الأجهزة والجلسات ونقاط بيع الكافيتيريا والمخزون والعملاء والورديات والخزينة — وفوقها طبقة إدارة للمنصة تتولى الباقات والاشتراكات والتنبيهات والدعم.

الدور
مهندس برمجيات متكامل
الجدول الزمني
نظام فعلي
الصناعة
منصة تشغيل وإدارة مراكز الألعاب
الحالة
جاهز للتشغيل
ps-cafe-pro
PS Cafe Pro — منصة SaaS لإدارة مراكز الألعاب ونقاط البيع
01نظرة عامة

ما هذا النظام

PS Cafe Pro منتج بنظام اشتراك، وليس نسخة واحدة مثبّتة عند عميل واحد. الشيفرة نفسها تخدم كل المحلات المشتركة، ولا يرى أي محل سوى أجهزته ومبيعاته وموظفيه وعملائه وأمواله هو. وداخل المحل تغطي المنصة يوم العمل كاملًا: فتح وردية، ثم بدء جلسات على أجهزة مسعّرة بالساعة أو بالمباراة، والبيع من الكافيتيريا سواء ارتبط البيع بجلسة أو لا، وخصم المخزون عبر الوصفات بحيث تكون التكلفة والهامش رقمًا محسوبًا لكل صنف، وقبول دفعات مختلطة، وتسوية المديونية، ثم إغلاق الوردية مقابل النقدية المعدودة فعليًا، وقراءة اليوم كإيرادات وربحية وسجل عمليات. وفوق ذلك كله تدير طبقة المنصة عمل المنتج نفسه: الباقات والأسعار، والفترات التجريبية والتجديدات، وحالات الوصول، والتنبيهات التشغيلية عبر كل المحلات، والإعلانات العامة، والدخول باسم المحل عند الحاجة للدعم.

02المشكلة

ما الذي احتجنا حله

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

03الحل

كيف أطلقناه

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

04المعمارية

كيف يُوصل النظام

النظام تطبيق Next.js واحد بطبقتي صلاحيات فوق قاعدة بيانات PostgreSQL واحدة. كل جدول تابع للمستأجرين يحمل مفتاح المحل، ويُستخرج هذا المفتاح من جلسة المستخدم على الخادم لا مما يرسله المتصفح، فتُفرض العزلة عند حدود البيانات بدل الاعتماد على الواجهة. وتمر كل عمليات التعديل عبر Server Actions بدل واجهة REST عامة: التحقق من المدخلات وفحص الصلاحيات والمعاملة كلها في مكان واحد على الخادم، ولا يحمل العميل رمز وصول يمكن إعادة استخدامه ضد نقطة نهاية مكشوفة. وأي عملية تحرّك أموالًا — إنهاء جلسة، أو إرسال طلب، أو تسوية مديونية، أو إغلاق وردية — تُنفَّذ داخل معاملة قاعدة بيانات، ويُكتب السعر الساري لحظة العملية على السجل نفسه بدل إعادة استخراجه لاحقًا.

تدفق البيانات
01
تحديد المستأجر

كل طلب يربط المستخدم المسجَّل بمحل واحد ومجموعة صلاحيات واحدة. ويُطبَّق نطاق المستأجر على الخادم في كل قراءة وكتابة، بحيث يكون غياب الفلترة خطأً في طبقة البيانات لا تسريبًا صامتًا.

02
Server Actions

كل التعديلات تدخل عبر Server Actions: يُتحقق من المدخلات، وتُفحص الصلاحيات، وتُغلَّف العملية داخل معاملة قبل كتابة أي شيء — ولا يوجد مسار ثانٍ أضعف إلى البيانات.

03
محركات المجال

التسعير والجلسات والطلبات والمخزون والائتمان والورديات قواعد منفصلة بحدود صريحة: العروض تمسّ السياقات المسعّرة بالساعة فقط، والمكافآت تُكتسب من الوقت المدفوع فقط، والمديونية لا تُقاصّ أبدًا مع الرصيد.

04
Prisma وPostgreSQL

مخطط علائقي بسلامة معاملات، ولقطات تاريخية للأسعار على السجلات المسعّرة، ومفاتيح idempotency على إرسال الطلبات بحيث ينتهي الطلب المكرر إلى الفاتورة نفسها لا إلى فاتورة ثانية.

05
طبقة المنصة

سطح إداري منفصل فوق كل المستأجرين: الباقات، ودورة حياة الاشتراك والفترة التجريبية، وحالة الوصول، والتنبيهات، والإعلانات، والدخول باسم المحل — وليس وضعًا مميّزًا داخل تطبيق المحل.

05المنصة التقنية

اختيارات هندسية

Frontend
Next.js 16React 19TypeScriptTailwind CSSعربي / إنجليزي (RTL وLTR)ثيم داكن وفاتح
Backend
Next.js Server ActionsPrisma ORMPostgreSQLتحقق من المدخلات على الخادمعمليات داخل معاملاتمفاتيح Idempotency
تكاملات
طباعة الإيصالات (A4 / 80مم / 58مم)تصدير Excel وCSV
البنية التحتية
Dockerنشر على VPSGitHub Actions CIGit وGitHubنسخ احتياطي واستعادة
06طبقة المنصة

إدارة المنصة

الطبقة التي تعلو المحلات. من هنا يُدار بيع المنتج نفسه لا وقت اللعب: الباقات والأسعار، ومن هو في فترة تجريبية وكم بقي له، ومن انتهى اشتراكه، وما الذي يسير على نحو خاطئ عبر المحلات، وطريق للدخول إلى أي محل عند الحاجة للدعم.

لوحة التحكم في المنصة

مؤشرات لحظية عبر كل المحلات — عدد المحلات على المنصة، والمشكلات الحرجة التي تحتاج تدخلًا، والجلسات الجارية الآن، وإيراد اليوم — مع صف ثانٍ للاشتراكات المدفوعة والورديات المفتوحة والفترات التجريبية والاشتراكات المنتهية.

إدارة المحلات (المستأجرين)

كل محل في جدول واحد مع حالة اشتراكه — نشط، أو تجريبي مع عدد الأيام المتبقية، أو منتهٍ — إلى جانب عدد الأجهزة والمستخدمين. ويحمل كل صف إجراءات المشغّل: الدخول باسم المحل، وتمديد الفترة التجريبية، والتعليم كمدفوع، والإلغاء، والحذف.

الباقات والأسعار

باقات شهرية وسنوية ومدى الحياة، لكل منها سعر سابق مشطوب، ووسم للباقة المميّزة المراد الترويج لها، وحالات ظهور (ظاهرة، مخفية، مؤرشفة)، وترتيب يدوي.

الاشتراكات والوصول

حالة الوصول لكل محل، مع فلترة حسب النشط والمقارب على الانتهاء ومدى الحياة والمنتهي والمدفوع القديم والتجريبي. وتُخفى بريد المالك جزئيًا بشكل افتراضي — فالدعم لا يحتاج العنوان كاملًا ليؤدي عمله.

مركز التنبيهات

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

إعلانات المنصة

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

01 / 06
07طبقة المستأجر

تشغيل المحل ومركز الألعاب

ما يراه المحل الواحد بعد تسجيل الدخول. هذه مساحة عمل منفصلة لا نسخة مفلترة من المنصة: فالأجهزة والعملاء والمخزون والموظفون والورديات والأموال أدناه تخص محلًا واحدًا، وهي غير مرئية لأي مستأجر آخر على المنصة.

ما يتحكم فيه كل محل
أجهزته وقوائم أسعاره وسجل أسعارهعملاؤه وأرصدتهم ومديونياتهممخزونه ووصفاته وتكاليف أصنافهموظفوه والصلاحيات الممنوحة لهمورديّاته وخزينته وتقاريره
تسجيل دخول المستأجر

كل محل يدخل إلى مساحة عمل خاصة به ومعزولة تمامًا. اللوحة تعرض وعد المنتج بوضوح: جلسات لحظية، ووصول محدود بحدود المستأجر والصلاحيات، ومكان واحد لإدارة التشغيل.

مركز التشغيل الرئيسي

الصالة كاملة في شاشة واحدة — الأجهزة مقسّمة حسب النوع (أجهزة ألعاب، ترفيه، ترابيزات، غرف)، وعدد الجلسات الجارية، وعدد الطلبات المعلّقة. لا يبدأ أي شيء قبل فتح وردية، ولذلك تظهر الشاشة حالة «لا توجد وردية مفتوحة» صراحةً بدل أن تفشل العملية لاحقًا.

البيع السريع في الكافيتيريا

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

بدء جلسة

فتح الجلسة لا يسأل إلا عمّا يغيّر السعر فعلًا: طريقة الحساب (بالساعة أو بالمباراة)، ونمط اللعب (سينجل أو مالتي)، والعميل. ويظهر السعر المحسوب قبل التأكيد، فلا يضطر الكاشير إلى التخمين.

سجلات العملاء

الرصيد والمديونية حقلان منفصلان تمامًا في بطاقة العميل، وليسا رقمًا واحدًا صافيًا. يمكن أن يملك العميل رصيدًا وعليه مديونية في الوقت نفسه، والشاشة ترفض إخفاء ذلك خلف رقم واحد.

مركز الورديات

تبدأ الوردية برصيد افتتاحي، وكل جلسة وبيع ومصروف بعدها ينتمي إليها. وعند الإغلاق يقارن النظام المتوقّع بالفعلي ويسجّل الفرق بدل ابتلاعه بصمت. وتظل الورديات المغلقة في السجل بمن فتحها وبقيمة الفرق.

المالية والخزينة

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

تقارير الإيرادات

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

إعدادات النظام

إعداد طباعة الإيصالات لمقاسات A4 و80مم و58مم الحرارية، مع اختيار الطابعة وعدد النسخ، إلى جانب إدارة البيانات والإعدادات العامة وقواعد الخصم.

تسعير الأجهزة

لكل جهاز قائمة أسعار خاصة به — سعر الساعة سينجل ومالتي، وسعر المباراة سينجل ومالتي، وسعر فتح الغرفة إضافةً إلى سعر الشخص — والأجهزة المخصّصة للكافيتيريا فقط تُوسم صراحةً بأنها بلا سعر جلسة. ولكل بطاقة سجل تاريخي للأسعار. الشاشة معروضة هنا بالثيم الفاتح.

عروض السعر بالساعة

تنطبق العروض على السياقات المسعّرة بالساعة فقط، إما كتخفيض أو كسعر ثابت للساعة. أما المباريات فهي خارج نطاق العروض صراحةً — والشاشة تقول ذلك بنفسها — حتى لا يعيد أي عرض كتابة سعر مباراة ثابت بصمت.

مكافآت الوقت والمشروبات

تُكتسب المكافآت من الوقت المدفوع فقط، وتُستخدم داخل الجلسة نفسها. وهذه القاعدة وحدها هي ما يمنع المكافآت من التوالد: فلا يمكن لمكافأة أن تكسب مكافأة أخرى.

المخزون

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

فريق العمل والصلاحيات

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

سجل العمليات

كل عملية داخل المحل مكتوبة بصيغة مقروءة لا كصفوف خام: من نفّذها، وعلى أي كيان، ومتى، ولماذا. إغلاق الورديات وإنهاء الجلسات وإنشاء الوصفات وإضافة الأصناف كلها تُسجَّل هنا، ولكل سطر تفاصيله الكاملة عند الفتح.

01 / 15
08أنظمة Backend

الخدمات والبيانات

عزل المستأجرين

كل جدول تابع للمستأجرين يحمل مفتاح المحل، ويُستخرج المفتاح من الجلسة الموثّقة على الخادم لا من العميل. ولذلك لا يستطيع محل الوصول إلى صفوف محل آخر حتى لو صيغ الطلب يدويًا.

دورة حياة الاشتراك والباقات

تُدار الباقات والأسعار والفترات التجريبية والتجديدات والوصول مدى الحياة والانتهاء من طبقة المنصة. وتُشتق حالة الوصول من سجل الاشتراك، فيسري تمديد فترة تجريبية أو تعليم محل كمدفوع دون المساس ببيانات المحل نفسه.

طبقة سلامة المعاملات

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

العمليات غير القابلة للتكرار

يحمل إرسال الطلب مفتاح idempotency. والطلب المكرر — إعادة محاولة، أو ضغطة مزدوجة، أو اتصال متقطع — ينتهي إلى الفاتورة القائمة بدل إنشاء فاتورة ثانية.

لقطات الأسعار التاريخية

يُكتب السعر الساري على السجل الذي سعّره. وتعديل سعر جهاز اليوم يغيّر تكلفة الجلسة التالية فقط؛ أما فواتير الشهر الماضي وتقاريره فتبقى كما هي تمامًا.

التنبيهات ووصول الدعم

تراقب المنصة الحالات الشاذة عبر كل المحلات — وأوضحها الورديات المتروكة مفتوحة لأيام — وتقرن كل تنبيه بإمكانية الدخول باسم المحل ليرى الدعم ما يراه الموظفون ويعالجه.

09APIs والتكاملات

الواجهات الخارجية

تكامل
Server Actions

التعديلات تمر عبر Server Actions بدل واجهة REST عامة. فالتحقق وفحص الصلاحيات والمعاملة تجتمع في مسار واحد على الخادم، ولا يبقى على العميل رمز وصول طويل الأجل يمكن إعادة استخدامه.

تكامل
Prisma وPostgreSQL

طبقة علائقية مُنمّطة فوق PostgreSQL. والمخطط — لا الواجهة — هو موضع مفاتيح المستأجرين والمفاتيح الأجنبية وضمانات المعاملات.

تكامل
طباعة الإيصالات

مخرجات قابلة للضبط لمقاسات A4 و80مم و58مم الحرارية، مع اختيار الطابعة وعدد النسخ، فتعمل النسخة نفسها على طابعة كاملة أو على وحدة حرارية فوق الكاونتر.

تكامل
تصدير Excel وCSV

تقارير الإيرادات وربحية الأصناف قابلة للتصدير إلى صيغ الجداول، فلا يُجبر المالك الذي يريد العمل خارج النظام على العودة إليه.

تكامل
النسخ الاحتياطي والاستعادة

إدارة البيانات جزء من المنتج لا عملية جانبية: يمكن تصدير بيانات المحل واستعادتها من داخل شاشة الإعدادات.

10هيكل لوحة التحكم

ما يتحكم به المسؤولون

01
التقارير

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

02
سجل العمليات

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

03
الصلاحيات حسب الدور

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

04
الإعدادات والطباعة

الإعدادات العامة وقواعد الخصم وضبط الطباعة وإدارة البيانات، محفوظة خلف قسم إداري صريح بدل خلطها بشاشات التشغيل اليومية.

05
الحساب والاشتراك

يرى كل محل باقته وطلبات اشتراكه وحالة وصوله — وهي الوجه المقابل لدى المستأجر لما تديره طبقة المنصة.

11تحديات تم حلها

مشاكل صعبة، تم التعامل معها

الأثر
التحدي 01

أربع صور للتسعير على أرضية واحدة — الساعة سينجل، والساعة مالتي، والمباراة سينجل، والمباراة مالتي — إضافةً إلى الغرف التي تُحاسَب بسعر فتح ثم بسعر لكل شخص. واختيار الصورة الخاطئة يعني فاتورة خاطئة.

الحل

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

الأثر
التحدي 02

تعديل سعر جهاز كان يعيد كتابة التاريخ بصمت: تتغير معه فواتير الأمس وتقارير الشهر الماضي، فلا يمكن الوثوق بأي تقرير مرتين.

الحل

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

الأثر
التحدي 03

الكاونتر المزدحم يرسل الطلب مرتين. وإعادة المحاولات والضغطات المتعجّلة كانت تنتج فواتير مكررة يجب البحث عنها وإلغاؤها يدويًا.

الحل

أصبح إرسال الطلب idempotent. فالطلب المكرر الحامل للمفتاح نفسه ينتهي إلى الفاتورة القائمة، وبذلك يصبح إنشاء المكرر مستحيلًا بدل تنظيفه بعد وقوعه.

الأثر
التحدي 04

مقاصّة رصيد العميل مع مديونيته في رقم واحد كانت تخفي أموالًا حقيقية. فعميلان بالرقم الصافي نفسه قد يكونان في وضعين مختلفين تمامًا.

الحل

الرصيد والمديونية سجلان منفصلان لا يُدمجان. وتجري التسوية بنظام الأقدم أولًا، فتُنسب كل دفعة جزئية إلى مستحقات بعينها بدل أن تختفي داخل إجمالي.

الأثر
التحدي 05

الجلسات تنتقل بين الأجهزة أثناء اللعب، وبعضها ينتهي مدموجًا. وإعادة التسعير عند الوجهة أو إصدار فاتورتين لنفس اللعب كانت تنتج مبالغ لم يوافق عليها العميل أصلًا.

الحل

النقل يحمل الوقت المنقضي والسعر المتفق عليه بدل إعادة التسعير، والدمج ينتج فاتورة واحدة تظل تسجّل مصدر كل جزء فيها — فاتورة واحدة، بمرجعية سليمة.

الأثر
التحدي 06

محرك مكافآت يسمح بالاكتساب من قيمة مستهلكة سيتضاعف بلا نهاية، وعرض يُطبَّق على مباراة ثابتة السعر سيعيد كتابة سعر متفق عليه.

الحل

أُعطي المحركان حدودًا صارمة بدل شروط حماية متناثرة في الشيفرة: المكافآت تُكتسب من الوقت المدفوع فقط وتُستهلك داخل الجلسة، والعروض تنطبق على السياقات المسعّرة بالساعة فقط. وكل حدّ منها مكتوب على الشاشة التي تُضبط فيها القاعدة.

الأثر
التحدي 07

كانت الجلسات والمبيعات تُسجَّل خارج أي وردية، ما يجعل مطابقة الدرج في نهاية اليوم مستحيلة.

الحل

صارت الوردية شرطًا مسبقًا صارمًا لا وسيلة تقارير. فمع عدم وجود وردية مفتوحة تعرض شاشات التشغيل والكافيتيريا حالة منع صريحة بدل السماح بعمل لن يجد لاحقًا ما ينتمي إليه.

الأثر
التحدي 08

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

الحل

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

12الأداء

مبني ليظل سريعاً

يُطبَّق نطاق المستأجر على مستوى الاستعلام، فتقرأ شاشات المحل صفوفه هو فقط مهما بلغ حجم بيانات المنصة كاملة.
تتجمّع التقارير على مدى محدود — نافذة تاريخية أو وردية واحدة — بدل مسح تاريخ المحل كاملًا لعرض لوحة واحدة.
تُنفَّذ العمليات المالية داخل معاملات قصيرة ومحددة النطاق، فلا تأتي الصحة على حساب حجز الأقفال طوال الطلب.
تُبقي Server Actions جلب البيانات وتعديلها على الخادم، فيبقى حجم حزمة المتصفح صغيرًا ولا تُشحن قواعد العمل إلى الواجهة.
يُحسب المخزون والتكلفة والهامش حيث تقيم البيانات بدل تجميعها عبر عدة رحلات ذهاب وإياب لكل شاشة.
13UI / UX

التصميم والتفاعل

طبقتان وسطحان: لوحة المنصة وواجهة المحل تجربتان منفصلتان، فلا يتسرب شيء من أدوات المشغّل إلى ما يراه المحل.
حالات المنع تُشرح ولا تُلمَّح: فمع عدم وجود وردية مفتوحة تقول الشاشة ذلك وتقول ما العمل، بدل ترك الكاشير يكتشفها لحظة التحصيل.
تُعرض الأسعار قبل الالتزام: فتح الجلسة يُظهر السعر المحسوب، فيصبح التأكيد قرارًا لا تخمينًا.
الأرقام السيئة تُعرض كما هي: الهامش السالب، ونقص الدرج، والاشتراك المنتهي، تظهر على حقيقتها بدل تقريبها أو تثبيتها أو إخفائها.
العربية والإنجليزية كلتاهما من الدرجة الأولى، بتخطيط RTL كامل لا مجرد انعكاس لاحق، والواجهة متاحة بثيم داكن وفاتح.
حالة المخزون محمولة على بطاقة الصنف نفسها — متاح، قارب على النفاد، منتهٍ — فلا يضطر الكاشير لمغادرة عملية البيع ليعرف إن كان الصنف موجودًا.
بحث الأوامر (Ctrl+K) وقائمة جانبية ثابتة يبقيان التنقّل قصيرًا داخل منتج واسع السطح.
14جاهزية الإنتاج

جاهز للإطلاق والتشغيل

عزل المستأجرين مفروض في طبقة البيانات لا في الواجهة.
صلاحيات حسب الدور بعشر نطاقات مُسمّاة.
سلامة معاملات على كل عملية تحرّك أموالًا.
إرسال طلبات idempotent يقاوم إعادة المحاولة والضغط المزدوج.
لقطات أسعار تاريخية فلا تتغير الفواتير والتقارير السابقة.
مطابقة ورديات تسجّل الفروق بدل ابتلاعها.
سجل عمليات مقروء يغطي الأحداث التشغيلية والمالية.
نسخ احتياطي واستعادة من داخل المنتج.
نشر بالحاويات مع تكامل مستمر عبر GitHub Actions.
تنبيهات على مستوى المنصة للحالات الشاذة عبر كل المحلات.
15ميزات النظام

ما الذي يفعله

إدارة الأجهزة والمحطات

الأجهزة مصنّفة — أجهزة ألعاب، ووحدات ترفيه، وترابيزات، وغرف — ولكل منها قائمة أسعار خاصة بدل وراثة سعر عام. ويمكن أيضًا وسم جهاز بأنه للكافيتيريا فقط، أي يستقبل الطلبات ولا يُحاسَب على الوقت إطلاقًا، وهو ما يلغي فئة كاملة من رسوم الوقت غير المقصودة.

محرك التسعير المتقدم

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

نقل الجلسات ودمجها

يمكن نقل الجلسة إلى جهاز آخر أو دمجها في جلسة أخرى أثناء اللعب. والنقل يحمل معه الوقت المنقضي والسعر المتفق عليه بدل إعادة التسعير عند الوجهة، والدمج يجمع الاستهلاك دون إصدار فاتورتين عن اللعب نفسه — والنتيجة فاتورة واحدة تظل تشرح من أين جاء كل جزء فيها.

الكافيتيريا ونقطة البيع

تُربط الطلبات بجلسة جارية أو تقف وحدها كبيع سريع. والإرسال idempotent: الطلب المُعاد أو المضغوط مرتين ينتهي إلى الفاتورة نفسها لا إلى فاتورة ثانية، وهذا تحديدًا ما يمنع الكاونتر المزدحم من التحصيل مرتين بصمت.

المخزون

الأصناف الجاهزة والمواد الخام مخزونان منفصلان بشاشتَي نواقص منفصلتين، لأن نفاد صنف قابل للبيع ونفاد مكوّن خام مشكلتان تشغيليتان مختلفتان تحتاجان تنبيهين مختلفين.

الوصفات وتكلفة الأصناف

يمكن تعريف الصنف عبر وصفة على المواد الخام. وبيعه يخصم مكوّناته ويشتقّ تكلفته منها، فيكون الهامش المعروض بجوار السعر رقمًا محسوبًا — وحين تتجاوز التكلفة السعر يُعرض الهامش السالب كما هو بدل تثبيته على صفر.

إدارة العملاء

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

رصيد العميل ومديونيته

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

الدفع المختلط

يمكن تسوية الفاتورة الواحدة من أكثر من مصدر في آنٍ واحد — نقدًا، ومن رصيد العميل، ويُترك الباقي مديونية. ويُسجَّل كل جزء كحركة مستقلة، وهذا ما يبقي الخزينة ورصيد العميل والمديونية القائمة صحيحة جميعًا بعد الدفع المجزّأ.

ورديات الكاشير

تبدأ الوردية برصيد افتتاحي معلن وتصبح الوعاء الذي ينتمي إليه كل جلسة وبيع ومصروف بعدها. وما لم تكن هناك وردية مفتوحة ترفض شاشات التشغيل والكافيتيريا إتمام أي عملية. ويقارن الإغلاق المتوقّع بالمعدود ويحفظ الفرق ضمن سجل الوردية.

المالية والخزينة

الإيداعات والمسحوبات سجل واحد بصافٍ متجدد، ويمكن نسبتها إلى الموظف والنوع والتاريخ. وبذلك تصبح حركة النقد قابلة للتفسير بعد وقوعها بدل استنتاجها من رصيد الإقفال.

محرك العروض

تطبّق العروض تخفيضًا أو سعرًا ثابتًا للساعة، وعلى السياقات المسعّرة بالساعة فقط. أما التسعير بالمباراة فمستثنى عمدًا حتى لا يغيّر أي عرض سعر مباراة ثابتًا بصمت — وهو حدّ تقوله الواجهة صراحةً بدل تركه في التوثيق.

المكافآت

تتراكم المكافآت من الوقت المدفوع فقط وتُستهلك داخل الجلسة نفسها. وكلا الشقين مهم: الاكتساب من الوقت المدفوع وحده يمنع الوقت المجاني من توليد قيمة، والاستهلاك داخل الجلسة يمنع المكافأة من أن تكسب مكافأة أخرى.

16قرارات تقنية

لماذا اخترنا ما اخترناه

قرار 01

Server Actions بدل واجهة REST عامة.

التحقق وفحص الصلاحيات والمعاملة تنتمي بعضها إلى بعض. وإبقاؤها في مسار واحد على الخادم يلغي المدخل الثاني الأضعف الذي كان سيخلقه سطح API منفصل، ولا يترك على العميل رمزًا قابلًا لإعادة الاستخدام.

قرار 02

فرض العزلة في طبقة البيانات لا في الواجهة.

الفلتر الذي يعيش داخل مكوّن واجهة يبعد إعادة هيكلة واحدة عن الضياع. واستخراج مفتاح المحل من الجلسة في كل استعلام يجعل غياب النطاق فشلًا على الخادم لا قراءة صامتة عبر المستأجرين.

قرار 03

التقاط الأسعار على السجلات التي سعّرتها.

التقرير الذي يتغير حين يعدّل أحدهم سعرًا ليس تقريرًا. والالتقاط يجعل التاريخ ثابتًا ويجعل تغيير الأسعار آمنًا أثناء ساعات العمل.

قرار 04

إبقاء الرصيد والمديونية سجلين منفصلين.

المقاصّة بينهما تتلف معلومات يحتاجها المحل فعلًا. وسجلان مع تسوية بالأقدم أولًا يعنيان أن كل دفعة يمكن تتبّعها إلى المستحقات التي سدّدتها.

قرار 05

جعل الوردية شرطًا مسبقًا لا تقريرًا.

إن أمكن وجود مبيعات خارج وردية صارت المطابقة تخمينًا. وربط التحصيل بوردية مفتوحة يجعل الدرج قابلًا للتفسير دائمًا.

قرار 06

تحديد محركي العروض والمكافآت بقاعدة لا بترقيع.

قصر العروض على السياقات المسعّرة بالساعة، وقصر المكافآت على الوقت المدفوع مع الاستهلاك داخل الجلسة، حدود ضيقة بما يكفي للتفكير فيها. أما المحرك الأكثر تساهلًا فكان سيحتاج حراسًا ضد التكرار وسيظل يفاجئ الناس عند الكاونتر.

قرار 07

فصل طبقة المنصة عن تطبيق المستأجر.

إدارة الاشتراكات عمل مختلف وجمهوره مختلف. وبناؤها كسطح مستقل يبقي أدوات المشغّل خارج منتج المحل، ويبقي الدخول باسم المحل فعلًا صريحًا قابلًا للتدقيق.

17النتيجة

النتائج

SaaS متعدد المستأجرين
النموذج
منصة + مستأجر
الطبقات
بالساعة وبالمباراة
أنماط التسعير
١٠
نطاقات الصلاحيات
العربية والإنجليزية
اللغات
جاهز للتشغيل
الحالة
تابع الاستكشاف

دراسات حالة أخرى

تبني شيئاً مشابهاً؟

هيا نحدد نطاق منصتك — لوحة تحكم وتطبيقات موبايل و APIs والمنصة كاملة.

واتساب