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

نظام تشغيل داخلي عربي بالكامل لأتيليه تأجير فساتين، دورة حياة الحجز فيه مفروضة في قاعدة البيانات نفسها — مش في الواجهة ولا في الفورم. عشر شاشات على 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.
الرئيسية على شاشة موبايل
الشاشات
28 شاشةكل بيانات العملاء والموظفين والفلوس في الصور بيانات تجربة مولّدة — مفيش عميل حقيقي ولا موظف حقيقي ولا رقم فلوس حقيقي في أي حتة؛ التطبيق والكود وبنية القاعدة حقيقيين، واسم الأتيليه ظاهر بإذن صاحبته.
الدخول والرئيسية
شغل اليوم
الجداول
التفاصيل
التقارير
الفريق
الصلاحيات
الإعدادات
الدليل
الأثر
| من غير الفرض | في النظام |
|---|---|
| المدفوع والمتبقّي: رقم بيتكتب بالإيد، ويقدر يختلف عن سجل الدفعات | بيتحسب من سجل الدفعات، والكتابة المباشرة عليه بترجع لقيمتها |
| حالة الحجز: أي كود أو استعلام يقدر يكتب أي حالة | تلات انتقالات مشروعة بس، مفروضة على الجدول |
| نفس الفستان لفترتين: فحص في الكود ممكن يتنسي في مسار جديد | قيد استبعاد في القاعدة بيرفض الصف |
| دفعة أكبر من الإجمالي: بتتقبل وتبان في التقارير | بترفض وقت الإدخال |
| فستان لسه مش جاهز: ينفع يتحجز لتاريخ هو مش جاهز فيه | الحجز بيترفض بفحص available_from |
| التأمين وقت التسليم: ممكن يفضل متعلّم «اترد» والفستان لسه بره | بيرجع «مستلم» تلقائياً مع التسليم |
| الرواتب وأسعار الشرا: عمود مخفي في نفس الجدول | جدول منفصل بسياسة أدمن، ومبينزلش على جهاز الموظفة |
| مين غيّر إيه: مش متسجّل | 12 جدول متسجّلين بالفاعل والقيمة قبل وبعد، والصف مايتشالش |
| البحث بالاسم: «ندا» مبتلاقيش «ندى» ⇒ ملف مكرر | الاتنين بيوصّلوا لنفس العميلة |
| الشغل والنت مقطوع: العملية تضيع أو تتسجّل مرتين | بتتخزّن وتتبعت مرة واحدة، والمرفوض بيرتفع للمديرة |
| الدليل: بيقدم مع الشاشات في صمت | البناء بيفشل لو شاشة من غير قسم |
| النسخة الاحتياطية: مفيش (الخطة مفيهاش نسخ تلقائي) | ملف Excel الأدمن بيتحكم فيه، ومتحقَّق منه صف بصف مقابل القاعدة |
من غير الفرض
المدفوع والمتبقّي: رقم بيتكتب بالإيد، ويقدر يختلف عن سجل الدفعات
في النظام
بيتحسب من سجل الدفعات، والكتابة المباشرة عليه بترجع لقيمتها
من غير الفرض
حالة الحجز: أي كود أو استعلام يقدر يكتب أي حالة
في النظام
تلات انتقالات مشروعة بس، مفروضة على الجدول
من غير الفرض
نفس الفستان لفترتين: فحص في الكود ممكن يتنسي في مسار جديد
في النظام
قيد استبعاد في القاعدة بيرفض الصف
من غير الفرض
دفعة أكبر من الإجمالي: بتتقبل وتبان في التقارير
في النظام
بترفض وقت الإدخال
من غير الفرض
فستان لسه مش جاهز: ينفع يتحجز لتاريخ هو مش جاهز فيه
في النظام
الحجز بيترفض بفحص available_from
من غير الفرض
التأمين وقت التسليم: ممكن يفضل متعلّم «اترد» والفستان لسه بره
في النظام
بيرجع «مستلم» تلقائياً مع التسليم
من غير الفرض
الرواتب وأسعار الشرا: عمود مخفي في نفس الجدول
في النظام
جدول منفصل بسياسة أدمن، ومبينزلش على جهاز الموظفة
من غير الفرض
مين غيّر إيه: مش متسجّل
في النظام
12 جدول متسجّلين بالفاعل والقيمة قبل وبعد، والصف مايتشالش
من غير الفرض
البحث بالاسم: «ندا» مبتلاقيش «ندى» ⇒ ملف مكرر
في النظام
الاتنين بيوصّلوا لنفس العميلة
من غير الفرض
الشغل والنت مقطوع: العملية تضيع أو تتسجّل مرتين
في النظام
بتتخزّن وتتبعت مرة واحدة، والمرفوض بيرتفع للمديرة
من غير الفرض
الدليل: بيقدم مع الشاشات في صمت
في النظام
البناء بيفشل لو شاشة من غير قسم
من غير الفرض
النسخة الاحتياطية: مفيش (الخطة مفيهاش نسخ تلقائي)
في النظام
ملف Excel الأدمن بيتحكم فيه، ومتحقَّق منه صف بصف مقابل القاعدة
الجدول ده بيقارن اللي باين في السوفتوير نفسه وبس: عمود «من غير الفرض» هو السلوك الافتراضي لأي نظام مفيهوش القاعدة دي، وعمود «في النظام» هو السلوك المفروض فعلاً هنا — وكل سطر متحقَّق منه في الكود أو في قاعدة الإنتاج. وبره السوفتوير: 4 مستخدمات بيستخدموا النظام (بقول صاحب المشروع، 30 يوليو 2026) — رقم منقول مش مقيس. أما الأتيليه كان بيشتغل إزاي قبل النظام والنتايج اللي اتلاحظت بعده، فدي لسه مش مقيسة ومتقالتش هنا.




