Fasáda Coupons
RoundlyConsulting\Coupons\Facades\Coupons je vstupným bodom pre všetko, čo balík robí. Jej koreňom je CouponManager, singleton, ktorý môžete injektovať — ako ho použiť bez fasády, nájdete v časti DI a akcie. Celé API:
use RoundlyConsulting\Coupons\Enums\DiscountType;
use RoundlyConsulting\Coupons\Facades\Coupons;
$coupon = Coupons::generate(DiscountType::Percentage, value: 2000, code: 'SUMMER', maxUsage: 100); // 20 %
$coupon = Coupons::generate(DiscountType::Fixed, value: 500, code: 'FIVE', currency: 'EUR'); // 5.00 EUR off
$coupon = Coupons::create($data); // from a CreateCouponData
$coupon = Coupons::createQuietly($data); // without dispatching CouponCreated (seeders, fixtures)
// One coupon, by code or model:
Coupons::code('SUMMER')->check($cart, $user); // ?RedemptionFailureReason — null = redeemable
Coupons::code('SUMMER')->preview($cart); // Money — the discount, without redeeming
Coupons::code('SUMMER')->redeem($cart, $user); // RedemptionResult
Coupons::code('SUMMER')->revoke(); // expire it now (reversible), fires CouponRevoked
// The same verbs, flat:
Coupons::check('SUMMER', $cart, $user);
Coupons::preview($coupon, $cart);
Coupons::redeem('SUMMER', $cart, redeemer: $user);
Coupons::revoke($coupon); // a Coupon or a code
// Lookups:
Coupons::find('SUMMER'); // ?Coupon
Coupons::findOrFail('SUMMER'); // throws CouponNotFound
Coupons::exists('SUMMER'); // bool
Coupons::redeemable()->get(); // query builder of coupons redeemable right now
// Maintenance (the console commands call these):
Coupons::expireAll(); // revoke every live coupon; returns the count
Coupons::expireAll(code: 'SUMMER'); // only the live coupon holding that code
Coupons::prune(days: 30); // soft-delete coupons expired 30+ days ago; returns the count
Coupons::prune(days: 30, force: true); // delete them permanently, previously trashed ones includedVšetky metódy
| Metóda | Vracia | Popis |
|---|---|---|
generate() | Coupon | Rýchle vytvorenie z typu, hodnoty, voliteľného kódu, limitu použití a meny. value sú najmenšie jednotky (Fixed, vyžaduje menu) alebo bázické body (Percentage). Spustí CouponCreated. |
create() | Coupon | Vytvorenie z DTO CreateCouponData; spustí CouponCreated. Explicitný kód, ktorý už má nezmazaný kupón, vyhodí CouponCodeTaken. |
createQuietly() | Coupon | To isté bez udalosti CouponCreated — pre seedery a fixtures. |
find() | ?Coupon | Vyhľadanie podľa kódu — bez ohľadu na veľkosť písmen a okolité medzery. |
findOrFail() | Coupon | Vyhľadanie, inak výnimka CouponNotFound. |
exists() | bool | Či existuje kupón s daným kódom. |
redeemable() | Builder<Coupon> | Dopyt na kupóny uplatniteľné práve teraz — aktívne, s platnosťou, nevyčerpané. |
code() | CouponCode | Handle na jeden kupón podľa kódu alebo modelu s metódami check(), preview(), redeem() a revoke(). |
check() | ?RedemptionFailureReason | Prvý dôvod, pre ktorý by uplatnenie kupón odmietlo, alebo null. Voliteľne berie cenu a zákazníka. Nikdy nevyhodí výnimku, nezamyká ani nezapisuje; neznámy kód vráti NotFound. |
preview() | Money | Zľava pre danú cenu bez uplatnenia — pri inej mene nula. Pri neznámom kóde vyhodí CouponNotFound. |
redeem() | RedemptionResult | Atomické overenie a uplatnenie podľa kódu alebo modelu, s voliteľným zákazníkom. |
revoke() | Coupon | Vratné odvolanie kupónu alebo kódu: expires_at = teraz, uloží sa a spustí CouponRevoked. Pri neznámom kóde vyhodí CouponNotFound. |
expireAll() | int | Odvolá každý platný kupón — alebo len platný kupón s daným kódom — a vráti ich počet. Používa ho coupons:expire. |
prune() | int | Zmaže kupóny, ktorým platnosť uplynula pred aspoň $days dňami (predvolene 30) — štandardne mäkko, s $force natrvalo — a vráti ich počet. Používa ho coupons:prune; záporné okno vyhodí InvalidArgumentException. |
fake() | CouponsFake | Nahradí manažéra — pre fasádu aj každý injektovaný CouponManager — záznamníkom, ktorý nič nezapisuje, a vráti ho pre asercie. |
Handle code()
Coupons::code() prijme kód alebo model Coupon a vráti handle CouponCode. Každá jeho metóda deleguje na rovnomennú priamu metódu fasády, takže oba zápisy sú zameniteľné a fake zaznamená oba:
| Metóda | Vracia | Rovnaké ako |
|---|---|---|
check(?Money $price = null, ?Model $redeemer = null) | ?RedemptionFailureReason | Coupons::check($coupon, $price, $redeemer) |
preview(Money $price) | Money | Coupons::preview($coupon, $price) |
redeem(Money $price, ?Model $redeemer = null) | RedemptionResult | Coupons::redeem($coupon, $price, $redeemer) |
revoke() | Coupon | Coupons::revoke($coupon) |
Kontrola pred objednávkou
check() odpovie na otázku „prečo tento kód nefunguje?“ ešte pred objednávkou. Spustí rovnaké kontroly v rovnakom poradí ako redeem() a vráti prvý neúspešný RedemptionFailureReason — NotFound, CurrencyMismatch, MinimumSpendNotMet, Expired, AtMaxUsage alebo AlreadyRedeemed — prípadne null. Bez ceny preskočí kontroly meny a minima, bez zákazníka limit na zákazníka. translationKey() vám dá rovnaké hlásenie, aké zobrazí validačné pravidlo:
use RoundlyConsulting\Coupons\Facades\Coupons;
if ($reason = Coupons::code($request->code)->check($cart, $request->user())) {
return back()->withErrors(['code' => __($reason->translationKey(), ['code' => $request->code])]);
}
$discount = Coupons::code($request->code)->preview($cart); // show it before the order is placedpreview() pri nezhodnej mene výnimku nevyhodí — vráti nulu —, pri neznámom kóde však vyhodí CouponNotFound. redeem() aj revoke() prijmú kód alebo Coupon. Každé vyhľadanie porovnáva kódy bez ohľadu na veľkosť písmen a okolité medzery, takže summer a SUMMER sú ten istý kupón; prázdny kód aj soft-deleted inštancia Coupon sú pre check() NotFound, rovnako ako pre ne redeem() vyhodí CouponNotFound.
Nové kupóny sú neaktívne
Nový kupón nemá activated_at, takže jeho uplatnenie vyhodí CouponExpired, kým ho neaktivujete cez $coupon->activate()->save() — alebo mu odovzdajte budúci CarbonInterface a aktivácia sa naplánuje.
Odvolanie
revoke() je vratný núdzový vypínač: nastaví expires_at na aktuálny čas — riadok sa nezmaže a história zostane zachovaná — a spustí CouponRevoked. Kupón vrátite do obehu posunutím alebo vymazaním expires_at:
Coupons::revoke('SAVE20'); // expires_at = now, fires CouponRevoked
$coupon = Coupons::findOrFail('SAVE20');
$coupon->expire(now()->addMonth())->save(); // back in circulation until next month
$coupon->update(['expires_at' => null]); // or: no expiry at allexpireAll() urobí to isté pre každý platný kupón — alebo len pre platný kupón s daným kódom — a vráti ich počet. prune() mäkko zmaže kupóny, ktorým platnosť uplynula pred zadaným počtom dní — ich kódy sa dajú vydať znova —, s force: true ich zmaže natrvalo a záporné okno odmietne výnimkou InvalidArgumentException, pretože okno v budúcnosti by zmazalo platné kupóny. Obe metódy stoja za Artisan príkazmi.
createQuietly() vytvorí kupón bez udalosti CouponCreated — hodí sa pre seedery a fixtures, ktoré nemajú spúšťať vaše listenery.
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 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.