Otázka 04 / 15

Dostupnost zboží

Volal klient: při akcích a výprodejích se občas prodá víc kusů, než je skladem, a ve skladu se pak objeví záporné stavy. V běžném provozu to nikdo nepozoroval a ručně se to nedaří zopakovat. Tady je část modulu, přes kterou dokončení objednávky odečítá sklad. 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 › Stock › StockReservationService.php
<?php declare(strict_types=1);

namespace App\Services\Stock;

use App\Exceptions\OutOfStockException;
use App\Models\Order;
use App\Repositories\ProductStockRepository;

final class StockReservationService
{
    public function __construct(
        private readonly ProductStockRepository $productStockRepository,
    )
    {}

    /** @throws OutOfStockException */
    public function reserveForOrder(Order $order): void
    {
        foreach ($order->items as $item) {
            $available = $this->productStockRepository->getAvailableQuantity($item->product_id);
            if ($available < $item->quantity) {
                throw new OutOfStockException("Product {$item->product_id} has only {$available} pcs in stock");
            }
        }

        foreach ($order->items as $item) {
            $this->productStockRepository->decreaseQuantity($item->product_id, $item->quantity);
        }
    }
}