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óda | Popis |
|---|---|
couponRedemptions(): MorphMany | Zaznamenané uplatnenia tohto modelu (CouponRedemption). |
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:
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; // 2Limit 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 migratePrejavte 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 kryptomienOdoslaní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.