0 ? get_application($applicationId) : null; $isApprovedSchool = $application && (string) $application['status'] === 'approved'; $values = attendance_defaults(); $errors = []; $cycleContext = ['cycles' => [], 'selected' => null, 'active' => null, 'read_only' => false]; $selectedCycle = null; $selectedCycleId = 0; $isCycleReadOnly = false; $cycleLabel = 'لا توجد دورة بعد'; if ($application && $isApprovedSchool) { $cycleContext = resolve_school_cycle_context((int) $application['id'], $application, $requestedCycleId); $selectedCycle = $cycleContext['selected']; $selectedCycleId = $selectedCycle ? (int) ($selectedCycle['id'] ?? 0) : 0; $isCycleReadOnly = (bool) $cycleContext['read_only']; $cycleLabel = $selectedCycle ? (string) $selectedCycle['cycle_name'] : $cycleLabel; } if ($_SERVER['REQUEST_METHOD'] === 'POST' && $application) { if (!$isApprovedSchool) { $errors['form'] = 'لا يمكن فتح سجل الغياب قبل اعتماد المركز.'; } elseif ($selectedCycleId <= 0) { $errors['form'] = 'يرجى إنشاء دورة موسمية أولاً من صفحة المركز.'; } elseif ($isCycleReadOnly) { $errors['form'] = 'هذه الدورة مؤرشفة للقراءة فقط. افتح دورة جديدة أو اختر دورة نشطة لإضافة غياب جديد.'; } else { [$values, $errors] = validate_attendance_input_for_cycle((int) $application['id'], $selectedCycleId, $_POST); if ($errors === []) { try { create_attendance_record_in_cycle((int) $application['id'], $selectedCycleId, $values); set_flash('success', 'تم حفظ سجل الغياب داخل الدورة الموسمية المحددة.'); header('Location: ' . school_page_url('attendance.php', (int) $application['id'], $selectedCycleId)); exit; } catch (PDOException $exception) { $duplicateCode = isset($exception->errorInfo[1]) && (int) $exception->errorInfo[1] === 1062; if ($duplicateCode) { $errors['attendance_date'] = 'يوجد سجل غياب سابق لهذا الطالب في نفس التاريخ داخل هذه الدورة.'; } else { $errors['form'] = 'تعذر حفظ سجل الغياب حالياً. يرجى المحاولة مرة أخرى.'; } } catch (Throwable $exception) { $errors['form'] = 'تعذر حفظ سجل الغياب حالياً. يرجى المحاولة مرة أخرى.'; } } } } $students = $isApprovedSchool && $selectedCycleId > 0 ? list_school_students_by_cycle((int) $application['id'], $selectedCycleId) : []; $studentOptions = $isApprovedSchool && $selectedCycleId > 0 ? school_student_options_by_cycle((int) $application['id'], $selectedCycleId) : []; $search = clean_text($_GET['search'] ?? '', 255); $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1; $limit = 10; $offset = ($page - 1) * $limit; $records = $isApprovedSchool && $selectedCycleId > 0 ? list_school_attendance_records_by_cycle((int) $application['id'], $selectedCycleId, $search, $limit, $offset) : []; $totalRecords = $isApprovedSchool && $selectedCycleId > 0 ? count_school_attendance_records_by_cycle((int) $application['id'], $selectedCycleId, $search) : 0; $metrics = $isApprovedSchool && $selectedCycleId > 0 ? school_attendance_metrics_by_cycle((int) $application['id'], $selectedCycleId) : [ 'total' => 0, 'absent' => 0, 'excused' => 0, 'late' => 0, 'affected_students' => 0, 'latest_date' => '', 'today_count' => 0, ]; $studentMetrics = $isApprovedSchool && $selectedCycleId > 0 ? school_student_metrics_by_cycle((int) $application['id'], $selectedCycleId) : [ 'total' => 0, 'boys' => 0, 'girls' => 0, 'active' => 0, 'waiting' => 0, 'withdrawn' => 0, ]; $teacherMetrics = $isApprovedSchool && $selectedCycleId > 0 ? school_teacher_metrics_by_cycle((int) $application['id'], $selectedCycleId) : [ 'total' => 0, 'active' => 0, 'pending' => 0, 'inactive' => 0, 'teachers' => 0, 'supervisors' => 0, ]; $assessmentMetrics = $isApprovedSchool && $selectedCycleId > 0 ? school_assessment_metrics_by_cycle((int) $application['id'], $selectedCycleId) : [ 'total' => 0, 'active' => 0, 'inactive' => 0, 'total_weight' => 0, 'active_weight' => 0, 'average_max_score' => 0, 'percentage' => 0, 'points' => 0, 'rubric' => 0, ]; $trackedStudents = max(1, $studentMetrics['active']); $incidentRate = $metrics['total'] > 0 ? round(($metrics['affected_students'] / $trackedStudents) * 100, 1) : 0.0; $latestDateLabel = $metrics['latest_date'] !== '' ? $metrics['latest_date'] : 'لا يوجد'; $pageTitle = $application ? 'غياب الطلاب: ' . (string) $application['center_name'] . ($selectedCycle ? ' — ' . $cycleLabel : '') : 'غياب الطلاب'; $pageDescription = 'صفحة مستقلة لتسجيل غياب الطلاب والأعذار وحالات التأخر للمراكز المعتمدة داخل دورة موسمية محددة.'; $approvedSchoolUrl = $application ? school_page_url('approved_school.php', (int) $application['id'], $selectedCycleId) : 'approved_school.php'; $studentsUrl = $application ? school_page_url('students.php', (int) $application['id'], $selectedCycleId) : 'students.php'; $teachersUrl = $application ? school_page_url('teachers.php', (int) $application['id'], $selectedCycleId) : 'teachers.php'; $assessmentsUrl = $application ? school_page_url('assessments.php', (int) $application['id'], $selectedCycleId) : 'assessments.php'; $applicationDetailUrl = $application ? 'application_detail.php?id=' . urlencode((string) $application['id']) : 'application_detail.php'; if (!$application) { http_response_code(404); } render_page_start($pageTitle, 'approved', $pageDescription, (string) ($application['favicon'] ?? '')); render_flash($flash); ?>
المدرسة غير موجودة

تحقق من رابط المدرسة أو ارجع إلى قائمة المراكز المعتمدة.

المراكز المعتمدة
الغياب يبدأ بعد الاعتماد

تم تجهيز صفحة غياب الطلاب، لكن استخدامها مرتبط بتحويل حالة المركز إلى معتمد أولاً حتى يبقى السجل اليومي محصوراً بالمراكز الجاهزة للتشغيل.

الحالة الحالية: المدينة:
صفحة مستقلة لغياب الطلاب

سجل الغياب —

هنا يتم تسجيل الغياب اليومي، الأعذار، وحالات التأخر في صفحة تشغيلية منفصلة. كل سجل يرتبط مباشرة بطالب محدد داخل هذا المركز فقط.

طلاب عليهم ملاحظات حضور آخر تحديث
ملخص الانضباط اليومي
0): ?>
%نسبة الطلاب المتأثرين
السجلات اليوم
الغياب بدون عذر
الغياب بعذر / تأخر
الدورة الموسمية الحالية
سجلات الغياب في هذه الصفحة تخص الدورة . عند أرشفة الدورة تبقى السجلات محفوظة للمراجعة فقط بدون خلطها بالموسم التالي.
اسم الدورة
الفترة
عدد الدورات دورة للمركز
هذه الدورة مؤرشفة، لذلك تبقى صفحة الغياب للقراءة فقط حالياً.
كشف الغياب اليومي
جميع سجلات الغياب والتأخر المرتبطة بهذا المركز فقط، مرتبة من الأحدث إلى الأقدم.
سجل / طلاب
الغياب حالة
بعذر حالة
تأخر حالة
السجلات اليوم حالة
لا توجد سجلات غياب بعد

ابدأ من النموذج في الجانب الأيمن لإضافة أول سجل غياب أو تأخر لهذا المركز.

الطالب التاريخ الحالة السبب المتابعة
سياق المدرسة
الطلاب النشطون طالب/طالبة
الفريق التعليمي عضو
التقييمات المفعلة نوع
آخر سجل