Files

36 lines
1.2 KiB
PHP

<?php
namespace App\Signature;
/**
* Choix de la bannière d'un agent parmi les campagnes en cours (sans dépendance au framework).
* Règle : une campagne sans groupe cible tous les agents ; sinon l'agent doit appartenir à l'un de ses groupes.
* Une seule bannière par signature : la priorité la plus haute l'emporte ;
* à priorité égale, la campagne la plus ancienne (id le plus petit) gagne, pour un résultat stable.
*/
final class CampaignSelector
{
/**
* @param array<int, array{id:int, priority:int, group_ids:array<int, int>}> $campaigns campagnes en cours
* @param array<int, int> $userGroupIds
*/
public function select(array $campaigns, array $userGroupIds): ?int
{
$groups = array_flip($userGroupIds);
$best = null;
foreach ($campaigns as $c) {
if ($c['group_ids'] !== [] && ! array_intersect_key($groups, array_flip($c['group_ids']))) {
continue;
}
if ($best === null
|| $c['priority'] > $best['priority']
|| ($c['priority'] === $best['priority'] && $c['id'] < $best['id'])) {
$best = $c;
}
}
return $best['id'] ?? null;
}
}