{{-- resources/views/superadmin/proactive/command/decisions.blade.php --}} @extends('layouts.superadmin') @section('title', 'ProActive — القرارات') @section('page-title', 'قرارات ProActive') @section('content') @php use Illuminate\Support\Facades\Route; /* =========================== * ✅ safe_route داخل نفس الـView * =========================== */ if (!function_exists('safe_route')) { function safe_route(string $name, array $params = [], bool $absolute = true, string $fallback = '#'): string { try { return Route::has($name) ? route($name, $params, $absolute) : $fallback; } catch (\Throwable $e) { return $fallback; } } } /* =========================== * ✅ Inputs (مطابقة للكنترول) * =========================== */ $qs = request()->query(); $qv = fn($k,$d=null) => request()->get($k,$d); $range = (string)($range ?? $qv('range','all')); // today|week|month|all $view = (string)($view ?? $qv('view','table')); // table|cards $bucket = (string)($bucket ?? $qv('bucket','all')); // approve|reject|neutral|all $search = trim((string)($q ?? $qv('q',$qv('search','')))); // q أو search if(!in_array($range, ['today','week','month','all'], true)) $range = 'all'; if(!in_array($view, ['table','cards'], true)) $view = 'table'; if(!in_array($bucket, ['approve','reject','neutral','all'], true)) $bucket = 'all'; // ✅ من الكنترول: rows array $rows = $rows ?? []; if ($rows instanceof \Illuminate\Support\Collection) $rows = $rows->toArray(); if (!is_array($rows)) $rows = []; // ✅ stats من الكنترول: total/approve/reject $stats = $stats ?? [ 'total' => (int)($totalCount ?? count($rows)), 'approve' => (int)($approvedCount ?? 0), 'reject' => (int)($rejectedCount ?? 0), ]; /* =========================== * ✅ Routes * =========================== */ $rCommand = safe_route('superadmin.proactive.command', [], true, url('/superadmin/proactive/command')); $rDecisions = safe_route('superadmin.proactive.decisions', [], true, url()->current()); /* =========================== * ✅ UI Helpers * =========================== */ $chip = fn($cls) => "px-2.5 py-1 rounded-xl border text-[11px] font-extrabold $cls"; $makeUrl = function(array $merge) use ($qs, $rDecisions) { $q = array_merge($qs, $merge); foreach ($q as $k=>$v) if ($v === null || $v === '') unset($q[$k]); return $rDecisions.'?'.http_build_query($q); }; $rangeBtn = function($key, $label, $activeCls, $idleCls) use ($range, $makeUrl) { return [ 'url' => $makeUrl(['range'=>$key]), 'cls' => ($range===$key ? $activeCls : $idleCls), 'label' => $label, ]; }; $bucketBtn = function($key, $label, $activeCls, $idleCls) use ($bucket, $makeUrl) { return [ 'url' => $makeUrl(['bucket'=>$key]), 'cls' => ($bucket===$key ? $activeCls : $idleCls), 'label' => $label, ]; }; $ranges = [ $rangeBtn('today','اليوم', 'border-emerald-400/40 bg-emerald-500/15 text-emerald-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $rangeBtn('week','أسبوع', 'border-cyan-400/40 bg-cyan-500/15 text-cyan-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $rangeBtn('month','شهر', 'border-fuchsia-400/40 bg-fuchsia-500/15 text-fuchsia-100','border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $rangeBtn('all','الكل', 'border-amber-400/40 bg-amber-500/15 text-amber-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), ]; $buckets = [ $bucketBtn('all','الكل', 'border-amber-400/40 bg-amber-500/15 text-amber-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $bucketBtn('approve','قبول', 'border-emerald-400/40 bg-emerald-500/15 text-emerald-100','border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $bucketBtn('reject','رفض', 'border-rose-400/40 bg-rose-500/15 text-rose-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), $bucketBtn('neutral','محايد', 'border-slate-400/25 bg-slate-500/10 text-slate-100', 'border-white/10 bg-white/5 text-white/80 hover:text-white hover:bg-white/10'), ]; /* =========================== * ✅ Decision mapping (يشمل report_approved) * =========================== */ $bucketOf = function(string $type): string { $t = strtolower(trim($type)); if ($t === '') return 'neutral'; // reject if (in_array($t, ['report_rejected','rejected','reject','deny','denied','decline','declined','cancel','cancelled','blocked','block','ban','banned'], true)) return 'reject'; if (str_contains($t, 'reject') || str_contains($t, 'deny') || str_contains($t, 'declin') || str_contains($t, 'رفض') || str_contains($t, 'مرفوض')) return 'reject'; // approve if (in_array($t, ['report_approved','approved','approve','accept','accepted','allow','allowed','mark_active','mark_finished','mark_upcoming','restore','restored'], true)) return 'approve'; if (str_contains($t, 'approv') || str_contains($t, 'accept') || str_contains($t, 'allow') || str_contains($t, 'قبول') || str_contains($t, 'مقبول')) return 'approve'; return 'neutral'; }; $badgeDecision = function(string $type) use ($chip, $bucketOf){ $b = $bucketOf($type); if ($b === 'approve') return $chip('border-emerald-400/25 bg-emerald-500/10 text-emerald-100'); if ($b === 'reject') return $chip('border-rose-400/25 bg-rose-500/10 text-rose-100'); return $chip('border-amber-400/25 bg-amber-500/10 text-amber-100'); }; $kindLabel = function(string $type) use ($bucketOf){ $t = strtolower(trim($type)); return match(true){ $t === 'mark_active' => 'تثبيت Active', $t === 'mark_finished' => 'إنهاء', $t === 'mark_upcoming' => 'إرجاع Upcoming', $t === 'cancel' || $t === 'cancelled' => 'إلغاء', $t === 'report_approved' => 'قبول تقرير', $t === 'report_rejected' => 'رفض تقرير', $bucketOf($type) === 'approve' => 'قبول', $bucketOf($type) === 'reject' => 'رفض', default => strtoupper($type ?: 'DECISION'), }; }; $hasItems = count($rows) > 0; @endphp
{{-- HERO --}}
ProActive • سجل قرارات القيادة

