---
title: "Zákazníci a limity na zákazníka — Coupons for Laravel | Roundly"
description: "Pridajte HasCoupons do modelu User, obmedzte použitia na zákazníka, čítajte históriu uplatnení a používajte kľúče UUID alebo ULID."
url: https://roundly-consulting.com/sk/open-source/navody/coupons-for-laravel/limity-na-zakaznika
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Coupons for Laravel](https://roundly-consulting.com/sk/open-source/navody/coupons-for-laravel.md)

# Zákazníci a limity na zákazníka

Pridajte HasCoupons do modelu, ktorý kupóny uplatňuje — zvyčajne User — a získate plnohodnotné API zákazníka:

```php
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Coupons\Concerns\HasCoupons;

class User extends Authenticatable
{
    use HasCoupons;
}
```

```php
use RoundlyConsulting\Money\Money;

$result  = $user->redeemCoupon('SAVE20', Money::ofMinor(5000, 'EUR')); // RedemptionResult
$history = $user->couponRedemptions;                                   // morphMany history
$used    = $user->hasRedeemed('SAVE20');                               // bool (tracked only)
```

| Metóda | Popis |
| --- | --- |
| `couponRedemptions(): MorphMany` | Zaznamenané uplatnenia tohto modelu (CouponRedemption), čítané zo spojenia modelu kupónu, nie tohto modelu. |
| `redeemCoupon(Coupon\|string $coupon, Money $cartTotal): RedemptionResult` | Uplatnenie v mene tohto modelu voči sume košíka cez CouponManager — rovnaká cesta ako pri fasáde, takže ho Coupons::fake() zaznamená. |
| `hasRedeemed(string $code): bool` | Či existuje zaznamenané uplatnenie nezmazaného kupónu s daným kódom — bez ohľadu na veľkosť písmen; vyčistený kupón, ktorý kód kedysi mal, sa neráta. |

redeemCoupon() je len skratka nad tým istým manažérom ako Coupons::redeem(), takže ju Coupons::fake() zaznamená. Vyžaduje sumu košíka v jeho vlastnej mene: odpočíta sa z nej zľava, overí sa voči nej uzamknutie meny aj minimum a uplatnenie bez ceny by spotrebovalo použitie — pri jednorazovom kupóne jediné, ktoré zákazník má — s nulovou zľavou.

hasRedeemed() sa pýta na nezmazaný kupón s daným kódom bez ohľadu na veľkosť písmen: keď vyčistený XMAS vydáte znova, minuloročné uplatnenie sa pre nový kupón neráta.

## Jeden na zákazníka

max\_usage\_per\_redeemer obmedzuje, koľkokrát môže kupón použiť jeden zákazník (0 = bez limitu), pričom ostatní ho môžu používať ďalej:

```php
use RoundlyConsulting\Money\Money;

$coupon->update(['max_usage_per_redeemer' => 1]);

$coupon->redeemBy($ada, Money::ofMinor(5000, 'EUR'));   // ok
$coupon->redeemBy($ada, Money::ofMinor(5000, 'EUR'));   // throws CouponAlreadyRedeemed
$coupon->redeemBy($lin, Money::ofMinor(5000, 'EUR'));   // ok — the cap is per redeemer

$coupon->usageBy($ada);               // 1
$coupon->isAtMaximumUsageFor($ada);   // true
$coupon->remainingUsageFor($lin);     // 0
$coupon->fresh()->usage;              // 2
```

Limit na zákazníka sa kontroluje, len keď zákazníka odovzdáte. Nákup bez registrácie (redeemer null) je podporovaný a ráta sa len do celkového limitu.

## Sledovanie

Limity na zákazníka, usageBy(), remainingUsageFor() a hasRedeemed() čítajú tabuľku coupon\_redemptions, do ktorej sa zapisuje, len kým je coupons.redeemer.track zapnuté (predvolene; fungujú aj hodnoty v štýle env, napríklad 1 alebo off). Po vypnutí sa žiadne riadky nezapisujú a limit na zákazníka sa nevynucuje — nerátajú sa doň ani riadky zapísané, kým bolo sledovanie zapnuté. Celkový limit naďalej platí a remainingUsageFor() vráti null.

## História uplatnení

Každé zaznamenané uplatnenie je CouponRedemption — final, so soft delete — s metódami coupon(), redeemer() a discount(), ktorá vráti zaznamenanú amount\_discounted ako Money. coupon() načíta model nastavený v coupons.model:

```php
$coupon->redemptions()->with('redeemer')->latest()->get()
    ->map(fn ($r) => [$r->redeemer?->name, (string) $r->discount()]);

$user->couponRedemptions()->count();
```

Riadky uplatnení sú uložené pri kupónoch — na spojení triedy z coupons.model, inak na predvolenom —, takže couponRedemptions() a hasRedeemed() ich čítajú tam, kam ich uplatnenie zapísalo, aj keď model kupónu alebo zákazníka používa iné ako predvolené spojenie.

## Zákazníci s UUID a ULID

Zákazník je nullable polymorfný stĺpec, ktorého typ kľúča určuje coupons.key\_type: bigint (predvolene), uuid alebo ulid. Všetky modely zákazníkov musia mať rovnaký typ kľúča a hodnotu číta migrácia — nastavte ju pred migrovaním:

```bash
# .env — set before running the migration
COUPONS_KEY_TYPE=uuid

php artisan migrate
```

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/coupons-for-laravel.md)
