كل الأعمال ←

تأجير فساتين — تجزئة خدمية · منشور وشغّال

أتيليه ميار علاء

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

العميل
أتيليه ميار علاء — أتيليه حقيقي. الاسم والهوية البصرية ظاهرين بإذن صاحبته.
نوع النظام
نظام تشغيل داخلي على الويب، بدورين: أدمن وموظفة
أتيليه ميار علاء
1 / 6

نظام تشغيل داخلي عربي بالكامل لأتيليه تأجير فساتين، دورة حياة الحجز فيه مفروضة في قاعدة البيانات نفسها — مش في الواجهة ولا في الفورم. عشر شاشات على 13 صفحة و8 مسارات API، بدورين: أدمن وموظفة، والفرق بينهم مفروض على تلات طبقات آخرها سياسات الصلاحيات على مستوى الصف في القاعدة. الواجهة عربية وRTL بالكامل من غير زرار تبديل لغة، وشغّالة من تليفون 320px لحد الديسكتوب — نفس النظام، مش نسخة مصغّرة.

83,064
سطر إجمالاً تحت src/
70
ملف ترحيل SQL
21/21
جدول عليه صلاحيات على مستوى الصف
53
سياسة صلاحيات على مستوى الصف
5,711
نص عربي في 41 ملف نصوص
21
سكريبت تحقّق، 16 منهم سلوكي
226
commit في 9 أيام تقويمية
القطاع
تأجير فساتين — تجزئة خدمية
نوع النظام
نظام تشغيل داخلي على الويب، بدورين: أدمن وموظفة
التغطية
10 شاشات · 13 صفحة · 8 مسارات API
اللغة
عربي بس — الواجهة RTL بالكامل، ومفيش زرار تبديل لغة
الأجهزة
موبايل من 320px وديسكتوب — نفس النظام، مش نسخة مصغّرة
مدة التنفيذ
9 أيام تقويمية (22 → 30 يوليو 2026) · 226 commit
المستخدمات
4 — رقم منقول عن صاحب المشروع في 30 يوليو 2026، مش رقم مقيس
الموقع المنشور
mayar-atelier.vercel.app

المشكلة قبل النظام

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

اقرأ التفاصيلإخفاء التفاصيل10 نقطة
الحجز
فستان واحد وفترتين متداخلتين معناه عميلتين مستنيّين نفس القطعة في نفس اليوم. والمشكلة مش لحظة الحجز — هي بتظهر يوم التسليم.
الفلوس
«المدفوع» و«المتبقّي» رقمين بيتقالوا لعميلة على الباب. لو الرقم ده بيتكتب بالإيد في خانة، هو رأي مش حقيقة، وممكن يختلف عن سجل الدفعات من غير ما حد يلاحظ.
التأمين
التأمين بيتاخد وقت الحجز وبيرجع بعد الاستلام. أي لحظة الرقم فيها مش واضح — اترد ولا لسه — هي فلوس في الدرج ملهاش صاحب معروف.
المخزون
الفستان اللي رجع من تأجير محتاج تجهيز، والتجهيز ده مدة. فستان اتحجز لتاريخ هو لسه مش جاهز فيه = وعد مش هيتنفّذ.
الصلاحيات
أسعار شراء الفساتين ورواتب الفريق بيانات الموظفة مالهاش علاقة بيها. إخفاء الزرار من الشاشة مش حماية: الجهاز نفسه مشترك، وأدوات المطوّر مفتوحة لأي حد.
التتبّع
لما رقم يتغيّر ومحدش عارف مين غيّره، السؤال مبيتحلّش — بيتحوّل لشك بين ناس شغّالين مع بعض.
البحث
الاسم العربي بيتكتب بأكتر من شكل: ندا · ندى · ندي · فاطمة · فاطمه. بحث بيرجّع صفر نتايج بيخلّي الموظفة تفتح ملف جديد لعميلة موجودة — وبعد أسبوع يبقى فيه ملفين لنفس الشخص، والتاريخ والتأمينات متفرّقين عليهم.
انقطاع النت
الاستلام والتسليم بيحصلوا على الباب. لو الشبكة قطعت في اللحظة دي، العملية إما بتضيع أو بتتسجّل مرتين.
المعرفة
موظفة جديدة محتاجة تعرف يعني إيه كل حالة وكل خانة. الدليل اللي بيقدّم مع الشاشات أسوأ من مفيش دليل: بيوجّهها لحاجة مش موجودة وهي واثقة إنها بتقرا المصدر الرسمي.
النسخة الاحتياطية
خطة الاستضافة الحالية للقاعدة بتقول pitr_enabled: false و backups: [] — يعني مفيش أي نسخة تلقائية للقاعدة على الإطلاق.

