تحديث للمشروع الأصلي (HTML/CSS/JavaScript)، مع الحفاظ على ملفَي الشعار وألوان الهوية. الموقع صفحة عربية واحدة تشمل الخدمات والحجز والتواصل؛ الإدارة صفحة مستقلة في admin.html. لم توجد صفحات حجز أو تواصل منفصلة في الملف الأصلي.
تحتاج Node.js 20.12 أو أحدث. لا يحتاج التشغيل أو البناء إلى تثبيت مكتبات.
node scripts/build.mjs
node scripts/serve.mjsافتح http://127.0.0.1:4173، والإدارة http://127.0.0.1:4173/admin.html.
يمكن استخدام npm run build وnpm start بدلًا من الأمرين. مجلد dist هو الناتج الجاهز للاستضافة، ويحتوي على معاينة بدون اتصال في النسخة المرفقة. لا تفتح ملفات HTML مباشرة بنظام file://.
- من إعدادات مشروع Supabase خذ Project URL وPublishable key (أو مفتاح
anonالقديم). - انسخ
.env.exampleإلى.envفي جذر المشروع، واملأ:
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
SUPABASE_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_OR_ANON_KEY- نفّذ محتوى
supabase/migrations/001_kamlin.sqlمرة واحدة من SQL Editor بحساب مالك قاعدة البيانات. يُنشئ جداول كاملين ودالة الحجز وسياسات الصلاحيات. يستخدمsite_settingsالموجود إن وُجد؛ يحتفظ بقيمه ويستبدل سياسات الوصول القديمة على هذا الجدول لتقييد الكتابة بالمسؤولين. احتفظ بنسخة من السياسات القديمة إذا كان الجدول مشتركًا مع تطبيق آخر. - من Authentication → Users أنشئ مستخدمًا إداريًا بالبريد وكلمة مرور تختارهما، وأكّد البريد. انسخ User UID وأضفه من SQL Editor:
insert into public.kamlin_admins(user_id)
values ('REPLACE_WITH_AUTH_USER_UUID')
on conflict do nothing;- أعد تشغيل أمر البناء بعد تعديل
.env، ثم سجّل الدخول منadmin.htmlبالبريد وكلمة المرور اللذين أنشأتهما. لا توجد كلمة مرور افتراضية أو بريد إداري مفروض في الكود. - جرّب حجزًا من متصفح آخر، ثم اضغط «تحديث البيانات» في الإدارة. غيّر حالته وأعد تحميل الإدارة للتأكد من الحفظ في مشروعك الحقيقي.
لا يلزم مفتاح service_role أو sb_secret_ أو كلمة مرور قاعدة البيانات في الموقع. البناء يرفض المفاتيح السرية المعروفة. مفتاح النشر عام بطبيعته؛ حماية العملاء تتم بصلاحيات قاعدة البيانات، وليس بإخفائه. لم تُستخدم إعدادات الاتصال القديمة المضمنة في المشروع ولم يُكتب شيء إلى مشروعك القديم.
على Netlify: ارفع المشروع إلى المستودع، وأضف المتغيرين السابقين إلى Environment variables. إعدادات netlify.toml تبني الموقع وتنشر dist فقط. على أي استضافة ثابتة أخرى: ابنِ محليًا ثم ارفع محتويات dist فقط عبر HTTPS. لا تنشر .env أو مجلد المشروع كاملًا.
kamlin_bookings: الحجوزات، بيانات العملاء، الحالة، عرض السعر، المسؤول، المتابعة والضمان.kamlin_records: العمال والتكليفات والحضور وتسليم الأدوات، مفصولة بحقلkind.site_settings/prices: أسعار الموقع. القيم الفارغة لا تظهر للعامة، وتظهر القيم المحفوظة كأسعار استرشادية. تعديلها يتم من الإدارة.kamlin_admins: المستخدمون المسموح لهم بالإدارة. العضوية تُضاف من SQL Editor فقط؛ التسجيل وحده لا يمنح صلاحية.- الزائر يستطيع إرسال حقول الحجز المحددة عبر دالة SQL، ولا يستطيع قراءة أو تعديل أو حذف الحجوزات. يحتفظ النموذج بمعرّف الطلب عند إعادة المحاولة لتجنب تكراره بعد انقطاع الاتصال.
- تستخدم تعديلات وحذف السجلات رقم نسخة لمنع الكتابة فوق تعديل مسؤول آخر؛ عند التعارض حدّث البيانات وافتح السجل مرة أخرى.
- العملاء والمتابعات والعروض ملخصات مشتقة من الحجوزات، كما في المشروع الأصلي. صفحة العقود تعرض الطلبات ذات عرض سعر؛ ليست نظام توقيع عقود إلكترونية.
- الحجز لا يرسل بريدًا أو رسالة واتساب آليًا. يظهر للفريق في الإدارة بعد التحديث؛ أزرار الاتصال والبريد وواتساب تفتح التطبيقات المناسبة لدى المستخدم.
- عند غياب الإعدادات أو فشل الاتصال لا يدّعي الموقع استلام الطلب، وتبقى بيانات النموذج لإعادة المحاولة. الاتصال وواتساب متاحان كبديل.
ملف ZIP الأصلي لا يحتوي على بيانات العملاء المحفوظة في المتصفحات. التخزين القديم كان موزعًا بين kamlin_bookings_v2 وkamlin_bookings وبقية مفاتيح LocalStorage؛ لم يُحذف أو يُنقل أي منها تلقائيًا، ولم يُستخدم كبديل وهمي لقاعدة البيانات. احتفظ بتصدير البيانات من المتصفحات القديمة قبل استبدال النسخة القديمة إذا كانت لديك سجلات فعلية.
- تحديث الهيدر والرئيسية وكروت الخدمات والمكافحة وطريقة العمل والأسئلة والحجز والتواصل والفوتر، وتحسين RTL والتجاوب والتركيز بالكيبورد وتقليل الحركة.
- إبقاء الشعار الأصلي وألوان التركواز والكحلي، واستبدال التقييمات التجريبية غير الحقيقية بدعوة لتعاقدات الشركات.
- ربط جميع أزرار الخدمات باختيار الخدمة في الحجز، وإصلاح قائمة الموبايل وتوحيد واتساب على الرقم الموجود في إعدادات المشروع الأصلي:
01010420272. رقم الاتصال الأساسي:01030438805. - إزالة ملفات assets غير المستخدمة من النسخة المسلمة لتجنب وجود نسختين متضاربتين من الكود.
- استبدال الحفظ المحلي بالحفظ السحابي، وإصلاح الدخول والخروج والأسعار ورسائل الخطأ، وإزالة رسالة نجاح الأسعار التي كانت تظهر تلقائيًا.
- إبقاء البحث والتصفية وتصدير CSV، مع حماية خلايا CSV من تفسير النصوص كصيغ.
- تضمين مكتبة Supabase 2.57.4 محليًا، بدل الاعتماد على رابط متغير أثناء التشغيل. الخط Cairo يُحمّل من Google Fonts مع خط بديل عند غياب الإنترنت.
node --test tests/core.test.mjsاختبارات المتصفح تستخدم Playwright وMicrosoft Edge وتحتاج معاينة تعمل بالأوامر أعلاه:
npm install --no-save playwright
node tests/browser.cjsيمكن ضبط BROWSER_CHANNEL=chrome عند استخدام Chrome وTEST_URL لتغيير عنوان المعاينة. اختبارات المتصفح تعترض اتصالات Supabase وتستخدم بيانات اختبار داخل الذاكرة؛ لا تُرسل بيانات إلى حساب خارجي. راجع TEST-REPORT.md للنتائج. الاتصال بقاعدة المستخدم الحقيقية وسياسات RLS على خادم Supabase لم يُختبرا لأن بيانات الإدارة والـ schema الفعلي لم تُقدَّم.
مراجع التكامل: Supabase RLS وDatabase Functions.