منصة العمليات المتكاملة
لنادي اليخوت الملكي الأردني — العقبة

عرض تقديمي فني للمناقصة

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

عربي RTL + English LTR 12 دوراً وظيفياً 113 مفتاح صلاحية 55 شاشة 284 اختباراً آلياً يعمل على الهاتف والحاسوب
آب 2026 — نسخة العرض التقييمية
العلامة أعلاه شعار مؤقت مولَّد — يحل محله شعار النادي الرسمي فور تسليمه.
1

الملخص التنفيذي

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

55شاشة عاملة
12دوراً وظيفياً
113مفتاح صلاحية في 15 فئة
74جدول قاعدة بيانات
284اختبار وحدة آلياً
6حزم تحقق بمتصفح حقيقي
2لغتان كاملتان RTL/LTR
3سجلات محمية بمشغّل في القاعدة

المبدأ الحاكم: الصدق قبل الاكتمال

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

2

أربعة جماهير، منصة واحدة

الإدارة والموظفون

بوابة داخلية كاملة للتشغيل اليومي:

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

أمن البوابة

دورة زائر كاملة من الإصدار إلى الخروج:

  • بطاقة زائر برمز QR سري + رمز احتياطي مطبوع
  • ماسح يعمل بكاميرا الهاتف دون تطبيق يُثبَّت
  • لوحة بوابة حية: من بالداخل الآن، ومن تأخر
  • بلاغات أمنية لا يُعدَّل نصها بعد التسجيل

الجمهور والزوار

واجهة النادي أمام العالم:

  • موقع عام بالعربية والإنجليزية، سريع وعلى الهاتف أولاً
  • دليل مطاعم وقائمة رقمية تُمسح من الطاولة
  • صفحة بطاقة ذاتية للزائر — «اعرض هذه الصفحة عند البوابة.»
  • فعاليات وخدمات ونموذج تواصل محمي

المستأجرون

لكل مطعم أو محل بوابته الخاصة:

  • مدير المستأجر يرى منشأته وحدها — والعزل في SQL نفسه
  • محرر قائمة طعام ثنائي اللغة بأسعار بالفلس
  • إيقاف صنف أثناء الخدمة يخفيه عن الضيوف فوراً
  • بطاقة QR للطاولات جاهزة للطباعة بمقاس A6
3

الموقع العام والقوائم الرقمية

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

/ar
الصفحة الرئيسية للموقع العام بالعربية
الصفحة الرئيسية بالعربية: مقدمة النادي، أرقام حية من قاعدة البيانات (7 وجهات ضيافة، منها 4 مطاعم ومقهيان)، وبطاقات المنشآت — وشريط «نسخة معاينة» الصادق أعلى الصفحة حتى يعتمد النادي المحتوى.
/ar/dining
دليل المطاعم والمقاهي
دليل الضيافة بتصفية حسب التصنيف عبر روابط قابلة للمشاركة — تعمل حتى قبل تحميل JavaScript.
/ar/menu/romero
القائمة الرقمية لمطعم روميرو
القائمة الرقمية على هاتف الضيف: بحث فوري بالعربية والإنجليزية، تبويب أقسام، شارات غذائية — وتحذير «قائمة تجريبية — غير رسمية» على كل قائمة لم يعتمدها النادي بعد.
/en
الصفحة الرئيسية بالإنجليزية
الموقع نفسه بالإنجليزية باتجاه يسار-يمين — لغتان كاملتان ببنية قاموس واحدة تفرض تطابق المفاتيح بينهما، لا ترجمة آلية.
/ar — 430px
الموقع على شاشة هاتف
مبنيّ للهاتف أولاً — الجمهور الفعلي يتصفح من جواله.

هندسة تفصح عن نفسها

  • لا «احتياطي» يكذب: أزيل عمداً أي رجوع لبيانات مضمّنة في الشيفرة عند تعطل قاعدة البيانات — كان سيعيد نشر مستأجرٍ غادر وقوائمَ أُطفئت. الخطأ يظهر خطأً، والفراغ يظهر فراغاً حقيقياً.
  • استعلامات العرض العام للمطاعم والقوائم معزولة في وحدتين مستقلتين بقوائم أعمدة صريحة — لا select * — فعمود داخلي يُضاف لاحقاً (إيجار مستأجر، ملاحظة إدارية) لا يمكن أن يتسرب لصفحة عامة سهواً.
  • المعلومة غير المؤكدة تقول ذلك: «ساعات العمل غير مؤكدة بعد» بدل ساعات مخمَّنة يضيع بسببها زائر حقيقي.
