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

التهيئة (Provision)

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

التهيئة التلقائية — كل ما تحصل عليه المدرسة لحظة اكتمال التهيئة الأولى، ومحرّك الجدولة المدرك للفصول الدراسية، ومولّد الجدول المبني على الشُعب، والطبيب الذي يكشف التهيئة الناقصة ويصلحها.

الهدف: أن يُنهي المدير التهيئة الأولى (onboarding) فيجد مدرسة تعمل فعلاً — صفوف، ومواد، وفصول دراسية، وحصص، وقاعات، وشُعب، ومسودّة جدول — كلها مشتقّة من أربع إجابات فقط (الدولة، نوع المدرسة، المرحلة، السعة). وكل ما يُنشئه المهيّئ هنا افتراضي لا نهائي: كل سجل قابل للتعديل من واجهات الإدارة المعتادة.

متى تعمل التهيئة

المشغّلالمسارالنمط
اكتمال التهيئة الأولىcompleteOnboarding() ← provisionSchoolDefaults() داخل after()إطلاق-ونسيان
إعادة تهيئة يدويةpublishSchool() في congratulations/actions.tsمباشر، للمدير فقط
إصلاح المشغّل (Operator)جدول المستأجرين في لوحة SaaS ← إجراء "Repair Provisioning"مباشر، للمشغّل
زر تهيئة الجدولعرض المسودّة الفارغ في الجدول ← "Set up timetable" (ADMIN)مباشر، جزئي

المسارات الكاملة الثلاثة تلتقي كلها عند repairProvisioning() في src/components/catalog/provision.ts — محرّك تهيئة واحد لا ثلاثة.

ولأن مشغّل التهيئة الأولى يعمل بعد الاستجابة داخل after()، قد يقتله انتهاء مهلة الخادم في منتصف السلسلة. وهذا مقبول عمداً: كل مرحلة قابلة لإعادة التشغيل بأمان (idempotent)، والطبيب يلتقط المراحل الناقصة بالضبط في الاستدعاء التالي.

المراحل

يستدعي repairProvisioning() أولاً getProvisioningStatus() (جولة عدّ واحدة مجمّعة)، ثم يشغّل المراحل الناقصة فقط بترتيب الاعتماديات. فشل مرحلة لا يوقف البقية أبداً — تُجمع الإخفاقات ويُبلَّغ عنها.

#المرحلةالدالةتُنشئ
1defaultssetupDefaultsForSchool()صفوف YearLevel، و6 أقسام (Department)، ونطاقات الدرجات (A+ ← F)
2academicStructuresetupCatalogForSchool()AcademicLevel، AcademicGrade، AcademicStream بحسب المنهج
3subjectSelectionsensureSubjectSelections() (إصلاح ذاتي)صفوف جسر SubjectSelection إلى الفهرس العام
4scheduleapplyTimetableStructureForNewSchool()SchoolYear، وTerm ×N (مدرك للتقويم)، وPeriod ×N، وSchoolWeekConfig
5sectionsautoProvisionSections()ClassroomType، وClassroom + Section ×N لكل صف
6timetableautoGenerateTimetableForSchool()حصص Timetable — مبنية على الشُعب، بلا معلمين
7joinCodegenerateUniqueJoinCode()School.joinCode

المرحلتان 2–3 من اختصاص الفهرس — استنتاج المنهج، وسلسلة المطابقة التدريجية للمواد، وإعدادات البنية الأكاديمية لكل منهج موثّقة في الفهرس. وجانب التهيئة الأولى (أي خطوة في المعالج تغذّي أي حقل) في التهيئة الأولى. هذه الصفحة تملك المراحل 4–6 والطبيب.

خارج الطبيب، يُطلق provisionSchoolDefaults() أيضاً syncStudentGrades() وprovisionSchoolFees() وإشعارات دليل الإعداد؛ ويشغّل publishSchool() إضافةً initializeAccountingSystem() (شجرة الحسابات — فجوة معروفة: المدرسة التي لا تمرّ بمسار النشر اليدوي تبقى بلا حسابات دفترية حتى إعداد المالية).

المرحلة 4 — جدولة مدركة للفصول الدراسية

تعرف مرحلة الجدولة ثلاثة أشياء: دولة المدرسة، وهيكل الجدول المختار (الذي يحمل طابع المنهج)، وتاريخ اليوم. ومنها تشتق السنة الدراسية، وعدد الفصول الدراسية، وحدود كل فصل، وأي فصل نشط الآن.

