Peniaze, jednotky a uzamknutie meny
Každá suma je RoundlyConsulting\Money\Money z money-for-laravel: presné najmenšie jednotky ako celočíselný reťazec v registrovanej mene s jej skutočným exponentom — nikde žiadny float. Celočíselný stĺpec value má pri každom type zľavy iný význam:
| Typ | Význam value | Príklad |
|---|---|---|
Fixed | Najmenšie jednotky meny kupónu | 500 + EUR = zľava 5.00 EUR |
Percentage | Celé bázické body, 0..10 000 | 2500 = 25 %, 1250 = 12,5 % |
FreeShipping | Ignoruje sa (0) | — |
Najmenšie jednotky rešpektujú skutočný exponent meny, takže meny bez desatinných miest aj s tromi desatinnými miestami sú presné:
use RoundlyConsulting\Money\Money;
Money::ofMinor(500, 'EUR'); // 5.00 EUR
Money::ofMinor(500, 'JPY'); // 500 JPY (zero-decimal currency)
Money::ofMinor(1500, 'BHD'); // 1.500 BHD (three-decimal currency)Uzamknutie meny
Kupón s vyplnenou menou platí len pre ceny v tejto mene. Kupón musí byť uzamknutý, ak je typu Fixed alebo má minimum_spend či max_discount — obe sa ukladajú ako Money a zdieľajú stĺpec currency kupónu. Percentuálne kupóny a kupóny na dopravu zadarmo bez minima či stropu môžu zostať neuzamknuté a platia pre ľubovoľnú menu; zľava sa potom počíta v mene ceny.
$coupon->currency; // ?Currency — null = any currency, or the lock
$coupon->minimum_spend; // ?Money — null = no minimum
$coupon->max_discount; // ?Money — null = uncapped
$coupon->appliesToCurrency($price); // bool — unlocked, or locked to $price's currency
$coupon->meetsMinimumSpend($price); // bool — no minimum, or $price >= minimum_spend- CreateCouponAction uzamknutie vynucuje: kupón Fixed bez meny vyhodí InvalidCouponDefinition.
- Minimum alebo strop v inej mene, než na ktorú je kupón uzamknutý, vyhodí CurrencyMismatch z money.
- Percento sa ukladá v celých bázických bodoch (0,01 %): CreateCouponData::percentage('12.5') prejde, '12.345' vyhodí RoundingNecessary z money.
- Riadok Fixed zapísaný mimo akcie bez meny sa odmietne pri použití — Coupon::discount() vyhodí InvalidCouponDefinition.
Priame plnenie modelu
Ak atribúty kupónu zapisujete sami namiesto CreateCouponAction, nastavte currency skôr ako minimum_spend a max_discount: cast z money odmietne zmeniť menu stĺpca, ktorý už obsahuje iný kód. Zápis mimo akcie zároveň obchádza jej validáciu, preto podľa možnosti uprednostnite CreateCouponData.
use RoundlyConsulting\Coupons\Enums\DiscountType;
use RoundlyConsulting\Coupons\Models\Coupon;
use RoundlyConsulting\Money\Money;
// currency first: minimum_spend and max_discount share that column.
$coupon = new Coupon([
'code' => 'SPRING10',
'type' => DiscountType::Percentage,
'value' => 1000, // 10 %
'currency' => 'EUR',
'minimum_spend' => Money::ofMinor(2000, 'EUR'),
]);
$coupon->save();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.