<?php
namespace App\Controller;
use App\Entity\OrganisationTypeCharge;
use App\Repository\BudgetRepository;
use App\Repository\ChargeRepository;
use App\Repository\OrganisationRepository;
use App\Repository\OrganisationTypeChargeRepository;
use App\Service\SessionService;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class DashboardController extends AbstractController
{
#[Route('/', name: 'dashboard')]
public function index(
SessionService $session,
OrganisationRepository $orgaRepo,
ChargeRepository $chargeRepo,
OrganisationTypeChargeRepository $orgaTypeChargeRepo,
BudgetRepository $budgetRepo
): Response {
if ($this->getUser()->isUserFac14()) {
return $this->redirectToRoute('app_fac14_national');
}
$perimeter = $session->getPerimeter();
$period = $session->getPeriod();
$chargesByRegate = $this->getChargesByRegate($chargeRepo, $orgaTypeChargeRepo, $period);
$budgetsByRegate = $this->getBudgetsByRegate($budgetRepo, $period);
$chargesAggregated = [];
$budgetsPeriodeAggregated = [];
$budgetsAnnuelAggregated = [];
$totalCharges = 0;
$totalPeriodeBudgets = 0;
$totalAnnuelBudgets = 0;
$orgaOpen = [];
$items_fonctionnement = [];
$items_ao = [];
$items_projet = [];
$organisations = $orgaRepo->findBy(['level' => 0], ['name' => 'ASC']);
foreach ($organisations as $lvl0Orga) {
if ($lvl0Orga->getLevel() === 0) {
$charges0 = $chargesByRegate[$lvl0Orga->getCodeRegate()] ?? 0;
$budgets_periode_0 = $budgetsByRegate[$lvl0Orga->getCodeRegate()]['montant_periode'] ?? 0;
$budgets_annuel_0 = $budgetsByRegate[$lvl0Orga->getCodeRegate()]['montant_annuel'] ?? 0;
$orgaOpen[$lvl0Orga->getCodeRegate()] = false;
foreach ($lvl0Orga->getChildren() as $lvl1Orga) {
$charges1 = $chargesByRegate[$lvl1Orga->getCodeRegate()] ?? 0;
$budgets_periode_1 = $budgetsByRegate[$lvl1Orga->getCodeRegate()]['montant_periode'] ?? 0;
$budgets_annuel_1 = $budgetsByRegate[$lvl1Orga->getCodeRegate()]['montant_annuel'] ?? 0;
$charges0 += $charges1;
$budgets_periode_0 += $budgets_periode_1;
$budgets_annuel_0 += $budgets_annuel_1;
$orgaOpen[$lvl1Orga->getCodeRegate()] = false;
foreach ($lvl1Orga->getChildren() as $lvl2Orga) {
$charges2 = $chargesByRegate[$lvl2Orga->getCodeRegate()] ?? 0;
$budgets_periode_2 = $budgetsByRegate[$lvl2Orga->getCodeRegate()]['montant_periode'] ?? 0;
$budgets_annuel_2 = $budgetsByRegate[$lvl2Orga->getCodeRegate()]['montant_annuel'] ?? 0;
$charges0 += $charges2;
$budgets_periode_0 += $budgets_periode_2;
$budgets_annuel_0 += $budgets_annuel_2;
$charges1 += $charges2;
$budgets_periode_1 += $budgets_periode_2;
$budgets_annuel_1 += $budgets_annuel_2;
$orgaOpen[$lvl2Orga->getCodeRegate()] = false;
foreach ($lvl2Orga->getChildren() as $lvl3Orga) {
$charges3 = $chargesByRegate[$lvl3Orga->getCodeRegate()] ?? 0;
$budgets_periode_3 = $budgetsByRegate[$lvl3Orga->getCodeRegate()]['montant_periode'] ?? 0;
$budgets_annuel_3 = $budgetsByRegate[$lvl3Orga->getCodeRegate()]['montant_annuel'] ?? 0;
$charges0 += $charges3;
$budgets_periode_0 += $budgets_periode_3;
$budgets_annuel_0 += $budgets_annuel_3;
$charges1 += $charges3;
$budgets_periode_1 += $budgets_periode_3;
$budgets_annuel_1 += $budgets_annuel_3;
$charges2 += $charges3;
$budgets_periode_2 += $budgets_periode_3;
$budgets_annuel_2 += $budgets_annuel_3;
$chargesAggregated[$lvl3Orga->getCodeRegate()] = $charges3;
$budgetsPeriodeAggregated[$lvl3Orga->getCodeRegate()] = $budgets_periode_3;
$budgetsAnnuelAggregated[$lvl3Orga->getCodeRegate()] = $budgets_annuel_3;
if ($lvl3Orga->getId() == $perimeter['selected']) {
$orgaOpen[$lvl2Orga->getCodeRegate()] = true;
$orgaOpen[$lvl1Orga->getCodeRegate()] = true;
$orgaOpen[$lvl0Orga->getCodeRegate()] = true;
}
}
$chargesAggregated[$lvl2Orga->getCodeRegate()] = $charges2;
$budgetsPeriodeAggregated[$lvl2Orga->getCodeRegate()] = $budgets_periode_2;
$budgetsAnnuelAggregated[$lvl2Orga->getCodeRegate()] = $budgets_annuel_2;
if ($lvl2Orga->getId() == $perimeter['selected']) {
$orgaOpen[$lvl1Orga->getCodeRegate()] = true;
$orgaOpen[$lvl0Orga->getCodeRegate()] = true;
}
}
$chargesAggregated[$lvl1Orga->getCodeRegate()] = $charges1;
$budgetsPeriodeAggregated[$lvl1Orga->getCodeRegate()] = $budgets_periode_1;
$budgetsAnnuelAggregated[$lvl1Orga->getCodeRegate()] = $budgets_annuel_1;
if ($lvl1Orga->getId() == $perimeter['selected']) {
$orgaOpen[$lvl0Orga->getCodeRegate()] = true;
}
}
$chargesAggregated[$lvl0Orga->getCodeRegate()] = $charges0;
$budgetsPeriodeAggregated[$lvl0Orga->getCodeRegate()] = $budgets_periode_0;
$budgetsAnnuelAggregated[$lvl0Orga->getCodeRegate()] = $budgets_annuel_0;
$totalCharges += $charges0;
$totalPeriodeBudgets += $budgets_periode_0;
$totalAnnuelBudgets += $budgets_annuel_0;
switch ($lvl0Orga->getChargeType()?->getLabel()) {
case 'Activités opérationnelles':
$items_ao[] = $lvl0Orga;
break;
case 'Projets':
$items_projet[] = $lvl0Orga;
break;
case 'Fonctionnement':
$items_fonctionnement[] = $lvl0Orga;
break;
}
}
}
return $this->render('dashboard/dashboard.html.twig', [
'organisations' => $organisations,
'orgaOpen' => $orgaOpen,
'charges' => $chargesAggregated,
'budgets_periode' => $budgetsPeriodeAggregated,
'budgets_annuel' => $budgetsAnnuelAggregated,
'totalCharges' => $totalCharges,
'totalPeriodeBudgets' => $totalPeriodeBudgets,
'totalAnnuelBudgets' => $totalAnnuelBudgets,
'selection_periode' => true,
'selection_perimetre' => false,
'items_fonctionnement' => $items_fonctionnement,
'items_ao' => $items_ao,
'items_projet' => $items_projet,
]);
}
private function getChargesByRegate(
ChargeRepository $chargeRepo,
OrganisationTypeChargeRepository $orgaTypeChargeRepo,
array $period
): array {
$startDate = new DateTime($period['selectedYear'] . '-' . $period['startMonth'] . '-01');
$endDate = (new DateTime($period['selectedYear'] . '-' . $period['endMonth'] . '-01'))->modify('last day of');
$chargeTypeFct = $orgaTypeChargeRepo->findOneBy(['label' => 'Fonctionnement']);
$queryNonFct = $chargeRepo->createQueryBuilder('c')
// ->innerJoin('App\Entity\NatureCharge', 'nc', 'WITH', 'nc.compte_gestion = c.compte_gestion')
->join('App\Entity\Organisation', 'o', 'WITH', 'o.codeRegate = c.code_regate')
->select('SUM(c.montant_htnd) as montant, c.code_regate')
->groupBy('c.code_regate')
->andWhere('o.chargeType != :chargeType')
->andwhere('c.date_creation BETWEEN :start AND :end')
->setParameter('chargeType', $chargeTypeFct)
->setParameter('start', $startDate->format('Y-m-d H:i:s'))
->setParameter('end', value: $endDate->format('Y-m-d H:i:s'));
$charges = $queryNonFct->getQuery()->getResult();
$queryFct = $chargeRepo->createQueryBuilder('c')
->join('App\Entity\Organisation', 'o', 'WITH', 'o.codeRegate = c.code_regate')
->join('App\Entity\NatureCharge', 'nc', 'WITH', 'nc.compte_gestion = c.compte_gestion')
->select('SUM(c.montant_htnd) as montant, c.code_regate')
->groupBy('c.code_regate')
->andWhere('o.chargeType = :chargeType')
->andwhere('c.date_creation BETWEEN :start AND :end')
->setParameter('chargeType', $chargeTypeFct)
->setParameter('start', $startDate->format('Y-m-d H:i:s'))
->setParameter('end', value: $endDate->format('Y-m-d H:i:s'));
$charges = array_merge($charges, $queryFct->getQuery()->getResult());
$chargesByRegate = [];
foreach ($charges as $charge) {
$chargesByRegate[$charge['code_regate']] = $charge['montant'];
}
return $chargesByRegate;
}
private function getBudgetsByRegate(BudgetRepository $budgetRepo, array $period): array
{
$months = [];
for ($i = $period['startMonth']; $i <= $period['endMonth']; $i++) {
switch ($i) {
case 1:
$months[] = 'c.janvier';
break;
case 2:
$months[] = 'c.fevrier';
break;
case 3:
$months[] = 'c.mars';
break;
case 4:
$months[] = 'c.avril';
break;
case 5:
$months[] = 'c.mai';
break;
case 6:
$months[] = 'c.juin';
break;
case 7:
$months[] = 'c.juillet';
break;
case 8:
$months[] = 'c.aout';
break;
case 9:
$months[] = 'c.septembre';
break;
case 10:
$months[] = 'c.octobre';
break;
case 11:
$months[] = 'c.novembre';
break;
case 12:
$months[] = 'c.decembre';
break;
}
}
$query = $budgetRepo->createQueryBuilder('c')
->select('SUM(' . implode('+', $months) . ') as montant_periode, SUM(c.janvier+c.fevrier+c.mars+c.avril+c.mai+c.juin+c.juillet+c.aout+c.septembre+c.octobre+c.novembre+c.decembre) as montant_annuel, c.code') //phpcs:ignore
->groupBy('c.code')
->andWhere('c.annee=:year')
->setParameter('year', $period['selectedYear']);
$budgets = $query
->getQuery()
->getResult();
$budgetsByRegate = [];
foreach ($budgets as $budget) {
$budgetsByRegate[$budget['code']] = [
'montant_periode' => $budget['montant_periode'],
'montant_annuel' => $budget['montant_annuel'],
];
}
return $budgetsByRegate;
}
}