المدخل والقلب التشغيلي

اقرأ التفاصيلإخفاء التفاصيل

قبل أول سطر كود، حدّدنا إيه اللي مش هيتعمل. القرارات دي أخدناها قبل التنفيذ وكتبناها في README.md قسم 7، وكل واحد منهم بيشيل ميزة من النظام — والمكسب إن اللي فاضل بيشتغل صح.

مفيش صور للفساتين — الفستان بيتعرف بكوده (DR-101) وبس. ومفيش مرحلة وسيطة بعد الاستلام: السؤال الوحيد وقت الاستلام «هيبقى متاح للتأجير تاني إمتى؟» والجواب بيتخزّن في available_from وبيدخل في فحص الحجز.

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

الحضور باعتماد الأدمن، من غير أي تتبّع موقع. والدخول برقم الموبايل: كلمة «إيميل» مش موجودة في أي شاشة، والرقم بيتحوّل لمعرّف داخلي على نطاق .invalid المحجوز في RFC 2606. والمقاسات التفصيلية بس — المقاس النصّي (40) والمحيطات بالسنتيمتر كانوا وصفين لنفس الحاجة وبيتناقضوا، فالنصّي اتشال (ترحيل 0057). والنسخة الاحتياطية يدوية: ملف إكسل الأدمن بينزّله لما تحب.

اللي بيخلّي ده نظام مش مجموعة فورمات هو تدفّق واحد مفروض، مش متروك للواجهة. دورة حياة الحجز: محجوز ← متسلّم ← مستلم، والإلغاء من «محجوز» بس. تلات انتقالات مشروعة وبس، وأي حركة للورا أو قفزة محطة مرفوضة.

والحارس مفروض بتريجر على الجدول نفسه: guard_booking_status_transition (ترحيل 0033، ومتوسّع في 0039 ليشمل الإدخال) بيتنفّذ before insert or update على bookings، ومفيش فيه استثناء لدور service_role — الانتقال غير المشروع بيترفض حتى من سكريبت شغّال بمفتاح الخادم، وبيرجّع خطأ صريح بكود 42501. والإدخال الجديد لازم يبدأ «محجوز»؛ حجز بيتولد في حالة تانية بيترفض. والفتحة الوحيدة تصحيح إداري مقصود (ترحيل 0063): خطوة واحدة للورا، على الصف المعلَّم بمعرّفه بالظبط، ومقفولة على أي صف تاني في نفس المعاملة.

وحوالين الدورة دي قواعد تانية كلها مفروضة في القاعدة: جهوزية الفستان وقت الحجز عن طريق available_from، وقيد استبعاد GiST بيمنع تداخل حجزين على نفس الفستان، وسقف على الدفعات، و paid_amount بيتحسب من سجل payments بعد كل إدخال أو تعديل أو حذف، وحارس بيرجّع أي كتابة مباشرة على paid_amount لقيمتها القديمة، والتسليم بيرجّع صف التأمين لـ«مستلم». النتيجة العملية: الحجز وسجل الدفعات مستحيل يختلفوا، ومفيش مسار — لا من الواجهة ولا من استعلام يدوي ولا من كود جديد — يقدر يخلّيهم يختلفوا.

قرارات هندسية بتفرق

كل واحد فيهم متحقَّق منه في الكود أو في قاعدة الإنتاج.

