@extends('layouts.admin') @section('title','Datame — цілі на місяць') @section('page_title','Datame — цілі на місяць') @push('head') @endpush @section('content') {{-- ПЛАН ПО БОНУСАМ НА МІСЯЦЬ --}}
📅 План по бонусам на місяць

Обери місяць, щоб побачити загальну ціль та розподіл по нічній, денній та вечірній змінах.

{{ \Carbon\Carbon::now(config('app.timezone','Europe/Kyiv'))->translatedFormat('d F Y') }}

Обраний місяць: {{ $summary['month_label'] }}, днів у місяці: {{ $summary['days'] }}

{{-- ЩОДЕННА ЦІЛЬ / ЦІЛЬ ЗА МІСЯЦЬ --}}
{{-- ЩОДЕННА ЦІЛЬ --}}
📆
Щоденна ціль
Мінімальний добовий бонус, щоб впевнено вийти на план.
daily
${{ number_format($summary['daily_target'],2) }}
Якщо стабільно тримати цю суму щодня — місячний план буде закритий.
{{-- ЦІЛЬ ЗА МІСЯЦЬ --}}
🎯
Ціль за місяць
Загальний бонус по всім змінам за обраний місяць.
month
${{ number_format($summary['month_total'],2) }}
Орієнтир, до якого веде щоденна ціль та робота по всіх змінах.

{{-- ЦІЛІ ПО ЗМІНАХ (ЗА МІСЯЦЬ) --}}
Цілі по змінах (за місяць)
Можна швидко побачити, чи не просідає якась конкретна зміна.
{{-- Нічна зміна --}}
🌙 Ніч
02:00 – 10:00
нічна зміна
На день ${{ number_format($summary['night_target'],2) }}
За місяць {{ number_format($summary['night_total'],2) }}
{{-- Денна зміна --}}
🌤 День
10:00 – 18:00
денна зміна
На день ${{ number_format($summary['day_target'],2) }}
За місяць {{ number_format($summary['day_total'],2) }}
{{-- Вечірня зміна --}}
🌇 Вечір
18:00 – 02:00
вечірня зміна
На день ${{ number_format($summary['evening_target'],2) }}
За місяць {{ number_format($summary['evening_total'],2) }}
{{-- DATAME ЗА ОБРАНИЙ ДЕНЬ --}} @if(!empty($datame)) @php $tz = config('app.timezone','Europe/Kyiv'); // те, що прийшло з контролера $selectedDateRaw = $selectedDateRaw ?? null; $selectedDate = $selectedDateLabel ?? null; $diff = $datame['target'] - $datame['total']; // Datame-день для зміни (початок дня) $datameDateForShifts = \Carbon\Carbon::parse($selectedDateRaw, $tz)->startOfDay(); // поточний час для визначення активної зміни $now = \Carbon\Carbon::now($tz); @endphp
⚡ Datame — бонуси за {{ $selectedDate }}

Обрана дата: {{ $selectedDate }}

{{-- Невеликий підсумок по дню --}}
За день закрито {{ $datame['progress'] }}% від добової цілі
{{-- Фільтр по конкретному дню --}}
{{-- зберігаємо вибраний місяць, щоб не збивати верхній фільтр --}} {{-- Кнопка "Сьогодні" для швидкого повернення --}} Сьогодні
@if($datame['target'] > 0) @if($diff > 0) Залишилось до цілі: ${{ number_format($diff,2) }} @else Перевиконано на: ${{ number_format(abs($diff),2) }} @endif @endif
{{-- Тотал + ціль + прогрес --}}
Поточний бонус
${{ number_format($datame['total'],2) }}
Сумарно по всіх логінах за цю дату
Ціль за добу
${{ number_format($datame['target'],0) }}
Прогрес за день {{ $datame['progress'] }}%

