@extends('layout') @section('title','Tableau de bord') @section('content') @php($canWrite = auth()->user()?->hasPermission('write'))

Tableau de bord

@if($filters->isActive())Réinitialiser@endif
Périodes rapides : @foreach($presets as $label => $range) {{ $label }} @endforeach
@if($filters->isActive())

Filtres actifs — {{ $filters->summary() }}. La période porte sur la date d'envoi des mails.

@endif
{{ $stats['campaigns'] }}
Campagnes
{{ $stats['employees'] }}
Employés
{{ $stats['sent'] }}
Mails envoyés
{{ $stats['open_rate'] }}%
Taux d'ouverture
{{ $stats['click_rate'] }}%
Taux de clic
{{ $stats['submit_rate'] }}%
Taux de soumission
{{ $stats['clicked'] }}
Clics piégés
{{ $stats['repeat_offenders'] }}
Récidivistes
{{ $stats['reported'] }}
Signalements ({{ $stats['report_rate'] }}%)
{{ $stats['read_only'] }}
Lu sans agir ({{ $stats['read_only_rate'] }}%)
{{ $stats['no_reaction'] }}
Sans réaction ({{ $stats['no_reaction_rate'] }}%)
{{ $stats['total_opens'] }}
Ouvertures totales
@if($openRecommendations > 0)

Recommandations à traiter ({{ $openRecommendations }})

Tout voir
@foreach($recommendations as $reco) @endforeach
{{ \App\Models\Recommendation::PRIORITIES[$reco->priority] ?? $reco->priority }} {{ $reco->title }}
{{ $reco->action }}
@endif

Activité — ouvertures & clics ({{ $filters->from || $filters->to ? 'période filtrée' : '30 derniers jours' }})

Taux d'ouverture

{{ $stats['open_rate'] }}%

Taux de clic

{{ $stats['click_rate'] }}%

Taux de soumission

{{ $stats['submit_rate'] }}%

Entonnoir global

Performance par campagne

Taux de clic par département

@if($byDepartment['rows']->isEmpty())

Pas encore de données.

@else
@endif

Clics par type de piège

@if($byTrapType['counts']->isEmpty())

Pas encore de clics.

@else
@endif

Taux de clic par entité

@if($byEntity['rows']->isEmpty())

Pas encore de données.

@else
@endif

Taux de clic par projet

@if($byProject['rows']->isEmpty())

Pas encore de données.

@else
@endif

Clics par pays — géolocalisation par IP (approx. ; nécessite des IP publiques)

@if($byCountry['counts']->isEmpty())

Aucune géolocalisation encore (IP privées/internes en local, ou géoloc désactivée).

@else
@endif

Clics par heure de la journée

Clics par jour de la semaine

Campagnes

@forelse($campaigns as $c) @empty @endforelse
CampagneStatutEnvoyésOuvertsCliquésSoumisTaux de clic
{{ $c->name }} {{ $c->status }} {{ $c->sent_count }}{{ $c->opened_count }}{{ $c->clicked_count }}{{ $c->submitted_count }} {{ $c->sent_count ? round($c->clicked_count / $c->sent_count * 100) : 0 }}% Rapport
Aucune campagne. Créez-en une.

Récidivistes (top cliqueurs)

@forelse($topClickers as $e) @empty @endforelse
EmployéEmailDépartementTotal clics
{{ $e->name }}{{ $e->email }}{{ $e->departments()->pluck('name')->implode(', ') }}{{ $e->clicks }}
Personne n'a encore cliqué.

Sans réaction — mail envoyé, aucune action détectée (ni clic, ni saisie, ni signalement). N'implique pas forcément une lecture.

@forelse($noReactionList as $r) @empty @endforelse
EmployéEmailDépartementCampagneEnvoyé le
{{ $r->employee?->name }} {{ $r->employee?->email }} {{ $r->employee?->departments()->pluck('name')->implode(', ') }} {{ $r->campaign?->name }} {{ $r->sent_at?->format('d/m/Y H:i') }} Détails
Tout le monde a réagi (ou rien n'a encore été envoyé).

Lu sans agir — ouverture confirmée par le pixel, mais ni clic ni saisie (nécessite le tracking d'ouverture / URL publique)

@forelse($readOnlyList as $r) @empty @endforelse
EmployéEmailDépartementCampagne1re ouverture
{{ $r->employee?->name }} {{ $r->employee?->email }} {{ $r->employee?->departments()->pluck('name')->implode(', ') }} {{ $r->campaign?->name }} {{ $r->opened_at?->format('d/m/Y H:i') }} Détails
Personne n'a lu le mail sans agir (ou aucune ouverture détectée).

Exporter le tableau de bord

@foreach($filters->toQuery() as $key => $value)@endforeach

{{ $filters->summary() }}

@foreach(['normal' => 'Complet — nominatif : détail par destinataire, top cliqueurs. À réserver aux personnes habilitées.', 'rgpd' => 'RGPD — anonymisé : chiffres agrégés uniquement (k-anonymité), partageable avec la direction ou le CSE.'] as $value => $hint) @endforeach @foreach(\App\Services\ReportExporter::FORMATS as $value => $label) @endforeach
@endsection