4

أمن البوابة والزوار

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

/ar/visitors/…/print
صفحة طباعة بطاقة الزائر مع رمز QR
شارة الزائر لحظة الإصدار: رمز QR سري، رمز احتياطي من 12 خانة للإدخال اليدوي، نافذة الصلاحية — وأسفل الشاشة إقرار التقليل من البيانات: «نجمع الاسم ووسيلة تواصل وسبب الزيارة فقط. لا نسجّل رقم هوية ولا تاريخ ميلاد ولا عنواناً.»
/ar/gate
لوحة البوابة
لوحة البوابة: «داخل النادي الآن»، دخول وخروج اليوم، بطاقات اليوم، بلاغات مفتوحة، وقائمة من تجاوز وقت مغادرته — والواجهة نفسها تقول: «الأرقام محسوبة من سجل المسح، لا من تقدير».
/ar/scan — 430px
شاشة مسح البطاقات على الهاتف
الماسح على هاتف الحارس: الإدخال اليدوي بطاقة دائمة لا خياراً مخفياً، وحين لا يدعم المتصفح قراءة الرموز بالكاميرا تقولها الشاشة نصاً وتُبقي الطريق اليدوي مفتوحاً — وفي سجل المحاولات الظاهر محاولةٌ مرفوضة («رمز غير معروف») مسجَّلة ككل محاولة.
/ar/visitors
سجل الزوار والبطاقات
شاشة الزوار: نموذج «بطاقة زائر جديدة» ببيانات دنيا — الاسم والهاتف وصفة الزائر والوجهة ونافذة الصلاحية — وعدّاد السجل في الترويسة، ومن هذه الشاشة أيضاً الإلغاء والحظر بأسباب مكتوبة تبقى على السجل. (كل أسماء الزوار في قاعدة العرض بيانات تجريبية.)

لماذا هذا التصميم صعب التزوير؟

  • رمز QR لا يُخزَّن أبداً: 256 بت من مولّد عشوائي مشفَّر، وقاعدة البيانات تحفظ بصمته SHA-256 فقط. تسريب كامل لجدول البطاقات لا يُنتج رمز QR صالحاً واحداً، والرمز لا يحمل اسماً ولا هوية — صورة شاشة لبطاقة لا تكشف شيئاً عن غيرها.
  • الرمز الاحتياطي أضعف عمداً (12 خانة تُقرأ تحت إضاءة ضعيفة، ويُخزَّن للمطابقة اليدوية) فيُحرَس بما يليق بذلك: كبح 40 محاولة كل 5 دقائق، وتسجيل كل محاولة — ومحاولات التخمين المرفوضة تُكتب في السجل أيضاً، فمن يقرأ السجل يرى نمط الضغط.
  • الإلغاء يتقدم على كل شيء: صلاحية البطاقة تُحسب لحظة كل مسح من الطوابع الزمنية — لا عمود حالة قديم يمكن أن يكذب. ومن انتهت بطاقته وهو بالداخل يبقى «بالداخل» في عدّ الحضور، لأن العدّ مبني لسيناريو الإخلاء لا للأوراق.
  • البلاغ الأمني دليل: نصه لا يُعدَّل بعد التسجيل، والإغلاق إضافة موقَّعة بوقتها وصاحبها لا استبدال.
  • رمز الطباعة يُسلَّم بكوكي مؤقتة (5 دقائق، مقيدة بمسار صفحة الطباعة) لا عبر عنوان URL — لأن العناوين تبقى في تاريخ المتصفحات وسجلات الوسطاء.
قرار متروك للنادي، معلَن لا مخفي: لا يوجد «طابور مسح» يعمل دون اتصال — مسحٌ سُجِّل قبل إلغاء بطاقة ورُفع بعده كان سيُدخل شخصاً استبعده النادي بالفعل. عند انقطاع الشبكة توجّه الشاشة الحارس إلى إجراء البوابة اليدوي والتسجيل الورقي، وبناء الطابور قرار تتخذه الإدارة بقاعدة صريحة لمصير المسح الذي تغيّرت بطاقته.
5

