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);
}
}
}