NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Coupons for Laravel

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:

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

class User extends Authenticatable
{
    use HasCoupons;
}
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ódaPopis
couponRedemptions(): MorphManyZaznamenané uplatnenia tohto modelu (CouponRedemption).
redeemCoupon(Coupon|string $coupon, Money $cartTotal): RedemptionResultUplatnenie 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:

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ú: 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:

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

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

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:

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

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

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.