الموارد البشرية

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

/ar/employees
سجل الموظفين
سجل الموظفين: بحث بالاسم أو الرقم الوظيفي، تصفية بالقسم والحالة، وخيارات التصفية محفوظة في الرابط فتُشارَك كما هي. (الأسماء بيانات عرض مختلقة بالكامل — 48 موظفاً وهمياً.)
/ar/attendance
شاشة الحضور والانصراف
بطاقة البصمة بساعة حية على هاتف الموظف، وملخص شهري: أيام، ساعات، تأخير، وعمل إضافي.
/ar/schedules
جداول الورديات
جدول ورديات شهري: صف لكل موظف وعمود لكل يوم، مع «نسخ أسبوع» حتى 12 أسبوعاً لا يمس الاستثناءات الموضوعة عمداً.
/ar/leave
شاشة الإجازات
الإجازات: بطاقات أرصدة الموظف وطلبه القائم — الأيام تُحجز من الرصيد فور التقديم، وتُحرَّر عند الرفض.
/ar/schedule
جدولي الشخصي
«جدولي» للموظف: تقويم شهري ملوّن يجيب سؤاله الحقيقي — أيُّ أيامي راحةٌ في الأسبوع القادم؟

قرارات تصميم تحمي الموظف والنادي معاً

  • البصمة لا تُرفض بسبب GPS: خارج النطاق، دقة ضعيفة، موقع مشتبه — كلها تُسجَّل وتُعلَّم «لمراجعة الموارد البشرية» بدل حرمان موظف من إثبات دوامه بسبب خلل تقني.
  • الخصوصية قيد معماري: الموقع يُقرأ مرة واحدة عند البصمة فقط — لا تتبّع مستمراً، ولا جدول تاريخ مواقع أصلاً في قاعدة البيانات.
  • أرصدة لا تنحرف: الحجز عند التقديم والتحرير عند الرفض والاستهلاك عند الاعتماد — داخل معاملة واحدة، فلا يُصرف اليوم الواحد مرتين. ونموذج الطلب يحسب قبل الإرسال عدد أيام العمل التي ستُخصم — بدالة الخادم نفسها، فلا يفاجأ الموظف برصيده.
  • لا أحد يعتمد طلبه بنفسه — حتى مدير النظام: فحص صريح في الخادم لا مجرد زر مخفي.
  • حسابات «يوم الراتب» دوال نقية مختبرة: نحو 60 اختبار وحدة تغطيها — الوردية الليلية 23:00–07:00 تساوي 480 دقيقة لا رقماً سالباً، والحساب بتوقيت عمّان أينما كان الخادم.
  • الجدول يفرّق بين «راحة» مقصودة ويوم «لم يُسنَد»: الفراغ فجوة مرئية تطالِب بملئها، لا افتراض صامت بأن الموظف مرتاح.
بانتظار النادي: إحداثيات النطاق الجغرافي — وحتى إدخالها يقول النظام للموظف نصاً: «لم تُضبط إحداثيات النادي بعد، لذلك لا يُتحقَّق من الموقع» بدل أن يعلّم بصمات صادقة بأنها «خارج النطاق». وأسبوع العمل واستحقاقات الإجازات قيم انطلاق من حدود قانون العمل الأردني الدنيا، معلَّمة في النظام بأنها افتراض مبدئي يجب تأكيده من إدارة النادي.
6

الرواتب والطلبات والوثائق

محرك رواتب بالدينار الأردني يحسب بالفلس الصحيح (1 دينار = 1000 فلس) — كل الجمع بأعداد صحيحة ولا تراكم لكسور عائمة، وكشف يمرّ إلزامياً بخمس مراحل توقيع لكلٍّ منها صلاحية مستقلة — والقاعدة معلنة على الشاشة نفسها: «من يُعدّ الكشف لا يعتمده، ومن يعتمده لا يؤكّد صرفه».

