@extends('layouts.superadmin') @section('title', 'إدارة التقييمات - الإدارة العليا') @section('content') @php // ضمان عدم انهيار الصفحة لو المتغير مش مُمرر $filterType = $filterType ?? request('filter_type', 'all'); // مؤشرات سريعة (على مستوى العناصر المعروضة بالصفحة الحالية فقط) $pageCollection = method_exists($evaluations, 'getCollection') ? $evaluations->getCollection() : collect($evaluations); $pageStats = [ 'pending' => $pageCollection->where('status', 'pending')->count(), 'approved' => $pageCollection->where('status', 'approved')->count(), 'rejected' => $pageCollection->where('status', 'rejected')->count(), 'present' => $pageCollection->where('attendance_status', 'present')->count(), 'absent_with_excuse' => $pageCollection->where('attendance_status', 'absent_with_excuse')->count(), 'absent_without_excuse'=> $pageCollection->where('attendance_status', 'absent_without_excuse')->count(), 'auto_excuse' => $pageCollection->filter(function ($e) { return (bool) data_get($e, 'auto_excuse_applied') || (bool) data_get($e, 'auto_excuse_mode') || (bool) data_get($e, 'excuse_absence_id'); })->count(), 'edited' => $pageCollection->filter(function ($e) { return (int) data_get($e, 'edit_count', 0) > 0; })->count(), ]; // دالة تنسيق تاريخ (Carbon أو DateTime أو string) $fmtDate = function ($d) { if (!$d) return null; if ($d instanceof \Carbon\CarbonInterface) return $d->format('Y-m-d'); if ($d instanceof \DateTimeInterface) return $d->format('Y-m-d'); return (string) $d; }; @endphp
{{-- ✅ HERO (ستايل سقراط) --}}
{{-- نص الهيرو --}}
لوحة تحكم احترافية للتقييمات اليومية — الإدارة العليا

إدارة التقييمات متابعة أداء الأعضاء والمشرفين وفق معايير مهنية دقيقة @if($filterType == 'moderators') – عرض تقييمات كل المشرفين @elseif($filterType == 'male_moderators') – المشرفين الذكور @elseif($filterType == 'female_moderators') – المشرفات الإناث @elseif($filterType == 'official_members') – الأعضاء الرسميين @elseif($filterType == 'beta_members') – أعضاء بيتا @elseif($filterType == 'all_members') – كل الأعضاء @else – جميع التقييمات @endif

هذه الواجهة مخصّصة للإدارة العليا لمراجعة واعتماد التقييمات بشكل احترافي. كل تقييم يتم إدخاله يؤثر مباشرةً على مكانة العضو داخل الفريق، سجله التراكمي، مميزاته، وفرصه في الترقي وتحمل مسؤوليات إضافية. لذلك، نحرص على الدقة، العدالة، والكتابة بصدق في كل تقييم.

{{-- 3 نقاط رئيسية (ستايل سقراط) --}}

كل تقييم = سمعة ومكانة

النقاط، الملاحظات، والإنذارات تشكّل “ملف مهني” للعضو. كن دقيقًا وموضوعيًا، فكل سطر تكتبه يبقى أثره على المدى البعيد.

الكتابة بصدق وبلغة صحيحة

احرص على سلامة الإملاء، وضوح الجُمل، وتجنّب المجاملة أو التهويل. التقييم الواضح يساعد الذكاء الاصطناعي والإدارة على فهم الحالة الحقيقية للعضو.

الحضور والغياب يؤثران مباشرة

فرّق دائمًا بين حاضر، غائب بعذر، وغائب بدون عذر؛ فكل حالة تُحسب بشكل مختلف في نظام النقاط والانضباط ومميزات العضو.