التقويمات الأكاديمية

ACADEMIC_CALENDARS في src/components/school-dashboard/timetable/calendars.ts يربط رموز الدول بأنماط الفصول الافتراضية (مدقّقة وفق تقاويم الوزارات 2025–26؛ وكل التواريخ قابلة للتعديل لاحقاً من المدرسة ← الإعدادات ← الأكاديمية):

الدولةالفصولامتداد السنةالحدود (افتراضية)
SD2أكتوبر–يونيو1 أكت – 31 ينا · 1 فبر – 30 يون
SA2أغسطس–يونيو24 أغس – 8 ينا · 18 ينا – 25 يون
AE3أغسطس–يوليو25 أغس – 7 ديس · 5 ينا – 15 مار · 30 مار – 3 يول
QA2أغسطس–يونيو31 أغس – 27 ديس · 12 ينا – 30 يون
KW3سبتمبر–يونيو7 سبت – 16 ديس · 5 ينا – 2 أبر · 12 أبر – 16 يون
BH2سبتمبر–مايو3 سبت – 12 ينا · 1 فبر – 25 ماي
OM2أغسطس–يونيو27 أغس – 14 ينا · 15 ينا – 23 يون
EG2سبتمبر–يونيو20 سبت – 22 ينا · 7 فبر – 11 يون
JO2أغسطس–يونيو24 أغس – 24 ينا · 25 ينا – 15 يون
MA2سبتمبر–يونيو8 سبت – 30 ينا · 2 فبر – 30 يون
US2أغسطس–يونيو25 أغس – 19 ديس · 5 ينا – 12 يون
GB3سبتمبر–يوليو1 سبت – 19 ديس · 5 ينا – 9 أبر · 14 أبر – 22 يول
IN2أبريل–مارس1 أبر – 30 سبت · 1 أكت – 31 مار (التفاف السنة)
GULF2سبتمبر–يونيواحتياطي إقليمي
MENA2سبتمبر–يونيواحتياطي إقليمي
*2سبتمبر–يونيو1 سبت – 31 ينا · 1 فبر – 30 يون

ملاحظات مضمّنة في البيانات:

  • السعودية عادت إلى فصلين دراسيين في العام 1447هـ (2025–26) — نظام الفصول الثلاثة (2021) انتهى.
  • افتراضات السودان تقريبية لما قبل الحرب (ثقة منخفضة) — تحتاج تأكيداً يدوياً مع المدرسة.
  • الهند (CBSE) هي الوحيدة بسنة تبدأ في أبريل؛ computeTermDates() يعالج التفاف السنة الميلادية.

سلسلة الحسم

resolveAcademicCalendar(country, structureSlug)
  1. تجاوز من الهيكل      — مثلاً sd-british ← تقويم GB (مدرسة بريطانية في
                            السودان تتبع فصول المملكة المتحدة لا السودانية)
  2. مطابقة الدولة تماماً — SD, SA, AE, …
  3. احتياطي إقليمي       — SA/AE/QA/KW/BH/OM ← GULF · EG/JO/LB/TN/MA/DZ ← MENA
  4. الافتراضي (*)        — سبتمبر–يونيو، فصلان

ثم يثبّت computeTermDates(calendar, now) النمط على تواريخ حقيقية: يختار سنة الأساس من now مقابل yearStartMonth، ويلفّ الأشهر الواقعة قبل بداية السنة إلى السنة الميلادية التالية، ويسمّي السنة (2026/2027)، ويعلّم فصلاً واحداً بالضبط نشطاً — الفصل الذي يحوي اليوم، أو الفصل القادم بين الفصول.

ما تكتبه المرحلة

السجلالتفاصيل
SchoolYearامتداد مشتق من التقويم + yearName — يُتخطّى إن وُجد
Term ×Nكل فصول التقويم مع isActive صحيح التاريخ — يُتخطّى إن وُجد أيٌّ منها
Period ×Nمن هيكل الجدول (حصة/استراحة/غداء) — يُتخطّى إن وُجدت
SchoolWeekConfigأيام الدوام + الغداء-بعد-الحصة من الهيكل

نفس منطق التقويم يدعم التهيئة الاحتياطية في resolveActiveTerm() داخل src/lib/term-resolver.ts، فالمدرسة التي تصل إلى الجدول بلا فصول دراسية تحصل على الطقم الكامل الصحيح للدولة، لا على فصل واحد مؤقت.

