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

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_currency

Cast 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:

ObchodZdrojPrevod
Stripeamount, amount_total, amount_paid, amount_due alebo amount_refunded, plus currencyNajmenšie jednotky cez Money::ofMinor(); ISK, UGX a MGA sa preškálujú podľa StripeAmount::SCALE_EXCEPTIONS.
AppleCena podpísanej transakcie v tisícinách, plus currencyMoney::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 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.