/ar/payroll/…
تفاصيل كشف رواتب
كشف رواتب على سلّم التواقيع: إعداد ← مراجعة الموارد البشرية ← مراجعة المحاسبة ← اعتماد ← تأكيد الصرف، بطابع زمني لكل مرحلة. (الأرقام الظاهرة رواتب عرض وهمية.)
/ar/payroll
قائمة كشوف الرواتب
كشوف الرواتب الشهرية وحالة كل منها في السلّم.
/ar/requests
مركز الطلبات
مركز الطلبات: 9 أنواع — سلفة، شهادة راتب، شهادة عمل، شكوى، عهدة، تبديل وردية وغيرها — ولكل نوع مسار اعتماد يُقرأ من قاعدة البيانات بوصفه بيانات لا كوداً.

لماذا تصمد هذه الأرقام أمام التدقيق؟

  • سلّم الاعتماد جدول بيانات لا سلسلة شروط: كل انتقال قانوني سطر يسمّي الحالة والصلاحية الوحيدة التي تجيزه. لا مسار يقفز درجة، وأي «اختصار» مستقبلي يستلزم تعديل ما يشبه وثيقة سياسة.
  • بعد توقيع المحاسبة يُقفل الكشف: كل مسارات الكتابة تُرفض، وما بقي هو تسوية تُسجَّل في طبقة الخدمة بسبب مكتوب ولا تُعتمد ذاتياً (واجهتها الإدارية ضمن أعمال التسليم) — الرقم الأصلي وسبب تغييره حقيقتان دائمتان.
  • الكشف الذي يحوي صافياً سالباً لا يصعد السلّم: النظام يرفض الترقية بدل «تصفير» صامت — الصافي السالب مشكلة على إنسان أن يحلّها.
  • القسيمة وثيقة تاريخية مجمّدة: الاسم والقسم والمسمى وآخر 4 أرقام من الآيبان تُلتقط لحظة الإصدار — قسيمة آذار تُقرأ كما صدرت ولو نُقل الموظف.
  • النشر قرار مستقل عن الاعتماد: الاعتماد يقرر صحة الأرقام، والنشر يقرر متى يقرؤها الموظفون — والتصفية داخل SQL نفسه فلا يتسرب رقم مسودة.
  • وثائق الموظفين في مخزن خاص: عقود وهويات تُفتح برابط موقَّع ينتهي خلال 5 دقائق، ونوع الملف يُفحص من بايتاته لا من امتداده — ملف PHP مسمّى PDF يُرفض.
الصدق المبرمَج في المال: معاملات العمل الإضافي المزروعة (1.25 / 1.5) موسومة في النظام بأنها بانتظار اعتماد الإدارة، ومحرك الرواتب يقرأ هذا الوسم فعلياً ويرفض تسعير دقيقة واحدة بمعامل لم تعتمده الإدارة — تبقى الدقائق موثَّقة على القسيمة للتسعير بأثر رجعي. ونِسَب الضمان الاجتماعي غير مُدخلة (بذرتها معطَّلة بانتظار أرقام النادي) ولا يوجد بعدُ أي إعداد لضريبة الدخل — فلا يُحتسب أي استقطاع منهما اليوم، وبناء بنودهما بأرقام النادي المعتمدة من أعمال ما قبل الانطلاق.
7

المستأجرون والمنشآت والقوائم الرقمية

سجل مستأجرين بعقود إيجار تُراقَب آلياً (تنبيه قبل 60 يوماً من الانتهاء)، ومنشآت تُدار كلياً من لوحة التحكم — عند تبدّل مستأجر تُعاد تسمية المنشأة وإسنادها في اليوم نفسه دون مبرمج — وقوائم طعام رقمية يحرّرها كل مستأجر لمنشأته وحدها.

/ar/tenants
سجل المستأجرين
دليل المستأجرين: الرمز والاسم القانوني والحالة والمنشآت وعقود الإيجار وتاريخ الانتهاء ومسؤول الحساب، ولوحة «عقود تقترب من الانتهاء» أعلى الدليل — وفي ملف كل مستأجر رخصة المهن والرقم الضريبي وجهة الاتصال.
/ar/outlets — مدير مستأجر
شاشة المنشآت كما يراها مدير مستأجر
الشاشة نفسها بعين مدير المستأجر: منشأته وحدها. العزل ليس تصفية واجهة بل شرط SQL — السطر خارج نطاقه لا يغادر قاعدة البيانات أصلاً.
/ar/outlets/…/menu
محرر القائمة الرقمية
محرر القائمة: أقسام بنوافذ توفّر زمنية، أصناف بالعربية والإنجليزية بسعر بالفلس، وزر «إيقاف/إتاحة» بلمسة يخفي الصنف من صفحة الضيوف فوراً أثناء الخدمة.
/ar/outlets/…/qr
بطاقة QR للمنشأة
بطاقة QR للطباعة بمقاس A6 تناسب حوامل الطاولات، باسم المنشأة بالخطّين والرابط المكتوب لمن لا يستطيع المسح — والرمز محايد اللغة: يفتح لكل ضيف بلغة متصفحه هو. (المضيف الظاهر هو مضيف بيئة العرض؛ يُبنى الرابط تلقائياً من نطاق النشر الفعلي.)