اقرأ التفاصيلإخفاء التفاصيل14 نقطة
  1. 01

    صلاحيات على مستوى الصف على كل جدول

    الصلاحيات على مستوى الصف مفعّلة على 21 جدول من 21 بـ53 سياسة، والفحص على الخادم فوقه، وإخفاء العنصر من الواجهة راحة عرض مش حماية.

  2. 02

    الرواتب وأسعار الشرا في جدولين منفصلين

    staff_finance و dress_costs بسياسة أدمن بس، لأن صلاحيات القاعدة بتشتغل على مستوى الصف مش على مستوى العمود.

  3. 03

    حالة الحجز مفروضة بتريجر من غير أي استثناء لمفتاح الخدمة

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

  4. 04

    paid_amount بيتحسب من سجل الدفعات

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

  5. 05

    منع تداخل حجزين بقيد في القاعدة

    قيد bookings_no_overlap قيد استبعاد GiST على (الفستان × مدى التاريخ)، مش فحص في الكود ممكن يتنسي في مسار جديد.

  6. 06

    الكتابة والنت مقطوع عبر صندوق صادر

    خمس عمليات بتتخزّن محلياً — تسليم · استلام · حجز جديد · إضافة فستان · صرف — مع حماية «تنفيذ مرة واحدة» (run_once) على الخادم عشان الإعادة ترجّع نفس الرد بدل ما تعمل صف تاني.

  7. 07

    التعارض بيرتفع للمديرة، والنظام مبيحسمش

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

  8. 08

    دليل استخدام جوّه التطبيق وحارس وقت البناء

    سكريبت check:guide بيفشل البناء لو شاشة في src/app/(app) ملهاش قسم، أو حقل من غير شرح، أو رابط بيشاور على صفحة مش موجودة.

  9. 09

    21 سكريبت تحقّق، 16 منهم بيتحقّقوا سلوكياً

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

  10. 10

    سجل تعديلات على 12 جدول بسياسة قراءة واحدة ومن غير سياسة حذف

    ولا الأدمن يقدر يشيل صف منه، والكتابة من تريجرات security definer بس.

  11. 11

    تطبيع البحث العربي في عمود مخزَّن مفهرس

    ترحيل 0050، فـ«ندا» و«ندى» و«ندي» بيوصّلوا لنفس العميلة، والفهرس بيخلّيه بحث مش مسح جدول.

  12. 12

    نسخة احتياطية يدوية بملف إكسل الأدمن بيتحكم فيه

    مع سكريبت استعادة بيعاين قبل ما يكتب وبيرفض يشتغل على قاعدة فيها بيانات من غير --force.

  13. 13

    سجل أعطال داخلي في القاعدة

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

  14. 14

    صفر ملف تكامل مستمر

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

أسلوب الشغل

اقرأ التفاصيلإخفاء التفاصيل6 نقطة

بنفرض القواعد في أعمق طبقة نقدر نوصلها

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

الحرّاس بيتثبتوا بالسلوك

فحص بيقرا الكود ويقول «القاعدة موجودة» مش دليل إن القاعدة بتشتغل. عشان كده 16 من 21 سكريبت تحقّق بيشغّلوا النظام: متصفح حقيقي، فورمات بتتملى وتتبعت، دخول بحسابات حقيقية، واستعلامات على قاعدة الإنتاج. الفحص اللي بيقول «تمام» وهو مش بيفحص حاجة أسوأ من مفيش فحص.

التحقّق على مرحلتين

أمر verify (8 خطوات) بيسأل «الكود مكتوب صح؟» — محلّي وسريع، ومبيلمسش شبكة. وأمر verify:all (23 خطوة) بيسأل «النظام شغّال فعلاً؟». الأولانية بتتنفّذ في أمر البناء نفسه، فالنشر مبيعديش على كود بيكسر قاعدة من قواعد المشروع.

كل ملف بيشرح «ليه» مش «إيه»

المشروع فيه حوالي 27,000 سطر تعليق عربي جوّه المصدر — كل ملف وكل ترحيل بيبدأ بالسبب اللي خلّاه موجود، والتنازل اللي اتاخد، وسيناريو التراجع. القرار اللي اتنسي سببه بيترجّع.

الترحيل بيتحقق من نفسه

70 ملف بترتيب رقمي، 23 منهم فيهم كتلة تحقّق ذاتي بتتنفّذ مع الترحيل نفسه، و20 منها بترفع خطأ لو النتيجة مش اللي متوقّعة، و29 معلنين صراحةً إنهم آمنين يتنفّذوا أكتر من مرة. وبنطبّقهم من سطر الأوامر عن طريق Management API للقاعدة.

الدليل جزء من التعريف

أي تغيير في شاشة أو حقل بنحدّث معاه قسمه في دليل الاستخدام في نفس الـcommit — وسكريبت check:guide هو اللي بيمسك النسيان.

التعريب والتجاوب

عربي أولاً، مش عربي مترجم. الواجهة عربية بالكامل وRTL، والسايدبار على اليمين. مفيش لغة تانية ومفيش زرار تبديل.

