Integration Baniere dans le backend
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user