عزلٌ يصمد أمام الحِيَل

  • يفشل مغلقاً: مدير مستأجر لم يُضبط نطاقه يرى صفر منشآت لا كلَّها، والفرق بين «لا نطاق» و«كل النطاقات» منصوص عليه ومُختبَر.
  • «مشية الملكية» قبل كل كتابة: معرّف الصنف يُربط صعوداً حتى سطر المنشأة في قاعدة البيانات — لا يستطيع مستأجر تعديل أسعار منافسه بلصق معرّف في حقل مخفي.
  • المنشأة خارج النطاق تُجاب بـ404 لا 403 — حتى لا يتحول شريط العنوان إلى أداة لتعداد منشآت النادي.
  • البيانات المالية لا تُقرأ أصلاً: قيمة الإيجار والتأمين لا تُنتقى أعمدتها من قاعدة البيانات لمن لا يملك الصلاحية المالية — والشاشة تقول «البيانات المالية محجوبة» بدل شرطات موحية.
  • السعر يُفحص شكلاً: «12,500» تُرفض بدل أن تتحول صامتة إلى صفر ينشر طبقاً مجانياً، و«السعر قبل العرض» يُرفض إن لم يكن أعلى من السعر الحالي.
  • نزع صفة «تجريبية» عن قائمة فعلُ نشرٍ محجوز للنادي وحده — المستأجر لا يعلن قائمته رسمية بنفسه.
8

المالية والصيانة والتقارير

مصروفات بسلّم اعتماد وقاعدة العيون الأربع، مورّدون ومستحقات مستأجرين بتحصيل لا يقبل تجاوز المتبقي، تذاكر صيانة بسجل زمني لا يُعدَّل، وسبعة تقارير كلها مجاميع SQL على السجلات الفعلية — كل تقرير يطبع تحته «محسوب من» بأسماء الجداول التي قرأها.

/ar/finance
شاشة المصروفات
المصروفات: مسودة ← تقديم ← اعتماد ← تأكيد دفع — لكل درجة صلاحية مستقلة، ومن يقدّم المصروف لا يعتمده.
/ar/maintenance
تذاكر الصيانة
الصيانة: أي موظف مخوَّل يفتح تذكرة، وإنهاء العمل يشترط كتابة «ما تم عمله»، والمصروف يُربط بالتذكرة التي سبّبته.
/ar/reports
شاشة التقارير
سبعة تقارير جاهزة: الحضور، أرصدة الإجازات، ملخص الرواتب، حركة الزوار، الصيانة، المصروفات، مستحقات المستأجرين — مع تصدير Excel بورقة عربية من اليمين لليسار.

مالٌ لا يتحرك بتوقيع واحد

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

إدارة المحتوى والموقع

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

/ar/content/events
إدارة الفعاليات
الفعاليات: فعالية منشورة وأخرى مسودة — لكل فعالية حالة (مسودة/منشورة/ملغاة/انتهت) ومستوى ظهور يُضبطان من النموذج، ولا يصل للموقع العام إلا المنشور والعام؛ والقاعدة في الاستعلام لا في الواجهة.

محرر صفحات بثلاث حالات صادقة

كل كتلة نص: لم تُحرَّر (يعرض الموقع النص المرفق)، محرَّرة ومنشورة، أو محرَّرة وغير منشورة — فلا يظن محرِّر أن حفظه نُشر وهو لم يُنشر. و«العودة للنص الأصلي» تحفظ النص المحذوف كاملاً في سجل التدقيق.

خدمات بلا أسعار مخترعة

