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

Základné stavebné prvky zliav pre kupóny, akcie a košíky. Zľava nikdy neodpočíta viac, ako je jej základ, a nikdy nevytvorí záporný súčet:

use RoundlyConsulting\Money\Discounts\Discount;

$subtotal = Money::ofMajor('100', 'EUR');

Discount::percentage('12.5')->cappedAt(Money::ofMajor('20', 'EUR'))->applyTo($subtotal); // 87.50 EUR
Discount::percentage('12.5')->amountFor($subtotal);                                     // 12.50 EUR
Discount::fixed(Money::ofMajor('150', 'EUR'))->applyTo($subtotal);                      // 0.00 EUR — never negative
  • Discount::fixed(Money) — pevná suma z medzisúčtu.
  • Discount::percentage($percent) — 0 až 100 %.
  • Discount::freeShipping() — 100 % na dopravu.
  • ->cappedAt(Money), ->withPriority(int) (vyššia sa uplatní skôr), ->exclusive(), ->labelled('KOD'), ->onShipping() / ->onSubtotal().
  • amountFor($base) — koľko sa odpočíta (0 ≤ suma ≤ základ a ≤ strop); applyTo($base) — základ mínus táto suma.

Cieľ (target) slúži len ako informácia pre kombinovanie zliav: amountFor() sa uplatní na akýkoľvek zadaný základ, preto nikdy nevolajte applyTo() so zľavou na dopravu na cenu tovaru — smerujte podľa target().

Kombinovanie zliav

use RoundlyConsulting\Money\Discounts\Discount;
use RoundlyConsulting\Money\Discounts\DiscountStack;
use RoundlyConsulting\Money\Enums\StackingStrategy;

$subtotal = Money::ofMajor('100', 'EUR');
$shipping = Money::ofMajor('5', 'EUR');

$breakdown = DiscountStack::of(
    Discount::percentage(10)->labelled('WELCOME10'),
    Discount::fixed(Money::ofMajor('5', 'EUR'))->withPriority(10),
    Discount::freeShipping(),
    Discount::percentage(25)->exclusive(),
)->using(StackingStrategy::Sequential)
 ->capTotalAt(Money::ofMajor('30', 'EUR'))
 ->apply($subtotal, $shipping);

$breakdown->totalDiscount();   // 25.00 EUR — the exclusive 25 % wins
$breakdown->total();           // 80.00 EUR
  • Sequential (predvolené) — každá zľava sa uplatní na priebežný zvyšok svojho cieľa, takže sa percentá navzájom skladajú.
  • Additive — každá zľava sa uplatní na pôvodný základ.
  • BestOf — uplatní sa len jediná najväčšia zľava.
  • Exkluzivita — najlepšia exkluzívna zľava súťaží s celou skupinou neexkluzívnych; vyhrá vyšší súčet, pri zhode neexkluzívne.
  • Poradie — zľavy na medzisúčet podľa priority (zostupne), potom podľa poradia pridania; potom zľavy na dopravu.
  • Každý cieľ sa oreže na svoj základ, potom sa uplatní capTotalAt(); oboje uberá v opačnom poradí, než sa zľavy uplatnili.

V príklade exkluzívnych 25 % (25.00) prekoná neexkluzívnu skupinu (5.00 + 9.50 + 5.00 doprava = 19.50), takže rozpis obsahuje jeden riadok. Bez exkluzívnej zľavy sa uplatnia všetky tri a súčet je 85.50 EUR.

Rozpis

$breakdown->subtotal;             // 100.00 EUR
$breakdown->subtotalDiscount;     // Money
$breakdown->shipping;             // 5.00 EUR (zero when none was passed)
$breakdown->shippingDiscount;     // Money
$breakdown->discountedSubtotal();
$breakdown->discountedShipping();

foreach ($breakdown->applied as $row) {   // list<AppliedDiscount>
    $row->discount->label();              // e.g. "WELCOME10"
    $row->target;                         // DiscountTarget::Subtotal or DiscountTarget::Shipping
    $row->amount;                         // the Money removed
}

Uplatnené sumy dajú vždy dokopy subtotalDiscount + shippingDiscount a ani jedna neprekročí svoj základ. Ak chcete zľavu objednávky rozpočítať na položky, použite DiscountAllocator (pozri Rozdeľovanie súm).

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.