البنية التقنية
يعتمد النظام على إطار عمل .NET 8 (LTS) مع ASP.NET Core MVC وEntity Framework Core، حيث يعمل الخادم على قاعدة بيانات Microsoft SQL Server في بيئة الإنتاج، بينما تُستخدم SQLite في بيئات التطوير والاختبار لضمان التوافق دون الحاجة لخادم قاعدة بيانات منفصل. يتكون المستودع من ملف الحل TemplateV4.sln الذي يضم عدة مشاريع: App.Domain لتعريف الكيانات والتعدادات، وApp.Helper للأنواع المساعدة وDTOs، وApp.Application لتعريفات الخدمات وملفات الخرائط، وApp.Infrastructure لتنفيذ الخدمات وإعدادات قاعدة البيانات، وApp.Web للتحكمات والعروض، وأخيراً App.Tests لاختبارات xUnit. تتبع الكيانات قاعدة تسمية موحدة حيث ترث من EntityBase التي توفر الحقول العامة مثل المعرف وتواريخ الإنشاء والتعديل، وتُعرّف الجداول باستخدام خاصية [Table] مع اسم الجمع، وتُضاف قيود التحقق مثل [Required] و[StringLength] على الحقول، مع جعل خصائص التنقل افتراضية (virtual). تُوضع التعدادات في مشروع App.Domain ضمن مساحة الاسم App.Domain.Enums، بينما تُخزن نماذج العرض (DTOs) في مشروع App.Helper ضمن مساحة الاسم App.Helper.Dto، مع استخدام خاصية [Display] لتعيين التسميات العربية ورسائل التحقق. تُعرّف واجهات الخدمات في مشروع App.Application ضمن مساحات أسماء فرعية لكل نطاق (مثل IRoomService)، بينما تُنفذ الخدمات في مشروع App.Infrastructure باستخدام نمط Unit of Work، حيث تُرجع الخدمات كائنات DTO أو قيم null/false عند عدم وجود السجل، وتستخدم PaginatedResult<T> لعرض القوائم مع التصفية والفرز. تُربط الكيانات بنماذج العرض عبر ملفات AutoMapper في مشروع App.Application، وتُضاف إعدادات الكيانات المتقدمة (مثل الفهارس والعلاقات) في مشروع App.Infrastructure ضمن مجلد Configurations. في مشروع App.Web، ترث التحكمات من BaseController وتستخدم خاصية [PermissionAuthorize] للتحقق من الصلاحيات، مع تمييز بين طلبات GET وPOST واستخدام [ValidateAntiForgeryToken] للعمليات التي تتضمن إرسال بيانات. تُبنى العروض (Views) باستخدام Razor Pages داخل مجلد Views/<ControllerName>، وتلتزم بتصميم RTL كامل مع استخدام مكتبة Bootstrap 4 ومكونات القالب الموحدة مثل card card-green وbtn btn-main، وتُعرض الرسائل عبر Swal.fire، وتُنفذ العمليات عبر jQuery مع إرسال رمز الحماية. تُكتب الاختبارات في مشروع App.Tests، حيث تختبر الخدمات ضد قاعدة بيانات SQLite في الذاكرة (TestDatabase) للتحقق من منطق الأعمال، وتختبر الصفحات عبر IClassFixture<TestApplication> باستخدام دور SuperAdmin لضمان وصول كامل، مع التركيز على التحقق من صحة البيانات وحالة الاستجابة (200) ومحتوى JSON بدلاً من اختبار الصلاحيات أو عناصر القالب العامة.
الوحدات البرمجية
- MOD-01وحدة الأساس والتهيئة: تقع في مجلدات App.Domain وApp.Infrastructure وApp.Helper، وتضم تعريف الكيانات Room وBooking مع التعدادات RoomStatus وBookingStatus، وملفات إعدادات قاعدة البيانات (Configurations) التي تحدد الفهارس والعلاقات، بالإضافة إلى ملفات الخرائط (AutoMapper) وواجهات الخدمات الأساسية التي تعتمد عليها بقية الوحدات، مما يضمن اتساق البيانات وتطبيق قيود التحقق والتشفير المطلوب في NFR-05.
- MOD-02وحدة إدارة القاعات: تقع في مجلد WebApps/App.Web/Controllers/RoomController.cs مع العروض المرتبطة، وتنفذ منطق إضافة القاعات وتعديل بياناتها (السعة والتجهيزات) وتغيير حالتها بين المتاحة والموقوفة للصيانة، مع ضمان عدم تكرار الأسماء والتحقق من صحة المدخلات، وتتبع متطلبات BR-06 وBR-07 وBR-08.
- MOD-03وحدة عرض القاعات المتاحة: تقع في واجهة الموظف ضمن RoomController (إجراء Index مخصص للموظف) أو في وحدة عرض مخصصة، وتعرض قائمة بالقاعات المتاحة فقط مع تفاصيل السعة والتجهيزات، مع تطبيق التصفية حسب التاريخ والوقت وإخفاء القاعات الموقوفة تلقائياً، لضمان استجابة سريعة خلال ثانيتين كما في NFR-01.
- MOD-04وحدة إنشاء الحجوزات: تقع في BookingController مع خدمة BookingService في App.Infrastructure، وتنفذ التحقق من عدم التداخل الزمني مع الحجوزات القائمة على نفس القاعة (FR-03)، وإنشاء الحجز الجديد، وإرسال إشعار التأكيد عبر البريد الإلكتروني المؤسسي (FR-05)، مع ضمان إتمام العملية خلال خمس ثوانٍ (NFR-02).
- MOD-05وحدة إدارة حجوزات الموظف: تقع في BookingController (إجراء MyBookings) وتتيح للموظف الاطلاع على سجل حجوزاته وإلغاء أي حجز مؤكد، مع تحديث حالة الحجز فوراً وإرسال إشعار الإلغاء، وتطبيق مبدأ أقل صلاحيات بحيث لا يرى الموظف إلا بياناته الخاصة (NFR-04).
- MOD-06وحدة التقارير الشهرية للإشغال: تقع في ReportController أو ضمن RoomController (إجراء MonthlyReport)، وتقوم بحساب نسبة الإشغال لكل قاعة بناءً على ساعات الحجز الفعلية مقارنة بالساعات المتاحة، مع استثناء فترات الصيانة من الحساب، وتعرض النتائج في جداول ورسوم بيانية تدعم اتخاذ القرارات الإدارية.
- MOD-07وحدة التوثيق والصلاحيات: تعتمد على نظام التوثيق المركزي (SSO) الموجود مسبقاً في القالب، وتضيف تعريف الصلاحيات الجديدة للوحات (Room - Index, Booking - Create, etc.) في ModulePermissions.cs، مع تطبيق مبدأ أقل صلاحيات (Least Privilege) لضمان وصول مدير المرافق فقط إلى لوحات الإدارة، والموظف إلى لوحات الحجز فقط (NFR-04).