BarChartService.php 3,21 ko
Newer Older
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
<?php

namespace App\Service;

use App\Dto\BarChart\BarChartInput;
use App\Dto\BarChart\BarChartOutput;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Sale;
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé

class BarChartService
{
    private EntityManagerInterface $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        $this->entityManager = $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');
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
    }

    public function getBarChartData(BarChartInput $input): array
    {
        $startDate = new \DateTime($input->start);
        $endDate = new \DateTime($input->end);

Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        $queryBuilder = $this->entityManager->createQueryBuilder();
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        $output = [];
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé

Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        if($input->granularity == 'month'){
            $result = $queryBuilder
                ->select( 'YEAR(s.date) as year', 'MONTH(s.date) as month' ,'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("year","month")
                ->orderBy("year")
                ->getQuery()
                ->getResult();
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé

Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
            foreach ($result as $row) {
                $month = $row['month'];
                $year = $row['year'];
                $dateString = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT);
                $output[] = new BarChartOutput($dateString, (int)$row['occurrences']);
            }
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé

Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        } else
        {
            switch ($input->granularity) {
                case 'day':
                    $groupByExpression = 's.date';
                    $groupByAlias = 'date';
                    $dateFormat = 'Y-m-d';
                    break;
                case 'year':
                    $groupByExpression = 'YEAR(s.date)';
                    $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();
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé

Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
            foreach ($result as $row) {
                $dateString = $row[$groupByAlias] instanceof \DateTimeInterface ? $row[$groupByAlias]->format($dateFormat) : $row[$groupByAlias];
                $output[] = new BarChartOutput($dateString, (int)$row['occurrences']);
            }
        }
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
        return $output;
    }
Hajar RAHMOUNI's avatar
Hajar RAHMOUNI a validé
}