Kupóny a zľavy
Kupóny úplne zabezpečuje coupons-for-laravel — shops žiadne vlastné kupóny neukladá. Kupóny vytvorte týmto balíkom a potom na ne odkazujte kódom:
use RoundlyConsulting\Coupons\DataTransferObjects\CreateCouponData;
use RoundlyConsulting\Coupons\Enums\DiscountType;
use RoundlyConsulting\Coupons\Facades\Coupons;
use RoundlyConsulting\Money\Money;
// Percentage values are basis points: 1000 = 10 %
Coupons::generate(DiscountType::Percentage, 1000, 'WELCOME10')->activate()->save();
// Or build them with the coupons DTO:
Coupons::create(CreateCouponData::fixed(Money::ofMinor(500, 'EUR'), 'FIVEOFF'))->activate()->save(); // locked to EUR
Coupons::create(CreateCouponData::freeShipping('SHIPFREE'))->activate()->save();Percentá sa zadávajú v bázických bodoch. Kupóny s pevnou sumou a každý kupón s minimálnym nákupom alebo stropom sú viazané na jednu menu — na košík či objednávku v inej mene nedajú žiadnu zľavu. Nové kupóny sú neaktívne, kým ich neaktivujete.
Náhľad kódu
Shops::coupons()->preview() vyhodnotí kód cez naviazaný DiscountResolver — bez uplatnenia a bez kupujúceho (limity na zákazníka sa vynucujú až pri vytvorení objednávky). Neznámy alebo momentálne neuplatniteľný kód dá v náhľade nulovú zľavu:
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Shops\Facades\Shops;
$result = Shops::coupons()->preview('WELCOME10', Money::ofMinor(1000, 'EUR'));
$result->discount; // Money — 1.00 EUR off
$result->freeShipping; // bool
$result->code; // "WELCOME10"
$result->found; // a coupon with that code exists
$result->hasDiscount(); // the discount is positive
$result->source; // the coupon as a money Discount, when it applies
if ($result->found && ! $result->hasDiscount()) {
// exists but not applicable now: inactive, expired, used up, below minimum spend, other currency
}Ceny košíka
Košík sa ocení so zadaným kódom, inak s uloženým coupon_code:
$cart->update(['coupon_code' => 'WELCOME10']);
Shops::cart($cart)->price()->getFinalPrice(); // priced with the stored code
Shops::cart($cart)->price('SHIPFREE')->shippingCost(); // preview another code — nothing is redeemedPri vytvorení objednávky
Kupón sa vyhľadá, overí pre kupujúceho a medzisúčet, vyhodnotí sa jeho zľava a potom sa pod zámkom riadku kupónu raz uplatní pre kupujúceho (zvýši sa počet použití, platia limity na zákazníka, spustia sa udalosti balíka coupons). Zľava sa zafixuje do objednávky a kupón sa s ňou prepojí. Neskoršie vypršanie, zrušenie či vyčerpanie kupónu — vrátane jediného použitia, ktoré spotrebovala táto objednávka — cenu objednávky nikdy nezmení; kupón na dopravu zdarma vynuluje dopravu:
$order->coupon; // ?Coupon — the shops.discounts.coupon_model
$order->discount; // ?Money — granted at placement, in the order currency
$order->free_shipping; // bool
$order->coupon_code; // ?stringNeexistujúci alebo neuplatniteľný kód sa ticho preskočí — aj taký, ktorý uzamknuté uplatnenie odmietne, lebo posledné použitie medzitým vzal súbežný nákup.
Kombinovanie zliav
DiscountResult::source je kupón ako Discount z balíka money, takže ho môžete skombinovať s vlastnými zľavami:
use RoundlyConsulting\Money\Discounts\DiscountStack;
$breakdown = DiscountStack::of($result->source, $loyaltyDiscount)->apply($subtotal, $shipping);Vlastný resolver
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Shops\Contracts\DiscountResolver;
use RoundlyConsulting\Shops\Discounts\DiscountResult;
final class StaffDiscountResolver implements DiscountResolver
{
public function resolve(string $code, Money $goods): DiscountResult
{
return $code === 'STAFF'
? new DiscountResult($goods->percentage(20), code: $code, found: true)
: DiscountResult::none($goods->currency(), $code);
}
}
// config/shops.php → 'discounts' => ['resolver' => StaffDiscountResolver::class, ...]Vlastný resolver mení náhľady, ceny košíka aj zľavu zafixovanú pri vytvorení objednávky. Vytvorenie objednávky však kupóny stále prepája a uplatňuje cez coupons-for-laravel, takže kód tam musí existovať, aby sa na objednávku uplatnil. Model kupónu vymeníte cez discounts.coupon_model (podtrieda Coupon z balíka coupons).
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.