<?php
namespace App\Controller\Admin;
use App\Entity\Cable;
use App\Entity\CableConnection;
use App\Entity\Company;
use App\Entity\Group;
use App\Entity\Payment;
use App\Entity\Point;
use App\Entity\RequestLog;
use App\Entity\User;
use App\Repository\PaymentRepository;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DashboardController extends AbstractDashboardController
{
private EntityManagerInterface $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/admin", name="admin")
*/
public function index(): Response
{
/** @var PaymentRepository $paymentRepo */
$paymentRepo = $this->em->getRepository(Payment::class);
return $this->render('admin/dashboard.html.twig', [
'counts' => [
'companies' => $this->em->getRepository(Company::class)->count([]),
'users' => $this->em->getRepository(User::class)->count([]),
'cables' => $this->em->getRepository(Cable::class)->count([]),
'points' => $this->em->getRepository(Point::class)->count([]),
'payments' => $paymentRepo->count([]),
'packages' => $this->em->getRepository(Group::class)->count([]),
],
'revenueByMonth' => $this->buildRevenueChartData($paymentRepo->getMonthlyRevenue()),
]);
}
/**
* @param array<int, array<string, mixed>> $rows
* @return array{labels: list<string>, values: list<float>}
*/
private function buildRevenueChartData(array $rows): array
{
$map = [];
foreach ($rows as $row) {
$map[(int)$row['year']][(int)$row['month']] = round((float)$row['revenue'], 2);
}
$labels = [];
$values = [];
$monthNames = ['Sty','Lut','Mar','Kwi','Maj','Cze','Lip','Sie','Wrz','Paź','Lis','Gru'];
$cursor = new \DateTime('first day of this month');
$cursor->modify('-11 months');
for ($i = 0; $i < 12; $i++) {
$y = (int)$cursor->format('Y');
$m = (int)$cursor->format('n');
$labels[] = $monthNames[$m - 1] . ' ' . substr((string)$y, 2);
$values[] = $map[$y][$m] ?? 0;
$cursor->modify('+1 month');
}
return ['labels' => $labels, 'values' => $values];
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle('FIBKIT');
}
public function configureMenuItems(): iterable
{
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::linkToCrud('Packages', 'fa fa-box', Group::class);
yield MenuItem::linkToCrud('Companies', 'fa fa-building', Company::class);
yield MenuItem::linkToCrud('Users', 'fa fa-users', User::class);
yield MenuItem::linkToCrud('Cables', 'fa fa-bars', Cable::class);
yield MenuItem::linkToCrud('Points', 'fa fa-dot-circle', Point::class);
yield MenuItem::linkToCrud('Needs Repair', 'fa fa-wrench', CableConnection::class);
yield MenuItem::linkToCrud('Payments', 'fa fa-money', Payment::class);
yield MenuItem::linkToCrud('Request Logs', 'fa fa-list-alt', RequestLog::class);
}
}