src/Controller/DashboardController.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\OrganisationTypeCharge;
  4. use App\Repository\BudgetRepository;
  5. use App\Repository\ChargeRepository;
  6. use App\Repository\OrganisationRepository;
  7. use App\Repository\OrganisationTypeChargeRepository;
  8. use App\Service\SessionService;
  9. use DateTime;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpFoundation\Response;
  13. class DashboardController extends AbstractController
  14. {
  15.     #[Route('/'name'dashboard')]
  16.     public function index(
  17.         SessionService $session,
  18.         OrganisationRepository $orgaRepo,
  19.         ChargeRepository $chargeRepo,
  20.         OrganisationTypeChargeRepository $orgaTypeChargeRepo,
  21.         BudgetRepository $budgetRepo
  22.     ): Response {
  23.         if ($this->getUser()->isUserFac14()) {
  24.             return $this->redirectToRoute('app_fac14_national');
  25.         }
  26.         $perimeter $session->getPerimeter();
  27.         $period $session->getPeriod();
  28.         $chargesByRegate $this->getChargesByRegate($chargeRepo$orgaTypeChargeRepo$period);
  29.         $budgetsByRegate $this->getBudgetsByRegate($budgetRepo$period);
  30.         $chargesAggregated = [];
  31.         $budgetsPeriodeAggregated = [];
  32.         $budgetsAnnuelAggregated = [];
  33.         $totalCharges 0;
  34.         $totalPeriodeBudgets 0;
  35.         $totalAnnuelBudgets 0;
  36.         $orgaOpen = [];
  37.         $items_fonctionnement = [];
  38.         $items_ao = [];
  39.         $items_projet = [];
  40.         $organisations $orgaRepo->findBy(['level' => 0], ['name' => 'ASC']);
  41.         foreach ($organisations as $lvl0Orga) {
  42.             if ($lvl0Orga->getLevel() === 0) {
  43.                 $charges0 $chargesByRegate[$lvl0Orga->getCodeRegate()] ?? 0;
  44.                 $budgets_periode_0 $budgetsByRegate[$lvl0Orga->getCodeRegate()]['montant_periode'] ?? 0;
  45.                 $budgets_annuel_0 $budgetsByRegate[$lvl0Orga->getCodeRegate()]['montant_annuel'] ?? 0;
  46.                 $orgaOpen[$lvl0Orga->getCodeRegate()] = false;
  47.                 foreach ($lvl0Orga->getChildren() as $lvl1Orga) {
  48.                     $charges1 $chargesByRegate[$lvl1Orga->getCodeRegate()] ?? 0;
  49.                     $budgets_periode_1 $budgetsByRegate[$lvl1Orga->getCodeRegate()]['montant_periode'] ?? 0;
  50.                     $budgets_annuel_1 $budgetsByRegate[$lvl1Orga->getCodeRegate()]['montant_annuel'] ?? 0;
  51.                     $charges0 += $charges1;
  52.                     $budgets_periode_0 += $budgets_periode_1;
  53.                     $budgets_annuel_0 += $budgets_annuel_1;
  54.                     $orgaOpen[$lvl1Orga->getCodeRegate()] = false;
  55.                     foreach ($lvl1Orga->getChildren() as $lvl2Orga) {
  56.                         $charges2 $chargesByRegate[$lvl2Orga->getCodeRegate()] ?? 0;
  57.                         $budgets_periode_2 $budgetsByRegate[$lvl2Orga->getCodeRegate()]['montant_periode'] ?? 0;
  58.                         $budgets_annuel_2 $budgetsByRegate[$lvl2Orga->getCodeRegate()]['montant_annuel'] ?? 0;
  59.                         $charges0 += $charges2;
  60.                         $budgets_periode_0 += $budgets_periode_2;
  61.                         $budgets_annuel_0 += $budgets_annuel_2;
  62.                         $charges1 += $charges2;
  63.                         $budgets_periode_1 += $budgets_periode_2;
  64.                         $budgets_annuel_1 += $budgets_annuel_2;
  65.                         $orgaOpen[$lvl2Orga->getCodeRegate()] = false;
  66.                         foreach ($lvl2Orga->getChildren() as $lvl3Orga) {
  67.                             $charges3 $chargesByRegate[$lvl3Orga->getCodeRegate()] ?? 0;
  68.                             $budgets_periode_3 $budgetsByRegate[$lvl3Orga->getCodeRegate()]['montant_periode'] ?? 0;
  69.                             $budgets_annuel_3 $budgetsByRegate[$lvl3Orga->getCodeRegate()]['montant_annuel'] ?? 0;
  70.                             $charges0 += $charges3;
  71.                             $budgets_periode_0 += $budgets_periode_3;
  72.                             $budgets_annuel_0 += $budgets_annuel_3;
  73.                             $charges1 += $charges3;
  74.                             $budgets_periode_1 += $budgets_periode_3;
  75.                             $budgets_annuel_1 += $budgets_annuel_3;
  76.                             $charges2 += $charges3;
  77.                             $budgets_periode_2 += $budgets_periode_3;
  78.                             $budgets_annuel_2 += $budgets_annuel_3;
  79.                             $chargesAggregated[$lvl3Orga->getCodeRegate()] = $charges3;
  80.                             $budgetsPeriodeAggregated[$lvl3Orga->getCodeRegate()] = $budgets_periode_3;
  81.                             $budgetsAnnuelAggregated[$lvl3Orga->getCodeRegate()] = $budgets_annuel_3;
  82.                             if ($lvl3Orga->getId() == $perimeter['selected']) {
  83.                                 $orgaOpen[$lvl2Orga->getCodeRegate()] = true;
  84.                                 $orgaOpen[$lvl1Orga->getCodeRegate()] = true;
  85.                                 $orgaOpen[$lvl0Orga->getCodeRegate()] = true;
  86.                             }
  87.                         }
  88.                         $chargesAggregated[$lvl2Orga->getCodeRegate()] = $charges2;
  89.                         $budgetsPeriodeAggregated[$lvl2Orga->getCodeRegate()] = $budgets_periode_2;
  90.                         $budgetsAnnuelAggregated[$lvl2Orga->getCodeRegate()] = $budgets_annuel_2;
  91.                         if ($lvl2Orga->getId() == $perimeter['selected']) {
  92.                             $orgaOpen[$lvl1Orga->getCodeRegate()] = true;
  93.                             $orgaOpen[$lvl0Orga->getCodeRegate()] = true;
  94.                         }
  95.                     }
  96.                     $chargesAggregated[$lvl1Orga->getCodeRegate()] = $charges1;
  97.                     $budgetsPeriodeAggregated[$lvl1Orga->getCodeRegate()] = $budgets_periode_1;
  98.                     $budgetsAnnuelAggregated[$lvl1Orga->getCodeRegate()] = $budgets_annuel_1;
  99.                     if ($lvl1Orga->getId() == $perimeter['selected']) {
  100.                         $orgaOpen[$lvl0Orga->getCodeRegate()] = true;
  101.                     }
  102.                 }
  103.                 $chargesAggregated[$lvl0Orga->getCodeRegate()] = $charges0;
  104.                 $budgetsPeriodeAggregated[$lvl0Orga->getCodeRegate()] = $budgets_periode_0;
  105.                 $budgetsAnnuelAggregated[$lvl0Orga->getCodeRegate()] = $budgets_annuel_0;
  106.                 $totalCharges += $charges0;
  107.                 $totalPeriodeBudgets += $budgets_periode_0;
  108.                 $totalAnnuelBudgets += $budgets_annuel_0;
  109.                 switch ($lvl0Orga->getChargeType()?->getLabel()) {
  110.                     case 'ActivitĂ©s opĂ©rationnelles':
  111.                         $items_ao[] = $lvl0Orga;
  112.                         break;
  113.                     case 'Projets':
  114.                         $items_projet[] = $lvl0Orga;
  115.                         break;
  116.                     case 'Fonctionnement':
  117.                         $items_fonctionnement[] = $lvl0Orga;
  118.                         break;
  119.                 }
  120.             }
  121.         }
  122.         return $this->render('dashboard/dashboard.html.twig', [
  123.             'organisations' => $organisations,
  124.             'orgaOpen' => $orgaOpen,
  125.             'charges' => $chargesAggregated,
  126.             'budgets_periode' => $budgetsPeriodeAggregated,
  127.             'budgets_annuel' => $budgetsAnnuelAggregated,
  128.             'totalCharges' => $totalCharges,
  129.             'totalPeriodeBudgets' => $totalPeriodeBudgets,
  130.             'totalAnnuelBudgets' => $totalAnnuelBudgets,
  131.             'selection_periode' => true,
  132.             'selection_perimetre' => false,
  133.             'items_fonctionnement' => $items_fonctionnement,
  134.             'items_ao' => $items_ao,
  135.             'items_projet' => $items_projet,
  136.         ]);
  137.     }
  138.     private function getChargesByRegate(
  139.         ChargeRepository $chargeRepo,
  140.         OrganisationTypeChargeRepository $orgaTypeChargeRepo,
  141.         array $period
  142.     ): array {
  143.         $startDate = new DateTime($period['selectedYear'] . '-' $period['startMonth'] . '-01');
  144.         $endDate = (new DateTime($period['selectedYear'] . '-' $period['endMonth'] . '-01'))->modify('last day of');
  145.         $chargeTypeFct $orgaTypeChargeRepo->findOneBy(['label' => 'Fonctionnement']);
  146.         $queryNonFct $chargeRepo->createQueryBuilder('c')
  147.             // ->innerJoin('App\Entity\NatureCharge', 'nc', 'WITH', 'nc.compte_gestion = c.compte_gestion')
  148.             ->join('App\Entity\Organisation''o''WITH''o.codeRegate = c.code_regate')
  149.             ->select('SUM(c.montant_htnd) as montant, c.code_regate')
  150.             ->groupBy('c.code_regate')
  151.             ->andWhere('o.chargeType != :chargeType')
  152.             ->andwhere('c.date_creation BETWEEN :start AND :end')
  153.             ->setParameter('chargeType'$chargeTypeFct)
  154.             ->setParameter('start'$startDate->format('Y-m-d H:i:s'))
  155.             ->setParameter('end'value$endDate->format('Y-m-d H:i:s'));
  156.         $charges $queryNonFct->getQuery()->getResult();
  157.         $queryFct $chargeRepo->createQueryBuilder('c')
  158.           ->join('App\Entity\Organisation''o''WITH''o.codeRegate = c.code_regate')
  159.           ->join('App\Entity\NatureCharge''nc''WITH''nc.compte_gestion = c.compte_gestion')
  160.           ->select('SUM(c.montant_htnd) as montant, c.code_regate')
  161.           ->groupBy('c.code_regate')
  162.           ->andWhere('o.chargeType = :chargeType')
  163.           ->andwhere('c.date_creation BETWEEN :start AND :end')
  164.           ->setParameter('chargeType'$chargeTypeFct)
  165.           ->setParameter('start'$startDate->format('Y-m-d H:i:s'))
  166.           ->setParameter('end'value$endDate->format('Y-m-d H:i:s'));
  167.         $charges array_merge($charges$queryFct->getQuery()->getResult());
  168.         $chargesByRegate = [];
  169.         foreach ($charges as $charge) {
  170.             $chargesByRegate[$charge['code_regate']] = $charge['montant'];
  171.         }
  172.         return $chargesByRegate;
  173.     }
  174.     private function getBudgetsByRegate(BudgetRepository $budgetRepo, array $period): array
  175.     {
  176.         $months = [];
  177.         for ($i $period['startMonth']; $i <= $period['endMonth']; $i++) {
  178.             switch ($i) {
  179.                 case 1:
  180.                     $months[] = 'c.janvier';
  181.                     break;
  182.                 case 2:
  183.                     $months[] = 'c.fevrier';
  184.                     break;
  185.                 case 3:
  186.                     $months[] = 'c.mars';
  187.                     break;
  188.                 case 4:
  189.                     $months[] = 'c.avril';
  190.                     break;
  191.                 case 5:
  192.                     $months[] = 'c.mai';
  193.                     break;
  194.                 case 6:
  195.                     $months[] = 'c.juin';
  196.                     break;
  197.                 case 7:
  198.                     $months[] = 'c.juillet';
  199.                     break;
  200.                 case 8:
  201.                     $months[] = 'c.aout';
  202.                     break;
  203.                 case 9:
  204.                     $months[] = 'c.septembre';
  205.                     break;
  206.                 case 10:
  207.                     $months[] = 'c.octobre';
  208.                     break;
  209.                 case 11:
  210.                     $months[] = 'c.novembre';
  211.                     break;
  212.                 case 12:
  213.                     $months[] = 'c.decembre';
  214.                     break;
  215.             }
  216.         }
  217.         $query $budgetRepo->createQueryBuilder('c')
  218.             ->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
  219.             ->groupBy('c.code')
  220.             ->andWhere('c.annee=:year')
  221.             ->setParameter('year'$period['selectedYear']);
  222.         $budgets $query
  223.             ->getQuery()
  224.             ->getResult();
  225.         $budgetsByRegate = [];
  226.         foreach ($budgets as $budget) {
  227.             $budgetsByRegate[$budget['code']] = [
  228.                 'montant_periode' => $budget['montant_periode'],
  229.                 'montant_annuel' => $budget['montant_annuel'],
  230.             ];
  231.         }
  232.         return $budgetsByRegate;
  233.     }
  234. }