@extends('layouts.teamlead') @section('title', 'Панель тімліда') @section('page_title', 'Панель тімліда') @push('head') {{-- Окремий CSS для дашборду тімліда --}} @endpush @section('content') @php $cabinetsCount = $cabinets->count(); // середній рейтинг по балансах $avgBalanceScore = null; if (!empty($cabinetRatings)) { $vals = collect($cabinetRatings) ->pluck('score') ->filter(fn($v) => $v !== null); if ($vals->count()) { $avgBalanceScore = round($vals->avg(), 1); } } // середній рейтинг по статистиці $avgStatsScore = null; if (!empty($cabinetStatsRatings)) { $vals2 = collect($cabinetStatsRatings) ->filter() ->pluck('score') ->filter(fn($v) => $v !== null); if ($vals2->count()) { $avgStatsScore = round($vals2->avg(), 1); } } $selectedMonth = $selectedMonth ?? now()->format('Y-m'); // опціонально: попередній місяць (якщо колись додаси в контролер) $avgBalancePrev = $avgBalancePrev ?? null; $avgStatsPrev = $avgStatsPrev ?? null; $avgBalanceDeltaPct = null; if ($avgBalanceScore !== null && $avgBalancePrev) { $avgBalanceDeltaPct = round((($avgBalanceScore - $avgBalancePrev) / $avgBalancePrev) * 100, 1); } $avgStatsDeltaPct = null; if ($avgStatsScore !== null && $avgStatsPrev) { $avgStatsDeltaPct = round((($avgStatsScore - $avgStatsPrev) / $avgStatsPrev) * 100, 1); } // коротке імʼя без "T1" і т.п. if ($user && $user->name) { $parts = explode(' ', $user->name); $shortName = $parts[0] ?? $user->name; } else { $shortName = 'Тімлід'; } @endphp {{-- Заголовок + красивий фільтр по місяцю --}}

Привіт, {{ $shortName }}!

Тут ти бачиш усі свої кабінети, операторів по змінах та їх рейтинг від 0 до 100, а також окремо загальний рейтинг кабінетів по балансах та по статистиці (New / Young / Old / Spend).

Місяць
{{-- Верхні картки --}}
{{-- 1. Кількість кабінетів --}}
Кабінетів у тебе
{{ $cabinetsCount }}
Кількість кабінетів, за які ти відповідаєш.
{{-- 2. Середній рейтинг по балансах --}}
Середній рейтинг кабінетів (баланси)
@if($avgBalanceScore !== null) {{ $avgBalanceScore }} / 100 @if($avgBalanceDeltaPct !== null) @if($avgBalanceDeltaPct >= 0) +{{ number_format($avgBalanceDeltaPct, 1) }}% @else {{ number_format($avgBalanceDeltaPct, 1) }}% @endif @endif @else немає даних @endif
По балансах змін за місяць {{ $currentMonth }}.
100 = норма виконана або перевиконана.
{{-- 3. Середній рейтинг по статистиці --}}
Середній рейтинг кабінетів (статистика)
@if($avgStatsScore !== null) {{ $avgStatsScore }} / 100 @if($avgStatsDeltaPct !== null) @if($avgStatsDeltaPct >= 0) +{{ number_format($avgStatsDeltaPct, 1) }}% @else {{ number_format($avgStatsDeltaPct, 1) }}% @endif @endif @else немає даних @endif
По статистиці (New / Young / Old / Spend) за місяць {{ $currentMonth }}.
Рахується за тією ж формулою, що й на графіку статистики кабінету.
{{-- Таблиця кабінетів --}}
@forelse($cabinets as $cab) @php $balanceRating = $cabinetRatings[$cab->id]['score'] ?? null; $statBlock = $cabinetStatsRatings[$cab->id] ?? null; $balanceClass = 'tl-badge-mid'; if ($balanceRating !== null) { if ($balanceRating >= 90) { $balanceClass = 'tl-badge-good'; } elseif ($balanceRating < 60) { $balanceClass = 'tl-badge-bad'; } } $statsScore = $statBlock['score'] ?? null; $statsClass = 'tl-badge-mid'; if ($statsScore !== null) { if ($statsScore >= 90) { $statsClass = 'tl-badge-good'; } elseif ($statsScore < 60) { $statsClass = 'tl-badge-bad'; } } $dayRating = $shiftRatings[$cab->id]['day']['score'] ?? null; $dayAvg = $shiftRatings[$cab->id]['day']['avg'] ?? null; $dayTarget = $shiftRatings[$cab->id]['day']['target'] ?? null; $evenRating = $shiftRatings[$cab->id]['evening']['score'] ?? null; $evenAvg = $shiftRatings[$cab->id]['evening']['avg'] ?? null; $evenTarget = $shiftRatings[$cab->id]['evening']['target'] ?? null; $nightRating = $shiftRatings[$cab->id]['night']['score'] ?? null; $nightAvg = $shiftRatings[$cab->id]['night']['avg'] ?? null; $nightTarget = $shiftRatings[$cab->id]['night']['target'] ?? null; $statsMetrics = $statBlock['metrics'] ?? []; @endphp {{-- Назва --}} {{-- Денна --}} {{-- Вечірня --}} {{-- Нічна --}} {{-- Рейтинг кабінету (баланси + статистика) --}} {{-- Дії --}} @empty @endforelse
Назва Денна Вечірня Нічна Рейтинг кабінету Дії
{{ $cab->name }} @if($cab->day_operator)
{{ $cab->day_operator }}
@if($cab->day_tg_username)
{{ $cab->day_tg_username }}
@endif @if($dayRating !== null && $dayTarget)
Day • {{ $dayRating }} / 100
Середнє: {{ number_format($dayAvg, 2) }} $ / норма: {{ number_format($dayTarget, 2) }} $
@else
Немає даних по рейтингу.
@endif @else @endif
@if($cab->evening_operator)
{{ $cab->evening_operator }}
@if($cab->evening_tg_username)
{{ $cab->evening_tg_username }}
@endif @if($evenRating !== null && $evenTarget)
Evening • {{ $evenRating }} / 100
Середнє: {{ number_format($evenAvg, 2) }} $ / норма: {{ number_format($evenTarget, 2) }} $
@else
Немає даних по рейтингу.
@endif @else @endif
@if($cab->night_operator)
{{ $cab->night_operator }}
@if($cab->night_tg_username)
{{ $cab->night_tg_username }}
@endif @if($nightRating !== null && $nightTarget)
Night • {{ $nightRating }} / 100
Середнє: {{ number_format($nightAvg, 2) }} $ / норма: {{ number_format($nightTarget, 2) }} $
@else
Немає даних по рейтингу.
@endif @else @endif
{{-- Баланси --}}
Баланси: {{ $balanceRating !== null ? $balanceRating.' / 100' : 'немає даних' }}
@if($balanceRating !== null)
@endif
{{-- Статистика (конекшн / спенд) --}}
Статистика: {{ $statsScore !== null ? $statsScore.' / 100' : 'немає даних' }}
@if($statsScore !== null)
@endif
@if($statsMetrics)
@foreach($statsMetrics as $m) @if($m['target'] > 0)
{{ $m['label'] }}: {{ number_format($m['fact'], 2, '.', ' ') }} / {{ number_format($m['target'], 2, '.', ' ') }} ({{ $m['pct'] }}%)
@endif @endforeach
@else
Немає агрегованої статистики по конекшн / спенд.
@endif
Редагувати
У тебе ще немає прив'язаних кабінетів.
@endsection @push('body') @endpush