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