src/Controller/DashboardController.php line 291

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\Depense;
  5. use App\Entity\Produit;
  6. use App\Entity\Recette;
  7. use App\Entity\Boutique;
  8. use App\Entity\Livraison;
  9. use App\Entity\EntreeStock;
  10. use App\Entity\SortieStock;
  11. use App\Repository\VenteRepository;
  12. use App\Repository\FactureRepository;
  13. use App\Repository\ProduitRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use App\Repository\EntreeStockRepository;
  16. use Symfony\Component\VarDumper\Cloner\Data;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. class DashboardController extends AbstractController
  22. {
  23.     private $entityManager;
  24.     private $venteRepository;
  25.     public function __construct(EntityManagerInterface $entityManagerVenteRepository $venteRepository)
  26.     {
  27.         $this->entityManager $entityManager;
  28.         $this->venteRepository $venteRepository;
  29.     }
  30.     #[Route('/dashboard'name'app_dashboard')]
  31.     public function index(Request $requestProduitRepository $menuRepositoryFactureRepository $factureRepository): Response
  32.     {
  33.         // Récupérer l'utilisateur connecté et son rôle
  34.         $user $this->getUser();
  35.         $isSuperAdmin $this->isGranted('ROLE_SUPER_ADMIN');
  36.         $isAdmin $this->isGranted('ROLE_ADMIN');
  37.         
  38.         // Récupérer la période sélectionnée (journalier, hebdomadaire, mensuel, trimestriel, semestriel, annuel)
  39.         $period $request->query->get('period''daily');
  40.         
  41.         // Initialiser les variables de date selon la période
  42.         $startDate = new \DateTime('today');
  43.         $endDate = clone $startDate;
  44.         $endDate->modify('+1 day');
  45.         $periodLabel 'Journalier';
  46.         
  47.         // Définir les dates selon la période sélectionnée
  48.         switch ($period) {
  49.             case 'weekly':
  50.                 $startDate = new \DateTime('monday this week');
  51.                 $endDate = clone $startDate;
  52.                 $endDate->modify('+1 week');
  53.                 $periodLabel 'Hebdomadaire';
  54.                 break;
  55.             case 'monthly':
  56.                 $startDate = new \DateTime('first day of this month');
  57.                 $endDate = clone $startDate;
  58.                 $endDate->modify('+1 month');
  59.                 $periodLabel 'Mensuel';
  60.                 break;
  61.             case 'quarterly':
  62.                 $startDate = new \DateTime('first day of this month');
  63.                 $quarter ceil($startDate->format('n') / 3);
  64.                 $startDate->setDate($startDate->format('Y'), ($quarter 1) * 11);
  65.                 $endDate = clone $startDate;
  66.                 $endDate->modify('+3 months');
  67.                 $periodLabel 'Trimestriel';
  68.                 break;
  69.             case 'biannual':
  70.                 $startDate = new \DateTime('first day of january this year');
  71.                 if ((int)$startDate->format('n') > 6) {
  72.                     $startDate->setDate($startDate->format('Y'), 71);
  73.                 }
  74.                 $endDate = clone $startDate;
  75.                 $endDate->modify('+6 months');
  76.                 $periodLabel 'Semestriel';
  77.                 break;
  78.             case 'annual':
  79.                 $startDate = new \DateTime('first day of january this year');
  80.                 $endDate = clone $startDate;
  81.                 $endDate->modify('+1 year');
  82.                 $periodLabel 'Annuel';
  83.                 break;
  84.         }
  85.         
  86.         // Récupérer toutes les boutiques pour admin/superadmin ou seulement la boutique associée pour magasinier
  87.         $boutiqueRepository $this->entityManager->getRepository(Boutique::class);
  88.         
  89.         if ($isSuperAdmin || $isAdmin) {
  90.             // Admin ou SuperAdmin voit toutes les boutiques
  91.             $boutiques $boutiqueRepository->findAll();
  92.         } else {
  93.             // Magasinier ne voit que sa boutique assignée
  94.             $boutiques = [];
  95.             if ($user && $user->getBoutique()) {
  96.                 $boutiques = [$user->getBoutique()];
  97.             }
  98.         }
  99.         
  100.         // Récupérer les recettes par boutique pour la période sélectionnée
  101.         $recetteRepository $this->entityManager->getRepository(Recette::class);
  102.         $recettesByBoutique = [];
  103.         $totalRecette 0;
  104.         
  105.         foreach ($boutiques as $boutique) {
  106.             $recettes $recetteRepository->createQueryBuilder('r')
  107.                 ->where('r.dateRecette >= :start')
  108.                 ->andWhere('r.dateRecette < :end')
  109.                 ->andWhere('r.boutique = :boutique')
  110.                 ->setParameter('start'$startDate->format('Y-m-d H:i:s'))
  111.                 ->setParameter('end'$endDate->format('Y-m-d H:i:s'))
  112.                 ->setParameter('boutique'$boutique)
  113.                 ->getQuery()
  114.                 ->getResult();
  115.                 
  116.             $montantTotal 0;
  117.             foreach ($recettes as $recette) {
  118.                 $montantTotal += $recette->getMontant();
  119.             }
  120.             
  121.             $recettesByBoutique[$boutique->getId()] = [
  122.                 'boutique' => $boutique,
  123.                 'montant' => $montantTotal
  124.             ];
  125.             
  126.             $totalRecette += $montantTotal;
  127.         }
  128.         
  129.         // Récupérer les autres données existantes
  130.         $numberOfMenus $menuRepository->createQueryBuilder('m')
  131.             ->select('COUNT(m.id)')
  132.             ->getQuery()
  133.             ->getSingleScalarResult();
  134.         $topMenus $this->entityManager->getRepository(Produit::class)->findTopMenus(5);
  135.         $bottomProducts $this->entityManager->getRepository(Produit::class)->findBottomProducts(5);
  136.         $today = new DateTime('today');
  137.         $recette $this->entityManager->getRepository(Recette::class)->findOneBy(['dateRecette' => $today]);
  138.         $depenses $this->entityManager->getRepository(Depense::class)->createQueryBuilder('d')
  139.             ->where('d.dateDepense >= :start')
  140.             ->andWhere('d.dateDepense < :end')
  141.             ->setParameter('start'$startDate->format('Y-m-d H:i:s'))
  142.             ->setParameter('end'$endDate->format('Y-m-d H:i:s'))
  143.             ->getQuery()
  144.             ->getResult();
  145.         $livraisonsEnAttente $this->entityManager->getRepository(Livraison::class)->findBy(['statut' => 'en attente']);
  146.         $livraisonsEnCours $this->entityManager->getRepository(Livraison::class)->findBy(['statut' => 'en cours']);
  147.         
  148.         $dailyRevenue $factureRepository->getRevenueByPeriod($today, new \DateTime('tomorrow'));
  149.         $monthlyRevenue $factureRepository->getRevenueByPeriod(new \DateTime('first day of this month'), new \DateTime('last day of this month'));
  150.         $trimesterRevenue $factureRepository->getRevenueByPeriod(new \DateTime(date('Y-m-d'strtotime('-2 months'strtotime('first day of this month')))), new \DateTime('last day of this month'));
  151.         return $this->render('dashboard/index.html.twig', [
  152.             'numberOfMenus' => $numberOfMenus,
  153.             'topMenus' => $topMenus,
  154.             'btP' => $bottomProducts,
  155.             'montantRecette' => $recette $recette->getMontant() : 0,
  156.             'depenses' => $depenses,
  157.             'livraisonsEnAttente' => $livraisonsEnAttente,
  158.             'livraisonsEnCours' => $livraisonsEnCours,
  159.             'dailyRevenue' => $dailyRevenue,
  160.             'monthlyRevenue' => $monthlyRevenue,
  161.             'trimesterRevenue' => $trimesterRevenue,
  162.             'recettesByBoutique' => $recettesByBoutique,
  163.             'totalRecette' => $totalRecette,
  164.             'period' => $period,
  165.             'periodLabel' => $periodLabel,
  166.             'isSuperAdmin' => $isSuperAdmin,
  167.             'isAdmin' => $isAdmin,
  168.             'userBoutique' => $user $user->getBoutique() : null,
  169.         ]);
  170.     }
  171.     
  172.     #[Route('/dashboard/boutique/{id}/recettes'name'app_dashboard_boutique_recettes')]
  173.     public function boutiqueRecettes(Request $requestBoutique $boutique): Response
  174.     {
  175.         // Vérifier les permissions
  176.         $user $this->getUser();
  177.         
  178.         if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_SUPER_ADMIN')) {
  179.             if (!$user->getBoutique() || $user->getBoutique()->getId() !== $boutique->getId()) {
  180.                 throw $this->createAccessDeniedException('Vous n\'avez pas accès à cette boutique');
  181.             }
  182.         }
  183.         
  184.         
  185.         // Récupérer la période et les dates
  186.         $period $request->query->get('period''daily');
  187.         $startDate = new \DateTime('today');
  188.         $endDate = clone $startDate;
  189.         $endDate->modify('+1 day');
  190.         
  191.         // Définir les dates selon la période sélectionnée (même logique que dans index)
  192.         switch ($period) {
  193.             case 'weekly':
  194.                 $startDate = new \DateTime('monday this week');
  195.                 $endDate = clone $startDate;
  196.                 $endDate->modify('+1 week');
  197.                 break;
  198.             case 'monthly':
  199.                 $startDate = new \DateTime('first day of this month');
  200.                 $endDate = clone $startDate;
  201.                 $endDate->modify('+1 month');
  202.                 break;
  203.             case 'quarterly':
  204.                 $startDate = new \DateTime('first day of this month');
  205.                 $quarter ceil($startDate->format('n') / 3);
  206.                 $startDate->setDate($startDate->format('Y'), ($quarter 1) * 11);
  207.                 $endDate = clone $startDate;
  208.                 $endDate->modify('+3 months');
  209.                 break;
  210.             case 'biannual':
  211.                 $startDate = new \DateTime('first day of january this year');
  212.                 if ((int)$startDate->format('n') > 6) {
  213.                     $startDate->setDate($startDate->format('Y'), 71);
  214.                 }
  215.                 $endDate = clone $startDate;
  216.                 $endDate->modify('+6 months');
  217.                 break;
  218.             case 'annual':
  219.                 $startDate = new \DateTime('first day of january this year');
  220.                 $endDate = clone $startDate;
  221.                 $endDate->modify('+1 year');
  222.                 break;
  223.         }
  224.         
  225.         // Récupérer les recettes pour cette boutique dans la période
  226.         $recetteRepository $this->entityManager->getRepository(Recette::class);
  227.         $recettes $recetteRepository->createQueryBuilder('r')
  228.             ->where('r.dateRecette >= :start')
  229.             ->andWhere('r.dateRecette < :end')
  230.             ->andWhere('r.boutique = :boutique')
  231.             ->setParameter('start'$startDate->format('Y-m-d H:i:s'))
  232.             ->setParameter('end'$endDate->format('Y-m-d H:i:s'))
  233.             ->setParameter('boutique'$boutique)
  234.             ->orderBy('r.dateRecette''DESC')
  235.             ->getQuery()
  236.             ->getResult();
  237.         
  238.         return $this->render('dashboard/boutique_recettes.html.twig', [
  239.             'boutique' => $boutique,
  240.             'recettes' => $recettes,
  241.             'period' => $period,
  242.             'startDate' => $startDate,
  243.             'endDate' => $endDate
  244.         ]);
  245.     }
  246.     // Les autres méthodes existantes (dashboardData, dashboardData2, dashboardReportsData)
  247.     #[Route('/dashboard/data'name'app_dashboard_data')]
  248.     public function dashboardData(Request $request): Response
  249.     {
  250.         $filter $request->query->get('filter''today');
  251.         if (!in_array($filter, ['today''month''year'])) {
  252.             return $this->json(['error' => 'Invalid filter'], Response::HTTP_BAD_REQUEST);
  253.         }
  254.         switch ($filter) {
  255.             case 'today':
  256.                 $salesCount $this->venteRepository->getSalesCountByPeriod('today');
  257.                 break;
  258.             case 'month':
  259.                 $salesCount $this->venteRepository->getSalesCountByPeriod('month');
  260.                 break;
  261.             case 'year':
  262.                 $salesCount $this->venteRepository->getSalesCountByPeriod('year');
  263.                 break;
  264.             default:
  265.                 $salesCount 0;
  266.                 break;
  267.         }
  268.         // Construire les données au format JSON
  269.         $data = [
  270.             'nombreVentes' => $salesCount
  271.             // Ajoutez ici d'autres données si nécessaire
  272.         ];
  273.         // Renvoyer les données au format JSON
  274.         return $this->json($data);
  275.     }
  276.     #[Route('/dashboard/data2'name'app_dashboard_data2')]
  277.     public function dashboardData2(Request $request): Response
  278.     {
  279.         $filter $request->query->get('filter''today');
  280.         if (!in_array($filter, ['today''month''year'])) {
  281.             return $this->json(['error' => 'Invalid filter'], Response::HTTP_BAD_REQUEST);
  282.         }
  283.         $totalRevenue 0;
  284.         switch ($filter) {
  285.             case 'today':
  286.                 $totalRevenue $this->venteRepository->getTotalRevenueByPeriod('today');
  287.                 break;
  288.             case 'month':
  289.                 $totalRevenue $this->venteRepository->getTotalRevenueByPeriod('month');
  290.                 break;
  291.             case 'year':
  292.                 $totalRevenue $this->venteRepository->getTotalRevenueByPeriod('year');
  293.                 break;
  294.         }
  295.         $data = [
  296.             'totalRevenue' => $totalRevenue
  297.         ];
  298.         return $this->json($data);
  299.     }
  300.     #[Route('/dashboard/reports/data'name'app_dashboard_reports_data')]
  301.     public function dashboardReportsData(Request $request): Response
  302.     {
  303.         $filter $request->query->get('filter''today');
  304.         if (!in_array($filter, ['today''month''year'])) {
  305.             return $this->json(['error' => 'Invalid filter'], Response::HTTP_BAD_REQUEST);
  306.         }
  307.         // Initialiser les variables pour les données de ventes et de revenus
  308.         $salesData = [];
  309.         $revenueData = [];
  310.         $categories = [];
  311.         switch ($filter) {
  312.             case 'today':
  313.                 // Générer les catégories pour aujourd'hui (par exemple, chaque heure)
  314.                 for ($i 0$i 24$i++) {
  315.                     $categories[] = (new \DateTime())->setTime($i0)->format('Y-m-d\TH:i:s.v\Z');
  316.                     $salesData[] = $this->venteRepository->getSalesCountByPeriod('today');
  317.                     $revenueData[] = $this->venteRepository->getTotalRevenueByPeriod('today');
  318.                 }
  319.                 break;
  320.             case 'month':
  321.                 // Générer les catégories pour ce mois (par exemple, chaque jour)
  322.                 $daysInMonth = (int) date('t');
  323.                 $currentDate = new \DateTime('first day of this month');
  324.                 for ($i 0$i $daysInMonth$i++) {
  325.                     $categories[] = $currentDate->format('Y-m-d\TH:i:s.v\Z');
  326.                     $salesData[] = $this->venteRepository->getSalesCountByPeriod('month');
  327.                     $revenueData[] = $this->venteRepository->getTotalRevenueByPeriod('month');
  328.                     $currentDate->modify('+1 day');
  329.                 }
  330.                 break;
  331.             case 'year':
  332.                 // Générer les catégories pour cette année (par exemple, chaque mois)
  333.                 for ($i 1$i <= 12$i++) {
  334.                     $categories[] = (new \DateTime())->setDate(date('Y'), $i1)->format('Y-m-d\TH:i:s.v\Z');
  335.                     $salesData[] = $this->venteRepository->getSalesCountByPeriod('year');
  336.                     $revenueData[] = $this->venteRepository->getTotalRevenueByPeriod('year');
  337.                 }
  338.                 break;
  339.             default:
  340.                 // Gérer d'autres cas si nécessaire
  341.                 break;
  342.         }
  343.         // Construire les données au format JSON
  344.         $data = [
  345.             'Ventes' => $salesData,
  346.             'Revenues' => $revenueData,
  347.             'categories' => $categories,
  348.         ];
  349.         return $this->json($data);
  350.     }
  351. }