الخدمة بلا سعر معتمد يُعرض مكان سعرها «السعر عند الطلب»، والتلميح في المحرر يقول نصاً: «اتركه فارغاً ما لم يكن سعراً حالياً معتمداً. لن يُعرض سعر غير مؤكد.»

نموذج تواصل محمي بمكبحين

5 رسائل كل 10 دقائق لكل مرسل، وسقف كلي 60 لا يعتمد على أي ترويسة — من يزوّر عنوانه ليجدد حصته يصطدم بالسقف الكلي الذي لا يتجدد بتبديل العناوين. ورسالة بلا وسيلة رد تُرفض من الأساس.

صندوق رسائل بخصوصية مبنية

لا يُخزَّن عن المرسل إلا ما كتبه — لا IP ولا بصمة جهاز؛ الجدول لا يملك أعمدة لها أصلاً. والصندوق يصارح الموظف: «الردّ يتم خارج النظام عبر البريد أو الهاتف. لا يرسل النظام رسائل نيابة عنك.»

10

الإعدادات ومعالج الإعداد

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

/ar/settings/setup
معالج إعداد النادي
معالج الإعداد من ست خطوات: بيانات التواصل، النطاق الجغرافي، أسبوع العمل، معاملات الإضافي، الضمان الاجتماعي، وأسماء البوابات — وما لم يُدخَل يبقى موسوماً «بانتظار الإدخال».

معالجٌ لا يدّعي

  • شارة «بانتظار الإدخال» تُحسب من القيم نفسها عند كل حفظ ولا تُقرأ من الطلب — لا يمكن لسكربت أن «يقفل» خطوة لم يعتمدها إنسان، وخطوة البوابات تحديداً لا تكتمل إلا بسطر تدقيق يثبت أن بشراً عدّلها.
  • الضغط على «إنهاء الإعداد لاحقاً» يغلق المعالج فقط — ما لم يُدخل يبقى ناقصاً معلناً، ويُستكمل لاحقاً من الشاشة نفسها.
11

الأدوار والصلاحيات

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

الدورحساب العرضالصلاحيات (من 113)أبرز ما يصل إليه
مدير النظامsuperadmin.demo@royalyachtclub.jo
113
كل الوحدات — ومع ذلك لا يستطيع اعتماد كشف أعدّه بنفسه
مدير الناديgm@royalyachtclub.jo
50
يعتمد ولا يصرف — بلا مفاتيح الصرف والتنفيذ النهائي
مدير الموارد البشريةhr@royalyachtclub.jo
46
الموظفون والجداول والإجازات والرواتب — لا زوار ولا مستأجرين
مدير المحاسبةaccounting@royalyachtclub.jo
47
المالية والرواتب وعقود الإيجار — الوحيد الذي يسجّل العقود وقيمها
مدير الأمنsecurity@royalyachtclub.jo
37
الزوار والبوابة والمسح والبلاغات
مدير التشغيلoperations@royalyachtclub.jo
45
المنشآت والمستأجرون (دون المالية) والصيانة
مدقّقauditor@royalyachtclub.jo
28
اطلاع واسع للقراءة فقط — بلا مفتاح كتابة واحد
مدير قسمdept.security@royalyachtclub.jo
24
فريقه وقسمه في بيانات الموظفين والجداول — والنطاق يضيّق لا يوسّع
حارس أمنguard@royalyachtclub.jo
22
المسح واللوحة والزوار والبلاغات — وحدة إدارة الرواتب غائبة من قوائمه فعلاً (يرى قسيمته الشخصية فقط)
الاستقبالreception@royalyachtclub.jo
23
إصدار بطاقات الزوار ودليل المنشآت
موظفemployee@royalyachtclub.jo
13
حضوره وجدوله وطلباته وقسيمته — خدمة ذاتية فقط
مدير مطعم/محلtenant.mirwas@royalyachtclub.jo
8
منشأته وقائمتها ورمزها — ولا شيء غير ذلك
/ar/dashboard — مدير النظام
لوحة مدير النظام
لوحة مدير النظام بعد اكتمال المراحل: كل الوحدات في القائمة، وبطاقة «صلاحياتك» مفصَّلة بفئاتها — ومنها قُرئت أرقام الجدول أعلاه آلياً.
/ar/dashboard — موظف
لوحة موظف
اللوحة نفسها بعين موظف: خدمة ذاتية فقط — القوائم مشتقة من الصلاحيات، لا مرسومة يدوياً.

قواعد النموذج الأمني

  • الإغلاق عند الشك: دور مشروط بنطاق مُنح بلا نطاق = خامل تماماً؛ دور غير معروف = لا شيء؛ تفويض منتهٍ = لا شيء؛ حساب محظور لا يُحل إلى فاعل أصلاً.
  • البيانات الحساسة مفتاح مستقل: «عرض البيانات الحساسة» منفصل عن «عرض الموظفين» — مدير القسم يدير جداول فريقه دون أن يرى رواتبهم، والأعمدة المحجوبة لا تُقرأ من قاعدة البيانات أصلاً.
  • قرارات التخويل دوال نقية بلا استيراد لقاعدة بيانات أو إطار — تُختبر مباشرة («مدير مطعم لا يقرأ الرواتب») في 33 اختبار وحدة لطبقة السياسة وحدها.
  • الرفض استجابة 403 حقيقية على مستوى HTTP، لا صفحة اعتذار تحت 200 — لأن أدوات المراقبة تقرأ رمز الحالة لا نص الصفحة.
12

الحماية والأمن السيبراني

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

سطح REST العام مغلق مُتحقَّق آلياً

قاعدة البيانات السحابية تولّد تلقائياً واجهة REST فوق كل جدول. أُغلقت بطبقتين مستقلتين فوق الجداول الـ74 كلها: سحب امتيازات الجداول، وتفعيل أمن مستوى الصف بلا سياسات. طلب مجهول لأي جدول — الرواتب، الزوار، الموظفون — يعود HTTP 401. والأمر npm run db:health يفحص كل طبقة على حدة ويفشل بصوت عالٍ إن انزلقت إحداها.

لا تسجيل ذاتي، وجلسات قابلة للإلغاء فعلاً

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

كبح دخول بسجل دائم

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

مصادقة ثنائية للأدوار العليا

عامل ثانٍ TOTP مهيأ في الخادم: إضافة المصادقة الثنائية بجداولها قائمة، والتحقق مكبوح بخمس محاولات في الدقيقة، وعلم «يتطلب مصادقة ثنائية» مزروع لخمسة أدوار عليا (مدير النظام، مدير النادي، الموارد البشرية، المحاسبة، والمدقق). فرضُ العلم عند الدخول وشاشة التفعيل ضمن أعمال التسليم قبل الانطلاق — تُعرض هنا كقدرة خادم مهيأة، بصدق.

ثلاثة سجلات محمية بمشغّل في القاعدة

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

ثغرات وُجدت بالاختبار وأُغلقت — ووُثّقت

ترويسة مزوّرة كانت تُسكت سجل التدقيق (أُغلقت بمحلّل عناوين في ثلاثة مواضع)؛ عزل مستأجرين كان يفشل مفتوحاً لمن بلا نطاق (أُغلق وثُبّت بالاختبار)؛ و21 حاجز تحميل حوّلت كل رفض من 403 إلى 200 (أزيلت وكُتب اختبار يمنع عودتها). المنهج: الثغرة تُغلق، ويُكتب اختبار يمنع رجوعها، وتُوثَّق بلا تجميل.

حدّ معلَن لا مكتشَف: طبقة الإغلاق الثالثة لسطح REST (سحب USAGE على المخطط) بلا أثر فعلي لسبب بنيوي في Postgres — الوثيقة تقولها صراحة وتشرح السبب. الطبقتان العاملتان مستقلتان وكلتاهما قائمة، وإغلاق الثالثة قرار يُتخذ مع النادي في نافذة صيانة لأنه يمس أدوار الخدمة السحابية نفسها.
13

الجودة والتحقق

«يعمل عندي» ليست معياراً في هذا المشروع. المعيار: اختبارات آلية تثبت النتائج، وست حزم تحقق تقود متصفحاً حقيقياً بحسابات حقيقية عبر تسلسلات القبول كاملة — وتتأكد من رموز حالة HTTP لا من مجرد «الصفحة ظهرت».