Розподіл по змінах за день
Поточний прогрес по кожній зміні + прогноз або підсумок.
@foreach($datame['shifts'] as $key => $shift) @php $isActive = false; $isFuture = false; $isFinished = false; $shiftStart = null; $shiftEnd = null; // Межі зміни привʼязані до Datame-дня if ($key === 'night') { // ніч 02:00–10:00 Datame-дня $shiftStart = $datameDateForShifts->copy()->setTime(2, 0, 0); $shiftEnd = $datameDateForShifts->copy()->setTime(10, 0, 0); } elseif ($key === 'day') { // день 10:00–18:00 Datame-дня $shiftStart = $datameDateForShifts->copy()->setTime(10, 0, 0); $shiftEnd = $datameDateForShifts->copy()->setTime(18, 0, 0); } elseif ($key === 'evening') { // вечір 18:00 Datame-дня → 02:00 наступного календарного дня $shiftStart = $datameDateForShifts->copy()->setTime(18, 0, 0); $shiftEnd = $datameDateForShifts->copy() ->addDay() ->setTime(2, 0, 0); } // Статуси зміни відносно "зараз" if ($shiftStart && $shiftEnd) { if ($now->between($shiftStart, $shiftEnd)) { $isActive = true; } elseif ($now->lt($shiftStart)) { $isFuture = true; // ще не почалась } elseif ($now->gt($shiftEnd)) { $isFinished = true; // вже закінчилась } } // різниця до цілі $shiftDiff = $shift['target'] - $shift['total']; // частка зміни, що вже пройшла (0..1) по хвилинах $elapsedFraction = 0.0; $predictionPercent = null; $predictedShiftTotal = null; // ПРЕДІКШИН — тільки для активної зміни if ($isActive && $shift['target'] > 0 && $shift['total'] > 0 && $shiftStart && $shiftEnd) { $totalMinutes = $shiftStart->diffInMinutes($shiftEnd); $elapsedMinutes = $shiftStart->diffInMinutes($now); // клемимо в межах [0, totalMinutes] $elapsedMinutes = max(0, min($totalMinutes, $elapsedMinutes)); $elapsedFraction = $totalMinutes > 0 ? $elapsedMinutes / $totalMinutes : 0; if ($elapsedFraction > 0) { // очікуваний тотал при поточному темпі: $predictedShiftTotal = $shift['total'] / $elapsedFraction; // який це % від цілі $predictionPercent = $predictedShiftTotal > 0 ? (int) round(($predictedShiftTotal / $shift['target']) * 100) : 0; } } @endphp
{{ $shift['label'] }} @if($isActive) зміна зараз у роботі @endif
${{ number_format($shift['total'],2) }} Ціль: ${{ number_format($shift['target'],2) }}
{{-- ДЕТАЛЬНИЙ % НОРМИ + ПРОГНОЗ / ПІДСУМОК --}}
@if($shift['target'] > 0) @if($isActive) {{-- Активна зміна — прогноз --}}
Якщо тримати такий темп до кінця зміни, очікуваний результат:
@if($predictionPercent !== null && $predictedShiftTotal !== null && $elapsedFraction > 0) ≈ ${{ number_format($predictedShiftTotal,2) }} ({{ $predictionPercent }}% від цілі) @else Поки що замало даних для коректного прогнозу @endif
@elseif($isFinished) {{-- Зміна завершена — підсумок (тільки якщо зміна вже пройшла) --}}
Підсумок по зміні:
@php $progress = (int)$shift['progress']; $target = (float)$shift['target']; $total = (float)$shift['total']; $missingAmount = max(0, $target - $total); $missingPercent = $progress < 100 ? (100 - $progress) : 0; $overAmount = $progress > 100 ? max(0, $total - $target) : 0; @endphp
@if($progress >= 100) Зміну закрито на 100% @if($overAmount > 0) (перевиконано +${{ number_format($overAmount,2) }}) @endif @else Не вистачило {{ $missingPercent }}% (-${{ number_format($missingAmount,2) }}) щоб закрити зміну на 100% @endif
@endif @else
Ціль не задана для цієї зміни.
@endif
{{-- ЧАС ДО КІНЦЯ / ПОЧАТКУ ЗМІНИ --}}
@php $timeLeftLabel = null; if ($shiftStart && $shiftEnd) { if ($now->between($shiftStart, $shiftEnd)) { // активна зміна — рахуємо, скільки лишилось до кінця $remainingMinutes = $now->diffInMinutes($shiftEnd); $hoursLeft = intdiv($remainingMinutes, 60); $minutesLeft = $remainingMinutes % 60; $timeLeftLabel = 'До кінця зміни залишилось ' . $hoursLeft . ':' . str_pad($minutesLeft, 2, '0', STR_PAD_LEFT); } elseif ($now->lt($shiftStart)) { // зміна ще не почалась $remainingMinutes = $now->diffInMinutes($shiftStart); $hoursLeft = intdiv($remainingMinutes, 60); $minutesLeft = $remainingMinutes % 60; $timeLeftLabel = 'До початку зміни залишилось ' . $hoursLeft . ':' . str_pad($minutesLeft, 2, '0', STR_PAD_LEFT); } else { // зміна вже закінчилась $timeLeftLabel = 'Зміна вже завершилась'; } } @endphp @if($timeLeftLabel) {{ $timeLeftLabel }} @endif
{{-- Погодинний розподіл --}} @if(!empty($shift['hours']))
Погодинний розподіл:
@foreach($shift['hours'] as $h)
{{ $h['label'] }} ${{ number_format($h['amount'],2) }}
@endforeach
@endif
@endforeach
@endif @endsection