0%
balqalam Logo
بالقلم
المميزاتالمجتمعالتسعيرالوثائق
تسجيل الدخول
  • مقدمة
  • العرض
  • MVP
  • خارطة الطريق
  • متطلبات المنتج
  • ابدأ الآن
  • البيئة المحلية
  • البنية المعمارية
  • الهيكل
  • الأنماط
  • الحزمة التقنية
  • قاعدة البيانات
  • تعدّد المستأجرين
  • الفهرس (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
ما يميّزك/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.

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

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

  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 ·

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

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