Otázka 08 / 15
Nejlevnější ponožky na světě
Po Black Friday našla účetní objednávku za −39,33 Kč: zákazník koupil dva páry ponožek v akci, uplatnil kupón a ERP mu z objednávky automaticky vystavilo dobropis a peníze poslalo na účet. Marketing přísahá, že žádná akce nebyla vyšší než 30 %. Tady je část modulu, která počítá cenu košíku. 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 › CartPriceCalculator.php
<?php declare(strict_types=1);
namespace App\Services\Pricing;
use App\Data\Coupon;
use App\Models\Cart;
use App\Models\Customer;
use App\Repositories\PromotionRepository;
final class CartPriceCalculator
{
private const int PERCENT_BASE = 100;
private const int PRICE_PRECISION = 2;
public function __construct(
private readonly PromotionRepository $promotionRepository,
)
{}
public function calculateTotal(Cart $cart, ?Coupon $coupon, Customer $customer): float
{
$total = 0.0;
foreach ($cart->items as $item) {
$unitPrice = $item->product->price;
$promotion = $this->promotionRepository->findActiveForProduct($item->product->id);
if ($promotion !== null) {
$unitPrice -= $unitPrice * $promotion->percent / self::PERCENT_BASE;
}
$total += $unitPrice * $item->quantity;
}
if ($coupon !== null) {
$total -= $coupon->amount;
}
if ($customer->loyaltyPercent > 0) {
$total -= $total * $customer->loyaltyPercent / self::PERCENT_BASE;
}
return round($total, self::PRICE_PRECISION);
}
}