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

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 included

Všetky metódy

MetódaVraciaPopis
generate()CouponRý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()CouponVytvorenie z DTO CreateCouponData; spustí CouponCreated. Explicitný kód, ktorý už má nezmazaný kupón, vyhodí CouponCodeTaken.
createQuietly()CouponTo isté bez udalosti CouponCreated — pre seedery a fixtures.
find()?CouponVyhľadanie podľa kódu — bez ohľadu na veľkosť písmen a okolité medzery.
findOrFail()CouponVyhľ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()CouponCodeHandle na jeden kupón podľa kódu alebo modelu s metódami check(), preview(), redeem() a revoke().
check()?RedemptionFailureReasonPrvý 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()MoneyZľava pre danú cenu bez uplatnenia — pri inej mene nula. Pri neznámom kóde vyhodí CouponNotFound.
redeem()RedemptionResultAtomické overenie a uplatnenie podľa kódu alebo modelu, s voliteľným zákazníkom.
revoke()CouponVratné odvolanie kupónu alebo kódu: expires_at = teraz, uloží sa a spustí CouponRevoked. Pri neznámom kóde vyhodí CouponNotFound.
expireAll()intOdvolá 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()intZmaž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()CouponsFakeNahradí 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ódaVraciaRovnaké ako
check(?Money $price = null, ?Model $redeemer = null)?RedemptionFailureReasonCoupons::check($coupon, $price, $redeemer)
preview(Money $price)MoneyCoupons::preview($coupon, $price)
redeem(Money $price, ?Model $redeemer = null)RedemptionResultCoupons::redeem($coupon, $price, $redeemer)
revoke()CouponCoupons::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 placed

preview() 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 all

expireAll() 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 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.