Peniaze a ceny
Atribút price na modeloch Purchase, PurchaseItem, Subscription, SubscriptionItem a PurchaseRefund je Money z money-for-laravel, castovaný cez AsMoney do dvoch stĺpcov: price (decimal(38,0) v najmenších jednotkách) a price_currency (ISO kód). Sumy sú reťazce s ľubovoľnou presnosťou — na PostgreSQL ani MySQL nemajú strop 32 či 64 bitov — a meny ako JPY a BHD používajú svoje skutočné exponenty:
use RoundlyConsulting\Money\Money;
$purchase->price = Money::ofMinor(2599, 'USD'); // writes price + price_currency
$purchase->price->minor(); // "2599" (string)
$purchase->price->currency()->code; // "USD"
$purchase->price->toDecimal(); // "25.99"
$purchase->price->add(Money::ofMinor(100, 'USD')); // 26.99 USD
$purchase->price->format('en_US'); // "$25.99"
$purchase->price = null; // clears the amount, keeps price_currencyCast je striktný: priradenie holého čísla vyhodí InvalidMoneyValue (samotné číslo nemá menu) a suma uložená s price_currency null vyhodí výnimku pri čítaní. Factory a seedery odovzdávajú Money::ofMinor(…).
Ceny z obchodov
ProviderResult::price() sa prevádza z formátu každého obchodu bez aritmetiky s plávajúcou desatinnou čiarkou:
| Obchod | Zdroj | Prevod |
|---|---|---|
| Stripe | amount, amount_total, amount_paid, amount_due alebo amount_refunded, plus currency | Najmenšie jednotky cez Money::ofMinor(); ISK, UGX a MGA sa preškálujú podľa StripeAmount::SCALE_EXCEPTIONS. |
| Apple | Cena podpísanej transakcie v tisícinách, plus currency | Money::ofScaled() so škálou 3, raz zaokrúhlené od nuly; refundácia zaznamená len vrátenú časť. |
| Google predplatné | recurringPrice položiek (units + nanos) | Presne sčítané cez GoogleMoney; predplatené plány cenu nemajú. |
| Google jednorazové produkty | — | Play Developer API cenu neposiela, preto je price() null. |
Cena, ktorú balík nedokáže previesť presne — float alebo zlomková suma zo Stripe, neznáma mena, hodnota mimo rozsahu — sa zmení na null namiesto orezania a zvyšok výsledku sa aj tak uloží.
Súčty v SQL
Keďže price je číselný stĺpec, orderBy('price') a sum('price') fungujú v rámci jednej meny. sum() vracia na PostgreSQL a MySQL reťazec — odovzdajte ho priamo do Money::ofMinor():
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Purchases\Models\Purchase;
$sum = Purchase::query()
->where('price_currency', 'USD')
->sum('price'); // a string on PostgreSQL and MySQL
$total = Money::ofMinor($sum, 'USD');
$total->format('en_US');Auditné snapshoty
Auditné notifikácie ukladajú cenu ako Money::toArray(), pričom minor je JSON reťazec, takže prežijú aj sumy nad int64. purchases:replay ju obnoví cez Money::fromArray() a snapshot, ktorého cenu obnoviť nemožno, preskočí:
{ "minor": "1999", "decimal": "19.99", "currency": "USD" }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.