القرارات — Decisions

أي حركة “إدارية” لازم تنسجل: قبول/رفض إثبات، إنهاء فعالية، إلغاء، تصعيد… هذا السجل = مرجع رسمي عند أي جدال.

إجمالي: {{ (int)($stats['total'] ?? 0) }} قبول: {{ (int)($stats['approve'] ?? 0) }} رفض: {{ (int)($stats['reject'] ?? 0) }}
{{-- FILTER --}}
تصفير
* المدى: {{ $range }} • النوع: {{ $bucket }}
{{-- RANGES --}}
@foreach($ranges as $r) {{ $r['label'] }} @endforeach @foreach($buckets as $b) {{ $b['label'] }} @endforeach
{{-- LIST --}} @if($hasItems) @if($view === 'cards')
@foreach($rows as $d) @php // ✅ أسماء أعمدة مطابقة للكنترول $id = (int)($d['id'] ?? 0); $targetId = (int)($d['schedule_id'] ?? 0); $type = (string)($d['decision_type'] ?? ''); $note = (string)($d['note'] ?? ''); $by = (string)($d['decided_by_name'] ?? '-'); $at = (string)($d['created_at'] ?? ''); $evTitle = (string)($d['schedule_title'] ?? ('#'.$targetId)); $leader = (string)($d['leader_name'] ?? '-'); $plat = (string)($d['platform'] ?? '-'); $when = trim((string)(($d['event_date'] ?? '').' '.($d['event_time'] ?? ''))); @endphp
{{ $evTitle }}
{{ $leader !== '' ? $leader : '-' }} • {{ $plat !== '' ? $plat : '-' }}
{{ $kindLabel($type) }}
الموعد
{{ $when !== '' ? $when : '—' }}
المنفّذ
{{ $by }}
ID
{{ $id }}
سبب/ملاحظة
{{ $note !== '' ? $note : '— بدون ملاحظة —' }}
{{ $at }} Target: {{ $targetId ?: '—' }}
@endforeach
@else
سجل القرارات
يعرض أحدث القرارات أولاً.
@foreach($rows as $d) @php $id = (int)($d['id'] ?? 0); $targetId = (int)($d['schedule_id'] ?? 0); $type = (string)($d['decision_type'] ?? ''); $note = (string)($d['note'] ?? ''); $by = (string)($d['decided_by_name'] ?? '-'); $at = (string)($d['created_at'] ?? ''); $evTitle = (string)($d['schedule_title'] ?? ('#'.$targetId)); $leader = (string)($d['leader_name'] ?? '-'); $plat = (string)($d['platform'] ?? '-'); $when = trim((string)(($d['event_date'] ?? '').' '.($d['event_time'] ?? ''))); @endphp @endforeach
القرار الهدف القائد/المنصة المنفّذ الملاحظة الوقت
{{ $kindLabel($type) }}
#{{ $id }}
{{ $evTitle }}
Target: {{ $targetId ?: '—' }} • موعد: {{ $when !== '' ? $when : '—' }}
{{ $leader !== '' ? $leader : '-' }}
{{ $plat !== '' ? $plat : '-' }}
{{ $by }}
{{ $note !== '' ? $note : '—' }}
{{ $at }}
@endif @else
لا يوجد قرارات ضمن هذا الفلتر
جرّب تغيّر المدى أو اختر فلتر (قبول/رفض) أو اكتب كلمة بحث مختلفة.
@endif
@endsection