هياكل الجدول (~23 هيكلاً لتوزيع الحصص الأسبوعي حسب الدولة ونوع المدرسة) ونظام ترشيحها موثّقة في تدفق التكامل.

المرحلة 5 — القاعات والشُعب

خطوة السعة في التهيئة الأولى تضبط School.sectionsPerGrade (افتراضي 2) وSchool.studentsPerSection (افتراضي 30). لكل AcademicGrade يُنشئ المهيّئ N قاعة رئيسية و N شعبة، مقترنتين واحدة-بواحدة:

الصف 7  ←  قاعة "Grade 7-A" (سعة 30، gradeId)  ↔  شعبة "Grade 7-A" (حرف A)
           قاعة "Grade 7-B" (سعة 30، gradeId)  ↔  شعبة "Grade 7-B" (حرف B)

هذا يرسّخ السلسلة التي تعتمد عليها بقية المنصة: القاعة الرئيسية ملك لصف، ومنهج الصف يحدد المواد التي تُدرَّس في تلك القاعة، والشعبة هي مجموعة الطلاب التي تسكنها. فمعرفة القاعة تعني معرفة صفها وموادها و(بعد المرحلة 6) جدولها الأسبوعي. الاقتران واحد-بواحد بحكم التصميم — Section.classroomId مفتاح مفرد، فلكل شعبة قاعة رئيسية واحدة فقط، ونوع الغرفة يحكم (القاعة الرئيسية من نوع classroom). راجع القاعات › التكامل.

المختبرات والمساحات المشتركة شيء آخر عمداً — ليست مملوكة لصف ولا تكون أبداً قاعة رئيسية لشعبة، فتُنشأ يدوياً من القوائم ← القاعات بنوع ClassroomType خاص بها (مختبر، حاسوب، مكتبة…) ويُوصَل إليها لكل حصة عبر الجدول، ويستطيع المولّد توجيه المواد المعلَّمة كمختبرات إليها.

عمليات الإدراج مفتاحها (schoolId, roomName) و(schoolId, gradeId, letter) — إعادة التشغيل لا تكرّر شيئاً أبداً.

المرحلة 6 — توليد الجدول

بوجود الصفوف والمواد والشُعب والحصص والفصول الدراسية، يشتق الجدول نفسه:

لكل شعبة (Grade N-X):
  المواد   = صفوف SubjectSelection للصف N (لكلٍ weeklyPeriods)
  القاعة   = القاعة المقترنة بالشعبة
  الشبكة   = أيام الدوام × الحصص التدريسية (بلا استراحات/غداء)
  ← وزّع المواد على الشبكة ← حصص Timetable

تُكتب الحصص مبنية على الشُعب — sectionId + subjectId + classroomId مع teacherId: null. لا يشترط وجود معلمين لتعليق الجدول على الحائط؛ يُسندون لاحقاً (خبرة لكل مادة، ثم لكل حصة). والكتابة عبر createMany({ skipDuplicates: true }) على قيد الفرادة المستوى-شعبة، فإعادة التوليد آمنة.

هذا الترتيب هو جوهر السلسلة كلها:

الجدول موجود (بلا معلمين)
  ← ضع الطلاب في الشُعب          (تنسيب القبول ← Student.sectionId)
  ← أسند المعلمين إلى المواد/الحصص (TeacherSubjectExpertise ← slot.teacherId)
  ← الحضور والاختبارات والتقارير تتدفق من هناك

لا شيء في الأسفل ينتظر "اكتمال" ما فوقه — تستطيع المدرسة تشغيل جدول يراه الطلاب قبل إسناد معلم واحد.

مسودّة الجدول الاحتياطية

إذا وصلت مدرسة إلى صفحة الجدول بلا فصول دراسية إطلاقاً (لم يُختر هيكل، أو ضاعت التهيئة)، فالشبكة لا تكتب شيئاً عند القراءة. تعرض جدولاً مركّباً من هيكل المدرسة (buildDraftSchedule()) مع شريط تنبيه وزرّ "Set up timetable" للمدير يشغّل مسار التهيئة الحقيقي.

طبيب التهيئة

getProvisioningStatus(schoolId) فحص صحي للقراءة فقط — جولة عدّ مجمّعة واحدة عبر كل مرحلة، آمن من لوحات المشغّل:

