@extends('admin.layout') @section('title', 'Logs') @section('content')
{{-- Tab navigatie --}}
@foreach (['payments' => 'Betalingen', 'security' => 'Beveiliging', 'app-errors' => 'App-fouten', 'server' => 'Serverfouten', 'queue-errors' => 'Queue-fouten'] as $key => $label) {{ $label }} @if($key === 'queue-errors') @php $failedCount = \Illuminate\Support\Facades\DB::table('failed_jobs')->count(); @endphp @if($failedCount > 0) {{ $failedCount > 9 ? '9+' : $failedCount }} @endif @endif @endforeach
{{-- ── BETALINGEN ─────────────────────────────────────────────────────── --}} @if($tab === 'payments') @php $eventColors = [ 'checkout_started' => 'bg-gray-100 text-gray-700', 'plan_switch_started' => 'bg-gray-100 text-gray-700', 'payment_paid' => 'bg-green-100 text-green-800', 'renewal_paid' => 'bg-green-100 text-green-800', 'payment_failed' => 'bg-red-100 text-red-700', 'payment_expired' => 'bg-red-100 text-red-700', 'payment_cancelled' => 'bg-red-100 text-red-700', 'subscription_cancelled' => 'bg-orange-100 text-orange-700', 'subscription_creation_failed'=> 'bg-red-100 text-red-700', 'webhook_received' => 'bg-blue-100 text-blue-700', 'webhook_error' => 'bg-red-100 text-red-700', 'referral_reward_granted' => 'bg-violet-100 text-violet-700', ]; @endphp {{-- Summary cards --}} @if($summary)
@foreach ([ ['label' => 'Gestart', 'value' => $summary->started ?? 0, 'color' => 'text-gray-700'], ['label' => 'Betaald', 'value' => $summary->paid ?? 0, 'color' => 'text-green-700'], ['label' => 'Mislukt', 'value' => $summary->failed ?? 0, 'color' => 'text-red-700'], ['label' => 'Geannuleerd', 'value' => $summary->cancelled ?? 0, 'color' => 'text-orange-700'], ['label' => 'Verlengingen', 'value' => $summary->renewals ?? 0, 'color' => 'text-blue-700'], ['label' => 'Webhooks', 'value' => $summary->webhooks ?? 0, 'color' => 'text-indigo-700'], ] as $card)
{{ number_format($card['value']) }}
{{ $card['label'] }} (30d)
@endforeach
@endif {{-- Filterbar --}}
Reset
{{-- Tabel --}}
@forelse($logs as $log) @empty @endforelse
Datum/tijd Gebruiker Event Plan Bedrag Orig. Korting Mollie ID
{{ $log->created_at->format('d/m/Y H:i:s') }} @if($log->user) #{{ $log->user->id }} {{ $log->user->name }} @elseif($log->user_id) #{{ $log->user_id }} (verwijderd) @else @endif {{ $log->event }} {{ $log->plan ?? '—' }} {{ $log->amount ? '€' . $log->amount : '—' }} {{ $log->original_amount ? '€' . $log->original_amount : '—' }} {{ $log->discount_amount ? '-€' . $log->discount_amount : '—' }} {{ $log->mollie_payment_id ? substr($log->mollie_payment_id, 0, 20) . (strlen($log->mollie_payment_id) > 20 ? '…' : '') : '—' }} Details
Geen betalingslogs gevonden.
@if($logs->hasPages())
{{ $logs->links() }}
@endif
@endif {{-- ── BEVEILIGING ─────────────────────────────────────────────────────── --}} @if($tab === 'security') @php $actionColors = [ 'ban' => 'bg-red-100 text-red-700', 'suspend' => 'bg-orange-100 text-orange-700', 'unsuspend' => 'bg-green-100 text-green-800', 'role_change' => 'bg-blue-100 text-blue-700', 'premium_update' => 'bg-indigo-100 text-indigo-700', 'user_delete' => 'bg-red-100 text-red-700', 'subscription_grant' => 'bg-violet-100 text-violet-700', 'subscription_extend' => 'bg-violet-100 text-violet-700', 'subscription_revoke' => 'bg-orange-100 text-orange-700', 'subscription_trial' => 'bg-yellow-100 text-yellow-700', 'subscription_manual' => 'bg-gray-100 text-gray-700', ]; $loginColors = [ 'success' => 'bg-green-100 text-green-800', 'failed' => 'bg-red-100 text-red-700', 'logout' => 'bg-gray-100 text-gray-600', 'registration' => 'bg-green-100 text-green-800', 'registration_failed' => 'bg-red-100 text-red-700', 'email_verified' => 'bg-green-100 text-green-800', 'password_reset_requested' => 'bg-blue-100 text-blue-700', 'password_reset_completed' => 'bg-blue-100 text-blue-700', 'password_changed' => 'bg-blue-100 text-blue-700', 'email_changed' => 'bg-blue-100 text-blue-700', 'account_deletion_requested' => 'bg-orange-100 text-orange-700', 'account_deleted' => 'bg-red-100 text-red-700', 'login_throttled' => 'bg-yellow-100 text-yellow-800', 'photo_uploaded' => 'bg-sky-100 text-sky-700', 'photo_upload_failed' => 'bg-red-100 text-red-700', 'photo_deleted' => 'bg-orange-100 text-orange-700', ]; @endphp {{-- Gedeelde filterbar --}}
Reset
{{-- Sectie 1: Admin-acties --}}
@forelse($adminLogs as $log) @empty @endforelse
Datum/tijd Admin Doelgebruiker Actie Oud → Nieuw Opmerking
{{ $log->created_at->format('d/m/Y H:i:s') }} @if($log->admin) #{{ $log->admin->id }} {{ $log->admin->name }} @else @endif @if($log->targetUser) #{{ $log->targetUser->id }} {{ $log->targetUser->name }} @elseif($log->target_name || $log->target_email) {{ $log->target_name ?? $log->target_email }} (verwijderd) @else @endif {{ $log->action }} @if($log->old_value || $log->new_value) {{ $log->old_value ?? '—' }} {{ $log->new_value ?? '—' }} @else @endif {{ Str::limit($log->note, 60) ?? '—' }} Details
Geen admin-acties gevonden.
@if($adminLogs->hasPages())
{{ $adminLogs->links() }}
@endif
{{-- /x-show --}}
{{-- Sectie 2: Auth-events --}}