اقرأ التفاصيلإخفاء التفاصيل6 نقطة
  • كل نص في مكان واحد: أي نص ظاهر للمستخدمة يعيش في src/lib/strings — ملف لكل شاشة، وعربي جوّه كود المكوّن ممنوع وسكريبت check:rules بيفرض ده. القياس: 5,711 نص عربي في 41 ملف، والعربي اللي بره الملفات دي 197 نص، منهم 6 بس في ملفات .tsx — الباقي رسايل أخطاء في Server Actions وتسميات أعمدة النسخة الاحتياطية.
  • أرقام غربية دايماً: 45 · ‎#DR-101 · 20 يوليو 2026 · 3,000 ج.م. والتنسيق كله من src/lib/format.ts — مفيش تنسيق يدوي — عشان الناتج يفضل متطابق بين الخادم والمتصفح.
  • المنطقة الزمنية مكتوبة صراحةً: ثابت TIME_ZONE واحد في طبقة العرض، و now() at time zone بنفس المنطقة جوّه دوال القاعدة (في 18 ملف ترحيل). يعني «النهارده» رقم واحد في الشاشة وفي القاعدة، مش رقمين حسب مكان الخادم.
  • تطبيع البحث العربي بيتعامل مع الألف المقصورة والتاء المربوطة والهمزة والتشكيل والتطويل والأرقام الهندية — لكن للأسماء بس. كود الفستان وكود الحجز والموبايل بيتبحثوا بالنص الخام زي ما هما.
  • check:mobile بيفتح كل شاشة على 390px في متصفح حقيقي ويتأكد: مفيش تمرير أفقي، كل هدف لمس ≥44px، خط الخانات ≥16px (أقل من كده iOS بيزوّم)، والتبويب السفلي مش بيغطّي آخر المحتوى.
  • check:responsive بيمشي مصفوفة: كل شاشة × كل مقاس (من 320 لحد 820 من الناحيتين) × Chromium و WebKit.

الرئيسية على شاشة موبايل

1 / 4

الحوكمة والتتبّع

اقرأ التفاصيلإخفاء التفاصيل

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

تلات طبقات على كل مسار محمي: proxy.ts ← فحص الصلاحية على الخادم جوّه الصفحة ← الصلاحيات على مستوى الصف في القاعدة، وطبقات الحماية دي موجودة في 47 ملف مصدر. والموظفة بتشوف 8 شاشات من 10: التقارير والإعدادات بتتشال من القايمة وبترد ForbiddenBlock على الخادم كمان، وشاشة شؤون الموظفين شاشة مختلفة تماماً حسب الدور — مش نفس الشاشة بعناصر مخفية.

البيانات الممنوعة مش بتوصل الجهاز أصلاً. الكاش المحلي بيشتغل بقايمة سماح مش قايمة منع: أي جذر استعلام مش مكتوب في PERSISTED_ROOTS مبيتخزّنش، وفيه استثناءات جوّه الجذر المسموح كمان — clients مسموح، بس clients.detail لأ لأنه بيجيب الرقم القومي والعنوان. وسكريبت check:offline بيفرض القايمة دي.

سجل التعديلات: 12 تريجر z_audit_ على 12 جدول بيكتبوا في audit_log — الجدول، الصف، نوع الحركة، مين عملها (auth.uid())، والحقول اللي اتغيّرت بقيمتها قبل وبعد. ولكل صف لقطة تعريفية تخلّيه مقروء لوحده: كود الحجز، كود الفستان، اسم العميلة — لأن سطر مالوش معرّف مالوش قيمة في تحقيق. والجدول عليه سياسة SELECT واحدة وبس: الكتابة من التريجر (security definer) والحذف مرفوض لأي دور مسجّل.

الباب نفسه: أول دخول بيوقّف على شاشة تغيير كلمة المرور (ترحيل 0045)، و5 محاولات غلط بتقفل الحساب 5 دقايق والمدة بتتضاعف مع كل محاولة بعدها لحد 60 دقيقة. وإيقاف موظفة (is_active = false) بيقطع وصولها فعلياً لكل الجداول عن طريق is_active_member() — مش إخفاء من الواجهة.

الشاشات

28 شاشة

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

الدخول والرئيسية

بوابة الدخول برقم الموبايلالحسابات بتتفتح من الأدمن مش بتسجيل ذاتي
لوحة الرئيسية بأرقام النهاردةالتنبيهات العاجلة مشتقة من مواعيد الحجوزات مش مكتوبة بالإيد

شغل اليوم

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

الجداول

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

التفاصيل

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

التقارير

التقارير المالية بمدى زمنيصافي الربح ناتج طرح ظاهر مش رقم مستقل
تقرير كامل بلوحات الترتيبتحليل الطلب على مستوى المقاس واللون

الفريق

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

الصلاحيات

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

الإعدادات

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

