البنية التقنية
يعتمد نظام إدارة تصاريح دخول الزوار على بنية تقنية موحدة مبنية على لغة C# وبيئة .NET 10 (LTS)، حيث يتم تطوير الخادم باستخدام إطار عمل ASP.NET Core Web API مع تطبيق نمط التحكم (Controllers) لإدارة الطلبات، بينما تعتمد واجهة المستخدم على صفحات Razor أو عرض MVC مدمجاً داخل مشروع .NET نفسه دون الحاجة إلى مشروع واجهة منفصل، مما يضمن اتساق الأداء وسهولة الصيانة. يتم إدارة البيانات عبر Entity Framework Core مع قاعدة بيانات Microsoft SQL Server في بيئة الإنتاج، مع إمكانية استخدام SQLite للتشغيل المحلي والاختبارات، وتُدار التغييرات في مخطط قاعدة البيانات عبر هجرات EF Core (Migrations) لضمان التتبع الدقيق للتحديثات. يتكون مستودع الكود من ملف حل واحد (sln) في الجذر يحتوي على مشروع التطبيق الرئيسي ومشروع اختبارات xUnit الذي يشير إلى مشروع التطبيق، مع تحديد إطار العمل المستهدف net10.0. تُنظم الملفات في مجلدات رئيسية: مجلد Controllers للتحكم في الطلبات، مجلد Views لعرض الواجهات مع بنية فرعية لكل متحكم، مجلد Data لمخرجات قاعدة البيانات والهجرات، مجلد Services لتعريف وتنفيذ الخدمات، ومجلد Infrastructure لدعم المصادقة والتطوير. قبل كتابة أي كود، يتم توثيق العقد المشترك في ملف docs/CONTRACT.md الذي يحدد أسماء الكيانات، التعدادات، أنواع النتائج المشتركة، وواجهات الخدمات مع توقيعات دوالها الدقيقة، بما في ذلك لاحقة Async وترتيب المعاملات، لضمان التوحيد في جميع الوحدات. يتبع كل وحدة قواعد صارمة: يتم تسجيل DbContext وجميع الخدمات في Program.cs باستخدام نمط AddScoped، مع إنهاء الملف بـ public partial class Program { } لتمكن الاختبارات من بدء التطبيق. يتم تسجيل HtmlEncoder مع UnicodeRanges.All لضمان عرض النصوص العربية بشكل صحيح دون ترميز. عند البحث عن سجل بمعرّف غير موجود، تعيد الدالة قيمة null ولا ترمي استثناءً، بينما تعالج الصفحات أو نقاط النهاية غير الموجودة برد 404 أو إعادة توجيه برسالة، وتجنب أخطاء الخادم. تُضبط المفاتيح والعلاقات والفهارس في OnModelCreating، وتُحدد مزود قاعدة البيانات من الإعدادات (Database:Provider) لاختيار بين SQLite وSQL Server. في بيئة التطوير والاختبارات، تُستخدم SQLite دون الحاجة إلى خادم خارجي، وتُستخدم بيانات اختبار تفي بمفاتيح الأجنبيات. تُستخدم ASP.NET Core Authentication للمصادقة، مع حماية الصفحات باستخدام [Authorize(Roles = ...)]، وقراءة بيانات المستخدم من User وليس من الترويسات. في بيئة التطوير، يُستخدم DevelopmentSignIn.cs للمصادقة عبر ترويسات X-Dev-User وX-Dev-Roles، بينما تُستخدم المصادقة الفعلية في الإنتاج. يُعامل معرّف المستخدم كنص (string) وليس رقماً، وتُستخدم await HttpContext.SignOutAsync() دون تحديد مخطط. تُعزل الأنظمة الخارجية (البريد، الرسائل) خلف واجهات، مع تسجيل الرسائل غير المرسلة في السجل دون فشل العملية. تُختبر الخدمات عبر SQLite في الذاكرة، وتُختبر الصفحات عبر WebApplicationFactory<Program> مع تسجيل الدخول بدور مسموح، مع التركيز على التحقق من فتح الصفحات وحفظ النماذج، دون اختبار الوصول أو الترميز أو الأنظمة الخارجية.
الوحدات البرمجية
- MOD-01وحدة الأساس والتهيئة: تقع في جذر المشروع ومجلد Data ومجلد Infrastructure. تتضمن ملف Program.cs لتسجيل DbContext وجميع الخدمات في حاوية الحقن، وملف docs/CONTRACT.md لتوثيق العقد المشترك، ومجلد Data لمخرجات قاعدة البيانات والهجرات (Migrations) التي تحدد مخطط SQL Server وSQLite، ومجلد Infrastructure لدعم المصادقة متعددة العوامل (NFR-06) والتشفير (NFR-03) وإدارة اللغات (NFR-04). تخدم هذه الوحدة جميع المتطلبات الوظيفية وغير الوظيفية كبنية تحتية مشتركة.
- MOD-02وحدة إدارة الطلبات: تقع في مجلد Controllers (VisitRequestController) ومجلد Services (VisitRequestService). تنفذ إنشاء طلب الزيارة الإلكتروني (FR-01) مع استيراد بيانات الموظف المستضيف تلقائياً من نظام الموارد البشرية (FR-12)، وإدارة حالات الطلب (مقدم، قيد المراجعة، معتمد، مرفوض)، وإرسال إشعارات فورية عند تغيير الحالة (FR-08).
- MOD-03وحدة المراجعة والاعتماد: تقع في مجلد Controllers (ApprovalController) ومجلد Services (ApprovalService). توفر لوحة تحكم للجهة المختصة لمراجعة الطلبات المعلقة واعتمادها أو رفضها عن بُعد مع توثيق سبب الرفض (FR-02)، وعرض حالة الطلبات بشكل لحظي (FR-07)، مع تطبيق صلاحيات دقيقة تمنع الوصول غير المصرح به (FR-10).
- MOD-04وحدة التصاريح ورموز QR: تقع في مجلد Controllers (PassController) ومجلد Services (PassService). تولّد رمز QR فريد لكل تصريح معتمد (FR-03)، وتعرض بيانات التصريح وتاريخ سريانه (SCR-04)، وتوفر واجهة برمجية (API) لأجهزة البوابات لقراءة الرمز والتحقق الفوري من المطابقة (FR-04) ضمن زمن استجابة أقل من 30 ثانية (NFR-01).
- MOD-05وحدة التحقق عند البوابة: تقع في مجلد Controllers (GateController) ومجلد Services (GateService). تدعم عمليات مسح رمز QR أو الإدخال المباشر (FR-11)، وتسجل بيانات دخول وخروج الزائر تلقائياً في قاعدة البيانات المركزية لحظة التحقق (FR-05)، مع ضمان تسجيل جميع الحركات في سجل دائم غير قابل للتعديل (NFR-05).
- MOD-06وحدة السجلات التاريخية والتدقيق: تقع في مجلد Controllers (AuditController) ومجلد Services (AuditService). تتيح استرجاع سجلات الزيارات والعمليات المسجلة خلال أقل من 5 ثوانٍ بناءً على معايير بحث محددة (FR-06، NFR-05)، مع ضمان عدم إمكانية التعديل أو الحذف من قبل المستخدمين العاديين، وتوفير سجلات تدقيق غير قابلة للتعديل لمحاولات الدخول (NFR-06).
- MOD-07وحدة التقارير الإحصائية: تقع في مجلد Controllers (ReportController) ومجلد Services (ReportService). تولّد تقارير إحصائية أسبوعية تلقائية تتضمن حجم الزيارات وأنواعها وتوزيعها الزمني (FR-09)، مع دعم التبديل الفوري بين اللغتين العربية والإنجليزية دون فقدان البيانات (NFR-04).