التحدي
كانت Hart College تدير القبول عبر موقع تسويقي عام، وتسجيل الدورات في جدول بيانات منفصل، وتحصيل الرسوم الدراسية بالشيكات والتحويل الإلكتروني، والتواصل مع الطلاب عبر صندوق بريد مشترك. لم يكن شيء منها متطابقاً. كان المسؤولون يعيدون إدخال كل طالب جديد في ثلاثة أماكن، ولم يكن لدى أمين السجل إجابة موحدة عن سؤال «من المسجّل في هذه الدفعة؟»، وكانت الإدارة المالية تقضي أسبوعاً كاملاً كل شهر في ملاحقة المدفوعات المفقودة ومطابقتها مع أسماء لا تتطابق تماماً بين الأنظمة.
كان المطلوب بسيطاً في ظاهره: استبدال كل ذلك بنظام معلومات طلابي (SIS) واحد يستطيع فيه المرشح اكتشاف دورة من صفحة تسويقية عامة، والتسجيل في دفعة محددة، ودفع الرسوم الدراسية إلكترونياً، ورؤية جدوله وسجل مدفوعاته في بوابة ذاتية الخدمة — ويستطيع المسؤول إنشاء الدفعات والدورات والقسائم والمرشحين والمرفقات من لوحة واحدة دون جداول بيانات موازية ودون أعمال مطابقة في نهاية الشهر.
حلّنا
بنينا نظام SIS واحداً مخصصاً عبر ثلاث واجهات منسقة: كتالوج دورات عام بـ Next.js، وبوابة للطلاب للتسجيل والرسوم الدراسية، ولوحة إدارة بـ Django + Django REST Framework — وكلها مدعومة بـ PostgreSQL وتكامل Stripe Payments + Webhooks الذي يُبقي نظام SIS مصدراً وحيداً للحقيقة لكل دولار.
يقدم الموقع العام كتالوج Next.js سريعاً ومحسّناً لـ SEO: لكل دورة صفحة تفاصيل قابلة للفهرسة وجدول الدفعة والمتطلبات المسبقة وتفصيل الرسوم الدراسية ودعوة مضمّنة «سجّل الآن» — فيصبح الموقع التسويقي أيضاً أعلى مسار التسجيل لا كتيباً منفصلاً. وبمجرد نقر المرشح، يصل إلى جلسة Stripe Checkout تُنشأ على الخادم بالمبلغ والعملة والقسيمة ومعرّف الدفعة الصحيحة مضمّنة في البيانات الوصفية.
عند نجاح الدفع، يصل webhook من Stripe إلى واجهة Django API ويُنشئ الطالب أو يحدّثه بشكل غير مكرر الأثر، ويربطه بالدفعة المختارة، ويرفق الإيصال، ويرسل رسالة تأكيد بالبريد — كل ذلك في معاملة موقّعة واحدة. ثم تعرض بوابة الطالب «دوراتي» و«جدولي» و«رسومي الدراسية» (مع سجل المدفوعات والمبالغ المستردة كاملاً) وتبويباً للمستندات الخاصة بالكشوف الدراسية والهوية والاتفاقيات الموقّعة.
توفر لوحة إدارة Django لأمين السجل مكاناً واحداً لإدارة البرنامج بالكامل: إنشاء دفعة، وربط الدورات وأعضاء هيئة التدريس بها، وتحديد رموز القسائم (نسبة مئوية أو مبلغ ثابت، بنطاق لكل دفعة أو لكل دورة)، ورفع سجلات المرشحين والمرفقات، ونشر الإعلانات، واستخراج تقارير التسجيل والإيرادات دون فتح Excel. وتفصل الأدوار بين أمين السجل والإدارة المالية وهيئة التدريس والمسؤول بحيث لا يرى كل مستخدم إلا الواجهة التي يحتاجها.
وأخيراً، ربطنا webhooks الخاصة بـ Stripe بشكل غير مكرر الأثر، وقفلنا سجلات الرسوم الدراسية بمجموع اختباري (checksum) ليتمكن القسم المالي من إثبات تطابق SIS مع Stripe، وزودنا كل نقطة نهاية بـ Sentry + CloudWatch، وخزّنا كل ملف PDF موقّع / هوية مرفوعة في S3 بروابط موقّعة محددة المدة (دون وصول مباشر إلى الكائنات).
- كتالوج دورات عام بـ Next.js محسّن لـ SEO بصفحة قابلة للفهرسة لكل دورة وجدول الدفعات ودعوة مضمّنة «سجّل الآن»
- جلسات Stripe Checkout تُنشأ على الخادم مع معرّف الدفعة ورمز القسيمة والعملة وتفصيل الرسوم الدراسية مضمّنة في البيانات الوصفية
- webhooks غير مكررة الأثر من Stripe — الطالب وربط الدفعة وصف الرسوم وبريد الإيصال تُكتب كلها في معاملة موقّعة واحدة
- بوابة الطالب مع دوراتي وجدولي ورسومي الدراسية (سجل المدفوعات والمبالغ المستردة كاملاً) ورفع المستندات
- لوحة إدارة Django: الدفعات والدورات والقسائم (نسبة مئوية أو مبلغ ثابت، بنطاق لكل دفعة أو دورة) والمرشحون والمرفقات والإعلانات
- وصول مفصول الأدوار لأمين السجل والإدارة المالية وهيئة التدريس والمسؤول — يرى كل مستخدم الواجهة التي يستخدمها فعلاً فقط
- مطابقة الرسوم الدراسية بمجموع اختباري ليتمكن القسم المالي من إثبات تطابق SIS وStripe في أي لحظة دون فتح Excel
- S3 + روابط موقّعة محددة المدة لكل كشف درجات وهوية واتفاقية موقّعة — دون وصول مباشر إلى الكائنات