Otázka 13 / 15

Omluva, která se rozkřikla

Po výpadku dopravce poslal marketing dvě stě zákazníkům, kterým se zpozdila zásilka, omluvný kupón na 300 Kč. Do tří dnů bylo uplatněno skoro všech dvě stě, jenže hlavně na čerstvě založených účtech, a zákazníci, kterým byly určené, teď píšou, že podle e-shopu jejich kupón „neexistuje nebo vypršel“. Marketing se zapřísahá, že kódy nikam jinam neposlal, a na jednom slevovém fóru mezitím přibylo vlákno „SORRY kupóny fungujou, díky, e-shope!“. Tady je část modulu, která kupóny vydává a uplatňuje. 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 › Marketing › ApologyCouponIssuer.php
<?php declare(strict_types=1);

namespace App\Services\Marketing;

use App\Models\Coupon;
use App\Repositories\CouponRepository;
use Psr\Clock\ClockInterface;

final class ApologyCouponIssuer
{
    private const string CODE_PREFIX = 'SORRY-';
    private const int AMOUNT_HALER = 30000;
    private const string VALIDITY = '+30 days';

    public function __construct(
        private readonly CouponRepository $couponRepository,
        private readonly ClockInterface $clock,
    )
    {}

    public function issue(): Coupon
    {
        $coupon = Coupon::createSingleUse(
            code: self::CODE_PREFIX . mt_rand(1000, 9999),
            amountHaler: self::AMOUNT_HALER,
            validUntil: $this->clock->now()->modify(self::VALIDITY),
        );
        $this->couponRepository->save($coupon);

        return $coupon;
    }
}