{{-- شارات إضافية --}}
مراجعة مدعومة بالذكاء الاصطناعي عدالة وشفافية في القرار متابعة يومية للحالة والانضباط يدعم العذر الرسمي التلقائي عند وجود غياب معتمد
{{-- كارد معلومات الإدارة (سقراط) --}}
مسؤول النظام
{{ auth()->user()->name }}
الإدارة العليا
تذكير: مراجعة التقييمات المعلقة يوميًا تقلل تراكم الأخطاء والانحيازات، وتحافظ على ثقة الأعضاء في عدالة النظام.
  • تجنّب قبول تقييمات تحتوي على تجريح شخصي أو عبارات غير مهنية.
  • تأكد من توافق حالة الحضور مع النقاط والإنذارات.
  • راقب التقييمات المتكررة لنفس العضو من نفس المقيم؛ فقد تشير إلى تحيز.
  • عند وجود عذر رسمي معتمد: النظام يفعّل العذر التلقائي ويقفل التلاعب بالحضور والنقاط.
{{-- ✅ ميثاق التقييم + توضيح الذكاء الاصطناعي (سقراط) --}}
{{-- ميثاق التقييم --}}
إرشادات
ميثاق التقييم المهني
اقرأ هذه الإرشادات قبل كتابة أو اعتماد أي تقييم
  1. اكتب التقييم بصياغة مهنية محترمة، بعيدة عن التجريح أو السخرية أو الإيحاءات الشخصية.
  2. احرص على سلامة الإملاء وعلامات الترقيم؛ فالتقييم يُقرأ لاحقًا من قبل الإدارة وأنظمة الذكاء الاصطناعي، وأي غموض قد يسبب تفسيرًا خاطئًا.
  3. صِف الوقائع بدقة: وقت الحضور، مستوى التفاعل، نوع المخالفة إن وجدت، ولا تكتفِ بجمل عامة مثل: “غير متعاون” أو “ممتاز دائمًا”.
  4. حدّد حالة الحضور بدقة: حاضر / غائب بعذر / غائب بدون عذر، فكل حالة تُؤثّر بشكل مختلف على نقاط العضو وسجله ومزاياه داخل الفريق.
  5. تجنّب المبالغة في المدح أو الذم؛ التقييم المهني يعتمد على وقائع قابلة للمراجعة وليس على الانطباعات الشخصية فقط.
  6. عند وجود غياب رسمي معتمد، النظام يطبّق العذر تلقائيًا: يتم ضبط الحضور، تصفير النقاط، وتعطيل ملاحظات المُقيِّم (لمنع التضارب).
{{-- كارد الذكاء الاصطناعي --}}
مساعدة تحليلية
مراجعة آلية مدعومة بالذكاء الاصطناعي

يتم تمرير التقييمات من خلال طبقة تحليل آلية للمساعدة في كشف الأخطاء المتكررة، رصد الانحياز، والتأكد من منطقية التوافق بين الحضور والنقاط. لذلك، احرص على الكتابة بصدق ووضوح وعدل.

  • • رصد التقييمات المتكررة لنفس العضو من نفس المقيم.
  • • كشف العبارات غير المهنية أو المخالفة لسياسة الفريق.
  • • الإشارة إلى تناقضات بين حالة الحضور والنقاط والإنذارات.
  • • دعم الإدارة بقرارات مبنية على بيانات واضحة وليست انطباعات فقط.

جودة كتابتك للتقييم تعكس احترافيتك وتُسهم في بناء نظام موثوق وعادل للجميع.

{{-- ✅ FLASH (سقراط) --}} @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- ✅ STATS CARDS (ستايل سقراط) --}}
إجمالي المستخدمين
{{ number_format($stats['total_users']) }}
إجمالي التقييمات
{{ number_format($stats['total_evaluations']) }}
قيد المراجعة
{{ number_format($stats['pending']) }}
معتمدة
{{ number_format($stats['approved']) }}
{{-- ✅ مؤشرات سريعة (سقراط) --}}
مؤشرات سريعة (الصفحة الحالية)
هذه المؤشرات تساعدك تكتشف بسرعة إذا في تراكم معلّق، أو ارتفاع غياب، أو تشغيل العذر التلقائي بشكل واسع.
ملاحظة: المؤشرات هنا تخص النتائج المعروضة فقط (وليست إجمالي قاعدة البيانات).
{{ $pageStats['pending'] }}
معلّق
{{ $pageStats['approved'] }}
معتمد
{{ $pageStats['rejected'] }}
مرفوض
{{ $pageStats['present'] }}
حاضر
{{ $pageStats['absent_with_excuse'] }}
غائب بعذر
{{ $pageStats['auto_excuse'] }}
عذر تلقائي
تم تعديل (في الصفحة الحالية): {{ $pageStats['edited'] }} تقييم.
{{-- ✅ البحث والتصفية (ستايل سقراط + بدون لمس المنطق) --}}
فلترة
البحث والتصفية
{{-- اختيار نوع الفلتر (ستايل سقراط) --}} {{-- فلاتر إضافية --}}
{{-- إضافات جديدة (لن تكسر شيئًا لو الكنترولر ما بيدعمها بعد) --}}

يظهر فقط إذا كان النظام يسجل بيانات العذر التلقائي داخل التقييم.

