TeamMate هو نظام شامل لإدارة الحضور والمناوبات عبر الويب مصمم للفرق والمؤسسات. يوفر التطبيق التعاون الجماعي في الوقت الفعلي، وجدولة المناوبات، وتتبع الحضور، وإدارة العمل الإضافي، وطلبات الإجازات - كل ذلك في واجهة حديثة ومتجاوبة.
بيان المشكلة:
إدارة حضور الفريق والمناوبات والجداول يدويًا تستغرق وقتًا طويلاً وعرضة للأخطاء. تحتاج المؤسسات إلى نظام مركزي لتتبع حضور الموظفين، وإدارة جداول المناوبات المعقدة، والتعامل مع العمل الإضافي وطلبات الإجازات بكفاءة، وتوفير التحكم في الوصول على أساس الدور.
الميزات الرئيسية:
- المصادقة وإدارة المستخدمين: تسجيل الدخول عبر Google مع Firebase، وإنشاء ملف تعريف المستخدم تلقائيًا، واستمرار الجلسة، والتحكم في الوصول على أساس الدور (المالك، المسؤول، العضو).
- إدارة الفريق: إنشاء وإدارة فرق متعددة، وصور رمزية للفريق، وأرشفة/إلغاء أرشفة الفرق، والتوجيه القائم على URL مع slugs.
- إدارة الأعضاء: إضافة أعضاء عبر دعوة البريد الإلكتروني، وتحرير الأدوار، والعمليات الجماعية، والاستيراد/التصدير (CSV، Excel، PDF)، وقدرات التصفية/الفرز.
- إدارة قوالب المناوبات: إنشاء قوالب مناوبات مخصصة مع ترميز الألوان، وتحديد ساعات المناوبة، وتعيين المناوبات لأعضاء الفريق.
- إدارة الجدول الزمني: عرض شبكة التقويم الشهري (واجهة تشبه Excel)، وتعيين المناوبة بالسحب والإفلات، والتحديثات في الوقت الفعلي، والتصدير إلى Excel/PDF.
- تتبع الحضور: وظيفة تسجيل الدخول/الخروج، وتكامل كشف الوجه (واجهة المستخدم جاهزة)، وسجل الحضور، وتتبع التأخير/المغادرة المبكرة، وإدارة العطلات.
- العمل الإضافي والإجازات: طلب والموافقة على العمل الإضافي/الإجازات مع تتبع الحالة، وفئات إجازة متعددة، وتتبع الرصيد.
التقنيات المستخدمة:
- الواجهة الأمامية: Kotlin/JS، kotlinx-html DSL، Kotlin Wrappers، Vanilla CSS
- الخلفية: Firebase Authentication، Cloud Firestore، Firebase Storage
- أدوات البناء: Gradle (Kotlin DSL)، Webpack
- الاختبار: Playwright للاختبار الشامل
- النشر: Vercel
الهندسة المعمارية:
يتبع المشروع هندسة معمارية نظيفة قائمة على الميزات مع التصميم الموجه بالمجال (DDD)، ونمط المستودع، وإدارة الحالة المركزية، واستراتيجية التخزين المؤقت التي تقلل من قراءات Firestore بنسبة ~80٪.
الأداء والأمان:
- قواعد أمان Firestore شاملة مع أذونات قائمة على الدور
- التخزين المؤقت في الذاكرة مع TTL (افتراضي 5 دقائق)
- تحسين حجم الحزمة باستخدام Webpack tree-shaking
- التحميل الأولي < 2 ثانية على اتصال 3G