<?php
namespace App\Controller;
use App\Entity\Beneficiary;
use App\Entity\Promotion;
use App\Entity\AddressRegion;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Service\Attribute\Required;
class DashboardController extends AbstractController
{
#[Required]
public PromotionListingController $promotionListingController;
#[Route('/admin', name: 'home')]
public function index(EntityManagerInterface $em, Request $request): Response
{
// Pas le plus clean, je sais, mais ça a le mérite de fonctionner
if ($this->isGranted('ROLE_BENEFICIARY')) {
return $this->redirectToRoute('beneficiary.edit', ['id' => $this->getUser()->getBeneficiary()->getId()]);
}
try {
$items = $this->promotionListingController->getItemsFromRequest($request, '', ['no_limit' => true], PromotionListingController::QUERY_DASHBOARD, ['no_limit' => true]);
} catch (\Exception $e) {
$this->addFlash('danger', 'Une erreur est survenu durant le chargement du listing : ' . $e->getMessage());
return $this->redirectToRoute('home');
}
/** @var User $user */
$user = $this->getUser();
$beneficiariesPerRegions = $em->getRepository(Beneficiary::class)->findNbPerRegions(
$user->hasRole('ROLE_SPEAKER') || $user->hasRole('ROLE_SUPPORT') ? $user->getContact()->getStructure() : null
);
$regions = $em->getRepository(AddressRegion::class)->findAllForDashboard();
$max = 0;
// Fusion des régions & du nombre de bénéficiaires par région
// J'en profite pour récupérer le nombre de bénéficiaire le plus important sur une région
// Et calculer le pourcentage de bénéficiaire sur une région
foreach ($regions as $i => $region) {
foreach ($beneficiariesPerRegions as $benefRegion) {
if ($benefRegion['code'] === $region['code']) {
$region['nb_beneficiaries'] = $benefRegion['nb_beneficiaries'];
$max = max($max, $benefRegion['nb_beneficiaries']);
}
}
if (!isset($region['nb_beneficiaries'])) {
$region['nb_beneficiaries'] = 0;
}
$regions[$i] = $region;
}
// InterStep permet de calculer les échelons de couleur
// Calculez sur 4 échelons, car le dernier est le maximum atteignable
$steps = $grade = 0;
if ($max >= 4) {
$steps = 4;
$grade = floor($max / 4);
} elseif ($max > 0) {
$steps = $max;
$grade = 1;
}
// Calcule pour chaque région de son échelon sur ces couleurs
foreach ($regions as $i => $region) {
$nb = $region['nb_beneficiaries'];
if ($nb === 0) {
$regions[$i]['step'] = 1;
continue;
}
if ($max >= 4) {
$step = $grade > 0 ? floor($nb / $grade) : 0;
$regions[$i]['step'] = min($step + 1, 5);
} else {
$regions[$i]['step'] = $nb + 1;
}
}
$countBeneficiaries = $em->getRepository(Beneficiary::class)->findNbAll(
$user->hasRole('ROLE_SPEAKER') || $user->hasRole('ROLE_SUPPORT') ? $user->getContact()->getStructure() : null
);
$nbBeneficiaryInProgress = $em->getRepository(Beneficiary::class)->findNbInProgress(
$user->hasRole('ROLE_SPEAKER') || $user->hasRole('ROLE_SUPPORT') ? $user->getContact()->getStructure() : null
);
$nbPromotions = $em->getRepository(Promotion::class)->findNbAll(
$user->hasRole('ROLE_SPEAKER') || $user->hasRole('ROLE_SUPPORT') ? $user->getContact()->getStructure() : null
);
return $this->render('dashboard/index.html.twig', array_merge($items, [
'user' => $this->getUser(),
'nbBeneficiaries' => $countBeneficiaries,
'nbBeneficiaryInProgress' => $nbBeneficiaryInProgress,
'nbPromotions' => $nbPromotions,
'regions' => $regions,
'steps' => $steps,
'regionsLegends' => $grade,
'items' => $this->isGranted('ROLE_SUPPORT') || $this->isGranted('ROLE_SPEAKER') ?
$em->getRepository(Promotion::class)->findBy(['status' => Promotion::STATUS['pending'], 'structure' => $user->getContact()->getStructure()]) :
$em->getRepository(Promotion::class)->findBy(['status' => Promotion::STATUS['pending']])
,
'lastBeneficiaries' => $this->isGranted('ROLE_SUPPORT') || $this->isGranted('ROLE_SPEAKER') ?
$em->getRepository(Beneficiary::class)->findByStructure($user->getContact()->getStructure(), 9) :
$em->getRepository(Beneficiary::class)->findBy([], ['updatedDate' => 'DESC'], 9)
]));
}
}