@extends('layouts.app') @section('title', 'Аналитика') {{-- Ports app/Views/analytics/index.php (legacy) — see the Phase 49 plan. The ЕНТ score entry form uses Laravel's own $errors/old() — confirmed safe since the legacy view genuinely repopulates old input here (via Old::get()/Old::hasError()/Old::error()). --}} @push('styles') @endpush @section('content')

Аналитика

@php $monthNames = ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь']; @endphp

Период применяется к метрикам за месяц. Отдельные показатели помечены как «на данный момент».

@if ($overview)

Обзор

{{ $overview['active_students_asof'] }}
Активных на дату
{{ $overview['avg_group_size'] }}
Средняя заполняемость группы
{{ $overview['avg_disciplines'] }}
Ср. предметов на ученика
{{ $overview['capacity_utilization'] }}%
Загрузка мощностей
@isset($overview['overdue_count'])
{{ $overview['overdue_count'] }}
Просрочки (сейчас)
@endisset
@endif @if ($trends)

Тренды за 6 месяцев

Активных учеников
@isset($trends['revenue'])
Выручка, ₸
@endisset @isset($trends['renewal_after_first']) {{-- The two renewal tiles from "Оплаты и выручка", month by month: the chart carries the rates, the table under it the counts behind them. A month with nobody in the base (no first-time payers, or nobody paid the month before) has no rate — shown as a gap in the line and "—" in the table, not as a 0 %. --}}
Продление, %
@foreach ($trends['labels'] as $label) @endforeach @foreach ($trends['renewal_after_first'] as $point) @endforeach @isset($trends['period_retention']) @foreach ($trends['period_retention'] as $point) @endforeach @endisset
{{ $label }}
После 1-й оплаты @if ($point['first_time_payers'] > 0)
{{ $point['rate'] }}%
{{ $point['renewed'] }} из {{ $point['first_time_payers'] }}
@else
@endif
В целом @if ($point['prev_payers'] > 0)
{{ $point['rate'] }}%
{{ $point['retained'] }} из {{ $point['prev_payers'] }}
@else
@endif
@endisset
@endif @if ($atRisk && (!empty($atRisk['overdue']) || !empty($atRisk['low_nps']))) @php $atRiskCount = count($atRisk['overdue']) + count($atRisk['low_nps']); @endphp

Ученики группы риска

{{ $atRiskCount }}
Ученики группы риска
Показать список →
@endif @if ($payments)

Оплаты и выручка

{{ number_format($payments['new_student_arpu'], 0, ',', ' ') }} ₸
Средний чек новых учеников • {{ $payments['new_student_count'] }} новых оплат
@isset($payments['overall_arpu'])
{{ number_format($payments['overall_arpu'], 0, ',', ' ') }} ₸
Общий средний чек
@endisset @isset($payments['all_time_arpu'])
{{ number_format($payments['all_time_arpu'], 0, ',', ' ') }} ₸
Средний чек за всё время
@endisset @isset($payments['avg_study_duration_months'])
{{ $payments['avg_study_duration_months'] }} мес.
Средняя длительность учёбы
@endisset
{{ $payments['renewal_after_first']['rate'] }}%
% продления после 1-й оплаты • {{ $payments['renewal_after_first']['renewed'] }} из {{ $payments['renewal_after_first']['first_time_payers'] }}
@isset($payments['period_retention'])
{{ $payments['period_retention']['rate'] }}%
% продления в целом • {{ $payments['period_retention']['retained'] }} из {{ $payments['period_retention']['prev_payers'] }} (пред. период)
@endisset @isset($payments['charges_total'])
{{ number_format($payments['charges_total'], 0, ',', ' ') }} ₸
Начисления за месяц
@endisset
@endif @if ($finance)

Финансы

{{ number_format($finance['net_profit'], 0, ',', ' ') }} ₸
Чистая прибыль за месяц
{{ number_format($finance['cac'], 0, ',', ' ') }} ₸
CAC (стоимость клиента) • маркетинг {{ number_format($finance['marketing_spend'], 0, ',', ' ') }} ₸
Доли расходов по категориям
@if (empty($finance['expenses_by_category']))

Нет расходов за этот период.

@else @endif
Доли выручки по дисциплинам
@if (empty($finance['revenue_by_discipline']))

Нет начислений за этот период.

@else @endif
Доля выручки: ЕНТ
@if (empty($finance['revenue_by_ent']))

Нет начислений за этот период.

@else @endif
Доля выручки: онлайн/офлайн
@if (empty($finance['revenue_by_learning_type']))

Нет начислений за этот период.

@else @endif
@endif @if ($teachers)

Преподаватели, замены, кураторы

@isset($teachers['substitutions_count'])
{{ $teachers['substitutions_count'] }}
Замен за период
@endisset
{{ ($teachers['ent_progress']['avg_delta'] >= 0 ? '+' : '') . $teachers['ent_progress']['avg_delta'] }}
Ср. прогресс по ЕНТ • {{ $teachers['ent_progress']['count'] }} учеников с 2+ результатами
{{ $teachers['nps_latest'] }}
NPS (последний)
@php $cc = $teachers['curator_completion']; $ccOverall = $cc['overall'] ?? $cc; @endphp
{{ $ccOverall['rate'] }}%
Выполнение задач куратором • {{ $ccOverall['resolved'] }} из {{ $ccOverall['total'] }}
@isset($teachers['total_salary'])
{{ number_format($teachers['total_salary'], 0, ',', ' ') }} ₸
по преподавателям →
Зарплата за месяц
@endisset
@if (!empty($teachers['substitutions_by_teacher']))
Замены по преподавателям
@foreach ($teachers['substitutions_by_teacher'] as $row) @endforeach
ПреподавательЗаменилЗаменился
{{ $row['teacher_name'] }} {{ $row['covered_for_others'] }} {{ $row['was_covered'] }}
@endif @if (!empty($teachers['performance']))
Показатели учителей
@foreach ($teachers['performance'] as $row) @endforeach
Учитель Уроков Часы Заработок Выручка группы Посещаемость Ср. ДЗ Ср. КР Замены
{{ $row['teacher_name'] }} {{ (int) $row['lessons_count'] }} {{ number_format((float) $row['hours'], 1, ',', ' ') }} {{ number_format((float) $row['earnings'], 0, ',', ' ') }} ₸ {{ number_format((float) $row['revenue'], 0, ',', ' ') }} ₸ {{ $row['attendance_pct'] !== null ? (int) $row['attendance_pct'] . '%' : '—' }} {{ $row['avg_dz'] ?? '—' }} {{ $row['avg_kr'] ?? '—' }} {{ $row['covered_for_others'] }} / {{ $row['was_covered'] }}
@endif @if (isset($cc['by_curator']) && !empty($cc['by_curator']))
Выполнение задач по кураторам
@foreach ($cc['by_curator'] as $row) @endforeach
КураторВыполненоВсего%
{{ $row['curator_name'] }} {{ $row['resolved'] }} {{ $row['total'] }} {{ $row['rate'] }}%
@endif @if (isset($teachers['nps_detail']) && !empty($teachers['nps_detail']))
NPS — детализация
@foreach ($teachers['nps_detail'] as $row) @endforeach
УченикОценкаКомментарийДата
{{ $row['first_name'] . ' ' . $row['last_name'] }} {{ (int) $row['score'] }} {{ $row['comment'] ?? '—' }} {{ $row['created_at'] }}
@endif @endif
@endsection @push('scripts') @if ($trends) @endif @if ($finance && !empty($finance['expenses_by_category'])) @endif @if ($finance && !empty($finance['revenue_by_discipline'])) @endif @if ($finance && !empty($finance['revenue_by_ent'])) @endif @if ($finance && !empty($finance['revenue_by_learning_type'])) @endif @endpush