const status = await getProvisioningStatus(schoolId)
// status.counts   — yearLevels, departments, scoreRanges, academicLevels,
//                   academicGrades, subjectSelections, periods, terms,
//                   weekConfigs, classroomTypes, sections, timetableSlots, …
// status.missing  — مثلاً ["schedule", "timetable"]
// status.healthy  — missing.length === 0

قواعد "الناقص" الجديرة بالمعرفة:

  • schedule وtimetable لا يُعلَّمان إلا إذا كان School.timetableStructure مضبوطاً — المدرسة التي لم تختر هيكلاً ليست "معطوبة"، بل قبل-الجدولة.
  • schedule يُعلَّم أيضاً عند غياب SchoolWeekConfig (لا الحصص/الفصول فقط).
  • sections يُعلَّم عندما تكون الشُعب أو صفوف ClassroomType صفراً.
  • هيكل بمعرّف مجهول يُفشل المرحلة بصوت عالٍ الآن (يهبط في failed[]) بدل تعليمها مُصلَحة بصمت.
  • academicStreams وكتب المكتبة تُذكر في العدّ لكن لا تُعلَّم ناقصة أبداً — المسارات توجد فقط في المناهج التي تعرّفها، وتبنّي الكتب قرار مدرسي من منتقي المكتبة.

يشغّل repairProvisioning(schoolId) المراحل الناقصة بعزل أخطاء لكل مرحلة، ويعيد { repaired, failed, healthy, status }، واستدعاؤه على مدرسة سليمة آمن (لا-عملية).

سياسة classId القديم

تتقارب المنصة نحو الشعبة كوحدة التشغيل:

النطاقالمحورالحالة
الجدولsectionId + subjectIdأساسي — التوليد والتحرير اليدوي
الحضورsectionId (الكشف من Student.sectionId)أساسي — classId في السجلات القديمة تاريخ للقراءة فقط
تنسيب الطلابStudent.sectionIdأساسي (تنسيب القبول)
الاختبارات / النتائج / الواجباتclassId (شعبة-مادة)مُبقى عمداً — دفتر الدرجات يحتاج محور المقرر-المادة

يبقى Timetable.classId على الصفوف القديمة للتاريخ؛ وتحرير مثل هذه الحصة يملأ sectionId/subjectId فيُرحّلها في مكانها. لا تُنشأ بيانات جدول جديدة مبنية على classId.

أنماط الفشل

الناقصالأثر
timetableStructure فارغتُتخطّى مرحلتا الجدولة والجدول؛ تظهر المسودّة + الزر
مواد الفهرس غائبةاختيار المواد فارغ ← توليد الجدول ينسحب (No sections have subjects)
الفصول الدراسيةعروض الجدول تهبط للمسودّة؛ وضع الحصص في الحضور معطّل
الشُعبتوليد الجدول ينسحب؛ لا كشوف للحضور
SchoolWeekConfigالتوليد يفترض الأحد–الخميس بصمت — الطبيب يكشفه الآن
مهلة الخادم منتصف التشغيلrepairProvisioning() التالي يكمل البقية (idempotent)

فحص الجاهزية

const ready =
  levels > 0 &&
  grades > 0 &&
  selections > 0 &&
  classrooms > 0 &&
  periods > 0 &&
  terms > 0 &&
  weekConfig !== null
// المعلمون ليسوا شرطاً عمداً — الجدول يُهيّأ بلا معلمين

انظر أيضاً

  • تدفق التكامل — خريطة الطبقات الكاملة التي يقلعها هذا الخط
  • الفهرس — استنتاج المنهج، واحتياطي المواد، وإعدادات البنية لكل منهج
  • التهيئة الأولى — أي خطوة في المعالج تغذّي أي مدخل تهيئة
  • الجدول الدراسي — الميزة التي يهبط فيها خط التهيئة
تدفق التكامل (Integration Flow)القبول

On This Page

متى تعمل التهيئةالمراحلالمرحلة 4 — جدولة مدركة للفصول الدراسيةالتقويمات الأكاديميةسلسلة الحسمما تكتبه المرحلةالمرحلة 5 — القاعات والشُعبالمرحلة 6 — توليد الجدولمسودّة الجدول الاحتياطيةطبيب التهيئةسياسة classId القديمأنماط الفشلفحص الجاهزيةانظر أيضاً

من تطوير Databayt ·

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

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