0%
balqalam Logo
بالقلم
المميزاتالمجتمعالتسعيرالوثائق
تسجيل الدخول
  • مقدمة
  • مركز المساعدة
  • أسئلة شائعة
  • ابدأ الآن
  • البيئة المحلية
  • البنية المعمارية
  • الهيكل
  • الأنماط
  • الحزمة التقنية
  • قاعدة البيانات
  • تعدّد المستأجرين
  • الفهرس (Catalog)
  • العمل دون اتصال
  • المصادقة
  • التهيئة (Onboarding)
  • تدفق التكامل (Integration Flow)
  • التهيئة (Provision)
  • القبول
  • الحضور
  • الامتثال التنظيمي
  • الملف الشخصي
  • الاجتماعات
  • إدارة الرسوم
  • الفاتورة
  • التدويل
  • الترجمة
  • دليل الترجمة
  • أمان قاعدة البيانات
  • المساهمة
  • الإلهام
  • المالية
  • النقل

التهيئة (Onboarding)

السابقالتالي

معالج متعدّد الخطوات لتسجيل المدرسة وتكوينها وإعدادها التجاري. 15 خطوة في 3 مجموعات، ~166 ملف.

يقود نظام التهيئة المدارس الجديدة عبر التسجيل والتكوين والإعداد التجاري. نمط مرآة، ~166 ملف، 15 خطوة فعّالة في 3 مجموعات، يقودها WizardLayout. وقت الإنجاز المعتاد: 10–30 دقيقة.

الخطوات

المجموعة 1 — المعلومات الأساسية

الخطوةالمسارإلزاميةقاعدة البيانات
عن المدرسة/about-schoolلاترحيب ثابت
العنوان/titleنعمSchool.name
الوصف/descriptionنعمschoolType, schoolLevel, planType
الموقع/locationنعمaddress, city, state, country, latitude, longitude
ما يميّزك/stand-outلاثابت

المجموعة 2 — إعداد المدرسة

الخطوةالمسارإلزاميةقاعدة البيانات
السعة/capacityنعمmaxStudents, maxTeachers, maxClasses
العلامة/brandingلاprimaryColor, borderRadius, shadow
الاستيراد/importلاإدخال جماعي (CSV / Excel)
إنهاء الإعداد/finish-setupلامراجعة ثابتة

خطوة schedule معرَّفة في OnboardingStep بمجلد مكوّن خاص بها لكنها ليست ضمن التنقّل الفعّال. تعيش عند order: 5.5 في config.ts تمهيداً لتفعيلها لاحقاً.

المجموعة 3 — التجاري والقانوني

الخطوةالمسارإلزاميةقاعدة البيانات
الانضمام/joinنعمUser
الإظهار/visibilityلاSchool.isPublished
السعر/priceنعمtuitionFee, registrationFee, applicationFee, currency
الخصم/discountلانموذج Discount
القانوني/legalنعمLegalConsent
النطاق الفرعي/subdomainلاSchool.domain

بعد إنهاء كل الخطوات يصل المستخدم إلى /congratulations لإعادة توجيه ذكية (لوحة النطاق الفرعي للمدرسة أو النطاق الرئيسي بحسب حالة الجلسة).

ترتيب الخطوات الفعّال هو ONBOARDING_CONFIG في src/components/form/footer.tsx. المرجع الموثوق للبيانات الوصفية (الوسوم، التحقق، المجموعة، الترتيب) هو ONBOARDING_STEPS في src/components/onboarding/config.ts.

منتقي الموقع