284اختبار وحدة في 15 ملفاً
6حزم تحقق بمتصفح حقيقي
35اختباراً لوحدة الرموز وحدها
33اختباراً لطبقة السياسة الأمنية
0أخطاء lint / أخطاء أنواع
الحزمةما تثبته وهي تقود متصفحاً حقيقياً
verify:hrموظف يبصم من هاتفه، يقدّم إجازة، مديره يعتمدها — والرصيد يتحرك فعلاً.
verify:payrollسلّم الرواتب كاملاً بخمسة أشخاص مختلفين، وفصل المهام يمنع كل اختصار.
verify:securityالبطاقة الملغاة لا تفتح البوابة، والرمز السري لا يمرّ في عناوين بوابة الموظفين (تسليم الطباعة بكوكي مؤقتة).
verify:commercialمستأجر يُرفض عن منشأة غيره حتى بلصق المعرّف في الرابط مباشرة.
verify:contentالمسودة تعود 404 للجمهور، والمنشور يُقرأ بلا تسجيل دخول.
verify:opsالإضافي غير مسعّر قبل إقرار النادي، ومسعّر بالشريحة الصحيحة بعده.

انضباطٌ ظهر أثره

  • التحقق برمز الحالة اصطاد انحداراً حقيقياً: حواجز تحميل أُضيفت للأداء جعلت كل صفحة مرفوضة تعود 200 بدل 403 — الصفحة «تبدو» صحيحة في المتصفح، ورمز الحالة كشف الكذبة. أزيلت، وكُتب اختبار يفشل فور عودة واحدة منها.
  • اختبارات تكافؤ اللغتين: تطابق متغيرات الاستيفاء {days} بين العربية والإنجليزية، وعدم تسرب جملة لاتينية إلى نص عربي أو العكس — وكلا العيبين وُجد في عمل حقيقي قبل كتابة الاختبار.
  • الإتاحة (WCAG): رابط «تخطَّ إلى المحتوى» أول عنصر في كل صفحة، أزرار بحالات ARIA معلنة، وألوان عُتّمت حتى تجاوزت تباين AA — والتباين حُسب رياضياً لا بالنظر.
  • حتى عدّة التوثيق ممتنعة عن الكذب: سكربت التقاط الأدلة يرفض حفظ لقطة لم تجتز التحقق من أنها الشاشة الصحيحة، وأرقام الصلاحيات في هذا العرض قُرئت من الشاشات المعروضة فعلاً.
14

تطبيق يُثبَّت على الهاتف

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

تثبيت من المتصفح مباشرة

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

شاشة المسح تنجو من انقطاع الشبكة

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

وكل صفحة أخرى من الشبكة أولاً

لا تُخزَّن صفحات البيانات الحية — خطأ متصفح صريح خيرٌ من عرض قديم لرواتب أحدهم أو لبطاقة أُلغيت.

15

الصدق المعماري — ما ينتظر إدارة النادي

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

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

القواعد الدائمة التي بُنيت عليها المنصة

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

16

البنية التقنية

تقنيات حديثة مستقرة وواسعة الانتشار — لا خدمات خفية ولا تبعيات غامضة، وكل شيء في تطبيق واحد قابل للنقل بين مزوّدي الاستضافة.

الطبقةالتقنيةلماذا
الواجهة والخادمNext.js 16 + React 19 + TypeScript 5إطار واحد للموقع العام والبوابة، عرض من الخادم لسرعة الهاتف، وأنواع صارمة تمسك الخطأ قبل التشغيل.
قاعدة البياناتPostgreSQL 17 (Supabase) + Drizzle ORMقاعدة علائقية موثوقة بنسخ احتياطي مُدار، ومخطط بأنواع مفحوصة يطابق الكود دائماً.
الهوية والجلساتBetter Authجلسات في قاعدة البيانات قابلة للإلغاء الفوري، وعامل ثانٍ TOTP، وفصل صريح بين الهوية والتفويض.
الواجهاتTailwind CSS 4 + Radix UIنظام تصميم واحد يعمل يميناً ويساراً، ومكوّنات ميسَّرة الوصول مبنية على معايير ARIA.
الاختباراتVitest + Playwright284 اختبار وحدة، وست حزم تحقق تقود متصفحاً حقيقياً.
التقاريرExcelJSتصدير Excel بورقة عربية من اليمين لليسار وأرقام نصية دقيقة.
17

حسابات العرض والتقييم

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

خلاصة العرض

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