@php $fmt = fn ($n) => number_format((int) $n, 0, ',', ' '); $mo = fn ($bytes) => number_format($bytes / 1048576, 1, ',', ' ').' Mo'; $states = ['active' => ['Actif', '#065f46', '#d1fae5'], 'paid' => ['Payé', '#1e40af', '#dbeafe'], 'pending' => ['En attente', '#92400e', '#fef3c7'], 'expired' => ['Expiré', '#475569', '#e2e8f0'], 'cancelled' => ['Annulé', '#475569', '#e2e8f0']]; $conn = ['online' => ['En ligne', '#065f46', '#d1fae5'], 'offline' => ['Hors ligne', '#475569', '#e2e8f0']]; $field = 'block w-full rounded-lg border-slate-300 text-sm shadow-sm'; @endphp
@csrfSynchroniser
Forfaits VPN Configuration API Audit Espace client
@if ($errors->any())

{{ $errors->first() }}

@endif

@if ($lastSync) Dernière synchronisation du serveur : {{ \Carbon\Carbon::parse($lastSync['at'])->diffForHumans() }} — @if ($lastSync['ok'])réussie ({{ $lastSync['online'] ?? 0 }} en ligne, {{ $lastSync['server_peers'] ?? 0 }} pair(s) sur le serveur)@elseéchec : {{ $lastSync['error'] ?? 'erreur inconnue' }}@endif @else Aucune synchronisation enregistrée pour le moment : cliquez sur « Synchroniser » ou vérifiez la tâche planifiée. @endif

@foreach ([['Souscriptions actives', $stats['subscriptions_active'], '#0a2a66'], ['Appareils en ligne', $stats['peers_online'], '#047857'], ['Appareils actifs', $stats['peers_active'], '#1d4ed8'], ['Expirent sous 7 jours', $stats['expiring_7d'], $stats['expiring_7d'] > 0 ? '#b45309' : '#0a2a66']] as [$label, $value, $color])

{{ $label }}

{{ $fmt($value) }}

@endforeach

Trafic WireGuard cumulé

Reçu

{{ $mo($stats['traffic_received']) }}

Envoyé

{{ $mo($stats['traffic_sent']) }}

Appareils vus en ligne (7 jours)

@foreach ($trafficByDay as $day)

{{ $day['label'] }}

@endforeach
Filtrer
{{-- Appareils : une carte par appareil (lisible sur téléphone) --}}

Appareils WireGuard ({{ $peers->count() }})

@forelse ($peers as $peer) @php $c = $conn[$peer->connection_status] ?? ['Inconnue', '#92400e', '#fef3c7']; @endphp

{{ $peer->device_name }} · {{ $peer->device_type === 'mikrotik' ? 'MikroTik' : 'Téléphone' }}

{{ $peer->subscription?->user?->name ?? $peer->subscription?->user?->username ?? '—' }} · {{ $peer->subscription?->reference }}

{{ $c[0] }}
Adresse
{{ $peer->wireguard_ip }}
Dernière connexion
{{ $peer->latest_handshake_at?->format('d/m H:i') ?? '—' }}
Trafic
{{ $mo($peer->received_bytes + $peer->sent_bytes) }}
@empty

Aucun appareil trouvé.

@endforelse
{{-- Souscriptions --}}

Souscriptions VPN

@forelse ($subscriptions as $s) @php $st = $states[$s->status] ?? [strtoupper($s->status), '#475569', '#e2e8f0']; @endphp

{{ $s->user?->name ?? $s->user?->username ?? '—' }} · {{ $s->plan?->name }}

{{ $s->reference }}@if ($s->payment_method) · {{ $s->payment_method }}@endif

{{ $s->expires_at ? 'Expire le '.$s->expires_at->format('d/m/Y H:i') : 'Pas encore démarré' }}
Appareils : {{ $s->active_peers_count }}/{{ $s->plan?->max_devices ?? 0 }}
{{ $st[0] }}
@if ($s->status === 'pending')
Traiter un ancien dossier en attente
@csrf

Ancienne souscription en attente : vérifiez le justificatif avant toute régularisation. Montant : {{ $fmt($s->amount) }} {{ $s->currency }}

Régulariser cet ancien dossier
@endif
@empty

Aucune souscription.

@endforelse
{{ $subscriptions->links() }}