مكوّن واحد هو src/components/atom/mapbox-location-picker.tsx يحدد كل عنوان في التطبيق: هذه الخطوة، وإعدادات المدرسة، ومعالجات إضافة الطلاب والمعلمين، والتقديم العام، ومحطات النقل. يحل حقل بحث واحد مع الموقع الحالي والخريطة محل حقول الدولة والمدينة والحي المنفصلة.

  • البحث يستخدم Mapbox Geocoding v6، محصورًا في دولة المدرسة ومرتبًا حول موقعها. كتابة "الرياض" من مدرسة في الخرطوم تجد حي الرياض في الخرطوم لا مدينة الرياض في السعودية. إذا لم توجد نتيجة داخل دولة المدرسة يعيد البحث على مستوى العالم. تصل النتائج إلى مستوى المربعات مثل "كافوري مربع 9". للاختيار استخدم الأسهم وEnter، وللإغلاق Esc.
  • العرض الأول: الدبوس المحفوظ، ثم المدرسة، ثم دولة المدرسة، ثم الخرطوم. لا تُفتح الخريطة أبدًا عند الإحداثيات 0,0. داخل المدرسة تظهر المدرسة كعلامة مرجعية.
  • الهبوط: اختيار نتيجة أو استخدام الموقع الحالي أو الضغط على الخريطة يحرّك الخريطة فورًا. يصل العنوان عندما يرد البحث العكسي. اسحب الدبوس للضبط. سطر العنوان تحت الخريطة قابل للتعديل لإضافة رقم المنزل أو أقرب معلم.
  • العربية: تتبع أسماء الخريطة لغة الصفحة. يُفعَّل ملحق النص من اليمين لليسار قبل إنشاء كل خريطة.
  • التخزين: address/city/state/country كما كانت، مع latitude/longitude في School وStudent وTeacher وApplication.

مصافحة المصادقة

تدفّق من أربع مراحل:

  1. البدء — مستخدم غير مصادَق يزور /get-started أو /onboarding. إجراء start-onboarding يحفظ النية في cookie ويعيد التوجيه إلى /login.
  2. المصادقة — تسجيل دخول قياسي. عنوان callback يعيد التوجيه إلى /onboarding.
  3. التزويد — initializeSchoolSetup() يستدعي ensureUserSchool() (src/lib/school-access.ts) — db.$transaction ذرّي ينشئ صف School، وSchoolMember (يربط المستخدم كـ ADMIN)، ويزرع YearLevels افتراضية. عملية idempotent.
  4. التحديث + إعادة التوجيه — _sessionRefreshRequired: true يُطلق إعادة جلب /api/auth/session من العميل؛ _redirect يرسل إلى الخطوة التالية.

الملكية مفروضة عبر requireSchoolOwnership(id) على تحميل كل خطوة. الوصول العابر للمستأجرين يرفع TenantError.

التكامل مع تعدّد المستأجرين

  • توجيه النطاق الفرعي — /onboarding وأبناؤه يعيشون على النطاق الرئيسي (ed.databayt.org)، لا على نطاق فرعي. تخصيص النطاق الفرعي يحدث في خطوة Subdomain.
  • تحديد نطاق قاعدة البيانات — كل قراءة تستخدم requireSchoolOwnership(id) أولاً، ثم استعلامات محدَّدة النطاق بـ schoolId.
  • schoolId في الجلسة — JWT يحمل schoolId بعد الخطوة 1؛ الخطوات اللاحقة تثق به بعد إعادة التحقق.

التحقق

كل خطوة لها schema من Zod مرافقة لمكوّنها. تستخدم الـ schemas نمط مصنع i18n — نفس الـ schema تُنتج رسائل خطأ بالعربية أو الإنجليزية بحسب شريحة القاموس.

import { createTitleSchema } from "@/components/onboarding/title/validation"
 
const schema = createTitleSchema(dictionary)
const result = schema.safeParse(input)

validation.ts الجذري يصدّر validateStep(step, data, dictionary) وgetRequiredFieldsForStep(step) لتحقّق مشترك واعٍ بالخطوات.

التزويد التلقائي

عندما يعمل completeOnboarding() عند خطوة legal، تُعلَّم المدرسة كنشطة وتنشئ سلسلة تزويد من 5 خطوات بنية تحتية أكاديمية. كل خطوة ملفوفة في try/catch لئلا يحجب فشل واحد البقية.

المصدر: src/components/onboarding/legal/actions.ts → src/components/catalog/setup.ts.

الخطوةتنشئ
setupDefaultsForSchool()YearLevels (8 / 6 / 14 بحسب مستوى المدرسة)، 6 Departments، 9 ScoreRanges
setupCatalogForSchool()جسور Subject / chapter / lesson من الكتالوج العام
setupTermsForSchool()فصول افتراضية للسنة الأكاديمية
setupRolesForSchool()قوالب صلاحيات للأدوار الـ 8
setupNotificationsForSchool()تفضيلات إشعار افتراضية لدور ADMIN

setupCatalogForSchool يحلّ المنهج عبر inferCurriculum():

