Newer
Older
<?php
namespace App\Service;
use App\Dto\BarChart\BarChartInput;
use App\Dto\BarChart\BarChartOutput;
use Doctrine\ORM\EntityManagerInterface;
class BarChartService
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$emConfig = $this->entityManager->getConfiguration();
$emConfig->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Postgresql\Year');
$emConfig->addCustomDatetimeFunction('MONTH', 'DoctrineExtensions\Query\Postgresql\Month');
$emConfig->addCustomDatetimeFunction('DATE_FORMAT', 'DoctrineExtensions\Query\Postgresql\DateFormat');
}
public function getBarChartData(BarChartInput $input): array
{
$startDate = new \DateTime($input->start);
$endDate = new \DateTime($input->end);
$queryBuilder = $this->entityManager->createQueryBuilder();
switch ($input->granularity) {
case 'day':
$groupByExpression = 's.date';
$groupByAlias = 'date';
$dateFormat = 'Y-m-d';
$groupByAlias = 'month';
$dateFormat = 'Y-m';
$groupByAlias = 'year';
$dateFormat = 'Y';
break;
default:
throw new \InvalidArgumentException('Invalid granularity');
}
$result = $queryBuilder
->select("{$groupByExpression} as {$groupByAlias}", 'COUNT(s.id) as occurrences')
->from(Sale::class, 's')
->where('s.date BETWEEN :start AND :end')
->setParameter('start', $startDate->format('Y-m-d'))
->setParameter('end', $endDate->format('Y-m-d'))
->groupBy("{$groupByAlias}")
->orderBy("{$groupByAlias}")
->getQuery()
->getResult();
$output = [];
foreach ($result as $row) {
$dateString = $row[$groupByAlias] instanceof \DateTimeInterface ? $row[$groupByAlias]->format($dateFormat) : $row[$groupByAlias];
$output[] = new BarChartOutput($dateString, (int)$row['occurrences']);