تذكير: كتابة المعطيات (تاريخ، اسم، حالة) بشكل صحيح يساعد التحليل الآلي على التقاط التناقضات بسرعة.
{{-- ✅ أزرار الإجراءات (سقراط) --}}
إجمالي: {{ $previousEvaluations->flatten()->count() }} تقييم
{{-- ✅ قائمة التقييمات (سقراط) --}}
عرض
قائمة التقييمات
تذكير: كل تقييم يؤثر على مسار العضو؛ دقّق قبل الاعتماد أو الحذف.
@if($evaluations->count() > 0)
@foreach ($previousEvaluations as $key => $multipleEvaluations) @foreach ($multipleEvaluations->sortByDesc('id') as $evaluation) @php $key = $evaluation->user_id . '_' . optional($evaluation->evaluation_date)->format('Y-m-d'); $multipleEvaluations = isset($previousEvaluations) && isset($previousEvaluations[$key]) ? $previousEvaluations[$key] : collect([]); $count = $multipleEvaluations->count(); // بيانات العذر التلقائي (مرنة حسب أسماء الأعمدة) $autoExcuseApplied = (bool) data_get($evaluation, 'auto_excuse_applied') || (bool) data_get($evaluation, 'auto_excuse_mode') || (bool) data_get($evaluation, 'excuse_absence_id'); $excuseReason = data_get($evaluation, 'excuse_reason') ?? data_get($evaluation, 'excuse_absence_reason') ?? data_get($evaluation, 'absence_reason'); $excuseStart = data_get($evaluation, 'excuse_from') ?? data_get($evaluation, 'excuse_start') ?? data_get($evaluation, 'excuse_start_date'); $excuseEnd = data_get($evaluation, 'excuse_to') ?? data_get($evaluation, 'excuse_end') ?? data_get($evaluation, 'excuse_end_date'); $excuseDaysTotal = data_get($evaluation, 'excuse_days_total') ?? data_get($evaluation, 'excuse_total_days'); $excuseDaysRemaining = data_get($evaluation, 'excuse_days_remaining') ?? data_get($evaluation, 'excuse_remaining_days'); // ملخص ملاحظات (لو موجود) $notes = data_get($evaluation, 'admin_notes') ?? data_get($evaluation, 'notes') ?? data_get($evaluation, 'evaluator_notes') ?? data_get($evaluation, 'remarks'); // تنبيهات منطقية (للسوبر أدمن) $integrityFlags = []; if (($evaluation->attendance_status ?? null) === 'absent_with_excuse' && (int)($evaluation->total_daily_points ?? 0) !== 0) { $integrityFlags[] = 'غائب بعذر لكن النقاط ليست صفر. راجع منطق العذر/النقاط.'; } if (($evaluation->attendance_status ?? null) === 'absent_without_excuse' && (int)($evaluation->total_daily_points ?? 0) > 0) { $integrityFlags[] = 'غائب بدون عذر لكن لديه نقاط إيجابية. راجع التقييم.'; } if (($evaluation->attendance_status ?? null) === 'present' && (int)($evaluation->whatsapp_presence ?? 0) == 0 && (int)($evaluation->tiktok_interaction ?? 0) == 0 && empty($notes)) { $integrityFlags[] = 'حاضر لكن لا نقاط تواجد/تفاعل ولا ملاحظات. قد يكون تقييمًا غير مكتمل.'; } @endphp {{-- ✅ كارد التقييم (ستايل سقراط) --}}
{{-- رأس البطاقة --}}
{{-- صورة المستخدم --}}
@if($evaluation->user->avatar) {{ $evaluation->user->name }} @else
@endif @if($evaluation->user->is_online)
@endif
{{-- معلومات المستخدم --}}

{{ $evaluation->user->name }}

{{ $evaluation->user->username }}