الأولويةالاستراتيجيةمثال
1نوع مدرسة international → USأي بلد + international
2تطابق دقيق للبلدUS → US, SD → SD
3بلد غير مُربط → USJP, KE, …

مسارات API

المسارالطريقةالغرض
/api/onboarding/create-schoolPOSTإنشاء مدرسة ذرّي idempotent؛ يعالج سباق انتهاك unique لـ P2002
/api/onboarding/validate-accessPOSTفحص وصول مسبق؛ تزويد تلقائي؛ يعيد redirect عند عدم التطابق
/api/onboarding/extractPOSTاستخراج وثائق بالذكاء الاصطناعي (10 ميجابايت كحد أقصى؛ JPEG / PNG / WebP / PDF)

Server actions

في src/components/onboarding/actions.ts:

الإجراءالغرض
initializeSchoolSetup()ينشئ أو يجلب مدرسة للمستخدم الحالي؛ يعيد _redirect
getListing(id)جلب المدرسة مع التحقق من الملكية
updateListing(id, data)تحديث حقول لخطوة
getSchoolSetupStatus(schoolId)نسبة الإنجاز (6 فحوص)
reserveSubdomainForSchool(id, sub)حجز نطاق فرعي (يفوّض إلى src/lib/subdomain-actions.ts)
getCurrentUserSchool()يعيد schoolId للمستخدم الحالي
getUserSchools()يسرد المدارس المملوكة أو المرتبطة بالمستخدم الحالي
proceedToTitle(schoolId)يتحقق من الملكية ويعيد التوجيه إلى خطوة about-school

الملفات المفتاحية

المسارالغرض
src/app/[lang]/onboarding/[id]/[step]/page.tsxصفحة كل خطوة (15 مساراً)
src/components/onboarding/actions.tsServer actions
src/components/onboarding/config.tsتكوين الخطوات (مرجع موثوق)
src/components/onboarding/types.tsOnboardingStep, OnboardingSchoolData
src/components/onboarding/validation.tsZod schemas جذرية
src/components/onboarding/use-listing.tsxسياق ListingProvider
src/components/onboarding/use-onboarding.tshook التنقّل + التحقق
src/components/onboarding/auth-helpers.tsgetAuthContext, requireSchoolOwnership
src/components/form/footer.tsxFormFooter + ONBOARDING_CONFIG
src/lib/school-access.tsمعاملة ensureUserSchool() الذرّية
src/components/catalog/setup.tsسلسلة التزويد

استكشاف الأخطاء

العَرَضالسببالحل
البناء يعلَق عند "Environments: .env"أخطاء TypeScript في مكوّنات onboardingشغّل pnpm tsc --noEmit
الجلسة تفتقد schoolIdلم تُحدَّث الجلسة بعد المعاملة الذرّيةاجلب /api/auth/session بعد _sessionRefreshRequired: true
رفض وصول عابر للمستأجرينمستخدم يصل إلى مدرسة لا يملكهاrequireSchoolOwnership(id) يرمي TenantError
النطاق الفرعي محجوز سلفاًمدرسة أخرى حجزتهالإجراء يعيد errorCode: "DOMAIN_TAKEN"
بيانات النموذج لا تثبتغياب revalidatePath() بعد التعديلكل إجراءات التحديث تستدعي revalidatePath("/onboarding")
خاصية قاموس غير موجودةمفتاح ترجمة مفقوداستخدم optional chaining: dictionary?.onboarding?.title?.label

انظر أيضاً

  • تعدد المستأجرين — مصافحة المصادقة، سياق المستأجر
  • الأنماط — نمط المرآة، أعراف الملفات
  • المصادقة — تدفّق تسجيل الدخول
المصادقةتدفق التكامل (Integration Flow)

On This Page

الخطواتالمجموعة 1 — المعلومات الأساسيةالمجموعة 2 — إعداد المدرسةالمجموعة 3 — التجاري والقانونيمنتقي الموقعمصافحة المصادقةالتكامل مع تعدّد المستأجرينالتحققالتزويد التلقائيمسارات APIServer actionsالملفات المفتاحيةاستكشاف الأخطاءانظر أيضاً

من تطوير Databayt ·

مرحباً بك في بالقلم.

رحلة عظيمة على وشك أن تبدأ.