PS Cafe Pro — منصة SaaS متكاملة لإدارة مراكز الألعاب والكافيهات
منصة واحدة تُشغّل عدة مراكز ألعاب: مساحة عمل معزولة لكل محل تدير الأجهزة والجلسات ونقاط بيع الكافيتيريا والمخزون والعملاء والورديات والخزينة — وفوقها طبقة إدارة للمنصة تتولى الباقات والاشتراكات والتنبيهات والدعم.
- الدور
- مهندس برمجيات متكامل
- الجدول الزمني
- نظام فعلي
- الصناعة
- منصة تشغيل وإدارة مراكز الألعاب
- الحالة
- جاهز للتشغيل
ما هذا النظام
PS Cafe Pro منتج بنظام اشتراك، وليس نسخة واحدة مثبّتة عند عميل واحد. الشيفرة نفسها تخدم كل المحلات المشتركة، ولا يرى أي محل سوى أجهزته ومبيعاته وموظفيه وعملائه وأمواله هو. وداخل المحل تغطي المنصة يوم العمل كاملًا: فتح وردية، ثم بدء جلسات على أجهزة مسعّرة بالساعة أو بالمباراة، والبيع من الكافيتيريا سواء ارتبط البيع بجلسة أو لا، وخصم المخزون عبر الوصفات بحيث تكون التكلفة والهامش رقمًا محسوبًا لكل صنف، وقبول دفعات مختلطة، وتسوية المديونية، ثم إغلاق الوردية مقابل النقدية المعدودة فعليًا، وقراءة اليوم كإيرادات وربحية وسجل عمليات. وفوق ذلك كله تدير طبقة المنصة عمل المنتج نفسه: الباقات والأسعار، والفترات التجريبية والتجديدات، وحالات الوصول، والتنبيهات التشغيلية عبر كل المحلات، والإعلانات العامة، والدخول باسم المحل عند الحاجة للدعم.
ما الذي احتجنا حله
مركز الألعاب يكسب بطريقتين في آن واحد — وقت على الجهاز، وأصناف تُباع على الكاونتر — ويجب أن تصل الطريقتان إلى الجلسة نفسها والوردية نفسها والعميل نفسه دون ازدواج في الحساب. والقيام بذلك على الورق أو على جدول بيانات ينهار سريعًا: فالجلسات تُنقل بين الأجهزة أثناء اللعب فتفقد تسعيرها، والعميل يدفع جزءًا نقدًا وجزءًا من رصيده فيُنسى الباقي، ويُعدَّل سعر اليوم فتتغير معه فواتير الشهر الماضي بصمت، ويُرسل الطلب مرتين لأن الكاونتر مزدحم، وتُغلق الوردية دون أن يسجّل أحد أن الدرج ناقص. وبيع النظام لعدة محلات يضاعف المشكلة: فالفترات التجريبية والتجديدات والانتهاء والدعم لكل محل تحتاج مكانًا تُدار منه، وبدون طبقة منصة تتحول كلها إلى عمل يدوي.
كيف أطلقناه
منصة واحدة متعددة المستأجرين بطبقتين مفصولتين بوضوح. طبقة المستأجر تمنح كل محل واجهة تشغيل خاصة: أجهزة بقوائم أسعار مستقلة، وجلسات تُحاسَب بالساعة أو بالمباراة، ونقطة بيع للكافيتيريا تعمل مع جلسة أو بدونها، ومخزون مربوط بوصفات فتصبح تكلفة الصنف وهامشه رقمًا حقيقيًا، وعملاء يبقى رصيدهم منفصلًا عن مديونيتهم، وورديات تحكم كل عملية تحرّك أموالًا. وطبقة المنصة تمنح المشغّل لوحة فوق كل المحلات: الباقات والأسعار، ودورة حياة الاشتراك والفترة التجريبية، وحالة الوصول، ومركز تنبيهات يرصد الحالات الشاذة مثل ورديات تُركت مفتوحة لأيام، والإعلانات، والدخول باسم المحل لأغراض الدعم. أما الصحة فمفروضة في طبقة البيانات لا في الواجهة — فالعمليات المالية تجري داخل معاملات، وإرسال الطلبات لا يتكرر أثره، وتُلتقط الأسعار على السجلات التي سعّرتها فلا يعيد التاريخ كتابة نفسه.
كيف يُوصل النظام
النظام تطبيق Next.js واحد بطبقتي صلاحيات فوق قاعدة بيانات PostgreSQL واحدة. كل جدول تابع للمستأجرين يحمل مفتاح المحل، ويُستخرج هذا المفتاح من جلسة المستخدم على الخادم لا مما يرسله المتصفح، فتُفرض العزلة عند حدود البيانات بدل الاعتماد على الواجهة. وتمر كل عمليات التعديل عبر Server Actions بدل واجهة REST عامة: التحقق من المدخلات وفحص الصلاحيات والمعاملة كلها في مكان واحد على الخادم، ولا يحمل العميل رمز وصول يمكن إعادة استخدامه ضد نقطة نهاية مكشوفة. وأي عملية تحرّك أموالًا — إنهاء جلسة، أو إرسال طلب، أو تسوية مديونية، أو إغلاق وردية — تُنفَّذ داخل معاملة قاعدة بيانات، ويُكتب السعر الساري لحظة العملية على السجل نفسه بدل إعادة استخراجه لاحقًا.
كل طلب يربط المستخدم المسجَّل بمحل واحد ومجموعة صلاحيات واحدة. ويُطبَّق نطاق المستأجر على الخادم في كل قراءة وكتابة، بحيث يكون غياب الفلترة خطأً في طبقة البيانات لا تسريبًا صامتًا.
كل التعديلات تدخل عبر Server Actions: يُتحقق من المدخلات، وتُفحص الصلاحيات، وتُغلَّف العملية داخل معاملة قبل كتابة أي شيء — ولا يوجد مسار ثانٍ أضعف إلى البيانات.
التسعير والجلسات والطلبات والمخزون والائتمان والورديات قواعد منفصلة بحدود صريحة: العروض تمسّ السياقات المسعّرة بالساعة فقط، والمكافآت تُكتسب من الوقت المدفوع فقط، والمديونية لا تُقاصّ أبدًا مع الرصيد.
مخطط علائقي بسلامة معاملات، ولقطات تاريخية للأسعار على السجلات المسعّرة، ومفاتيح idempotency على إرسال الطلبات بحيث ينتهي الطلب المكرر إلى الفاتورة نفسها لا إلى فاتورة ثانية.
سطح إداري منفصل فوق كل المستأجرين: الباقات، ودورة حياة الاشتراك والفترة التجريبية، وحالة الوصول، والتنبيهات، والإعلانات، والدخول باسم المحل — وليس وضعًا مميّزًا داخل تطبيق المحل.
اختيارات هندسية
إدارة المنصة
الطبقة التي تعلو المحلات. من هنا يُدار بيع المنتج نفسه لا وقت اللعب: الباقات والأسعار، ومن هو في فترة تجريبية وكم بقي له، ومن انتهى اشتراكه، وما الذي يسير على نحو خاطئ عبر المحلات، وطريق للدخول إلى أي محل عند الحاجة للدعم.
مؤشرات لحظية عبر كل المحلات — عدد المحلات على المنصة، والمشكلات الحرجة التي تحتاج تدخلًا، والجلسات الجارية الآن، وإيراد اليوم — مع صف ثانٍ للاشتراكات المدفوعة والورديات المفتوحة والفترات التجريبية والاشتراكات المنتهية.
كل محل في جدول واحد مع حالة اشتراكه — نشط، أو تجريبي مع عدد الأيام المتبقية، أو منتهٍ — إلى جانب عدد الأجهزة والمستخدمين. ويحمل كل صف إجراءات المشغّل: الدخول باسم المحل، وتمديد الفترة التجريبية، والتعليم كمدفوع، والإلغاء، والحذف.
باقات شهرية وسنوية ومدى الحياة، لكل منها سعر سابق مشطوب، ووسم للباقة المميّزة المراد الترويج لها، وحالات ظهور (ظاهرة، مخفية، مؤرشفة)، وترتيب يدوي.
حالة الوصول لكل محل، مع فلترة حسب النشط والمقارب على الانتهاء ومدى الحياة والمنتهي والمدفوع القديم والتجريبي. وتُخفى بريد المالك جزئيًا بشكل افتراضي — فالدعم لا يحتاج العنوان كاملًا ليؤدي عمله.
حالات شاذة تُرصد عبر كل المحلات بدل انتظار من يبلّغ عنها. وهنا ورديات تُركت مفتوحة لأيام، مرتّبة حسب الخطورة والمدة، ولكل تنبيه محله ومالكه وطريق مباشر للدخول ومعالجته.
رسالة تُبَث إلى كل المحلات أو إلى جمهور محدّد، مع مستوى أهمية مرفق حتى لا يصل إشعار معلوماتي بمظهر العطل الحرج.
تشغيل المحل ومركز الألعاب
ما يراه المحل الواحد بعد تسجيل الدخول. هذه مساحة عمل منفصلة لا نسخة مفلترة من المنصة: فالأجهزة والعملاء والمخزون والموظفون والورديات والأموال أدناه تخص محلًا واحدًا، وهي غير مرئية لأي مستأجر آخر على المنصة.
كل محل يدخل إلى مساحة عمل خاصة به ومعزولة تمامًا. اللوحة تعرض وعد المنتج بوضوح: جلسات لحظية، ووصول محدود بحدود المستأجر والصلاحيات، ومكان واحد لإدارة التشغيل.
الصالة كاملة في شاشة واحدة — الأجهزة مقسّمة حسب النوع (أجهزة ألعاب، ترفيه، ترابيزات، غرف)، وعدد الجلسات الجارية، وعدد الطلبات المعلّقة. لا يبدأ أي شيء قبل فتح وردية، ولذلك تظهر الشاشة حالة «لا توجد وردية مفتوحة» صراحةً بدل أن تفشل العملية لاحقًا.
مبيعات مباشرة بدون جلسة جهاز، مع بطاقات أصناف تعرض حالة المخزون (متاح، قارب على النفاد، منتهٍ)، وفلاتر للأقسام، وفاتورة جارية. ومثل كل شاشة تحرّك أموالًا، تظل مقفلة حتى تُفتح وردية.
فتح الجلسة لا يسأل إلا عمّا يغيّر السعر فعلًا: طريقة الحساب (بالساعة أو بالمباراة)، ونمط اللعب (سينجل أو مالتي)، والعميل. ويظهر السعر المحسوب قبل التأكيد، فلا يضطر الكاشير إلى التخمين.
الرصيد والمديونية حقلان منفصلان تمامًا في بطاقة العميل، وليسا رقمًا واحدًا صافيًا. يمكن أن يملك العميل رصيدًا وعليه مديونية في الوقت نفسه، والشاشة ترفض إخفاء ذلك خلف رقم واحد.
تبدأ الوردية برصيد افتتاحي، وكل جلسة وبيع ومصروف بعدها ينتمي إليها. وعند الإغلاق يقارن النظام المتوقّع بالفعلي ويسجّل الفرق بدل ابتلاعه بصمت. وتظل الورديات المغلقة في السجل بمن فتحها وبقيمة الفرق.
كل إيداع ومسحوب في سجل واحد مع صافٍ متجدد، مع فلترة حسب الموظف والنوع والتاريخ، بحيث تُنسب كل حركة نقدية إلى شخص ووقت محددين بدل أن تظهر كإجمالي بلا تفسير.
إيراد الأجهزة وإيراد الكافيتيريا والإيداعات والمصروفات تتجمّع في نتيجة صافية على مدى فترة أو وردية واحدة، مع عرض الفواتير التفصيلية أسفلها وإمكانية تصدير ربحية الأصناف للتحليل خارج النظام.
إعداد طباعة الإيصالات لمقاسات A4 و80مم و58مم الحرارية، مع اختيار الطابعة وعدد النسخ، إلى جانب إدارة البيانات والإعدادات العامة وقواعد الخصم.
لكل جهاز قائمة أسعار خاصة به — سعر الساعة سينجل ومالتي، وسعر المباراة سينجل ومالتي، وسعر فتح الغرفة إضافةً إلى سعر الشخص — والأجهزة المخصّصة للكافيتيريا فقط تُوسم صراحةً بأنها بلا سعر جلسة. ولكل بطاقة سجل تاريخي للأسعار. الشاشة معروضة هنا بالثيم الفاتح.
تنطبق العروض على السياقات المسعّرة بالساعة فقط، إما كتخفيض أو كسعر ثابت للساعة. أما المباريات فهي خارج نطاق العروض صراحةً — والشاشة تقول ذلك بنفسها — حتى لا يعيد أي عرض كتابة سعر مباراة ثابت بصمت.
تُكتسب المكافآت من الوقت المدفوع فقط، وتُستخدم داخل الجلسة نفسها. وهذه القاعدة وحدها هي ما يمنع المكافآت من التوالد: فلا يمكن لمكافأة أن تكسب مكافأة أخرى.
الأصناف الجاهزة والمواد الخام تُتابَع كل على حدة، ولكل منهما شاشة نواقص خاصة. والتكلفة موضوعة بجوار السعر بحيث يظهر هامش الربح لكل صنف — بما في ذلك حين يكون سالبًا، فالجدول يعرضه ولا يخفيه — وكل صنف له وصفة يُوسم بذلك.
عشر صلاحيات مُسمّاة — المخزن، والتقارير والمبيعات، والخزنة والماليات، والكافيتيريا، والمراقبة والجلسات، والخصم، وإعدادات النظام، وإدارة الورديات، وفريق العمل، والأجهزة والتسعير — تُمنح لكل مستخدم على حدة، مع تمييز واضح بين المدير كامل الصلاحية والأدوار المخصّصة.
كل عملية داخل المحل مكتوبة بصيغة مقروءة لا كصفوف خام: من نفّذها، وعلى أي كيان، ومتى، ولماذا. إغلاق الورديات وإنهاء الجلسات وإنشاء الوصفات وإضافة الأصناف كلها تُسجَّل هنا، ولكل سطر تفاصيله الكاملة عند الفتح.
الخدمات والبيانات
كل جدول تابع للمستأجرين يحمل مفتاح المحل، ويُستخرج المفتاح من الجلسة الموثّقة على الخادم لا من العميل. ولذلك لا يستطيع محل الوصول إلى صفوف محل آخر حتى لو صيغ الطلب يدويًا.
تُدار الباقات والأسعار والفترات التجريبية والتجديدات والوصول مدى الحياة والانتهاء من طبقة المنصة. وتُشتق حالة الوصول من سجل الاشتراك، فيسري تمديد فترة تجريبية أو تعليم محل كمدفوع دون المساس ببيانات المحل نفسه.
إنهاء الجلسة وإرسال الطلب وتسوية المديونية وإغلاق الوردية، كل منها يُنفَّذ داخل معاملة قاعدة بيانات. والفشل في منتصف الطريق يتراجع بالعملية كاملة بدل ترك جلسة محاسَبة نصف محاسبة أو وردية حسبت بعض مبيعاتها فقط.
يحمل إرسال الطلب مفتاح idempotency. والطلب المكرر — إعادة محاولة، أو ضغطة مزدوجة، أو اتصال متقطع — ينتهي إلى الفاتورة القائمة بدل إنشاء فاتورة ثانية.
يُكتب السعر الساري على السجل الذي سعّره. وتعديل سعر جهاز اليوم يغيّر تكلفة الجلسة التالية فقط؛ أما فواتير الشهر الماضي وتقاريره فتبقى كما هي تمامًا.
تراقب المنصة الحالات الشاذة عبر كل المحلات — وأوضحها الورديات المتروكة مفتوحة لأيام — وتقرن كل تنبيه بإمكانية الدخول باسم المحل ليرى الدعم ما يراه الموظفون ويعالجه.
الواجهات الخارجية
التعديلات تمر عبر Server Actions بدل واجهة REST عامة. فالتحقق وفحص الصلاحيات والمعاملة تجتمع في مسار واحد على الخادم، ولا يبقى على العميل رمز وصول طويل الأجل يمكن إعادة استخدامه.
طبقة علائقية مُنمّطة فوق PostgreSQL. والمخطط — لا الواجهة — هو موضع مفاتيح المستأجرين والمفاتيح الأجنبية وضمانات المعاملات.
مخرجات قابلة للضبط لمقاسات A4 و80مم و58مم الحرارية، مع اختيار الطابعة وعدد النسخ، فتعمل النسخة نفسها على طابعة كاملة أو على وحدة حرارية فوق الكاونتر.
تقارير الإيرادات وربحية الأصناف قابلة للتصدير إلى صيغ الجداول، فلا يُجبر المالك الذي يريد العمل خارج النظام على العودة إليه.
إدارة البيانات جزء من المنتج لا عملية جانبية: يمكن تصدير بيانات المحل واستعادتها من داخل شاشة الإعدادات.
ما يتحكم به المسؤولون
إيراد مقسّم بين الأجهزة والكافيتيريا، وإيداعات ومصروفات، تتجمّع في نتيجة صافية على مدى فترة أو وردية واحدة، مع عرض الفواتير التفصيلية وربحية كل صنف إلى جانبها.
سجل مقروء لما جرى داخل المحل — الفاعل والكيان والإجراء والوقت والسبب — يشمل إغلاق الورديات وإنهاء الجلسات وإنشاء الوصفات وتغييرات المخزون، ولكل سطر تفاصيله الكاملة.
عشر صلاحيات مُسمّاة تُمنح لكل مستخدم: المخزن، والتقارير والمبيعات، والخزنة والماليات، والكافيتيريا، والمراقبة والجلسات، والخصم، وإعدادات النظام، وإدارة الورديات، وفريق العمل، والأجهزة والتسعير. والمدير كامل الصلاحية حالة مستقلة لا دور مؤشَّرة فيه كل الخانات.
الإعدادات العامة وقواعد الخصم وضبط الطباعة وإدارة البيانات، محفوظة خلف قسم إداري صريح بدل خلطها بشاشات التشغيل اليومية.
يرى كل محل باقته وطلبات اشتراكه وحالة وصوله — وهي الوجه المقابل لدى المستأجر لما تديره طبقة المنصة.
مشاكل صعبة، تم التعامل معها
أربع صور للتسعير على أرضية واحدة — الساعة سينجل، والساعة مالتي، والمباراة سينجل، والمباراة مالتي — إضافةً إلى الغرف التي تُحاسَب بسعر فتح ثم بسعر لكل شخص. واختيار الصورة الخاطئة يعني فاتورة خاطئة.
نُقل استخراج السعر من الواجهة إلى قاعدة واحدة على الخادم تأخذ الجهاز وطريقة الحساب ونمط اللعب وتعيد سعرًا واحدًا. ويرى الكاشير هذا السعر قبل التأكيد، ثم يُكتب على الجلسة فلا يحتاج أي شيء بعدها إلى إعادة استخراجه.
تعديل سعر جهاز كان يعيد كتابة التاريخ بصمت: تتغير معه فواتير الأمس وتقارير الشهر الماضي، فلا يمكن الوثوق بأي تقرير مرتين.
صارت الأسعار تُلتقط على السجلات التي سعّرتها. فتغيير السعر يسري على الجلسة التالية فقط، ويحتفظ كل جهاز بسجل أسعار ظاهر بحيث يمكن تفسير رقم قديم بدل الجدال حوله.
الكاونتر المزدحم يرسل الطلب مرتين. وإعادة المحاولات والضغطات المتعجّلة كانت تنتج فواتير مكررة يجب البحث عنها وإلغاؤها يدويًا.
أصبح إرسال الطلب idempotent. فالطلب المكرر الحامل للمفتاح نفسه ينتهي إلى الفاتورة القائمة، وبذلك يصبح إنشاء المكرر مستحيلًا بدل تنظيفه بعد وقوعه.
مقاصّة رصيد العميل مع مديونيته في رقم واحد كانت تخفي أموالًا حقيقية. فعميلان بالرقم الصافي نفسه قد يكونان في وضعين مختلفين تمامًا.
الرصيد والمديونية سجلان منفصلان لا يُدمجان. وتجري التسوية بنظام الأقدم أولًا، فتُنسب كل دفعة جزئية إلى مستحقات بعينها بدل أن تختفي داخل إجمالي.
الجلسات تنتقل بين الأجهزة أثناء اللعب، وبعضها ينتهي مدموجًا. وإعادة التسعير عند الوجهة أو إصدار فاتورتين لنفس اللعب كانت تنتج مبالغ لم يوافق عليها العميل أصلًا.
النقل يحمل الوقت المنقضي والسعر المتفق عليه بدل إعادة التسعير، والدمج ينتج فاتورة واحدة تظل تسجّل مصدر كل جزء فيها — فاتورة واحدة، بمرجعية سليمة.
محرك مكافآت يسمح بالاكتساب من قيمة مستهلكة سيتضاعف بلا نهاية، وعرض يُطبَّق على مباراة ثابتة السعر سيعيد كتابة سعر متفق عليه.
أُعطي المحركان حدودًا صارمة بدل شروط حماية متناثرة في الشيفرة: المكافآت تُكتسب من الوقت المدفوع فقط وتُستهلك داخل الجلسة، والعروض تنطبق على السياقات المسعّرة بالساعة فقط. وكل حدّ منها مكتوب على الشاشة التي تُضبط فيها القاعدة.
كانت الجلسات والمبيعات تُسجَّل خارج أي وردية، ما يجعل مطابقة الدرج في نهاية اليوم مستحيلة.
صارت الوردية شرطًا مسبقًا صارمًا لا وسيلة تقارير. فمع عدم وجود وردية مفتوحة تعرض شاشات التشغيل والكافيتيريا حالة منع صريحة بدل السماح بعمل لن يجد لاحقًا ما ينتمي إليه.
بيع النظام لعدة محلات حوّل كل فترة تجريبية وتجديد وطلب دعم إلى عمل يدوي، ولم تكن المشكلات داخل المحلات تُكتشف إلا حين يشتكي أحدهم.
بُنيت طبقة منصة فوق المستأجرين: الباقات والأسعار، ودورة حياة الاشتراك والفترة التجريبية، وحالات الوصول، والدخول باسم المحل للدعم، والإعلانات العامة، ومركز تنبيهات يرصد الحالات الشاذة مثل الورديات المفتوحة لأيام قبل أن يضطر أحد للإبلاغ عنها.
مبني ليظل سريعاً
التصميم والتفاعل
جاهز للإطلاق والتشغيل
ما الذي يفعله
الأجهزة مصنّفة — أجهزة ألعاب، ووحدات ترفيه، وترابيزات، وغرف — ولكل منها قائمة أسعار خاصة بدل وراثة سعر عام. ويمكن أيضًا وسم جهاز بأنه للكافيتيريا فقط، أي يستقبل الطلبات ولا يُحاسَب على الوقت إطلاقًا، وهو ما يلغي فئة كاملة من رسوم الوقت غير المقصودة.
أربع صور للتسعير تتعايش على أرضية واحدة: الساعة سينجل، والساعة مالتي، والمباراة سينجل، والمباراة مالتي، إضافةً إلى الغرف التي تُحاسَب بسعر فتح ثم بسعر لكل شخص. ويُستخرج السعر من الجهاز ومن النمط المختار لحظة فتح الجلسة، ويُعرض على الكاشير قبل التأكيد، ثم يُكتب على الجلسة حتى لا يعيد أي تغيير لاحق كتابته.
يمكن نقل الجلسة إلى جهاز آخر أو دمجها في جلسة أخرى أثناء اللعب. والنقل يحمل معه الوقت المنقضي والسعر المتفق عليه بدل إعادة التسعير عند الوجهة، والدمج يجمع الاستهلاك دون إصدار فاتورتين عن اللعب نفسه — والنتيجة فاتورة واحدة تظل تشرح من أين جاء كل جزء فيها.
تُربط الطلبات بجلسة جارية أو تقف وحدها كبيع سريع. والإرسال idempotent: الطلب المُعاد أو المضغوط مرتين ينتهي إلى الفاتورة نفسها لا إلى فاتورة ثانية، وهذا تحديدًا ما يمنع الكاونتر المزدحم من التحصيل مرتين بصمت.
الأصناف الجاهزة والمواد الخام مخزونان منفصلان بشاشتَي نواقص منفصلتين، لأن نفاد صنف قابل للبيع ونفاد مكوّن خام مشكلتان تشغيليتان مختلفتان تحتاجان تنبيهين مختلفين.
يمكن تعريف الصنف عبر وصفة على المواد الخام. وبيعه يخصم مكوّناته ويشتقّ تكلفته منها، فيكون الهامش المعروض بجوار السعر رقمًا محسوبًا — وحين تتجاوز التكلفة السعر يُعرض الهامش السالب كما هو بدل تثبيته على صفر.
العملاء سجلات أساسية ترتبط بها الجلسات والطلبات والمدفوعات، فيصبح تاريخ العميل الدائم خطًا زمنيًا واحدًا لا إيصالات متفرقة. ويمكن أيضًا تشغيل جلسة لضيف، فيبقى المسار السريع سريعًا.
الرصيد والمديونية سجلان مستقلان على العميل نفسه ولا يُدمجان أبدًا في رقم واحد. وتُسوّى المديونية بنظام الأقدم أولًا، بحيث تُنسب كل دفعة جزئية إلى مستحقات بعينها بدل أن تذوب في إجمالي غامض.
يمكن تسوية الفاتورة الواحدة من أكثر من مصدر في آنٍ واحد — نقدًا، ومن رصيد العميل، ويُترك الباقي مديونية. ويُسجَّل كل جزء كحركة مستقلة، وهذا ما يبقي الخزينة ورصيد العميل والمديونية القائمة صحيحة جميعًا بعد الدفع المجزّأ.
تبدأ الوردية برصيد افتتاحي معلن وتصبح الوعاء الذي ينتمي إليه كل جلسة وبيع ومصروف بعدها. وما لم تكن هناك وردية مفتوحة ترفض شاشات التشغيل والكافيتيريا إتمام أي عملية. ويقارن الإغلاق المتوقّع بالمعدود ويحفظ الفرق ضمن سجل الوردية.
الإيداعات والمسحوبات سجل واحد بصافٍ متجدد، ويمكن نسبتها إلى الموظف والنوع والتاريخ. وبذلك تصبح حركة النقد قابلة للتفسير بعد وقوعها بدل استنتاجها من رصيد الإقفال.
تطبّق العروض تخفيضًا أو سعرًا ثابتًا للساعة، وعلى السياقات المسعّرة بالساعة فقط. أما التسعير بالمباراة فمستثنى عمدًا حتى لا يغيّر أي عرض سعر مباراة ثابتًا بصمت — وهو حدّ تقوله الواجهة صراحةً بدل تركه في التوثيق.
تتراكم المكافآت من الوقت المدفوع فقط وتُستهلك داخل الجلسة نفسها. وكلا الشقين مهم: الاكتساب من الوقت المدفوع وحده يمنع الوقت المجاني من توليد قيمة، والاستهلاك داخل الجلسة يمنع المكافأة من أن تكسب مكافأة أخرى.
لماذا اخترنا ما اخترناه
Server Actions بدل واجهة REST عامة.
التحقق وفحص الصلاحيات والمعاملة تنتمي بعضها إلى بعض. وإبقاؤها في مسار واحد على الخادم يلغي المدخل الثاني الأضعف الذي كان سيخلقه سطح API منفصل، ولا يترك على العميل رمزًا قابلًا لإعادة الاستخدام.
فرض العزلة في طبقة البيانات لا في الواجهة.
الفلتر الذي يعيش داخل مكوّن واجهة يبعد إعادة هيكلة واحدة عن الضياع. واستخراج مفتاح المحل من الجلسة في كل استعلام يجعل غياب النطاق فشلًا على الخادم لا قراءة صامتة عبر المستأجرين.
التقاط الأسعار على السجلات التي سعّرتها.
التقرير الذي يتغير حين يعدّل أحدهم سعرًا ليس تقريرًا. والالتقاط يجعل التاريخ ثابتًا ويجعل تغيير الأسعار آمنًا أثناء ساعات العمل.
إبقاء الرصيد والمديونية سجلين منفصلين.
المقاصّة بينهما تتلف معلومات يحتاجها المحل فعلًا. وسجلان مع تسوية بالأقدم أولًا يعنيان أن كل دفعة يمكن تتبّعها إلى المستحقات التي سدّدتها.
جعل الوردية شرطًا مسبقًا لا تقريرًا.
إن أمكن وجود مبيعات خارج وردية صارت المطابقة تخمينًا. وربط التحصيل بوردية مفتوحة يجعل الدرج قابلًا للتفسير دائمًا.
تحديد محركي العروض والمكافآت بقاعدة لا بترقيع.
قصر العروض على السياقات المسعّرة بالساعة، وقصر المكافآت على الوقت المدفوع مع الاستهلاك داخل الجلسة، حدود ضيقة بما يكفي للتفكير فيها. أما المحرك الأكثر تساهلًا فكان سيحتاج حراسًا ضد التكرار وسيظل يفاجئ الناس عند الكاونتر.
فصل طبقة المنصة عن تطبيق المستأجر.
إدارة الاشتراكات عمل مختلف وجمهوره مختلف. وبناؤها كسطح مستقل يبقي أدوات المشغّل خارج منتج المحل، ويبقي الدخول باسم المحل فعلًا صريحًا قابلًا للتدقيق.
النتائج
دراسات حالة أخرى
تبني شيئاً مشابهاً؟
هيا نحدد نطاق منصتك — لوحة تحكم وتطبيقات موبايل و APIs والمنصة كاملة.

