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

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 redeemed

Pri 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;     // ?string

Neexistujú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 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.