RegionalDistributionProvider.php 1,76 ko
Newer Older
<?php

namespace App\State;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\ApiResource\RegionalDistribution;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\RequestStack;

final class RegionalDistributionProvider implements ProviderInterface
{
    public function __construct(
        private readonly Connection $connection,
        private readonly RequestStack $requestStack
    ) {}

    public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
    {
        $request = $this->requestStack->getCurrentRequest();
        $tax = $request?->query->get('tax', 'th');
        $year = $request?->query->getInt('year', 2023);

        $rateColumn = $this->resolveRateColumn($tax);

        $sql = <<<SQL
            SELECT region_code, region_name, SUM(collected_volume) AS collected_volume
            FROM tax_data
            WHERE year = :year
                AND $rateColumn IS NOT NULL
            GROUP BY region_code, region_name
            ORDER BY collected_volume DESC
        SQL;

        $rows = $this->connection->fetchAllAssociative($sql, ['year' => $year]);

        foreach ($rows as $row) {
            $item = new RegionalDistribution();
            $item->regionCode = (string) $row['region_code'];
            $item->regionName = (string) $row['region_name'];
            $item->collectedVolume = (float) $row['collected_volume'];
            yield $item;
        }
    }

    private function resolveRateColumn(?string $tax): string
    {
        return match (strtolower((string) $tax)) {
            'tfpnb' => 'rate_tfpnb',
            'tfpb' => 'rate_tfpb',
            'th' => 'rate_th',
            'cfe' => 'rate_cfe',
            default => 'rate_tfpb',
        };
    }