up score complétion normalisé dans le podium

This commit is contained in:
Tykayn 2025-06-26 19:18:29 +02:00 committed by tykayn
parent c3a9bc52b2
commit 59398d14ba
8 changed files with 116 additions and 36 deletions

View file

@ -1119,37 +1119,52 @@ public function podiumContributeursOsm(): Response
// On suppose que le champ "osmUser" existe sur l'entité Place
$placeRepo = $this->entityManager->getRepository(\App\Entity\Place::class);
// Récupérer les 10 contributeurs OSM les plus actifs (par nombre de lieux)
// Nouvelle requête groupée pour tout calculer d'un coup
$qb = $placeRepo->createQueryBuilder('p')
->select('p.osm_user, COUNT(p.id) as nb')
->select(
'p.osm_user',
'COUNT(p.id) as nb',
'AVG((CASE WHEN p.has_opening_hours = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_address = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_website = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_wheelchair = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_note = true THEN 1 ELSE 0 END)) / 5 * 100 as completion_moyen'
)
->where('p.osm_user IS NOT NULL')
->andWhere("p.osm_user != ''")
->groupBy('p.osm_user')
->orderBy('nb', 'DESC')
->setMaxResults(300);
->setMaxResults(100);
$podium = $qb->getQuery()->getResult();
// Pour chaque utilisateur, calculer le score de complétion moyen
// Calcul du score pondéré et normalisation
$maxPondere = 0;
foreach ($podium as &$row) {
$osmUser = $row['osm_user'];
// Récupérer toutes les places de cet utilisateur
$places = $placeRepo->createQueryBuilder('p')
->where('p.osm_user = :osm_user')
->setParameter('osm_user', $osmUser)
->getQuery()->getResult();
$total = 0;
$sum = 0;
foreach ($places as $place) {
$score = $place->getCompletionPercentage();
if ($score !== null) {
$sum += $score;
$total++;
}
$row['completion_moyen'] = $row['completion_moyen'] !== null ? round($row['completion_moyen'], 1) : null;
$row['completion_pondere'] = ($row['completion_moyen'] !== null && $row['nb'] > 0)
? round($row['completion_moyen'] * $row['nb'], 1)
: null;
if ($row['completion_pondere'] !== null && $row['completion_pondere'] > $maxPondere) {
$maxPondere = $row['completion_pondere'];
}
$row['completion_moyen'] = $total > 0 ? round($sum / $total, 1) : null;
}
unset($row);
// Normalisation des scores pondérés entre 0 et 100
if ($maxPondere > 0) {
foreach ($podium as &$row) {
if ($row['completion_pondere'] !== null) {
$row['completion_pondere_normalisee'] = round($row['completion_pondere'] / $maxPondere * 100, 1);
} else {
$row['completion_pondere_normalisee'] = null;
}
}
unset($row);
}
// Tri décroissant sur le score normalisé
usort($podium, function($a, $b) {
return ($b['completion_pondere_normalisee'] ?? 0) <=> ($a['completion_pondere_normalisee'] ?? 0);
});
return $this->render('admin/podium_contributeurs_osm.html.twig', [
'podium' => $podium