@extends('admin.layouts.app') @section('title','Caixa') @php $currentClubId = isset($club) && $club ? (int)$club->id : (int)session('caixa_club_id', 0); $statusLabels = [ 'processing' => 'Em processamento', 'completed' => 'Concluída', 'cancelled' => 'Cancelada', 'refunded' => 'Reembolsada', ]; $totalFields = isset($fields) ? $fields->count() : 0; $totalBookingsToday = isset($fields) ? $fields->sum(function ($field) { return $field->bookings_count; }) : 0; $totalPaidToday = isset($fields) ? $fields->sum(function ($field) { return $field->bookings->where('payment_status', 'PAID')->count(); }) : 0; $totalPendingToday = isset($fields) ? $fields->sum(function ($field) { return $field->bookings->filter(function ($booking) { return in_array($booking->payment_status, ['PENDING', 'UNPAID']); })->count(); }) : 0; $totalCancelledToday = isset($fields) ? $fields->sum(function ($field) { return $field->bookings->filter(function ($booking) { return (int)$booking->is_canceled === 1 || $booking->status === 'CANCELLED'; })->count(); }) : 0; $selectedDay = \Carbon\Carbon::parse($today); @endphp @push('styles') @endpush @section('content')
Painel de Caixa
Operação diária de {{ $club->name ?? 'Clube' }}
@if(!empty($clubs) && count($clubs) > 1) @endif
--:--
Agenda de campos
Vista diária das marcações, separadas por campo e ordenadas por hora de início.
{{ $selectedDay->format('d/m/Y') }}
{{ ucfirst($selectedDay->translatedFormat('l')) }}, {{ $selectedDay->format('d/m/Y') }}
Gestão rápida da operação do dia.
Campos
{{ $totalFields }}
Marcações
{{ $totalBookingsToday }}
Pagas
{{ $totalPaidToday }}
Pendentes
{{ $totalPendingToday }}
Últimas Encomendas
Faixa rápida no topo para não roubar espaço à agenda.
@forelse($orders ?? [] as $o) @php $lines = $o->lines ?? collect(); @endphp
#{{ $o->id }}
{{ $o->created_at ? \Carbon\Carbon::parse($o->created_at)->format('H:i') : '--:--' }} h
€ {{ number_format((float)($o->grand_total ?? $o->total ?? 0), 2, ',', '.') }}
@foreach($lines->take(2) as $ln) @php $p = $ln->product ?? null; $name = $p ? ($p->name ?? ('Produto #' . $ln->product_id)) : ('Produto #' . $ln->product_id); $qty = (int)($ln->quantity ?? 1); @endphp
{{ $qty }}x {{ $name }}
@endforeach @if($lines->count() > 2)
+ {{ $lines->count() - 2 }} itens...
@endif
@empty
Sem movimentos.
@endforelse
@if(!empty($fields) && $fields->count())
@foreach($fields as $field) @php $fieldPaid = $field->bookings->where('payment_status', 'PAID')->count(); $fieldPending = $field->bookings->filter(function ($booking) { return in_array($booking->payment_status, ['PENDING', 'UNPAID']); })->count(); $fieldCancelled = $field->bookings->filter(function ($booking) { return (int)$booking->is_canceled === 1 || $booking->status === 'CANCELLED'; })->count(); @endphp
{{ $field->bookings_count }}
{{ $field->name }}
Pagas: {{ $fieldPaid }} Pendentes: {{ $fieldPending }} @if($fieldCancelled > 0) Canceladas: {{ $fieldCancelled }} @endif
@foreach($field->bookings as $booking) @php $paymentClass = 'azp-pill azp-pill-neutral'; if ($booking->payment_status === 'PAID') { $paymentClass = 'azp-pill azp-pill-success'; } elseif ($booking->payment_status === 'PENDING' || $booking->payment_status === 'UNPAID') { $paymentClass = 'azp-pill azp-pill-warning'; } elseif ($booking->payment_status === 'REFUNDED') { $paymentClass = 'azp-pill azp-pill-danger'; } $statusClass = 'azp-pill azp-pill-neutral'; if ((int) $booking->is_canceled === 1 || $booking->status === 'CANCELLED') { $statusClass = 'azp-pill azp-pill-danger'; } elseif ($booking->status === 'COMPLETED') { $statusClass = 'azp-pill azp-pill-success'; } elseif ($booking->status === 'CONFIRMED') { $statusClass = 'azp-pill azp-pill-info'; } elseif ($booking->status === 'PENDING') { $statusClass = 'azp-pill azp-pill-warning'; } @endphp
{{ $booking->start_time }} @if($booking->end_time) {{ $booking->end_time }} @endif
Duração: {{ $booking->duration_label }}
#{{ $booking->booking_id }}
Jogadores
{{ $booking->participants_count }}
Preço
{{ $booking->price }}
Tipo
{{ $booking->booking_type ?: '—' }}
{{ $booking->payment_status_label }} {{ $booking->status_label }}
Participantes
@if($booking->participants && $booking->participants->count())
@foreach($booking->participants as $participant) @php $participantName = $participant->user_name ?: $participant->name ?: 'Sem nome'; $parts = preg_split('/\s+/', trim($participantName)); $initials = ''; if (!empty($parts[0])) { $initials .= mb_strtoupper(mb_substr($parts[0], 0, 1)); } if (count($parts) > 1) { $initials .= mb_strtoupper(mb_substr($parts[count($parts)-1], 0, 1)); } if ($initials === '') { $initials = 'U'; } @endphp @if(!empty($participant->user_id)) {{ $initials }} {{ $participantName }} @else {{ $initials }} {{ $participantName }} @endif @endforeach
@else
Sem participantes associados.
@endif
@endforeach
@endforeach
@else
Sem marcações para esta data Não existem reservas sincronizadas para este clube no dia selecionado.
@endif
@endsection @push('scripts') @endpush