الدليل

دليل الاستخدام وفهرس أقسامهكل خانة في البرنامج مشروحة جوّه البرنامج
أقسام الدليل من فوق لتحتقسم في الدليل لكل شاشة في البرنامج

الأثر

من غير الفرضفي النظام
المدفوع والمتبقّي: رقم بيتكتب بالإيد، ويقدر يختلف عن سجل الدفعاتبيتحسب من سجل الدفعات، والكتابة المباشرة عليه بترجع لقيمتها
حالة الحجز: أي كود أو استعلام يقدر يكتب أي حالةتلات انتقالات مشروعة بس، مفروضة على الجدول
نفس الفستان لفترتين: فحص في الكود ممكن يتنسي في مسار جديدقيد استبعاد في القاعدة بيرفض الصف
دفعة أكبر من الإجمالي: بتتقبل وتبان في التقاريربترفض وقت الإدخال
فستان لسه مش جاهز: ينفع يتحجز لتاريخ هو مش جاهز فيهالحجز بيترفض بفحص available_from
التأمين وقت التسليم: ممكن يفضل متعلّم «اترد» والفستان لسه برهبيرجع «مستلم» تلقائياً مع التسليم
الرواتب وأسعار الشرا: عمود مخفي في نفس الجدولجدول منفصل بسياسة أدمن، ومبينزلش على جهاز الموظفة
مين غيّر إيه: مش متسجّل12 جدول متسجّلين بالفاعل والقيمة قبل وبعد، والصف مايتشالش
البحث بالاسم: «ندا» مبتلاقيش «ندى» ⇒ ملف مكررالاتنين بيوصّلوا لنفس العميلة
الشغل والنت مقطوع: العملية تضيع أو تتسجّل مرتينبتتخزّن وتتبعت مرة واحدة، والمرفوض بيرتفع للمديرة
الدليل: بيقدم مع الشاشات في صمتالبناء بيفشل لو شاشة من غير قسم
النسخة الاحتياطية: مفيش (الخطة مفيهاش نسخ تلقائي)ملف إكسل الأدمن بيتحكم فيه، ومتحقَّق منه صف بصف مقابل القاعدة

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

الأرقام

حجم الكود

سطر إجمالاً تحت src/
83,064
منها سطر كود (بدون تعليق ولا فراغ)
56,083
ملف .ts و .tsx (247 + 220)
467
مكوّن، صفر منهم arrow function
281
ملف .tsx من 220 هو Server Component
77
Server Action في 16 ملف
58
hook مخصوص في 13 ملف
58
نص عربي في 41 ملف نصوص (1,807 للشاشات · 3,685 للدليل)
5,711
صفحة
13
مسار API
8
وحدة ميزات تحت src/features
15

قياس 30 يوليو 2026. كل رقم هنا مكتوب جنبه الأمر اللي طلّعه في case-study/metrics.md.

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

ملف ترحيل SQL
70
سطر SQL جوّاهم
14,887
ترحيل فيه كتلة تحقّق ذاتي
23
ترحيل معلن إنه آمن يتنفّذ أكتر من مرة
29
جدول
21
view
3
enum
8
دالة من كتابة ترحيلات المشروع
61
trigger
32
سياسة صلاحيات على مستوى الصف
53
جدول عليه صلاحيات على مستوى الصف
21/21
جدول عليه تريجر تدقيق
12
انتقال مشروع لحالة الحجز
3
نوع عملية بتتسجّل والنت مقطوع
5

متقروء من قاعدة الإنتاج في 30 يوليو 2026 باستعلامات SELECT للقراءة بس.

التحقّق

سكريبت تحقّق (19 check:* + audit:rls + smoke)
21
منهم سلوكي — بيشغّلوا النظام
16
سطر كود تحقّق وأدوات
14,211
خطوة في أمر verify
8
خطوة في أمر verify:all
23
ملف تكامل مستمر — الفحوصات الساكنة بتتنفّذ في البناء نفسه
0

تاريخ التنفيذ

commit
226
يوم تقويمي، من 22 لـ30 يوليو 2026
9
سطر مضاف إجمالاً
115,739
سطر محذوف إجمالاً
12,185

حجم بيانات التجربة

سجل التعديلات
1,516
مصروفات يومية
634
دفعات
610
حضور
520
حجوزات، كلهم SEED-%
306
تأمينات
306
تنبيهات
120
فساتين
75
عميلات
64
حسابات
28
صرف رواتب
15
صف إجمالاً
4,194

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