Otázka 10 / 15

Víkendová doprava zdarma

Marketing chce akci: od pátku 18:00 do konce neděle doprava zdarma pro nákupy od 1 500 Kč. Kolega ji naprogramoval i s testy a poslal merge request. V sobotu a v neděli nightly build na jeho větvi zčervenal, v pondělí byl zase zelený, aniž by kdo cokoli změnil, a kolega teď navrhuje test označit jako nestabilní a přeskakovat. Co mu vrátíš?

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

app › Services › Shipping › WeekendFreeShippingPolicy.php
<?php declare(strict_types=1);

namespace App\Services\Shipping;

use App\Models\Cart;
use DateTimeImmutable;
use DateTimeZone;

final class WeekendFreeShippingPolicy
{
    private const string SHOP_TIMEZONE = 'Europe/Prague';
    private const int MINIMUM_ITEMS_TOTAL_IN_HELLERS = 150000;
    private const int FRIDAY = 5;
    private const int SATURDAY = 6;
    private const int FRIDAY_START_HOUR = 18;

    public function isShippingFree(Cart $cart): bool
    {
        $now = new DateTimeImmutable('now', new DateTimeZone(self::SHOP_TIMEZONE));

        return $cart->getItemsTotalInHellers() >= self::MINIMUM_ITEMS_TOTAL_IN_HELLERS
            && $this->isPromotionRunning($now);
    }

    private function isPromotionRunning(DateTimeImmutable $now): bool
    {
        $dayOfWeek = (int) $now->format('N');
        $isFridayEvening = $dayOfWeek === self::FRIDAY && (int) $now->format('G') >= self::FRIDAY_START_HOUR;

        return $isFridayEvening || $dayOfWeek >= self::SATURDAY;
    }
}