src/Controller/Admin/DashboardController.php line 418

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Activity;
  4. use App\Repository\ActivityRepository;
  5. use App\Repository\CommentRepository;
  6. use App\Repository\ProduitDeclinationValueRepository;
  7. use App\Repository\ProduitRepository;
  8. use App\Repository\UserRepository;
  9. use App\Repository\DocumentRepository;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use PDO;
  12. use Psr\Log\LoggerInterface;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use App\Service\GlobalVariables;
  18. use App\Entity\User;
  19. use App\Form\UserAddType;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Doctrine\DBAL\Types\Types;
  22. class DashboardController extends AbstractController {
  23.     private $produitRepository;
  24.     public function __construct(
  25.             ProduitRepository $produitRepository,
  26.             ActivityRepository  $activityRepository,
  27.             CommentRepository $commentRepository,
  28.             UserRepository $userRepository,
  29.             ProduitDeclinationValueRepository $produitDeclinationValueRepository,
  30.             DocumentRepository $documentRepository,
  31.             GlobalVariables $globalVariables
  32.     ) {
  33.         $this->produitRepository $produitRepository;
  34.         $this->activityRepository $activityRepository;
  35.         $this->commentRepository $commentRepository;
  36.         $this->userRepository $userRepository;
  37.         $this->produitDeclinationValueRepository $produitDeclinationValueRepository;
  38.         $this->produitRepository $produitRepository;
  39.         $this->documentRepository $documentRepository;
  40.         $this->globalVariables $globalVariables;
  41.     }
  42.     /**
  43.      * @Route("/index", name="index")
  44.      */
  45.     public function index(EntityManagerInterface $em): Response {
  46.         $user $this->getUser();
  47.         $now = new \DateTime("now");
  48.         // *** nouveaux totaux
  49.         $totalVenteAvecFrais 0.0;    // somme TTC
  50.         $totalVenteSansFrais 0.0;    // somme TTC - frais livraison
  51.         $totalVente 0.0;             // legacy (on le gardera = avec frais)
  52.         if ($user && in_array("ROLE_SUPER_ADMIN"$user->getRoles())) {
  53.             $todayActivities $this->activityRepository->findByCreatedAtField($now100);
  54.             $DcumentsByStatus $this->documentRepository->findByCreatedAtField($now, []);
  55.             foreach ($DcumentsByStatus as $key => $document) {
  56.                 // *** calcule les deux totaux
  57.                 $ttc   = (float) ($document->getTotalAmountTtc() ?? 0);
  58.                 $frais 0.0;
  59.                 if (method_exists($document'getDelivery') && $document->getDelivery()) {
  60.                     $frais = (float) ($document->getDelivery()->getTotalPrice() ?? 0);
  61.                 }
  62.                 $totalVenteAvecFrais += $ttc;
  63.                 $totalVenteSansFrais += ($ttc $frais);
  64.             }
  65.             // *** compat : l’ancienne variable = total avec frais
  66.             $totalVente $totalVenteAvecFrais;
  67.             $lastDayActivities $this->activityRepository->findByCreatedAtField(new \DateTime("-1 day"), 100);
  68.             // Par défaut : toute la semaine
  69.             $startLog $_GET['log_start'] ?? (new \DateTime())->modify('monday this week')->format('Y-m-d');
  70.             $endLog   $_GET['log_end']   ?? (new \DateTime())->modify('sunday this week')->format('Y-m-d');
  71.             try {
  72.                 $logEventsActivities $this->activityRepository->LoginEventRange(
  73.                     new \DateTime($startLog),
  74.                     new \DateTime($endLog)
  75.                 );
  76.             } catch (\Exception $e) {
  77.                 $logEventsActivities = [];
  78.             }
  79.             $lastDaylogEventsActivities $this->activityRepository->LoginEvent(new \DateTime("-1 day"), 100);
  80.         } else {
  81.             $todayActivities $user->getActivities()->filter(function (Activity $act) use ($now) {
  82.                 return $act->getCreatedAt() == $now;
  83.             });
  84.             $lastDayActivities $user->getActivities()->filter(function (Activity $act) {
  85.                 return $act->getCreatedAt() == new \DateTime("-1 day");
  86.             });
  87.         }
  88.         $comments      $this->commentRepository->findLatestComments(20);
  89.         $latestClients $this->userRepository->findLatestUsers(10'client');
  90.         $countProduitDec $this->produitDeclinationValueRepository->countProduitDeclinations(nullnullnull, [], nullnullnulltruenullnullnullnullnullnullnullnull);
  91.         $countProduit  $this->produitRepository->countProduits(nullnullnulltruenull);
  92.         $countClient   $this->userRepository->countUsers(nullnull'client');
  93.         $nbCommandeJour $this->documentRepository->countCommandesForToday();
  94.         $nbUsersConnectes $this->activityRepository->countTodayLogins(); // à créer
  95.         $startOfWeek   = (new \DateTime())->modify('monday this week')->setTime(000);
  96.         $endOfWeek     = (new \DateTime())->modify('sunday this week')->setTime(235959);
  97.         $weekActivities $this->activityRepository->findBetweenDates($startOfWeek$endOfWeek);
  98.         $customActivities = [];
  99.         $startStr $_GET['start'] ?? null;
  100.         $endStr   $_GET['end'] ?? null;
  101.         if ($startStr && $endStr) {
  102.             try {
  103.                 $startDate = new \DateTime($startStr);
  104.                 $endDate   = new \DateTime($endStr);
  105.                 $customActivities $this->activityRepository->findBetweenDates($startDate$endDate);
  106.             } catch (\Exception $e) {
  107.                 // Gérer une erreur de date invalide si besoin
  108.             }
  109.         }
  110.         $activeTab 'today'// onglet par défaut
  111.         if ($startStr && $endStr) {
  112.             $activeTab 'custom'// si période personnalisée
  113.         }
  114.         $selectedUserId $_GET['log_user'] ?? 'all';
  115.         if ($selectedUserId !== 'all') {
  116.             $selectedUserId = (int) $selectedUserId;
  117.         }
  118.         $logEventsActivities = [];
  119.         $startLog $_GET['log_start'] ?? (new \DateTime())->modify('monday this week')->format('Y-m-d');
  120.         $endLog   $_GET['log_end']   ?? (new \DateTime())->modify('sunday this week')->format('Y-m-d');
  121.         try {
  122.             $startDate = new \DateTime($startLog);
  123.             $endDate   = new \DateTime($endLog);
  124.             if ($selectedUserId === 'all') {
  125.                 $logEventsActivities $this->activityRepository->LoginEventRange($startDate$endDate);
  126.             } else {
  127.                 $logEventsActivities $this->activityRepository->LoginEventRangeByUser($startDate$endDate$selectedUserId);
  128.             }
  129.         } catch (\Exception $e) {
  130.             $logEventsActivities = [];
  131.         }
  132.         return $this->render('@admin/dashboard/dashboard.html.twig', [
  133.             'todayActivities' => $todayActivities,
  134.             'weekActivities' => $weekActivities,
  135.             'customActivities' => $customActivities,
  136.             'activeTab' => $activeTab,
  137.             'lastDayActivities' => $lastDayActivities,
  138.             'logEventsActivities' => $logEventsActivities ?? null,
  139.             'log_start' => $startLog,
  140.             'log_end' => $endLog,
  141.             'lastDaylogEventsActivities' => $lastDaylogEventsActivities ?? null,
  142.             // *** sorties totaux
  143.             'totalVente' => $totalVente,                         // legacy (avec frais)
  144.             'totalVenteAvecFrais' => $totalVenteAvecFrais,       // nouveau
  145.             'totalVenteSansFrais' => $totalVenteSansFrais,       // nouveau
  146.             'comments' => $comments,
  147.             'latestClients' => $latestClients,
  148.             'countProduitDec' => $countProduitDec,
  149.             'countProduit' => $countProduit,
  150.             'countClient' => $countClient,
  151.             'nbCommandeJour' => $nbCommandeJour,
  152.             'nbUsersConnectes' => $nbUsersConnectes,
  153.             'log_user' => $selectedUserId,
  154.             'users' => $this->userRepository->findLightUsers(),
  155.         ]);
  156.     }
  157.     
  158.    /**
  159.      * @Route("/admin/dashboard/activities", name="dashboard_activities_timeline", methods={"GET"})
  160.      */
  161.     public function activitiesTimeline(Request $requestEntityManagerInterface $em): Response
  162.     {
  163.         // Accès (même logique que ton écran) : SUPER_ADMIN ou droit STATISTIQUE si dispo.
  164.         $user $this->getUser();
  165.         $can  $user && in_array('ROLE_SUPER_ADMIN', (array)$user->getRoles(), true);
  166.         if (!$can && $user && method_exists($user'getArrayRight')) {
  167.             $can in_array('STATISTIQUE', (array)$user->getArrayRight(), true);
  168.         }
  169.         if (!$can) {
  170.             return new Response('Forbidden'403);
  171.         }
  172.         $tz     = new \DateTimeZone('Africa/Tunis');
  173.         $now    = new \DateTimeImmutable('now'$tz);
  174.         $period = (string) $request->query->get('period''today');
  175.         // défaut : aujourd’hui
  176.         $start $now->setTime(000);
  177.         $end   $now->setTime(235959);
  178.         switch ($period) {
  179.             case '3days':
  180.                 $end   $now->setTime(23,59,59);
  181.                 $start $end->sub(new \DateInterval('P2D'))->setTime(0,0,0);
  182.                 break;
  183.             case '7days':
  184.                 $end   $now->setTime(23,59,59);
  185.                 $start $end->sub(new \DateInterval('P6D'))->setTime(0,0,0);
  186.                 break;
  187.             case '30days':
  188.                 $end   $now->setTime(23,59,59);
  189.                 $start $end->sub(new \DateInterval('P29D'))->setTime(0,0,0);
  190.                 break;
  191.             case 'week':
  192.                 $start = (new \DateTimeImmutable('monday this week'$tz))->setTime(0,0,0);
  193.                 $end   $now->setTime(23,59,59);
  194.                 break;
  195.             case 'last_week':
  196.                 $start = (new \DateTimeImmutable('monday last week'$tz))->setTime(0,0,0);
  197.                 $end   = (new \DateTimeImmutable('sunday last week'$tz))->setTime(23,59,59);
  198.                 break;
  199.             case 'month':
  200.                 $start = (new \DateTimeImmutable('first day of this month'$tz))->setTime(0,0,0);
  201.                 $end   $now->setTime(23,59,59);
  202.                 break;
  203.             case 'last_month':
  204.                 $start = (new \DateTimeImmutable('first day of last month'$tz))->setTime(0,0,0);
  205.                 $end   = (new \DateTimeImmutable('last day of last month'$tz))->setTime(23,59,59);
  206.                 break;
  207.             case 'year':
  208.                 $start = (new \DateTimeImmutable('first day of january'$tz))->setTime(0,0,0);
  209.                 $end   $now->setTime(23,59,59);
  210.                 break;
  211.             case 'last_year':
  212.                 $start = (new \DateTimeImmutable('first day of january last year'$tz))->setTime(0,0,0);
  213.                 $end   = (new \DateTimeImmutable('last day of december last year'$tz))->setTime(23,59,59);
  214.                 break;            
  215.             case 'custom': {
  216.                 $s $request->query->get('start');
  217.                 $e $request->query->get('end');
  218.                 if ($s && $e) {
  219.                     try {
  220.                         $start = (new \DateTimeImmutable($s$tz))->setTime(0,0,0);
  221.                         $end   = (new \DateTimeImmutable($e$tz))->setTime(23,59,59);
  222.                         if ($end $start) { [$start$end] = [$end$start]; }
  223.                     } catch (\Throwable $ex) { /* on garde today */ }
  224.                 }
  225.                 break;
  226.             }
  227.             // today => défaut
  228.         }
  229.         // Requête explicite, bornes inclusives, SANS limite cachée
  230.         $qb $em->createQueryBuilder()
  231.             ->select('a','u','p','d')
  232.             ->from(Activity::class, 'a')
  233.             ->leftJoin('a.currentUser''u')
  234.             ->leftJoin('a.produit''p')
  235.             ->leftJoin('a.document''d')
  236.             ->andWhere('a.createdAt >= :start')
  237.             ->andWhere('a.createdAt <= :end')
  238.             ->setParameter('start'\DateTime::createFromImmutable($start))
  239.             ->setParameter('end',   \DateTime::createFromImmutable($end))
  240.             ->orderBy('a.createdAt''DESC');
  241.         $qb->setMaxResults(null); // safety: pas de cap
  242.         $activities $qb->getQuery()->getResult();
  243.         $html $this->renderView('@admin/dashboard/_activities_timeline.html.twig', [
  244.             'activities' => $activities,
  245.         ]);
  246.         return new Response($html200, ['Content-Type' => 'text/html; charset=UTF-8']);
  247.     }
  248.     
  249.     /**
  250.      * @Route("/admin/dashboard/login-history", name="dashboard_login_history", methods={"GET"})
  251.      */
  252.     public function loginHistory(Request $request): Response
  253.     {
  254.         // Accès : SUPER_ADMIN ou droit 'STATISTIQUE' dans arrayRight
  255.         $user $this->getUser();
  256.         $can  $user && in_array('ROLE_SUPER_ADMIN', (array)$user->getRoles(), true);
  257.         if (!$can && $user && method_exists($user'getArrayRight')) {
  258.             $can in_array('STATISTIQUE', (array)$user->getArrayRight(), true);
  259.         }
  260.         if (!$can) {
  261.             return new Response('Forbidden'403);
  262.         }
  263.         $tz     = new \DateTimeZone('Africa/Tunis');
  264.         $now    = new \DateTimeImmutable('now'$tz);
  265.         $period = (string) $request->query->get('period''today');
  266.         $logUser $request->query->get('log_user''all');
  267.         // Par défaut : aujourd’hui (00:00 → 23:59:59)
  268.         $start $now->setTime(000);
  269.         $end   $now->setTime(235959);
  270.         switch ($period) {
  271.             case '3days':
  272.                 $end   $now->setTime(23,59,59);
  273.                 $start $end->sub(new \DateInterval('P2D'))->setTime(0,0,0);
  274.                 break;
  275.             case '7days':
  276.                 $end   $now->setTime(23,59,59);
  277.                 $start $end->sub(new \DateInterval('P6D'))->setTime(0,0,0);
  278.                 break;
  279.             case '30days':
  280.                 $end   $now->setTime(23,59,59);
  281.                 $start $end->sub(new \DateInterval('P29D'))->setTime(0,0,0);
  282.                 break;
  283.             case 'week':
  284.                 $start = (new \DateTimeImmutable('monday this week'$tz))->setTime(0,0,0);
  285.                 $end   $now->setTime(23,59,59);
  286.                 break;
  287.             case 'last_week':
  288.                 $start = (new \DateTimeImmutable('monday last week'$tz))->setTime(0,0,0);
  289.                 $end   = (new \DateTimeImmutable('sunday last week'$tz))->setTime(23,59,59);
  290.                 break;
  291.             case 'month':
  292.                 $start = (new \DateTimeImmutable('first day of this month'$tz))->setTime(0,0,0);
  293.                 $end   $now->setTime(23,59,59);
  294.                 break;
  295.             case 'last_month':
  296.                 $start = (new \DateTimeImmutable('first day of last month'$tz))->setTime(0,0,0);
  297.                 $end   = (new \DateTimeImmutable('last day of last month'$tz))->setTime(23,59,59);
  298.                 break;
  299.             case 'year':
  300.                 $start = (new \DateTimeImmutable('first day of january'$tz))->setTime(0,0,0);
  301.                 $end   $now->setTime(23,59,59);
  302.                 break;
  303.             case 'last_year':
  304.                 $start = (new \DateTimeImmutable('first day of january last year'$tz))->setTime(0,0,0);
  305.                 $end   = (new \DateTimeImmutable('last day of december last year'$tz))->setTime(23,59,59);
  306.                 break;
  307.             case 'custom':
  308.                 $s $request->query->get('start');
  309.                 $e $request->query->get('end');
  310.                 if ($s && $e) {
  311.                     try {
  312.                         $start = (new \DateTimeImmutable($s$tz))->setTime(0,0,0);
  313.                         $end   = (new \DateTimeImmutable($e$tz))->setTime(23,59,59);
  314.                         if ($end $start) { [$start$end] = [$end$start]; }
  315.                     } catch (\Throwable $ex) { /* on conserve today */ }
  316.                 }
  317.                 break;
  318.             // today => défaut
  319.         }
  320.         // Utilise tes méthodes existantes du repository
  321.         if ($logUser === 'all') {
  322.             $events $this->activityRepository->LoginEventRange(
  323.                 \DateTime::createFromImmutable($start),
  324.                 \DateTime::createFromImmutable($end)
  325.             );
  326.         } else {
  327.             $events $this->activityRepository->LoginEventRangeByUser(
  328.                 \DateTime::createFromImmutable($start),
  329.                 \DateTime::createFromImmutable($end),
  330.                 (int) $logUser
  331.             );
  332.         }
  333.         $html $this->renderView('@admin/dashboard/_login_events_list.html.twig', [
  334.             'events' => $events
  335.         ]);
  336.         return new Response($html);
  337.     }
  338.     
  339.     /**
  340.      * @Route("/page", name="page")
  341.      */
  342.     public function page(): Response {
  343.         $produits $this->produitRepository->findWithImage();
  344.         return $this->render('@admin/front/page.html.twig', [
  345.                     'produits' => $produits
  346.         ]);
  347.     }
  348.     public static function ddQuery($sql,EntityManagerInterface $em)
  349.     {
  350.         //$sql = " select @@sql_mode";
  351.         $stmt $em->getConnection()->prepare($sql);
  352.         $result $stmt->executeQuery()->fetchAllAssociative();
  353.         dd($result);
  354.     }
  355.     /**
  356.      * @Route("/count-document/{type}/{status}", name="count-document", methods={"GET","POST"}, options={"expose"=true})
  357.      */
  358.     public function countDocument($type="commande",$status="en-attente"): Response {
  359.         return new JsonResponse(array(
  360.             'result' => 1,
  361.             'message' => "{type:'$type',status:'$status'}",
  362.             'count' =>  $this->globalVariables->getCountDocumentByType($type,$status)['count']));
  363.     }
  364.     /**
  365.      * @Route("/time-server", name="timeServer", methods={"GET","POST"}, options={"expose"=true})
  366.      */
  367.     public function getTimeServer(): Response {
  368.         return new JsonResponse(array(
  369.             'result' => 1,
  370.             'message' => 'ok',
  371.             'data' => (new \DateTime('now'))->format("Y-m-d\\TH:i:s")));
  372.     }
  373.     /**
  374.      * @Route("/copy-db", name="copydatabase")
  375.      */
  376.     public function copyDBLoggerInterface $logger): Response{
  377.         $sourceDbName 'sunshiladmin';
  378.         $destinationDbName 'sunshiladmindemo';
  379.         $connectionSource = new PDO('mysql:host=sunshiladmin.mysql.db;dbname=sunshiladmin''sunshiladmin''SunshineElegance192510185');
  380.         $connectionDestination = new PDO('mysql:host=sunshiladmindemo.mysql.db;dbname=sunshiladmindemo' 'sunshiladmindemo''adminDemo2022');
  381.         $tables $connectionSource->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
  382.         $connectionDestination->exec("USE {$destinationDbName}");
  383.         foreach ($tables as $tableName) {
  384.             $createCommand $connectionSource->query("SHOW CREATE TABLE `{$sourceDbName}`.`{$tableName}`")->fetchColumn(1);
  385.             $carefulCreateCommand str_replace("CREATE TABLE""CREATE TABLE IF NOT EXISTS"$createCommand);
  386.             $connectionDestination->exec($carefulCreateCommand);
  387.             $logger->info("Table `{$tableName}` created" PHP_EOL);
  388.             $connectionDestination->exec("INSERT INTO `{$destinationDbName}`.`{$tableName}` SELECT * FROM `{$sourceDbName}`.`{$tableName}`");
  389.             $logger->info("Data for table `{$tableName}` copied" PHP_EOL);
  390.         }
  391.         return new Response("<html><head></head><body>done</body></html>");
  392.     }
  393. }