src/Controller/Admin/DashboardController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Cable;
  4. use App\Entity\CableConnection;
  5. use App\Entity\Company;
  6. use App\Entity\Group;
  7. use App\Entity\Payment;
  8. use App\Entity\Point;
  9. use App\Entity\RequestLog;
  10. use App\Entity\User;
  11. use App\Repository\PaymentRepository;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
  14. use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
  15. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class DashboardController extends AbstractDashboardController
  19. {
  20.     private EntityManagerInterface $em;
  21.     public function __construct(EntityManagerInterface $em)
  22.     {
  23.         $this->em $em;
  24.     }
  25.     /**
  26.      * @Route("/admin", name="admin")
  27.      */
  28.     public function index(): Response
  29.     {
  30.         /** @var PaymentRepository $paymentRepo */
  31.         $paymentRepo $this->em->getRepository(Payment::class);
  32.         return $this->render('admin/dashboard.html.twig', [
  33.             'counts' => [
  34.                 'companies' => $this->em->getRepository(Company::class)->count([]),
  35.                 'users'     => $this->em->getRepository(User::class)->count([]),
  36.                 'cables'    => $this->em->getRepository(Cable::class)->count([]),
  37.                 'points'    => $this->em->getRepository(Point::class)->count([]),
  38.                 'payments'  => $paymentRepo->count([]),
  39.                 'packages'  => $this->em->getRepository(Group::class)->count([]),
  40.             ],
  41.             'revenueByMonth' => $this->buildRevenueChartData($paymentRepo->getMonthlyRevenue()),
  42.         ]);
  43.     }
  44.     /**
  45.      * @param array<int, array<string, mixed>> $rows
  46.      * @return array{labels: list<string>, values: list<float>}
  47.      */
  48.     private function buildRevenueChartData(array $rows): array
  49.     {
  50.         $map = [];
  51.         foreach ($rows as $row) {
  52.             $map[(int)$row['year']][(int)$row['month']] = round((float)$row['revenue'], 2);
  53.         }
  54.         $labels = [];
  55.         $values = [];
  56.         $monthNames = ['Sty','Lut','Mar','Kwi','Maj','Cze','Lip','Sie','Wrz','Paź','Lis','Gru'];
  57.         $cursor = new \DateTime('first day of this month');
  58.         $cursor->modify('-11 months');
  59.         for ($i 0$i 12$i++) {
  60.             $y = (int)$cursor->format('Y');
  61.             $m = (int)$cursor->format('n');
  62.             $labels[] = $monthNames[$m 1] . ' ' substr((string)$y2);
  63.             $values[] = $map[$y][$m] ?? 0;
  64.             $cursor->modify('+1 month');
  65.         }
  66.         return ['labels' => $labels'values' => $values];
  67.     }
  68.     public function configureDashboard(): Dashboard
  69.     {
  70.         return Dashboard::new()
  71.             ->setTitle('FIBKIT');
  72.     }
  73.     public function configureMenuItems(): iterable
  74.     {
  75.         yield MenuItem::linkToDashboard('Dashboard''fa fa-home');
  76.         yield MenuItem::linkToCrud('Packages''fa fa-box'Group::class);
  77.         yield MenuItem::linkToCrud('Companies''fa fa-building'Company::class);
  78.         yield MenuItem::linkToCrud('Users''fa fa-users'User::class);
  79.         yield MenuItem::linkToCrud('Cables''fa fa-bars'Cable::class);
  80.         yield MenuItem::linkToCrud('Points''fa fa-dot-circle'Point::class);
  81.         yield MenuItem::linkToCrud('Needs Repair''fa fa-wrench'CableConnection::class);
  82.         yield MenuItem::linkToCrud('Payments''fa fa-money'Payment::class);
  83.         yield MenuItem::linkToCrud('Request Logs''fa fa-list-alt'RequestLog::class);
  84.     }
  85. }