@extends('layouts.admin') @section('title', 'Auditoria') @section('breadcrumb')Auditoria@endsection @push('styles') @endpush @section('content') @php function actionBadge(string $action): array { return match(true) { in_array($action, ['created', 'store', 'registered']) => ['bg'=>'#dcfce7','color'=>'#16a34a','icon'=>'✚'], in_array($action, ['updated', 'edit', 'changed', 'adjusted']) => ['bg'=>'#dbeafe','color'=>'#2563eb','icon'=>'✎'], in_array($action, ['deleted', 'destroy']) => ['bg'=>'#fee2e2','color'=>'#dc2626','icon'=>'✕'], in_array($action, ['canceled', 'cancellation']) => ['bg'=>'#fce7f3','color'=>'#be185d','icon'=>'⊘'], in_array($action, ['checkout', 'checked_out']) => ['bg'=>'#fef3c7','color'=>'#d97706','icon'=>'↗'], in_array($action, ['checkin', 'checked_in']) => ['bg'=>'#e0f2fe','color'=>'#0369a1','icon'=>'↙'], in_array($action, ['payment', 'paid', 'payment_received']) => ['bg'=>'#d1fae5','color'=>'#059669','icon'=>'$'], in_array($action, ['reversed', 'payment_cancelled']) => ['bg'=>'#fef2f2','color'=>'#ef4444','icon'=>'↩'], default => ['bg'=>'#f1f5f9','color'=>'#475569','icon'=>'·'], }; } function entityLabel(string $type): string { return match($type) { 'reservation' => 'Reserva', 'guest' => 'Hóspede', 'payment' => 'Pagamento', 'room' => 'Quarto', 'cashbox' => 'Caixa', 'adjustment' => 'Ajuste', 'product' => 'Produto', 'user' => 'Usuário', default => ucfirst(str_replace('_',' ',$type)), }; } $maxAction = $topActions->max('total') ?: 1; @endphp {{-- Header --}}

🔍 Auditoria & Trilha de Atividades

Registro imutável de todas as ações do sistema · {{ \Carbon\Carbon::parse($from)->format('d/m/Y') }} a {{ \Carbon\Carbon::parse($to)->format('d/m/Y') }}

{{-- KPIs --}}
📋 Total de Ações
{{ number_format($totalActions,0,',','.') }}
no período selecionado
👤 Usuários Ativos
{{ $uniqueUsers }}
usuários distintos com atividade
⚠ Ações Críticas
{{ $criticalActions }}
cancelamentos, estornos, exclusões
{{-- Gráfico + Top Ações --}}
Atividade por Hora do Dia últimos 30 dias
Top Ações
@foreach($topActions as $act) @php $b = actionBadge($act->action); @endphp
{{ $b['icon'] }} {{ $act->action }}
{{ $act->total }}
@endforeach
{{-- Filtros --}}
Limpar
{{-- Timeline --}}
Trilha de Auditoria {{ $logs->total() }} registros encontrados · página {{ $logs->currentPage() }} de {{ $logs->lastPage() }}
@forelse($logs as $log) @php $b = actionBadge($log->action); @endphp @empty @endforelse
Data/Hora Usuário Ação Entidade Ref. IP Detalhe
{{ $log->created_at->format('d/m/Y') }}
{{ $log->created_at->format('H:i:s') }}
@if($log->user)
{{ $log->user->display_name ?? $log->user->name }}
{{ $log->user->email }}
@else Sistema @endif
{{ $b['icon'] }} {{ $log->action }} {{ entityLabel($log->entity_type) }} @if($log->entity_id) #{{ $log->entity_id }} @else — @endif {{ $log->ip_address ?? '—' }} @if($log->old_values || $log->new_values || $log->reason) Ver diff @else @endif
Nenhum registro encontrado para os filtros aplicados.
{{-- Paginação --}} @if($logs->hasPages()) @endif
@endsection @push('scripts') @endpush