@php $userRole = $evaluation->user->roles->first(); $roleNames = [ 'moderator' => 'مشرف', 'official-member' => 'عضو رسمي', 'member' => 'عضو بيتا' ]; $roleColors = [ 'moderator' => 'bg-purple-500/10 text-purple-200 border border-purple-400/25', 'official-member' => 'bg-emerald-500/10 text-emerald-200 border border-emerald-400/25', 'member' => 'bg-cyan-500/10 text-cyan-200 border border-cyan-400/25' ]; @endphp
@if($userRole) {{ $roleNames[$userRole->name] ?? $userRole->name }} @endif @if($count > 1) {{ $count }} تقييمات في نفس اليوم @endif @if((int)($evaluation->edit_count ?? 0) > 0) معدل ({{ $evaluation->edit_count }}) @endif @if($autoExcuseApplied) عذر رسمي تلقائي @endif
{{-- محتوى البطاقة --}}
{{-- تاريخ التقييم --}}
تاريخ التقييم: {{ optional($evaluation->evaluation_date)->format('Y/m/d') }}
{{-- المقيم --}}
المقيم: @if($evaluation->show_evaluator_name) {{ $evaluation->evaluator->name }} @else مجهول الهوية @endif
{{-- الحالة --}}
حالة التقييم: @if($evaluation->status == 'approved') معتمد @elseif($evaluation->status == 'rejected') مرفوض @else قيد المراجعة @endif
{{-- حالة الحضور --}}
الحضور: @if($evaluation->attendance_status == 'present') حاضر @elseif($evaluation->attendance_status == 'absent_with_excuse') غائب بعذر @else غائب بدون عذر @endif
{{-- مربع العذر التلقائي --}} @if($autoExcuseApplied || ($evaluation->attendance_status == 'absent_with_excuse' && ($excuseReason || $excuseStart || $excuseEnd)))
تم تطبيق غياب رسمي تلقائيًا (إن وُجد غياب معتمد)
نمط العذر التلقائي
@if($excuseStart || $excuseEnd)
الفترة: {{ $fmtDate($excuseStart) ?? '—' }} → {{ $fmtDate($excuseEnd) ?? '—' }}
@endif @if($excuseDaysTotal !== null || $excuseDaysRemaining !== null)
المدة: {{ $excuseDaysTotal !== null ? $excuseDaysTotal : '—' }} يوم المتبقي: {{ $excuseDaysRemaining !== null ? $excuseDaysRemaining : '—' }} يوم
@endif @if($excuseReason)
السبب: {{ $excuseReason }}
@endif
ملاحظة: عند وجود عذر رسمي، يتم قفل التلاعب بالحضور، وتصفير النقاط، وقد يتم تعطيل ملاحظات المُقيِّم حسب النظام.
@endif {{-- شبكة المقاييس --}}
واتساب
{{ $evaluation->whatsapp_presence }}
تيكتوك
{{ $evaluation->tiktok_interaction }}
الإنذارات
{{ $evaluation->warnings_count }}
النقاط
{{ (int)($evaluation->total_daily_points ?? 0) > 0 ? '+' : '' }}{{ $evaluation->total_daily_points }}
{{-- ملخص الملاحظات --}} @if(!empty($notes))
ملخص الملاحظات

{{ $notes }}

@endif {{-- تنبيهات منطقية --}} @if(!empty($integrityFlags))
تنبيه تدقيق (للتأكد قبل الاعتماد)
    @foreach($integrityFlags as $flag)
  • {{ $flag }}
  • @endforeach
@endif {{-- معلومات تقييمات أخرى بنفس اليوم --}} @if($count > 1)
ملاحظة: يوجد {{ $count }} تقييمات لهذا العضو في نفس التاريخ
@foreach($multipleEvaluations->sortByDesc('id') as $otherEval)
{{ $otherEval->show_evaluator_name ? $otherEval->evaluator->name : 'مقيم مجهول' }} {{ $otherEval->total_daily_points }} نقطة
@endforeach
يتم عرض أحدث تقييم فقط ({{ optional($evaluation->evaluation_date)->format('Y/m/d') }})
@endif
{{-- تذييل البطاقة --}}
المقيم: @if($evaluation->show_evaluator_name) @if((int)($evaluation->edit_count ?? 0) > 0) {{ $evaluation->evaluator->name }} (معدل) @else {{ $evaluation->evaluator->name }} @endif @else مجهول الهوية @if((int)($evaluation->edit_count ?? 0) > 0) (معدل) @endif @endif
{{-- عرض --}} {{-- تعديل --}} {{-- اعتراض --}} @if(method_exists($evaluation, 'objection') && $evaluation->objection) @endif {{-- اعتماد --}} @if($evaluation->status == 'pending') @endif {{-- رفض --}} @if($evaluation->status == 'pending') @endif {{-- حذف --}} {{-- نسخ رقم التقييم --}}
رقم التقييم: {{ $evaluation->id }}
@endforeach @endforeach
{{-- Pagination --}}

عرض {{ $evaluations->firstItem() }} إلى {{ $evaluations->lastItem() }} من أصل {{ $evaluations->total() }} نتيجة

{{ $evaluations->withQueryString()->links() }}
@else

لا توجد تقييمات

لم يتم العثور على أي تقييمات للفلتر المحدد، جرّب تغيير إعدادات البحث أو التواريخ.

@endif
{{-- ===================== MODALS (سقراط) ===================== --}} {{-- مودال اعتماد التقييم --}} {{-- مودال حذف التقييم --}} {{-- مودال الاعتراض --}} {{-- مودال رفض التقييم --}} @endsection