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