---
title: "Model Coupon — Coupons for Laravel | Roundly"
description: "Metódy životného cyklu, kontroly stavu, casty a výpočet zľavy na modeli Coupon — activate, expire, limity, apply a discountFor."
url: https://roundly-consulting.com/sk/open-source/navody/coupons-for-laravel/model-coupon
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)

# Model Coupon

RoundlyConsulting\\Coupons\\Models\\Coupon je bežný Eloquent model s HasFactory a SoftDeletes. Nie je final, takže z neho môžete dediť (pozrite si Rozširovanie).

```php
use RoundlyConsulting\Coupons\Models\Coupon;

$coupon = Coupon::query()->where('code', 'SAVE20')->firstOrFail();

$coupon->activate();          // activated_at = now (pass a CarbonInterface to schedule)
$coupon->expire($expiresAt);  // expires_at (no argument = now)
$coupon->setMaxUsageTo(50);
$coupon->save();

$coupon->isActive();                 // bool
$coupon->isExpired();                // bool
$coupon->isAtMaximumUsage();         // bool (a 0 cap is unlimited)
$coupon->hasBeenUsedAtLeastOnce();   // bool
$coupon->canBeApplied();             // active, not expired, not at max usage
```

## Kontroly stavu

| Metóda | Pravda, keď / vracia |
| --- | --- |
| `isActive(): bool` | activated\_at je nastavené a <= teraz, rovnako ako pri scope active(). |
| `isExpired(): bool` | expires\_at je nastavené a <= teraz, rovnako ako pri scope expired() — kupón odvolaný v tom istom okamihu už je expirovaný. |
| `canBeApplied(): bool` | Aktívny, s platnosťou a bez vyčerpaného limitu. |
| `isAtMaximumUsage(): bool` | Kladný max\_usage je dosiahnutý (0 = bez limitu). |
| `isAtMaximumUsageFor(Model $redeemer): bool` | Kladný max\_usage\_per\_redeemer je pre daného zákazníka dosiahnutý; pri vypnutom coupons.redeemer.track vždy false. |
| `usageBy(Model $redeemer): int` | Počet zaznamenaných uplatnení daným zákazníkom. |
| `hasBeenUsedAtLeastOnce(): bool` | usage > 0. |
| `isFreeShipping() / appliesToShipping(): bool` | Typ je FreeShipping — vynulujte vlastný riadok dopravy. |
| `appliesToCurrency(Money $price): bool` | Bez uzamknutia alebo uzamknutý na menu ceny. |
| `meetsMinimumSpend(Money $price): bool` | Bez minima alebo cena >= minimum\_spend. Pri rôznych menách vyhodí CurrencyMismatch z money — najprv overte appliesToCurrency(). |

## Výpočet zľavy

Tri metódy premenia kupón na peniaze. Zľava je vždy medzi nulou a cenou a nikdy nad max\_discount, takže celková suma nemôže klesnúť pod nulu:

```php
$coupon->discountFor($price);   // Money — 0 <= discount <= price, never above max_discount
$coupon->apply($price);         // Money — the price minus the discount, never negative
$coupon->discount($currency);   // money Discount labelled with the code, for a DiscountStack
```

Zaokrúhľovanie zabezpečuje money-for-laravel — predvolene polovica smerom od nuly. Niekoľko prepočítaných príkladov:

```php
use RoundlyConsulting\Coupons\Models\Coupon;
use RoundlyConsulting\Money\Money;

$quarter = Coupon::factory()->percentage(2500)->make();         // 25 %
$quarter->apply(Money::ofMinor(1000, 'EUR'));                    // 7.50 EUR

$eighth = Coupon::factory()->percentage(1250)->make();          // 12.5 %
$eighth->discountFor(Money::ofMinor(999, 'EUR'));                // 1.25 EUR (124.875 minor units, half away from zero)

$capped = Coupon::factory()->cappedPercentage(5000, Money::ofMinor(300, 'EUR'))->make();
$capped->discountFor(Money::ofMinor(1000, 'EUR'));               // 3.00 EUR — 50 %, capped

$big = Coupon::factory()->fixed(5000, 'EUR')->make();           // 50.00 EUR off
$big->discountFor(Money::ofMinor(1000, 'EUR'));                  // 10.00 EUR — never more than the price
$big->apply(Money::ofMinor(1000, 'EUR'));                        // 0.00 EUR

$yen = Coupon::factory()->fixed(500, 'JPY')->make();
$yen->discountFor(Money::ofMinor(1200, 'JPY'));                  // 500 JPY
```

discountFor() a apply() vyhodia CurrencyMismatch z money, ak je kupón uzamknutý na inú menu — najprv overte appliesToCurrency() alebo použite previewDiscount(), ktorá výnimku nevyhodí. Pri kupóne na dopravu zadarmo vráti discountFor() nulu a apply() cenu bez zmeny.

## Atribúty a casty

- code — ukladá sa orezaný a veľkými písmenami bez ohľadu na to, ako ho zapíšete.
- type — enum DiscountType.
- value, usage, max\_usage, max\_usage\_per\_redeemer — celé čísla.
- currency — ?Currency (cast AsCurrency z money).
- minimum\_spend, max\_discount — ?Money so zdieľaným stĺpcom currency.
- activated\_at, expires\_at — dátum a čas.
- meta — kolekcia pre voľné údaje, napríklad kampaň, do ktorej kupón patrí.

redemptions() je relácia HasMany na CouponRedemption. Zmazanie kupónu je soft delete; natrvalo zmazaný kupón kaskádovo odstráni aj svoje riadky uplatnení.

## 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)
