Otázka 09 / 15

Ceník pro velkoodběratele

Obchodník přeposílá rozzlobený e-mail od velkoodběratele: ráno u vrtaček viděl ceny o třetinu vyšší, než má ve smlouvě, a kolega z téže firmy si o hodinu později vyfotil vrtačku za 119,90 Kč. Pokaždé se to po pár minutách samo spravilo a jiný odběratel mezitím poslal screenshot s cenami, které má ve smlouvě úplně jiná firma. Tady je část modulu, která ceny v kategorii připravuje. Co se děje a co bys udělal?

Ctrl/Cmd+klik na metodu, třídu nebo konstantu otevře její deklaraci, Alt+← vrátí zpět.

app › Services › Pricing › CategoryPriceListProvider.php
<?php declare(strict_types=1);

namespace App\Services\Pricing;

use App\Models\Category;
use App\Models\Customer;
use App\Repositories\PriceRepository;
use Illuminate\Contracts\Cache\Repository as CacheRepository;

final class CategoryPriceListProvider
{
    private const string CACHE_KEY_PREFIX = 'category-prices';
    private const int CACHE_TTL_SECONDS = 300;

    public function __construct(
        private readonly CacheRepository $cache,
        private readonly PriceRepository $priceRepository,
    )
    {}

    /** @return array<int, int> */
    public function getPricesInMinorUnits(Category $category, Customer $customer, string $locale): array
    {
        $cacheKey = self::CACHE_KEY_PREFIX . ":{$category->id}:{$locale}";

        return $this->cache->remember(
            $cacheKey,
            self::CACHE_TTL_SECONDS,
            fn (): array => $this->priceRepository->findForCategory($category->id, $customer->price_group_id, $customer->currency),
        );
    }
}