Auth-events

{{ $loginLogs->total() }} entries
@forelse($loginLogs as $log) @empty @endforelse
Datum/tijd E-mail Gebruiker Type Laatste activiteit IP User-agent
{{ $log->created_at->format('d/m/Y H:i:s') }} {{ $log->email }} @if($log->user) #{{ $log->user->id }} {{ $log->user->name }} @else @endif {{ $log->type }} @if ($log->type === 'failed' && ($reason = $log->context['reason'] ?? null))
{{ $reason === 'email_not_found' ? 'e-mail onbekend' : 'fout wachtwoord' }}
@elseif ($log->type === 'registration_failed')
DB-fout
@elseif ($log->type === 'registration' && ($log->context['email_failed'] ?? false))
verificatie-e-mail mislukt
@elseif ($log->type === 'photo_upload_failed')
{{ \Illuminate\Support\Str::limit($log->context['error'] ?? '', 40) }}
@endif
@if ($log->last_active_at) @php $activeAt = \Carbon\Carbon::parse($log->last_active_at); @endphp {{ $activeAt->diffForHumans() }} @else @endif {{ $log->ip_address ?? '—' }} {{ Str::limit($log->user_agent, 60) }}
Geen auth-events gevonden.
@if($loginLogs->hasPages())
{{ $loginLogs->links() }}
@endif
@endif {{-- ── APP-FOUTEN ──────────────────────────────────────────────────────── --}} @if($tab === 'app-errors') @php $levelColors = [ 'ERROR' => 'bg-red-100 text-red-700', 'CRITICAL' => 'bg-red-200 text-red-800', 'EMERGENCY' => 'bg-red-300 text-red-900', 'WARNING' => 'bg-yellow-100 text-yellow-700', ]; @endphp @if(!auth()->user()->isAdmin())
Alleen admins kunnen applicatiefouten inzien.
@else {{-- Filterbar --}}
@if(!empty($availableDates))
@endif Reset

Log-entries

{{ $logs->total() }} entries
@forelse($logs as $entry)
{{ $entry['level'] }}
{{ $entry['timestamp'] }} @if(!empty($entry['trace'])) @endif
@if(!empty($entry['exception_class'])) {{ $entry['exception_class'] }} @endif

{{ $entry['message'] }}

@if(!empty($entry['trace']))
{{ $entry['trace'] }}
@endif
@empty
Geen log-entries gevonden voor de gekozen filters.
@endforelse
@if($logs->hasPages())
{{ $logs->links() }}
@endif
@endif @endif {{-- ── SERVERFOUTEN ────────────────────────────────────────────────────── --}} @if($tab === 'server') @php $statusColor = fn(int $s) => match(true) { $s >= 503 => 'bg-yellow-100 text-yellow-700', $s >= 500 => 'bg-red-100 text-red-700', $s >= 429 => 'bg-orange-100 text-orange-700', $s >= 404 => 'bg-gray-100 text-gray-600', $s >= 400 => 'bg-amber-100 text-amber-700', default => 'bg-gray-100 text-gray-500', }; @endphp {{-- Breakdown --}} @if($breakdown->isNotEmpty())

Verdeling per statuscode

@foreach($breakdown as $row)
{{ $row->status }} {{ number_format($row->total) }}× {{ \Carbon\Carbon::parse($row->last_seen)->format('d/m H:i:s') }}
@endforeach
@endif {{-- Filterbar --}}
Reset

HTTP-fouten

{{ $logs->total() }} entries
@forelse($logs as $log) @if(!empty($log->exception)) @endif @empty @endforelse
Datum/tijd Method Pad Status Duur (ms) IP Gebruiker
{{ $log->created_at->format('d/m/Y H:i:s') }} {{ $log->method }} {{ $log->path }} {{ $log->status }} {{ $log->duration_ms }} {{ $log->ip ?? '—' }} @if($log->user_id) @php $u = App\Models\User::find($log->user_id); @endphp @if($u) #{{ $u->id }} {{ $u->name }} @else #{{ $log->user_id }} @endif @else @endif @if(!empty($log->exception)) @endif Details
{{ $log->exception }}
Geen serverfouten gevonden.
@if($logs->hasPages())
{{ $logs->links() }}
@endif
@endif {{-- ── QUEUE-FOUTEN ────────────────────────────────────────────────────── --}} @if($tab === 'queue-errors') @if(!auth()->user()->isAdmin())
Alleen admins kunnen queue-fouten inzien.
@else

Jobs die na 3 pogingen nog steeds mislukten. Hier kun je ze opnieuw proberen of verwijderen.

@if($logs->total() > 0)
@csrf
@endif
@forelse($logs as $job) @empty @endforelse
Mislukt op Job Queue Fout
{{ \Carbon\Carbon::parse($job->failed_at)->format('d/m/Y H:i:s') }} {{ $job->display_name }} {{ $job->queue }}
{{ Str::limit($job->first_line, 80) }}
{{ $job->exception }}
@csrf
@csrf @method('DELETE')
Geen mislukte jobs. Alles werkt goed.
@if($logs->hasPages())
{{ $logs->links() }}
@endif
@endif @endif
@endsection