@extends('layout') @section('title','Règles de recommandation') @section('content')

Règles de recommandation

Chaque règle observe une portée (employé / groupe / campagne), teste une formule sur les indicateurs disponibles, et — si elle correspond — génère une recommandation avec la priorité et les textes définis ci-dessous. Pour un même sujet, les règles actives de sa portée sont essayées dans l'ordre (« Position ») et la première qui correspond l'emporte. Créer, modifier ou supprimer une règle relance immédiatement l'analyse.

Comment remplir une règle

Une règle observe une portée (qui/quoi elle juge), calcule des indicateurs chiffrés pour chaque sujet de cette portée, et applique une formule booléenne dessus. Si la formule est vraie (et que l'échantillon minimum est atteint), la règle génère une recommandation avec la priorité et les textes (titre / détail / action) que tu as écrits — en remplaçant {indicateur} par sa valeur réelle pour ce sujet.

PortéeIndicateursSens
Employé sent, clicked, submitted, reported Nombre de campagnes envoyées / cliquées / avec identifiants saisis / signalées, pour cette personne.
Groupe (entité / projet / département) sent, clicked, submitted, click_rate, submit_rate Comptes et taux (%) sur l'ensemble des mails envoyés au groupe. Une même règle « groupe » est rejouée automatiquement sur chaque entité, chaque projet et chaque département.
Campagne sent, opened, clicked, submitted, open_rate, click_rate, submit_rate, tracking_works Comptes et taux (%) pour une campagne donnée. tracking_works vaut 1 si l'ouverture peut être mesurée (URL publique), 0 sinon (localhost) — utile pour ignorer un taux d'ouverture non fiable.

Compare un indicateur à un nombre avec >= <= == != > <, combine plusieurs conditions avec AND / OR, et groupe avec des parenthèses. Exemples : click_rate >= 30 · submitted >= 1 · click_rate >= 30 OR submit_rate >= 10 · tracking_works == 1 AND open_rate < 30. Le bouton 🧪 Tester ci-dessous te dit tout de suite combien de sujets correspondent actuellement, sans rien enregistrer.

Dans les trois champs de texte, {label} insère le nom du sujet (employé, entité, campagne…), chaque indicateur de la portée s'insère entre accolades (ex. {click_rate}, {submitted}), et pour une règle de portée « groupe », {scope} insère automatiquement « Entité », « Projet » ou « Département » selon le cas.

PortéeFormulePrioritéTitre / Action (extrait)
Employé submitted >= 1 Haute « {label} doit suivre une session de sensibilisation » → action : changement de mot de passe et formation individuelle.
Groupe click_rate >= 30 OR submit_rate >= 10 Haute « Formation collective recommandée : {scope} {label} » → action : planifier une session pour {label}.
Campagne tracking_works == 1 AND open_rate < 30 Moyenne « Test peu consulté ({open_rate} % d'ouverture) » → action : vérifier la délivrabilité, relancer un test corrigé.

Tu peux voir ces 8 règles telles quelles (et t'en inspirer) dans la liste « Règles existantes » plus bas.

Nouvelle règle

@csrf @include('admin.recommendation-rule-fields', ['rule' => null])
@if($q !== '' || $selectedScopes !== [])
Réinitialiser
@endif
@include('partials.multi-select', [ 'name' => 'scopes', 'msLabel' => 'Portée', 'msPlaceholder' => 'Toutes', 'msOptions' => collect($scopes)->map(fn($label, $key) => ['id'=>$key,'label'=>$label])->values(), 'msSelected' => $selectedScopes, ])

Règles existantes ({{ $rules->total() }})

@include('partials.per-page-selector', ['perPage' => $perPage, 'options' => $perPageOptions, 'formId' => 'rules-filters'])
@forelse($rules as $r) @empty @endforelse
NomPortéeFormulePrioritéPositionActif
{{ $r->name }} {{ $scopes[$r->scope] ?? $r->scope }} {{ $r->formula }} {{ $priorities[$r->priority] ?? $r->priority }} {{ $r->position }} {{ $r->active ? '✅' : '—' }} Modifier
@csrf @method('delete')
{{ ($q !== '' || $selectedScopes !== []) ? 'Aucune règle ne correspond à ces filtres.' : "Aucune règle pour l'instant : sans règle active, l'analyse ne génère plus aucune recommandation." }}
{{ $rules->links() }}
@include('admin.recommendation-rule-script') @endsection