Skip to content

Repository files navigation

كاملين — الموقع ولوحة الإدارة

تحديث للمشروع الأصلي (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 — القيم المطلوبة فقط

  1. من إعدادات مشروع Supabase خذ Project URL وPublishable key (أو مفتاح anon القديم).
  2. انسخ .env.example إلى .env في جذر المشروع، واملأ:
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
SUPABASE_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_OR_ANON_KEY
  1. نفّذ محتوى supabase/migrations/001_kamlin.sql مرة واحدة من SQL Editor بحساب مالك قاعدة البيانات. يُنشئ جداول كاملين ودالة الحجز وسياسات الصلاحيات. يستخدم site_settings الموجود إن وُجد؛ يحتفظ بقيمه ويستبدل سياسات الوصول القديمة على هذا الجدول لتقييد الكتابة بالمسؤولين. احتفظ بنسخة من السياسات القديمة إذا كان الجدول مشتركًا مع تطبيق آخر.
  2. من Authentication → Users أنشئ مستخدمًا إداريًا بالبريد وكلمة مرور تختارهما، وأكّد البريد. انسخ User UID وأضفه من SQL Editor:
insert into public.kamlin_admins(user_id)
values ('REPLACE_WITH_AUTH_USER_UUID')
on conflict do nothing;
  1. أعد تشغيل أمر البناء بعد تعديل .env، ثم سجّل الدخول من admin.html بالبريد وكلمة المرور اللذين أنشأتهما. لا توجد كلمة مرور افتراضية أو بريد إداري مفروض في الكود.
  2. جرّب حجزًا من متصفح آخر، ثم اضغط «تحديث البيانات» في الإدارة. غيّر حالته وأعد تحميل الإدارة للتأكد من الحفظ في مشروعك الحقيقي.

لا يلزم مفتاح 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages