39669-vm/application_detail.php
2026-04-17 03:38:41 +00:00

275 lines
15 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/app.php';
$flash = consume_flash();
$applicationId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) ?: 0;
$application = $applicationId > 0 ? get_application($applicationId) : null;
if (!$application) {
http_response_code(404);
render_page_start('طلب غير موجود', 'applications', 'لم يتم العثور على طلب فتح المركز المطلوب.');
render_flash($flash);
?>
<section class="py-5">
<div class="container-xxl">
<div class="app-card text-center py-5">
<div class="empty-title mb-2">الطلب غير موجود</div>
<p class="text-muted mb-3">تحقق من رقم المرجع أو ارجع إلى لوحة الطلبات.</p>
<a class="btn btn-primary" href="applications.php">العودة إلى القائمة</a>
</div>
</div>
</section>
<?php
render_page_end();
exit;
}
$reviewErrors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['action']) && $_POST['action'] === 'update_subjects') {
$selected_subjects = isset($_POST['subjects']) && is_array($_POST['subjects']) ? $_POST['subjects'] : [];
$valid_subjects = [];
foreach ($selected_subjects as $sid) {
$sid = filter_var($sid, FILTER_VALIDATE_INT);
if ($sid) $valid_subjects[] = $sid;
}
update_application_subjects($applicationId, $valid_subjects);
set_flash('success', 'تم تحديث المواد الدراسية بنجاح.');
header('Location: application_detail.php?id=' . urlencode((string) $applicationId));
exit;
}
$status = clean_text((string) ($_POST['status'] ?? 'submitted'), 30);
$adminNotes = clean_text((string) ($_POST['admin_notes'] ?? ''), 1000);
$evaluationScore = filter_var($_POST['evaluation_score'] ?? null, FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 100],
]);
if (($_POST['evaluation_score'] ?? '') !== '' && $evaluationScore === false) {
$reviewErrors['evaluation_score'] = 'أدخل درجة بين 0 و100.';
}
if ($reviewErrors === []) {
try {
update_application_review($applicationId, $status, $adminNotes, $evaluationScore === false ? null : $evaluationScore);
if ($status === 'approved') {
set_flash('success', 'تم اعتماد المركز بنجاح، وهذه هي صفحة الهبوط الخاصة به بعد الموافقة.');
header('Location: approved_school.php?id=' . urlencode((string) $applicationId));
exit;
}
set_flash('success', 'تم تحديث حالة الطلب وملاحظات التقييم بنجاح.');
header('Location: application_detail.php?id=' . urlencode((string) $applicationId));
exit;
} catch (Throwable $exception) {
$reviewErrors['form'] = 'تعذر حفظ التحديث الآن. حاول مرة أخرى.';
}
}
}
$application = get_application($applicationId);
$statusMeta = status_meta((string) $application['status']);
$scoreValue = $application['evaluation_score'] !== null ? max(0, min(100, (int) $application['evaluation_score'])) : null;
render_page_start('تفاصيل الطلب #' . $applicationId, 'applications', 'عرض تفصيلي لطلب فتح المركز مع نموذج المراجعة للمشرف العام.');
render_flash($flash);
?>
<section class="py-4 py-lg-5">
<div class="container-xxl">
<div class="admin-layout row g-4 align-items-start">
<div class="col-lg-3 layout-sidebar-column">
<?php require __DIR__ . '/includes/sidebar.php'; ?>
</div>
<div class="col-lg-9 layout-content-column">
<div class="page-banner mb-4 mb-lg-5">
<div class="row g-4 align-items-start">
<div class="col-lg-8">
<span class="eyebrow mb-3">ملف مستقل للمراجعة</span>
<h1 class="page-title mb-2"><?= e((string) $application['center_name']) ?></h1>
<p class="page-copy mb-3">مرجع الطلب #<?= e((string) $application['id']) ?> — مقدم الطلب <?= e((string) $application['director_name']) ?> من <?= e((string) $application['city']) ?>.</p>
<div class="hero-meta">
<span>تاريخ الإرسال: <?= e((string) $application['submitted_at']) ?></span>
<span>آخر تحديث: <?= e((string) $application['updated_at']) ?></span>
</div>
</div>
<div class="col-lg-4">
<div class="page-banner-panel h-100 status-panel">
<div class="mini-stat-label">الحالة الحالية</div>
<div class="mb-3"><?= status_badge((string) $application['status']) ?></div>
<div class="mini-stat-copy">هذا الملف مخصص لاتخاذ القرار وتوثيق الملاحظات بدلاً من خلطه مع قائمة الطلبات.</div>
<a class="btn btn-outline-secondary btn-sm mt-3" href="admin.php">العودة إلى لوحة الإدارة</a>
<?php if ((string) $application['status'] === 'approved'): ?>
<a class="btn btn-primary btn-sm mt-3" href="approved_school.php?id=<?= e((string) $application['id']) ?>">فتح صفحة المركز المعتمد</a>
<?php endif; ?>
</div>
</div>
</div>
</div>
<div class="row g-4 align-items-start">
<div class="col-lg-8">
<div class="app-card detail-card mb-4">
<div class="section-head mb-4">
<div>
<div class="section-title">بيانات المركز</div>
<div class="section-copy">عرض منظم لجميع البيانات المرسلة من صاحب الطلب في بطاقة واحدة.</div>
</div>
<div class="d-flex flex-wrap gap-2">
<a class="btn btn-outline-secondary btn-sm px-3" href="admin.php">لوحة الإدارة</a>
<a class="btn btn-outline-secondary btn-sm px-3" href="applications.php">العودة إلى القائمة</a>
</div>
</div>
<div class="row g-3 detail-grid">
<div class="col-md-6"><div class="detail-item"><span>نوع المركز</span><strong><?= e((string) $application['center_type']) ?></strong></div></div>
<div class="col-md-6"><div class="detail-item"><span>الفئة المستهدفة</span><strong><?= e((string) $application['gender_scope']) ?></strong></div></div>
<div class="col-md-6"><div class="detail-item"><span>رقم الهاتف</span><strong><?= e((string) $application['phone']) ?></strong></div></div>
<div class="col-md-6"><div class="detail-item"><span>البريد الإلكتروني</span><strong><?= e((string) $application['email']) ?></strong></div></div>
<div class="col-md-6"><div class="detail-item"><span>السعة المتوقعة</span><strong><?= e((string) $application['expected_students']) ?> طالب</strong></div></div>
<div class="col-md-6"><div class="detail-item"><span>الدورة / الفترة</span><strong><?= e((string) ($application['cycle_name'] ?? 'دورة مخصصة')) ?> (<?= e((string) $application['start_date']) ?> — <?= e((string) $application['end_date']) ?>)</strong></div></div>
</div>
<div class="notes-block mt-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="section-title small-title mb-0">المواد الدراسية المطلوبة</div>
<button type="button" class="btn btn-outline-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#editSubjectsModal">تعديل المواد</button>
</div>
<div class="d-flex flex-wrap gap-2">
<?php
$selected_subjects = json_decode((string) ($application['subjects'] ?? '[]'), true) ?: [];
$all_subjects = get_enabled_subjects();
$subject_map = [];
foreach ($all_subjects as $sub) {
$subject_map[$sub['id']] = $sub['name'];
}
if (empty($selected_subjects)):
?>
<span class="text-muted small">لم يتم اختيار أي مواد.</span>
<?php else: ?>
<?php foreach ($selected_subjects as $sub_id): ?>
<span class="badge bg-secondary"><?= e($subject_map[$sub_id] ?? 'مادة غير معروفة') ?></span>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
<div class="notes-block mt-4">
<div class="section-title small-title mb-2">ملخص البرنامج والاحتياجات</div>
<p class="mb-0 text-muted"><?= nl2br(e((string) ($application['notes'] ?: 'لا توجد ملاحظات إضافية.'))) ?></p>
</div>
</div>
<div class="app-card detail-card">
<div class="section-title mb-3">سجل المراجعة</div>
<div class="timeline-list">
<div class="timeline-item">
<div class="timeline-title">تم استلام الطلب</div>
<div class="timeline-copy text-muted">أُرسل الطلب بتاريخ <?= e((string) $application['submitted_at']) ?>.</div>
</div>
<div class="timeline-item">
<div class="timeline-title">الحالة الحالية: <?= e($statusMeta['label']) ?></div>
<div class="timeline-copy text-muted">آخر تحديث موثق بتاريخ <?= e((string) $application['updated_at']) ?>.</div>
</div>
<div class="timeline-item">
<div class="timeline-title">ملاحظات المشرف العام</div>
<div class="timeline-copy text-muted"><?= nl2br(e((string) ($application['admin_notes'] ?: 'لم تُسجل ملاحظات بعد.'))) ?></div>
</div>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="app-card sidebar-card mb-4">
<div class="section-title mb-3">ملخص القرار</div>
<?php if ($scoreValue !== null): ?>
<div class="score-bar mb-3" aria-label="درجة التقييم الأولي">
<span style="width: <?= e((string) $scoreValue) ?>%"></span>
</div>
<?php endif; ?>
<div class="summary-stack">
<div class="summary-row"><span>الحالة</span><strong><?= e($statusMeta['label']) ?></strong></div>
<div class="summary-row"><span>درجة الاستعداد</span><strong><?= $scoreValue !== null ? e((string) $scoreValue) . '%' : 'غير محددة' ?></strong></div>
<div class="summary-row"><span>آخر تحديث</span><strong><?= e((string) $application['updated_at']) ?></strong></div>
</div>
</div>
<div class="app-card sidebar-card">
<div class="section-title mb-3">إجراء المشرف العام</div>
<div class="section-copy mb-3">هذه البطاقة مخصصة فقط لتغيير الحالة وتسجيل قرار المراجعة على هذا الطلب.</div>
<?php if (!empty($reviewErrors['form'])): ?>
<div class="alert alert-danger"><?= e($reviewErrors['form']) ?></div>
<?php endif; ?>
<form method="post" novalidate>
<div class="mb-3">
<label class="form-label" for="status">حالة الطلب</label>
<select class="form-select" id="status" name="status">
<?php foreach (status_map() as $value => $meta): ?>
<option value="<?= e($value) ?>" <?= (string) $application['status'] === $value ? 'selected' : '' ?>><?= e($meta['label']) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="evaluation_score">درجة التقييم الأولي</label>
<input type="number" min="0" max="100" class="form-control <?= isset($reviewErrors['evaluation_score']) ? 'is-invalid' : '' ?>" id="evaluation_score" name="evaluation_score" value="<?= e((string) ($application['evaluation_score'] ?? '')) ?>" placeholder="مثال: 85">
<?php if (isset($reviewErrors['evaluation_score'])): ?><div class="invalid-feedback"><?= e($reviewErrors['evaluation_score']) ?></div><?php endif; ?>
</div>
<div class="mb-3">
<label class="form-label" for="admin_notes">ملاحظات التقييم</label>
<textarea class="form-control" id="admin_notes" name="admin_notes" rows="6" placeholder="سجّل نقاط القوة أو النواقص المطلوب استكمالها."><?= e((string) ($application['admin_notes'] ?? '')) ?></textarea>
</div>
<div class="d-grid gap-2">
<button class="btn btn-primary" type="submit">حفظ التحديث</button>
<?php if ((string) $application['status'] === 'approved'): ?>
<a class="btn btn-outline-dark" href="approved_school.php?id=<?= e((string) $application['id']) ?>">معاينة صفحة المركز</a>
<?php endif; ?>
<a class="btn btn-outline-secondary" href="admin.php">لوحة الإدارة</a>
<a class="btn btn-outline-secondary" href="applications.php">العودة إلى القائمة</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Modal for Editing Subjects -->
<div class="modal fade" id="editSubjectsModal" tabindex="-1" aria-labelledby="editSubjectsModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form method="post">
<input type="hidden" name="action" value="update_subjects">
<div class="modal-header border-bottom-0">
<h5 class="modal-title" id="editSubjectsModalLabel">تعديل المواد الدراسية</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="إغلاق"></button>
</div>
<div class="modal-body">
<div class="row g-2">
<?php foreach ($all_subjects as $sub): ?>
<?php $isChecked = in_array($sub['id'], $selected_subjects); ?>
<div class="col-md-6">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="subjects[]" value="<?= e((string)$sub['id']) ?>" id="subject_modal_<?= e((string)$sub['id']) ?>" <?= $isChecked ? 'checked' : '' ?>/>
<label class="form-check-label" for="subject_modal_<?= e((string)$sub['id']) ?>">
<?= e($sub['name']) ?>
</label>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="modal-footer border-top-0">
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">إلغاء</button>
<button type="submit" class="btn btn-primary">حفظ التغييرات</button>
</div>
</form>
</div>
</div>
</div>
<?php render_page_end(); ?>