كل الأعمال ←

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

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

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

العميل
أتيليه ميار علاء — أتيليه حقيقي. الاسم والهوية البصرية ظاهرين بإذن صاحبته.
نوع النظام
نظام تشغيل داخلي على الويب، بدورين: أدمن وموظفة
أتيليه ميار علاء
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). والنسخة الاحتياطية يدوية: ملف Excel الأدمن بينزّله لما تحب.

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

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

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

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

عربي أولاً، مش عربي مترجم. الواجهة عربية بالكامل و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

الشاشات

28 شاشة

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

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

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

شغل اليوم

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

الجداول

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

التفاصيل

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

التقارير

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

الفريق

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

الصلاحيات

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

الإعدادات

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

الدليل

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

الأثر

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

    المدفوع والمتبقّي: رقم بيتكتب بالإيد، ويقدر يختلف عن سجل الدفعات

    في النظام

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

  • من غير الفرض

    حالة الحجز: أي كود أو استعلام يقدر يكتب أي حالة

    في النظام

    تلات انتقالات مشروعة بس، مفروضة على الجدول

  • من غير الفرض

    نفس الفستان لفترتين: فحص في الكود ممكن يتنسي في مسار جديد

    في النظام

    قيد استبعاد في القاعدة بيرفض الصف

  • من غير الفرض

    دفعة أكبر من الإجمالي: بتتقبل وتبان في التقارير

    في النظام

    بترفض وقت الإدخال

  • من غير الفرض

    فستان لسه مش جاهز: ينفع يتحجز لتاريخ هو مش جاهز فيه

    في النظام

    الحجز بيترفض بفحص available_from

  • من غير الفرض

    التأمين وقت التسليم: ممكن يفضل متعلّم «اترد» والفستان لسه بره

    في النظام

    بيرجع «مستلم» تلقائياً مع التسليم

  • من غير الفرض

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

    في النظام

    جدول منفصل بسياسة أدمن، ومبينزلش على جهاز الموظفة

  • من غير الفرض

    مين غيّر إيه: مش متسجّل

    في النظام

    12 جدول متسجّلين بالفاعل والقيمة قبل وبعد، والصف مايتشالش

  • من غير الفرض

    البحث بالاسم: «ندا» مبتلاقيش «ندى» ⇒ ملف مكرر

    في النظام

    الاتنين بيوصّلوا لنفس العميلة

  • من غير الفرض

    الشغل والنت مقطوع: العملية تضيع أو تتسجّل مرتين

    في النظام

    بتتخزّن وتتبعت مرة واحدة، والمرفوض بيرتفع للمديرة

  • من غير الفرض

    الدليل: بيقدم مع الشاشات في صمت

    في النظام

    البناء بيفشل لو شاشة من غير قسم

  • من غير الفرض

    النسخة الاحتياطية: مفيش (الخطة مفيهاش نسخ تلقائي)

    في النظام

    ملف Excel الأدمن بيتحكم فيه، ومتحقَّق منه صف بصف مقابل القاعدة

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